From 7c79fe377bbfd8b44fdd08bd4dd187138430387f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=AF=E7=AB=8B?= Date: Fri, 30 Dec 2022 14:58:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=20dev=20=E5=88=86?= =?UTF-8?q?=E6=94=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 3 - app/admin/controller/Auth.php | 124 - app/admin/controller/Base.php | 111 - app/admin/controller/Config.php | 133 - app/admin/controller/File.php | 112 - app/admin/controller/Index.php | 155 - app/admin/controller/Login.php | 136 - app/admin/controller/Menu.php | 146 - app/admin/controller/Module.php | 73 - app/admin/controller/Oplog.php | 94 - app/admin/controller/Queue.php | 116 - app/admin/controller/User.php | 179 - app/admin/controller/api/Plugs.php | 70 - app/admin/controller/api/Queue.php | 111 - app/admin/controller/api/System.php | 138 - app/admin/controller/api/Update.php | 77 - app/admin/controller/api/Upload.php | 328 -- .../database/20221013031925_install_admin.php | 387 -- .../20221013031926_install_admin_data.php | 111 - app/admin/module/change/2020.08.03.01.md | 7 - app/admin/module/change/2021.06.17.01.md | 3 - app/admin/module/change/2022.03.06.01.md | 10 - app/admin/module/change/2022.07.11.01.md | 12 - app/admin/module/module.json | 6 - app/admin/route/demo.php | 59 - app/admin/view/api/icon.html | 1173 ----- app/admin/view/api/upload.js | 309 -- app/admin/view/api/upload/image.html | 146 - app/admin/view/auth/apply.html | 104 - app/admin/view/auth/form.html | 25 - app/admin/view/auth/index.html | 80 - app/admin/view/auth/index_search.html | 45 - app/admin/view/base/form.html | 68 - app/admin/view/base/index.html | 86 - app/admin/view/base/index_search.html | 42 - app/admin/view/config/index.html | 171 - app/admin/view/config/storage-0.html | 45 - app/admin/view/config/storage-alioss.html | 96 - app/admin/view/config/storage-local.html | 49 - app/admin/view/config/storage-qiniu.html | 95 - app/admin/view/config/storage-txcos.html | 96 - app/admin/view/config/storage-upyun.html | 79 - app/admin/view/config/system.html | 129 - app/admin/view/error.php | 568 --- app/admin/view/file/form.html | 40 - app/admin/view/file/index.html | 65 - app/admin/view/file/index_search.html | 58 - app/admin/view/full.html | 32 - app/admin/view/index/index-left.html | 50 - app/admin/view/index/index-top.html | 44 - app/admin/view/index/index.html | 62 - app/admin/view/index/theme.html | 36 - app/admin/view/login/index.html | 57 - app/admin/view/main.html | 18 - app/admin/view/menu/form.html | 97 - app/admin/view/menu/index.html | 123 - app/admin/view/module/change.html | 44 - app/admin/view/module/index.html | 42 - app/admin/view/module/index_search.html | 58 - app/admin/view/oplog/index.html | 47 - app/admin/view/oplog/index_search.html | 129 - app/admin/view/queue/index.html | 117 - app/admin/view/queue/index_search.html | 59 - app/admin/view/table.html | 18 - app/admin/view/user/form.html | 114 - app/admin/view/user/index.html | 116 - app/admin/view/user/index_search.html | 58 - app/admin/view/user/pass.html | 50 - app/data/command/OrderClean.php | 82 - app/data/command/UserAgent.php | 79 - app/data/command/UserAmount.php | 45 - app/data/command/UserTransfer.php | 263 -- app/data/command/UserUpgrade.php | 47 - app/data/controller/api/Auth.php | 95 - app/data/controller/api/Data.php | 64 - app/data/controller/api/Goods.php | 63 - app/data/controller/api/Login.php | 109 - app/data/controller/api/News.php | 68 - app/data/controller/api/Notify.php | 64 - app/data/controller/api/Wechat.php | 137 - app/data/controller/api/Wxapp.php | 200 - app/data/controller/api/auth/Address.php | 132 - app/data/controller/api/auth/Balance.php | 27 - app/data/controller/api/auth/Center.php | 150 - app/data/controller/api/auth/News.php | 209 - app/data/controller/api/auth/Order.php | 496 --- app/data/controller/api/auth/Rebate.php | 58 - app/data/controller/api/auth/Transfer.php | 162 - app/data/controller/base/Config.php | 72 - app/data/controller/base/Discount.php | 93 - app/data/controller/base/Message.php | 85 - app/data/controller/base/Pager.php | 87 - app/data/controller/base/Payment.php | 134 - app/data/controller/base/Slider.php | 102 - app/data/controller/base/Upgrade.php | 156 - app/data/controller/base/postage/Company.php | 115 - app/data/controller/base/postage/Template.php | 121 - app/data/controller/news/Item.php | 133 - app/data/controller/news/Mark.php | 81 - app/data/controller/shop/Cate.php | 105 - app/data/controller/shop/Goods.php | 254 -- app/data/controller/shop/Mark.php | 67 - app/data/controller/shop/Order.php | 192 - app/data/controller/shop/Send.php | 161 - app/data/controller/total/Portal.php | 57 - app/data/controller/user/Admin.php | 185 - app/data/controller/user/Balance.php | 136 - app/data/controller/user/Message.php | 61 - app/data/controller/user/Rebate.php | 93 - app/data/controller/user/Transfer.php | 178 - .../database/20221013045838_install_user.php | 1213 ------ .../20221013045839_install_user_data.php | 72 - .../20221013045840_install_user_region.php | 3784 ----------------- app/data/model/BasePostageCompany.php | 23 - app/data/model/BasePostageRegion.php | 14 - app/data/model/BasePostageTemplate.php | 23 - app/data/model/BaseUserDiscount.php | 33 - app/data/model/BaseUserMessage.php | 23 - app/data/model/BaseUserPayment.php | 23 - app/data/model/BaseUserUpgrade.php | 70 - app/data/model/DataNewsItem.php | 23 - app/data/model/DataNewsMark.php | 35 - app/data/model/DataNewsXCollect.php | 15 - app/data/model/DataUser.php | 23 - app/data/model/DataUserAddress.php | 15 - app/data/model/DataUserBalance.php | 15 - app/data/model/DataUserMessage.php | 15 - app/data/model/DataUserPayment.php | 15 - app/data/model/DataUserRebate.php | 15 - app/data/model/DataUserToken.php | 15 - app/data/model/DataUserTransfer.php | 15 - app/data/model/ShopGoods.php | 23 - app/data/model/ShopGoodsCate.php | 88 - app/data/model/ShopGoodsItem.php | 34 - app/data/model/ShopGoodsMark.php | 33 - app/data/model/ShopGoodsStock.php | 15 - app/data/model/ShopOrder.php | 32 - app/data/model/ShopOrderItem.php | 35 - app/data/model/ShopOrderSend.php | 15 - app/data/readme.md | 9 - app/data/service/ExpressService.php | 120 - app/data/service/GoodsService.php | 85 - app/data/service/MessageService.php | 175 - app/data/service/NewsService.php | 78 - app/data/service/OrderService.php | 151 - app/data/service/PaymentService.php | 376 -- app/data/service/RebateService.php | 461 -- app/data/service/UserAdminService.php | 147 - app/data/service/UserBalanceService.php | 66 - app/data/service/UserRebateService.php | 59 - app/data/service/UserTokenService.php | 101 - app/data/service/UserTransferService.php | 156 - app/data/service/UserUpgradeService.php | 142 - .../service/payment/AlipayPaymentService.php | 143 - .../service/payment/BalancePaymentService.php | 88 - .../service/payment/EmptyPaymentService.php | 63 - .../service/payment/JoinpayPaymentService.php | 168 - .../service/payment/VoucherPaymentService.php | 60 - .../service/payment/WechatPaymentService.php | 178 - app/data/sys.php | 59 - app/data/view/base/config/cropper.html | 65 - app/data/view/base/config/wxapp.html | 30 - app/data/view/base/discount/form.html | 61 - app/data/view/base/discount/index.html | 89 - app/data/view/base/message/form.html | 34 - app/data/view/base/message/index.html | 76 - app/data/view/base/message/index_search.html | 38 - app/data/view/base/pager/form.html | 33 - app/data/view/base/pager/index.html | 30 - app/data/view/base/payment/form.html | 90 - app/data/view/base/payment/form_alipay.html | 17 - app/data/view/base/payment/form_joinpay.html | 23 - app/data/view/base/payment/form_voucher.html | 8 - app/data/view/base/payment/form_wechat.html | 74 - app/data/view/base/payment/index.html | 95 - app/data/view/base/payment/index_search.html | 42 - app/data/view/base/postage/company/form.html | 42 - app/data/view/base/postage/company/index.html | 100 - .../base/postage/company/index_search.html | 27 - app/data/view/base/postage/template/form.html | 340 -- .../base/postage/template/form_region.html | 132 - .../view/base/postage/template/index.html | 87 - .../base/postage/template/index_search.html | 26 - app/data/view/base/slider/form.html | 143 - app/data/view/base/slider/index.html | 30 - app/data/view/base/upgrade/form.html | 188 - app/data/view/base/upgrade/index.html | 123 - app/data/view/base/upgrade/index_search.html | 38 - app/data/view/full.html | 32 - app/data/view/main.html | 18 - app/data/view/news/item/form.html | 57 - app/data/view/news/item/index.html | 108 - app/data/view/news/item/index_search.html | 36 - app/data/view/news/item/select.html | 82 - app/data/view/news/mark/form.html | 26 - app/data/view/news/mark/index.html | 100 - app/data/view/news/mark/index_search.html | 38 - app/data/view/shop/cate/form.html | 47 - app/data/view/shop/cate/index.html | 91 - app/data/view/shop/goods/form.html | 476 --- app/data/view/shop/goods/formstyle.html | 96 - app/data/view/shop/goods/index.html | 138 - app/data/view/shop/goods/index_search.html | 107 - app/data/view/shop/goods/select.html | 48 - app/data/view/shop/goods/select_search.html | 36 - app/data/view/shop/goods/stock.html | 102 - app/data/view/shop/mark/form.html | 26 - app/data/view/shop/mark/index.html | 100 - app/data/view/shop/order/audit.html | 46 - app/data/view/shop/order/index.html | 144 - app/data/view/shop/order/index_search.html | 140 - app/data/view/shop/send/config.html | 43 - app/data/view/shop/send/index.html | 84 - app/data/view/shop/send/index_search.html | 114 - app/data/view/shop/send/truck_form.html | 93 - app/data/view/shop/send/truck_query.html | 17 - app/data/view/table.html | 18 - app/data/view/total/portal/index.html | 303 -- app/data/view/user/admin/index.html | 157 - app/data/view/user/admin/index_search.html | 146 - app/data/view/user/admin/parent.html | 87 - app/data/view/user/admin/parent_search.html | 75 - app/data/view/user/admin/teams.html | 51 - app/data/view/user/balance/form.html | 78 - app/data/view/user/balance/index.html | 68 - app/data/view/user/balance/index_search.html | 62 - app/data/view/user/message/config.html | 58 - app/data/view/user/message/index.html | 52 - app/data/view/user/message/index_search.html | 44 - app/data/view/user/rebate/config.html | 308 -- app/data/view/user/rebate/index.html | 92 - app/data/view/user/rebate/index_search.html | 63 - app/data/view/user/transfer/audit.html | 132 - app/data/view/user/transfer/config.html | 130 - app/data/view/user/transfer/index.html | 122 - app/data/view/user/transfer/index_search.html | 60 - app/data/view/user/transfer/payment.html | 50 - app/index/controller/Index.php | 31 - app/wechat/command/Auto.php | 149 - app/wechat/command/Fans.php | 156 - app/wechat/controller/Auto.php | 128 - app/wechat/controller/Config.php | 157 - app/wechat/controller/Fans.php | 127 - app/wechat/controller/Keys.php | 161 - app/wechat/controller/Menu.php | 168 - app/wechat/controller/News.php | 152 - app/wechat/controller/api/Js.php | 103 - app/wechat/controller/api/Login.php | 108 - app/wechat/controller/api/Push.php | 336 -- app/wechat/controller/api/Test.php | 255 -- app/wechat/controller/api/View.php | 109 - .../20221013045829_install_wechat.php | 299 -- .../20221013045830_install_wechat_data.php | 55 - app/wechat/model/WechatAuto.php | 37 - app/wechat/model/WechatFans.php | 28 - app/wechat/model/WechatFansTags.php | 28 - app/wechat/model/WechatKeys.php | 37 - app/wechat/model/WechatMedia.php | 28 - app/wechat/model/WechatNews.php | 28 - app/wechat/model/WechatNewsArticle.php | 28 - app/wechat/module/change/2020.08.03.00.md | 2 - app/wechat/module/change/2020.08.28.01.md | 1 - app/wechat/module/module.json | 6 - app/wechat/service/AutoService.php | 59 - app/wechat/service/FansService.php | 61 - app/wechat/service/MediaService.php | 97 - app/wechat/service/WechatService.php | 290 -- app/wechat/sys.php | 31 - app/wechat/view/api/login/failed.html | 36 - app/wechat/view/api/login/success.html | 53 - app/wechat/view/api/test/jssdk.html | 64 - app/wechat/view/api/test/oauth.html | 55 - app/wechat/view/api/view/image.html | 28 - app/wechat/view/api/view/item.html | 72 - app/wechat/view/api/view/main.html | 20 - app/wechat/view/api/view/music.html | 78 - app/wechat/view/api/view/news.html | 147 - app/wechat/view/api/view/text.html | 9 - app/wechat/view/api/view/video.html | 44 - app/wechat/view/api/view/voice.html | 45 - app/wechat/view/auto/form.html | 253 -- app/wechat/view/auto/index.html | 112 - app/wechat/view/auto/index_search.html | 49 - app/wechat/view/config/options.html | 39 - app/wechat/view/config/options_form_api.html | 66 - app/wechat/view/config/options_form_thr.html | 74 - app/wechat/view/config/options_test.html | 21 - app/wechat/view/config/payment.html | 102 - app/wechat/view/config/payment_test.html | 40 - app/wechat/view/fans/index.html | 82 - app/wechat/view/fans/index_search.html | 79 - app/wechat/view/keys/form.html | 254 -- app/wechat/view/keys/index.html | 126 - app/wechat/view/keys/index_search.html | 49 - app/wechat/view/menu/index.html | 201 - app/wechat/view/news/form.html | 215 - app/wechat/view/news/formstyle.html | 87 - app/wechat/view/news/index.html | 158 - app/wechat/view/news/select.html | 146 - build.cmd | 1 - composer.json | 18 +- config/app.php | 49 - config/cache.php | 51 - config/cookie.php | 32 - config/database.php | 81 - config/lang.php | 39 - config/log.php | 57 - config/phinx.php | 24 - config/route.php | 58 - config/session.php | 28 - config/view.php | 42 - .../20221013031925_install_admin.php | 387 -- .../20221013031926_install_admin_data.php | 111 - .../20221013045829_install_wechat.php | 299 -- .../20221013045830_install_wechat_data.php | 55 - .../20221013045838_install_user.php | 1213 ------ .../20221013045839_install_user_data.php | 72 - .../20221013045840_install_user_region.php | 3784 ----------------- license | 21 - public/.htaccess | 8 - public/index.php | 25 - public/robots.txt | 4 - public/router.php | 22 - public/static/admin.js | 1111 ----- public/static/extra/script.js | 40 - public/static/extra/style.css | 4 - public/static/login.js | 72 - public/static/plugs/angular/angular.min.js | 351 -- public/static/plugs/ckeditor4/ckeditor.js | 1443 ------- public/static/plugs/ckeditor4/config.js | 79 - public/static/plugs/ckeditor4/contents.css | 208 - public/static/plugs/ckeditor4/lang/en.js | 5 - public/static/plugs/ckeditor4/lang/zh-cn.js | 5 - public/static/plugs/ckeditor4/lang/zh.js | 5 - .../plugins/a11yhelp/dialogs/a11yhelp.js | 10 - .../plugins/a11yhelp/dialogs/lang/en.js | 11 - .../plugins/a11yhelp/dialogs/lang/zh-cn.js | 9 - .../plugins/a11yhelp/dialogs/lang/zh.js | 9 - .../ckeditor4/plugins/about/dialogs/about.js | 8 - .../about/dialogs/hidpi/logo_ckeditor.png | Bin 12236 -> 0 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 5650 -> 0 bytes .../plugins/clipboard/dialogs/paste.js | 11 - .../colordialog/dialogs/colordialog.css | 20 - .../colordialog/dialogs/colordialog.js | 14 - .../cursors/cursor-disabled.svg | 25 - .../plugins/copyformatting/cursors/cursor.svg | 14 - .../copyformatting/styles/copyformatting.css | 45 - .../plugins/dialog/dialogDefinition.js | 4 - .../plugins/dialog/styles/dialog.css | 18 - .../ckeditor4/plugins/div/dialogs/div.js | 10 - .../plugins/exportpdf/plugindefinition.js | 1 - .../ckeditor4/plugins/find/dialogs/find.js | 25 - .../ckeditor4/plugins/forms/dialogs/button.js | 8 - .../plugins/forms/dialogs/checkbox.js | 9 - .../ckeditor4/plugins/forms/dialogs/form.js | 8 - .../plugins/forms/dialogs/hiddenfield.js | 7 - .../ckeditor4/plugins/forms/dialogs/radio.js | 9 - .../ckeditor4/plugins/forms/dialogs/select.js | 21 - .../plugins/forms/dialogs/textarea.js | 9 - .../plugins/forms/dialogs/textfield.js | 11 - .../plugins/forms/images/hiddenfield.gif | Bin 178 -> 0 bytes .../static/plugs/ckeditor4/plugins/icons.png | Bin 12237 -> 0 bytes .../plugs/ckeditor4/plugins/icons_hidpi.png | Bin 38309 -> 0 bytes .../plugins/iframe/dialogs/iframe.js | 11 - .../plugins/iframe/images/placeholder.png | Bin 265 -> 0 bytes .../ckeditor4/plugins/image/dialogs/image.js | 44 - .../plugins/image/images/noimage.png | Bin 1610 -> 0 bytes .../ckeditor4/plugins/lineheight/lang/en.js | 3 - .../plugins/lineheight/lang/zh-cn.js | 3 - .../ckeditor4/plugins/lineheight/lang/zh.js | 3 - .../ckeditor4/plugins/lineheight/plugin.js | 82 - .../ckeditor4/plugins/link/dialogs/anchor.js | 8 - .../ckeditor4/plugins/link/dialogs/link.js | 30 - .../ckeditor4/plugins/link/images/anchor.png | Bin 752 -> 0 bytes .../plugins/link/images/hidpi/anchor.png | Bin 1109 -> 0 bytes .../plugins/liststyle/dialogs/liststyle.js | 10 - .../magicline/images/hidpi/icon-rtl.png | Bin 176 -> 0 bytes .../plugins/magicline/images/hidpi/icon.png | Bin 199 -> 0 bytes .../plugins/magicline/images/icon-rtl.png | Bin 138 -> 0 bytes .../plugins/magicline/images/icon.png | Bin 133 -> 0 bytes .../plugins/pagebreak/images/pagebreak.gif | Bin 99 -> 0 bytes .../plugins/pastefromgdocs/filter/default.js | 8 - .../pastefromlibreoffice/filter/default.js | 11 - .../plugins/pastefromword/filter/default.js | 42 - .../plugins/pastetools/filter/common.js | 24 - .../plugins/pastetools/filter/image.js | 12 - .../plugins/preview/images/pagebreak.gif | Bin 99 -> 0 bytes .../ckeditor4/plugins/preview/preview.html | 13 - .../plugins/preview/styles/screen.css | 10 - .../plugins/scayt/dialogs/dialog.css | 23 - .../plugins/scayt/dialogs/options.js | 32 - .../plugins/scayt/dialogs/toolbar.css | 71 - .../plugins/scayt/skins/moono-lisa/scayt.css | 25 - .../showblocks/images/block_address.png | Bin 152 -> 0 bytes .../showblocks/images/block_blockquote.png | Bin 154 -> 0 bytes .../plugins/showblocks/images/block_div.png | Bin 127 -> 0 bytes .../plugins/showblocks/images/block_h1.png | Bin 120 -> 0 bytes .../plugins/showblocks/images/block_h2.png | Bin 127 -> 0 bytes .../plugins/showblocks/images/block_h3.png | Bin 123 -> 0 bytes .../plugins/showblocks/images/block_h4.png | Bin 123 -> 0 bytes .../plugins/showblocks/images/block_h5.png | Bin 126 -> 0 bytes .../plugins/showblocks/images/block_h6.png | Bin 123 -> 0 bytes .../plugins/showblocks/images/block_p.png | Bin 115 -> 0 bytes .../plugins/showblocks/images/block_pre.png | Bin 128 -> 0 bytes .../plugins/smiley/dialogs/smiley.js | 11 - .../plugins/smiley/images/angel_smile.gif | Bin 1245 -> 0 bytes .../plugins/smiley/images/angel_smile.png | Bin 1172 -> 0 bytes .../plugins/smiley/images/angry_smile.gif | Bin 1219 -> 0 bytes .../plugins/smiley/images/angry_smile.png | Bin 1220 -> 0 bytes .../plugins/smiley/images/broken_heart.gif | Bin 732 -> 0 bytes .../plugins/smiley/images/broken_heart.png | Bin 1139 -> 0 bytes .../plugins/smiley/images/confused_smile.gif | Bin 1202 -> 0 bytes .../plugins/smiley/images/confused_smile.png | Bin 1101 -> 0 bytes .../plugins/smiley/images/cry_smile.gif | Bin 795 -> 0 bytes .../plugins/smiley/images/cry_smile.png | Bin 1214 -> 0 bytes .../plugins/smiley/images/devil_smile.gif | Bin 1239 -> 0 bytes .../plugins/smiley/images/devil_smile.png | Bin 1220 -> 0 bytes .../smiley/images/embaressed_smile.gif | Bin 786 -> 0 bytes .../smiley/images/embarrassed_smile.gif | Bin 786 -> 0 bytes .../smiley/images/embarrassed_smile.png | Bin 1145 -> 0 bytes .../plugins/smiley/images/envelope.gif | Bin 506 -> 0 bytes .../plugins/smiley/images/envelope.png | Bin 760 -> 0 bytes .../ckeditor4/plugins/smiley/images/heart.gif | Bin 692 -> 0 bytes .../ckeditor4/plugins/smiley/images/heart.png | Bin 999 -> 0 bytes .../ckeditor4/plugins/smiley/images/kiss.gif | Bin 683 -> 0 bytes .../ckeditor4/plugins/smiley/images/kiss.png | Bin 1003 -> 0 bytes .../plugins/smiley/images/lightbulb.gif | Bin 660 -> 0 bytes .../plugins/smiley/images/lightbulb.png | Bin 919 -> 0 bytes .../plugins/smiley/images/omg_smile.gif | Bin 820 -> 0 bytes .../plugins/smiley/images/omg_smile.png | Bin 1122 -> 0 bytes .../plugins/smiley/images/regular_smile.gif | Bin 1209 -> 0 bytes .../plugins/smiley/images/regular_smile.png | Bin 1084 -> 0 bytes .../plugins/smiley/images/sad_smile.gif | Bin 782 -> 0 bytes .../plugins/smiley/images/sad_smile.png | Bin 1115 -> 0 bytes .../plugins/smiley/images/shades_smile.gif | Bin 1231 -> 0 bytes .../plugins/smiley/images/shades_smile.png | Bin 1204 -> 0 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 1201 -> 0 bytes .../plugins/smiley/images/teeth_smile.png | Bin 1183 -> 0 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 715 -> 0 bytes .../plugins/smiley/images/thumbs_down.png | Bin 985 -> 0 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 714 -> 0 bytes .../plugins/smiley/images/thumbs_up.png | Bin 959 -> 0 bytes .../plugins/smiley/images/tongue_smile.gif | Bin 1210 -> 0 bytes .../plugins/smiley/images/tongue_smile.png | Bin 1132 -> 0 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 1210 -> 0 bytes .../images/whatchutalkingabout_smile.gif | Bin 775 -> 0 bytes .../images/whatchutalkingabout_smile.png | Bin 1039 -> 0 bytes .../plugins/smiley/images/wink_smile.gif | Bin 1202 -> 0 bytes .../plugins/smiley/images/wink_smile.png | Bin 1114 -> 0 bytes .../plugins/specialchar/dialogs/lang/en.js | 13 - .../plugins/specialchar/dialogs/lang/zh-cn.js | 9 - .../plugins/specialchar/dialogs/lang/zh.js | 9 - .../specialchar/dialogs/specialchar.js | 14 - .../ckeditor4/plugins/table/dialogs/table.js | 22 - .../tableselection/styles/tableselection.css | 36 - .../plugins/tabletools/dialogs/tableCell.js | 18 - .../plugins/templates/dialogs/templates.css | 84 - .../plugins/templates/dialogs/templates.js | 11 - .../plugins/templates/templatedefinition.js | 4 - .../plugins/templates/templates/default.js | 7 - .../templates/templates/images/template1.gif | Bin 539 -> 0 bytes .../templates/templates/images/template2.gif | Bin 497 -> 0 bytes .../templates/templates/images/template3.gif | Bin 557 -> 0 bytes .../plugins/widget/images/handle.png | Bin 220 -> 0 bytes .../plugins/wsc/dialogs/ciframe.html | 66 - .../plugins/wsc/dialogs/tmpFrameset.html | 52 - .../ckeditor4/plugins/wsc/dialogs/wsc.css | 82 - .../ckeditor4/plugins/wsc/dialogs/wsc.js | 90 - .../ckeditor4/plugins/wsc/dialogs/wsc_ie.js | 11 - .../plugins/wsc/icons/hidpi/spellchecker.png | Bin 2816 -> 0 bytes .../plugins/wsc/icons/spellchecker.png | Bin 836 -> 0 bytes .../plugs/ckeditor4/plugins/wsc/lang/en.js | 2 - .../plugs/ckeditor4/plugins/wsc/lang/zh-cn.js | 1 - .../plugs/ckeditor4/plugins/wsc/lang/zh.js | 1 - .../plugs/ckeditor4/plugins/wsc/plugin.js | 5 - .../plugins/wsc/skins/moono-lisa/wsc.css | 43 - .../ckeditor4/skins/moono-lisa/dialog.css | 5 - .../ckeditor4/skins/moono-lisa/dialog_ie.css | 5 - .../ckeditor4/skins/moono-lisa/dialog_ie8.css | 5 - .../skins/moono-lisa/dialog_iequirks.css | 5 - .../ckeditor4/skins/moono-lisa/editor.css | 5 - .../skins/moono-lisa/editor_gecko.css | 5 - .../ckeditor4/skins/moono-lisa/editor_ie.css | 5 - .../ckeditor4/skins/moono-lisa/editor_ie8.css | 5 - .../skins/moono-lisa/editor_iequirks.css | 5 - .../ckeditor4/skins/moono-lisa/icons.png | Bin 12237 -> 0 bytes .../skins/moono-lisa/icons_hidpi.png | Bin 38309 -> 0 bytes .../skins/moono-lisa/images/arrow.png | Bin 191 -> 0 bytes .../skins/moono-lisa/images/close.png | Bin 615 -> 0 bytes .../skins/moono-lisa/images/hidpi/close.png | Bin 1238 -> 0 bytes .../moono-lisa/images/hidpi/lock-open.png | Bin 1071 -> 0 bytes .../skins/moono-lisa/images/hidpi/lock.png | Bin 1062 -> 0 bytes .../skins/moono-lisa/images/hidpi/refresh.png | Bin 1623 -> 0 bytes .../skins/moono-lisa/images/lock-open.png | Bin 511 -> 0 bytes .../skins/moono-lisa/images/lock.png | Bin 506 -> 0 bytes .../skins/moono-lisa/images/refresh.png | Bin 757 -> 0 bytes .../skins/moono-lisa/images/spinner.gif | Bin 2984 -> 0 bytes .../ckeditor4/skins/moono-lisa/readme.md | 46 - public/static/plugs/ckeditor4/styles.js | 104 - public/static/plugs/ckeditor5/ckeditor.css | 71 - public/static/plugs/ckeditor5/ckeditor.js | 7 - public/static/plugs/ckeditor5/content.css | 470 -- .../static/plugs/ckeditor5/translations/af.js | 1 - .../static/plugs/ckeditor5/translations/ar.js | 1 - .../plugs/ckeditor5/translations/ast.js | 1 - .../static/plugs/ckeditor5/translations/az.js | 1 - .../static/plugs/ckeditor5/translations/bg.js | 1 - .../static/plugs/ckeditor5/translations/bs.js | 1 - .../static/plugs/ckeditor5/translations/ca.js | 1 - .../static/plugs/ckeditor5/translations/cs.js | 1 - .../static/plugs/ckeditor5/translations/da.js | 1 - .../plugs/ckeditor5/translations/de-ch.js | 1 - .../static/plugs/ckeditor5/translations/de.js | 1 - .../static/plugs/ckeditor5/translations/el.js | 1 - .../plugs/ckeditor5/translations/en-au.js | 1 - .../plugs/ckeditor5/translations/en-gb.js | 1 - .../static/plugs/ckeditor5/translations/en.js | 1 - .../static/plugs/ckeditor5/translations/eo.js | 1 - .../static/plugs/ckeditor5/translations/es.js | 1 - .../static/plugs/ckeditor5/translations/et.js | 1 - .../static/plugs/ckeditor5/translations/eu.js | 1 - .../static/plugs/ckeditor5/translations/fa.js | 1 - .../static/plugs/ckeditor5/translations/fi.js | 1 - .../static/plugs/ckeditor5/translations/fr.js | 1 - .../static/plugs/ckeditor5/translations/gl.js | 1 - .../static/plugs/ckeditor5/translations/gu.js | 1 - .../static/plugs/ckeditor5/translations/he.js | 1 - .../static/plugs/ckeditor5/translations/hi.js | 1 - .../static/plugs/ckeditor5/translations/hr.js | 1 - .../static/plugs/ckeditor5/translations/hu.js | 1 - .../static/plugs/ckeditor5/translations/id.js | 1 - .../static/plugs/ckeditor5/translations/it.js | 1 - .../static/plugs/ckeditor5/translations/ja.js | 1 - .../static/plugs/ckeditor5/translations/jv.js | 1 - .../static/plugs/ckeditor5/translations/kk.js | 1 - .../static/plugs/ckeditor5/translations/km.js | 1 - .../static/plugs/ckeditor5/translations/kn.js | 1 - .../static/plugs/ckeditor5/translations/ko.js | 1 - .../static/plugs/ckeditor5/translations/ku.js | 1 - .../static/plugs/ckeditor5/translations/lt.js | 1 - .../static/plugs/ckeditor5/translations/lv.js | 1 - .../static/plugs/ckeditor5/translations/ms.js | 1 - .../static/plugs/ckeditor5/translations/nb.js | 1 - .../static/plugs/ckeditor5/translations/ne.js | 1 - .../static/plugs/ckeditor5/translations/nl.js | 1 - .../static/plugs/ckeditor5/translations/no.js | 1 - .../static/plugs/ckeditor5/translations/oc.js | 1 - .../static/plugs/ckeditor5/translations/pl.js | 1 - .../plugs/ckeditor5/translations/pt-br.js | 1 - .../static/plugs/ckeditor5/translations/pt.js | 1 - .../static/plugs/ckeditor5/translations/ro.js | 1 - .../static/plugs/ckeditor5/translations/ru.js | 1 - .../static/plugs/ckeditor5/translations/si.js | 1 - .../static/plugs/ckeditor5/translations/sk.js | 1 - .../static/plugs/ckeditor5/translations/sl.js | 1 - .../static/plugs/ckeditor5/translations/sq.js | 1 - .../plugs/ckeditor5/translations/sr-latn.js | 1 - .../static/plugs/ckeditor5/translations/sr.js | 1 - .../static/plugs/ckeditor5/translations/sv.js | 1 - .../static/plugs/ckeditor5/translations/th.js | 1 - .../static/plugs/ckeditor5/translations/tk.js | 1 - .../static/plugs/ckeditor5/translations/tr.js | 1 - .../static/plugs/ckeditor5/translations/tt.js | 1 - .../static/plugs/ckeditor5/translations/ug.js | 1 - .../static/plugs/ckeditor5/translations/uk.js | 1 - .../static/plugs/ckeditor5/translations/ur.js | 1 - .../static/plugs/ckeditor5/translations/uz.js | 1 - .../static/plugs/ckeditor5/translations/vi.js | 1 - .../static/plugs/ckeditor5/translations/zh.js | 1 - public/static/plugs/cropper/cropper.min.css | 9 - public/static/plugs/cropper/cropper.min.js | 10 - public/static/plugs/echarts/echarts.min.js | 45 - public/static/plugs/jquery/area/area.php | 201 - public/static/plugs/jquery/area/data.json | 1 - public/static/plugs/jquery/autocompleter.css | 79 - .../static/plugs/jquery/autocompleter.min.js | 8 - public/static/plugs/jquery/base64.min.js | 1 - public/static/plugs/jquery/compressor.min.js | 10 - public/static/plugs/jquery/excel.xlsx.js | 142 - public/static/plugs/jquery/filesaver.min.js | 1 - public/static/plugs/jquery/jquery.min.js | 5 - public/static/plugs/jquery/json.min.js | 1 - public/static/plugs/jquery/jszip.min.js | 13 - public/static/plugs/jquery/less.min.js | 18 - public/static/plugs/jquery/marked.min.js | 6 - public/static/plugs/jquery/masonry.min.js | 9 - public/static/plugs/jquery/md5.min.js | 1 - public/static/plugs/jquery/pace.min.js | 2 - public/static/plugs/jquery/pcasunzips.js | 85 - public/static/plugs/jquery/xlsx.min.js | 17 - public/static/plugs/layui/css/layui.css | 1 - public/static/plugs/layui/font/iconfont.eot | Bin 51676 -> 0 bytes public/static/plugs/layui/font/iconfont.svg | 385 -- public/static/plugs/layui/font/iconfont.ttf | Bin 51500 -> 0 bytes public/static/plugs/layui/font/iconfont.woff | Bin 33040 -> 0 bytes public/static/plugs/layui/font/iconfont.woff2 | Bin 28500 -> 0 bytes public/static/plugs/layui/layui.js | 1 - public/static/plugs/layui_exts/excel.js | 10 - .../static/plugs/layui_exts/layCascader.css | 1654 ------- public/static/plugs/layui_exts/layCascader.js | 2085 --------- public/static/plugs/layui_exts/tableSelect.js | 255 -- public/static/plugs/layui_exts/xmSelect.js | 8 - .../plugs/notify/img/danger-outline.svg | 1 - public/static/plugs/notify/img/danger.png | Bin 1218 -> 0 bytes .../plugs/notify/img/default-outline.svg | 1 - public/static/plugs/notify/img/default.png | Bin 859 -> 0 bytes .../static/plugs/notify/img/info-outline.svg | 1 - public/static/plugs/notify/img/info.png | Bin 541 -> 0 bytes .../plugs/notify/img/success-outline.svg | 1 - public/static/plugs/notify/img/success.png | Bin 700 -> 0 bytes .../plugs/notify/img/warning-outline.svg | 1 - public/static/plugs/notify/img/warning.png | Bin 991 -> 0 bytes public/static/plugs/notify/light.css | 347 -- public/static/plugs/notify/notify.min.js | 1 - public/static/plugs/require/css.js | 1 - public/static/plugs/require/require.js | 1 - public/static/plugs/socket/swfobject.js | 4 - public/static/plugs/socket/websocket.js | 6 - public/static/plugs/socket/websocket.swf | Bin 177238 -> 0 bytes public/static/plugs/sortable/sortable.min.js | 3 - .../plugs/sortable/vue.draggable.min.js | 1 - public/static/plugs/supersized/progress.gif | Bin 5481 -> 0 bytes .../plugs/supersized/supersized.3.2.7.min.js | 677 --- public/static/plugs/supersized/supersized.css | 1 - public/static/plugs/vue/vue.min.js | 6 - .../ztree/zTreeStyle/img/diy/1_close.png | Bin 601 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/1_open.png | Bin 580 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/2.png | Bin 570 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/3.png | Bin 762 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/4.png | Bin 399 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/5.png | Bin 710 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/6.png | Bin 432 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/7.png | Bin 534 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/8.png | Bin 529 -> 0 bytes .../plugs/ztree/zTreeStyle/img/diy/9.png | Bin 467 -> 0 bytes .../plugs/ztree/zTreeStyle/img/line_conn.gif | Bin 45 -> 0 bytes .../plugs/ztree/zTreeStyle/img/loading.gif | Bin 381 -> 0 bytes .../ztree/zTreeStyle/img/zTreeStandard.gif | Bin 5564 -> 0 bytes .../ztree/zTreeStyle/img/zTreeStandard.png | Bin 11173 -> 0 bytes .../plugs/ztree/zTreeStyle/zTreeStyle.css | 97 - public/static/plugs/ztree/ztree.all.min.js | 166 - public/static/theme/css/_config.less | 175 - public/static/theme/css/_custom.less | 2063 --------- public/static/theme/css/_display.less | 426 -- public/static/theme/css/_layout.less | 492 --- public/static/theme/css/_layout_1.less | 98 - public/static/theme/css/_layout_1_black.less | 25 - public/static/theme/css/_layout_1_blue.less | 25 - public/static/theme/css/_layout_1_green.less | 25 - public/static/theme/css/_layout_1_red.less | 25 - public/static/theme/css/_layout_2.less | 219 - public/static/theme/css/_layout_2_black.less | 11 - public/static/theme/css/_layout_2_blue.less | 11 - public/static/theme/css/_layout_2_green.less | 11 - public/static/theme/css/_layout_2_red.less | 11 - public/static/theme/css/_layout_white.less | 121 - public/static/theme/css/console.css | 1 - public/static/theme/css/console.css.map | 1 - public/static/theme/css/console.less | 80 - public/static/theme/css/icon/iconfont.ttf | Bin 36192 -> 0 bytes public/static/theme/css/icon/iconfont.woff | Bin 21164 -> 0 bytes public/static/theme/css/icon/iconfont.woff2 | Bin 18364 -> 0 bytes public/static/theme/css/iconfont.css | 1 - public/static/theme/css/iconfont.css.map | 1 - public/static/theme/css/iconfont.less | 416 -- public/static/theme/css/login.css | 1 - public/static/theme/css/login.css.map | 1 - public/static/theme/css/login.less | 273 -- public/static/theme/css/mobile.css | 1 - public/static/theme/css/mobile.css.map | 1 - public/static/theme/css/mobile.less | 328 -- public/static/theme/css/package.json | 9 - public/static/theme/err/404.html | 21 - public/static/theme/err/404/404.png | Bin 44176 -> 0 bytes public/static/theme/err/404/reset.css | 225 - public/static/theme/err/404/style.css | 45 - public/static/theme/err/500.html | 19 - public/static/theme/err/500/style.css | 144 - public/static/theme/img/404_icon.png | Bin 31096 -> 0 bytes public/static/theme/img/505_icon.png | Bin 28583 -> 0 bytes public/static/theme/img/headimg.png | Bin 9132 -> 0 bytes public/static/theme/img/image.png | Bin 3168 -> 0 bytes public/static/theme/img/login/bg1.jpg | Bin 55719 -> 0 bytes public/static/theme/img/login/bg2.jpg | Bin 67855 -> 0 bytes public/static/theme/img/upimg.png | Bin 6792 -> 0 bytes public/static/theme/img/upvideo.png | Bin 4045 -> 0 bytes public/static/theme/img/wechat/index.png | Bin 231 -> 0 bytes .../static/theme/img/wechat/m-icon-error.png | Bin 36806 -> 0 bytes .../theme/img/wechat/m-icon-success.png | Bin 34420 -> 0 bytes .../static/theme/img/wechat/mobile_foot.png | Bin 1348 -> 0 bytes .../static/theme/img/wechat/mobile_head.png | Bin 14326 -> 0 bytes .../static/theme/img/wechat/qrc_pay_error.jpg | Bin 34402 -> 0 bytes public/static/theme/img/wechat/qrc_payed.jpg | Bin 28055 -> 0 bytes readme.md | 50 +- security.md | 16 - think | 25 - 696 files changed, 45 insertions(+), 57956 deletions(-) delete mode 100644 .gitattributes delete mode 100644 app/admin/controller/Auth.php delete mode 100644 app/admin/controller/Base.php delete mode 100644 app/admin/controller/Config.php delete mode 100644 app/admin/controller/File.php delete mode 100644 app/admin/controller/Index.php delete mode 100644 app/admin/controller/Login.php delete mode 100644 app/admin/controller/Menu.php delete mode 100644 app/admin/controller/Module.php delete mode 100644 app/admin/controller/Oplog.php delete mode 100644 app/admin/controller/Queue.php delete mode 100644 app/admin/controller/User.php delete mode 100644 app/admin/controller/api/Plugs.php delete mode 100644 app/admin/controller/api/Queue.php delete mode 100644 app/admin/controller/api/System.php delete mode 100644 app/admin/controller/api/Update.php delete mode 100644 app/admin/controller/api/Upload.php delete mode 100644 app/admin/database/20221013031925_install_admin.php delete mode 100644 app/admin/database/20221013031926_install_admin_data.php delete mode 100644 app/admin/module/change/2020.08.03.01.md delete mode 100644 app/admin/module/change/2021.06.17.01.md delete mode 100644 app/admin/module/change/2022.03.06.01.md delete mode 100644 app/admin/module/change/2022.07.11.01.md delete mode 100644 app/admin/module/module.json delete mode 100644 app/admin/route/demo.php delete mode 100644 app/admin/view/api/icon.html delete mode 100644 app/admin/view/api/upload.js delete mode 100644 app/admin/view/api/upload/image.html delete mode 100644 app/admin/view/auth/apply.html delete mode 100644 app/admin/view/auth/form.html delete mode 100644 app/admin/view/auth/index.html delete mode 100644 app/admin/view/auth/index_search.html delete mode 100644 app/admin/view/base/form.html delete mode 100644 app/admin/view/base/index.html delete mode 100644 app/admin/view/base/index_search.html delete mode 100644 app/admin/view/config/index.html delete mode 100644 app/admin/view/config/storage-0.html delete mode 100644 app/admin/view/config/storage-alioss.html delete mode 100644 app/admin/view/config/storage-local.html delete mode 100644 app/admin/view/config/storage-qiniu.html delete mode 100644 app/admin/view/config/storage-txcos.html delete mode 100644 app/admin/view/config/storage-upyun.html delete mode 100644 app/admin/view/config/system.html delete mode 100644 app/admin/view/error.php delete mode 100644 app/admin/view/file/form.html delete mode 100644 app/admin/view/file/index.html delete mode 100644 app/admin/view/file/index_search.html delete mode 100644 app/admin/view/full.html delete mode 100644 app/admin/view/index/index-left.html delete mode 100644 app/admin/view/index/index-top.html delete mode 100644 app/admin/view/index/index.html delete mode 100644 app/admin/view/index/theme.html delete mode 100644 app/admin/view/login/index.html delete mode 100644 app/admin/view/main.html delete mode 100644 app/admin/view/menu/form.html delete mode 100644 app/admin/view/menu/index.html delete mode 100644 app/admin/view/module/change.html delete mode 100644 app/admin/view/module/index.html delete mode 100644 app/admin/view/module/index_search.html delete mode 100644 app/admin/view/oplog/index.html delete mode 100644 app/admin/view/oplog/index_search.html delete mode 100644 app/admin/view/queue/index.html delete mode 100644 app/admin/view/queue/index_search.html delete mode 100644 app/admin/view/table.html delete mode 100644 app/admin/view/user/form.html delete mode 100644 app/admin/view/user/index.html delete mode 100644 app/admin/view/user/index_search.html delete mode 100644 app/admin/view/user/pass.html delete mode 100644 app/data/command/OrderClean.php delete mode 100644 app/data/command/UserAgent.php delete mode 100644 app/data/command/UserAmount.php delete mode 100644 app/data/command/UserTransfer.php delete mode 100644 app/data/command/UserUpgrade.php delete mode 100644 app/data/controller/api/Auth.php delete mode 100644 app/data/controller/api/Data.php delete mode 100644 app/data/controller/api/Goods.php delete mode 100644 app/data/controller/api/Login.php delete mode 100644 app/data/controller/api/News.php delete mode 100644 app/data/controller/api/Notify.php delete mode 100644 app/data/controller/api/Wechat.php delete mode 100644 app/data/controller/api/Wxapp.php delete mode 100644 app/data/controller/api/auth/Address.php delete mode 100644 app/data/controller/api/auth/Balance.php delete mode 100644 app/data/controller/api/auth/Center.php delete mode 100644 app/data/controller/api/auth/News.php delete mode 100644 app/data/controller/api/auth/Order.php delete mode 100644 app/data/controller/api/auth/Rebate.php delete mode 100644 app/data/controller/api/auth/Transfer.php delete mode 100644 app/data/controller/base/Config.php delete mode 100644 app/data/controller/base/Discount.php delete mode 100644 app/data/controller/base/Message.php delete mode 100644 app/data/controller/base/Pager.php delete mode 100644 app/data/controller/base/Payment.php delete mode 100644 app/data/controller/base/Slider.php delete mode 100644 app/data/controller/base/Upgrade.php delete mode 100644 app/data/controller/base/postage/Company.php delete mode 100644 app/data/controller/base/postage/Template.php delete mode 100644 app/data/controller/news/Item.php delete mode 100644 app/data/controller/news/Mark.php delete mode 100644 app/data/controller/shop/Cate.php delete mode 100644 app/data/controller/shop/Goods.php delete mode 100644 app/data/controller/shop/Mark.php delete mode 100644 app/data/controller/shop/Order.php delete mode 100644 app/data/controller/shop/Send.php delete mode 100644 app/data/controller/total/Portal.php delete mode 100644 app/data/controller/user/Admin.php delete mode 100644 app/data/controller/user/Balance.php delete mode 100644 app/data/controller/user/Message.php delete mode 100644 app/data/controller/user/Rebate.php delete mode 100644 app/data/controller/user/Transfer.php delete mode 100644 app/data/database/20221013045838_install_user.php delete mode 100644 app/data/database/20221013045839_install_user_data.php delete mode 100644 app/data/database/20221013045840_install_user_region.php delete mode 100644 app/data/model/BasePostageCompany.php delete mode 100644 app/data/model/BasePostageRegion.php delete mode 100644 app/data/model/BasePostageTemplate.php delete mode 100644 app/data/model/BaseUserDiscount.php delete mode 100644 app/data/model/BaseUserMessage.php delete mode 100644 app/data/model/BaseUserPayment.php delete mode 100644 app/data/model/BaseUserUpgrade.php delete mode 100644 app/data/model/DataNewsItem.php delete mode 100644 app/data/model/DataNewsMark.php delete mode 100644 app/data/model/DataNewsXCollect.php delete mode 100644 app/data/model/DataUser.php delete mode 100644 app/data/model/DataUserAddress.php delete mode 100644 app/data/model/DataUserBalance.php delete mode 100644 app/data/model/DataUserMessage.php delete mode 100644 app/data/model/DataUserPayment.php delete mode 100644 app/data/model/DataUserRebate.php delete mode 100644 app/data/model/DataUserToken.php delete mode 100644 app/data/model/DataUserTransfer.php delete mode 100644 app/data/model/ShopGoods.php delete mode 100644 app/data/model/ShopGoodsCate.php delete mode 100644 app/data/model/ShopGoodsItem.php delete mode 100644 app/data/model/ShopGoodsMark.php delete mode 100644 app/data/model/ShopGoodsStock.php delete mode 100644 app/data/model/ShopOrder.php delete mode 100644 app/data/model/ShopOrderItem.php delete mode 100644 app/data/model/ShopOrderSend.php delete mode 100644 app/data/readme.md delete mode 100644 app/data/service/ExpressService.php delete mode 100644 app/data/service/GoodsService.php delete mode 100644 app/data/service/MessageService.php delete mode 100644 app/data/service/NewsService.php delete mode 100644 app/data/service/OrderService.php delete mode 100644 app/data/service/PaymentService.php delete mode 100644 app/data/service/RebateService.php delete mode 100644 app/data/service/UserAdminService.php delete mode 100644 app/data/service/UserBalanceService.php delete mode 100644 app/data/service/UserRebateService.php delete mode 100644 app/data/service/UserTokenService.php delete mode 100644 app/data/service/UserTransferService.php delete mode 100644 app/data/service/UserUpgradeService.php delete mode 100644 app/data/service/payment/AlipayPaymentService.php delete mode 100644 app/data/service/payment/BalancePaymentService.php delete mode 100644 app/data/service/payment/EmptyPaymentService.php delete mode 100644 app/data/service/payment/JoinpayPaymentService.php delete mode 100644 app/data/service/payment/VoucherPaymentService.php delete mode 100644 app/data/service/payment/WechatPaymentService.php delete mode 100644 app/data/sys.php delete mode 100644 app/data/view/base/config/cropper.html delete mode 100644 app/data/view/base/config/wxapp.html delete mode 100644 app/data/view/base/discount/form.html delete mode 100644 app/data/view/base/discount/index.html delete mode 100644 app/data/view/base/message/form.html delete mode 100644 app/data/view/base/message/index.html delete mode 100644 app/data/view/base/message/index_search.html delete mode 100644 app/data/view/base/pager/form.html delete mode 100644 app/data/view/base/pager/index.html delete mode 100644 app/data/view/base/payment/form.html delete mode 100644 app/data/view/base/payment/form_alipay.html delete mode 100644 app/data/view/base/payment/form_joinpay.html delete mode 100644 app/data/view/base/payment/form_voucher.html delete mode 100644 app/data/view/base/payment/form_wechat.html delete mode 100644 app/data/view/base/payment/index.html delete mode 100644 app/data/view/base/payment/index_search.html delete mode 100644 app/data/view/base/postage/company/form.html delete mode 100644 app/data/view/base/postage/company/index.html delete mode 100644 app/data/view/base/postage/company/index_search.html delete mode 100644 app/data/view/base/postage/template/form.html delete mode 100644 app/data/view/base/postage/template/form_region.html delete mode 100644 app/data/view/base/postage/template/index.html delete mode 100644 app/data/view/base/postage/template/index_search.html delete mode 100644 app/data/view/base/slider/form.html delete mode 100644 app/data/view/base/slider/index.html delete mode 100644 app/data/view/base/upgrade/form.html delete mode 100644 app/data/view/base/upgrade/index.html delete mode 100644 app/data/view/base/upgrade/index_search.html delete mode 100644 app/data/view/full.html delete mode 100644 app/data/view/main.html delete mode 100644 app/data/view/news/item/form.html delete mode 100644 app/data/view/news/item/index.html delete mode 100644 app/data/view/news/item/index_search.html delete mode 100644 app/data/view/news/item/select.html delete mode 100644 app/data/view/news/mark/form.html delete mode 100644 app/data/view/news/mark/index.html delete mode 100644 app/data/view/news/mark/index_search.html delete mode 100644 app/data/view/shop/cate/form.html delete mode 100644 app/data/view/shop/cate/index.html delete mode 100644 app/data/view/shop/goods/form.html delete mode 100644 app/data/view/shop/goods/formstyle.html delete mode 100644 app/data/view/shop/goods/index.html delete mode 100644 app/data/view/shop/goods/index_search.html delete mode 100644 app/data/view/shop/goods/select.html delete mode 100644 app/data/view/shop/goods/select_search.html delete mode 100644 app/data/view/shop/goods/stock.html delete mode 100644 app/data/view/shop/mark/form.html delete mode 100644 app/data/view/shop/mark/index.html delete mode 100644 app/data/view/shop/order/audit.html delete mode 100644 app/data/view/shop/order/index.html delete mode 100644 app/data/view/shop/order/index_search.html delete mode 100644 app/data/view/shop/send/config.html delete mode 100644 app/data/view/shop/send/index.html delete mode 100644 app/data/view/shop/send/index_search.html delete mode 100644 app/data/view/shop/send/truck_form.html delete mode 100644 app/data/view/shop/send/truck_query.html delete mode 100644 app/data/view/table.html delete mode 100644 app/data/view/total/portal/index.html delete mode 100644 app/data/view/user/admin/index.html delete mode 100644 app/data/view/user/admin/index_search.html delete mode 100644 app/data/view/user/admin/parent.html delete mode 100644 app/data/view/user/admin/parent_search.html delete mode 100644 app/data/view/user/admin/teams.html delete mode 100644 app/data/view/user/balance/form.html delete mode 100644 app/data/view/user/balance/index.html delete mode 100644 app/data/view/user/balance/index_search.html delete mode 100644 app/data/view/user/message/config.html delete mode 100644 app/data/view/user/message/index.html delete mode 100644 app/data/view/user/message/index_search.html delete mode 100644 app/data/view/user/rebate/config.html delete mode 100644 app/data/view/user/rebate/index.html delete mode 100644 app/data/view/user/rebate/index_search.html delete mode 100644 app/data/view/user/transfer/audit.html delete mode 100644 app/data/view/user/transfer/config.html delete mode 100644 app/data/view/user/transfer/index.html delete mode 100644 app/data/view/user/transfer/index_search.html delete mode 100644 app/data/view/user/transfer/payment.html delete mode 100644 app/index/controller/Index.php delete mode 100644 app/wechat/command/Auto.php delete mode 100644 app/wechat/command/Fans.php delete mode 100644 app/wechat/controller/Auto.php delete mode 100644 app/wechat/controller/Config.php delete mode 100644 app/wechat/controller/Fans.php delete mode 100644 app/wechat/controller/Keys.php delete mode 100644 app/wechat/controller/Menu.php delete mode 100644 app/wechat/controller/News.php delete mode 100644 app/wechat/controller/api/Js.php delete mode 100644 app/wechat/controller/api/Login.php delete mode 100644 app/wechat/controller/api/Push.php delete mode 100644 app/wechat/controller/api/Test.php delete mode 100644 app/wechat/controller/api/View.php delete mode 100644 app/wechat/database/20221013045829_install_wechat.php delete mode 100644 app/wechat/database/20221013045830_install_wechat_data.php delete mode 100644 app/wechat/model/WechatAuto.php delete mode 100644 app/wechat/model/WechatFans.php delete mode 100644 app/wechat/model/WechatFansTags.php delete mode 100644 app/wechat/model/WechatKeys.php delete mode 100644 app/wechat/model/WechatMedia.php delete mode 100644 app/wechat/model/WechatNews.php delete mode 100644 app/wechat/model/WechatNewsArticle.php delete mode 100644 app/wechat/module/change/2020.08.03.00.md delete mode 100644 app/wechat/module/change/2020.08.28.01.md delete mode 100644 app/wechat/module/module.json delete mode 100644 app/wechat/service/AutoService.php delete mode 100644 app/wechat/service/FansService.php delete mode 100644 app/wechat/service/MediaService.php delete mode 100644 app/wechat/service/WechatService.php delete mode 100644 app/wechat/sys.php delete mode 100644 app/wechat/view/api/login/failed.html delete mode 100644 app/wechat/view/api/login/success.html delete mode 100644 app/wechat/view/api/test/jssdk.html delete mode 100644 app/wechat/view/api/test/oauth.html delete mode 100644 app/wechat/view/api/view/image.html delete mode 100644 app/wechat/view/api/view/item.html delete mode 100644 app/wechat/view/api/view/main.html delete mode 100644 app/wechat/view/api/view/music.html delete mode 100644 app/wechat/view/api/view/news.html delete mode 100644 app/wechat/view/api/view/text.html delete mode 100644 app/wechat/view/api/view/video.html delete mode 100644 app/wechat/view/api/view/voice.html delete mode 100644 app/wechat/view/auto/form.html delete mode 100644 app/wechat/view/auto/index.html delete mode 100644 app/wechat/view/auto/index_search.html delete mode 100644 app/wechat/view/config/options.html delete mode 100644 app/wechat/view/config/options_form_api.html delete mode 100644 app/wechat/view/config/options_form_thr.html delete mode 100644 app/wechat/view/config/options_test.html delete mode 100644 app/wechat/view/config/payment.html delete mode 100644 app/wechat/view/config/payment_test.html delete mode 100644 app/wechat/view/fans/index.html delete mode 100644 app/wechat/view/fans/index_search.html delete mode 100644 app/wechat/view/keys/form.html delete mode 100644 app/wechat/view/keys/index.html delete mode 100644 app/wechat/view/keys/index_search.html delete mode 100644 app/wechat/view/menu/index.html delete mode 100644 app/wechat/view/news/form.html delete mode 100644 app/wechat/view/news/formstyle.html delete mode 100644 app/wechat/view/news/index.html delete mode 100644 app/wechat/view/news/select.html delete mode 100644 build.cmd delete mode 100644 config/app.php delete mode 100644 config/cache.php delete mode 100644 config/cookie.php delete mode 100644 config/database.php delete mode 100644 config/lang.php delete mode 100644 config/log.php delete mode 100644 config/phinx.php delete mode 100644 config/route.php delete mode 100644 config/session.php delete mode 100644 config/view.php delete mode 100644 database/migrations/20221013031925_install_admin.php delete mode 100644 database/migrations/20221013031926_install_admin_data.php delete mode 100644 database/migrations/20221013045829_install_wechat.php delete mode 100644 database/migrations/20221013045830_install_wechat_data.php delete mode 100644 database/migrations/20221013045838_install_user.php delete mode 100644 database/migrations/20221013045839_install_user_data.php delete mode 100644 database/migrations/20221013045840_install_user_region.php delete mode 100644 license delete mode 100644 public/.htaccess delete mode 100644 public/index.php delete mode 100644 public/robots.txt delete mode 100644 public/router.php delete mode 100644 public/static/admin.js delete mode 100644 public/static/extra/script.js delete mode 100644 public/static/extra/style.css delete mode 100644 public/static/login.js delete mode 100644 public/static/plugs/angular/angular.min.js delete mode 100644 public/static/plugs/ckeditor4/ckeditor.js delete mode 100644 public/static/plugs/ckeditor4/config.js delete mode 100644 public/static/plugs/ckeditor4/contents.css delete mode 100644 public/static/plugs/ckeditor4/lang/en.js delete mode 100644 public/static/plugs/ckeditor4/lang/zh-cn.js delete mode 100644 public/static/plugs/ckeditor4/lang/zh.js delete mode 100644 public/static/plugs/ckeditor4/plugins/a11yhelp/dialogs/a11yhelp.js delete mode 100644 public/static/plugs/ckeditor4/plugins/a11yhelp/dialogs/lang/en.js delete mode 100644 public/static/plugs/ckeditor4/plugins/a11yhelp/dialogs/lang/zh-cn.js delete mode 100644 public/static/plugs/ckeditor4/plugins/a11yhelp/dialogs/lang/zh.js delete mode 100644 public/static/plugs/ckeditor4/plugins/about/dialogs/about.js delete mode 100644 public/static/plugs/ckeditor4/plugins/about/dialogs/hidpi/logo_ckeditor.png delete mode 100644 public/static/plugs/ckeditor4/plugins/about/dialogs/logo_ckeditor.png delete mode 100644 public/static/plugs/ckeditor4/plugins/clipboard/dialogs/paste.js delete mode 100644 public/static/plugs/ckeditor4/plugins/colordialog/dialogs/colordialog.css delete mode 100644 public/static/plugs/ckeditor4/plugins/colordialog/dialogs/colordialog.js delete mode 100644 public/static/plugs/ckeditor4/plugins/copyformatting/cursors/cursor-disabled.svg delete mode 100644 public/static/plugs/ckeditor4/plugins/copyformatting/cursors/cursor.svg delete mode 100644 public/static/plugs/ckeditor4/plugins/copyformatting/styles/copyformatting.css delete mode 100644 public/static/plugs/ckeditor4/plugins/dialog/dialogDefinition.js delete mode 100644 public/static/plugs/ckeditor4/plugins/dialog/styles/dialog.css delete mode 100644 public/static/plugs/ckeditor4/plugins/div/dialogs/div.js delete mode 100644 public/static/plugs/ckeditor4/plugins/exportpdf/plugindefinition.js delete mode 100644 public/static/plugs/ckeditor4/plugins/find/dialogs/find.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/dialogs/button.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/dialogs/checkbox.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/dialogs/form.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/dialogs/hiddenfield.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/dialogs/radio.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/dialogs/select.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/dialogs/textarea.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/dialogs/textfield.js delete mode 100644 public/static/plugs/ckeditor4/plugins/forms/images/hiddenfield.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/icons.png delete mode 100644 public/static/plugs/ckeditor4/plugins/icons_hidpi.png delete mode 100644 public/static/plugs/ckeditor4/plugins/iframe/dialogs/iframe.js delete mode 100644 public/static/plugs/ckeditor4/plugins/iframe/images/placeholder.png delete mode 100644 public/static/plugs/ckeditor4/plugins/image/dialogs/image.js delete mode 100644 public/static/plugs/ckeditor4/plugins/image/images/noimage.png delete mode 100644 public/static/plugs/ckeditor4/plugins/lineheight/lang/en.js delete mode 100644 public/static/plugs/ckeditor4/plugins/lineheight/lang/zh-cn.js delete mode 100644 public/static/plugs/ckeditor4/plugins/lineheight/lang/zh.js delete mode 100644 public/static/plugs/ckeditor4/plugins/lineheight/plugin.js delete mode 100644 public/static/plugs/ckeditor4/plugins/link/dialogs/anchor.js delete mode 100644 public/static/plugs/ckeditor4/plugins/link/dialogs/link.js delete mode 100644 public/static/plugs/ckeditor4/plugins/link/images/anchor.png delete mode 100644 public/static/plugs/ckeditor4/plugins/link/images/hidpi/anchor.png delete mode 100644 public/static/plugs/ckeditor4/plugins/liststyle/dialogs/liststyle.js delete mode 100644 public/static/plugs/ckeditor4/plugins/magicline/images/hidpi/icon-rtl.png delete mode 100644 public/static/plugs/ckeditor4/plugins/magicline/images/hidpi/icon.png delete mode 100644 public/static/plugs/ckeditor4/plugins/magicline/images/icon-rtl.png delete mode 100644 public/static/plugs/ckeditor4/plugins/magicline/images/icon.png delete mode 100644 public/static/plugs/ckeditor4/plugins/pagebreak/images/pagebreak.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/pastefromgdocs/filter/default.js delete mode 100644 public/static/plugs/ckeditor4/plugins/pastefromlibreoffice/filter/default.js delete mode 100644 public/static/plugs/ckeditor4/plugins/pastefromword/filter/default.js delete mode 100644 public/static/plugs/ckeditor4/plugins/pastetools/filter/common.js delete mode 100644 public/static/plugs/ckeditor4/plugins/pastetools/filter/image.js delete mode 100644 public/static/plugs/ckeditor4/plugins/preview/images/pagebreak.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/preview/preview.html delete mode 100644 public/static/plugs/ckeditor4/plugins/preview/styles/screen.css delete mode 100644 public/static/plugs/ckeditor4/plugins/scayt/dialogs/dialog.css delete mode 100644 public/static/plugs/ckeditor4/plugins/scayt/dialogs/options.js delete mode 100644 public/static/plugs/ckeditor4/plugins/scayt/dialogs/toolbar.css delete mode 100644 public/static/plugs/ckeditor4/plugins/scayt/skins/moono-lisa/scayt.css delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_address.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_blockquote.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_div.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_h1.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_h2.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_h3.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_h4.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_h5.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_h6.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_p.png delete mode 100644 public/static/plugs/ckeditor4/plugins/showblocks/images/block_pre.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/dialogs/smiley.js delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/angel_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/angel_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/angry_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/angry_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/broken_heart.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/broken_heart.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/confused_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/confused_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/cry_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/cry_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/devil_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/devil_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/embaressed_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/embarrassed_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/embarrassed_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/envelope.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/envelope.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/heart.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/heart.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/kiss.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/kiss.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/lightbulb.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/lightbulb.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/omg_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/omg_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/regular_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/regular_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/sad_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/sad_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/shades_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/shades_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/teeth_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/teeth_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/thumbs_down.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/thumbs_down.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/thumbs_up.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/thumbs_up.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/tongue_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/tongue_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/tounge_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/whatchutalkingabout_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/whatchutalkingabout_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/wink_smile.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/smiley/images/wink_smile.png delete mode 100644 public/static/plugs/ckeditor4/plugins/specialchar/dialogs/lang/en.js delete mode 100644 public/static/plugs/ckeditor4/plugins/specialchar/dialogs/lang/zh-cn.js delete mode 100644 public/static/plugs/ckeditor4/plugins/specialchar/dialogs/lang/zh.js delete mode 100644 public/static/plugs/ckeditor4/plugins/specialchar/dialogs/specialchar.js delete mode 100644 public/static/plugs/ckeditor4/plugins/table/dialogs/table.js delete mode 100644 public/static/plugs/ckeditor4/plugins/tableselection/styles/tableselection.css delete mode 100644 public/static/plugs/ckeditor4/plugins/tabletools/dialogs/tableCell.js delete mode 100644 public/static/plugs/ckeditor4/plugins/templates/dialogs/templates.css delete mode 100644 public/static/plugs/ckeditor4/plugins/templates/dialogs/templates.js delete mode 100644 public/static/plugs/ckeditor4/plugins/templates/templatedefinition.js delete mode 100644 public/static/plugs/ckeditor4/plugins/templates/templates/default.js delete mode 100644 public/static/plugs/ckeditor4/plugins/templates/templates/images/template1.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/templates/templates/images/template2.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/templates/templates/images/template3.gif delete mode 100644 public/static/plugs/ckeditor4/plugins/widget/images/handle.png delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/dialogs/ciframe.html delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/dialogs/tmpFrameset.html delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/dialogs/wsc.css delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/dialogs/wsc.js delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/dialogs/wsc_ie.js delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/icons/hidpi/spellchecker.png delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/icons/spellchecker.png delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/lang/en.js delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/lang/zh-cn.js delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/lang/zh.js delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/plugin.js delete mode 100644 public/static/plugs/ckeditor4/plugins/wsc/skins/moono-lisa/wsc.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/dialog.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/dialog_ie.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/dialog_ie8.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/dialog_iequirks.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/editor.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/editor_gecko.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/editor_ie.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/editor_ie8.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/editor_iequirks.css delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/icons.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/icons_hidpi.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/arrow.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/close.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/hidpi/close.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/hidpi/lock-open.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/hidpi/lock.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/hidpi/refresh.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/lock-open.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/lock.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/refresh.png delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/images/spinner.gif delete mode 100644 public/static/plugs/ckeditor4/skins/moono-lisa/readme.md delete mode 100644 public/static/plugs/ckeditor4/styles.js delete mode 100644 public/static/plugs/ckeditor5/ckeditor.css delete mode 100644 public/static/plugs/ckeditor5/ckeditor.js delete mode 100644 public/static/plugs/ckeditor5/content.css delete mode 100644 public/static/plugs/ckeditor5/translations/af.js delete mode 100644 public/static/plugs/ckeditor5/translations/ar.js delete mode 100644 public/static/plugs/ckeditor5/translations/ast.js delete mode 100644 public/static/plugs/ckeditor5/translations/az.js delete mode 100644 public/static/plugs/ckeditor5/translations/bg.js delete mode 100644 public/static/plugs/ckeditor5/translations/bs.js delete mode 100644 public/static/plugs/ckeditor5/translations/ca.js delete mode 100644 public/static/plugs/ckeditor5/translations/cs.js delete mode 100644 public/static/plugs/ckeditor5/translations/da.js delete mode 100644 public/static/plugs/ckeditor5/translations/de-ch.js delete mode 100644 public/static/plugs/ckeditor5/translations/de.js delete mode 100644 public/static/plugs/ckeditor5/translations/el.js delete mode 100644 public/static/plugs/ckeditor5/translations/en-au.js delete mode 100644 public/static/plugs/ckeditor5/translations/en-gb.js delete mode 100644 public/static/plugs/ckeditor5/translations/en.js delete mode 100644 public/static/plugs/ckeditor5/translations/eo.js delete mode 100644 public/static/plugs/ckeditor5/translations/es.js delete mode 100644 public/static/plugs/ckeditor5/translations/et.js delete mode 100644 public/static/plugs/ckeditor5/translations/eu.js delete mode 100644 public/static/plugs/ckeditor5/translations/fa.js delete mode 100644 public/static/plugs/ckeditor5/translations/fi.js delete mode 100644 public/static/plugs/ckeditor5/translations/fr.js delete mode 100644 public/static/plugs/ckeditor5/translations/gl.js delete mode 100644 public/static/plugs/ckeditor5/translations/gu.js delete mode 100644 public/static/plugs/ckeditor5/translations/he.js delete mode 100644 public/static/plugs/ckeditor5/translations/hi.js delete mode 100644 public/static/plugs/ckeditor5/translations/hr.js delete mode 100644 public/static/plugs/ckeditor5/translations/hu.js delete mode 100644 public/static/plugs/ckeditor5/translations/id.js delete mode 100644 public/static/plugs/ckeditor5/translations/it.js delete mode 100644 public/static/plugs/ckeditor5/translations/ja.js delete mode 100644 public/static/plugs/ckeditor5/translations/jv.js delete mode 100644 public/static/plugs/ckeditor5/translations/kk.js delete mode 100644 public/static/plugs/ckeditor5/translations/km.js delete mode 100644 public/static/plugs/ckeditor5/translations/kn.js delete mode 100644 public/static/plugs/ckeditor5/translations/ko.js delete mode 100644 public/static/plugs/ckeditor5/translations/ku.js delete mode 100644 public/static/plugs/ckeditor5/translations/lt.js delete mode 100644 public/static/plugs/ckeditor5/translations/lv.js delete mode 100644 public/static/plugs/ckeditor5/translations/ms.js delete mode 100644 public/static/plugs/ckeditor5/translations/nb.js delete mode 100644 public/static/plugs/ckeditor5/translations/ne.js delete mode 100644 public/static/plugs/ckeditor5/translations/nl.js delete mode 100644 public/static/plugs/ckeditor5/translations/no.js delete mode 100644 public/static/plugs/ckeditor5/translations/oc.js delete mode 100644 public/static/plugs/ckeditor5/translations/pl.js delete mode 100644 public/static/plugs/ckeditor5/translations/pt-br.js delete mode 100644 public/static/plugs/ckeditor5/translations/pt.js delete mode 100644 public/static/plugs/ckeditor5/translations/ro.js delete mode 100644 public/static/plugs/ckeditor5/translations/ru.js delete mode 100644 public/static/plugs/ckeditor5/translations/si.js delete mode 100644 public/static/plugs/ckeditor5/translations/sk.js delete mode 100644 public/static/plugs/ckeditor5/translations/sl.js delete mode 100644 public/static/plugs/ckeditor5/translations/sq.js delete mode 100644 public/static/plugs/ckeditor5/translations/sr-latn.js delete mode 100644 public/static/plugs/ckeditor5/translations/sr.js delete mode 100644 public/static/plugs/ckeditor5/translations/sv.js delete mode 100644 public/static/plugs/ckeditor5/translations/th.js delete mode 100644 public/static/plugs/ckeditor5/translations/tk.js delete mode 100644 public/static/plugs/ckeditor5/translations/tr.js delete mode 100644 public/static/plugs/ckeditor5/translations/tt.js delete mode 100644 public/static/plugs/ckeditor5/translations/ug.js delete mode 100644 public/static/plugs/ckeditor5/translations/uk.js delete mode 100644 public/static/plugs/ckeditor5/translations/ur.js delete mode 100644 public/static/plugs/ckeditor5/translations/uz.js delete mode 100644 public/static/plugs/ckeditor5/translations/vi.js delete mode 100644 public/static/plugs/ckeditor5/translations/zh.js delete mode 100644 public/static/plugs/cropper/cropper.min.css delete mode 100644 public/static/plugs/cropper/cropper.min.js delete mode 100644 public/static/plugs/echarts/echarts.min.js delete mode 100644 public/static/plugs/jquery/area/area.php delete mode 100644 public/static/plugs/jquery/area/data.json delete mode 100644 public/static/plugs/jquery/autocompleter.css delete mode 100644 public/static/plugs/jquery/autocompleter.min.js delete mode 100644 public/static/plugs/jquery/base64.min.js delete mode 100644 public/static/plugs/jquery/compressor.min.js delete mode 100644 public/static/plugs/jquery/excel.xlsx.js delete mode 100644 public/static/plugs/jquery/filesaver.min.js delete mode 100644 public/static/plugs/jquery/jquery.min.js delete mode 100644 public/static/plugs/jquery/json.min.js delete mode 100644 public/static/plugs/jquery/jszip.min.js delete mode 100644 public/static/plugs/jquery/less.min.js delete mode 100644 public/static/plugs/jquery/marked.min.js delete mode 100644 public/static/plugs/jquery/masonry.min.js delete mode 100644 public/static/plugs/jquery/md5.min.js delete mode 100644 public/static/plugs/jquery/pace.min.js delete mode 100644 public/static/plugs/jquery/pcasunzips.js delete mode 100644 public/static/plugs/jquery/xlsx.min.js delete mode 100644 public/static/plugs/layui/css/layui.css delete mode 100644 public/static/plugs/layui/font/iconfont.eot delete mode 100644 public/static/plugs/layui/font/iconfont.svg delete mode 100644 public/static/plugs/layui/font/iconfont.ttf delete mode 100644 public/static/plugs/layui/font/iconfont.woff delete mode 100644 public/static/plugs/layui/font/iconfont.woff2 delete mode 100644 public/static/plugs/layui/layui.js delete mode 100644 public/static/plugs/layui_exts/excel.js delete mode 100644 public/static/plugs/layui_exts/layCascader.css delete mode 100644 public/static/plugs/layui_exts/layCascader.js delete mode 100644 public/static/plugs/layui_exts/tableSelect.js delete mode 100644 public/static/plugs/layui_exts/xmSelect.js delete mode 100644 public/static/plugs/notify/img/danger-outline.svg delete mode 100644 public/static/plugs/notify/img/danger.png delete mode 100644 public/static/plugs/notify/img/default-outline.svg delete mode 100644 public/static/plugs/notify/img/default.png delete mode 100644 public/static/plugs/notify/img/info-outline.svg delete mode 100644 public/static/plugs/notify/img/info.png delete mode 100644 public/static/plugs/notify/img/success-outline.svg delete mode 100644 public/static/plugs/notify/img/success.png delete mode 100644 public/static/plugs/notify/img/warning-outline.svg delete mode 100644 public/static/plugs/notify/img/warning.png delete mode 100644 public/static/plugs/notify/light.css delete mode 100644 public/static/plugs/notify/notify.min.js delete mode 100644 public/static/plugs/require/css.js delete mode 100644 public/static/plugs/require/require.js delete mode 100644 public/static/plugs/socket/swfobject.js delete mode 100644 public/static/plugs/socket/websocket.js delete mode 100644 public/static/plugs/socket/websocket.swf delete mode 100644 public/static/plugs/sortable/sortable.min.js delete mode 100644 public/static/plugs/sortable/vue.draggable.min.js delete mode 100644 public/static/plugs/supersized/progress.gif delete mode 100644 public/static/plugs/supersized/supersized.3.2.7.min.js delete mode 100644 public/static/plugs/supersized/supersized.css delete mode 100644 public/static/plugs/vue/vue.min.js delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/1_close.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/1_open.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/2.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/3.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/4.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/5.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/6.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/7.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/8.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/diy/9.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/line_conn.gif delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/loading.gif delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/zTreeStandard.gif delete mode 100644 public/static/plugs/ztree/zTreeStyle/img/zTreeStandard.png delete mode 100644 public/static/plugs/ztree/zTreeStyle/zTreeStyle.css delete mode 100644 public/static/plugs/ztree/ztree.all.min.js delete mode 100644 public/static/theme/css/_config.less delete mode 100644 public/static/theme/css/_custom.less delete mode 100644 public/static/theme/css/_display.less delete mode 100644 public/static/theme/css/_layout.less delete mode 100644 public/static/theme/css/_layout_1.less delete mode 100644 public/static/theme/css/_layout_1_black.less delete mode 100644 public/static/theme/css/_layout_1_blue.less delete mode 100644 public/static/theme/css/_layout_1_green.less delete mode 100644 public/static/theme/css/_layout_1_red.less delete mode 100644 public/static/theme/css/_layout_2.less delete mode 100644 public/static/theme/css/_layout_2_black.less delete mode 100644 public/static/theme/css/_layout_2_blue.less delete mode 100644 public/static/theme/css/_layout_2_green.less delete mode 100644 public/static/theme/css/_layout_2_red.less delete mode 100644 public/static/theme/css/_layout_white.less delete mode 100644 public/static/theme/css/console.css delete mode 100644 public/static/theme/css/console.css.map delete mode 100644 public/static/theme/css/console.less delete mode 100644 public/static/theme/css/icon/iconfont.ttf delete mode 100644 public/static/theme/css/icon/iconfont.woff delete mode 100644 public/static/theme/css/icon/iconfont.woff2 delete mode 100644 public/static/theme/css/iconfont.css delete mode 100644 public/static/theme/css/iconfont.css.map delete mode 100644 public/static/theme/css/iconfont.less delete mode 100644 public/static/theme/css/login.css delete mode 100644 public/static/theme/css/login.css.map delete mode 100644 public/static/theme/css/login.less delete mode 100644 public/static/theme/css/mobile.css delete mode 100644 public/static/theme/css/mobile.css.map delete mode 100644 public/static/theme/css/mobile.less delete mode 100644 public/static/theme/css/package.json delete mode 100644 public/static/theme/err/404.html delete mode 100644 public/static/theme/err/404/404.png delete mode 100644 public/static/theme/err/404/reset.css delete mode 100644 public/static/theme/err/404/style.css delete mode 100644 public/static/theme/err/500.html delete mode 100644 public/static/theme/err/500/style.css delete mode 100644 public/static/theme/img/404_icon.png delete mode 100644 public/static/theme/img/505_icon.png delete mode 100644 public/static/theme/img/headimg.png delete mode 100644 public/static/theme/img/image.png delete mode 100644 public/static/theme/img/login/bg1.jpg delete mode 100644 public/static/theme/img/login/bg2.jpg delete mode 100644 public/static/theme/img/upimg.png delete mode 100644 public/static/theme/img/upvideo.png delete mode 100644 public/static/theme/img/wechat/index.png delete mode 100644 public/static/theme/img/wechat/m-icon-error.png delete mode 100644 public/static/theme/img/wechat/m-icon-success.png delete mode 100644 public/static/theme/img/wechat/mobile_foot.png delete mode 100644 public/static/theme/img/wechat/mobile_head.png delete mode 100644 public/static/theme/img/wechat/qrc_pay_error.jpg delete mode 100644 public/static/theme/img/wechat/qrc_payed.jpg delete mode 100644 security.md delete mode 100755 think diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index fc8b10121..000000000 --- a/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -*.js linguist-language=php -*.css linguist-language=php -*.html linguist-language=php \ No newline at end of file diff --git a/app/admin/controller/Auth.php b/app/admin/controller/Auth.php deleted file mode 100644 index 2af89e42d..000000000 --- a/app/admin/controller/Auth.php +++ /dev/null @@ -1,124 +0,0 @@ -layTable(function () { - $this->title = '系统权限管理'; - }, function (QueryHelper $query) { - $query->dateBetween('create_at')->like('title,desc')->equal('status,utype'); - }); - } - - /** - * 添加系统权限 - * @auth true - */ - public function add() - { - SystemAuth::mForm('form'); - } - - /** - * 编辑系统权限 - * @auth true - */ - public function edit() - { - SystemAuth::mForm('form'); - } - - /** - * 修改权限状态 - * @auth true - */ - public function state() - { - SystemAuth::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除系统权限 - * @auth true - */ - public function remove() - { - SystemAuth::mDelete(); - } - - /** - * 权限配置节点 - * @auth true - * @throws \ReflectionException - */ - public function apply() - { - $map = $this->_vali(['auth.require#id' => '权限ID不能为空!']); - if (input('action') === 'get') { - if ($this->app->isDebug()) AdminService::clear(); - $nodes = SystemNode::mk()->where($map)->column('node'); - $this->success('获取权限节点成功!', AdminService::getTree($nodes)); - } elseif (input('action') === 'save') { - [$post, $data] = [$this->request->post(), []]; - foreach ($post['nodes'] ?? [] as $node) { - $data[] = ['auth' => $map['auth'], 'node' => $node]; - } - SystemNode::mk()->where($map)->delete(); - SystemNode::mk()->insertAll($data); - sysoplog('系统权限管理', "配置系统权限[{$map['auth']}]授权成功"); - $this->success('访问权限修改成功!', 'javascript:history.back()'); - } else { - SystemAuth::mForm('apply'); - } - } - - /** - * 表单后置数据处理 - * @param array $data - */ - protected function _apply_form_filter(array &$data) - { - if ($this->request->isGet()) { - $this->title = "编辑【{$data['title']}】授权"; - } - } -} diff --git a/app/admin/controller/Base.php b/app/admin/controller/Base.php deleted file mode 100644 index ef5ec317b..000000000 --- a/app/admin/controller/Base.php +++ /dev/null @@ -1,111 +0,0 @@ -layTable(function () { - $this->title = '数据字典管理'; - $this->types = SystemBase::types(); - $this->type = $this->get['type'] ?? ($this->types[0] ?? '-'); - }, function (QueryHelper $query) { - $query->where(['deleted' => 0])->equal('type'); - $query->like('code,name,status')->dateBetween('create_at'); - }); - } - - /** - * 添加数据字典 - * @auth true - */ - public function add() - { - SystemBase::mForm('form'); - } - - /** - * 编辑数据字典 - * @auth true - */ - public function edit() - { - SystemBase::mForm('form'); - } - - /** - * 表单数据处理 - * @param array $data - * @throws \think\db\exception\DbException - */ - protected function _form_filter(array &$data) - { - if ($this->request->isGet()) { - $this->types = SystemBase::types(); - $this->types[] = '--- 新增类型 ---'; - $this->type = $this->get['type'] ?? ($this->types[0] ?? '-'); - } else { - $map = []; - $map[] = ['deleted', '=', 0]; - $map[] = ['code', '=', $data['code']]; - $map[] = ['type', '=', $data['type']]; - $map[] = ['id', '<>', $data['id'] ?? 0]; - if (SystemBase::mk()->where($map)->count() > 0) { - $this->error("同类型的数据编码已经存在!"); - } - } - } - - /** - * 修改数据状态 - * @auth true - */ - public function state() - { - SystemBase::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除数据记录 - * @auth true - */ - public function remove() - { - SystemBase::mDelete(); - } -} \ No newline at end of file diff --git a/app/admin/controller/Config.php b/app/admin/controller/Config.php deleted file mode 100644 index d37a2a231..000000000 --- a/app/admin/controller/Config.php +++ /dev/null @@ -1,133 +0,0 @@ - '默认色0', - 'white' => '简约白0', - 'red-1' => '玫瑰红1', - 'blue-1' => '深空蓝1', - 'green-1' => '小草绿1', - 'black-1' => '经典黑1', - 'red-2' => '玫瑰红2', - 'blue-2' => '深空蓝2', - 'green-2' => '小草绿2', - 'black-2' => '经典黑2', - ]; - - /** - * 系统参数配置 - * @auth true - * @menu true - */ - public function index() - { - $this->title = '系统参数配置'; - $this->super = AdminService::isSuper(); - $this->version = ModuleService::getVersion(); - $this->fetch(); - } - - /** - * 修改系统参数 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function system() - { - $this->_applyFormToken(); - if ($this->request->isGet()) { - $this->title = '修改系统参数'; - $this->themes = static::themes; - $this->fetch(); - } else { - $post = $this->request->post(); - // 修改网站后台入口路径 - if (!empty($post['xpath'])) { - if (!preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $post['xpath'])) { - $this->error('后台入口名称需要是由英文字母开头!'); - } - if ($post['xpath'] !== 'admin' && file_exists($this->app->getBasePath() . $post['xpath'])) { - $this->error("后台入口名称{$post['xpath']}已经存在应用!"); - } - RuntimeService::set(null, [$post['xpath'] => 'admin']); - } - // 修改网站 ICON 图标,替换 public/favicon.ico - if (preg_match('#^https?://#', $post['site_icon'] ?? '')) try { - SystemService::setFavicon($post['site_icon'] ?? ''); - } catch (\Exception $exception) { - trace_file($exception); - } - // 数据数据到系统配置表 - foreach ($post as $k => $v) sysconf($k, $v); - sysoplog('系统配置管理', "修改系统参数成功"); - $this->success('修改系统参数成功!', admuri('admin/config/index')); - } - } - - /** - * 修改文件存储 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function storage() - { - $this->_applyFormToken(); - if ($this->request->isGet()) { - $this->type = input('type', 'local'); - if ($this->type === 'alioss') { - $this->points = AliossStorage::region(); - } elseif ($this->type === 'qiniu') { - $this->points = QiniuStorage::region(); - } elseif ($this->type === 'txcos') { - $this->points = TxcosStorage::region(); - } - $this->fetch("storage-{$this->type}"); - } else { - $post = $this->request->post(); - if (!empty($post['storage']['allow_exts'])) { - $deny = ['sh', 'asp', 'bat', 'cmd', 'exe', 'php']; - $exts = array_unique(str2arr(strtolower($post['storage']['allow_exts']))); - if (count(array_intersect($deny, $exts)) > 0) $this->error('禁止上传可执行的文件!'); - $post['storage']['allow_exts'] = join(',', $exts); - } - foreach ($post as $name => $value) sysconf($name, $value); - sysoplog('系统配置管理', "修改系统存储参数"); - $this->success('修改文件存储成功!'); - } - } -} \ No newline at end of file diff --git a/app/admin/controller/File.php b/app/admin/controller/File.php deleted file mode 100644 index 292f2d94e..000000000 --- a/app/admin/controller/File.php +++ /dev/null @@ -1,112 +0,0 @@ -types = Storage::types(); - } - - /** - * 系统文件管理 - * @auth true - * @menu true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function index() - { - SystemFile::mQuery()->layTable(function () { - $this->title = '系统文件管理'; - $this->xexts = SystemFile::mk()->distinct()->column('xext'); - }, function (QueryHelper $query) { - $query->like('name,hash,xext')->equal('type')->dateBetween('create_at'); - $query->where(['issafe' => 0, 'status' => 2, 'uuid' => AdminService::getUserId()]); - }); - } - - /** - * 数据列表处理 - * @param array $data - * @return void - */ - protected function _page_filter(array &$data) - { - foreach ($data as &$vo) { - $vo['ctype'] = $this->types[$vo['type']] ?? $vo['type']; - } - } - - /** - * 编辑系统文件 - * @auth true - * @return void - */ - public function edit() - { - SystemFile::mForm('form'); - } - - /** - * 删除系统文件 - * @auth true - * @return void - */ - public function remove() - { - SystemFile::mDelete(); - } - - /** - * 清理重复文件 - * @auth true - * @return void - */ - public function distinct() - { - $map = ['uuid' => AdminService::getUserId()]; - $db1 = SystemFile::mk()->fieldRaw('max(id) id')->where($map)->group('type,xkey'); - $db2 = $this->app->db->table($db1->buildSql())->alias('dt')->field('id'); - SystemFile::mk()->whereRaw("id not in {$db2->buildSql()}")->delete(); - SystemFile::mk()->where($map)->where(['status' => 1])->delete(); - $this->success('清理重复文件成功!'); - } -} \ No newline at end of file diff --git a/app/admin/controller/Index.php b/app/admin/controller/Index.php deleted file mode 100644 index c57820c49..000000000 --- a/app/admin/controller/Index.php +++ /dev/null @@ -1,155 +0,0 @@ -app->isDebug()); - /*! 读取当前用户权限菜单树 */ - $this->menus = MenuService::getTree(); - /*! 判断当前用户的登录状态 */ - $this->login = AdminService::isLogin(); - /*! 菜单为空且未登录跳转到登录页 */ - if (empty($this->menus) && empty($this->login)) { - $this->redirect(sysuri('admin/login/index')); - } else { - $this->title = '系统管理后台'; - $this->super = AdminService::isSuper(); - $this->theme = AdminService::getUserTheme(); - $this->fetch(); - } - } - - /** - * 后台主题切换 - * @login true - * @return void - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function theme() - { - if ($this->request->isGet()) { - $this->theme = AdminService::getUserTheme(); - $this->themes = Config::themes; - $this->fetch(); - } else { - $data = $this->_vali(['site_theme.require' => '主题名称不能为空!']); - if (AdminService::setUserTheme($data['site_theme'])) { - $this->success('主题配置保存成功!'); - } else { - $this->error('主题配置保存失败!'); - } - } - } - - /** - * 修改用户资料 - * @login true - * @param mixed $id 用户ID - */ - public function info($id = 0) - { - $this->_applyFormToken(); - if (AdminService::getUserId() === intval($id)) { - SystemUser::mForm('admin@user/form', 'id', [], ['id' => $id]); - } else { - $this->error('只能修改自己的资料!'); - } - } - - /** - * 资料修改表单处理 - * @param array $data - */ - protected function _info_form_filter(array &$data) - { - if ($this->request->isPost()) { - unset($data['username'], $data['authorize']); - } - } - - /** - * 资料修改结果处理 - * @param bool $status - */ - protected function _info_form_result(bool $status) - { - if ($status) { - $this->success('用户资料修改成功!', 'javascript:location.reload()'); - } - } - - /** - * 修改当前用户密码 - * @login true - * @param mixed $id - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function pass($id = 0) - { - $this->_applyFormToken(); - if (AdminService::getUserId() !== intval($id)) { - $this->error('只能修改当前用户的密码!'); - } - if ($this->app->request->isGet()) { - $this->verify = true; - SystemUser::mForm('admin@user/pass', 'id', [], ['id' => $id]); - } else { - $data = $this->_vali([ - 'password.require' => '登录密码不能为空!', - 'repassword.require' => '重复密码不能为空!', - 'oldpassword.require' => '旧的密码不能为空!', - 'password.confirm:repassword' => '两次输入的密码不一致!', - ]); - $user = SystemUser::mk()->find($id); - if (empty($user)) $this->error('用户不存在!'); - if (md5($data['oldpassword']) !== $user['password']) { - $this->error('旧密码验证失败,请重新输入!'); - } - if ($user->save(['password' => md5($data['password'])])) { - sysoplog('系统用户管理', "修改用户[{$user['id']}]密码成功"); - $this->success('密码修改成功,下次请使用新密码登录!', ''); - } else { - $this->error('密码修改失败,请稍候再试!'); - } - } - } -} diff --git a/app/admin/controller/Login.php b/app/admin/controller/Login.php deleted file mode 100644 index 9b5b1576f..000000000 --- a/app/admin/controller/Login.php +++ /dev/null @@ -1,136 +0,0 @@ -app->request->isGet()) { - if (AdminService::isLogin()) { - $this->redirect(sysuri('admin/index/index')); - } else { - // 当前运行模式 - $this->developMode = RuntimeService::check(); - // 后台背景处理 - $images = str2arr(sysconf('login_image') ?: '', '|'); - if (empty($images)) $images = [ - SystemService::uri('/static/theme/img/login/bg1.jpg'), - SystemService::uri('/static/theme/img/login/bg2.jpg'), - ]; - $this->loginStyle = sprintf('style="background-image:url(%s)" data-bg-transition="%s"', $images[0], join(',', $images)); - // 登录验证令牌 - $this->captchaType = 'LoginCaptcha'; - $this->captchaToken = CodeExtend::uniqidDate(18); - if (!$this->app->session->get('LoginInputSessionError')) { - $this->app->session->set($this->captchaType, $this->captchaToken); - } - // 更新后台域名 - if ($this->request->domain(true) !== sysconf('base.site_host')) { - sysconf('base.site_host', $this->request->domain(true)); - } - // 加载登录模板 - $this->title = '系统登录'; - $this->fetch(); - } - } else { - $data = $this->_vali([ - 'username.require' => '登录账号不能为空!', - 'username.min:4' => '登录账号不能少于4位字符!', - 'password.require' => '登录密码不能为空!', - 'password.min:4' => '登录密码不能少于4位字符!', - 'verify.require' => '图形验证码不能为空!', - 'uniqid.require' => '图形验证标识不能为空!', - ]); - if (!CaptchaService::instance()->check($data['verify'], $data['uniqid'])) { - $this->error('图形验证码验证失败,请重新输入!'); - } - /*! 用户信息验证 */ - $map = ['username' => $data['username'], 'is_deleted' => 0]; - $user = SystemUser::mk()->where($map)->findOrEmpty(); - if ($user->isEmpty()) { - $this->app->session->set('LoginInputSessionError', true); - $this->error('登录账号或密码错误,请重新输入!'); - } - if (empty($user['status'])) { - $this->app->session->set('LoginInputSessionError', true); - $this->error('账号已经被禁用,请联系管理员!'); - } - if (md5("{$user['password']}{$data['uniqid']}") !== $data['password']) { - $this->app->session->set('LoginInputSessionError', true); - $this->error('登录账号或密码错误,请重新输入!'); - } - $this->app->session->set('user', $user->toArray()); - $this->app->session->delete('LoginInputSessionError'); - $user->inc('login_num')->update([ - 'login_at' => date('Y-m-d H:i:s'), - 'login_ip' => $this->app->request->ip(), - ]); - // 刷新用户权限 - AdminService::apply(true); - sysoplog('系统用户登录', '登录系统后台成功'); - $this->success('登录成功', sysuri('admin/index/index')); - } - } - - /** - * 生成验证码 - */ - public function captcha() - { - $input = $this->_vali([ - 'type.require' => '验证码类型不能为空!', - 'token.require' => '验证码标识不能为空!', - ]); - $image = CaptchaService::instance()->initialize(); - $captcha = ['image' => $image->getData(), 'uniqid' => $image->getUniqid()]; - if ($this->app->session->get($input['type']) === $input['token']) { - $captcha['code'] = $image->getCode(); - $this->app->session->delete($input['type']); - } - $this->success('生成验证码成功', $captcha); - } - - /** - * 退出登录 - */ - public function out() - { - $this->app->session->destroy(); - $this->success('退出登录成功!', sysuri('admin/login/index')); - } -} diff --git a/app/admin/controller/Menu.php b/app/admin/controller/Menu.php deleted file mode 100644 index c3a692179..000000000 --- a/app/admin/controller/Menu.php +++ /dev/null @@ -1,146 +0,0 @@ -title = '系统菜单管理'; - $this->type = $this->get['type'] ?? 'index'; - SystemMenu::mQuery()->layTable(); - } - - /** - * 列表数据处理 - * @param array $data - */ - protected function _index_page_filter(array &$data) - { - $data = DataExtend::arr2tree($data); - // 回收站过滤有效菜单 - if ($this->type === 'recycle') foreach ($data as $k1 => &$p1) { - if (!empty($p1['sub'])) foreach ($p1['sub'] as $k2 => &$p2) { - if (!empty($p2['sub'])) foreach ($p2['sub'] as $k3 => $p3) { - if ($p3['status'] > 0) unset($p2['sub'][$k3]); - } - if (empty($p2['sub']) && ($p2['url'] === '#' or $p2['status'] > 0)) unset($p1['sub'][$k2]); - } - if (empty($p1['sub']) && ($p1['url'] === '#' or $p1['status'] > 0)) unset($data[$k1]); - } - // 菜单数据树数据变平化 - $data = DataExtend::arr2table($data); - foreach ($data as &$vo) { - if ($vo['url'] !== '#' && !preg_match('/^(https?:)?(\/\/|\\\\)/i', $vo['url'])) { - $vo['url'] = trim(url($vo['url']) . ($vo['params'] ? "?{$vo['params']}" : ''), '\\/'); - } - } - } - - /** - * 添加系统菜单 - * @auth true - */ - public function add() - { - $this->_applyFormToken(); - SystemMenu::mForm('form'); - } - - /** - * 编辑系统菜单 - * @auth true - */ - public function edit() - { - $this->_applyFormToken(); - SystemMenu::mForm('form'); - } - - /** - * 表单数据处理 - * @param array $vo - * @throws \ReflectionException - */ - protected function _form_filter(array &$vo) - { - if ($this->request->isGet()) { - $debug = $this->app->isDebug(); - /* 清理权限节点 */ - $debug && AdminService::clear(); - /* 读取系统功能节点 */ - $this->auths = []; - $this->nodes = MenuService::getList($debug); - foreach (NodeService::getMethods($debug) as $node => $item) { - if ($item['isauth'] && substr_count($node, '/') >= 2) { - $this->auths[] = ['node' => $node, 'title' => $item['title']]; - } - } - /* 选择自己上级菜单 */ - $vo['pid'] = $vo['pid'] ?? input('pid', '0'); - /* 列出可选上级菜单 */ - $menus = SystemMenu::mk()->order('sort desc,id asc')->column('id,pid,icon,url,node,title,params', 'id'); - $this->menus = DataExtend::arr2table(array_merge($menus, [['id' => '0', 'pid' => '-1', 'url' => '#', 'title' => '顶部菜单']])); - if (isset($vo['id'])) foreach ($this->menus as $menu) if ($menu['id'] === $vo['id']) $vo = $menu; - foreach ($this->menus as $key => $menu) if ($menu['spt'] >= 3 || $menu['url'] !== '#') unset($this->menus[$key]); - if (isset($vo['spt']) && isset($vo['spc']) && in_array($vo['spt'], [1, 2]) && $vo['spc'] > 0) { - foreach ($this->menus as $key => $menu) if ($vo['spt'] <= $menu['spt']) unset($this->menus[$key]); - } - } - } - - /** - * 修改菜单状态 - * @auth true - */ - public function state() - { - SystemMenu::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除系统菜单 - * @auth true - */ - public function remove() - { - SystemMenu::mDelete(); - } -} diff --git a/app/admin/controller/Module.php b/app/admin/controller/Module.php deleted file mode 100644 index 81f3ac506..000000000 --- a/app/admin/controller/Module.php +++ /dev/null @@ -1,73 +0,0 @@ -title = '系统模块管理'; - $this->modules = ModuleService::change(); - $this->fetch(); - } - - /** - * 安装更新模块 - * @auth true - */ - public function install() - { - $data = $this->_vali(['name.require' => '模块名称不能为空!']); - [$state, $message] = ModuleService::install($data['name']); - $state ? $this->success($message) : $this->error($message); - } - - /** - * 查看模块更新 - * @auth true - */ - public function change() - { - $data = $this->_vali(['name.require' => '模块名称不能为空!']); - [$online, $locals] = [ModuleService::online(), ModuleService::getModules()]; - if (isset($online[$data['name']])) { - $this->module = $online[$data['name']]; - $this->current = $locals[$data['name']] ?? []; - $pattern = "|^(\d{4})\.(\d{2})\.(\d{2})\.(\d+)$|"; - $this->module['change'] = array_reverse($this->module['change']); - foreach ($this->module['change'] as $version => &$change) { - $change = ['content' => $change, 'version' => preg_replace($pattern, '$1年$2月$3日 更新', $version)]; - } - $this->fetch(); - } else { - $this->error('未查询到模块更新记录!'); - } - } -} \ No newline at end of file diff --git a/app/admin/controller/Oplog.php b/app/admin/controller/Oplog.php deleted file mode 100644 index 39b8bf174..000000000 --- a/app/admin/controller/Oplog.php +++ /dev/null @@ -1,94 +0,0 @@ -layTable(function () { - $this->title = '系统日志管理'; - $columns = SystemOplog::mk()->column('action,username', 'id'); - $this->users = array_unique(array_column($columns, 'username')); - $this->actions = array_unique(array_column($columns, 'action')); - }, function (QueryHelper $query) { - $query->dateBetween('create_at')->equal('username,action')->like('content,geoip,node'); - }); - } - - /** - * 列表数据处理 - * @auth true - * @param array $data - * @throws \Exception - */ - protected function _index_page_filter(array &$data) - { - $region = new Ip2Region(); - foreach ($data as &$vo) { - $isp = $region->btreeSearch($vo['geoip']); - $vo['geoisp'] = str_replace(['内网IP', '0', '|'], '', $isp['region'] ?? '') ?: '-'; - } - } - - /** - * 清理系统日志 - * @auth true - */ - public function clear() - { - try { - SystemOplog::mQuery()->empty(); - sysoplog('系统运维管理', '成功清理所有日志'); - $this->success('日志清理成功!'); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (Exception $exception) { - trace_file($exception); - $this->error("日志清理失败,{$exception->getMessage()}"); - } - } - - /** - * 删除系统日志 - * @auth true - */ - public function remove() - { - SystemOplog::mDelete(); - } -} diff --git a/app/admin/controller/Queue.php b/app/admin/controller/Queue.php deleted file mode 100644 index cc370e95f..000000000 --- a/app/admin/controller/Queue.php +++ /dev/null @@ -1,116 +0,0 @@ -layTable(function () { - $this->title = '系统任务管理'; - $this->iswin = ProcessService::iswin(); - if ($this->super = AdminService::isSuper()) { - $this->command = ProcessService::think('xadmin:queue start'); - if (!$this->iswin && !empty($_SERVER['USER'])) { - $this->command = "sudo -u {$_SERVER['USER']} {$this->command}"; - } - } - }, function (QueryHelper $query) { - $query->equal('status')->like('code|title#title,command'); - $query->timeBetween('enter_time,exec_time')->dateBetween('create_at'); - }); - } - - /** - * 分页数据回调处理 - * @param array $data - * @param array $result - * @return void - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _index_page_filter(array $data, array &$result) - { - $result['extra'] = ['dos' => 0, 'pre' => 0, 'oks' => 0, 'ers' => 0]; - SystemQueue::mk()->field('status,count(1) count')->group('status')->select()->map(function ($item) use (&$result) { - if ($item['status'] === 1) $result['extra']['pre'] = $item['count']; - if ($item['status'] === 2) $result['extra']['dos'] = $item['count']; - if ($item['status'] === 3) $result['extra']['oks'] = $item['count']; - if ($item['status'] === 4) $result['extra']['ers'] = $item['count']; - }); - } - - /** - * 重启系统任务 - * @auth true - */ - public function redo() - { - try { - $data = $this->_vali(['code.require' => '任务编号不能为空!']); - $queue = QueueService::instance()->initialize($data['code'])->reset(); - $queue->progress(1, '>>> 任务重置成功 <<<', 0.00); - $this->success('任务重置成功!', $queue->code); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } - - /** - * 清理运行数据 - * @auth true - */ - public function clean() - { - $this->_queue('定时清理系统运行数据', "xadmin:queue clean", 0, [], 0, 3600); - } - - /** - * 删除系统任务 - * @auth true - */ - public function remove() - { - SystemQueue::mDelete(); - } -} diff --git a/app/admin/controller/User.php b/app/admin/controller/User.php deleted file mode 100644 index bc6446044..000000000 --- a/app/admin/controller/User.php +++ /dev/null @@ -1,179 +0,0 @@ -type = $this->get['type'] ?? 'index'; - // 创建快捷查询工具 - SystemUser::mQuery()->layTable(function () { - $this->title = '系统用户管理'; - $this->bases = SystemBase::items('身份权限'); - }, function (QueryHelper $query) { - - // 加载对应数据列表 - $query->where(['is_deleted' => 0, 'status' => intval($this->type === 'index')]); - - // 关联用户身份资料 - $query->with(['userinfo' => function (Relation $relation) { - $relation->field('code,name,content'); - }]); - - // 数据列表搜索过滤 - $query->equal('status,usertype')->dateBetween('login_at,create_at'); - $query->like('username|nickname#username,contact_phone#phone,contact_mail#mail'); - }); - } - - /** - * 添加系统用户 - * @auth true - */ - public function add() - { - SystemUser::mForm('form'); - } - - /** - * 编辑系统用户 - * @auth true - */ - public function edit() - { - SystemUser::mForm('form'); - } - - /** - * 修改用户密码 - * @auth true - */ - public function pass() - { - $this->_applyFormToken(); - if ($this->request->isGet()) { - $this->verify = false; - SystemUser::mForm('pass'); - } else { - $data = $this->_vali([ - 'id.require' => '用户ID不能为空!', - 'password.require' => '登录密码不能为空!', - 'repassword.require' => '重复密码不能为空!', - 'repassword.confirm:password' => '两次输入的密码不一致!', - ]); - $user = SystemUser::mk()->findOrEmpty($data['id']); - if ($user->isExists() && $user->save(['password' => md5($data['password'])])) { - sysoplog('系统用户管理', "修改用户[{$data['id']}]密码成功"); - $this->success('密码修改成功,请使用新密码登录!', ''); - } else { - $this->error('密码修改失败,请稍候再试!'); - } - } - } - - /** - * 表单数据处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _form_filter(array &$data) - { - if ($this->request->isPost()) { - // 账号权限绑定处理 - $data['authorize'] = arr2str($data['authorize'] ?? []); - if (isset($data['id']) && $data['id'] > 0) { - unset($data['username']); - } else { - // 检查账号是否重复 - if (empty($data['username'])) { - $this->error('登录账号不能为空!'); - } - $map = ['username' => $data['username'], 'is_deleted' => 0]; - if (SystemUser::mk()->where($map)->count() > 0) { - $this->error("账号已经存在,请使用其它账号!"); - } - // 新添加的用户密码与账号相同 - $data['password'] = md5($data['username']); - } - } else { - // 权限绑定处理 - $data['authorize'] = str2arr($data['authorize'] ?? ''); - // 用户身份数据 - $this->bases = SystemBase::items('身份权限'); - // 用户权限管理 - $this->superName = AdminService::getSuperName(); - $this->authorizes = SystemAuth::items(); - } - } - - /** - * 修改用户状态 - * @auth true - */ - public function state() - { - $this->_checkInput(); - SystemUser::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除系统用户 - * @auth true - */ - public function remove() - { - $this->_checkInput(); - SystemUser::mDelete(); - } - - /** - * 检查输入变量 - */ - private function _checkInput() - { - if (in_array('10000', str2arr(input('id', '')))) { - $this->error('系统超级账号禁止删除!'); - } - } -} diff --git a/app/admin/controller/api/Plugs.php b/app/admin/controller/api/Plugs.php deleted file mode 100644 index 2a448361f..000000000 --- a/app/admin/controller/api/Plugs.php +++ /dev/null @@ -1,70 +0,0 @@ -title = '图标选择器'; - $this->field = $this->app->request->get('field', 'icon'); - $this->fetch(realpath(__DIR__ . '/../../view/api/icon.html')); - } - - /** - * 前端脚本变量 - * @return \think\Response - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function script(): \think\Response - { - return response(join("\r\n", [ - sprintf("window.taDebug = %s;", $this->app->isDebug() ? 'true' : 'false'), - sprintf("window.taAdmin = '%s';", sysuri('admin/index/index', [], false)), - sprintf("window.taEditor = '%s';", sysconf('base.editor') ?: 'ckeditor4'), - ]))->contentType('application/x-javascript'); - } - - /** - * 优化数据库 - * @login true - */ - public function optimize() - { - if (AdminService::isSuper()) { - sysoplog('系统运维管理', '创建数据库优化任务'); - $this->_queue('优化数据库所有数据表', 'xadmin:database optimize'); - } else { - $this->error('只有超级管理员才能操作!'); - } - } -} \ No newline at end of file diff --git a/app/admin/controller/api/Queue.php b/app/admin/controller/api/Queue.php deleted file mode 100644 index de24a2ca2..000000000 --- a/app/admin/controller/api/Queue.php +++ /dev/null @@ -1,111 +0,0 @@ -app->console->call('xadmin:queue', ['stop'])->fetch(); - if (stripos($message, 'sent end signal to process')) { - sysoplog('系统运维管理', '尝试停止后台服务主进程'); - $this->success('停止后台服务主进程成功!'); - } elseif (stripos($message, 'processes to stop')) { - $this->success('没有找到需要停止的进程!'); - } else { - $this->error(nl2br($message)); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } - - /** - * WIN创建监听进程 - * @login true - */ - public function start() - { - try { - $message = $this->app->console->call('xadmin:queue', ['start'])->fetch(); - if (stripos($message, 'daemons started successfully for pid')) { - sysoplog('系统运维管理', '尝试启动后台服务主进程'); - $this->success('后台服务主进程启动成功!'); - } elseif (stripos($message, 'daemons already exist for pid')) { - $this->success('后台服务主进程已经存在!'); - } else { - $this->error(nl2br($message)); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } - - /** - * 检查任务状态 - * @login true - */ - public function status() - { - if (AdminService::isSuper()) try { - $message = $this->app->console->call('xadmin:queue', ['status'])->fetch(); - if (preg_match('/process.*?\d+.*?running/', $message)) { - echo "已启动"; - } else { - echo "未启动"; - } - } catch (Exception $exception) { - echo "异 常"; - } else { - echo "无权限"; - } - } - - /** - * 任务进度查询 - * @login true - * @throws \think\admin\Exception - */ - public function progress() - { - $input = $this->_vali(['code.require' => '任务编号不能为空!']); - $queue = QueueService::instance()->initialize($input['code']); - $this->success('获取任务进度成功!', $queue->progress()); - } -} \ No newline at end of file diff --git a/app/admin/controller/api/System.php b/app/admin/controller/api/System.php deleted file mode 100644 index 0cae88845..000000000 --- a/app/admin/controller/api/System.php +++ /dev/null @@ -1,138 +0,0 @@ -success('网站缓存加速成功!', 'javascript:location.reload()'); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } else { - $this->error('只有超级管理员才能操作!'); - } - } - - /** - * 清理运行缓存 - * @login true - */ - public function clear() - { - if (AdminService::isSuper()) try { - RuntimeService::clear() && sysoplog('系统运维管理', '清理网站日志缓存'); - $this->success('清空日志缓存成功!', 'javascript:location.reload()'); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } else { - $this->error('只有超级管理员才能操作!'); - } - } - - /** - * 当前运行模式 - * @login true - */ - public function debug() - { - if (AdminService::isSuper()) if (input('state')) { - RuntimeService::set('product'); - sysoplog('系统运维管理', '开发模式切换为生产模式'); - $this->success('已切换为生产模式!', 'javascript:location.reload()'); - } else { - RuntimeService::set('debug'); - sysoplog('系统运维管理', '生产模式切换为开发模式'); - $this->success('已切换为开发模式!', 'javascript:location.reload()'); - } else { - $this->error('只有超级管理员才能操作!'); - } - } - - /** - * 修改富文本编辑器 - * @return void - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function editor() - { - if (AdminService::isSuper()) { - $editor = input('editor', 'auto'); - sysconf('base.editor', $editor); - sysoplog('系统运维管理', "切换编辑器为{$editor}"); - $this->success('已切换后台编辑器!', 'javascript:location.reload()'); - } else { - $this->error('只有超级管理员才能操作!'); - } - } - - /** - * 清理系统配置 - * @login true - */ - public function config() - { - if (AdminService::isSuper()) try { - [$tmpdata, $newdata] = [[], []]; - foreach (SystemConfig::mk()->order('type,name asc')->cursor() as $item) { - $tmpdata[$item['type']][$item['name']] = $item['value']; - } - foreach ($tmpdata as $type => $items) foreach ($items as $name => $value) { - $newdata[] = ['type' => $type, 'name' => $name, 'value' => $value]; - } - $this->app->db->transaction(function () use ($newdata) { - SystemConfig::mQuery()->empty()->insertAll($newdata); - }); - $this->app->cache->delete('SystemConfig'); - sysoplog('系统运维管理', '清理系统配置参数'); - $this->success('清理系统配置成功!', 'javascript:location.reload()'); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } else { - $this->error('只有超级管理员才能操作!'); - } - } -} \ No newline at end of file diff --git a/app/admin/controller/api/Update.php b/app/admin/controller/api/Update.php deleted file mode 100644 index 88e44e135..000000000 --- a/app/admin/controller/api/Update.php +++ /dev/null @@ -1,77 +0,0 @@ -error('只允许访问本地或官方代码!'); - } - } - - /** - * 读取文件内容 - */ - public function get() - { - $filename = decode(input('encode', '0')); - if (!ModuleService::checkAllowDownload($filename)) { - $this->error('下载的文件不在认证规则中!'); - } - if (file_exists($realname = with_path($filename))) { - $this->success('读取文件内容成功!', [ - 'content' => base64_encode(file_get_contents($realname)), - ]); - } else { - $this->error('读取文件内容失败!'); - } - } - - /** - * 读取文件列表 - */ - public function node() - { - $this->success('获取文件列表成功!', ModuleService::getChanges( - json_decode($this->request->post('rules', '[]', ''), true), - json_decode($this->request->post('ignore', '[]', ''), true) - )); - } - - /** - * 获取模块信息 - */ - public function version() - { - $this->success('获取模块信息成功!', ModuleService::getModules()); - } -} \ No newline at end of file diff --git a/app/admin/controller/api/Upload.php b/app/admin/controller/api/Upload.php deleted file mode 100644 index 16d00be71..000000000 --- a/app/admin/controller/api/Upload.php +++ /dev/null @@ -1,328 +0,0 @@ - []]; - foreach (str2arr(sysconf('storage.allow_exts')) as $ext) { - $data['exts'][$ext] = Storage::mime($ext); - } - $template = realpath(__DIR__ . '/../../view/api/upload.js'); - $data['exts'] = json_encode($data['exts'], JSON_UNESCAPED_UNICODE); - $data['nameType'] = sysconf('storage.name_type') ?: 'xmd5'; - return view($template, $data)->contentType('application/x-javascript'); - } - - /** - * 文件上传检查 - * @login true - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function state() - { - [$name, $safe] = [input('name'), $this->getSafe()]; - $data = ['uptype' => $this->getType(), 'safe' => intval($safe), 'key' => input('key')]; - $file = SystemFile::mk()->data($this->_vali([ - 'xkey.value' => $data['key'], - 'type.value' => $this->getType(), - 'uuid.value' => AdminService::getUserId(), - 'name.require' => '名称不能为空!', - 'hash.require' => '哈希不能为空!', - 'xext.require' => '后缀不能为空!', - 'size.require' => '大小不能为空!', - 'mime.default' => '', - 'status.value' => 1, - ])); - if (empty($file['mime'])) $file['mime'] = Storage::mime($file['xext']); - $info = Storage::instance($data['uptype'])->info($data['key'], $safe, $name); - if (is_array($info) && isset($info['url']) && isset($info['key'])) { - $file->save(['xurl' => $info['url'], 'isfast' => 1, 'issafe' => $data['safe']]); - $extr = ['id' => $file->id ?? 0, 'url' => $info['url'], 'key' => $info['key']]; - $this->success('文件已经上传', array_merge($data, $extr), 200); - } elseif ('local' === $data['uptype']) { - $data['url'] = LocalStorage::instance()->url($data['key'], $safe, $name); - $data['server'] = LocalStorage::instance()->upload(); - } elseif ('qiniu' === $data['uptype']) { - $data['url'] = QiniuStorage::instance()->url($data['key'], $safe, $name); - $data['token'] = QiniuStorage::instance()->buildUploadToken($data['key'], 3600, $name); - $data['server'] = QiniuStorage::instance()->upload(); - } elseif ('alioss' === $data['uptype']) { - $token = AliossStorage::instance()->buildUploadToken($data['key'], 3600, $name); - $data['url'] = $token['siteurl']; - $data['policy'] = $token['policy']; - $data['signature'] = $token['signature']; - $data['OSSAccessKeyId'] = $token['keyid']; - $data['server'] = AliossStorage::instance()->upload(); - } elseif ('txcos' === $data['uptype']) { - $token = TxcosStorage::instance()->buildUploadToken($data['key'], 3600, $name); - $data['url'] = $token['siteurl']; - $data['q-ak'] = $token['q-ak']; - $data['policy'] = $token['policy']; - $data['q-key-time'] = $token['q-key-time']; - $data['q-signature'] = $token['q-signature']; - $data['q-sign-algorithm'] = $token['q-sign-algorithm']; - $data['server'] = TxcosStorage::instance()->upload(); - } elseif ('upyun' === $data['uptype']) { - $token = UpyunStorage::instance()->buildUploadToken($data['key'], 3600, $name, input('size'), input('hash')); - $data['url'] = $token['siteurl']; - $data['policy'] = $token['policy']; - $data['authorization'] = $token['authorization']; - $data['server'] = UpyunStorage::instance()->upload(); - } - $file->save(['xurl' => $data['url'], 'isfast' => 0, 'issafe' => $data['safe']]); - $this->success('获取上传授权参数', array_merge($data, ['id' => $file->id ?? 0]), 404); - } - - /** - * 更新文件状态 - * @login true - * @return void - */ - public function done() - { - $data = $this->_vali([ - 'id.require' => '编号不能为空!', - 'hash.require' => '哈希不能为空!', - 'uuid.value' => AdminService::getUserId(), - ]); - $file = SystemFile::mk()->where($data)->findOrEmpty(); - if ($file->isEmpty()) $this->error('文件不存在!'); - if ($file->save(['status' => 2])) { - $this->success('更新成功!'); - } else { - $this->error('更新失败!'); - } - } - - /** - * 文件选择器 - * @login true - * @return void - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function image() - { - SystemFile::mQuery()->layTable(function () { - $this->title = '文件选择器'; - }, function (QueryHelper $query) { - $query->where(['status' => 2, 'issafe' => 0, 'uuid' => AdminService::getUserId()]); - $query->like('name,hash')->in('xext#type')->dateBetween('create_at')->order('id desc'); - }); - } - - /** - * 视频选择器 - * @login true - * @return void - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function video() - { - SystemFile::mQuery()->layTable(function () { - $this->title = '文件选择器'; - }, function (QueryHelper $query) { - $query->like('name,hash')->dateBetween('create_at')->order('id desc'); - $query->where(['status' => 2, 'issafe' => 0, 'uuid' => AdminService::getUserId()]); - }); - } - - /** - * 文档选择器 - * @login true - * @return void - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function document() - { - SystemFile::mQuery()->layTable(function () { - $this->title = '文件选择器'; - }, function (QueryHelper $query) { - $query->like('name,hash')->dateBetween('create_at')->order('id desc'); - $query->where(['status' => 2, 'issafe' => 0, 'uuid' => AdminService::getUserId()]); - }); - } - - /** - * 文件上传入口 - * @login true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function file() - { - if (!($file = $this->getFile())->isValid()) { - $this->error('文件上传异常,文件过大或未上传!'); - } - $safeMode = $this->getSafe(); - $extension = strtolower($file->getOriginalExtension()); - $saveName = input('key') ?: Storage::name($file->getPathname(), $extension, '', 'md5_file'); - // 检查文件名称是否合法 - if (strpos($saveName, '../') !== false) { - $this->error('文件路径不能出现跳级操作!'); - } - // 检查文件后缀是否被恶意修改 - if (strtolower(pathinfo(parse_url($saveName, PHP_URL_PATH), PATHINFO_EXTENSION)) !== $extension) { - $this->error('文件后缀异常,请重新上传文件!'); - } - // 屏蔽禁止上传指定后缀的文件 - if (!in_array($extension, str2arr(sysconf('storage.allow_exts')))) { - $this->error('文件类型受限,请在后台配置规则!'); - } - if (in_array($extension, ['sh', 'asp', 'bat', 'cmd', 'exe', 'php'])) { - $this->error('文件安全保护,禁止上传可执行文件!'); - } - try { - if ($this->getType() === 'local') { - $local = LocalStorage::instance(); - $distName = $local->path($saveName, $safeMode); - $file->move(dirname($distName), basename($distName)); - $info = $local->info($saveName, $safeMode, $file->getOriginalName()); - if (in_array($extension, ['jpg', 'gif', 'png', 'bmp', 'jpeg', 'wbmp'])) { - if ($this->imgNotSafe($distName) && $local->del($saveName)) { - $this->error('图片未通过安全检查!'); - } - [$width, $height] = getimagesize($distName); - if (($width < 1 || $height < 1) && $local->del($saveName)) { - $this->error('读取图片的尺寸失败!'); - } - } - } else { - $bina = file_get_contents($file->getPathname()); - $info = Storage::instance($this->getType())->set($saveName, $bina, $safeMode, $file->getOriginalName()); - } - if (isset($info['url'])) { - $this->success('文件上传成功!', ['url' => $safeMode ? $saveName : $info['url']]); - } else { - $this->error('文件处理失败,请稍候再试!'); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } - - /** - * 获取文件上传类型 - * @return boolean - */ - private function getSafe(): bool - { - return boolval(input('safe', '0')); - } - - /** - * 获取文件上传方式 - * @return string - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function getType(): string - { - $type = strtolower(input('uptype', '')); - if (in_array($type, ['local', 'qiniu', 'alioss', 'txcos', 'uptype'])) { - return $type; - } else { - return strtolower(sysconf('storage.type')); - } - } - - /** - * 获取本地文件对象 - * @return UploadedFile|void - */ - private function getFile(): UploadedFile - { - try { - $file = $this->request->file('file'); - if ($file instanceof UploadedFile) { - return $file; - } else { - $this->error('未获取到上传的文件对象!'); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error(lang($exception->getMessage())); - } - } - - /** - * 检查图片是否安全 - * @param string $filename - * @return boolean - */ - private function imgNotSafe(string $filename): bool - { - $source = fopen($filename, 'rb'); - if (($size = filesize($filename)) > 512) { - $hexs = bin2hex(fread($source, 512)); - fseek($source, $size - 512); - $hexs .= bin2hex(fread($source, 512)); - } else { - $hexs = bin2hex(fread($source, $size)); - } - if (is_resource($source)) fclose($source); - $bins = hex2bin($hexs); - /* 匹配十六进制中的 <% ( ) %> 或 - - - \ No newline at end of file diff --git a/app/admin/view/api/upload.js b/app/admin/view/api/upload.js deleted file mode 100644 index 4f99b7d5d..000000000 --- a/app/admin/view/api/upload.js +++ /dev/null @@ -1,309 +0,0 @@ -define(['md5', 'notify'], function (SparkMD5, Notify, allowMime) { - allowMime = JSON.parse('{$exts|raw}'); - - function UploadAdapter(elem, done) { - return new (function (elem, done, that) { - - /*! 初始化变量 */ - that = this; - this.option = {elem: $(elem), exts: [], mimes: []}; - this.option.size = this.option.elem.data('size') || 0; - this.option.safe = this.option.elem.data('safe') ? 1 : 0; - this.option.hide = this.option.elem.data('hload') ? 1 : 0; - this.option.mult = this.option.elem.data('multiple') > 0; - this.option.path = (this.option.elem.data('path') || '').replace(/\W/g, ''); - this.option.type = this.option.safe ? 'local' : this.option.elem.attr('data-uptype') || ''; - this.option.quality = parseFloat(this.option.elem.data('quality') || '1.0'); - this.option.maxWidth = parseInt(this.option.elem.data('max-width') || '0'); - this.option.maxHeight = parseInt(this.option.elem.data('max-height') || '0'); - this.option.cutWidth = parseInt(this.option.elem.data('cut-width') || '0'); - this.option.cutHeight = parseInt(this.option.elem.data('cut-height') || '0'); - - /*! 查找表单元素, 如果没有找到将不会自动写值 */ - if (!this.option.elem.data('input') && this.option.elem.data('field')) { - this.$input = $('input[name="' + this.option.elem.data('field') + '"]:not([type=file])'); - this.option.elem.data('input', this.$input.size() > 0 ? this.$input.get(0) : null); - } - - /*! 文件选择筛选,使用 MIME 规则过滤文件列表 */ - $((this.option.elem.data('type') || '').split(',')).map(function (i, e) { - if (allowMime[e]) that.option.exts.push(e), that.option.mimes.push(allowMime[e]); - }); - - /*! 初始化上传组件 */ - this.adapter = new Adapter(this.option, layui.upload.render({ - url: '{:url("admin/api.upload/file")}', auto: false, elem: elem, accept: 'file', multiple: this.option.mult, exts: this.option.exts.join('|'), acceptMime: this.option.mimes.join(','), choose: function (obj) { - obj.items = [], obj.files = obj.pushFile(); - layui.each(obj.files, function (idx, file) { - obj.items.push(file); - file.path = that.option.path; - file.quality = that.option.quality; - file.maxWidth = that.option.maxWidth; - file.maxHeight = that.option.maxHeight; - file.cutWidth = that.option.cutWidth; - file.cutHeight = that.option.cutHeight; - }); - that.adapter.event('upload.choose', obj.items); - that.adapter.upload(obj.items, done); - layui.each(obj.files, function (idx) { - delete obj.files[idx]; - }); - } - })); - })(elem, done) - } - - // 创建对象 - UploadAdapter.adapter = window.AdminUploadAdapter = Adapter; - - // 上传文件 - function Adapter(option, uploader) { - this.uploader = uploader, this.config = function (option) { - return (this.option = Object.assign({}, this.option || {}, option || {})), this; - }, this.init = function (option) { - this.uploader && this.uploader.config.elem.next().val(''); - this.files = {}, this.loader = 0, this.count = {total: 0, error: 0, success: 0}; - return this.config(option).config({safe: this.option.safe || 0, type: this.option.type || ''}); - }, this.init(option); - } - - // 文件推送 - Adapter.prototype.upload = function (files, done) { - var that = this.init(); - layui.each(files, function (index, file) { - that.count.total++, file.index = index, that.files[index] = file; - if (!that.option.hide && !file.notify) { - file.notify = new NotifyExtend(file); - } - if (that.option.size && file.size > that.option.size) { - that.event('upload.error', {file: file}, file, '大小超出限制!'); - } - }); - layui.each(files, function (index, file) { - // 禁传异常状态文件 - if (typeof file.xstate === 'number' && file.xstate === -1) return; - // 图片限宽限高压缩 - if (/^image\//.test(file.type) && (file.maxWidth + file.maxHeight + file.cutWidth + file.cutHeight > 0 || file.quality !== 1)) { - require(['compressor'], function (Compressor) { - new Compressor(file, { - quality: file.quality, resize: 'cover', width: file.cutWidth || 0, height: file.cutHeight || 0, maxWidth: file.maxWidth, maxHeight: file.maxHeight, success(blob) { - blob.index = file.index, blob.notify = file.notify, blob.path = file.path, files[index] = blob; - that.hash(files[index]).then(function (file) { - that.event('upload.hash', file).request(file, done); - }); - }, error: function () { - that.event('upload.error', {file: file}, file, '压缩失败'); - } - }); - }); - } else { - that.hash(file).then(function (file) { - that.event('upload.hash', file).request(file, done); - }); - } - }); - }; - - // 文件上传 - Adapter.prototype.request = function (file, done) { - var that = this, data = {key: file.xkey, safe: that.option.safe, uptype: that.option.type}; - data.size = file.size, data.name = file.name, data.hash = file.xmd5, data.mime = file.type, data.xext = file.xext; - jQuery.ajax("{:url('admin/api.upload/state')}", { - data: data, method: 'post', success: function (ret) { - file.id = ret.data.id || 0, file.xurl = ret.data.url; - file.xsafe = ret.data.safe, file.xpath = ret.data.key, file.xtype = ret.data.uptype; - if (parseInt(ret.code) === 404) { - var uploader = {}; - uploader.url = ret.data.server; - uploader.form = new FormData(); - uploader.form.append('key', ret.data.key); - uploader.form.append('safe', ret.data.safe); - uploader.form.append('uptype', ret.data.uptype); - if (ret.data.uptype === 'qiniu') { - uploader.form.append('token', ret.data.token); - } else if (ret.data.uptype === 'alioss') { - uploader.form.append('policy', ret.data['policy']); - uploader.form.append('signature', ret.data['signature']); - uploader.form.append('OSSAccessKeyId', ret.data['OSSAccessKeyId']); - uploader.form.append('success_action_status', '200'); - uploader.form.append('Content-Disposition', 'inline;filename=' + encodeURIComponent(file.name)); - } else if (ret.data.uptype === 'txcos') { - uploader.form.append('q-ak', ret.data['q-ak']); - uploader.form.append('policy', ret.data['policy']); - uploader.form.append('q-key-time', ret.data['q-key-time']); - uploader.form.append('q-signature', ret.data['q-signature']); - uploader.form.append('q-sign-algorithm', ret.data['q-sign-algorithm']); - uploader.form.append('success_action_status', '200'); - uploader.form.append('Content-Disposition', 'inline;filename=' + encodeURIComponent(file.name)); - } else if (ret.data.uptype === 'upyun') { - uploader.form.delete('key'); - uploader.form.delete('safe'); - uploader.form.delete('uptype'); - uploader.form.append('save-key', ret.data['key']); - uploader.form.append('policy', ret.data['policy']); - uploader.form.append('authorization', ret.data['authorization']); - uploader.form.append('Content-Disposition', 'inline;filename=' + encodeURIComponent(file.name)); - } - uploader.form.append('file', file, file.name), jQuery.ajax({ - url: uploader.url, data: uploader.form, type: 'post', xhr: function (xhr) { - xhr = new XMLHttpRequest(); - return xhr.upload.addEventListener('progress', function (event) { - file.xtotal = event.total, file.xloaded = event.loaded || 0; - that.progress((file.xloaded / file.xtotal * 100).toFixed(2), file) - }), xhr; - }, contentType: false, error: function () { - that.event('upload.error', {file: file}, file, '接口异常'); - }, processData: false, success: function (ret) { - // 兼容数据格式 - if (typeof ret === 'string' && ret.length > 0) try { - ret = JSON.parse(ret) || ret; - } catch (e) { - console.log(e) - } - if (typeof ret !== 'object') { - ret = {code: 1, url: file.xurl, info: '上传成功'}; - } - /*! 检查单个文件上传返回的结果 */ - if (typeof ret === 'object' && ret.code < 1) { - that.event('upload.error', {file: file}, file, ret.info || '上传失败'); - } else { - that.done(ret, file.index, file, done, '上传成功'); - } - } - }); - } else if (parseInt(ret.code) === 200) { - (file.xurl = ret.data.url), that.progress('100.00', file); - that.done({code: 1, url: file.xurl, info: file.xstats}, file.index, file, done, '秒传成功'); - } else { - that.event('upload.error', {file: file}, file, ret.info || ret.error.message || '上传出错!'); - } - } - }); - }; - - // 上传进度 - Adapter.prototype.progress = function (number, file) { - this.event('upload.progress', {number: number, file: file}); - if (file.notify) file.notify.setProgress(number); - }; - - // 上传结果 - Adapter.prototype.done = function (ret, idx, file, done, message) { - /*! 检查单个文件上传返回的结果 */ - if (ret.code < 1) return $.msg.tips(ret.info || '文件上传失败!'); - if (typeof file.xurl !== 'string') return $.msg.tips('无效的文件上传对象!'); - jQuery.post("{:url('admin/api.upload/done')}", {id: file.id, hash: file.xmd5}); - /*! 单个文件上传成功结果处理 */ - if (typeof done === 'function') { - done.call(this.option.elem, file.xurl, this.files['id']); - } else if (this.option.mult < 1 && this.option.elem.data('input')) { - $(this.option.elem.data('input')).val(file.xurl).trigger('change', file); - } - // 文件上传成功事件 - this.event('push', file.xurl).event('upload.done', {file: file, data: ret}, file, message); - /*! 所有文件上传完成后结果处理 */ - if (this.count.success + this.count.error >= this.count.total) { - this.option.hide || $.msg.close(this.loader); - if (this.option.mult > 0 && this.option.elem.data('input')) { - var urls = this.option.elem.data('input').value || []; - if (typeof urls === 'string') urls = urls.split('|'); - for (var i in this.files) urls.push(this.files[i].xurl); - $(this.option.elem.data('input')).val(urls.join('|')).trigger('change', this.files); - } - this.event('upload.complete', {file: this.files}, file).init().uploader && this.uploader.reload(); - } - }; - - /*! 触发事件过程 */ - Adapter.prototype.event = function (name, data, file, message) { - if (name === 'upload.error') { - this.count.error++, file.xstate = -1, file.xstats = message; - if (file.notify) file.notify.setError(message || file.xstats || ''); - } else if (name === 'upload.done') { - this.count.success++, file.xstate = 1, file.xstats = message; - if (file.notify) file.notify.setSuccess(message || file.xstats || '') - } - if (this.option.elem) { - this.option.elem.triggerHandler(name, data); - } - return this; - }; - - /** - * 计算文件 HASH 值 - * @param {File} file 文件对象 - * @return {Promise} - */ - Adapter.prototype.hash = function (file) { - var defer = jQuery.Deferred(); - file.xext = file.name.indexOf('.') > -1 ? file.name.split('.').pop() : 'tmp'; - - /*! 兼容不能计算文件 HASH 的情况 */ - var IsDate = '{$nameType|default=""}'.indexOf('date') > -1; - if (!window.FileReader || IsDate) return jQuery.when((function (xmd5, chars) { - while (xmd5.length < 32) xmd5 += chars.charAt(Math.floor(Math.random() * chars.length)); - return SetFileXdata(file, xmd5, 6), defer.promise(); - })(layui.util.toDateString(Date.now(), 'yyyyMMddHHmmss-'), '0123456789')); - - /*! 读取文件并计算 HASH 值 */ - return new LoadNextChunk(file).ReadAsChunk(); - - function SetFileXdata(file, xmd5, slice) { - file.xmd5 = xmd5, file.xstate = 0, file.xstats = ''; - file.xkey = file.xmd5.substring(0, slice || 2) + '/' + file.xmd5.substring(slice || 2) + '.' + file.xext; - if (file.path) file.xkey = file.path + '/' + file.xkey; - return defer.resolve(file, file.xmd5, file.xkey), file; - } - - function LoadNextChunk(file) { - var that = this, reader = new FileReader(), spark = new SparkMD5.ArrayBuffer(); - var slice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice; - this.chunkIdx = 0, this.chunkSize = 2097152, this.chunkTotal = Math.ceil(file.size / this.chunkSize); - reader.onload = function (event) { - spark.append(event.target.result); - ++that.chunkIdx < that.chunkTotal ? that.ReadAsChunk() : SetFileXdata(file, spark.end()); - }, reader.onerror = function () { - defer.reject(); - }, this.ReadAsChunk = function () { - this.start = that.chunkIdx * that.chunkSize; - this.loaded = this.start + that.chunkSize >= file.size ? file.size : this.start + that.chunkSize; - reader.readAsArrayBuffer(slice.call(file, this.start, this.loaded)); - defer.notify(file, (this.loaded / file.size * 100).toFixed(2)); - return defer.promise(); - }; - } - }; - - return UploadAdapter; - - /** - * 上传状态提示扩展插件 - * @param {File} file 文件对象 - * @constructor - */ - function NotifyExtend(file) { - var that = this; - this.notify = Notify.notify({width: 260, title: file.name, showProgress: true, description: '上传进度 0%', type: 'default', position: 'top-right', closeTimeout: 0}); - this.$elem = $(this.notify.notification.nodes); - this.$elem.find('.growl-notification__progress').addClass('is-visible'); - this.$elem.find('.growl-notification__progress-bar').addClass('transition'); - this.setProgress = function (number) { - this.$elem.find('[data-upload-progress]').html(number + '%'); - this.$elem.find('.growl-notification__progress-bar').css({width: number + '%'}); - return this; - }, this.setError = function (message) { - this.$elem.find('.growl-notification__desc').html(message || '文件上传失败!'); - this.$elem.removeClass('growl-notification--default').addClass('growl-notification--error') - return this.close(); - }, this.setSuccess = function (message) { - this.setProgress('100.00'); - this.$elem.find('.growl-notification__desc').html(message || '文件上传成功!'); - this.$elem.removeClass('growl-notification--default').addClass('growl-notification--success'); - return this.close(); - }, this.close = function (timeout) { - return setTimeout(function () { - that.notify.close(); - }, timeout || 2000), this; - }; - } -}); \ No newline at end of file diff --git a/app/admin/view/api/upload/image.html b/app/admin/view/api/upload/image.html deleted file mode 100644 index deeee9dd4..000000000 --- a/app/admin/view/api/upload/image.html +++ /dev/null @@ -1,146 +0,0 @@ -
-
-
- - 搜 索 -
- -
-
- -
-
-
-
- 已选 {{ data.length }} 张,确认 -
-
-
- - - - \ No newline at end of file diff --git a/app/admin/view/auth/apply.html b/app/admin/view/auth/apply.html deleted file mode 100644 index 555333905..000000000 --- a/app/admin/view/auth/apply.html +++ /dev/null @@ -1,104 +0,0 @@ -{extend name='main'} - -{block name="content"} -
- -
-
- - -
-
-{/block} - -{block name="script"} - -{/block} - -{block name="style"} - -{/block} \ No newline at end of file diff --git a/app/admin/view/auth/form.html b/app/admin/view/auth/form.html deleted file mode 100644 index 9457c1ce0..000000000 --- a/app/admin/view/auth/form.html +++ /dev/null @@ -1,25 +0,0 @@ -
- -
- - - - - -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
\ No newline at end of file diff --git a/app/admin/view/auth/index.html b/app/admin/view/auth/index.html deleted file mode 100644 index 0148c82c4..000000000 --- a/app/admin/view/auth/index.html +++ /dev/null @@ -1,80 +0,0 @@ -{extend name='table'} - -{block name="button"} - - - - - - - -{/block} - -{block name="content"} -
- {include file='auth/index_search'} -
-
-{/block} - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/admin/view/auth/index_search.html b/app/admin/view/auth/index_search.html deleted file mode 100644 index 7a8bdb31b..000000000 --- a/app/admin/view/auth/index_search.html +++ /dev/null @@ -1,45 +0,0 @@ -
- 条件搜索 - -
\ No newline at end of file diff --git a/app/admin/view/base/form.html b/app/admin/view/base/form.html deleted file mode 100644 index 9125b0d0d..000000000 --- a/app/admin/view/base/form.html +++ /dev/null @@ -1,68 +0,0 @@ -
- -
- -
-
数据类型DataType
- {if isset($vo.type)} - - {else} - - - {/if} -

请选择数据类型,数据创建后不能再次修改哦 ~

-
- -

请输入新的数据类型,数据创建后不能再次修改哦 ~

-
-
- - - - - - - -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
- -
\ No newline at end of file diff --git a/app/admin/view/base/index.html b/app/admin/view/base/index.html deleted file mode 100644 index 2842790b0..000000000 --- a/app/admin/view/base/index.html +++ /dev/null @@ -1,86 +0,0 @@ -{extend name='table'} - -{block name="button"} - - - - - - - -{/block} - -{block name="content"} -
- -
- {include file='base/index_search'} -
-
-
-{/block} - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/admin/view/base/index_search.html b/app/admin/view/base/index_search.html deleted file mode 100644 index 93a681359..000000000 --- a/app/admin/view/base/index_search.html +++ /dev/null @@ -1,42 +0,0 @@ - \ No newline at end of file diff --git a/app/admin/view/config/index.html b/app/admin/view/config/index.html deleted file mode 100644 index 9e91b7194..000000000 --- a/app/admin/view/config/index.html +++ /dev/null @@ -1,171 +0,0 @@ -{extend name="main"} - -{block name="button"} - -清理无效配置 - - - -修改系统参数 - -{/block} - -{block name="content"} - -
-
- 运行模式Run Mode -
-
- -
-

开发模式:开发人员或在功能调试时使用,系统异常时会显示详细的错误信息,同时还会记录操作日志及数据库 SQL 语句信息。

-

生产模式:项目正式部署上线后使用,系统异常时统一显示 “{:config('app.error_message')}”,只记录重要的异常日志信息,强烈推荐上线后使用此模式。

-
-
-
- -
-
- 富编辑器Rich Text Editor -
-
-
- {if !in_array(sysconf('base.editor'),['ckeditor4','ckeditor5','auto'])}{php}sysconf('base.editor','ckeditor4');{/php}{/if} - {foreach ['ckeditor4'=>'CKEditor4','ckeditor5'=>'CKEditor5','auto'=>'自适应模式'] as $k => $v}{if sysconf('base.editor') eq $k} - {if auth('storage')}{$v}{else}{$v}{/if} - {else} - {if auth('storage')}{$v}{else}{$v}{/if} - {/if}{/foreach} -
-
-

CKEditor4:旧版本编辑器,对浏览器兼容较好,但内容编辑体验稍有不足。

-

CKEditor5:新版本编辑器,只支持新特性浏览器,对内容编辑体验较好,推荐使用。

-

自适应模式:优先使用新版本编辑器,若浏览器不支持新版本时自动降级为旧版本编辑器。

-
-
-
- - -
-
- 存储引擎Storage Engine -
- - {if !sysconf('storage.type')}{php}sysconf('storage.type','local');{/php}{/if} - {if !sysconf('storage.link_type')}{php}sysconf('storage.link_type','none');{/php}{/if} - {if !sysconf('storage.name_type')}{php}sysconf('storage.name_type','xmd5');{/php}{/if} - {if !sysconf('storage.allow_exts')}{php}sysconf('storage.allow_exts','doc,gif,ico,jpg,mp3,mp4,p12,pem,png,rar,xls,xlsx');{/php}{/if} - {if !sysconf('storage.local_http_protocol')}{php}sysconf('storage.local_http_protocol','http');{/php}{/if} -
-
- {foreach ['local'=>'本地服务器存储','qiniu'=>'七牛云对象存储','upyun'=>'又拍云USS存储','alioss'=>'阿里云OSS存储','txcos'=>'腾讯云COS存储'] as $k => $v}{if sysconf('storage.type') eq $k} - {if auth('storage')}{$v}{else}{$v}{/if} - {else} - {if auth('storage')}{$v}{else}{$v}{/if} - {/if}{/foreach} -
-
-

本地服务器存储:文件直接上传到本地服务器的 `static/upload` 目录,不支持大文件上传,占用服务器磁盘空间,访问时消耗服务器带宽流量。

-

七牛云对象存储:文件直接上传到七牛云存储空间,支持大文件上传,不占用服务器空间及服务器带宽流量,支持 CDN 加速访问,访问量大时推荐使用。

-

又拍云USS存储:文件直接上传到又拍云 USS 存储空间,支持大文件上传,不占用服务器空间及服务器带宽流量,支持 CDN 加速访问,访问量大时推荐使用。

-

阿里云OSS存储:文件直接上传到阿里云 OSS 存储空间,支持大文件上传,不占用服务器空间及服务器带宽流量,支持 CDN 加速访问,访问量大时推荐使用。

-

腾讯云COS存储:文件直接上传到腾讯云 COS 存储空间,支持大文件上传,不占用服务器空间及服务器带宽流量,支持 CDN 加速访问,访问量大时推荐使用。

-
-
-
- -
-
- 系统参数System Parameter -
-
-
-
网站名称Website
- -
网站名称及网站图标,将显示在浏览器的标签上。
-
-
-
管理程序名称Name
- -
管理程序名称,将显示在后台左上角标题。
-
-
-
管理程序版本Version
- -
管理程序版本,将显示在后台左上角标题。
-
-
-
公网备案号Baian
- -

公网备案号,可以在 备案管理中心 查询获取,将在登录页面下面显示。

-
-
-
网站备案号Miitbeian
- -
网站备案号,可以在 备案管理中心 查询获取,将显示在登录页面下面。
-
-
-
网站版权信息Copyright
- -
网站版权信息,在后台登录页面显示版本信息并链接到备案到信息备案管理系统。
-
-
-
- - -
-
- 系统信息System Information -
-
- - - - - - - - - - - - - - - - - - - -
核心框架ThinkPHP Version {$app->version()}
基础程序ThinkAdmin Version {$version|default='6.0.0'}
操作系统{:php_uname()}
运行环境{:ucfirst($request->server('SERVER_SOFTWARE',php_sapi_name()))} & PHP {$Think.const.PHP_VERSION} & {:ucfirst(app()->db->connect()->getConfig('type'))}
-
-
- -{/block} \ No newline at end of file diff --git a/app/admin/view/config/storage-0.html b/app/admin/view/config/storage-0.html deleted file mode 100644 index ab617daaf..000000000 --- a/app/admin/view/config/storage-0.html +++ /dev/null @@ -1,45 +0,0 @@ -
- -
- {foreach ['xmd5'=>'文件哈希值 ( 支持秒传 )','date'=>'日期+随机 ( 普通上传 )'] as $k=>$v} - - {/foreach} -

类型为“文件哈希”时可以实现文件秒传功能,同一个文件只需上传一次节省存储空间,推荐使用。

-
-
- -
- -
- {foreach ['none'=>'简洁链接','full'=>'完整链接','none+compress'=>'简洁并压缩图片','full+compress'=>'完整并压缩图片'] as $k=>$v} - - {/foreach} -

类型为“简洁链接”时链接将只返回 hash 地址,而“完整链接”将携带参数保留文件名,图片压缩功能云平台会单独收费。

-
-
- -
- -
- -

设置系统允许上传文件的后缀,多个以英文逗号隔开如:png,jpg,rar,doc,未设置允许上传的后缀

-
-
\ No newline at end of file diff --git a/app/admin/view/config/storage-alioss.html b/app/admin/view/config/storage-alioss.html deleted file mode 100644 index 83234af80..000000000 --- a/app/admin/view/config/storage-alioss.html +++ /dev/null @@ -1,96 +0,0 @@ -
-
- -
-

文件将上传到 阿里云 OSS 存储,需要配置 OSS 公开访问及跨域策略

-

配置跨域访问 CORS 规则,设置:来源 Origin 为 *,允许 Methods 为 POST,允许 Headers 为 *

-
- - {include file='config/storage-0'} - -
- -
- {if !sysconf('storage.alioss_http_protocol')}{php}sysconf('storage.alioss_http_protocol','http');{/php}{/if} - {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} - - {/foreach} -

阿里云OSS存储访问协议,其中 HTTPS 需要配置证书才能使用(AUTO 为相对协议)

-
-
- -
- -
- -

阿里云OSS存储空间所在区域,需要严格对应储存所在区域才能上传文件

-
-
- -
- -
- -

填写阿里云OSS存储空间名称,如:think-admin-oss(需要是全区唯一的值,不存在时会自动创建)

-
-
- -
- -
- -

填写阿里云OSS存储外部访问域名,如:static.alioss.thinkadmin.top

-
-
- -
- -
- -

可以在 [ 阿里云 > 个人中心 ] 设置并获取到访问密钥

-
-
- -
- -
- -

可以在 [ 阿里云 > 个人中心 ] 设置并获取到安全密钥

-
-
- -
- - -
- - -
- -
-
\ No newline at end of file diff --git a/app/admin/view/config/storage-local.html b/app/admin/view/config/storage-local.html deleted file mode 100644 index 17f80cc5a..000000000 --- a/app/admin/view/config/storage-local.html +++ /dev/null @@ -1,49 +0,0 @@ -
-
- -
-

文件将存储在本地服务器,默认保存在 public/upload 目录,文件以 HASH 命名。

-

文件存储的目录需要有读写权限,有足够的存储空间。特别注意,本地存储暂不支持图片压缩!

-
- - {include file='config/storage-0'} - -
- -
- {if !sysconf('storage.local_http_protocol')}{php}sysconf('storage.local_http_protocol','http');{/php}{/if} - {foreach ['follow'=>'FOLLOW','http'=>'HTTP','https'=>'HTTPS','path'=>'PATH','auto'=>'AUTO'] as $protocol=>$remark} - - {/foreach} -

本地存储访问协议,其中 HTTPS 需要配置证书才能使用( FOLLOW 跟随系统,PATH 文件路径,AUTO 相对协议 )

-
-
- -
- -
- -

填写上传后的访问域名(不指定时根据当前访问地址自动计算),如:static.thinkadmin.top

-
-
- -
- - -
- - -
- -
-
\ No newline at end of file diff --git a/app/admin/view/config/storage-qiniu.html b/app/admin/view/config/storage-qiniu.html deleted file mode 100644 index 81edf6889..000000000 --- a/app/admin/view/config/storage-qiniu.html +++ /dev/null @@ -1,95 +0,0 @@ -
-
- -
-

文件将上传到 七牛云 存储,对象存储需要配置为公开访问的 Bucket 空间

- 完成实名认证后可获得 10G 免费存储空间哦!我要免费申请 -
- - {include file='config/storage-0'} - -
- -
- {if !sysconf('storage.qiniu_http_protocol')}{php}sysconf('storage.qiniu_http_protocol','http');{/php}{/if} - {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} - - {/foreach} -

七牛云存储访问协议,其中 HTTPS 需要配置证书才能使用( AUTO 为相对协议 )

-
-
- -
- -
- -

七牛云存储空间所在区域,需要严格对应储存所在区域才能上传文件

-
-
- -
- -
- -

填写七牛云存储空间名称,如:static

-
-
- -
- -
- -

填写七牛云存储访问域名,如:static.qiniu.thinkadmin.top

-
-
- -
- -
- -

可以在 [ 七牛云 > 个人中心 ] 设置并获取到访问密钥

-
-
- -
- -
- -

可以在 [ 七牛云 > 个人中心 ] 设置并获取到安全密钥

-
-
- -
- - -
- - -
-
-
\ No newline at end of file diff --git a/app/admin/view/config/storage-txcos.html b/app/admin/view/config/storage-txcos.html deleted file mode 100644 index f9be32a89..000000000 --- a/app/admin/view/config/storage-txcos.html +++ /dev/null @@ -1,96 +0,0 @@ -
-
- -
-

文件将上传到 腾讯云 COS 存储,需要配置 COS 公有读私有写访问权限及跨域策略

-

配置跨域访问 CORS 规则,设置来源 Origin 为 *,允许 Methods 为 POST,允许 Headers 为 *

-
- - {include file='config/storage-0'} - -
- -
- {if !sysconf('storage.txcos_http_protocol')}{php}sysconf('storage.txcos_http_protocol','http');{/php}{/if} - {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} - - {/foreach} -

腾讯云COS存储访问协议,其中 HTTPS 需要配置证书才能使用( AUTO 为相对协议 )

-
-
- -
- -
- -

腾讯云COS存储空间所在区域,需要严格对应储存所在区域才能上传文件

-
-
- -
- -
- -

填写腾讯云COS存储空间名称,如:thinkadmin-1251143395

-
-
- -
- -
- -

填写腾讯云COS存储外部访问域名,如:static.txcos.thinkadmin.top

-
-
- -
- -
- -

可以在 [ 腾讯云 > 个人中心 ] 设置并获取到访问密钥

-
-
- -
- -
- -

可以在 [ 腾讯云 > 个人中心 ] 设置并获取到安全密钥

-
-
- -
- - -
- - -
- -
-
\ No newline at end of file diff --git a/app/admin/view/config/storage-upyun.html b/app/admin/view/config/storage-upyun.html deleted file mode 100644 index ce0be7040..000000000 --- a/app/admin/view/config/storage-upyun.html +++ /dev/null @@ -1,79 +0,0 @@ -
-
- -
-

文件将上传到 又拍云 USS 存储,需要配置 USS 公开访问及跨域策略

-

配置跨域访问 CORS 规则,设置来源 Origin 为 *,允许 Methods 为 POST,允许 Headers 为 *

-
- - {include file='config/storage-0'} - -
- -
- {if !sysconf('storage.upyun_http_protocol')}{php}sysconf('storage.upyun_http_protocol','http');{/php}{/if} - {foreach ['http'=>'HTTP','https'=>'HTTPS','auto'=>"AUTO"] as $protocol=>$remark} - - {/foreach} -

又拍云存储访问协议,其中 HTTPS 需要配置证书才能使用(AUTO 为相对协议)

-
-
- -
- -
- -

填写又拍云存储空间名称,如:think-admin-uss(需要是全区唯一的值,不存在时会自动创建)

-
-
- -
- -
- -

填写又拍云存储外部访问域名,如:static.uss.thinkadmin.top

-
-
- -
- -
- -

可以在 [ 账户管理 > 操作员 ] 设置操作员账号并将空间给予授权。

-
-
- -
- -
- -

可以在 [ 账户管理 > 操作员 ] 设置操作员密码并将空间给予授权

-
-
- -
- - -
- - -
- -
-
\ No newline at end of file diff --git a/app/admin/view/config/system.html b/app/admin/view/config/system.html deleted file mode 100644 index bddf8b16d..000000000 --- a/app/admin/view/config/system.html +++ /dev/null @@ -1,129 +0,0 @@ -
-
- -
-
- -
-
-
后台登录入口Login Entry
- -
-
-
后台默认配色Theme Style
- -
-
- 后台登录入口是由英文字母开头,且不能有相同名称的模块,设置之后原地址不能继续访问,请谨慎配置 ~ -
-
- -
-
登录背景图片Background Image
-
- -
-
- -
-
JWT 接口密钥Jwt Key
- -
- 请输入 32JWT 接口密钥,在使用 JWT 接口时需要使用其密钥进行加密及签名! -
-
- -
-
浏览器小图标Browser Icon
- -
- 建议上传 128x128256x256JPG,PNG,JPEG 图片,保存后会自动生成 48x48ICO 文件 ~ -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- 网站备案号和公安备案号可以在备案管理中心查询并获取,网站上线时必需配置备案号,备案号会链接到信息备案管理系统 ~ -
-
-
- -
-
- - -
-
- - \ No newline at end of file diff --git a/app/admin/view/error.php b/app/admin/view/error.php deleted file mode 100644 index c8504dbc2..000000000 --- a/app/admin/view/error.php +++ /dev/null @@ -1,568 +0,0 @@ -' . end($names) . ''; - } -} - -if (!function_exists('parse_file')) { - function parse_file($file, $line): string - { - return '' . basename($file) . " line {$line}" . ''; - } -} - -if (!function_exists('parse_args')) { - function parse_args($args): string - { - $result = []; - foreach ($args as $key => $item) { - switch (true) { - case is_object($item): - $value = sprintf('object(%s)', parse_class(get_class($item))); - break; - case is_array($item): - if (count($item) > 3) { - $value = sprintf('[%s, ...]', parse_args(array_slice($item, 0, 3))); - } else { - $value = sprintf('[%s]', parse_args($item)); - } - break; - case is_string($item): - if (strlen($item) > 20) { - $value = sprintf( - '\'%s...\'', - htmlentities($item), - htmlentities(substr($item, 0, 20)) - ); - } else { - $value = sprintf("'%s'", htmlentities($item)); - } - break; - case is_int($item): - case is_float($item): - $value = $item; - break; - case is_null($item): - $value = 'null'; - break; - case is_bool($item): - $value = '' . ($item ? 'true' : 'false') . ''; - break; - case is_resource($item): - $value = 'resource'; - break; - default: - $value = htmlentities(str_replace("\n", '', var_export(strval($item), true))); - break; - } - - $result[] = is_int($key) ? $value : "'{$key}' => {$value}"; - } - - return implode(', ', $result); - } -} -if (!function_exists('echo_value')) { - function echo_value($val) - { - if (is_array($val) || is_object($val)) { - echo htmlentities(json_encode($val, JSON_PRETTY_PRINT)); - } elseif (is_bool($val)) { - echo $val ? 'true' : 'false'; - } elseif (is_scalar($val)) { - echo htmlentities($val); - } else { - echo 'Resource'; - } - } -} -?> - - - - - 系统发生错误 - - - - - - $trace) { ?> -
-
-
-
-

-
-

-
-
- -
-
-
  1. ">
-
-
- -
-

Call Stack

-
    -
  1. - -
  2. - -
  3. - -
-
-
- - -
-

-
- - - -
-

Exception Datas

- $value) { ?> - - - - - - - $val) { ?> - - - - - - - -
empty
- -
- - - -
-

Environment Variables

- $value) { ?> - - - - - - - $val) { ?> - - - - - - - -
empty
- -
- - - - - - - diff --git a/app/admin/view/file/form.html b/app/admin/view/file/form.html deleted file mode 100644 index 5536ace18..000000000 --- a/app/admin/view/file/form.html +++ /dev/null @@ -1,40 +0,0 @@ -
- -
- - - - - - - - - - - - -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
\ No newline at end of file diff --git a/app/admin/view/file/index.html b/app/admin/view/file/index.html deleted file mode 100644 index f227f5241..000000000 --- a/app/admin/view/file/index.html +++ /dev/null @@ -1,65 +0,0 @@ -{extend name='table'} - -{block name="button"} - -清理重复 - - -批量删除 - -{/block} - -{block name="content"} -
- {include file='file/index_search'} -
-
- - - -{/block} diff --git a/app/admin/view/file/index_search.html b/app/admin/view/file/index_search.html deleted file mode 100644 index 212b72544..000000000 --- a/app/admin/view/file/index_search.html +++ /dev/null @@ -1,58 +0,0 @@ -
- 条件搜索 - -
\ No newline at end of file diff --git a/app/admin/view/full.html b/app/admin/view/full.html deleted file mode 100644 index c76f00e6f..000000000 --- a/app/admin/view/full.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - {block name="title"}{$title|default=''}{if !empty($title)} · {/if}{:sysconf('site_name')}{/block} - - - - - - - - - - - - {block name="style"}{/block} - - - - -{block name='body'} -
-
{block name='content'}{/block}
-
-{/block} - - - - -{block name='script'}{/block} - - \ No newline at end of file diff --git a/app/admin/view/index/index-left.html b/app/admin/view/index/index-left.html deleted file mode 100644 index bea9c379c..000000000 --- a/app/admin/view/index/index-left.html +++ /dev/null @@ -1,50 +0,0 @@ -
- - -
-
- {foreach $menus as $one} -
- - {notempty name='one.icon'}{/notempty} - {$one.title|default=''} - -
- {/foreach} -
-
- {foreach $menus as $one}{notempty name='one.sub'} - - {/notempty}{/foreach} -
-
-
diff --git a/app/admin/view/index/index-top.html b/app/admin/view/index/index-top.html deleted file mode 100644 index 82f3962bf..000000000 --- a/app/admin/view/index/index-top.html +++ /dev/null @@ -1,44 +0,0 @@ -
- - -
\ No newline at end of file diff --git a/app/admin/view/index/index.html b/app/admin/view/index/index.html deleted file mode 100644 index f2bc08a8c..000000000 --- a/app/admin/view/index/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - {block name="title"}{$title|default=''}{if !empty($title)} · {/if}{:sysconf('site_name')}{/block} - - - - - - - - - - - - {block name="style"}{/block} - - - - - - -{block name='body'} -
- - - {include file="index/index-left"} - - - - {include file='index/index-top'} - - - -
-
- {block name='content'}{/block} -
- -
-
-
-
- -
- - -
-
-
- - -{/block} - - - - -{block name='script'}{/block} - - - \ No newline at end of file diff --git a/app/admin/view/index/theme.html b/app/admin/view/index/theme.html deleted file mode 100644 index 870d7caff..000000000 --- a/app/admin/view/index/theme.html +++ /dev/null @@ -1,36 +0,0 @@ -
-
- -
-
后台配色方案Theme Style
-
- {foreach $themes as $k=>$v} - - {/foreach} -
-

切换配色方案,需要保存成功后配色方案才会永久生效,下次登录也会有效哦 ~

-
-
- -
-
- - -
-
- - \ No newline at end of file diff --git a/app/admin/view/login/index.html b/app/admin/view/login/index.html deleted file mode 100644 index 9babe29ae..000000000 --- a/app/admin/view/login/index.html +++ /dev/null @@ -1,57 +0,0 @@ -{extend name="index/index"} - -{block name='style'} - - - -{/block} - -{block name="body"} -
-
- {:sysconf('app_name')}{:sysconf('app_version')} - {notempty name='developMode'} - - Fork me on Gitee - - {/notempty} -
-
-

{:sysconf('login_name')?:'系统管理'}

-
    -
  • - -
  • -
  • - -
  • -
  • - - -
  • -
  • - -
  • -
-
- -
-{/block} - -{block name='script'} - -{/block} \ No newline at end of file diff --git a/app/admin/view/main.html b/app/admin/view/main.html deleted file mode 100644 index c46b38d3b..000000000 --- a/app/admin/view/main.html +++ /dev/null @@ -1,18 +0,0 @@ -
- {block name='style'}{/block} - {block name='header'} - {notempty name='title'} -
- {$title|default=''} -
{block name='button'}{/block}
-
- {/notempty} - {/block} -
-
-
- {block name='content'}{/block} -
-
- {block name='script'}{/block} -
\ No newline at end of file diff --git a/app/admin/view/menu/form.html b/app/admin/view/menu/form.html deleted file mode 100644 index c7cc8ad86..000000000 --- a/app/admin/view/menu/form.html +++ /dev/null @@ -1,97 +0,0 @@ -
- -
- -
- -
- -

必选,请选择上级菜单或顶级菜单 ( 目前最多支持三级菜单 )

-
-
- -
- -
- -

必选,请填写菜单名称 ( 如:系统管理 ),建议字符不要太长,一般 4-6 个汉字

-
-
- -
- -
- -

- 必选,请填写链接地址或选择系统节点 ( 如:https://domain.com/admin/user/index.html 或 admin/user/index ) -
当填写链接地址时,以下面的 “权限节点” 来判断菜单自动隐藏或显示,注意未填写 “权限节点” 时将不会隐藏该菜单哦 -

-
-
- -
- -
- -

可选,设置菜单链接的 GET 访问参数 ( 如:name=1&age=3 )

-
-
- -
- -
- -

可选,请填写系统权限节点 ( 如:admin/user/index ),未填写时默认解释"菜单链接"判断是否拥有访问权限;

-
-
- -
- -
-
- -
- - - - -

可选,设置菜单选项前置图标,目前支持 layui 字体图标及 iconfont 定制字体图标。

-
-
- -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
- - \ No newline at end of file diff --git a/app/admin/view/menu/index.html b/app/admin/view/menu/index.html deleted file mode 100644 index 8b2c8e850..000000000 --- a/app/admin/view/menu/index.html +++ /dev/null @@ -1,123 +0,0 @@ -{extend name='table'} - -{block name="button"} - - - - - - - - - - - -{/block} - -{block name="content"} -
- -
- -
-
- - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/admin/view/module/change.html b/app/admin/view/module/change.html deleted file mode 100644 index b209414ae..000000000 --- a/app/admin/view/module/change.html +++ /dev/null @@ -1,44 +0,0 @@ -
-
-
-
-
模块名称:{$module.name}
-
开发作者:{$module.author}
-
-
-
最新版本:{$module.version}
-
{if isset($current.version)}已安装版本:{$current.version}{/if}
-
-
模块描述:{$module.content}
-
-
    - {foreach $module.change as $version=>$change} -
  • - {if isset($current.version) and $current.version eq $version} - - {else} - - {/if} -
    -

    - 版本号 {$version} {$change.version|default=''} -

    -
    - {$change.content|default=''|raw} -
    -
    -
  • - {/foreach} -
  • -
-
- - -
\ No newline at end of file diff --git a/app/admin/view/module/index.html b/app/admin/view/module/index.html deleted file mode 100644 index 5e20d5ca5..000000000 --- a/app/admin/view/module/index.html +++ /dev/null @@ -1,42 +0,0 @@ -{extend name='main'} - -{block name="content"} -
- - {notempty name='modules'} - - - - - - - - - {/notempty} - - {foreach $modules as $key=>$vo} - - - - - - - {/foreach} - -
模块名称模块描述当前版本
{$vo.name}{$vo.content} -
- {if isset($vo.local)} {$vo.local.version} - {if $vo.version > $vo.local.version} - {$vo.version} - {else} - {$vo.type_desc} - {/if} - {else}{$vo.type_desc}{/if} -
-
- {if $vo.type_code eq 1} 安 装{/if} - {if $vo.type_code eq 2} 更 新{/if} -
- {empty name='modules'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-{/block} \ No newline at end of file diff --git a/app/admin/view/module/index_search.html b/app/admin/view/module/index_search.html deleted file mode 100644 index 55c31ea8a..000000000 --- a/app/admin/view/module/index_search.html +++ /dev/null @@ -1,58 +0,0 @@ -
- 条件搜索 - -
diff --git a/app/admin/view/oplog/index.html b/app/admin/view/oplog/index.html deleted file mode 100644 index 505d5ecca..000000000 --- a/app/admin/view/oplog/index.html +++ /dev/null @@ -1,47 +0,0 @@ -{extend name='table'} - -{block name="button"} - - - - - - - -{/block} - -{block name="content"} -
- {include file='oplog/index_search'} -
-
-{/block} - -{block name='script'} - - - -{/block} \ No newline at end of file diff --git a/app/admin/view/oplog/index_search.html b/app/admin/view/oplog/index_search.html deleted file mode 100644 index 7276662ec..000000000 --- a/app/admin/view/oplog/index_search.html +++ /dev/null @@ -1,129 +0,0 @@ -
- 条件搜索 - -
- - \ No newline at end of file diff --git a/app/admin/view/queue/index.html b/app/admin/view/queue/index.html deleted file mode 100644 index cf1b5d516..000000000 --- a/app/admin/view/queue/index.html +++ /dev/null @@ -1,117 +0,0 @@ -{extend name='table'} - -{block name="button"} - -优化数据库 - - - - - - - - - - - - - - -{/block} - -{block name="content"} -
- - 服务状态:检查中 - - - - 任务统计:待处理 {$total.pre|default=0} 个任务,处理中 {$total.dos|default=0} 个任务,已完成 {$total.oks|default=0} 个任务,已失败 {$total.ers|default=0} 个任务。 -
-
- {include file='queue/index_search'} -
-
-{/block} - -{block name='script'} - - - -{/block} diff --git a/app/admin/view/queue/index_search.html b/app/admin/view/queue/index_search.html deleted file mode 100644 index b13f2cf2e..000000000 --- a/app/admin/view/queue/index_search.html +++ /dev/null @@ -1,59 +0,0 @@ -
- 条件搜索 - -
\ No newline at end of file diff --git a/app/admin/view/table.html b/app/admin/view/table.html deleted file mode 100644 index 5725f4d26..000000000 --- a/app/admin/view/table.html +++ /dev/null @@ -1,18 +0,0 @@ -
- {block name='style'}{/block} - {block name='header'} - {notempty name='title'} -
- {$title|default=''} -
{block name='button'}{/block}
-
- {/notempty} - {/block} -
-
-
- {block name='content'}{/block} -
-
- {block name='script'}{/block} -
\ No newline at end of file diff --git a/app/admin/view/user/form.html b/app/admin/view/user/form.html deleted file mode 100644 index da5a4ea1a..000000000 --- a/app/admin/view/user/form.html +++ /dev/null @@ -1,114 +0,0 @@ -
-
- -
- 用户账号 - -
-
- - -
-
- -
-
- -
-
- -
- - {if !empty($bases) || !empty($authorizes)} -
- 用户权限 - {if !empty($bases)} -
-
角色身份Role Identity
-
- {foreach $bases as $base} - - {/foreach} -
-
- {/if} - {if !empty($authorizes)} -
-
访问权限Role Permission
-
- {if isset($vo.username) and $vo.username eq $superName} - 超级用户拥所有访问权限,不需要配置权限。 - {else}{foreach $authorizes as $authorize} - - {/foreach}{/if} -
-
- {/if} -
- {/if} - -
- 用户资料 -
-
- -
-
- -
-
- -
-
- -
- -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
\ No newline at end of file diff --git a/app/admin/view/user/index.html b/app/admin/view/user/index.html deleted file mode 100644 index 2dc8e0d77..000000000 --- a/app/admin/view/user/index.html +++ /dev/null @@ -1,116 +0,0 @@ -{extend name='table'} - -{block name="button"} -{if isset($type) and $type eq 'index'} - - - - -批量禁用 - -{else} - -批量恢复 - - -批量删除 - -{/if} -{/block} - -{block name="content"} -
- -
- {include file='user/index_search'} -
-
-
- - - - - - - - - -{/block} diff --git a/app/admin/view/user/index_search.html b/app/admin/view/user/index_search.html deleted file mode 100644 index 5a959411c..000000000 --- a/app/admin/view/user/index_search.html +++ /dev/null @@ -1,58 +0,0 @@ - \ No newline at end of file diff --git a/app/admin/view/user/pass.html b/app/admin/view/user/pass.html deleted file mode 100644 index 3627f3a6f..000000000 --- a/app/admin/view/user/pass.html +++ /dev/null @@ -1,50 +0,0 @@ -
-
- -
- -

登录用户账号创建后,不允许再次修改。

-
- - -
- -

请输入旧密码来验证修改权限,旧密码不限制格式。

-
- - -
- -

密码必须包含大小写字母、数字、符号的任意两者组合。

-
- -
- -

密码必须包含大小写字母、数字、符号的任意两者组合。

-
-
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
\ No newline at end of file diff --git a/app/data/command/OrderClean.php b/app/data/command/OrderClean.php deleted file mode 100644 index 78a267584..000000000 --- a/app/data/command/OrderClean.php +++ /dev/null @@ -1,82 +0,0 @@ -setName('xdata:OrderClean'); - $this->setDescription('批量清理商城订单数据'); - } - - /** - * 业务指令执行 - * @param \think\console\Input $input - * @param \think\console\Output $output - * @return void - * @throws \think\admin\Exception - */ - protected function execute(Input $input, Output $output) - { - $this->_autoCancelOrder(); - $this->_autoRemoveOrder(); - } - - /** - * 自动取消30分钟未支付的订单 - * @return void - * @throws \think\admin\Exception - */ - private function _autoCancelOrder() - { - try { - $map = [['status', '<', 3], ['payment_status', '=', 0]]; - $map[] = ['create_at', '<', date('Y-m-d H:i:s', strtotime('-30 minutes'))]; - [$count, $total] = [0, ($result = ShopOrder::mk()->where($map)->select())->count()]; - $result->map(function (Model $item) use ($total, &$count) { - $this->queue->message($total, ++$count, "开始取消未支付的订单 {$item['order_no']}"); - $item->save(['status' => 0, 'cancel_status' => 1, 'cancel_datetime' => date('Y-m-d H:i:s'), 'cancel_remark' => '自动取消30分钟未完成支付']); - OrderService::stock($item['order_no']); - $this->queue->message($total, $count, "完成取消未支付的订单 {$item['order_no']}", 1); - }); - } catch (\Exception $exception) { - $this->queue->error($exception->getMessage()); - } - } - - /** - * 自动清理已经取消的订单 - * @return void - * @throws \think\admin\Exception - */ - private function _autoRemoveOrder() - { - try { - $map = [['status', '=', 0], ['payment_status', '=', 0]]; - $map[] = ['create_at', '<', date('Y-m-d H:i:s', strtotime('-3 days'))]; - [$count, $total] = [0, ($result = ShopOrder::mk()->where($map)->select())->count()]; - $result->map(function (Model $item) use ($total, &$count) { - $this->queue->message($total, ++$count, "开始清理已取消的订单 {$item['order_no']}"); - ShopOrder::mk()->where(['order_no' => $item['order_no']])->delete(); - ShopOrderItem::mk()->where(['order_no' => $item['order_no']])->delete(); - $this->queue->message($total, $count, "完成清理已取消的订单 {$item['order_no']}", 1); - }); - } catch (\Exception $exception) { - $this->queue->error($exception->getMessage()); - } - } -} \ No newline at end of file diff --git a/app/data/command/UserAgent.php b/app/data/command/UserAgent.php deleted file mode 100644 index 5c4ac539b..000000000 --- a/app/data/command/UserAgent.php +++ /dev/null @@ -1,79 +0,0 @@ -setName('xdata:UserAgent'); - $this->addArgument('uuid', Argument::OPTIONAL, '目标用户', ''); - $this->addArgument('puid', Argument::OPTIONAL, '上级代理', ''); - $this->setDescription('重新设置用户上级代理, 参数:UUID PUID'); - } - - /** - * @param \think\console\Input $input - * @param \think\console\Output $output - * @return void - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function execute(Input $input, Output $output) - { - [$uuid, $puid] = [$input->getArgument('uuid'), $input->getArgument('puid')]; - if (empty($uuid)) $this->setQueueError("参数UID无效,请传入正确的参数!"); - if (empty($puid)) $this->setQueueError("参数PID无效,请传入正确的参数!"); - - // 检查当前用户资料 - $user = DataUser::mk()->where(['id' => $uuid])->find(); - if (empty($user)) $this->setQueueError("读取用户数据失败!"); - - // 检查上级代理用户 - $parant = DataUser::mk()->where(['id' => $puid])->find(); - if (empty($parant)) $this->setQueueError('读取代理数据失败!'); - - // 检查异常关系处理 - if (stripos($parant['path'], "-{$user['id']}-")) { - $this->setQueueError('不能把下级设置为代理!'); - } - - // 更新自己的代理关系 - $path1 = rtrim($parant['path'] ?: '-', '-') . "-{$parant['id']}-"; - DataUser::mk()->where(['id' => $user['id']])->update([ - 'path' => $path1, 'layer' => substr_count($path1, '-'), - 'pid0' => $parant['id'], 'pid1' => $parant['id'], 'pid2' => $parant['pid1'], - ]); - UserUpgradeService::upgrade($user['id'], true); - $this->setQueueMessage(1, 1, "更新指定用户[{$user['id']}]代理绑定成功!"); - - // 更新下级的代理关系 - $path2 = "{$user['path']}{$user['id']}-"; - [$total, $count] = [DataUser::mk()->whereLike('path', "{$path2}%")->count(), 0]; - foreach (DataUser::mk()->whereLike('path', "{$path2}%")->order('layer desc')->select() as $vo) { - $this->setQueueMessage($total, ++$count, "开始更新下级用户[{$vo['id']}]代理绑定!"); - // 更新下级用户代理数据 - $path3 = preg_replace("#^{$path2}#", "{$path1}{$user['id']}-", $vo['path']); - $attrs = array_reverse(str2arr($path3, '-')); - DataUser::mk()->where(['id' => $vo['id']])->update([ - 'path' => $path3, 'layer' => substr_count($path3, '-'), - 'pid0' => $attrs[0] ?? 0, 'pid1' => $attrs[0] ?? 0, 'pid2' => $attrs[1] ?? 0, - ]); - $this->setQueueMessage($total, $count, "完成更新下级用户[{$vo['id']}]代理绑定!", 1); - } - } -} \ No newline at end of file diff --git a/app/data/command/UserAmount.php b/app/data/command/UserAmount.php deleted file mode 100644 index 106e68d6d..000000000 --- a/app/data/command/UserAmount.php +++ /dev/null @@ -1,45 +0,0 @@ -setName('xdata:UserAmount'); - $this->setDescription('批量重新计算余额返利'); - } - - /** - * @param \think\console\Input $input - * @param \think\console\Output $output - * @return void - * @throws \think\admin\Exception - * @throws \think\db\exception\DbException - */ - protected function execute(Input $input, Output $output) - { - [$total, $count, $error] = [DataUser::mk()->count(), 0, 0]; - foreach (DataUser::mk()->field('id')->cursor() as $user) try { - $this->queue->message($total, ++$count, "刷新用户 [{$user['id']}] 余额及返利开始"); - UserRebateService::amount($user['id']) && UserBalanceService::amount($user['id']); - $this->queue->message($total, $count, "刷新用户 [{$user['id']}] 余额及返利完成", 1); - } catch (\Exception $exception) { - $error++; - $this->queue->message($total, $count, "刷新用户 [{$user['id']}] 余额及返利失败, {$exception->getMessage()}", 1); - } - $this->setQueueSuccess("此次共处理 {$total} 个刷新操作, 其中有 {$error} 个刷新失败。"); - } -} \ No newline at end of file diff --git a/app/data/command/UserTransfer.php b/app/data/command/UserTransfer.php deleted file mode 100644 index 39cbdf848..000000000 --- a/app/data/command/UserTransfer.php +++ /dev/null @@ -1,263 +0,0 @@ -setName('xdata:UserTransfer'); - $this->setDescription('批量执行线上打款操作'); - } - - /** - * 执行微信提现操作 - * @param \think\console\Input $input - * @param \think\console\Output $output - * @return void - * @throws \think\admin\Exception - * @throws \think\db\exception\DbException - */ - protected function execute(Input $input, Output $output) - { - $map = [['type', 'in', ['wechat_banks', 'wechat_wallet']], ['status', 'in', [3, 4]]]; - [$total, $count, $error] = [DataUserTransfer::mk()->where($map)->count(), 0, 0]; - foreach (DataUserTransfer::mk()->where($map)->cursor() as $vo) try { - $this->queue->message($total, ++$count, "开始处理订单 {$vo['code']} 提现"); - if ($vo['status'] === 3) { - $this->queue->message($total, $count, "尝试处理订单 {$vo['code']} 打款", 1); - if ($vo['type'] === 'wechat_banks') { - [$config, $result] = $this->createTransferBank($vo); - } else { - [$config, $result] = $this->createTransferWallet($vo); - } - if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') { - DataUserTransfer::mk()->where(['code' => $vo['code']])->update([ - 'status' => 4, - 'appid' => $config['appid'], - 'openid' => $config['openid'], - 'trade_no' => $result['partner_trade_no'], - 'trade_time' => $result['payment_time'] ?? date('Y-m-d H:i:s'), - 'change_time' => date('Y-m-d H:i:s'), - 'change_desc' => '创建微信提现成功', - ]); - } else { - DataUserTransfer::mk()->where(['code' => $vo['code']])->update([ - 'change_time' => date('Y-m-d H:i:s'), 'change_desc' => $result['err_code_des'] ?? '线上提现失败', - ]); - } - } elseif ($vo['status'] === 4) { - $this->queue->message($total, $count, "刷新提现订单 {$vo['code']} 状态", 1); - if ($vo['type'] === 'wechat_banks') { - $this->queryTransferBank($vo); - } else { - $this->queryTransferWallet($vo); - } - } - } catch (\Exception $exception) { - $error++; - $this->queue->message($total, $count, "处理提现订单 {$vo['code']} 失败, {$exception->getMessage()}", 1); - DataUserTransfer::mk()->where(['code' => $vo['code']])->update([ - 'change_time' => date('Y-m-d H:i:s'), 'change_desc' => $exception->getMessage(), - ]); - } - $this->setQueueSuccess("此次共处理 {$total} 笔提现操作, 其中有 {$error} 笔处理失败。"); - } - - /** - * 尝试提现转账到银行卡 - * @param array $item - * @return array [config, result] - * @throws \WeChat\Exceptions\InvalidDecryptException - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function createTransferBank(array $item): array - { - $config = $this->getConfig($item['uuid']); - return [$config, TransfersBank::instance($config)->create([ - 'partner_trade_no' => $item['code'], - 'enc_bank_no' => $item['bank_code'], - 'enc_true_name' => $item['bank_user'], - 'bank_code' => $item['bank_wseq'], - 'amount' => intval($item['amount'] - $item['charge_amount']) * 100, - 'desc' => '微信银行卡提现', - ])]; - } - - /** - * 获取微信提现参数 - * @param int $uuid - * @return array - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function getConfig(int $uuid): array - { - $data = sysdata('TransferWxpay'); - if (empty($data)) throw new Exception('未配置微信提现商户'); - // 商户证书文件处理 - $local = LocalStorage::instance(); - if (!$local->has($file1 = "{$data['wechat_mch_id']}_key.pem", true)) { - $local->set($file1, $data['wechat_mch_key_text'], true); - } - if (!$local->has($file2 = "{$data['wechat_mch_id']}_cert.pem", true)) { - $local->set($file2, $data['wechat_mch_cert_text'], true); - } - // 获取用户支付信息 - $result = $this->getWechatInfo($uuid, $data['wechat_type']); - if (empty($result)) throw new Exception('无法读取打款数据'); - return [ - 'appid' => $result[0], - 'openid' => $result[1], - 'mch_id' => $data['wechat_mch_id'], - 'mch_key' => $data['wechat_mch_key'], - 'ssl_key' => $local->path($file1, true), - 'ssl_cer' => $local->path($file2, true), - 'cache_path' => with_path('runtime/wechat'), - ]; - } - - /** - * 根据配置获取用户OPENID - * @param int $uuid - * @param string $type - * @return mixed|null - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function getWechatInfo(int $uuid, string $type): ?array - { - $user = DataUser::mk()->where(['id' => $uuid])->findOrEmpty(); - if ($user->isEmpty()) return null; - $appid1 = sysconf('data.wxapp_appid'); - if (strtolower(sysconf('wechat.type')) === 'api') { - $appid2 = sysconf('wechat.appid'); - } else { - $appid2 = sysconf('wechat.thr_appid'); - } - if ($type === 'normal') { - if (!empty($user['openid1'])) return [$appid1, $user['openid1']]; - if (!empty($user['openid2'])) return [$appid2, $user['openid2']]; - } - if ($type === 'wxapp' && !empty($user['openid1'])) { - return [$appid1, $user['openid1']]; - } - if ($type === 'wechat' && !empty($user['openid2'])) { - return [$appid2, $user['openid2']]; - } - return null; - } - - /** - * 尝试提现转账到微信钱包 - * @param array $item - * @return array [config, result] - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function createTransferWallet(array $item): array - { - $config = $this->getConfig($item['uuid']); - return [$config, Transfers::instance($config)->create([ - 'openid' => $config['openid'], - 'amount' => intval($item['amount'] - $item['charge_amount']) * 100, - 'partner_trade_no' => $item['code'], - 'spbill_create_ip' => '127.0.0.1', - 'check_name' => 'NO_CHECK', - 'desc' => '微信余额提现', - ])]; - } - - /** - * 查询更新提现打款状态 - * @param \think\Model|array $item - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function queryTransferBank($item) - { - $config = $this->getConfig($item['uuid']); - [$config['appid'], $config['openid']] = [$item['appid'], $item['openid']]; - $result = TransfersBank::instance($config)->query($item['trade_no']); - if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') { - if ($result['status'] === 'SUCCESS') { - DataUserTransfer::mk()->where(['code' => $item['code']])->update([ - 'status' => 5, - 'appid' => $config['appid'], - 'openid' => $config['openid'], - 'trade_time' => $result['pay_succ_time'] ?: date('Y-m-d H:i:s'), - 'change_time' => date('Y-m-d H:i:s'), - 'change_desc' => '微信提现打款成功', - ]); - } - if (in_array($result['status'], ['FAILED', 'BANK_FAIL'])) { - DataUserTransfer::mk()->where(['code' => $item['code']])->update([ - 'status' => 0, - 'change_time' => date('Y-m-d H:i:s'), - 'change_desc' => '微信提现打款失败', - ]); - // 刷新用户可提现余额 - UserRebateService::amount($item['uuid']); - } - } - } - - /** - * 查询更新提现打款状态 - * @param \think\Model|array $item - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function queryTransferWallet($item) - { - $config = $this->getConfig($item['uuid']); - [$config['appid'], $config['openid']] = [$item['appid'], $item['openid']]; - $result = Transfers::instance($config)->query($item['trade_no']); - if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') { - DataUserTransfer::mk()->where(['code' => $item['code']])->update([ - 'status' => 5, - 'appid' => $config['appid'], - 'openid' => $config['openid'], - 'trade_time' => $result['payment_time'], - 'change_time' => date('Y-m-d H:i:s'), - 'change_desc' => '微信提现打款成功', - ]); - } - } -} \ No newline at end of file diff --git a/app/data/command/UserUpgrade.php b/app/data/command/UserUpgrade.php deleted file mode 100644 index 30779265c..000000000 --- a/app/data/command/UserUpgrade.php +++ /dev/null @@ -1,47 +0,0 @@ -setName('xdata:UserUpgrade'); - $this->setDescription('批量重新计算用户等级'); - } - - /** - * @param \think\console\Input $input - * @param \think\console\Output $output - * @return void - * @throws \think\admin\Exception - */ - protected function execute(Input $input, Output $output) - { - try { - [$total, $count] = [DataUser::mk()->count(), 0]; - foreach (DataUser::mk()->field('id')->cursor() as $user) { - $this->queue->message($total, ++$count, "正在计算用户 [{$user['id']}] 的等级"); - UserUpgradeService::upgrade($user['id']); - $this->queue->message($total, $count, "完成计算用户 [{$user['id']}] 的等级", 1); - } - $this->setQueueSuccess("此次共重新计算 {$total} 个用户等级。"); - } catch (Exception $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->setQueueError($exception->getMessage()); - } - } -} \ No newline at end of file diff --git a/app/data/controller/api/Auth.php b/app/data/controller/api/Auth.php deleted file mode 100644 index 5efb0058a..000000000 --- a/app/data/controller/api/Auth.php +++ /dev/null @@ -1,95 +0,0 @@ ->> - * >>> api-name 接口类型 - * >>> api-token 接口认证 - * >>> - * --- 手机浏览器访问 wap - * --- 电脑浏览器访问 web - * --- 微信小程序访问 wxapp - * --- 微信服务号访问 wechat - * --- 苹果应用接口访问 isoapp - * --- 安卓应用接口访问 android - * @var string - */ - protected $type; - - /** - * 当前用户编号 - * @var integer - */ - protected $uuid; - - /** - * 当前用户数据 - * @var array - */ - protected $user; - - /** - * 控制器初始化 - */ - protected function initialize() - { - // 检查接口类型 - $this->type = $this->request->header('api-name'); - if (empty($this->type)) $this->error("接口类型异常!"); - if (!isset(UserAdminService::TYPES[$this->type])) { - $this->error("接口类型[{$this->type}]未定义!"); - } - // 读取用户数据 - $this->user = $this->getUser(); - $this->uuid = $this->user['id'] ?? ''; - if (empty($this->uuid)) { - $this->error('用户登录失败!', '{-null-}', 401); - } - } - - /** - * 获取用户数据 - * @return array - */ - protected function getUser(): array - { - try { - if (empty($this->uuid)) { - $token = $this->request->header('api-token'); - if (empty($token)) $this->error('登录认证不能为空!'); - [$state, $info, $this->uuid] = UserTokenService::check($this->type, $token); - if (empty($state)) $this->error($info, '{-null-}', 401); - } - return UserAdminService::get($this->uuid, $this->type); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } - - /** - * 显示用户禁用提示 - */ - protected function checkUserStatus() - { - if (empty($this->user['status'])) { - $this->error('账户已被冻结!'); - } - } -} \ No newline at end of file diff --git a/app/data/controller/api/Data.php b/app/data/controller/api/Data.php deleted file mode 100644 index a9520ee8b..000000000 --- a/app/data/controller/api/Data.php +++ /dev/null @@ -1,64 +0,0 @@ -_vali(['name.require' => '数据名称不能为空!']); - $extra = ['about', 'slider', 'agreement', 'cropper']; // 其他数据 - if (in_array($data['name'], $extra) || isset(SystemBase::items('页面内容')[$data['name']])) { - $this->success('获取数据对象', sysdata($data['name'])); - } else { - $this->error('获取数据失败', []); - } - } - - /** - * 图片内容数据 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getSlider() - { - $this->keys = input('keys', '首页图片'); - if (isset(SystemBase::items('图片内容')[$this->keys])) { - $this->success('获取图片内容', sysdata($this->keys)); - } else { - $this->error('获取图片失败', []); - } - } - - /** - * 系统通知数据 - */ - public function getNotify() - { - BaseUserMessage::mQuery(null, function (QueryHelper $query) { - if (($id = input('id')) > 0) { - BaseUserMessage::mk()->where(['id' => $id])->inc('num_read')->update([]); - } - $query->equal('id')->where(['status' => 1, 'deleted' => 0]); - $this->success('获取系统通知', $query->order('sort desc,id desc')->page(true, false, false, 20)); - }); - } -} \ No newline at end of file diff --git a/app/data/controller/api/Goods.php b/app/data/controller/api/Goods.php deleted file mode 100644 index 5f5b3bb63..000000000 --- a/app/data/controller/api/Goods.php +++ /dev/null @@ -1,63 +0,0 @@ -success('获取分类成功', ShopGoodsCate::treeData()); - } - - /** - * 获取标签数据 - */ - public function getMark() - { - $this->success('获取标签成功', ShopGoodsMark::items()); - } - - /** - * 获取商品数据 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getGoods() - { - // 更新访问统计 - $map = $this->_vali(['code.default' => '']); - if ($map['code']) ShopGoods::mk()->where($map)->inc('num_read')->update([]); - // 商品数据处理 - $query = ShopGoods::mQuery()->like('name,marks,cateids,payment')->equal('code,vip_entry'); - $result = $query->where(['deleted' => 0, 'status' => 1])->order('sort desc,id desc')->page(true, false, false, 10); - if (count($result['list']) > 0) GoodsService::bindData($result['list']); - $this->success('获取商品数据', $result); - } - - /** - * 获取配送区域 - */ - public function getRegion() - { - $this->success('获取区域成功', ExpressService::region(3, 1)); - } -} \ No newline at end of file diff --git a/app/data/controller/api/Login.php b/app/data/controller/api/Login.php deleted file mode 100644 index 6ef763885..000000000 --- a/app/data/controller/api/Login.php +++ /dev/null @@ -1,109 +0,0 @@ -type = $this->request->request('api'); - $this->type = $this->type ?: $this->request->header('api-name'); - $this->type = $this->type ?: $this->request->header('api-type'); - $this->type = $this->type ?: UserAdminService::API_TYPE_WAP; - if (empty(UserAdminService::TYPES[$this->type])) { - $this->error("接口支付[{$this->type}]未定义规则!"); - } - } - - /** - * 用户登录接口 - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function in() - { - $data = $this->_vali([ - 'phone.mobile' => '手机号码格式错误!', - 'phone.require' => '手机号码不能为空!', - 'password.require' => '登录密码不能为空!', - ]); - $map = ['deleted' => 0, 'phone' => $data['phone']]; - $user = DataUser::mk()->where($map)->findOrEmpty(); - if ($user->isEmpty()) $this->error('该手机号还没有注册哦!'); - if (empty($user['status'])) $this->error('该用户账号状态异常!'); - if (md5($data['password']) === $user['password']) { - $this->success('手机登录成功!', UserAdminService::set($map, [], $this->type, true)); - } else { - $this->error('账号登录失败,请稍候再试!'); - } - } - - /** - * 用户统一注册入口 - * @throws \think\admin\Exception - * @throws \think\db\exception\DbException - */ - public function register() - { - $data = $this->_vali([ - 'region_province.default' => '', - 'region_city.default' => '', - 'region_area.default' => '', - 'username.default' => '', - 'phone.mobile' => '手机格式错误!', - 'phone.require' => '手机不能为空!', - 'verify.require' => '验证码不能为空!', - 'password.require' => '登录密码不能为空!', - ]); - if (!MessageService::instance()->checkVerifyCode($data['verify'], $data['phone'])) { - $this->error('手机短信验证失败!'); - } - $map = ['phone' => $data['phone'], 'deleted' => 0]; - if (DataUser::mk()->where($map)->count() > 0) { - $this->error('手机号已注册,请使用其它手机号!'); - } - $data['password'] = md5($data['password']); - $user = UserAdminService::set($map, $data, $this->type, true); - empty($user) ? $this->error('手机注册失败!') : $this->success('用户注册成功!', $user); - } - - /** - * 发送短信验证码 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function sendsms() - { - $data = $this->_vali([ - 'phone.mobile' => '手机号格式错误!', - 'phone.require' => '手机号不能为空!', - 'secure.require' => '安全码不能为空!', - ]); - if ($data['secure'] !== sysconf('zt.secure_code')) $this->error('接口安全码错误!'); - [$state, $message, $data] = MessageService::instance()->sendVerifyCode($data['phone']); - $state ? $this->success($message, $data) : $this->error($message, $data); - } -} \ No newline at end of file diff --git a/app/data/controller/api/News.php b/app/data/controller/api/News.php deleted file mode 100644 index e6879bdba..000000000 --- a/app/data/controller/api/News.php +++ /dev/null @@ -1,68 +0,0 @@ -like('name'); - $query->where(['status' => 1, 'deleted' => 0])->withoutField('sort,status,deleted'); - $this->success('获取文章标签', $query->order('sort desc,id desc')->page(false, false)); - } - - /** - * 获取文章内容列表 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getItem() - { - if ($code = input('code', '')) { - DataNewsItem::mk()->where(['code' => $code])->inc('num_read')->update([]); - if (($uuid = input('uuid', 0)) > 0) { - $data = ['uuid' => $uuid, 'code' => $code, 'type' => 3, 'status' => 2]; - DataNewsXCollect::mk()->where($data)->delete(); - DataNewsXCollect::mk()->insert($data); - } - } - $query = DataNewsItem::mQuery()->like('name,mark')->equal('id,code'); - $query->where(['deleted' => 0, 'status' => 1])->withoutField('sort,status,deleted'); - $result = $query->order('sort desc,id desc')->page(true, false, false, 15); - NewsService::buildData($result['list'], input('uuid', 0)); - $this->success('获取文章内容', $result); - } - - /** - * 获取文章评论 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getComment() - { - $map = $this->_vali(['code.require' => '文章不能为空!']); - $query = DataNewsXCollect::mQuery()->where(['type' => 4, 'status' => 2]); - $result = $query->where($map)->order('id desc')->page(true, false, false, 15); - NewsService::buildListByUidAndCode($result['list']); - $this->success('获取评论成功', $result); - } -} \ No newline at end of file diff --git a/app/data/controller/api/Notify.php b/app/data/controller/api/Notify.php deleted file mode 100644 index e8a076dab..000000000 --- a/app/data/controller/api/Notify.php +++ /dev/null @@ -1,64 +0,0 @@ -notify(); - } else { - return 'success'; - } - } - - /** - * 支付宝支付通知 - * @param string $scene 支付场景 - * @param string $param 支付参数 - * @return string - * @throws \think\admin\Exception - */ - public function alipay(string $scene = 'order', string $param = ''): string - { - if (strtolower($scene) === 'order') { - return AlipayPaymentService::instance($param)->notify(); - } else { - return 'success'; - } - } - - /** - * 汇聚支付通知 - * @param string $scene 支付场景 - * @param string $param 支付参数 - * @return string - * @throws \think\admin\Exception - */ - public function joinpay(string $scene = 'order', string $param = ''): string - { - if (strtolower($scene) === 'order') { - return JoinpayPaymentService::instance($param)->notify(); - } else { - return 'success'; - } - } -} \ No newline at end of file diff --git a/app/data/controller/api/Wechat.php b/app/data/controller/api/Wechat.php deleted file mode 100644 index 9212ffb63..000000000 --- a/app/data/controller/api/Wechat.php +++ /dev/null @@ -1,137 +0,0 @@ - - * - * - * 授权模式支持两种模块,参数 mode=0 时为静默授权,mode=1 时为完整授权 - * 注意:回跳地址默认从 Header 中的 http_referer 获取,也可以传 source 参数 - */ -class Wechat extends Controller -{ - - /** - * 接口认证类型 - * @var string - */ - private $type = UserAdminService::API_TYPE_WECHAT; - - /** - * 唯一绑定字段 - * @var string - */ - private $field; - - /** - * 控制器初始化 - * @return $this - */ - protected function initialize(): Wechat - { - if (empty(UserAdminService::TYPES[$this->type]['auth'])) { - $this->error("接口类型[{$this->type}]没有定义规则"); - } else { - $this->field = UserAdminService::TYPES[$this->type]['auth']; - } - return $this; - } - - /** - * 获取 JSSDK 签名 - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function jssdk() - { - $url = input('source') ?: $this->request->server('http_referer'); - $this->success('获取签名参数', WechatService::instance()->getWebJssdkSign($url)); - } - - /** - * 加载网页授权数据 - * @return \think\Response - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function oauth(): Response - { - $source = input('source') ?: $this->request->server('http_referer'); - [$mode, $script, $wechat] = [input('mode', 1), [], WechatService::instance()]; - $result = $wechat->getWebOauthInfo($source ?: $this->request->url(true), $mode, false); - if (empty($result['openid'])) { - $script[] = 'alert("Wechat WebOauth failed.")'; - } else { - $data = $result['fansinfo'] ?? []; - $data[$this->field] = $data['openid']; - $data['base_sex'] = ['未知', '男', '女'][$data['sex']] ?? '未知'; - if (isset($result['unionid'])) $data['unionid'] = $result['unionid']; - if (isset($data['headimgurl'])) $data['headimg'] = $data['headimgurl']; - $map = UserAdminService::getUserUniMap($this->field, $data[$this->field], $data['unionid'] ?? ''); - $result['userinfo'] = UserAdminService::set($map, array_merge($map, $data), $this->type, true); - $script[] = "window.WeChatOpenid='{$result['openid']}'"; - $script[] = 'window.WeChatFansInfo=' . json_encode($result['fansinfo'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - $script[] = 'window.WeChatUserInfo=' . json_encode($result['userinfo'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - } - $script[] = ''; - return Response::create(join(";\n", $script))->contentType('application/x-javascript'); - } - - /** - * 网页授权测试 - * 使用网页直接访问此链接 - * @return string - */ - public function otest(): string - { - return << - - - 微信网页授权测试 - - - - - -
当前链接
-
{$this->request->scheme()}://{$this->request->host()}/data/api.wechat/oauth?mode=1
- -
粉丝数据
-
待网页授权,加载粉丝数据...
- -
用户数据
-
待网页授权,加载用户数据...
- - - - - -EOL; - } -} \ No newline at end of file diff --git a/app/data/controller/api/Wxapp.php b/app/data/controller/api/Wxapp.php deleted file mode 100644 index 86e68152e..000000000 --- a/app/data/controller/api/Wxapp.php +++ /dev/null @@ -1,200 +0,0 @@ -config = [ - 'appid' => $wxapp['appid'] ?? '', - 'appsecret' => $wxapp['appkey'] ?? '', - 'cache_path' => with_path('runtime/wechat'), - ]; - if (empty(UserAdminService::TYPES[$this->type]['auth'])) { - $this->error("接口类型[{$this->type}]没有定义规则"); - } else { - $this->field = UserAdminService::TYPES[$this->type]['auth']; - } - } - - /** - * 授权Code换取会话信息 - * @throws \think\admin\Exception - * @throws \think\db\exception\DbException - */ - public function session() - { - $input = $this->_vali(['code.require' => '登录凭证CODE不能为空!']); - [$openid, $unionid, $session] = $this->applySessionKey($input['code']); - $map = UserAdminService::getUserUniMap($this->field, $openid, $unionid); - $data = [$this->field => $openid, 'session_key' => $session]; - if (!empty($unionid)) $data['unionid'] = $unionid; - $this->success('授权换取成功!', UserAdminService::set($map, $data, $this->type, true)); - } - - /** - * 小程序数据解密 - */ - public function decode() - { - try { - $input = $this->_vali([ - 'iv.require' => '解密向量不能为空!', - 'code.require' => '授权CODE不能为空!', - 'encrypted.require' => '加密内容不能为空!', - ]); - [$openid, $unionid, $input['session_key']] = $this->applySessionKey($input['code']); - $result = Crypt::instance($this->config)->decode($input['iv'], $input['session_key'], $input['encrypted']); - if (is_array($result) && isset($result['avatarUrl']) && isset($result['nickName'])) { - $data = [$this->field => $openid, 'nickname' => $result['nickName'], 'headimg' => $result['avatarUrl']]; - $data['base_sex'] = ['-', '男', '女'][$result['gender']] ?? '-'; - if (!empty($unionid)) $data['unionid'] = $unionid; - $map = UserAdminService::getUserUniMap($this->field, $openid, $unionid); - $this->success('数据解密成功!', UserAdminService::set($map, $data, $this->type, true)); - } elseif (is_array($result)) { - $this->success('数据解密成功!', $result); - } else { - $this->error('数据处理失败,请稍候再试!'); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error("数据处理失败,{$exception->getMessage()}"); - } - } - - /** - * 授权CODE换取会话信息 - * @param string $code 换取授权CODE - * @return array [openid, sessionkey] - */ - private function applySessionKey(string $code): array - { - try { - $cache = $this->app->cache->get($code, []); - if (isset($cache['openid']) && isset($cache['session_key'])) { - return [$cache['openid'], $cache['unionid'] ?? '', $cache['session_key']]; - } - $result = Crypt::instance($this->config)->session($code); - if (isset($result['openid']) && isset($result['session_key'])) { - $this->app->cache->set($code, $result, 60); - return [$result['openid'], $result['unionid'] ?? '', $result['session_key']]; - } elseif (isset($result['errmsg'])) { - $this->error($result['errmsg']); - } else { - $this->error("授权换取失败,请稍候再试!"); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error("授权换取失败,{$exception->getMessage()}"); - } - } - - /** - * 获取小程序码 - */ - public function qrcode(): Response - { - try { - $data = $this->_vali([ - 'size.default' => 430, - 'type.default' => 'base64', - 'path.require' => '跳转路径不能为空!', - ]); - $result = Qrcode::instance($this->config)->createMiniPath($data['path'], $data['size']); - if ($data['type'] === 'base64') { - $this->success('生成小程序码成功!', [ - 'base64' => 'data:image/png;base64,' . base64_encode($result), - ]); - } else { - return response($result)->contentType('image/png'); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } - - /** - * 获取直播列表 - */ - public function getLiveList() - { - try { - $data = $this->_vali(['start.default' => 0, 'limit.default' => 10]); - $list = Live::instance($this->config)->getLiveList($data['start'], $data['limit']); - $this->success('获取直播列表成功!', $list); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } - - /** - * 获取回放源视频 - */ - public function getLiveInfo() - { - try { - $data = $this->_vali([ - 'start.default' => 0, - 'limit.default' => 10, - 'action.default' => 'get_replay', - 'room_id.require' => '直播间不能为空', - ]); - $result = Live::instance($this->config)->getLiveInfo($data); - $this->success('获取回放视频成功!', $result); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } -} \ No newline at end of file diff --git a/app/data/controller/api/auth/Address.php b/app/data/controller/api/auth/Address.php deleted file mode 100644 index c7e1546d2..000000000 --- a/app/data/controller/api/auth/Address.php +++ /dev/null @@ -1,132 +0,0 @@ -_vali([ - 'uuid.value' => $this->uuid, - 'type.default' => 0, - 'code.default' => '', - 'idcode.default' => '', // 身份证号码 - 'idimg1.default' => '', // 身份证正面 - 'idimg2.default' => '', // 身份证反面 - 'type.in:0,1' => '地址状态不在范围!', - 'name.require' => '收货姓名不能为空!', - 'phone.mobile' => '收货手机格式错误!', - 'phone.require' => '收货手机不能为空!', - 'province.require' => '地址省份不能为空!', - 'city.require' => '地址城市不能为空!', - 'area.require' => '地址区域不能为空!', - 'address.require' => '详情地址不能为空!', - 'deleted.value' => 0, - ]); - if (empty($data['code'])) { - unset($data['code']); - $count = DataUserAddress::mk()->where($data)->count(); - if ($count > 0) $this->error('抱歉,该地址已经存在!'); - $data['code'] = CodeExtend::uniqidDate(20, 'A'); - if (DataUserAddress::mk()->insert($data) === false) { - $this->error('添加地址失败!'); - } - } else { - $map = ['uuid' => $this->uuid, 'code' => $data['code']]; - $addr = DataUserAddress::mk()->where($map)->find(); - if (empty($addr)) $this->error('修改地址不存在!'); - DataUserAddress::mk()->where($map)->update($data); - } - // 去除其它默认选项 - if (isset($data['type']) && $data['type'] > 0) { - $map = [['uuid', '=', $this->uuid], ['code', '<>', $data['code']]]; - DataUserAddress::mk()->where($map)->update(['type' => 0]); - } - $this->success('地址保存成功!', $this->getAddress($data['code'])); - } - - /** - * 获取收货地址 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function get() - { - $query = DataUserAddress::mQuery()->withoutField('deleted'); - $query->equal('code')->where(['uuid' => $this->uuid, 'deleted' => 0]); - $result = $query->order('type desc,id desc')->page(false, false, false, 15); - $this->success('获取地址数据!', $result); - } - - /** - * 修改地址状态 - */ - public function state() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'type.in:0,1' => '地址状态不在范围!', - 'type.require' => '地址状态不能为空!', - 'code.require' => '地址编号不能为空!', - ]); - // 检查地址是否存在 - $map = ['uuid' => $data['uuid'], 'code' => $data['code']]; - if (DataUserAddress::mk()->where($map)->count() < 1) { - $this->error('修改的地址不存在!'); - } - // 更新默认地址状态 - $data['type'] = intval($data['type']); - DataUserAddress::mk()->where($map)->update(['type' => $data['type']]); - // 去除其它默认选项 - if ($data['type'] > 0) { - $map = [['uuid', '=', $this->uuid], ['code', '<>', $data['code']]]; - DataUserAddress::mk()->where($map)->update(['type' => 0]); - } - $this->success('默认设置成功!', $this->getAddress($data['code'])); - } - - /** - * 删除收货地址 - */ - public function remove() - { - $map = $this->_vali([ - 'uuid.value' => $this->uuid, - 'code.require' => '地址不能为空!', - ]); - $item = DataUserAddress::mk()->where($map)->findOrEmpty(); - if ($item->isEmpty()) $this->error('需要删除的地址不存在!'); - if ($item->save(['deleted' => 1]) !== false) { - $this->success('删除地址成功!'); - } else { - $this->error('删除地址失败!'); - } - } - - /** - * 获取指定的地址 - * @param string $code - * @return null|array - */ - private function getAddress(string $code): array - { - $map = ['code' => $code, 'uuid' => $this->uuid, 'deleted' => 0]; - return DataUserAddress::mk()->withoutField('deleted')->where($map)->findOrEmpty()->toArray(); - } -} \ No newline at end of file diff --git a/app/data/controller/api/auth/Balance.php b/app/data/controller/api/auth/Balance.php deleted file mode 100644 index f51f9d37a..000000000 --- a/app/data/controller/api/auth/Balance.php +++ /dev/null @@ -1,27 +0,0 @@ -withoutField('deleted,create_by'); - $query->where(['uuid' => $this->uuid, 'deleted' => 0])->like('create_at#date'); - $this->success('获取数据成功', $query->order('id desc')->page(true, false, false, 10)); - }); - } -} \ No newline at end of file diff --git a/app/data/controller/api/auth/Center.php b/app/data/controller/api/auth/Center.php deleted file mode 100644 index b0a038cb8..000000000 --- a/app/data/controller/api/auth/Center.php +++ /dev/null @@ -1,150 +0,0 @@ -_vali([ - 'headimg.default' => '', - 'username.default' => '', - 'base_age.default' => '', - 'base_sex.default' => '', - 'base_height.default' => '', - 'base_weight.default' => '', - 'base_birthday.default' => '', - ]); - foreach ($data as $key => $vo) if ($vo === '') unset($data[$key]); - if (empty($data)) $this->error('没有修改的数据!'); - if (DataUser::mk()->where(['id' => $this->uuid])->update($data) !== false) { - $this->success('更新资料成功!', $this->getUser()); - } else { - $this->error('更新资料失败!'); - } - } - - /** - * 获取用户资料 - */ - public function get() - { - $this->success('获取用户资料', $this->getUser()); - } - - /** - * Base64 图片上传 - */ - public function image() - { - try { - $data = $this->_vali(['base64.require' => '图片内容不为空!']); - if (preg_match($preg = '|^data:image/(.*?);base64,|i', $data['base64'])) { - [$ext, $img] = explode('|||', preg_replace($preg, '$1|||', $data['base64'])); - if (empty($ext) || !in_array(strtolower($ext), ['png', 'jpg', 'jpeg'])) { - $this->error('图片格式异常!'); - } - $name = Storage::name($img, $ext, 'image/'); - $info = Storage::instance()->set($name, base64_decode($img)); - $this->success('图片上传成功!', ['url' => $info['url']]); - } else { - $this->error('解析内容失败!'); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - trace_file($exception); - $this->error($exception->getMessage()); - } - } - - /** - * 二进制文件上传 - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function upload() - { - $file = $this->request->file('file'); - if (empty($file)) $this->error('文件上传异常!'); - $extension = strtolower($file->getOriginalExtension()); - if (in_array($extension, ['php', 'sh'])) $this->error('禁止上传此类文件!'); - $bina = file_get_contents($file->getRealPath()); - $name = Storage::name($file->getPathname(), $extension, '', 'md5_file'); - $info = Storage::instance()->set($name, $bina, false, $file->getOriginalName()); - if (is_array($info) && isset($info['url'])) { - $this->success('文件上传成功!', $info); - } else { - $this->error('文件上传失败!'); - } - } - - /** - * 获取用户等级 - */ - public function levels() - { - $levels = BaseUserUpgrade::items(); - $this->success('获取用户等级', array_values($levels)); - } - - /** - * 获取我邀请的朋友 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getFrom() - { - $map = []; - $map[] = ['deleted', '=', 0]; - $map[] = ['path', 'like', "%-{$this->uuid}-%"]; - // 查询邀请的朋友 - $query = DataUser::mQuery()->like('nickname|username#nickname')->equal('vip_code,pids,pid1,id#uuid'); - $query->field('id,pid0,pid1,pid2,pids,username,nickname,headimg,order_amount_total,teams_amount_total,teams_amount_direct,teams_amount_indirect,teams_users_total,teams_users_direct,teams_users_indirect,rebate_total,rebate_used,rebate_lock,create_at'); - $result = $query->where($map)->order('id desc')->page(true, false, false, 15); - // 统计当前用户所有下属数 - $total = DataUser::mk()->where($map)->count(); - // 统计当前用户本月下属数 - $map[] = ['create_at', 'like', date('Y-m-%')]; - $month = DataUser::mk()->where($map)->count(); - // 返回结果列表数据及统计 - $result['total'] = ['user_total' => $total, 'user_month' => $month]; - $this->success('获取我邀请的朋友', $result); - } - - /** - * 绑定用户邀请人 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function bindFrom() - { - $data = $this->_vali(['from.require' => '邀请人不能为空']); - [$state, $message] = UserUpgradeService::bindAgent($this->uuid, $data['from'], 0); - if ($state) { - $this->success($message, UserAdminService::total($this->uuid)); - } else { - $this->error($message, UserAdminService::total($this->uuid)); - } - } -} \ No newline at end of file diff --git a/app/data/controller/api/auth/News.php b/app/data/controller/api/auth/News.php deleted file mode 100644 index 4b67d5a19..000000000 --- a/app/data/controller/api/auth/News.php +++ /dev/null @@ -1,209 +0,0 @@ -_vali([ - 'uuid.value' => $this->uuid, - 'type.value' => 4, - 'status.value' => 1, - 'code.require' => '文章不能为空!', - 'reply.require' => '评论不能为空!', - ]); - if (DataNewsXCollect::mk()->insert($data) !== false) { - NewsService::syncNewsTotal($data['code']); - $this->success('添加评论成功!'); - } else { - $this->error('添加评论失败!'); - } - } - - /** - * 获取我的评论 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getComment() - { - $query = DataNewsXCollect::mQuery()->where(['uuid' => $this->uuid, 'type' => 4]); - $result = $query->whereIn('status', [1, 2])->order('id desc')->page(true, false); - NewsService::buildListByUidAndCode($result); - $this->success('获取评论列表成功', $result); - } - - /** - * 删除内容评论 - */ - public function delComment() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'type.value' => 4, - 'id.require' => '评论编号不能为空!', - 'code.require' => '文章编号不能为空!', - ]); - if (DataNewsXCollect::mk()->where($data)->delete() !== false) { - $this->success('评论删除成功!'); - } else { - $this->error('认证删除失败!'); - } - } - - /** - * 添加内容收藏 - */ - public function addCollect() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'type.value' => 1, - 'status.value' => 2, - 'code.require' => '文章编号不能为空!', - ]); - if (DataNewsXCollect::mk()->where($data)->count() > 0) { - $this->success('您已收藏!'); - } - if (DataNewsXCollect::mk()->insert($data) !== false) { - NewsService::syncNewsTotal($data['code']); - $this->success('收藏成功!'); - } else { - $this->error('收藏失败!'); - } - } - - /** - * 取消收藏文章 - */ - public function delCollect() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'type.value' => 1, - 'code.require' => '文章编号不能为空!', - ]); - if (DataNewsXCollect::mk()->where($data)->delete() !== false) { - NewsService::syncNewsTotal($data['code']); - $this->success('取消收藏成功!'); - } else { - $this->error('取消收藏失败!'); - } - } - - /** - * 获取用户收藏的资讯 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getCollect() - { - $map = ['uuid' => $this->uuid, 'type' => 1]; - $query = DataNewsXCollect::mQuery()->where($map); - $result = $query->order('id desc')->page(true, false, false, 15); - NewsService::buildListByUidAndCode($result['list']); - $this->success('获取收藏记录成功!', $result); - } - - /** - * 添加内容点赞 - */ - public function addLike() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'type.value' => 2, - 'status.value' => 2, - 'code.require' => '文章编号不能为空!', - ]); - if (DataNewsXCollect::mk()->where($data)->count() > 0) { - $this->success('您已点赞!'); - } - if (DataNewsXCollect::mk()->insert($data) !== false) { - NewsService::syncNewsTotal($data['code']); - $this->success('点赞成功!'); - } else { - $this->error('点赞失败!'); - } - } - - /** - * 取消内容点赞 - */ - public function delLike() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'type.value' => 2, - 'code.require' => '文章编号不能为空!', - ]); - if (DataNewsXCollect::mk()->where($data)->delete() !== false) { - NewsService::syncNewsTotal($data['code']); - $this->success('取消点赞成功!'); - } else { - $this->error('取消点赞失败!'); - } - } - - /** - * 获取用户收藏的资讯 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getLike() - { - $query = DataNewsXCollect::mQuery(); - $query->where(['uuid' => $this->uuid, 'type' => 2, 'status' => 2]); - $result = $query->order('id desc')->page(true, false, false, 15); - NewsService::buildListByUidAndCode($result['list']); - $this->success('获取点赞记录成功!', $result); - } - - /** - * 添加用户的浏览历史 - */ - public function addHistory() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'type.value' => 2, - 'status.value' => 2, - 'code.require' => '文章编号不能为空!', - ]); - DataNewsXCollect::mk()->where($data)->delete(); - DataNewsXCollect::mk()->insert($data); - $this->success('添加浏览历史成功!'); - } - - /** - * 获取用户的浏览历史 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getHistory() - { - $query = DataNewsXCollect::mQuery(); - $query->where(['uuid' => $this->uuid, 'type' => 3, 'status' => 2]); - $result = $query->order('id desc')->page(true, false, false, 15); - NewsService::buildListByUidAndCode($result['list']); - $this->success('获取浏览历史成功!', $result); - } -} \ No newline at end of file diff --git a/app/data/controller/api/auth/Order.php b/app/data/controller/api/auth/Order.php deleted file mode 100644 index 05e39e018..000000000 --- a/app/data/controller/api/auth/Order.php +++ /dev/null @@ -1,496 +0,0 @@ -user['status'])) { - $this->error('账户已被冻结,不能操作订单数据哦!'); - } - } - - /** - * 获取订单列表 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function get() - { - $map = ['uuid' => $this->uuid, 'deleted_status' => 0]; - $query = ShopOrder::mQuery()->in('status')->equal('order_no'); - $result = $query->where($map)->order('id desc')->page(true, false, false, 20); - if (count($result['list']) > 0) OrderService::buildData($result['list']); - $this->success('获取订单数据成功!', $result); - } - - /** - * 用户创建订单 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function add() - { - // 检查用户状态 - $this->checkUserStatus(); - // 商品规则 - $rules = $this->request->post('items', ''); - if (empty($rules)) $this->error('商品不能为空'); - // 订单数据 - [$items, $order, $truckType, $allowPayments] = [[], [], -1, null]; - $order['uuid'] = $this->uuid; - $order['order_no'] = CodeExtend::uniqidDate(18, 'N'); - // 代理处理 - $order['puid1'] = input('from', $this->user['pid1']); - if ($order['puid1'] == $this->uuid) $order['puid1'] = 0; - if ($order['puid1'] > 0) { - $map = ['id' => $order['puid1'], 'status' => 1]; - $order['puid2'] = DataUser::mk()->where($map)->value('pid2'); - if (is_null($order['puid2'])) $this->error('代理异常'); - } - // 订单商品处理 - foreach (explode('||', $rules) as $rule) { - [$code, $spec, $count] = explode('@', $rule); - // 商品信息检查 - $goodsInfo = ShopGoods::mk()->where(['code' => $code, 'status' => 1, 'deleted' => 0])->find(); - $goodsItem = ShopGoodsItem::mk()->where(['status' => 1, 'goods_code' => $code, 'goods_spec' => $spec])->find(); - if (empty($goodsInfo) || empty($goodsItem)) $this->error('商品查询异常'); - // 商品类型检查 - if ($truckType < 0) $truckType = $goodsInfo['truck_type']; - if ($truckType !== $goodsInfo['truck_type']) $this->error('不能混合下单'); - // 限制购买数量 - if (isset($goodsInfo['limit_max_num']) && $goodsInfo['limit_max_num'] > 0) { - $map = [['a.uuid', '=', $this->uuid], ['a.status', 'in', [2, 3, 4, 5]], ['b.goods_code', '=', $goodsInfo['code']]]; - $buys = ShopOrder::mk()->alias('a')->join('store_order_item b', 'a.order_no=b.order_no')->where($map)->sum('b.stock_sales'); - if ($buys + $count > $goodsInfo['limit_max_num']) $this->error('超过限购数量'); - } - // 限制购买身份 - if ($goodsInfo['limit_low_vip'] > $this->user['vip_code']) $this->error('用户等级不够'); - // 商品库存检查 - if ($goodsItem['stock_sales'] + $count > $goodsItem['stock_total']) $this->error('商品库存不足'); - // 支付支付处理 - $_allowPayments = []; - foreach (str2arr($goodsInfo['payment']) as $code) { - if (is_null($allowPayments) || in_array($code, $allowPayments)) $_allowPayments[] = $code; - } - if (empty($_allowPayments)) { - $this->error('订单无法统一支付'); - } else { - $allowPayments = $_allowPayments; - } - // 商品折扣处理 - [$discountId, $discountRate] = OrderService::discount($goodsInfo['discount_id'], $this->user['vip_code']); - // 订单详情处理 - $items[] = [ - 'uuid' => $order['uuid'], - 'order_no' => $order['order_no'], - // 商品信息字段 - 'goods_name' => $goodsInfo['name'], - 'goods_cover' => $goodsInfo['cover'], - 'goods_payment' => $goodsInfo['payment'], - 'goods_sku' => $goodsItem['goods_sku'], - 'goods_code' => $goodsItem['goods_code'], - 'goods_spec' => $goodsItem['goods_spec'], - // 库存数量处理 - 'stock_sales' => $count, - // 快递发货数据 - 'truck_type' => $goodsInfo['truck_type'], - 'truck_code' => $goodsInfo['truck_code'], - 'truck_number' => $goodsInfo['rebate_type'] > 0 ? $goodsItem['number_express'] * $count : 0, - // 商品费用字段 - 'price_market' => $goodsItem['price_market'], - 'price_selling' => $goodsItem['price_selling'], - 'total_market' => $goodsItem['price_market'] * $count, - 'total_selling' => $goodsItem['price_selling'] * $count, - // 奖励金额积分 - 'reward_balance' => $goodsItem['reward_balance'] * $count, - 'reward_integral' => $goodsItem['reward_integral'] * $count, - // 绑定用户等级 - 'vip_name' => $this->user['vip_name'], - 'vip_code' => $this->user['vip_code'], - // 是否入会礼包 - 'vip_entry' => $goodsInfo['vip_entry'], - 'vip_upgrade' => $goodsInfo['vip_upgrade'], - // 是否参与返利 - 'rebate_type' => $goodsInfo['rebate_type'], - 'rebate_amount' => $goodsInfo['rebate_type'] > 0 ? $goodsItem['price_selling'] * $count : 0, - // 等级优惠方案 - 'discount_id' => $discountId, - 'discount_rate' => $discountRate, - 'discount_amount' => $discountRate * $goodsItem['price_selling'] * $count / 100, - ]; - } - try { - $order['payment_allow'] = arr2str($allowPayments); - $order['rebate_amount'] = array_sum(array_column($items, 'rebate_amount')); - $order['reward_balance'] = array_sum(array_column($items, 'reward_balance')); - - // 订单发货类型 - $order['status'] = $truckType ? 1 : 2; - $order['truck_type'] = $truckType; - // 统计商品数量 - $order['number_goods'] = array_sum(array_column($items, 'stock_sales')); - $order['number_express'] = array_sum(array_column($items, 'truck_number')); - // 统计商品金额 - $order['amount_goods'] = array_sum(array_column($items, 'total_selling')); - // 优惠后的金额 - $order['amount_discount'] = array_sum(array_column($items, 'discount_amount')); - // 订单随机免减 - $order['amount_reduct'] = OrderService::getReduct(); - if ($order['amount_reduct'] > $order['amount_goods']) { - $order['amount_reduct'] = $order['amount_goods']; - } - // 统计订单金额 - $order['amount_real'] = $order['amount_discount'] - $order['amount_reduct']; - $order['amount_total'] = $order['amount_goods']; - // 写入商品数据 - $this->app->db->transaction(function () use ($order, $items) { - ShopOrder::mk()->insert($order); - ShopOrderItem::mk()->insertAll($items); - }); - // 同步商品库存销量 - foreach (array_unique(array_column($items, 'goods_code')) as $code) { - GoodsService::stock($code); - } - // 触发订单创建事件 - $this->app->event->trigger('ShopOrderCreate', $order['order_no']); - // 组装订单商品数据 - $order['items'] = $items; - // 返回处理成功数据 - $this->success('商品下单成功', $order); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error("商品下单失败,{$exception->getMessage()}"); - } - } - - /** - * 获取用户折扣 - */ - public function discount() - { - $data = $this->_vali(['discount.require' => '折扣编号不能为空!']); - [, $rate] = OrderService::discount(intval($data['discount']), $this->user['vip_code']); - $this->success('获取用户折扣', ['rate' => $rate]); - } - - /** - * 模拟计算订单运费 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function express() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'code.require' => '地址不能为空', - 'order_no.require' => '单号不能为空', - ]); - - // 用户收货地址 - $map = ['uuid' => $this->uuid, 'code' => $data['code']]; - $addr = DataUserAddress::mk()->where($map)->find(); - if (empty($addr)) $this->error('收货地址异常'); - - // 订单状态检查 - $map = ['uuid' => $this->uuid, 'order_no' => $data['order_no']]; - $tCount = ShopOrderItem::mk()->where($map)->sum('truck_number'); - - // 根据地址计算运费 - $map = ['status' => 1, 'deleted' => 0, 'order_no' => $data['order_no']]; - $tCode = ShopOrderItem::mk()->where($map)->column('truck_code'); - [$amount, , , $remark] = ExpressService::amount($tCode, $addr['province'], $addr['city'], $tCount); - $this->success('计算运费成功', ['amount' => $amount, 'remark' => $remark]); - } - - /** - * 订单信息完成 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function perfect() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'code.require' => '地址不能为空', - 'order_no.require' => '单号不能为空', - ]); - - // 用户收货地址 - $map = ['uuid' => $this->uuid, 'code' => $data['code'], 'deleted' => 0]; - $addr = DataUserAddress::mk()->where($map)->find(); - if (empty($addr)) $this->error('收货地址异常'); - - // 订单状态检查 - $map1 = ['uuid' => $this->uuid, 'order_no' => $data['order_no']]; - $order = ShopOrder::mk()->where($map1)->whereIn('status', [1, 2])->find(); - if (empty($order)) $this->error('不能修改地址'); - if (empty($order['truck_type'])) $this->success('无需快递配送', ['order_no' => $order['order_no']]); - - // 根据地址计算运费 - $map2 = ['status' => 1, 'deleted' => 0, 'order_no' => $data['order_no']]; - $tCount = ShopOrderItem::mk()->where($map1)->sum('truck_number'); - $tCodes = ShopOrderItem::mk()->where($map2)->column('truck_code'); - [$amount, $tCount, $tCode, $remark] = ExpressService::amount($tCodes, $addr['province'], $addr['city'], $tCount); - - // 创建订单发货信息 - $express = [ - 'template_code' => $tCode, 'template_count' => $tCount, 'uuid' => $this->uuid, - 'template_remark' => $remark, 'template_amount' => $amount, 'status' => 1, - ]; - $express['order_no'] = $data['order_no']; - $express['address_code'] = $data['code']; - $express['address_datetime'] = date('Y-m-d H:i:s'); - - // 收货人信息 - $express['address_name'] = $addr['name']; - $express['address_phone'] = $addr['phone']; - $express['address_idcode'] = $addr['idcode']; - $express['address_idimg1'] = $addr['idimg1']; - $express['address_idimg2'] = $addr['idimg2']; - - // 收货地址信息 - $express['address_province'] = $addr['province']; - $express['address_city'] = $addr['city']; - $express['address_area'] = $addr['area']; - $express['address_content'] = $addr['address']; - - ShopOrderSend::mUpdate($express, 'order_no'); - data_save(ShopOrderSend::class, $express, 'order_no'); - // 组装更新订单数据 - $update = ['status' => 2, 'amount_express' => $express['template_amount']]; - // 重新计算订单金额 - $update['amount_real'] = $order['amount_discount'] + $amount - $order['amount_reduct']; - $update['amount_total'] = $order['amount_goods'] + $amount; - // 支付金额不能为零 - if ($update['amount_real'] <= 0) $update['amount_real'] = 0.00; - if ($update['amount_total'] <= 0) $update['amount_total'] = 0.00; - // 更新用户订单数据 - $map = ['uuid' => $this->uuid, 'order_no' => $data['order_no']]; - if (ShopOrder::mk()->where($map)->update($update) !== false) { - // 触发订单确认事件 - $this->app->event->trigger('ShopOrderPerfect', $order['order_no']); - // 返回处理成功数据 - $this->success('订单确认成功', ['order_no' => $order['order_no']]); - } else { - $this->error('订单确认失败'); - } - } - - /** - * 获取支付支付数据 - */ - public function channel() - { - $data = $this->_vali(['uuid.value' => $this->uuid, 'order_no.require' => '单号不能为空']); - $payments = ShopOrder::mk()->where($data)->value('payment_allow'); - if (empty($payments)) $this->error('获取订单支付参数失败'); - // 读取支付通道配置 - $query = BaseUserPayment::mk()->where(['status' => 1, 'deleted' => 0]); - $query->whereIn('code', str2arr($payments))->whereIn('type', PaymentService::getTypeApi($this->type)); - $result = $query->order('sort desc,id desc')->column('type,code,name,cover,content,remark', 'code'); - foreach ($result as &$vo) $vo['content'] = ['voucher_qrcode' => json_decode($vo['content'])->voucher_qrcode ?? '']; - $this->success('获取支付参数数据', array_values($result)); - } - - /** - * 获取订单支付状态 - * @throws \think\db\exception\DbException - */ - public function payment() - { - $data = $this->_vali([ - 'uuid.value' => $this->uuid, - 'order_no.require' => '单号不能为空', - 'order_remark.default' => '', - 'payment_code.require' => '支付不能为空', - 'payment_back.default' => '', # 支付回跳地址 - 'payment_image.default' => '', # 支付凭证图片 - ]); - [$map, $order] = $this->getOrderData(); - if ($order['status'] !== 2) $this->error('不能发起支付'); - if ($order['payment_status'] > 0) $this->error('已经完成支付'); - // 更新订单备注 - if (!empty($data['order_remark'])) { - ShopOrder::mk()->where($map)->update([ - 'order_remark' => $data['order_remark'], - ]); - } - // 自动处理用户字段 - $openid = ''; - if (in_array($this->type, [UserAdminService::API_TYPE_WXAPP, UserAdminService::API_TYPE_WECHAT])) { - $openid = $this->user[UserAdminService::TYPES[$this->type]['auth']] ?? ''; - if (empty($openid)) $this->error("发起支付失败"); - } - try { - // 返回订单数据及支付发起参数 - $type = $order['amount_real'] <= 0 ? 'empty' : $data['payment_code']; - $param = PaymentService::instance($type)->create($openid, $order['order_no'], $order['amount_real'], '商城订单支付', '', $data['payment_back'], $data['payment_image']); - $this->success('获取支付参数', ['order' => ShopOrder::mk()->where($map)->find() ?: new \stdClass(), 'param' => $param]); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error($exception->getMessage()); - } - } - - /** - * 主动取消未支付的订单 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function cancel() - { - [$map, $order] = $this->getOrderData(); - if (in_array($order['status'], [1, 2, 3])) { - $result = ShopOrder::mk()->where($map)->update([ - 'status' => 0, - 'cancel_status' => 1, - 'cancel_remark' => '用户主动取消订单', - 'cancel_datetime' => date('Y-m-d H:i:s'), - ]); - if ($result !== false && OrderService::stock($order['order_no'])) { - // 触发订单取消事件 - $this->app->event->trigger('ShopOrderCancel', $order['order_no']); - // 返回处理成功数据 - $this->success('订单取消成功'); - } else { - $this->error('订单取消失败'); - } - } else { - $this->error('订单不可取消'); - } - } - - /** - * 用户主动删除已取消的订单 - * @throws \think\db\exception\DbException - */ - public function remove() - { - [$map, $order] = $this->getOrderData(); - if (empty($order)) $this->error('读取订单失败'); - if ($order['status'] == 0) { - $result = ShopOrder::mk()->where($map)->update([ - 'status' => 0, - 'deleted_status' => 1, - 'deleted_remark' => '用户主动删除订单', - 'deleted_datetime' => date('Y-m-d H:i:s'), - ]); - if ($result !== false) { - // 触发订单删除事件 - $this->app->event->trigger('ShopOrderRemove', $order['order_no']); - // 返回处理成功数据 - $this->success('订单删除成功'); - } else { - $this->error('订单删除失败'); - } - } else { - $this->error('订单不可删除'); - } - } - - /** - * 订单确认收货 - * @throws \think\db\exception\DbException - */ - public function confirm() - { - [$map, $order] = $this->getOrderData(); - if ($order['status'] == 5) { - if (ShopOrder::mk()->where($map)->update(['status' => 6]) !== false) { - // 触发订单确认事件 - $this->app->event->trigger('ShopOrderConfirm', $order['order_no']); - // 返回处理成功数据 - $this->success('订单确认成功'); - } else { - $this->error('订单确认失败'); - } - } else { - $this->error('订单确认失败'); - } - } - - /** - * 获取输入订单 - * @return array [map, order] - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function getOrderData(): array - { - $map = $this->_vali([ - 'uuid.value' => $this->uuid, - 'order_no.require' => '单号不能为空', - ]); - $order = ShopOrder::mk()->where($map)->find(); - if (empty($order)) $this->error('读取订单失败'); - return [$map, $order]; - } - - /** - * 订单状态统计 - */ - public function total() - { - $data = ['t0' => 0, 't1' => 0, 't2' => 0, 't3' => 0, 't4' => 0, 't5' => 0, 't6' => 0]; - $query = ShopOrder::mk()->where(['uuid' => $this->uuid, 'deleted_status' => 0]); - foreach ($query->field('status,count(1) count')->group('status')->cursor() as $item) { - $data["t{$item['status']}"] = $item['count']; - } - $this->success('获取订单统计', $data); - } - - /** - * 物流追踪查询 - */ - public function track() - { - try { - $data = $this->_vali([ - 'code.require' => '快递不能为空', - 'number.require' => '单号不能为空' - ]); - $result = ExpressService::query($data['code'], $data['number']); - empty($result['code']) ? $this->error($result['info']) : $this->success('快递追踪信息', $result); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error($exception->getMessage()); - } - } -} \ No newline at end of file diff --git a/app/data/controller/api/auth/Rebate.php b/app/data/controller/api/auth/Rebate.php deleted file mode 100644 index 87188fd8c..000000000 --- a/app/data/controller/api/auth/Rebate.php +++ /dev/null @@ -1,58 +0,0 @@ - $this->uuid], substr($date, 0, 4)]; - $query = DataUserRebate::mQuery()->where($map)->equal('type,status')->whereLike('date', "{$date}%"); - $this->success('获取返利统计', array_merge($query->order('id desc')->page(true, false, false, 10), [ - 'total' => [ - '年度' => DataUserRebate::mQuery()->where($map)->equal('type,status')->whereLike('date', "{$year}%")->db()->sum('amount'), - '月度' => DataUserRebate::mQuery()->where($map)->equal('type,status')->whereLike('date', "{$date}%")->db()->sum('amount'), - ], - ])); - } - - /** - * 获取我的奖励 - */ - public function prize() - { - [$map, $data] = [['number' => $this->user['vip_code']], []]; - $prizes = DataUserRebate::mk()->group('name')->column('name'); - $rebate = BaseUserUpgrade::mk()->where($map)->value('rebate_rule', ''); - $codemap = array_merge($prizes, str2arr($rebate)); - foreach (RebateService::PRIZES as $prize) { - if (in_array($prize['code'], $codemap)) $data[] = $prize; - } - $this->success('获取我的奖励', $data); - } - - /** - * 获取奖励配置 - */ - public function prizes() - { - $this->success('获取系统奖励', array_values(RebateService::PRIZES)); - } -} \ No newline at end of file diff --git a/app/data/controller/api/auth/Transfer.php b/app/data/controller/api/auth/Transfer.php deleted file mode 100644 index 14a57564d..000000000 --- a/app/data/controller/api/auth/Transfer.php +++ /dev/null @@ -1,162 +0,0 @@ -checkUserStatus(); - // 接收输入数据 - $data = $this->_vali([ - 'type.require' => '提现方式不能为空!', - 'amount.require' => '提现金额不能为空!', - 'remark.default' => '用户提交提现申请!', - ]); - $state = UserTransferService::config('status'); - if (empty($state)) $this->error('提现还没有开启!'); - $transfers = UserTransferService::config('transfer'); - if (empty($transfers[$data['type']]['state'])) $this->error('提现方式已停用!'); - // 提现数据补充 - $data['uuid'] = $this->uuid; - $data['date'] = date('Y-m-d'); - $data['code'] = CodeExtend::uniqidDate(20, 'T'); - // 提现状态处理 - if (empty($transfers[$data['type']]['state']['audit'])) { - $data['status'] = 1; - $data['audit_status'] = 0; - } else { - $data['status'] = 3; - $data['audit_status'] = 1; - $data['audit_remark'] = '提现免审核'; - $data['audit_datetime'] = date('Y-m-d H:i:s'); - } - // 扣除手续费 - $chargeRate = floatval(UserTransferService::config('charge')); - $data['charge_rate'] = $chargeRate; - $data['charge_amount'] = $chargeRate * $data['amount'] / 100; - // 检查可提现余额 - [$total, $count] = UserRebateService::amount($this->uuid); - if ($total - $count < $data['amount']) $this->error('可提现余额不足!'); - // 提现方式处理 - if ($data['type'] == 'alipay_account') { - $data = array_merge($data, $this->_vali([ - 'alipay_user.require' => '开户姓名不能为空!', - 'alipay_code.require' => '支付账号不能为空!', - ])); - } elseif (in_array($data['type'], ['wechat_qrcode', 'alipay_qrcode'])) { - $data = array_merge($data, $this->_vali([ - 'qrcode.require' => '收款码不能为空!', - ])); - } elseif (in_array($data['type'], ['wechat_banks', 'transfer_banks'])) { - $data = array_merge($data, $this->_vali([ - 'bank_wseq.require' => '银行编号不能为空!', - 'bank_name.require' => '银行名称不能为空!', - 'bank_user.require' => '开户账号不能为空!', - 'bank_bran.require' => '银行分行不能为空!', - 'bank_code.require' => '银行卡号不能为空!', - ])); - } elseif ($data['type'] != 'wechat_wallet') { - $this->error('转账方式不存在!'); - } - // 当日提现次数限制 - $map = ['uuid' => $this->uuid, 'type' => $data['type'], 'date' => $data['date']]; - $count = DataUserTransfer::mk()->where($map)->count(); - if ($count >= $transfers[$data['type']]['dayNumber']) $this->error("当日提现次数受限"); - // 提现金额范围控制 - if ($transfers[$data['type']]['minAmount'] > $data['amount']) { - $this->error("不能少于{$transfers[$data['type']]['minAmount']}元"); - } - if ($transfers[$data['type']]['maxAmount'] < $data['amount']) { - $this->error("不能大于{$transfers[$data['type']]['maxAmount']}元"); - } - // 写入用户提现数据 - if (DataUserTransfer::mk()->insert($data) !== false) { - UserRebateService::amount($this->uuid); - $this->success('提现申请成功'); - } else { - $this->error('提现申请失败'); - } - } - - /** - * 用户提现记录 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function get() - { - $query = DataUserTransfer::mQuery()->where(['uuid' => $this->uuid]); - $result = $query->like('date,code')->in('status')->order('id desc')->page(true, false, false, 10); - // 统计历史数据 - $map = [['uuid', '=', $this->uuid], ['status', '>', 0]]; - [$total, $count, $locks] = UserRebateService::amount($this->uuid); - $this->success('获取提现成功', array_merge($result, [ - 'total' => [ - '锁定' => $locks, - '可提' => $total - $count, - '上月' => DataUserTransfer::mk()->where($map)->whereLike('date', date("Y-m-%", strtotime('-1 month')))->sum('amount'), - '本月' => DataUserTransfer::mk()->where($map)->whereLike('date', date("Y-m-%"))->sum('amount'), - '全年' => DataUserTransfer::mk()->where($map)->whereLike('date', date("Y-%"))->sum('amount'), - ], - ])); - } - - /** - * 用户取消提现 - */ - public function cancel() - { - $data = $this->_vali(['uuid.value' => $this->uuid, 'code.require' => '单号不能为空!']); - DataUserTransfer::mk()->where($data)->whereIn('status', [1, 2, 3])->update([ - 'status' => 0, 'change_time' => date("Y-m-d H:i:s"), 'change_desc' => '用户主动取消提现', - ]); - UserRebateService::amount($this->uuid); - $this->success('取消提现成功'); - } - - /** - * 用户确认提现 - */ - public function confirm() - { - $data = $this->_vali(['uuid.value' => $this->uuid, 'code.require' => '单号不能为空!']); - DataUserTransfer::mk()->where($data)->whereIn('status', [4])->update([ - 'status' => 5, 'change_time' => date("Y-m-d H:i:s"), 'change_desc' => '用户主动确认收款', - ]); - UserRebateService::amount($this->uuid); - $this->success('确认收款成功'); - } - - /** - * 获取用户提现配置 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function config() - { - $data = UserTransferService::config(); - $data['banks'] = UserTransferService::instance()->banks(); - $this->success('获取用户提现配置', $data); - } -} \ No newline at end of file diff --git a/app/data/controller/base/Config.php b/app/data/controller/base/Config.php deleted file mode 100644 index 42f4e6580..000000000 --- a/app/data/controller/base/Config.php +++ /dev/null @@ -1,72 +0,0 @@ -skey = 'wxapp'; - $this->title = '微信小程序配置'; - $this->__sysdata('wxapp'); - } - - /** - * 邀请二维码设置 - * @auth true - * @menu true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function cropper() - { - $this->skey = 'cropper'; - $this->title = '邀请二维码设置'; - $this->__sysdata('cropper'); - } - - /** - * 显示并保存数据 - * @param string $template 模板文件 - * @param string $history 跳转处理 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function __sysdata(string $template, string $history = '') - { - if ($this->request->isGet()) { - $this->data = sysdata($this->skey); - $this->fetch($template); - } - if ($this->request->isPost()) { - if (is_string(input('data'))) { - $data = json_decode(input('data'), true) ?: []; - } else { - $data = $this->request->post(); - } - if (sysdata($this->skey, $data) !== false) { - $this->success('内容保存成功!', $history); - } else { - $this->error('内容保存失败,请稍候再试!'); - } - } - } -} \ No newline at end of file diff --git a/app/data/controller/base/Discount.php b/app/data/controller/base/Discount.php deleted file mode 100644 index 2ce7fec5f..000000000 --- a/app/data/controller/base/Discount.php +++ /dev/null @@ -1,93 +0,0 @@ -type = $this->get['type'] ?? 'index'; - BaseUserDiscount::mQuery()->layTable(function () { - $this->title = '折扣方案管理'; - }, function (QueryHelper $query) { - $query->where(['status' => intval($this->type === 'index'), 'deleted' => 0]); - }); - } - - /** - * 添加折扣方案 - * @auth true - */ - public function add() - { - BaseUserDiscount::mForm('form'); - } - - /** - * 编辑折扣方案 - * @auth true - */ - public function edit() - { - BaseUserDiscount::mForm('form'); - } - - /** - * 表单数据处理 - * @param array $vo - */ - protected function _form_filter(array &$vo) - { - if ($this->request->isPost()) { - $rule = []; - foreach ($vo as $k => $v) if (stripos($k, '_level_') !== false) { - [, $level] = explode('_level_', $k); - $rule[] = ['level' => $level, 'discount' => $v]; - } - $vo['items'] = json_encode($rule, JSON_UNESCAPED_UNICODE); - } else { - $this->levels = BaseUserUpgrade::items(); - if (empty($this->levels)) $this->error('未配置用户等级!'); - foreach ($vo['items'] ?? [] as $item) { - $vo["_level_{$item['level']}"] = $item['discount']; - } - } - } - - /** - * 修改折扣方案状态 - * @auth true - */ - public function state() - { - BaseUserDiscount::mSave(); - } - - /** - * 删除折扣方案配置 - * @auth true - */ - public function remove() - { - BaseUserDiscount::mDelete(); - } -} \ No newline at end of file diff --git a/app/data/controller/base/Message.php b/app/data/controller/base/Message.php deleted file mode 100644 index e53399d11..000000000 --- a/app/data/controller/base/Message.php +++ /dev/null @@ -1,85 +0,0 @@ -layTable(function () { - $this->title = '系统通知管理'; - }, function (QueryHelper $query) { - $query->where(['deleted' => 0]); - $query->like('name')->equal('status')->dateBetween('create_at'); - }); - } - - /** - * 添加系统通知 - * @auth true - */ - public function add() - { - $this->title = '添加系统通知'; - BaseUserMessage::mForm('form'); - } - - /** - * 编辑系统通知 - * @auth true - */ - public function edit() - { - $this->title = '编辑系统通知'; - BaseUserMessage::mForm('form'); - } - - /** - * 表单结果处理 - * @param boolean $state - */ - protected function _form_result(bool $state) - { - if ($state) { - $this->success('内容保存成功!', 'javascript:history.back()'); - } - } - - /** - * 修改通知状态 - * @auth true - */ - public function state() - { - BaseUserMessage::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除系统通知 - * @auth true - */ - public function remove() - { - BaseUserMessage::mDelete(); - } -} \ No newline at end of file diff --git a/app/data/controller/base/Pager.php b/app/data/controller/base/Pager.php deleted file mode 100644 index 26f16d847..000000000 --- a/app/data/controller/base/Pager.php +++ /dev/null @@ -1,87 +0,0 @@ -types = SystemBase::mk()->items($this->type); - } - - /** - * 内容页面管理 - * @auth true - * @menu true - */ - public function index() - { - $this->title = '内容页面管理'; - $this->fetch(); - } - - /** - * 内容页面编辑 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function edit() - { - $this->skey = $this->get['type'] ?? ''; - $this->base = $this->types[$this->skey] ?? []; - if (empty($this->base)) $this->error('未配置基础数据!'); - $this->title = "编辑{$this->base['name']}"; - $this->sysdata(); - } - - /** - * 显示并保存数据 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function sysdata() - { - if ($this->request->isGet()) { - $this->data = sysdata($this->skey); - $this->fetch('form'); - } elseif ($this->request->isPost()) { - if (is_string(input('data'))) { - $data = json_decode(input('data'), true) ?: []; - } else { - $data = $this->request->post(); - } - if (sysdata($this->skey, $data) !== false) { - $this->success('内容保存成功!', 'javascript:history.back()'); - } else { - $this->error('内容保存失败,请稍候再试!'); - } - } - } -} \ No newline at end of file diff --git a/app/data/controller/base/Payment.php b/app/data/controller/base/Payment.php deleted file mode 100644 index d4854819f..000000000 --- a/app/data/controller/base/Payment.php +++ /dev/null @@ -1,134 +0,0 @@ -type = $this->get['type'] ?? 'index'; - BaseUserPayment::mQuery()->layTable(function () { - $this->title = '支付通道管理'; - }, function (QueryHelper $query) { - $query->where(['status' => intval($this->type === 'index'), 'deleted' => 0]); - $query->like('name,code')->equal('status,type#ptype')->dateBetween('create_at'); - }); - } - - /** - * 获取支付名称 - * @param array $data - * @return void - */ - protected function _page_filter(array &$data) - { - foreach ($data as &$vo) { - $vo['ntype'] = $this->types[$vo['type']]['name'] ?? $vo['type']; - } - } - - /** - * 添加支付通道 - * @auth true - */ - public function add() - { - $this->title = '添加支付通道'; - BaseUserPayment::mForm('form'); - } - - /** - * 编辑支付通道 - * @auth true - */ - public function edit() - { - $this->title = '编辑支付通道'; - BaseUserPayment::mForm('form'); - } - - /** - * 数据表单处理 - * @param array $data - */ - protected function _form_filter(array &$data) - { - if (empty($data['code'])) { - $data['code'] = CodeExtend::uniqidNumber(20, 'M'); - } - if ($this->request->isGet()) { - $this->payments = []; - foreach ($this->types as $k => $vo) { - $allow = []; - foreach ($vo['bind'] as $api) if (isset(UserAdminService::TYPES[$api])) { - $allow[$api] = UserAdminService::TYPES[$api]['name']; - } - if (empty($allow)) continue; - $this->payments[$k] = array_merge($vo, ['allow' => join('、', $allow)]); - } - $data['content'] = json_decode($data['content'] ?? '[]', true) ?: []; - } else { - if (empty($data['type'])) $this->error('请选择支付通道并配置参数!'); - if (empty($data['cover'])) $this->error('请上传支付方式图标!'); - $data['content'] = json_encode($this->request->post() ?: [], JSON_UNESCAPED_UNICODE); - } - } - - /** - * 表单结果处理 - * @param boolean $state - */ - protected function _form_result(bool $state) - { - if ($state) { - $this->success('支付通道保存成功!', 'javascript:history.back()'); - } - } - - /** - * 修改通道状态 - * @auth true - */ - public function state() - { - BaseUserPayment::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除支付通道 - * @auth true - */ - public function remove() - { - BaseUserPayment::mDelete(); - } -} \ No newline at end of file diff --git a/app/data/controller/base/Slider.php b/app/data/controller/base/Slider.php deleted file mode 100644 index 305ef6dc0..000000000 --- a/app/data/controller/base/Slider.php +++ /dev/null @@ -1,102 +0,0 @@ - ['name' => '不跳转'], - 'LK' => ['name' => '自定义链接'], - 'NL' => ['name' => '新闻资讯列表'], - 'NS' => ['name' => '新闻资讯详情', 'node' => 'data/news.item/select'], - ]; - - /** - * 数据类型 - * @var string - */ - protected $type = '图片内容'; - - /** - * 页面类型 - * @var array - */ - protected $types = []; - - /** - * 控制器初始化 - * @return void - */ - protected function initialize() - { - $this->types = SystemBase::mk()->items($this->type); - foreach ($this->types as &$type) { - if (preg_match('/^(.*?)#(\d+)$/', $type['name'], $matches)) { - $type['name'] = $matches[1]; - $type['number'] = $matches[2]; - } else { - $type['number'] = 0; - } - } - } - - /** - * 图片内容管理 - * @auth true - * @menu true - */ - public function index() - { - $this->title = '图片内容管理'; - $this->fetch(); - } - - /** - * 编辑图片内容 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function edit() - { - $this->skey = $this->get['type'] ?? ''; - $this->base = $this->types[$this->skey] ?? []; - if (empty($this->base)) $this->error('未配置基础数据!'); - $this->number = $this->base['number']; - $this->sysdata(); - } - - /** - * 保存图片内容 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function sysdata() - { - if ($this->request->isGet()) { - $this->data = sysdata($this->skey); - $this->title = "{$this->base['name']}管理"; - $this->fetch('form'); - } else { - if (sysdata($this->skey, json_decode(input('data'), true))) { - $this->success("{$this->base['name']}保存成功!"); - } else { - $this->error("{$this->base['name']}保存失败,请稍候再试!"); - } - } - } -} \ No newline at end of file diff --git a/app/data/controller/base/Upgrade.php b/app/data/controller/base/Upgrade.php deleted file mode 100644 index 39268e2e0..000000000 --- a/app/data/controller/base/Upgrade.php +++ /dev/null @@ -1,156 +0,0 @@ -title = '用户等级管理'; - BaseUserUpgrade::mQuery()->like('name')->equal('status')->dateBetween('create_at')->layTable(); - } - - /** - * 添加用户等级 - * @auth true - * @return void - * @throws \think\db\exception\DbException - */ - public function add() - { - $this->max = BaseUserUpgrade::maxNumber() + 1; - BaseUserUpgrade::mForm('form'); - } - - /** - * 编辑用户等级 - * @auth true - * @return void - * @throws \think\db\exception\DbException - */ - public function edit() - { - $this->max = BaseUserUpgrade::maxNumber(); - BaseUserUpgrade::mForm('form'); - } - - /** - * 表单数据处理 - * @param array $vo - * @throws \think\db\exception\DbException - */ - protected function _form_filter(array &$vo) - { - if ($this->request->isGet()) { - $this->prizes = RebateService::PRIZES; - $vo['number'] = $vo['number'] ?? BaseUserUpgrade::maxNumber(); - } else { - $vo['utime'] = time(); - // 用户升级条件开关 - $vo['goods_vip_status'] = isset($vo['goods_vip_status']) ? 1 : 0; - $vo['teams_users_status'] = isset($vo['teams_users_status']) ? 1 : 0; - $vo['teams_direct_status'] = isset($vo['teams_direct_status']) ? 1 : 0; - $vo['teams_indirect_status'] = isset($vo['teams_indirect_status']) ? 1 : 0; - $vo['order_amount_status'] = isset($vo['order_amount_status']) ? 1 : 0; - // 默认等级去除条件 - if (empty($vo['number'])) { - $vo['rebate_rule'] = []; - foreach ($vo as $k => &$v) if (is_numeric(stripos($k, '_status'))) $v = 0; - } - // 根据数量判断状态 - $vo['teams_users_status'] = intval($vo['teams_users_status'] && $vo['teams_users_number'] > 0); - $vo['teams_direct_status'] = intval($vo['teams_direct_status'] && $vo['teams_direct_number'] > 0); - $vo['teams_indirect_status'] = intval($vo['teams_indirect_status'] && $vo['teams_indirect_number'] > 0); - $vo['order_amount_status'] = intval($vo['order_amount_status'] && $vo['order_amount_number'] > 0); - // 检查升级条件配置 - $count = 0; - foreach ($vo as $k => $v) if (is_numeric(stripos($k, '_status'))) $count += $v; - if (empty($count) && $vo['number'] > 0) $this->error('升级条件不能为空!'); - } - } - - /** - * 表单结果处理 - * @param boolean $state - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function _form_result(bool $state) - { - if ($state) { - $isasc = input('old_number', 0) <= input('number', 0); - $order = $isasc ? 'number asc,utime asc' : 'number asc,utime desc'; - foreach (BaseUserUpgrade::mk()->order($order)->select() as $number => $upgrade) { - $upgrade->save(['number' => $number]); - } - } - } - - /** - * 重算用户等级 - * @auth true - */ - public function sync() - { - $this->_queue('重新计算所有用户等级', 'xdata:UserUpgrade'); - } - - /** - * 修改等级状态 - * @auth true - */ - public function state() - { - BaseUserUpgrade::mSave(); - } - - /** - * 删除用户等级 - * @auth true - */ - public function remove() - { - BaseUserUpgrade::mDelete(); - } - - /** - * 状态变更处理 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _save_result() - { - $this->_form_result(true); - } - - /** - * 删除结果处理 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _delete_result() - { - $this->_form_result(true); - } -} \ No newline at end of file diff --git a/app/data/controller/base/postage/Company.php b/app/data/controller/base/postage/Company.php deleted file mode 100644 index 8f8e60916..000000000 --- a/app/data/controller/base/postage/Company.php +++ /dev/null @@ -1,115 +0,0 @@ -type = $this->get['type'] ?? 'index'; - BasePostageCompany::mQuery()->layTable(function () { - $this->title = '快递公司管理'; - }, function (QueryHelper $query) { - $query->where(['deleted' => 0, 'status' => intval($this->type === 'index')]); - $query->like('name,code_1|code_3#code')->equal('status')->dateBetween('create_at'); - }); - } - - /** - * 添加快递公司 - * @auth true - */ - public function add() - { - $this->title = '添加快递公司'; - BasePostageCompany::mForm('form'); - } - - /** - * 编辑快递公司 - * @auth true - */ - public function edit() - { - $this->title = '编辑快递公司'; - BasePostageCompany::mForm('form'); - } - - /** - * 同步字段编号 - * @param array $data - * @return void - */ - protected function _form_filter(array &$data) - { - if ($this->request->isPost()) { - if (empty($data['code_2'])) { - $data['code_2'] = $data['code_3']; - } - } - } - - /** - * 修改快递公司状态 - * @auth true - */ - public function state() - { - BasePostageCompany::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除快递公司 - * @auth true - */ - public function remove() - { - BasePostageCompany::mDelete(); - } - - /** - * 同步快递公司 - * @auth true - */ - public function sync() - { - try { - $result = ExpressService::company(); - if (empty($result['code'])) $this->error($result['info']); - foreach ($result['data'] as $vo) BasePostageCompany::mUpdate([ - 'name' => $vo['title'], - 'code_1' => $vo['code_1'], - 'code_2' => $vo['code_2'], - 'code_3' => $vo['code_3'], - 'deleted' => 0, - ], 'code_1'); - $this->success('同步快递公司成功!'); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error('同步快递公司数据失败!'); - } - } -} \ No newline at end of file diff --git a/app/data/controller/base/postage/Template.php b/app/data/controller/base/postage/Template.php deleted file mode 100644 index f96d2498f..000000000 --- a/app/data/controller/base/postage/Template.php +++ /dev/null @@ -1,121 +0,0 @@ -type = $this->get['type'] ?? 'index'; - BasePostageTemplate::mQuery()->layTable(function () { - $this->title = '快递邮费模板'; - }, function (QueryHelper $query) { - $query->where(['deleted' => 0, 'status' => intval($this->type === 'index')]); - $query->like('code,name')->equal('status')->dateBetween('create_at'); - }); - } - - /** - * 配送区域管理 - * @auth true - */ - public function region() - { - if ($this->request->isGet()) { - $this->title = '配送区域管理'; - $this->citys = ExpressService::region(3, null); - $this->fetch('form_region'); - } else { - $data = $this->_vali(['nos.default' => '', 'oks.default' => '']); - if ($data['nos']) BasePostageRegion::mk()->whereIn('id', str2arr($data['nos']))->update(['status' => 0]); - if ($data['oks']) BasePostageRegion::mk()->whereIn('id', str2arr($data['oks']))->update(['status' => 1]); - $this->success('修改配送区域成功!', 'javascript:history.back()'); - } - } - - /** - * 添加配送邮费模板 - * @auth true - */ - public function add() - { - $this->title = '添加配送邮费模板'; - BasePostageTemplate::mForm('form'); - } - - /** - * 编辑配送邮费模板 - * @auth true - */ - public function edit() - { - $this->title = '编辑配送邮费模板'; - BasePostageTemplate::mForm('form'); - } - - /** - * 表单数据处理 - * @param array $data - */ - protected function _form_filter(array &$data) - { - if (empty($data['code'])) { - $data['code'] = CodeExtend::uniqidDate(12, 'T'); - } - if ($this->request->isGet()) { - $this->citys = ExpressService::region(2, 1); - } - } - - /** - * 表单结果处理 - * @param boolean $result - */ - protected function _form_result(bool $result) - { - if ($result && $this->request->isPost()) { - $this->success('邮费模板保存成功!', 'javascript:history.back()'); - } - } - - /** - * 启用或禁用邮费模板 - * @auth true - */ - public function state() - { - BasePostageTemplate::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除邮费模板 - * @auth true - */ - public function remove() - { - BasePostageTemplate::mDelete(); - } -} \ No newline at end of file diff --git a/app/data/controller/news/Item.php b/app/data/controller/news/Item.php deleted file mode 100644 index 853c71f30..000000000 --- a/app/data/controller/news/Item.php +++ /dev/null @@ -1,133 +0,0 @@ -type = $this->get['type'] ?? 'index'; - DataNewsItem::mQuery($this->get)->layTable(function () { - $this->title = '文章内容管理'; - $this->marks = DataNewsMark::items(); - }, function (QueryHelper $query) { - $query->like('code,name')->like('mark', ',')->dateBetween('create_at'); - $query->where(['status' => intval($this->type === 'index'), 'deleted' => 0]); - }); - } - - /** - * 列表数据处理 - * @param array $data - */ - protected function _page_filter(array &$data) - { - NewsService::buildData($data); - } - - /** - * 添加文章内容 - * @auth true - */ - public function add() - { - $this->title = '添加文章内容'; - DataNewsItem::mForm('form'); - } - - /** - * 编辑文章内容 - * @auth true - */ - public function edit() - { - $this->title = '编辑文章内容'; - DataNewsItem::mForm('form'); - } - - /** - * 表单数据处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _form_filter(array &$data) - { - if (empty($data['code'])) { - $data['code'] = CodeExtend::uniqidNumber(20, 'A'); - } - if ($this->request->isGet()) { - $model = DataNewsMark::mk()->where(['status' => 1, 'deleted' => 0]); - $this->marks = $model->order('sort desc,id desc')->select()->toArray(); - $data['mark'] = str2arr($data['mark'] ?? ''); - } else { - $data['mark'] = arr2str($data['mark'] ?? []); - } - } - - /** - * 表单结果处理 - * @param boolean $state - */ - protected function _form_result(bool $state) - { - if ($state) { - $this->success('文章保存成功!', 'javascript:history.back()'); - } - } - - /** - * 修改文章状态 - * @auth true - */ - public function state() - { - DataNewsItem::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除文章内容 - * @auth true - */ - public function remove() - { - DataNewsItem::mDelete(); - } - - /** - * 文章内容选择 - * @login true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function select() - { - $this->get['status'] = 1; - $this->index(); - } -} \ No newline at end of file diff --git a/app/data/controller/news/Mark.php b/app/data/controller/news/Mark.php deleted file mode 100644 index b0ff19952..000000000 --- a/app/data/controller/news/Mark.php +++ /dev/null @@ -1,81 +0,0 @@ -layTable(function () { - $this->title = '文章标签管理'; - }, function (QueryHelper $query) { - $query->where(['deleted' => 0]); - $query->like('name')->equal('status')->dateBetween('create_at'); - }); - } - - /** - * 添加文章标签 - * @auth true - */ - public function add() - { - DataNewsMark::mForm('form'); - } - - /** - * 编辑文章标签 - * @auth true - */ - public function edit() - { - DataNewsMark::mForm('form'); - } - - /** - * 表单结果处理 - * @param bool $state - * @return void - */ - protected function _form_result(bool $state) - { - if ($state) { - $this->success('修改标签成功', "javascript:$('#TagsData').trigger('reload')"); - } - } - - /** - * 修改文章标签状态 - * @auth true - */ - public function state() - { - DataNewsMark::mSave(); - } - - /** - * 删除文章标签 - * @auth true - */ - public function remove() - { - DataNewsMark::mDelete(); - } -} \ No newline at end of file diff --git a/app/data/controller/shop/Cate.php b/app/data/controller/shop/Cate.php deleted file mode 100644 index a45741599..000000000 --- a/app/data/controller/shop/Cate.php +++ /dev/null @@ -1,105 +0,0 @@ -layTable(function () { - $this->title = "商品分类管理"; - }, function (QueryHelper $query) { - $query->where(['deleted' => 0]); - $query->like('name')->equal('status')->dateBetween('create_at'); - }); - } - - /** - * 列表数据处理 - * @param array $data - */ - protected function _index_page_filter(array &$data) - { - $data = DataExtend::arr2table($data); - } - - /** - * 添加商品分类 - * @auth true - */ - public function add() - { - ShopGoodsCate::mForm('form'); - } - - /** - * 编辑商品分类 - * @auth true - */ - public function edit() - { - ShopGoodsCate::mForm('form'); - } - - /** - * 表单数据处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _form_filter(array &$data) - { - if ($this->request->isGet()) { - $data['pid'] = intval($data['pid'] ?? input('pid', '0')); - $this->cates = ShopGoodsCate::getParentData($this->maxLevel, $data, [ - 'id' => '0', 'pid' => '-1', 'name' => '顶部分类', - ]); - } - } - - /** - * 修改商品分类状态 - * @auth true - */ - public function state() - { - ShopGoodsCate::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除商品分类 - * @auth true - */ - public function remove() - { - ShopGoodsCate::mDelete(); - } -} \ No newline at end of file diff --git a/app/data/controller/shop/Goods.php b/app/data/controller/shop/Goods.php deleted file mode 100644 index 325ec6965..000000000 --- a/app/data/controller/shop/Goods.php +++ /dev/null @@ -1,254 +0,0 @@ -title = '商品数据管理'; - - $query = ShopGoods::mQuery(); - // 加载对应数据 - $this->type = $this->request->get('type', 'index'); - if ($this->type === 'index') $query->where(['deleted' => 0]); - elseif ($this->type === 'recycle') $query->where(['deleted' => 1]); - else $this->error("无法加载 {$this->type} 数据列表!"); - - // 列表排序并显示 - $query->like('code|name#name')->like('marks,cateids', ','); - $query->equal('status,vip_entry,truck_type,rebate_type')->order('sort desc,id desc')->page(); - } - - /** - * 商品选择器 - * @login true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function select() - { - $query = ShopGoods::mQuery(); - $query->equal('status')->like('code,name,marks')->in('cateids'); - $query->where(['deleted' => 0])->order('sort desc,id desc')->page(); - } - - /** - * 数据列表处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _page_filter(array &$data) - { - $this->marks = ShopGoodsMark::items(); - $this->cates = ShopGoodsCate::treeTable(); - GoodsService::bindData($data, false); - } - - /** - * 添加商品数据 - * @auth true - */ - public function add() - { - $this->mode = 'add'; - $this->title = '添加商品数据'; - ShopGoods::mForm('form', 'code'); - } - - /** - * 编辑商品数据 - * @auth true - */ - public function edit() - { - $this->mode = 'edit'; - $this->title = '编辑商品数据'; - ShopGoods::mForm('form', 'code'); - } - - /** - * 复制编辑商品 - * @auth true - */ - public function copy() - { - $this->mode = 'copy'; - $this->title = '复制编辑商品'; - ShopGoods::mForm('form', 'code'); - } - - /** - * 表单数据处理 - * @param array $data - */ - protected function _copy_form_filter(array &$data) - { - if ($this->request->isPost()) { - $data['code'] = CodeExtend::uniqidNumber(20, 'G'); - } - } - - /** - * 表单数据处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _form_filter(array &$data) - { - if (empty($data['code'])) { - $data['code'] = CodeExtend::uniqidNumber(20, 'G'); - } - if ($this->request->isGet()) { - $data['marks'] = str2arr($data['marks'] ?? ''); - $data['payment'] = str2arr($data['payment'] ?? ''); - $data['cateids'] = str2arr($data['cateids'] ?? ''); - // 其他表单数据 - $this->marks = ShopGoodsMark::items(); - $this->cates = ShopGoodsCate::treeTable(true); - $this->trucks = ExpressService::templates(); - $this->upgrades = BaseUserUpgrade::items(); - $this->payments = BaseUserPayment::mk()->where(['status' => 1, 'deleted' => 0])->order('sort desc,id desc')->column('type,code,name', 'code'); - $this->discounts = BaseUserDiscount::mk()->where(['status' => 1, 'deleted' => 0])->order('sort desc,id desc')->column('id,name,items', 'id'); - // 商品规格处理 - $fields = 'goods_sku `sku`,goods_code,goods_spec `key`,price_selling `selling`,price_market `market`,number_virtual `virtual`,number_express `express`,reward_balance `balance`,reward_integral `integral`,status'; - $data['data_items'] = json_encode(ShopGoodsItem::mk()->where(['goods_code' => $data['code']])->column($fields, 'goods_spec'), JSON_UNESCAPED_UNICODE); - } elseif ($this->request->isPost()) { - if (empty($data['cover'])) $this->error('商品图片不能为空!'); - if (empty($data['slider'])) $this->error('轮播图片不能为空!'); - if (empty($data['payment'])) $this->error('支付方式不能为空!'); - // 商品规格保存 - [$data['price_market'], $data['price_selling']] = [0, 0]; - [$count, $items] = [0, array_column(json_decode($data['data_items'], true), 0)]; - foreach ($items as $item) if ($item['status'] > 0) { - if ($data['price_market'] === 0 || $data['price_market'] > $item['market']) $data['price_market'] = $item['market']; - if ($data['price_selling'] === 0 || $data['price_selling'] > $item['selling']) $data['price_selling'] = $item['selling']; - $count++; - } - if (empty($count)) $this->error('无效的的商品价格信息!'); - $data['marks'] = arr2str($data['marks'] ?? []); - $data['payment'] = arr2str($data['payment'] ?? []); - ShopGoodsItem::mk()->where(['goods_code' => $data['code']])->update(['status' => 0]); - foreach ($items as $item) data_save(ShopGoodsItem::class, [ - 'goods_sku' => $item['sku'], - 'goods_spec' => $item['key'], - 'goods_code' => $data['code'], - 'price_market' => $item['market'], - 'price_selling' => $item['selling'], - 'number_virtual' => $item['virtual'], - 'number_express' => $item['express'], - 'reward_balance' => $item['balance'], - 'reward_integral' => $item['integral'], - 'status' => $item['status'] ? 1 : 0, - ], 'goods_spec', [ - 'goods_code' => $data['code'], - ]); - } - } - - /** - * 表单结果处理 - * @param boolean $result - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _form_result(bool $result) - { - if ($result && $this->request->isPost()) { - GoodsService::stock(input('code')); - $this->success('商品编辑成功!', 'javascript:history.back()'); - } - } - - /** - * 商品库存入库 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function stock() - { - $map = $this->_vali(['code.require' => '商品编号不能为空哦!']); - if ($this->request->isGet()) { - $list = ShopGoods::mk()->where($map)->select()->toArray(); - if (empty($list)) $this->error('无效的商品数据,请稍候再试!'); - [$this->vo] = GoodsService::bindData($list); - $this->fetch(); - } else { - [$data, $post, $batch] = [[], $this->request->post(), CodeExtend::uniqidDate(12, 'B')]; - if (isset($post['goods_code']) && is_array($post['goods_code'])) { - foreach (array_keys($post['goods_code']) as $key) { - if ($post['goods_stock'][$key] > 0) $data[] = [ - 'batch_no' => $batch, - 'goods_code' => $post['goods_code'][$key], - 'goods_spec' => $post['goods_spec'][$key], - 'goods_stock' => $post['goods_stock'][$key], - ]; - } - if (!empty($data)) { - ShopGoodsStock::mk()->insertAll($data); - GoodsService::stock($map['code']); - $this->success('商品数据入库成功!'); - } - } - $this->error('没有需要商品入库的数据!'); - } - } - - /** - * 商品上下架 - * @auth true - */ - public function state() - { - ShopGoods::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ]), 'code'); - } - - /** - * 删除商品数据 - * @auth true - */ - public function remove() - { - ShopGoods::mSave($this->_vali([ - 'deleted.in:0,1' => '状态值范围异常!', - 'deleted.require' => '状态值不能为空!', - ]), 'code'); - } -} \ No newline at end of file diff --git a/app/data/controller/shop/Mark.php b/app/data/controller/shop/Mark.php deleted file mode 100644 index dd9839ff7..000000000 --- a/app/data/controller/shop/Mark.php +++ /dev/null @@ -1,67 +0,0 @@ -layTable(function () { - $this->title = '商品标签管理'; - }, function (QueryHelper $query) { - $query->like('name')->equal('status')->dateBetween('create_at'); - }); - } - - /** - * 添加商品标签 - * @auth true - */ - public function add() - { - ShopGoodsMark::mForm('form'); - } - - /** - * 编辑商品标签 - * @auth true - */ - public function edit() - { - ShopGoodsMark::mForm('form'); - } - - /** - * 修改商品标签状态 - * @auth true - */ - public function state() - { - ShopGoodsMark::mSave(); - } - - /** - * 删除商品标签 - * @auth true - */ - public function remove() - { - ShopGoodsMark::mDelete(); - } -} \ No newline at end of file diff --git a/app/data/controller/shop/Order.php b/app/data/controller/shop/Order.php deleted file mode 100644 index dc289dc43..000000000 --- a/app/data/controller/shop/Order.php +++ /dev/null @@ -1,192 +0,0 @@ -payments = PaymentService::getTypeAll(); - } - - /** - * 订单数据管理 - * @auth true - * @menu true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function index() - { - $this->title = '订单数据管理'; - // 状态数据统计 - $this->total = ['t0' => 0, 't1' => 0, 't2' => 0, 't3' => 0, 't4' => 0, 't5' => 0, 't6' => 0, 'ta' => 0]; - foreach (ShopOrder::mk()->field('status,count(1) total')->group('status')->cursor() as $vo) { - [$this->total["t{$vo['status']}"] = $vo['total'], $this->total["ta"] += $vo['total']]; - } - - // 订单列表查询 - $query = ShopOrder::mQuery(); - $query->like('order_no,truck_name,truck_phone,truck_province|truck_area|truck_address#address,truck_send_no,truck_send_name'); - $query->equal('status,payment_type,payment_status')->dateBetween('create_at,payment_datetime,cancel_datetime,truck_datetime,truck_send_datetime'); - - // 发货信息搜索 - $db = ShopOrderSend::mQuery()->like('address_name#truck_address_name,address_phone#truck_address_phone,address_province|address_city|address_area|address_content#truck_address_content')->db(); - if ($db->getOptions('where')) $query->whereRaw("order_no in {$db->field('order_no')->buildSql()}"); - - // 用户搜索查询 - $db = DataUser::mQuery()->like('phone|nickname#user_keys')->db(); - if ($db->getOptions('where')) $query->whereRaw("uuid in {$db->field('id')->buildSql()}"); - - // 代理搜索查询 - $db = DataUser::mQuery()->like('phone|nickname#from_keys')->db(); - if ($db->getOptions('where')) $query->whereRaw("puid1 in {$db->field('id')->buildSql()}"); - - // 列表选项卡 - if (is_numeric($this->type = trim(input('type', 'ta'), 't'))) { - $query->where(['status' => $this->type]); - } - - // 分页排序处理 - $query->where(['deleted_status' => 0])->order('id desc')->page(); - } - - /** - * 订单列表处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _index_page_filter(array &$data) - { - UserAdminService::buildByUid($data); - UserAdminService::buildByUid($data, 'puid1', 'from'); - OrderService::buildData($data); - foreach ($data as &$vo) { - if (!is_null($vo['payment_type']) and '' != $vo['payment_type']) { - $vo['payment_name'] = PaymentService::name($vo['payment_type']); - } - } - } - - /** - * 单据凭证支付审核 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function audit() - { - if ($this->request->isGet()) { - ShopOrder::mForm('', 'order_no'); - } else { - $data = $this->_vali([ - 'order_no.require' => '订单单号不能为空!', - 'status.in:0,1' => '审核状态数值异常!', - 'status.require' => '审核状态不能为空!', - 'remark.default' => '', - ]); - if (empty($data['status'])) { - $data['status'] = 0; - $data['cancel_status'] = 1; - $data['cancel_remark'] = $data['remark'] ?: '后台审核驳回并取消订单'; - $data['cancel_datetime'] = date('Y-m-d H:i:s'); - } else { - $data['status'] = 4; - $data['payment_code'] = CodeExtend::uniqidDate(20, 'T'); - $data['payment_status'] = 1; - $data['payment_remark'] = $data['remark'] ?: '后台审核支付凭证通过'; - $data['payment_datetime'] = date('Y-m-d H:i:s'); - } - $order = ShopOrder::mk()->where(['order_no' => $data['order_no']])->find(); - if (empty($order) || $order['status'] !== 3) $this->error('不允许操作审核!'); - // 无需发货时的处理 - if ($data['status'] === 4 && empty($order['truck_type'])) $data['status'] = 6; - // 更新订单支付状态 - $map = ['status' => 3, 'order_no' => $data['order_no']]; - if (ShopOrder::mk()->strict(false)->where($map)->update($data) !== false) { - if (in_array($data['status'], [4, 5, 6])) { - $this->app->event->trigger('ShopOrderPayment', $data['order_no']); - $this->success('订单审核通过成功!'); - } else { - $this->app->event->trigger('ShopOrderCancel'); - OrderService::stock($data['order_no']); - $this->success('审核驳回并取消成功!'); - } - } else { - $this->error('订单审核失败!'); - } - } - } - - /** - * 清理订单数据 - * @auth true - */ - public function clean() - { - $this->_queue('定时清理无效订单数据', "xdata:OrderClean", 0, [], 0, 60); - } - - /** - * 取消未支付的订单 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function cancel() - { - $map = $this->_vali(['order_no.require' => '订单号不能为空!',]); - $order = ShopOrder::mk()->where($map)->find(); - if (empty($order)) $this->error('订单查询异常!'); - if (!in_array($order['status'], [1, 2, 3])) $this->error('订单不能取消!'); - try { - $result = $order->save([ - 'status' => 0, - 'cancel_status' => 1, - 'cancel_remark' => '后台取消未支付的订单', - 'cancel_datetime' => date('Y-m-d H:i:s'), - ]); - if ($result !== false) { - OrderService::stock($order['order_no']); - $this->app->event->trigger('ShopOrderCancel', $order['order_no']); - $this->success('取消未支付的订单成功!'); - } else { - $this->error('取消支付的订单失败!'); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error($exception->getMessage()); - } - } -} \ No newline at end of file diff --git a/app/data/controller/shop/Send.php b/app/data/controller/shop/Send.php deleted file mode 100644 index 6974f0561..000000000 --- a/app/data/controller/shop/Send.php +++ /dev/null @@ -1,161 +0,0 @@ -title = '订单发货管理'; - // 发货地址数据 - $this->address = sysdata('ordersend'); - // 状态数据统计 - $this->total = ['t0' => 0, 't1' => 0, 't2' => 0, 'ta' => 0]; - $db = ShopOrder::mk()->whereIn('status', [4, 5, 6])->where(['truck_type' => 1]); - $query = ShopOrderSend::mk()->whereRaw("order_no in {$db->field('order_no')->buildSql()}"); - foreach ($query->fieldRaw('status,count(1) total')->group('status')->cursor() as $vo) { - $this->total["t{$vo['status']}"] = $vo['total']; - $this->total["ta"] += $vo['total']; - } - - // 订单列表查询 - $query = ShopOrderSend::mQuery(); - $query->dateBetween('address_datetime,send_datetime')->equal('status')->like('send_number#truck_number,order_no'); - $query->like('address_phone,address_name,address_province|address_city|address_area|address_content#address_content'); - - // 用户搜索查询 - $db = DataUser::mQuery()->like('phone|nickname#user_keys')->db(); - if ($db->getOptions('where')) $query->whereRaw("uuid in {$db->field('id')->buildSql()}"); - - // 订单搜索查询 - $db = ShopOrder::mk()->whereIn('status', [4, 5, 6])->where(['truck_type' => 1]); - $query->whereRaw("order_no in {$db->field('order_no')->buildSql()}"); - - // 列表选项卡状态 - if (is_numeric($this->type = trim(input('type', 'ta'), 't'))) { - $query->where(['status' => $this->type]); - } - - // 列表排序显示 - $query->order('id desc')->page(); - } - - /** - * 订单列表处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _index_page_filter(array &$data) - { - OrderService::buildData($data, false); - $orders = array_unique(array_column($data, 'order_no')); - $orderList = ShopOrder::mk()->whereIn('order_no', $orders)->column('*', 'order_no'); - foreach ($data as &$vo) $vo['order'] = $orderList[$vo['order_no']] ?? []; - } - - /** - * 快递发货地址 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function config() - { - if ($this->request->isGet()) { - $this->vo = sysdata('ordersend'); - $this->fetch(); - } else { - sysdata('ordersend', $this->request->post()); - $this->success('发货地址保存成功'); - } - } - - /** - * 修改快递管理 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function truck() - { - if ($this->request->isGet()) { - $query = BasePostageCompany::mk()->where(['deleted' => 0, 'status' => 1]); - $this->items = $query->order('sort desc,id desc')->select()->toArray(); - } - ShopOrderSend::mForm('truck_form', 'order_no'); - } - - /** - * 快递表单处理 - * @param array $vo - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _truck_form_filter(array &$vo) - { - if ($this->request->isPost()) { - $map = ['order_no' => $vo['order_no']]; - $order = ShopOrder::mk()->where($map)->find(); - if (empty($order)) $this->error('订单查询异常,请稍候再试!'); - - // 配送快递公司填写 - $map = ['code_1|code_2|code_3' => $vo['company_code']]; - $company = BasePostageCompany::mk()->where($map)->find(); - if (empty($company)) $this->error('配送快递公司异常,请重新选择快递公司!'); - - $vo['status'] = 2; - $vo['company_name'] = $company['name']; - $vo['send_datetime'] = $vo['send_datetime'] ?? date('Y-m-d H:i:s'); - if ($order['status'] === 4) { - // 更新订单发货状态 - $map = ['order_no' => $vo['order_no']]; - ShopOrder::mk()->where($map)->update(['status' => 5]); - } - } - } - - /** - * 快递追踪查询 - * @auth true - */ - public function query() - { - try { - $data = $this->_vali(['code.require' => '快递不能为空!', 'number.require' => '单号不能为空!']); - $this->result = ExpressService::query($data['code'], $data['number']); - if (empty($this->result['code'])) $this->error($this->result['info']); - $this->fetch('truck_query'); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error($exception->getMessage()); - } - } -} \ No newline at end of file diff --git a/app/data/controller/total/Portal.php b/app/data/controller/total/Portal.php deleted file mode 100644 index 91ae5a173..000000000 --- a/app/data/controller/total/Portal.php +++ /dev/null @@ -1,57 +0,0 @@ -usersTotal = DataUser::mk()->cache(true, 60)->count(); - $this->goodsTotal = ShopGoods::mk()->cache(true, 60)->where(['deleted' => 0])->count(); - $this->orderTotal = ShopOrder::mk()->cache(true, 60)->whereRaw('status >= 4')->count(); - $this->amountTotal = ShopOrder::mk()->cache(true, 60)->whereRaw('status >= 4')->sum('amount_total'); - // 近十天的用户及交易趋势 - $this->days = $this->app->cache->get('portals', []); - if (empty($this->days)) { - for ($i = 15; $i >= 0; $i--) { - $date = date('Y-m-d', strtotime("-{$i}days")); - $this->days[] = [ - '当天日期' => date('m-d', strtotime("-{$i}days")), - '增加用户' => DataUser::mk()->whereLike('create_at', "{$date}%")->count(), - '订单数量' => ShopOrder::mk()->whereLike('create_at', "{$date}%")->whereRaw('status>=4')->count(), - '订单金额' => ShopOrder::mk()->whereLike('create_at', "{$date}%")->whereRaw('status>=4')->sum('amount_total'), - '返利金额' => DataUserRebate::mk()->whereLike('create_at', "{$date}%")->sum('amount'), - '剩余余额' => DataUserBalance::mk()->whereRaw("create_at<='{$date} 23:59:59' and deleted=0")->sum('amount'), - '充值余额' => DataUserBalance::mk()->whereLike('create_at', "{$date}%")->whereRaw('amount>0 and deleted=0')->sum('amount'), - '消费余额' => DataUserBalance::mk()->whereLike('create_at', "{$date}%")->whereRaw('amount<0 and deleted=0')->sum('amount'), - ]; - } - $this->app->cache->set('portals', $this->days, 60); - } - // 会员级别分布统计 - $levels = BaseUserUpgrade::mk()->where(['status' => 1])->order('number asc')->column('number code,name,0 count', 'number'); - foreach (DataUser::mk()->field('count(1) count,vip_code level')->group('vip_code')->cursor() as $vo) { - $levels[$vo['level']]['count'] = isset($levels[$vo['level']]) ? $vo['count'] : 0; - } - $this->levels = array_values($levels); - $this->fetch(); - } -} \ No newline at end of file diff --git a/app/data/controller/user/Admin.php b/app/data/controller/user/Admin.php deleted file mode 100644 index 6a1e5f824..000000000 --- a/app/data/controller/user/Admin.php +++ /dev/null @@ -1,185 +0,0 @@ - '', 'name' => '全部用户', 'count' => 0]; - foreach ($ls as $k => $v) $ts["t{$k}"] = ['vip' => $k, 'name' => $v['name'], 'count' => 0,]; - $ts['to'] = ['vip' => '', 'name' => '其他用户', 'count' => 0]; - // 等级分组统计 - foreach (DataUser::mk()->field('vip_code vip,count(1) count')->group('vip_code')->cursor() as $v) { - [$name, $count] = ["t{$v['vip']}", $v['count'], $ts['ta']['count'] += $v['count']]; - isset($ts[$name]) ? $ts[$name]['count'] += $count : $ts['to']['count'] += $count; - } - if (empty($ts['to']['count'])) unset($ts['to']); - $this->total = $ts; - - // 设置页面标题 - $this->title = '普通用户管理'; - - // 创建查询对象 - $query = DataUser::mQuery()->order('id desc'); - - // 数据筛选选项 - $this->type = ltrim(input('type', 'ta'), 't'); - if (is_numeric($this->type)) $query->where(['vip_code' => $this->type]); - elseif ($this->type === 'o') $query->whereNotIn('vip_code', array_keys($ls)); - - // 用户搜索查询 - $db = DataUser::mQuery()->equal('vip_code#from_vipcode')->like('phone|username|nickname#from_keys')->db(); - if ($db->getOptions('where')) $query->whereRaw("pid1 in {$db->field('id')->buildSql()}"); - - // 数据查询分页 - $query->like('phone|username|nickname#username')->equal('status,vip_code')->dateBetween('create_at')->page(); - } - - /** - * 数据列表处理 - * @param array $data - */ - protected function _page_filter(array &$data) - { - $this->upgrades = BaseUserUpgrade::items(); - UserAdminService::buildByUid($data, 'pid1', 'from'); - } - - /** - * 用户团队关系 - * @auth true - * @menu true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function teams() - { - $this->title = '用户团队关系'; - $map = ['pid1' => input('from', 0)]; - DataUser::mQuery()->where($map)->page(false); - } - - /** - * 数据列表处理 - * @param array $data - */ - protected function _teams_page_filter(array &$data) - { - $uids = array_unique(array_column($data, 'id')); - $subCount = DataUser::mk()->whereIn('pid1', $uids)->group('pid1')->column('count(1) count', 'pid1'); - foreach ($data as &$vo) $vo['subCount'] = $subCount[$vo['id']] ?? 0; - } - - /** - * 永久绑定代理 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function forever() - { - $map = $this->_vali(['id.require' => '用户ID不能为空!']); - $user = DataUser::mk()->where($map)->find(); - if (empty($user) || empty($user['pid0'])) $this->error('用户不符合操作要求!'); - [$status, $message] = UserUpgradeService::bindAgent($user['id'], $user['pid0']); - $status && sysoplog('前端用户管理', "修改用户[{$map['id']}]的代理为永久状态"); - empty($status) ? $this->error($message) : $this->success($message); - } - - /** - * 设为总部用户 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function unbind() - { - $map = $this->_vali(['id.require' => '用户ID不能为空!']); - $user = DataUser::mk()->where($map)->findOrEmpty(); - if ($user->isEmpty()) $this->error('用户不符合操作要求!'); - // 修改指定用户代理数据 - $user->save(['pid0' => 0, 'pid1' => 0, 'pid2' => 0, 'pids' => 1, 'path' => '-', 'layer' => 1]); - // 刷新用户等级及上级等级 - UserUpgradeService::upgrade($user['id'], true); - sysoplog('前端用户管理', "设置用户[{$map['id']}]为总部用户"); - $this->success('设为总部用户成功!'); - } - - /** - * 绑定上级代理 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function parent() - { - if ($this->request->isGet()) { - $this->upgrades = BaseUserUpgrade::items(); - $data = $this->_vali(['uuid.require' => '待操作UID不能为空!']); - - // 排除下级用户 - $path = DataUser::mk()->where(['id' => $data['uuid']])->value('path', '-'); - $subids = DataUser::mk()->whereLike('path', "{$path}{$data['uuid']}-%")->column('id'); - $query = DataUser::mQuery()->order('id desc')->whereNotIn('id', array_merge($subids, array_values($data))); - - // 用户搜索查询 - $db = DataUser::mQuery()->equal('vip_code#from_vipcode')->like('phone#from_phone,username|nickname#from_username')->db(); - if ($db->getOptions('where')) $query->whereRaw("pid1 in {$db->field('id')->buildSql()}"); - - // 数据查询分页 - $query->like('phone,username|nickname#username')->whereRaw('vip_code>0')->equal('status,vip_code')->dateBetween('create_at')->page(); - } else { - $data = $this->_vali(['pid.require' => '待绑定代理不能为空!', 'uuid.require' => '待操作用户不能为空!']); - [$status, $message] = UserUpgradeService::bindAgent($data['uuid'], $data['pid'], 2); - $status && sysoplog('前端用户管理', "修改用户[{$data['uuid']}]的代理为用户[{$data['pid']}]"); - empty($status) ? $this->error($message) : $this->success($message); - } - } - - /** - * 重算用户余额返利 - * @auth true - */ - public function sync() - { - $this->_queue('重新计算用户余额返利', 'xdata:UserAmount'); - } - - /** - * 修改用户状态 - * @auth true - */ - public function state() - { - DataUser::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } -} \ No newline at end of file diff --git a/app/data/controller/user/Balance.php b/app/data/controller/user/Balance.php deleted file mode 100644 index 191a2c9b4..000000000 --- a/app/data/controller/user/Balance.php +++ /dev/null @@ -1,136 +0,0 @@ -title = '余额充值记录'; - // 统计用户余额 - $this->balance = UserBalanceService::amount(0); - // 现有余额类型 - $this->names = DataUserBalance::mk()->group('name')->column('name'); - // 创建查询对象 - $query = DataUserBalance::mQuery()->equal('name,upgrade'); - // 用户搜索查询 - $db = DataUser::mQuery()->like('phone|nickname#user_keys')->db(); - if ($db->getOptions('where')) $query->whereRaw("uuid in {$db->field('id')->buildSql()}"); - // 数据查询分页 - $query->where(['deleted' => 0])->like('code,remark')->dateBetween('create_at')->order('id desc')->page(); - } - - /** - * 数据列表处理 - * @param array $data - */ - protected function _index_page_filter(array &$data) - { - UserAdminService::buildByUid($data); - $uids = array_unique(array_column($data, 'create_by')); - $users = SystemUser::mk()->whereIn('id', $uids)->column('username', 'id'); - $this->upgrades = BaseUserUpgrade::items(); - foreach ($data as &$vo) { - $vo['upgradeinfo'] = $this->upgrades[$vo['upgrade']] ?? []; - $vo['create_byname'] = $users[$vo['create_by']] ?? ''; - } - } - - /** - * 添加余额充值 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function add() - { - $data = $this->_vali(['uuid.require' => '用户UID不能为空!']); - $this->user = DataUser::mk()->where(['id' => $data['uuid']])->find(); - if (empty($this->user)) $this->error('待充值的用户不存在!'); - DataUserBalance::mForm('form'); - } - - /** - * 表单数据处理 - * @param array $data - */ - protected function _form_filter(array &$data) - { - if (empty($data['code'])) { - $data['code'] = CodeExtend::uniqidDate('20', 'B'); - } - if ($this->request->isGet()) { - $this->upgrades = BaseUserUpgrade::items(); - } - if ($this->request->isPost()) { - $data['create_by'] = AdminService::getUserId(); - if (empty(floatval($data['amount'])) && empty($data['upgrade'])) { - $this->error('金额为零并且没有升级行为!'); - } - } - } - - /** - * 表单结果处理 - * @param bool $state - * @param array $data - * @throws \think\db\exception\DbException - */ - protected function _form_result(bool $state, array $data) - { - if ($state && isset($data['uuid'])) { - UserBalanceService::amount($data['uuid']); - UserUpgradeService::upgrade($data['uuid']); - } - } - - /** - * 删除充值记录 - * @auth true - */ - public function remove() - { - DataUserBalance::mDelete('', [['code', 'like', 'B%']]); - } - - /** - * 删除结果处理 - * @param bool $state - * @throws \think\db\exception\DbException - */ - protected function _delete_result(bool $state) - { - if ($state) { - $map = [['id', 'in', str2arr(input('id', ''))]]; - foreach (DataUserBalance::mk()->where($map)->cursor() as $vo) { - UserBalanceService::amount($vo['uuid']); - UserUpgradeService::upgrade($vo['uuid']); - } - } - } -} \ No newline at end of file diff --git a/app/data/controller/user/Message.php b/app/data/controller/user/Message.php deleted file mode 100644 index f31655cdb..000000000 --- a/app/data/controller/user/Message.php +++ /dev/null @@ -1,61 +0,0 @@ -title = '短信发送管理'; - $query = DataUserMessage::mQuery(); - $query->equal('status')->like('phone,content'); - $query->dateBetween('create_at')->order('id desc')->page(); - } - - /** - * 短信接口配置 - * @auth true - * @menu true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function config() - { - if ($this->request->isGet()) { - $this->title = '短信接口配置'; - $this->result = MessageService::instance()->balance(); - $this->fetch(); - } else { - $data = $this->request->post(); - foreach ($data as $k => $v) sysconf($k, $v); - $this->success('配置保存成功!'); - } - } - - /** - * 删除短信记录 - * @auth true - */ - public function remove() - { - DataUserMessage::mDelete(); - } -} \ No newline at end of file diff --git a/app/data/controller/user/Rebate.php b/app/data/controller/user/Rebate.php deleted file mode 100644 index 58f9953b5..000000000 --- a/app/data/controller/user/Rebate.php +++ /dev/null @@ -1,93 +0,0 @@ -title = '用户返利管理'; - // 统计所有返利 - $this->types = RebateService::PRIZES; - $this->rebate = UserRebateService::amount(0); - // 创建查询对象 - $query = DataUserRebate::mQuery()->equal('type')->like('name,order_no'); - // 会员条件查询 - $db = $this->_query('DataUser')->like('nickname#order_nickname,phone#order_phone')->db(); - if ($db->getOptions('where')) $query->whereRaw("order_uuid in {$db->field('id')->buildSql()}"); - // 代理条件查询 - $db = $this->_query('DataUser')->like('nickname#agent_nickname,phone#agent_phone')->db(); - if ($db->getOptions('where')) $query->whereRaw("uuid in {$db->field('id')->buildSql()}"); - // 查询分页 - $query->dateBetween('create_at')->order('id desc')->page(); - } - - /** - * 商城订单列表处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _index_page_filter(array &$data) - { - $uids = array_merge(array_column($data, 'uuid'), array_column($data, 'order_uuid')); - $userItem = DataUser::mk()->whereIn('id', array_unique($uids))->select(); - $goodsItem = ShopOrderItem::mk()->whereIn('order_no', array_unique(array_column($data, 'order_no')))->select(); - foreach ($data as &$vo) { - $vo['type'] = RebateService::name($vo['type']); - [$vo['user'], $vo['agent'], $vo['list']] = [[], [], []]; - foreach ($userItem as $user) { - if ($user['id'] === $vo['uuid']) $vo['agent'] = $user; - if ($user['id'] === $vo['order_uuid']) $vo['user'] = $user; - } - foreach ($goodsItem as $goods) { - if ($goods['order_no'] === $vo['order_no']) { - $vo['list'][] = $goods; - } - } - } - } - - /** - * 用户返利配置 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function config() - { - $this->skey = 'RebateRule'; - $this->title = '用户返利配置'; - if ($this->request->isGet()) { - $this->data = sysdata($this->skey); - $this->levels = BaseUserUpgrade::items(); - $this->fetch(); - } else { - sysdata($this->skey, $this->request->post()); - $this->success('奖励修改成功'); - } - } -} \ No newline at end of file diff --git a/app/data/controller/user/Transfer.php b/app/data/controller/user/Transfer.php deleted file mode 100644 index c371f71bd..000000000 --- a/app/data/controller/user/Transfer.php +++ /dev/null @@ -1,178 +0,0 @@ -types = UserTransferService::instance()->types(); - } - - /** - * 用户提现配置 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function config() - { - $this->skey = 'TransferRule'; - $this->title = '用户提现配置'; - $this->_sysdata(); - } - - /** - * 微信转账配置 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function payment() - { - $this->skey = 'TransferWxpay'; - $this->title = '微信提现配置'; - $this->_sysdata(); - } - - /** - * 配置数据处理 - * @param string $tpl 模板文件 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _sysdata(string $tpl = '') - { - if ($this->request->isGet()) { - $this->data = sysdata($this->skey); - $this->fetch($tpl); - } else { - sysdata($this->skey, $this->request->post()); - $this->success('配置修改成功'); - } - } - - /** - * 用户提现管理 - * @menu true - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function index() - { - $this->title = '用户提现管理'; - $this->transfer = UserTransferService::amount(0); - // 创建查询对象 - $query = DataUserTransfer::mQuery()->order('id desc'); - // 用户条件搜索 - $db = DataUser::mQuery()->like('phone,username|nickname#nickname')->db(); - if ($db->getOptions('where')) $query->whereRaw("uuid in {$db->field('id')->buildSql()}"); - // 数据列表处理 - $query->equal('type,status')->dateBetween('create_at')->page(); - } - - /** - * 数据列表处理 - * @param array $data - */ - protected function _page_filter(array &$data) - { - UserAdminService::buildByUid($data); - foreach ($data as &$vo) { - $vo['type_name'] = UserTransferService::instance()->types($vo['type']); - } - } - - /** - * 提现审核操作 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function auditStatus() - { - $this->_audit(); - } - - /** - * 提现打款操作 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function auditPayment() - { - $this->_audit(); - } - - /** - * 提现审核打款 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _audit() - { - if ($this->request->isGet()) { - DataUserTransfer::mForm('audit', 'code'); - } else { - $data = $this->_vali([ - 'code.require' => '打款单号不能为空!', - 'status.require' => '交易审核操作类型!', - 'status.in:0,1,2,3,4' => '交易审核操作类型!', - 'remark.default' => '', - ]); - $map = ['code' => $data['code']]; - $find = DataUserTransfer::mk()->where($map)->find(); - if (empty($find)) $this->error('不允许操作审核!'); - // 提现状态(0已拒绝, 1待审核, 2已审核, 3打款中, 4已打款, 5已收款) - if (in_array($data['status'], [0, 1, 2, 3])) { - $data['last_at'] = date('Y-m-d H:i:s'); - } elseif ($data['status'] == 4) { - $data['trade_no'] = CodeExtend::uniqidDate(20); - $data['trade_time'] = date('Y-m-d H:i:s'); - $data['change_time'] = date('Y-m-d H:i:s'); - $data['change_desc'] = ($data['remark'] ?: '线下打款成功') . ' By ' . AdminService::getUserName(); - } - if (DataUserTransfer::mk()->strict(false)->where($map)->update($data) !== false) { - $this->success('操作成功'); - } else { - $this->error('操作失败!'); - } - } - } - - /** - * 后台打款服务 - * @auth true - */ - public function sync() - { - $this->_queue('提现到微信余额定时处理', 'xdata:UserTransfer', 0, [], 0, 50); - } -} \ No newline at end of file diff --git a/app/data/database/20221013045838_install_user.php b/app/data/database/20221013045838_install_user.php deleted file mode 100644 index 4b137344d..000000000 --- a/app/data/database/20221013045838_install_user.php +++ /dev/null @@ -1,1213 +0,0 @@ -_create_base_postage_company(); - $this->_create_base_postage_region(); - $this->_create_base_postage_template(); - $this->_create_base_user_discount(); - $this->_create_base_user_message(); - $this->_create_base_user_payment(); - $this->_create_base_user_upgrade(); - $this->_create_data_news_item(); - $this->_create_data_news_mark(); - $this->_create_data_news_x_collect(); - $this->_create_data_user(); - $this->_create_data_user_address(); - $this->_create_data_user_balance(); - $this->_create_data_user_logger(); - $this->_create_data_user_message(); - $this->_create_data_user_payment(); - $this->_create_data_user_rebate(); - $this->_create_data_user_token(); - $this->_create_data_user_transfer(); - $this->_create_shop_goods(); - $this->_create_shop_goods_cate(); - $this->_create_shop_goods_item(); - $this->_create_shop_goods_mark(); - $this->_create_shop_goods_stock(); - $this->_create_shop_order(); - $this->_create_shop_order_item(); - $this->_create_shop_order_send(); - } - - /** - * 创建数据对象 - * @class BasePostageCompany - * @table base_postage_company - * @return void - */ - private function _create_base_postage_company() - { - - // 当前数据表 - $table = 'base_postage_company'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-快递-公司', - ]) - ->addColumn('name', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '快递公司名称']) - ->addColumn('code_1', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '快递公司代码']) - ->addColumn('code_2', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '百度快递100代码']) - ->addColumn('code_3', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '官方快递100代码']) - ->addColumn('remark', 'string', ['limit' => 512, 'default' => '', 'null' => true, 'comment' => '快递公司描述']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '状态(0.无效,1.有效)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(1已删除,0未删除)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code_1', ['name' => 'idx_base_postage_company_code_1']) - ->addIndex('code_2', ['name' => 'idx_base_postage_company_code_2']) - ->addIndex('code_3', ['name' => 'idx_base_postage_company_code_3']) - ->addIndex('status', ['name' => 'idx_base_postage_company_status']) - ->addIndex('deleted', ['name' => 'idx_base_postage_company_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BasePostageRegion - * @table base_postage_region - * @return void - */ - private function _create_base_postage_region() - { - - // 当前数据表 - $table = 'base_postage_region'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-快递-区域', - ]) - ->addColumn('pid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '上级PID']) - ->addColumn('first', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '首字母']) - ->addColumn('short', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '区域简称']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '区域名称']) - ->addColumn('level', 'integer', ['limit' => 4, 'default' => 0, 'null' => true, 'comment' => '区域层级']) - ->addColumn('pinyin', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '区域拼音']) - ->addColumn('code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '区域邮编']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '使用状态']) - ->addColumn('lng', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '所在经度']) - ->addColumn('lat', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '所在纬度']) - ->addIndex('pid', ['name' => 'idx_base_postage_region_pid']) - ->addIndex('name', ['name' => 'idx_base_postage_region_name']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BasePostageTemplate - * @table base_postage_template - * @return void - */ - private function _create_base_postage_template() - { - - // 当前数据表 - $table = 'base_postage_template'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-快递-模板', - ]) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '模板编号']) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '模板名称']) - ->addColumn('normal', 'text', ['default' => null, 'null' => true, 'comment' => '默认规则']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '模板规则']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '模板状态']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_base_postage_template_code']) - ->addIndex('status', ['name' => 'idx_base_postage_template_status']) - ->addIndex('deleted', ['name' => 'idx_base_postage_template_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BaseUserDiscount - * @table base_user_discount - * @return void - */ - private function _create_base_user_discount() - { - - // 当前数据表 - $table = 'base_user_discount'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-基础-折扣', - ]) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '方案名称']) - ->addColumn('items', 'text', ['default' => null, 'null' => true, 'comment' => '方案规则']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '方案描述']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '方案状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_base_user_discount_status']) - ->addIndex('deleted', ['name' => 'idx_base_user_discount_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BaseUserMessage - * @table base_user_message - * @return void - */ - private function _create_base_user_message() - { - - // 当前数据表 - $table = 'base_user_message'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-基础-通知', - ]) - ->addColumn('type', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '消息类型']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '消息名称']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '消息内容']) - ->addColumn('num_read', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '阅读次数']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '消息状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_base_user_message_type']) - ->addIndex('status', ['name' => 'idx_base_user_message_status']) - ->addIndex('deleted', ['name' => 'idx_base_user_message_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BaseUserPayment - * @table base_user_payment - * @return void - */ - private function _create_base_user_payment() - { - - // 当前数据表 - $table = 'base_user_payment'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-基础-支付', - ]) - ->addColumn('type', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '支付类型']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '通道编号']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '支付名称']) - ->addColumn('cover', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '支付图标']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '支付参数']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '支付说明']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '支付状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_base_user_payment_type']) - ->addIndex('code', ['name' => 'idx_base_user_payment_code']) - ->addIndex('status', ['name' => 'idx_base_user_payment_status']) - ->addIndex('deleted', ['name' => 'idx_base_user_payment_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BaseUserUpgrade - * @table base_user_upgrade - * @return void - */ - private function _create_base_user_upgrade() - { - - // 当前数据表 - $table = 'base_user_upgrade'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-等级', - ]) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '用户级别名称']) - ->addColumn('number', 'integer', ['limit' => 2, 'default' => 0, 'null' => true, 'comment' => '用户级别序号']) - ->addColumn('rebate_rule', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '用户奖利规则']) - ->addColumn('upgrade_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '会员升级规则(0单个,1同时)']) - ->addColumn('upgrade_team', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '团队人数统计(0不计,1累计)']) - ->addColumn('goods_vip_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '入会礼包状态']) - ->addColumn('order_amount_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '订单金额状态']) - ->addColumn('order_amount_number', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单金额累计']) - ->addColumn('teams_users_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '团队人数状态']) - ->addColumn('teams_users_number', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '团队人数累计']) - ->addColumn('teams_direct_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '直推人数状态']) - ->addColumn('teams_direct_number', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '直推人数累计']) - ->addColumn('teams_indirect_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '间推人数状态']) - ->addColumn('teams_indirect_number', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '间推人数累计']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '用户级别描述']) - ->addColumn('utime', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '等级更新时间']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '用户等级状态(1使用,0禁用)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '等级创建时间']) - ->addIndex('status', ['name' => 'idx_base_user_upgrade_status']) - ->addIndex('number', ['name' => 'idx_base_user_upgrade_number']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataNewsItem - * @table data_news_item - * @return void - */ - private function _create_data_news_item() - { - - // 当前数据表 - $table = 'data_news_item'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-文章-内容', - ]) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '文章编号']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '文章标题']) - ->addColumn('mark', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '文章标签']) - ->addColumn('cover', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '文章封面']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '备注说明']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '文章内容']) - ->addColumn('num_like', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文章点赞数']) - ->addColumn('num_read', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文章阅读数']) - ->addColumn('num_collect', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文章收藏数']) - ->addColumn('num_comment', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文章评论数']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '文章状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_data_news_item_code']) - ->addIndex('status', ['name' => 'idx_data_news_item_status']) - ->addIndex('deleted', ['name' => 'idx_data_news_item_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataNewsMark - * @table data_news_mark - * @return void - */ - private function _create_data_news_mark() - { - - // 当前数据表 - $table = 'data_news_mark'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-文章-标签', - ]) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '标签名称']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '标签说明']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '标签状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_data_news_mark_status']) - ->addIndex('deleted', ['name' => 'idx_data_news_mark_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataNewsXCollect - * @table data_news_x_collect - * @return void - */ - private function _create_data_news_x_collect() - { - - // 当前数据表 - $table = 'data_news_x_collect'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-文章-标记', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('type', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '记录类型(1收藏,2点赞,3历史,4评论)']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '文章编号']) - ->addColumn('reply', 'text', ['default' => null, 'null' => true, 'comment' => '评论内容']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '记录状态(0无效,1待审核,2已审核)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_data_news_x_collect_type']) - ->addIndex('code', ['name' => 'idx_data_news_x_collect_code']) - ->addIndex('status', ['name' => 'idx_data_news_x_collect_status']) - ->addIndex('uuid', ['name' => 'idx_data_news_x_collect_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUser - * @table data_user - * @return void - */ - private function _create_data_user() - { - - // 当前数据表 - $table = 'data_user'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-会员', - ]) - ->addColumn('pid0', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '临时推荐人UID']) - ->addColumn('pid1', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '推荐人一级UID']) - ->addColumn('pid2', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '推荐人二级UID']) - ->addColumn('pids', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '推荐人绑定状态']) - ->addColumn('path', 'string', ['limit' => 999, 'default' => '-', 'null' => true, 'comment' => '推荐关系路径']) - ->addColumn('layer', 'integer', ['limit' => 20, 'default' => 1, 'null' => true, 'comment' => '推荐关系层级']) - ->addColumn('openid1', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '小程序OPENID']) - ->addColumn('openid2', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '服务号OPENID']) - ->addColumn('unionid', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '公众号UnionID']) - ->addColumn('phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '用户手机']) - ->addColumn('headimg', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '用户头像']) - ->addColumn('username', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户姓名']) - ->addColumn('nickname', 'string', ['limit' => 99, 'default' => '', 'null' => true, 'comment' => '用户昵称']) - ->addColumn('password', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '登录密码']) - ->addColumn('region_province', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '所在省份']) - ->addColumn('region_city', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '所在城市']) - ->addColumn('region_area', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '所在区域']) - ->addColumn('base_age', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户年龄']) - ->addColumn('base_sex', 'string', ['limit' => 10, 'default' => '', 'null' => true, 'comment' => '用户性别']) - ->addColumn('base_height', 'string', ['limit' => 10, 'default' => '', 'null' => true, 'comment' => '用户身高']) - ->addColumn('base_weight', 'string', ['limit' => 10, 'default' => '', 'null' => true, 'comment' => '用户体重']) - ->addColumn('base_birthday', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '用户生日']) - ->addColumn('vip_code', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => 'VIP等级编号']) - ->addColumn('vip_name', 'string', ['limit' => 30, 'default' => '普通用户', 'null' => true, 'comment' => 'VIP等级名称']) - ->addColumn('vip_order', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => 'VIP升级订单']) - ->addColumn('vip_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => 'VIP等级时间']) - ->addColumn('buy_vip_entry', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '是否入会礼包']) - ->addColumn('buy_last_date', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '最后支付时间']) - ->addColumn('rebate_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '返利金额统计']) - ->addColumn('rebate_used', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '返利提现统计']) - ->addColumn('rebate_lock', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '返利锁定统计']) - ->addColumn('balance_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '累计充值统计']) - ->addColumn('balance_used', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '已经使用统计']) - ->addColumn('teams_users_total', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '团队人数统计']) - ->addColumn('teams_users_direct', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '直属人数团队']) - ->addColumn('teams_users_indirect', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '间接人数团队']) - ->addColumn('order_amount_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单交易统计']) - ->addColumn('teams_amount_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '二级团队业绩']) - ->addColumn('teams_amount_direct', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '直属团队业绩']) - ->addColumn('teams_amount_indirect', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '间接团队业绩']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '用户备注描述']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '用户状态(1正常,0已黑)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '注册时间']) - ->addIndex('status', ['name' => 'idx_data_user_status']) - ->addIndex('deleted', ['name' => 'idx_data_user_deleted']) - ->addIndex('openid1', ['name' => 'idx_data_user_openid1']) - ->addIndex('openid2', ['name' => 'idx_data_user_openid2']) - ->addIndex('unionid', ['name' => 'idx_data_user_unionid']) - ->addIndex('pid1', ['name' => 'idx_data_user_pid1']) - ->addIndex('pid2', ['name' => 'idx_data_user_pid2']) - ->addIndex('pid0', ['name' => 'idx_data_user_pid0']) - ->addIndex('pids', ['name' => 'idx_data_user_pids']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserAddress - * @table data_user_address - * @return void - */ - private function _create_data_user_address() - { - - // 当前数据表 - $table = 'data_user_address'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-地址', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '地址类型(0普通,1默认)']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '地址编号']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '收货姓名']) - ->addColumn('phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '收货手机']) - ->addColumn('idcode', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '身体证号']) - ->addColumn('idimg1', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '身份证正面']) - ->addColumn('idimg2', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '身份证反面']) - ->addColumn('province', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '地址-省份']) - ->addColumn('city', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '地址-城市']) - ->addColumn('area', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '地址-区域']) - ->addColumn('address', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '地址-详情']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_data_user_address_type']) - ->addIndex('code', ['name' => 'idx_data_user_address_code']) - ->addIndex('deleted', ['name' => 'idx_data_user_address_deleted']) - ->addIndex('uuid', ['name' => 'idx_data_user_address_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserBalance - * @table data_user_balance - * @return void - */ - private function _create_data_user_balance() - { - - // 当前数据表 - $table = 'data_user_balance'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-余额', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '充值编号']) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '充值名称']) - ->addColumn('remark', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '充值备注']) - ->addColumn('amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '充值金额']) - ->addColumn('upgrade', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '强制升级']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '系统用户']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_data_user_balance_code']) - ->addIndex('deleted', ['name' => 'idx_data_user_balance_deleted']) - ->addIndex('uuid', ['name' => 'idx_data_user_balance_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserLogger - * @table data_user_logger - * @return void - */ - private function _create_data_user_logger() - { - - // 当前数据表 - $table = 'data_user_logger'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-会员', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '登录用户']) - ->addColumn('phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '用户手机']) - ->addColumn('regon_ip', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '登录地址']) - ->addColumn('region_prov', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '所有省份']) - ->addColumn('region_city', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '所在城市']) - ->addColumn('region_area', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '所在区间']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '注册时间']) - ->addIndex('uuid', ['name' => 'idx_data_user_logger_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserMessage - * @table data_user_message - * @return void - */ - private function _create_data_user_message() - { - - // 当前数据表 - $table = 'data_user_message'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-短信', - ]) - ->addColumn('type', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '短信类型']) - ->addColumn('msgid', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '消息编号']) - ->addColumn('phone', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '目标手机']) - ->addColumn('region', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '国家编号']) - ->addColumn('result', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '返回结果']) - ->addColumn('content', 'string', ['limit' => 512, 'default' => '', 'null' => true, 'comment' => '短信内容']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '短信状态(0失败,1成功)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_data_user_message_type']) - ->addIndex('status', ['name' => 'idx_data_user_message_status']) - ->addIndex('phone', ['name' => 'idx_data_user_message_phone']) - ->addIndex('msgid', ['name' => 'idx_data_user_message_msgid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserPayment - * @table data_user_payment - * @return void - */ - private function _create_data_user_payment() - { - - // 当前数据表 - $table = 'data_user_payment'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-支付', - ]) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '订单单号']) - ->addColumn('order_name', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '订单描述']) - ->addColumn('order_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单金额']) - ->addColumn('payment_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '支付编号']) - ->addColumn('payment_type', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '支付通道']) - ->addColumn('payment_trade', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '支付单号']) - ->addColumn('payment_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '支付状态']) - ->addColumn('payment_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '支付金额']) - ->addColumn('payment_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '支付时间']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('order_no', ['name' => 'idx_data_user_payment_order_no']) - ->addIndex('payment_code', ['name' => 'idx_data_user_payment_payment_code']) - ->addIndex('payment_type', ['name' => 'idx_data_user_payment_payment_type']) - ->addIndex('payment_trade', ['name' => 'idx_data_user_payment_payment_trade']) - ->addIndex('payment_status', ['name' => 'idx_data_user_payment_payment_status']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserRebate - * @table data_user_rebate - * @return void - */ - private function _create_data_user_rebate() - { - - // 当前数据表 - $table = 'data_user_rebate'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-返利', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('date', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '奖励日期']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '奖励编号']) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '奖励类型']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '奖励名称']) - ->addColumn('amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '奖励数量']) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '订单单号']) - ->addColumn('order_uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '订单用户']) - ->addColumn('order_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单金额']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '生效状态(0未生效,1已生效)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删除,1已删除)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_data_user_rebate_type']) - ->addIndex('date', ['name' => 'idx_data_user_rebate_date']) - ->addIndex('code', ['name' => 'idx_data_user_rebate_code']) - ->addIndex('name', ['name' => 'idx_data_user_rebate_name']) - ->addIndex('status', ['name' => 'idx_data_user_rebate_status']) - ->addIndex('uuid', ['name' => 'idx_data_user_rebate_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserToken - * @table data_user_token - * @return void - */ - private function _create_data_user_token() - { - - // 当前数据表 - $table = 'data_user_token'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-认证', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '授权类型']) - ->addColumn('time', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '有效时间']) - ->addColumn('token', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '授权令牌']) - ->addColumn('tokenv', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '授权验证']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('uuid', ['name' => 'idx_data_user_token_uuid']) - ->addIndex('type', ['name' => 'idx_data_user_token_type']) - ->addIndex('time', ['name' => 'idx_data_user_token_time']) - ->addIndex('token', ['name' => 'idx_data_user_token_token']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserTransfer - * @table data_user_transfer - * @return void - */ - private function _create_data_user_transfer() - { - - // 当前数据表 - $table = 'data_user_transfer'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-提现', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('type', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '提现方式']) - ->addColumn('date', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '提现日期']) - ->addColumn('code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '提现单号']) - ->addColumn('appid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('openid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号OPENID']) - ->addColumn('charge_rate', 'decimal', ['precision' => 20, 'scale' => 4, 'default' => '0.0000', 'null' => true, 'comment' => '提现手续费比例']) - ->addColumn('charge_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '提现手续费金额']) - ->addColumn('amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '提现转账金额']) - ->addColumn('qrcode', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '收款码图片地址']) - ->addColumn('bank_wseq', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '微信银行编号']) - ->addColumn('bank_name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '开户银行名称']) - ->addColumn('bank_bran', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '开户分行名称']) - ->addColumn('bank_user', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '开户账号姓名']) - ->addColumn('bank_code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '开户银行卡号']) - ->addColumn('alipay_user', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '支付宝姓名']) - ->addColumn('alipay_code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '支付宝账号']) - ->addColumn('remark', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '提现描述']) - ->addColumn('trade_no', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '交易单号']) - ->addColumn('trade_time', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '打款时间']) - ->addColumn('change_time', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '处理时间']) - ->addColumn('change_desc', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '处理描述']) - ->addColumn('audit_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '审核状态']) - ->addColumn('audit_remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '审核描述']) - ->addColumn('audit_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '审核时间']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '提现状态(0失败,1待审核,2已审核,3打款中,4已打款,5已收款)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_data_user_transfer_code']) - ->addIndex('status', ['name' => 'idx_data_user_transfer_status']) - ->addIndex('date', ['name' => 'idx_data_user_transfer_date']) - ->addIndex('type', ['name' => 'idx_data_user_transfer_type']) - ->addIndex('audit_status', ['name' => 'idx_data_user_transfer_audit_status']) - ->addIndex('appid', ['name' => 'idx_data_user_transfer_appid']) - ->addIndex('openid', ['name' => 'idx_data_user_transfer_openid']) - ->addIndex('uuid', ['name' => 'idx_data_user_transfer_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoods - * @table shop_goods - * @return void - */ - private function _create_shop_goods() - { - - // 当前数据表 - $table = 'shop_goods'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-内容', - ]) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品编号']) - ->addColumn('name', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '商品名称']) - ->addColumn('marks', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '商品标签']) - ->addColumn('cateids', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '分类编号']) - ->addColumn('cover', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '商品封面']) - ->addColumn('slider', 'text', ['default' => null, 'null' => true, 'comment' => '轮播图片']) - ->addColumn('remark', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '商品描述']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '商品详情']) - ->addColumn('payment', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '支付方式']) - ->addColumn('data_specs', 'text', ['default' => null, 'null' => true, 'comment' => '商品规格(JSON)']) - ->addColumn('data_items', 'text', ['default' => null, 'null' => true, 'comment' => '商品规格(JSON)']) - ->addColumn('stock_total', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商品库存统计']) - ->addColumn('stock_sales', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商品销售统计']) - ->addColumn('stock_virtual', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商品虚拟销量']) - ->addColumn('price_selling', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '最低销售价格']) - ->addColumn('price_market', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '最低市场价格']) - ->addColumn('discount_id', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '折扣方案编号']) - ->addColumn('truck_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '物流运费模板']) - ->addColumn('truck_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '物流配送(0无需配送,1需要配送)']) - ->addColumn('rebate_type', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '参与返利(0无需返利,1需要返利)']) - ->addColumn('vip_entry', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '入会礼包(0非入会礼包,1是入会礼包)']) - ->addColumn('vip_upgrade', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '购买升级等级(0不升级,其他升级)']) - ->addColumn('limit_low_vip', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '限制最低等级(0不限制,其他限制)']) - ->addColumn('limit_max_num', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '最大购买数量(0不限制,其他限制)']) - ->addColumn('num_read', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '访问阅读统计']) - ->addColumn('state_hot', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '设置热度标签']) - ->addColumn('state_home', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '设置首页推荐']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '列表排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '商品状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_shop_goods_code']) - ->addIndex('status', ['name' => 'idx_shop_goods_status']) - ->addIndex('deleted', ['name' => 'idx_shop_goods_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoodsCate - * @table shop_goods_cate - * @return void - */ - private function _create_shop_goods_cate() - { - - // 当前数据表 - $table = 'shop_goods_cate'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-分类', - ]) - ->addColumn('pid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '上级分类']) - ->addColumn('name', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '分类名称']) - ->addColumn('cover', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '分类图标']) - ->addColumn('remark', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '分类描述']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '使用状态']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('sort', ['name' => 'idx_shop_goods_cate_sort']) - ->addIndex('status', ['name' => 'idx_shop_goods_cate_status']) - ->addIndex('deleted', ['name' => 'idx_shop_goods_cate_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoodsItem - * @table shop_goods_item - * @return void - */ - private function _create_shop_goods_item() - { - - // 当前数据表 - $table = 'shop_goods_item'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-规格', - ]) - ->addColumn('goods_sku', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品SKU']) - ->addColumn('goods_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品编号']) - ->addColumn('goods_spec', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '商品规格']) - ->addColumn('stock_sales', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '销售数量']) - ->addColumn('stock_total', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商品库存']) - ->addColumn('price_selling', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '销售价格']) - ->addColumn('price_market', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '市场价格']) - ->addColumn('number_virtual', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '虚拟销量']) - ->addColumn('number_express', 'integer', ['limit' => 20, 'default' => 1, 'null' => true, 'comment' => '配送计件']) - ->addColumn('reward_balance', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '奖励余额']) - ->addColumn('reward_integral', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '奖励积分']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '商品状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('goods_code', ['name' => 'idx_shop_goods_item_goods_code']) - ->addIndex('goods_spec', ['name' => 'idx_shop_goods_item_goods_spec']) - ->addIndex('status', ['name' => 'idx_shop_goods_item_status']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoodsMark - * @table shop_goods_mark - * @return void - */ - private function _create_shop_goods_mark() - { - - // 当前数据表 - $table = 'shop_goods_mark'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-标签', - ]) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '标签名称']) - ->addColumn('remark', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '标签描述']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '标签状态(1使用,0禁用)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('sort', ['name' => 'idx_shop_goods_mark_sort']) - ->addIndex('status', ['name' => 'idx_shop_goods_mark_status']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoodsStock - * @table shop_goods_stock - * @return void - */ - private function _create_shop_goods_stock() - { - - // 当前数据表 - $table = 'shop_goods_stock'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-库存', - ]) - ->addColumn('batch_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '操作批量']) - ->addColumn('goods_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品编号']) - ->addColumn('goods_spec', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '商品规格']) - ->addColumn('goods_stock', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '入库数量']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '数据状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_shop_goods_stock_status']) - ->addIndex('deleted', ['name' => 'idx_shop_goods_stock_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopOrder - * @table shop_order - * @return void - */ - private function _create_shop_order() - { - - // 当前数据表 - $table = 'shop_order'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-订单-内容', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '下单用户编号']) - ->addColumn('puid1', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '推荐一层用户']) - ->addColumn('puid2', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '推荐二层用户']) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品订单单号']) - ->addColumn('amount_real', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单实际金额']) - ->addColumn('amount_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单统计金额']) - ->addColumn('amount_goods', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品统计金额']) - ->addColumn('amount_reduct', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '随机减免金额']) - ->addColumn('amount_express', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '快递费用金额']) - ->addColumn('amount_discount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '折扣后的金额']) - ->addColumn('payment_type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '实际支付平台']) - ->addColumn('payment_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '实际通道编号']) - ->addColumn('payment_allow', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '允许支付通道']) - ->addColumn('payment_trade', 'string', ['limit' => 80, 'default' => '', 'null' => true, 'comment' => '实际支付单号']) - ->addColumn('payment_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '实际支付状态']) - ->addColumn('payment_image', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '支付凭证图片']) - ->addColumn('payment_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '实际支付金额']) - ->addColumn('payment_balance', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '余额抵扣金额']) - ->addColumn('payment_remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '支付结果描述']) - ->addColumn('payment_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '支付到账时间']) - ->addColumn('number_goods', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '订单商品数量']) - ->addColumn('number_express', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '订单快递计数']) - ->addColumn('truck_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '物流配送类型(0无需配送,1需要配送)']) - ->addColumn('rebate_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '参与返利金额']) - ->addColumn('reward_balance', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '奖励账户余额']) - ->addColumn('order_remark', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '订单用户备注']) - ->addColumn('cancel_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '订单取消状态']) - ->addColumn('cancel_remark', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '订单取消描述']) - ->addColumn('cancel_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '订单取消时间']) - ->addColumn('deleted_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '订单删除状态(0未删,1已删)']) - ->addColumn('deleted_remark', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '订单删除描述']) - ->addColumn('deleted_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '订单删除时间']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '订单流程状态(0已取消,1预订单,2待支付,3支付中,4已支付,5已发货,6已完成)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '订单创建时间']) - ->addIndex('status', ['name' => 'idx_shop_order_status']) - ->addIndex('order_no', ['name' => 'idx_shop_order_order_no']) - ->addIndex('cancel_status', ['name' => 'idx_shop_order_cancel_status']) - ->addIndex('payment_status', ['name' => 'idx_shop_order_payment_status']) - ->addIndex('puid1', ['name' => 'idx_shop_order_puid1']) - ->addIndex('deleted_status', ['name' => 'idx_shop_order_deleted_status']) - ->addIndex('uuid', ['name' => 'idx_shop_order_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopOrderItem - * @table shop_order_item - * @return void - */ - private function _create_shop_order_item() - { - - // 当前数据表 - $table = 'shop_order_item'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-订单-商品', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商城用户编号']) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商城订单单号']) - ->addColumn('goods_sku', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商城商品SKU']) - ->addColumn('goods_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商城商品编号']) - ->addColumn('goods_spec', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '商城商品规格']) - ->addColumn('goods_name', 'string', ['limit' => 250, 'default' => '', 'null' => true, 'comment' => '商城商品名称']) - ->addColumn('goods_cover', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '商品封面图片']) - ->addColumn('goods_payment', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '指定支付通道']) - ->addColumn('price_market', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品市场单价']) - ->addColumn('price_selling', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品销售单价']) - ->addColumn('total_market', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品市场总价']) - ->addColumn('total_selling', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品销售总价']) - ->addColumn('reward_balance', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品奖励余额']) - ->addColumn('reward_integral', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品奖励积分']) - ->addColumn('stock_sales', 'integer', ['limit' => 20, 'default' => 1, 'null' => true, 'comment' => '包含商品数量']) - ->addColumn('vip_name', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '用户等级名称']) - ->addColumn('vip_code', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户等级序号']) - ->addColumn('vip_entry', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '是否入会礼包(0非礼包,1是礼包)']) - ->addColumn('vip_upgrade', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '升级用户等级']) - ->addColumn('truck_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '物流配送类型(0虚物,1实物)']) - ->addColumn('truck_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '快递邮费模板']) - ->addColumn('truck_number', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '快递计费基数']) - ->addColumn('rebate_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '参与返利状态(0不返,1返利)']) - ->addColumn('rebate_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '参与返利金额']) - ->addColumn('discount_id', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '优惠方案编号']) - ->addColumn('discount_rate', 'decimal', ['precision' => 20, 'scale' => 6, 'default' => '100.000000', 'null' => true, 'comment' => '销售价格折扣']) - ->addColumn('discount_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品优惠金额']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '商品状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '订单创建时间']) - ->addIndex('status', ['name' => 'idx_shop_order_item_status']) - ->addIndex('deleted', ['name' => 'idx_shop_order_item_deleted']) - ->addIndex('order_no', ['name' => 'idx_shop_order_item_order_no']) - ->addIndex('goods_sku', ['name' => 'idx_shop_order_item_goods_sku']) - ->addIndex('goods_code', ['name' => 'idx_shop_order_item_goods_code']) - ->addIndex('goods_spec', ['name' => 'idx_shop_order_item_goods_spec']) - ->addIndex('rebate_type', ['name' => 'idx_shop_order_item_rebate_type']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopOrderSend - * @table shop_order_send - * @return void - */ - private function _create_shop_order_send() - { - - // 当前数据表 - $table = 'shop_order_send'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-订单-配送', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商城用户编号']) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商城订单单号']) - ->addColumn('address_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '配送地址编号']) - ->addColumn('address_name', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '配送收货人姓名']) - ->addColumn('address_phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '配送收货人手机']) - ->addColumn('address_idcode', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '配送收货人证件号码']) - ->addColumn('address_idimg1', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '配送收货人证件正面']) - ->addColumn('address_idimg2', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '配送收货人证件反面']) - ->addColumn('address_province', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '配送地址的省份']) - ->addColumn('address_city', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '配送地址的城市']) - ->addColumn('address_area', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '配送地址的区域']) - ->addColumn('address_content', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '配送的详细地址']) - ->addColumn('address_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '地址确认时间']) - ->addColumn('template_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '配送模板编号']) - ->addColumn('template_count', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '快递计费基数']) - ->addColumn('template_remark', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '配送计算描述']) - ->addColumn('template_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '配送计算金额']) - ->addColumn('company_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '快递公司编码']) - ->addColumn('company_name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '快递公司名称']) - ->addColumn('send_number', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '快递运送单号']) - ->addColumn('send_remark', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '快递发送备注']) - ->addColumn('send_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '快递发送时间']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '发货商品状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '发货删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_shop_order_send_status']) - ->addIndex('deleted', ['name' => 'idx_shop_order_send_deleted']) - ->addIndex('order_no', ['name' => 'idx_shop_order_send_order_no']) - ->addIndex('uuid', ['name' => 'idx_shop_order_send_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - -} diff --git a/app/data/database/20221013045839_install_user_data.php b/app/data/database/20221013045839_install_user_data.php deleted file mode 100644 index f6ce2c5ec..000000000 --- a/app/data/database/20221013045839_install_user_data.php +++ /dev/null @@ -1,72 +0,0 @@ -insertMenu(); - } - - /** - * 创建菜单 - * @return void - */ - protected function insertMenu() - { - PhinxExtend::write2menu([ - [ - 'name' => '控制台', - 'sort' => '300', - 'subs' => [ - [ - 'name' => '数据管理', - 'subs' => [ - ['name' => '数据统计报表', 'icon' => 'layui-icon layui-icon-theme', 'node' => 'data/total.portal/index'], - ['name' => '轮播图片管理', 'icon' => 'layui-icon layui-icon-carousel', 'node' => 'data/base.slider/index'], - ['name' => '页面内容管理', 'icon' => 'layui-icon layui-icon-read', 'node' => 'data/base.pager/index'], - ['name' => '文章内容管理', 'icon' => 'layui-icon layui-icon-template', 'node' => 'data/news.item/index'], - ['name' => '支付参数管理', 'icon' => 'layui-icon layui-icon-rmb', 'node' => 'data/base.payment/index'], - ['name' => '系统通知管理', 'icon' => 'layui-icon layui-icon-notice', 'node' => 'data/base.message/index'], - ['name' => '微信小程序配置', 'icon' => 'layui-icon layui-icon-set', 'node' => 'data/base.config/wxapp'], - ['name' => '邀请二维码设置', 'icon' => 'layui-icon layui-icon-cols', 'node' => 'data/base.config/cropper'], - ], - ], - [ - 'name' => '用户管理', - 'subs' => [ - ['name' => '会员用户管理', 'icon' => 'layui-icon layui-icon-user', 'node' => 'data/user.admin/index'], - ['name' => '余额充值管理', 'icon' => 'layui-icon layui-icon-rmb', 'node' => 'data/user.balance/index'], - ['name' => '用户返利管理', 'icon' => 'layui-icon layui-icon-transfer', 'node' => 'data/user.rebate/index'], - ['name' => '用户提现管理', 'icon' => 'layui-icon layui-icon-component', 'node' => 'data/user.transfer/index'], - ['name' => '用户等级管理', 'icon' => 'layui-icon layui-icon-senior', 'node' => 'data/base.upgrade/index'], - ['name' => '用户折扣方案', 'icon' => 'layui-icon layui-icon-set', 'node' => 'data/base.discount/index'], - ], - ], - [ - 'name' => '商城管理', - 'subs' => [ - ['name' => '商品数据管理', 'icon' => 'layui-icon layui-icon-star', 'node' => 'data/shop.goods/index'], - ['name' => '商品分类管理', 'icon' => 'layui-icon layui-icon-tabs', 'node' => 'data/shop.cate/index'], - ['name' => '订单数据管理', 'icon' => 'layui-icon layui-icon-template', 'node' => 'data/shop.order/index'], - ['name' => '订单发货管理', 'icon' => 'layui-icon layui-icon-transfer', 'node' => 'data/shop.send/index'], - ['name' => '快递公司管理', 'icon' => 'layui-icon layui-icon-website', 'node' => 'data/base.postage.company/index'], - ['name' => '邮费模板管理', 'icon' => 'layui-icon layui-icon-template-1', 'node' => 'data/base.postage.template/index'], - ], - ], - ], - ], - ], ['node' => 'data/user.admin/index']); - } -} diff --git a/app/data/database/20221013045840_install_user_region.php b/app/data/database/20221013045840_install_user_region.php deleted file mode 100644 index 85dec6d56..000000000 --- a/app/data/database/20221013045840_install_user_region.php +++ /dev/null @@ -1,3784 +0,0 @@ -installRegion(); - } - - /** - * 写入默认区域数据 - * @return void - * @throws \think\db\exception\DbException - */ - private function installRegion() - { - // 检查数据 - $table = 'base_postage_region'; - $result = $this->fetchRow("select count(1) _count from $table"); - if (isset($result['_count']) && $result['_count'] > 0) return; - - // 写入数据 - $this->execute(<<where(['status' => 1]) - ->hidden(['id', 'utime', 'status', 'create_at']) - ->order('number asc')->column('*', 'number'); - } - - /** - * 获取最大级别数 - * @return integer - * @throws \think\db\exception\DbException - */ - public static function maxNumber(): int - { - if (static::mk()->count() < 1) return 0; - return static::mk()->max('number') + 1; - } - - /** - * 规格化奖励配置 - * @param mixed $value - * @return array - */ - public function getRebateRuleAttr($value): array - { - [$data, $rules] = [[], array_column(RebateService::PRIZES, 'code')]; - foreach (is_string($value) ? str2arr($value, ',', $rules) : [] as $rule) { - $data[$rule] = RebateService::name($rule); - } - return $data; - } - - /** - * 格式化奖励配置 - * @param mixed $value - * @return string - */ - public function setRebateRuleAttr($value): string - { - return is_array($value) ? arr2str($value) : $value; - } - - /** - * 格式化创建时间 - * @param string $value - * @return string - */ - public function getCreateAtAttr(string $value): string - { - return format_datetime($value); - } -} \ No newline at end of file diff --git a/app/data/model/DataNewsItem.php b/app/data/model/DataNewsItem.php deleted file mode 100644 index 7a3fe2347..000000000 --- a/app/data/model/DataNewsItem.php +++ /dev/null @@ -1,23 +0,0 @@ -where(['status' => 1, 'deleted' => 0]); - return $query->field('id,name,remark')->order('sort desc,id desc')->select()->toArray(); - } - - /** - * 格式化创建时间 - * @param string $value - * @return string - */ - public function getCreateAtAttr(string $value): string - { - return format_datetime($value); - } -} \ No newline at end of file diff --git a/app/data/model/DataNewsXCollect.php b/app/data/model/DataNewsXCollect.php deleted file mode 100644 index 7bdf52d32..000000000 --- a/app/data/model/DataNewsXCollect.php +++ /dev/null @@ -1,15 +0,0 @@ -where(['deleted' => 0])->order('sort desc,id asc')->select()->toArray(); - $cates = DataExtend::arr2table(empty($parent) ? $items : array_merge([$parent], $items)); - if (isset($data['id'])) foreach ($cates as $cate) if ($cate['id'] === $data['id']) $data = $cate; - foreach ($cates as $key => $cate) { - $isSelf = isset($data['spt']) && isset($data['spc']) && $data['spt'] <= $cate['spt'] && $data['spc'] > 0; - if ($cate['spt'] >= $max || $isSelf) unset($cates[$key]); - } - return $cates; - } - - /** - * 获取数据树 - * @return array - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function treeData(): array - { - $query = static::mk()->where(['status' => 1, 'deleted' => 0])->order('sort desc,id desc'); - return DataExtend::arr2tree($query->withoutField('sort,status,deleted,create_at')->select()->toArray()); - } - - /** - * 获取列表数据 - * @param bool $simple 仅子级别 - * @return array - */ - public static function treeTable(bool $simple = false): array - { - $query = static::mk()->where(['status' => 1, 'deleted' => 0])->order('sort desc,id asc'); - $cates = array_column(DataExtend::arr2table($query->column('id,pid,name', 'id')), null, 'id'); - foreach ($cates as $cate) isset($cates[$cate['pid']]) && $cates[$cate['id']]['parent'] =& $cates[$cate['pid']]; - foreach ($cates as $key => $cate) { - $id = $cate['id']; - $cates[$id]['ids'][] = $cate['id']; - $cates[$id]['names'][] = $cate['name']; - while (isset($cate['parent']) && ($cate = $cate['parent'])) { - $cates[$id]['ids'][] = $cate['id']; - $cates[$id]['names'][] = $cate['name']; - } - $cates[$id]['ids'] = array_reverse($cates[$id]['ids']); - $cates[$id]['names'] = array_reverse($cates[$id]['names']); - if (isset($pky) && $simple && in_array($cates[$pky]['name'], $cates[$id]['names'])) { - unset($cates[$pky]); - } - $pky = $key; - } - foreach ($cates as &$cate) unset($cate['parent']); - return array_values($cates); - } - - /** - * 格式化创建时间 - * @param string $value - * @return string - */ - public function getCreateAtAttr(string $value): string - { - return format_datetime($value); - } -} \ No newline at end of file diff --git a/app/data/model/ShopGoodsItem.php b/app/data/model/ShopGoodsItem.php deleted file mode 100644 index 6f3f31c81..000000000 --- a/app/data/model/ShopGoodsItem.php +++ /dev/null @@ -1,34 +0,0 @@ -hasMany(ShopGoodsItem::class, 'goods_code', 'code'); - } - - /** - * 格式化创建时间 - * @param string $value - * @return string - */ - public function getCreateAtAttr(string $value): string - { - return format_datetime($value); - } -} \ No newline at end of file diff --git a/app/data/model/ShopGoodsMark.php b/app/data/model/ShopGoodsMark.php deleted file mode 100644 index 8da4bf3df..000000000 --- a/app/data/model/ShopGoodsMark.php +++ /dev/null @@ -1,33 +0,0 @@ - 1]; - return static::mk()->where($map)->order('sort desc,id desc')->column('name'); - } - - /** - * 格式化创建时间 - * @param string $value - * @return string - */ - public function getCreateAtAttr(string $value): string - { - return format_datetime($value); - } -} \ No newline at end of file diff --git a/app/data/model/ShopGoodsStock.php b/app/data/model/ShopGoodsStock.php deleted file mode 100644 index e09ed05a5..000000000 --- a/app/data/model/ShopGoodsStock.php +++ /dev/null @@ -1,15 +0,0 @@ -hasMany('order_no', 'order_no')->where(['deleted' => 0]); - } - - /** - * 关联物码数据 - * @return \think\model\relation\HasMany - */ - public function sends(): HasMany - { - return $this->hasMany('order_no', 'order_no')->where(['deleted' => 0]); - } -} \ No newline at end of file diff --git a/app/data/model/ShopOrderItem.php b/app/data/model/ShopOrderItem.php deleted file mode 100644 index 396aec114..000000000 --- a/app/data/model/ShopOrderItem.php +++ /dev/null @@ -1,35 +0,0 @@ -hasOne(ShopGoods::class, 'code', 'goods_code'); - } - - /** - * 绑定商品数据 - * @return \think\model\relation\HasOne - */ - public function bindGoods(): HasOne - { - return $this->goods()->bind([ - 'goods_name' => 'name', - 'goods_cover' => 'cover', - ]); - } -} \ No newline at end of file diff --git a/app/data/model/ShopOrderSend.php b/app/data/model/ShopOrderSend.php deleted file mode 100644 index 748576e09..000000000 --- a/app/data/model/ShopOrderSend.php +++ /dev/null @@ -1,15 +0,0 @@ -where($map)->order('sort desc,id desc')->findOrEmpty(); - if ($template->isEmpty()) return [0, $truckCount, '', '邮费模板编码无效!']; - $rule = json_decode($template['normal'] ?: '[]', true) ?: []; - foreach (json_decode($template['content'] ?: '[]', true) ?: [] as $item) { - if (isset($item['city']) && is_array($item['city'])) foreach ($item['city'] as $city) { - if ($city['name'] === $provName && in_array($cityName, $city['subs'])) { - $rule = $item['rule']; - break 2; - } - } - } - [$firstNumber, $firstAmount] = [$rule['firstNumber'] ?: 0, $rule['firstAmount'] ?: 0]; - [$repeatNumber, $repeatAmount] = [$rule['repeatNumber'] ?: 0, $rule['repeatAmount'] ?: 0]; - if ($truckCount <= $firstNumber) { - return [$firstAmount, $truckCount, $template['code'], "首件计费,不超过{$firstNumber}件"]; - } else { - $amount = $repeatNumber > 0 ? $repeatAmount * ceil(($truckCount - $firstNumber) / $repeatNumber) : 0; - return [$firstAmount + $amount, $truckCount, $template['code'], "续件计费,超出{$firstNumber}件续件{$amount}元"]; - } - } - - - /** - * 获取快递模板数据 - * @return array - */ - public static function templates(): array - { - $query = BasePostageTemplate::mk()->where(['status' => 1, 'deleted' => 0]); - return $query->order('sort desc,id desc')->column('code,name,normal,content', 'code'); - } - - /** - * 配送区域树型数据 - * @param integer $level 最大等级 - * @param null|integer $status 状态筛选 - * @return array - */ - public static function region(int $level = 3, ?int $status = null): array - { - $query = BasePostageRegion::mk(); - if (is_numeric($level)) $query->where('level', '<=', $level); - if (is_numeric($status)) $query->where(['status' => $status]); - $items = DataExtend::arr2tree($query->column('id,pid,name,status', 'id'), 'id', 'pid', 'subs'); - // 排序子集为空的省份和城市 - foreach ($items as $ik => $item) { - foreach ($item['subs'] as $ck => $city) { - if (isset($city['subs']) && empty($city['subs'])) unset($items[$ik]['subs'][$ck]); - } - if (isset($item['subs']) && empty($item['subs'])) unset($items[$ik]); - } - return $items; - } - - /** - * 楚才开放平台快递查询 - * @param string $code 快递公司编号 - * @param string $number 快递配送单号 - * @return array - * @throws \think\admin\Exception - */ - public static function query(string $code, string $number): array - { - return static::getInterface()->doRequest('api.auth.express/query', [ - 'type' => 'free', 'express' => $code, 'number' => $number, - ]); - } - - /** - * 楚才开放平台快递公司 - * @return array - * @throws \think\admin\Exception - */ - public static function company(): array - { - return static::getInterface()->doRequest('api.auth.express/getCompany'); - } - - /** - * 获取楚才开放平台接口实例 - * @return InterfaceService - */ - private static function getInterface(): InterfaceService - { - $service = InterfaceService::instance(); - // 测试的账号及密钥随时可能会变更,请联系客服更新 - $service->getway('https://open.cuci.cc/user/'); - $service->setAuth("6998081316132228", "193fc1d9a2aac78475bc8dbeb9a5feb1"); - return $service; - } -} \ No newline at end of file diff --git a/app/data/service/GoodsService.php b/app/data/service/GoodsService.php deleted file mode 100644 index 3b0f0e554..000000000 --- a/app/data/service/GoodsService.php +++ /dev/null @@ -1,85 +0,0 @@ -field('goods_code,goods_spec,ifnull(sum(goods_stock),0) stock_total'); - $stockList = $query->where(['goods_code' => $code])->group('goods_code,goods_spec')->select()->toArray(); - // 商品销量统计 - $query = ShopOrder::mk()->alias('a')->field('b.goods_code,b.goods_spec,ifnull(sum(b.stock_sales),0) stock_sales'); - $query->leftJoin('shop_order_item b', 'a.order_no=b.order_no')->where("b.goods_code='{$code}' and a.status>0 and a.deleted_status<1"); - $salesList = $query->group('b.goods_code,b.goods_spec')->select()->toArray(); - // 组装更新数据 - $dataList = []; - foreach (array_merge($stockList, $salesList) as $vo) { - $key = "{$vo['goods_code']}@@{$vo['goods_spec']}"; - $dataList[$key] = isset($dataList[$key]) ? array_merge($dataList[$key], $vo) : $vo; - if (empty($dataList[$key]['stock_sales'])) $dataList[$key]['stock_sales'] = 0; - if (empty($dataList[$key]['stock_total'])) $dataList[$key]['stock_total'] = 0; - } - unset($salesList, $stockList); - // 更新商品规格销量及库存 - foreach ($dataList as $vo) { - $map = ['goods_code' => $code, 'goods_spec' => $vo['goods_spec']]; - $set = ['stock_total' => $vo['stock_total'], 'stock_sales' => $vo['stock_sales']]; - ShopGoodsItem::mk()->where($map)->update($set); - } - // 更新商品主体销量及库存 - ShopGoods::mk()->where(['code' => $code])->update([ - 'stock_total' => intval(array_sum(array_column($dataList, 'stock_total'))), - 'stock_sales' => intval(array_sum(array_column($dataList, 'stock_sales'))), - 'stock_virtual' => ShopGoodsItem::mk()->where(['goods_code' => $code])->sum('number_virtual'), - ]); - return true; - } - - /** - * 商品数据绑定 - * @param array $data 商品主数据 - * @param boolean $simple 简化数据 - * @return array - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function bindData(array &$data = [], bool $simple = true): array - { - $marks = ShopGoodsMark::items(); - $cates = ShopGoodsCate::treeTable(); - $codes = array_unique(array_column($data, 'code')); - $items = ShopGoodsItem::mk()->whereIn('goods_code', $codes)->where(['status' => 1])->select()->toArray(); - foreach ($data as &$vo) { - [$vo['marks'], $vo['cateids'], $vo['cateinfo']] = [str2arr($vo['marks'], ',', $marks), str2arr($vo['cateids']), []]; - [$vo['slider'], $vo['specs'], $vo['items']] = [str2arr($vo['slider'], '|'), json_decode($vo['data_specs'], true), []]; - foreach ($cates as $cate) if (in_array($cate['id'], $vo['cateids'])) $vo['cateinfo'] = $cate; - foreach ($items as $item) if ($item['goods_code'] === $vo['code']) $vo['items'][] = $item; - if ($simple) unset($vo['marks'], $vo['sort'], $vo['status'], $vo['deleted'], $vo['data_items'], $vo['data_specs'], $vo['cateinfo']['parent']); - } - return $data; - } -} \ No newline at end of file diff --git a/app/data/service/MessageService.php b/app/data/service/MessageService.php deleted file mode 100644 index d83b83a28..000000000 --- a/app/data/service/MessageService.php +++ /dev/null @@ -1,175 +0,0 @@ -_request('v2/balance', []); - return [$state, $message, $state ? $result['sumSms'] : 0]; - } - - /** - * 执行网络请求 - * @param string $url 接口请求地址 - * @param array $data 接口请求参数 - * @return array - */ - private function _request(string $url, array $data): array - { - $encode = md5(md5($this->password) . ($tkey = time())); - $option = ['headers' => ['Content-Type:application/json;charset=UTF-8']]; - $request = json_encode(array_merge($data, ['username' => $this->username, 'password' => $encode, 'tKey' => $tkey])); - $result = json_decode(http_post("https://api.mix2.zthysms.com/{$url}", $request, $option), true); - if (empty($result['code'])) { - return [0, '接口请求网络异常', []]; - } elseif (intval($result['code']) === 200) { - return [1, $this->_error($result['code']), $result]; - } else { - return [0, $this->_error($result['code']), $result]; - } - } - - /** - * 获取状态描述 - * @param integer $code - * @return string - */ - private function _error(int $code): string - { - $arrs = [ - 200 => '提交成功', - 4001 => '用户名错误', - 4002 => '密码不能为空', - 4003 => '短信内容不能为空', - 4004 => '手机号码错误', - 4006 => 'IP鉴权错误', - 4007 => '用户禁用', - 4008 => 'tKey错误', - 4009 => '密码错误', - 4011 => '请求错误', - 4013 => '定时时间错误', - 4014 => '模板错误', - 4015 => '扩展号错误', - 4019 => '用户类型错误', - 4023 => '签名错误', - 4025 => '模板变量内容为空', - 4026 => '手机号码数最大2000个', - 4027 => '模板变量内容最大200组', - 4029 => '请使用 POST 请求', - 4030 => 'Content-Type 请使用 application/json', - 4031 => '模板名称不能为空', - 4032 => '模板类型不正确', - 4034 => '模板内容不能为空', - 4035 => '模板名称已经存在', - 4036 => '添加模板信息失败', - 4037 => '模板名称最大20字符', - 4038 => '模板内容超过最大字符数', - 4040 => '模板内容缺少变量值或规则错误', - 4041 => '模板内容中变量规范错误', - 4042 => '模板变量个数超限', - 4044 => '接口24小时限制提交次数超限', - 9998 => 'JSON解析错误', - 9999 => '非法请求', - ]; - return $arrs[$code] ?? $code; - } - - /** - * 验证手机短信验证码 - * @param string $code 验证码 - * @param string $phone 手机号验证 - * @param string $tplcode - * @return boolean - */ - public function checkVerifyCode(string $code, string $phone, string $tplcode = 'zt.tplcode_register'): bool - { - $cache = $this->app->cache->get(md5("code-{$tplcode}-{$phone}"), []); - return is_array($cache) && isset($cache['code']) && $cache['code'] == $code; - } - - /** - * 验证手机短信验证码 - * @param string $phone 手机号码 - * @param integer $wait 等待时间 - * @param string $tplcode 模板编号 - * @return array - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function sendVerifyCode(string $phone, int $wait = 120, string $tplcode = 'zt.tplcode_register'): array - { - $content = sysconf($tplcode) ?: '您的短信验证码为{code},请在十分钟内完成操作!'; - $cache = $this->app->cache->get($ckey = md5("code-{$tplcode}-{$phone}"), []); - // 检查是否已经发送 - if (is_array($cache) && isset($cache['time']) && $cache['time'] > time() - $wait) { - $dtime = ($cache['time'] + $wait < time()) ? 0 : ($wait - time() + $cache['time']); - return [1, '短信验证码已经发送!', ['time' => $dtime]]; - } - // 生成新的验证码 - [$code, $time] = [rand(100000, 999999), time()]; - $this->app->cache->set($ckey, ['code' => $code, 'time' => $time], 600); - // 尝试发送短信内容 - [$state] = $this->send($phone, preg_replace_callback("|{(.*?)}|", function ($matches) use ($code) { - return $matches[1] === 'code' ? $code : $matches[1]; - }, $content)); - if ($state) return [1, '短信验证码发送成功!', [ - 'time' => ($time + $wait < time()) ? 0 : ($wait - time() + $time)], - ]; else { - $this->app->cache->delete($ckey); - return [0, '短信发送失败,请稍候再试!', []]; - } - } - - /** - * 发送自定义短信内容 - * @param string $phone - * @param string $content - * @return array - */ - public function send(string $phone, string $content): array - { - [$state, $message, $record] = $this->_request('v2/sendSms', ['mobile' => $phone, 'content' => $content]); - DataUserMessage::mk()->insert(['phone' => $phone, 'content' => $content, 'result' => $message, 'status' => $state ? 1 : 0]); - return [$state, $message, $record]; - } - - /** - * 短信服务初始化 - * @return MessageService - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function initialize(): MessageService - { - $this->username = sysconf('zt.username'); - $this->password = sysconf('zt.password'); - return $this; - } -} \ No newline at end of file diff --git a/app/data/service/NewsService.php b/app/data/service/NewsService.php deleted file mode 100644 index 83da1564b..000000000 --- a/app/data/service/NewsService.php +++ /dev/null @@ -1,78 +0,0 @@ -field('type,count(1) count'); - foreach ($query->where(['code' => $code, 'status' => 2])->group('type')->cursor() as $item) { - $total[$item['type']] = $item['count']; - } - DataNewsItem::mk()->where(['code' => $code])->update([ - 'num_like' => $total[1] ?? 0, 'num_collect' => $total[2] ?? 0, 'num_comment' => $total[4] ?? 0, - ]); - } - - /** - * 根据code绑定列表数据 - * @param array $list 数据列表 - * @return array - */ - public static function buildListByUidAndCode(array &$list = []): array - { - if (count($list) > 0) { - /*! 绑定文章内容 */ - $colls = 'id,code,name,cover,mark,status,deleted,create_at,num_like,num_read,num_comment,num_collect'; - $items = DataNewsItem::mk()->whereIn('code', array_unique(array_column($list, 'code')))->column($colls, 'code'); - $marks = DataNewsMark::mk()->where(['status' => 1])->column('name'); - foreach ($items as &$vo) $vo['mark'] = str2arr($vo['mark'] ?: '', ',', $marks); - foreach ($list as &$vo) $vo['record'] = $items[$vo['code']] ?? []; - /*! 绑定用户数据 */ - $colls = 'id,phone,nickname,username,headimg,status'; - UserAdminService::buildByUid($list, 'uuid', 'user', $colls); - } - return $list; - } - - /** - * 获取列表状态 - * @param array $list 数据列表 - * @param integer $uuid 用户UID - * @return array - */ - public static function buildData(array &$list, int $uuid = 0): array - { - if (count($list) > 0) { - [$code2, $code1] = [[], []]; - $marks = DataNewsMark::mk()->where(['status' => 1])->column('name'); - if ($uuid > 0) { - $map = [['uuid', '=', $uuid], ['code', 'in', array_unique(array_column($list, 'code'))]]; - $code1 = DataNewsXCollect::mk()->where($map)->where(['type' => 1])->column('code'); - $code2 = DataNewsXCollect::mk()->where($map)->where(['type' => 2])->column('code'); - } - foreach ($list as &$vo) { - $vo['mark'] = str2arr($vo['mark'] ?: '', ',', $marks); - $vo['my_like_state'] = in_array($vo['code'], $code2) ? 1 : 0; - $vo['my_coll_state'] = in_array($vo['code'], $code1) ? 1 : 0; - } - } - return $list; - } -} \ No newline at end of file diff --git a/app/data/service/OrderService.php b/app/data/service/OrderService.php deleted file mode 100644 index 8bfd8b6a4..000000000 --- a/app/data/service/OrderService.php +++ /dev/null @@ -1,151 +0,0 @@ - $orderNo]; - $codes = ShopOrderItem::mk()->where($map)->column('goods_code'); - foreach (array_unique($codes) as $code) GoodsService::stock($code); - return true; - } - - /** - * 根据订单更新用户等级 - * @param string $orderNo - * @return array|null [USER, ORDER, ENTRY] - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function upgrade(string $orderNo): ?array - { - // 目标订单数据 - $map = [['order_no', '=', $orderNo], ['status', '>=', 4]]; - $order = ShopOrder::mk()->where($map)->find(); - if (empty($order)) return null; - // 订单用户数据 - $user = DataUser::mk()->where(['id' => $order['uuid']])->find(); - if (empty($user)) return null; - // 更新用户购买资格 - $entry = static::vipEntry($order['uuid']); - // 尝试绑定代理用户 - if (empty($user['pids']) && ($order['puid1'] > 0 || $user['pid1'] > 0)) { - $puid1 = $order['puid1'] > 0 ? $order['puid1'] : $user['pid0']; - UserUpgradeService::bindAgent($user['id'], $puid1); - } - // 重置用户信息并绑定订单 - $user = DataUser::mk()->where(['id' => $order['uuid']])->find(); - if ($user['pid1'] > 0) { - ShopOrder::mk()->where(['order_no' => $orderNo])->update([ - 'puid1' => $user['pid1'], 'puid2' => $user['pid2'], - ]); - } - // 重新计算用户等级 - UserUpgradeService::upgrade($user['id'], true, $orderNo); - return [$user, $order, $entry]; - } - - /** - * 刷新用户入会礼包 - * @param integer $uuid 用户UID - * @return integer - * @throws \think\db\exception\DbException - */ - private static function vipEntry(int $uuid): int - { - // 检查是否购买入会礼包 - $query = ShopOrder::mk()->alias('a')->join('shop_order_item b', 'a.order_no=b.order_no'); - $entry = $query->where("a.uuid={$uuid} and a.status>=4 and a.payment_status=1 and b.vip_entry>0")->count() ? 1 : 0; - // 用户最后支付时间 - $lastMap = [['uuid', '=', $uuid], ['status', '>=', 4], ['payment_status', '=', 1]]; - $lastDate = ShopOrder::mk()->where($lastMap)->order('payment_datetime desc')->value('payment_datetime'); - // 更新用户支付信息 - DataUser::mk()->where(['id' => $uuid])->update(['buy_vip_entry' => $entry, 'buy_last_date' => $lastDate]); - return $entry; - } - - /** - * 获取等级折扣比例 - * @param int $disId 折扣方案ID - * @param int $vipCode 等级序号 - * @param float $disRate 默认比例 - * @return array [方案编号, 折扣比例] - */ - public static function discount(int $disId, int $vipCode, float $disRate = 100.00): array - { - if ($disId > 0) { - $map = ['id' => $disId, 'status' => 1, 'deleted' => 0]; - $discount = BaseUserDiscount::mk()->where($map)->value('items'); - $disitems = json_decode($discount ?: '[]', true) ?: []; - if (is_array($disitems) && count($disitems) > 0) foreach ($disitems as $vo) { - if ($vo['level'] == $vipCode) $disRate = floatval($vo['discount']); - } - } - return [$disId, $disRate]; - } - - /** - * 绑定订单详情数据 - * @param array $data - * @param boolean $from - * @return array - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function buildData(array &$data = [], bool $from = true): array - { - if (empty($data)) return $data; - // 关联发货信息 - $nobs = array_unique(array_column($data, 'order_no')); - $trucks = ShopOrderSend::mk()->whereIn('order_no', $nobs)->column('*', 'order_no'); - foreach ($trucks as &$item) unset($item['id'], $item['uuid'], $item['status'], $item['deleted'], $item['create_at']); - // 关联订单商品 - $query = ShopOrderItem::mk()->where(['status' => 1, 'deleted' => 0]); - $items = $query->withoutField('id,uuid,status,deleted,create_at')->whereIn('order_no', $nobs)->select()->toArray(); - // 关联用户数据 - $fields = 'phone,username,nickname,headimg,status,vip_code,vip_name'; - UserAdminService::buildByUid($data, 'uuid', 'user', $fields); - if ($from) UserAdminService::buildByUid($data, 'puid1', 'from', $fields); - foreach ($data as &$vo) { - [$vo['sales'], $vo['truck'], $vo['items']] = [0, $trucks[$vo['order_no']] ?? [], []]; - foreach ($items as $it) if ($vo['order_no'] === $it['order_no']) { - $vo['sales'] += $it['stock_sales']; - $vo['items'][] = $it; - } - } - return $data; - } -} \ No newline at end of file diff --git a/app/data/service/PaymentService.php b/app/data/service/PaymentService.php deleted file mode 100644 index 151accf12..000000000 --- a/app/data/service/PaymentService.php +++ /dev/null @@ -1,376 +0,0 @@ - [ - 'type' => 'EMPTY', - 'name' => '订单无需支付', - 'bind' => [], - ], - // 余额支付,使用账号余额完成支付 - self::PAYMENT_BALANCE => [ - 'type' => 'BALANCE', - 'name' => '账号余额支付', - 'bind' => [ - UserAdminService::API_TYPE_WAP, UserAdminService::API_TYPE_WEB, - UserAdminService::API_TYPE_WXAPP, UserAdminService::API_TYPE_WECHAT, - UserAdminService::API_TYPE_IOSAPP, UserAdminService::API_TYPE_ANDROID, - ], - ], - // 凭证支付,上传凭证后台审核支付 - self::PAYMENT_VOUCHER => [ - 'type' => 'VOUCHER', - 'name' => '单据凭证支付', - 'bind' => [ - UserAdminService::API_TYPE_WAP, UserAdminService::API_TYPE_WEB, - UserAdminService::API_TYPE_WXAPP, UserAdminService::API_TYPE_WECHAT, - UserAdminService::API_TYPE_IOSAPP, UserAdminService::API_TYPE_ANDROID, - ], - ], - // 微信支付配置(不需要的直接注释) - self::PAYMENT_WECHAT_WAP => [ - 'type' => 'MWEB', - 'name' => '微信WAP支付', - 'bind' => [UserAdminService::API_TYPE_WAP], - ], - self::PAYMENT_WECHAT_APP => [ - 'type' => 'APP', - 'name' => '微信APP支付', - 'bind' => [UserAdminService::API_TYPE_IOSAPP, UserAdminService::API_TYPE_ANDROID], - ], - self::PAYMENT_WECHAT_XCX => [ - 'type' => 'JSAPI', - 'name' => '微信小程序支付', - 'bind' => [UserAdminService::API_TYPE_WXAPP], - ], - self::PAYMENT_WECHAT_GZH => [ - 'type' => 'JSAPI', - 'name' => '微信公众号支付', - 'bind' => [UserAdminService::API_TYPE_WECHAT], - ], - self::PAYMENT_WECHAT_QRC => [ - 'type' => 'NATIVE', - 'name' => '微信二维码支付', - 'bind' => [UserAdminService::API_TYPE_WEB], - ], - // 支付宝支持配置(不需要的直接注释) - self::PAYMENT_ALIPAY_WAP => [ - 'type' => self::PAYMENT_ALIPAY_WAP, - 'name' => '支付宝WAP支付', - 'bind' => [UserAdminService::API_TYPE_WAP], - ], - self::PAYMENT_ALIPAY_WEB => [ - 'type' => self::PAYMENT_ALIPAY_WEB, - 'name' => '支付宝WEB支付', - 'bind' => [UserAdminService::API_TYPE_WEB], - ], - self::PAYMENT_ALIAPY_APP => [ - 'type' => self::PAYMENT_ALIAPY_APP, - 'name' => '支付宝APP支付', - 'bind' => [UserAdminService::API_TYPE_ANDROID, UserAdminService::API_TYPE_IOSAPP], - ], - // 汇聚支持配置(不需要的直接注释) - self::PAYMENT_JOINPAY_XCX => [ - 'type' => 'WEIXIN_XCX', - 'name' => '汇聚小程序支付', - 'bind' => [UserAdminService::API_TYPE_WXAPP], - ], - self::PAYMENT_JOINPAY_GZH => [ - 'type' => 'WEIXIN_GZH', - 'name' => '汇聚公众号支付', - 'bind' => [UserAdminService::API_TYPE_WECHAT], - ], - ]; - /** - * 支付服务对象 - * @var array - */ - protected static $driver = []; - /** - * 当前应用 - * @var App - */ - protected $app; - /** - * 支付参数编号 - * @var string - */ - protected $code; - /** - * 默认支付类型 - * @var string - */ - protected $type; - /** - * 当前支付参数 - * @var array - */ - protected $params; - - /** - * PaymentService constructor. - * @param App $app 当前应用对象 - * @param string $code 支付参数编号 - * @param string $type 支付类型代码 - * @param array $params 支付参数配置 - */ - public function __construct(App $app, string $code, string $type, array $params) - { - [$this->app, $this->code, $this->type, $this->params] = [$app, $code, $type, $params]; - if (method_exists($this, 'initialize')) $this->initialize(); - } - - /** - * 根据配置实例支付服务 - * @param string $code 支付配置编号 - * @return PaymentService - * @throws \think\admin\Exception - */ - public static function instance(string $code): PaymentService - { - if ($code === 'empty') { - $vars = ['code' => 'empty', 'type' => 'empty', 'params' => []]; - return static::$driver[$code] = Library::$sapp->make(EmptyPaymentService::class, $vars); - } - [, $type, $params] = self::config($code); - if (isset(static::$driver[$code])) return static::$driver[$code]; - $vars = ['code' => $code, 'type' => $type, 'params' => $params]; - // 实例化具体支付参数类型 - if (stripos($type, 'balance') === 0) { - return static::$driver[$code] = Library::$sapp->make(BalancePaymentService::class, $vars); - } elseif (stripos($type, 'voucher') === 0) { - return static::$driver[$code] = Library::$sapp->make(VoucherPaymentService::class, $vars); - } elseif (stripos($type, 'alipay_') === 0) { - return static::$driver[$code] = Library::$sapp->make(AlipayPaymentService::class, $vars); - } elseif (stripos($type, 'wechat_') === 0) { - return static::$driver[$code] = Library::$sapp->make(WechatPaymentService::class, $vars); - } elseif (stripos($type, 'joinpay_') === 0) { - return static::$driver[$code] = Library::$sapp->make(JoinpayPaymentService::class, $vars); - } else { - throw new Exception(sprintf('支付驱动[%s]未定义', $type)); - } - } - - /** - * 获取支付配置参数 - * @param string $code - * @param array $payment - * @return array [code, type, params] - * @throws Exception - */ - public static function config(string $code, array $payment = []): array - { - try { - if (empty($payment)) { - $map = ['code' => $code, 'status' => 1, 'deleted' => 0]; - $payment = BaseUserPayment::mk()->where($map)->find(); - } - if (empty($payment)) { - throw new Exception("支付参数[#{$code}]禁用关闭"); - } - $params = @json_decode($payment['content'], true); - if (empty($params)) { - throw new Exception("支付参数[#{$code}]配置无效"); - } - if (empty(static::TYPES[$payment['type']])) { - throw new Exception("支付参数[@{$payment['type']}]匹配失败"); - } - return [$payment['code'], $payment['type'], $params]; - } catch (\Exception $exception) { - throw new Exception($exception->getMessage(), $exception->getCode()); - } - } - - /** - * 获取支付支付名称 - * @param string $type - * @return string - */ - public static function name(string $type): string - { - return static::TYPES[$type]['name'] ?? $type; - } - - /** - * 获取支付类型 - * @param array $types 默认返回支付 - * @return array - */ - public static function getTypeAll(array $types = []): array - { - $binds = array_keys(UserAdminService::TYPES); - foreach (static::TYPES as $k => $v) if (isset($v['bind'])) { - if (array_intersect($v['bind'], $binds)) $types[$k] = $v; - } - return $types; - } - - /** - * 筛选可用的支付类型 - * @param string $api 指定接口类型 - * @param array $types 默认返回支付 - * @return array - */ - public static function getTypeApi(string $api = '', array $types = []): array - { - foreach (self::TYPES as $type => $attr) { - if (in_array($api, $attr['bind'])) $types[] = $type; - } - return array_unique($types); - } - - /** - * 订单主动查询 - * @param string $orderNo - * @return array - */ - abstract public function query(string $orderNo): array; - - /** - * 支付通知处理 - * @return string - */ - abstract public function notify(): string; - - /** - * 创建支付订单 - * @param string $openid 用户OPENID - * @param string $orderNo 交易订单单号 - * @param string $payAmount 交易订单金额(元) - * @param string $payTitle 交易订单名称 - * @param string $payRemark 交易订单描述 - * @param string $payReturn 支付回跳地址 - * @param string $payImage 支付凭证图片 - * @return array - */ - abstract public function create(string $openid, string $orderNo, string $payAmount, string $payTitle, string $payRemark, string $payReturn = '', string $payImage = ''): array; - - /** - * 创建支付行为 - * @param string $orderNo 商户订单单号 - * @param string $payTitle 商户订单标题 - * @param string $payAmount 需要支付金额 - */ - protected function createPaymentAction(string $orderNo, string $payTitle, string $payAmount) - { - DataUserPayment::mk()->insert([ - 'payment_code' => $this->code, - 'payment_type' => $this->type, - 'order_no' => $orderNo, - 'order_name' => $payTitle, - 'order_amount' => $payAmount, - ]); - } - - /** - * 更新支付记录并更新订单 - * @param string $orderNo 商户订单单号 - * @param string $payTrade 平台交易单号 - * @param string $payAmount 实际到账金额 - * @param string $payRemark 平台支付备注 - * @return boolean - */ - protected function updatePaymentAction(string $orderNo, string $payTrade, string $payAmount, string $payRemark = '在线支付'): bool - { - // 更新支付记录 - DataUserPayment::mUpdate([ - 'order_no' => $orderNo, - 'payment_code' => $this->code, - 'payment_type' => $this->type, - 'payment_trade' => $payTrade, - 'payment_amount' => $payAmount, - 'payment_status' => 1, - 'payment_datetime' => date('Y-m-d H:i:s'), - ], 'order_no', [ - 'payment_code' => $this->code, - 'payment_type' => $this->type, - ]); - // 更新记录状态 - return $this->updatePaymentOrder($orderNo, $payTrade, $payAmount, $payRemark); - } - - /** - * 订单支付更新操作 - * @param string $orderNo 订单单号 - * @param string $payTrade 交易单号 - * @param string $payAmount 支付金额 - * @param string $payRemark 支付描述 - * @param string $payImage 支付凭证 - * @return boolean - */ - protected function updatePaymentOrder(string $orderNo, string $payTrade, string $payAmount, string $payRemark = '在线支付', string $payImage = ''): bool - { - $map = ['status' => 2, 'order_no' => $orderNo, 'payment_status' => 0]; - $order = ShopOrder::mk()->where($map)->findOrEmpty(); - if ($order->isEmpty()) return false; - // 检查订单支付状态 - if ($this->type === self::PAYMENT_VOUCHER) { - $status = 3; # 凭证支付需要审核 - } elseif (empty($order['truck_type'])) { - $status = 6; # 虚拟订单直接完成 - } else { - $status = 4; # 实物订单需要发货 - } - // 更新订单支付状态 - $order['status'] = $status; - $order['payment_code'] = $this->code; - $order['payment_type'] = $this->type; - $order['payment_trade'] = $payTrade; - $order['payment_image'] = $payImage; - $order['payment_amount'] = $payAmount; - $order['payment_remark'] = $payRemark; - $order['payment_status'] = 1; - $order['payment_datetime'] = date('Y-m-d H:i:s'); - $order->save(); - // 触发订单更新事件 - if ($status >= 4) { - $this->app->event->trigger('ShopOrderPayment', $orderNo); - } - return true; - } -} \ No newline at end of file diff --git a/app/data/service/RebateService.php b/app/data/service/RebateService.php deleted file mode 100644 index 963959c3b..000000000 --- a/app/data/service/RebateService.php +++ /dev/null @@ -1,461 +0,0 @@ - ['code' => self::PRIZE_01, 'name' => '首推奖励', 'func' => '_prize01'], - self::PRIZE_02 => ['code' => self::PRIZE_02, 'name' => '复购奖励', 'func' => '_prize02'], - self::PRIZE_03 => ['code' => self::PRIZE_03, 'name' => '直属团队', 'func' => '_prize03'], - self::PRIZE_04 => ['code' => self::PRIZE_04, 'name' => '间接团队', 'func' => '_prize04'], - self::PRIZE_05 => ['code' => self::PRIZE_05, 'name' => '差额奖励', 'func' => '_prize05'], - self::PRIZE_06 => ['code' => self::PRIZE_06, 'name' => '管理奖励', 'func' => '_prize06'], - self::PRIZE_07 => ['code' => self::PRIZE_07, 'name' => '升级奖励', 'func' => '_prize07'], - self::PRIZE_08 => ['code' => self::PRIZE_08, 'name' => '平推返利', 'func' => '_prize08'], - ]; - - /** - * 用户数据 - * @var array - */ - protected $user; - - /** - * 订单数据 - * @var array - */ - protected $order; - - /** - * 奖励到账时机 - * @var integer - */ - protected $status; - - /** - * 推荐用户 - * @var array - */ - protected $from1; - protected $from2; - - /** - * 执行订单返利处理 - * @param string $orderNo - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function execute(string $orderNo) - { - // 获取订单数据 - $map = ['order_no' => $orderNo, 'payment_status' => 1]; - $this->order = ShopOrder::mk()->where($map)->findOrEmpty(); - if ($this->order->isEmpty()) throw new Exception('订单不存在'); - if ($this->order['payment_type'] === 'balance') return; - if ($this->order['amount_total'] <= 0) throw new Exception('订单金额为零'); - if ($this->order['rebate_amount'] <= 0) throw new Exception('订单返利为零'); - // 获取用户数据 - $map = ['id' => $this->order['uuid'], 'deleted' => 0]; - $this->user = DataUser::mk()->where($map)->findOrEmpty(); - if ($this->user->isEmpty()) throw new Exception('用户不存在'); - // 获取直接代理数据 - if ($this->order['puid1'] > 0) { - $this->from1 = DataUser::mk()->find($this->order['puid1']); - if (empty($this->from1)) throw new Exception('直接代理不存在'); - } - // 获取间接代理数据 - if ($this->order['puid2'] > 0) { - $this->from2 = DataUser::mk()->find($this->order['puid2']); - if (empty($this->from2)) throw new Exception('间接代理不存在'); - } - // 批量发放配置奖励 - foreach (self::PRIZES as $vo) if (method_exists($this, $vo['func'])) { - $this->app->log->notice("订单 {$orderNo} 开始发放 [{$vo['func']}] {$vo['name']}"); - $this->{$vo['func']}(); - $this->app->log->notice("订单 {$orderNo} 完成发放 [{$vo['func']}] {$vo['name']}"); - } - } - - /** - * 返利服务初始化 - * @return void - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function initialize() - { - // 返利奖励到账时机 - // settl_type 为 1 支付后立即到账 - // settl_type 为 2 确认后立即到账 - $this->status = $this->config('settl_type') > 1 ? 0 : 1; - } - - /** - * 获取配置数据 - * @param ?string $name 配置名称 - * @return array|string - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function config(?string $name = null) - { - static $data = []; - if (empty($data)) $data = sysdata('RebateRule'); - return is_null($name) ? $data : ($data[$name] ?? ''); - } - - /** - * 用户首推奖励 - * @return boolean - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _prize01(): bool - { - if (empty($this->from1)) return false; - $map = ['order_uuid' => $this->user['id']]; - if (DataUserRebate::mk()->where($map)->count() > 0) return false; - if (!$this->checkPrizeStatus(self::PRIZE_01, $this->from1['vip_code'])) return false; - // 创建返利奖励记录 - $key = "{$this->from1['vip_code']}_{$this->user['vip_code']}"; - $map = ['type' => self::PRIZE_01, 'order_no' => $this->order['order_no'], 'order_uuid' => $this->order['uuid']]; - if ($this->config("frist_state_vip_{$key}") && DataUserRebate::mk()->where($map)->count() < 1) { - $value = $this->config("frist_value_vip_{$key}"); - if ($this->config("frist_type_vip_{$key}") == 1) { - $val = floatval($value ?: '0.00'); - $name = "{$this->name(self::PRIZE_01)},每单 {$val} 元"; - } else { - $val = floatval($value * $this->order['rebate_amount'] / 100); - $name = "{$this->name(self::PRIZE_01)},订单 {$value}%"; - } - // 写入返利记录 - $this->writeRabate($this->from1['id'], $map, $name, $val); - } - return true; - } - - - /** - * 用户复购奖励 - * @return boolean - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _prize02(): bool - { - $map = []; - $map[] = ['order_uuid', '=', $this->user['id']]; - $map[] = ['order_no', '<>', $this->order['order_no']]; - if (DataUserRebate::mk()->where($map)->count() < 1) return false; - // 检查上级可否奖励 - if (empty($this->from1) || empty($this->from1['vip_code'])) return false; - if (!$this->checkPrizeStatus(self::PRIZE_02, $this->from1['vip_code'])) return false; - // 创建返利奖励记录 - $key = "vip_{$this->from1['vip_code']}_{$this->user['vip_code']}"; - $map = ['type' => self::PRIZE_02, 'order_no' => $this->order['order_no'], 'order_uuid' => $this->order['uuid']]; - if ($this->config("repeat_state_{$key}") && DataUserRebate::mk()->where($map)->count() < 1) { - $value = $this->config("repeat_value_{$key}"); - if ($this->config("repeat_type_{$key}") == 1) { - $val = floatval($value ?: '0.00'); - $name = "{$this->name(self::PRIZE_02)},每人 {$val} 元"; - } else { - $val = floatval($value * $this->order['rebate_amount'] / 100); - $name = "{$this->name(self::PRIZE_02)},订单 {$value}%"; - } - // 写入返利记录 - $this->writeRabate($this->from1['id'], $map, $name, $val); - } - return true; - } - - /** - * 用户直属团队 - * @return boolean - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _prize03(): bool - { - if (empty($this->from1)) return false; - if (!$this->checkPrizeStatus(self::PRIZE_03, $this->from1['vip_code'])) return false; - // 创建返利奖励记录 - $key = "{$this->user['vip_code']}"; - $map = ['type' => self::PRIZE_03, 'order_no' => $this->order['order_no'], 'order_uuid' => $this->order['uuid']]; - if ($this->config("direct_state_vip_{$key}") && DataUserRebate::mk()->where($map)->count() < 1) { - $value = $this->config("direct_value_vip_{$key}"); - if ($this->config("direct_type_vip_{$key}") == 1) { - $val = floatval($value ?: '0.00'); - $name = "{$this->name(self::PRIZE_03)},每人 {$val} 元"; - } else { - $val = floatval($value * $this->order['rebate_amount'] / 100); - $name = "{$this->name(self::PRIZE_03)},订单 {$value}%"; - } - // 写入返利记录 - $this->writeRabate($this->from1['id'], $map, $name, $val); - } - return true; - } - - /** - * 用户间接团队 - * @return boolean - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _prize04(): bool - { - if (empty($this->from2)) return false; - if (!$this->checkPrizeStatus(self::PRIZE_04, $this->from2['vip_code'])) return false; - $key = "{$this->user['vip_code']}"; - $map = ['type' => self::PRIZE_04, 'order_no' => $this->order['order_no'], 'order_uuid' => $this->order['uuid']]; - if ($this->config("indirect_state_vip_{$key}") && DataUserRebate::mk()->where($map)->count() < 1) { - $value = $this->config("indirect_value_vip_{$key}"); - if ($this->config("indirect_type_vip_{$key}") == 1) { - $val = floatval($value ?: '0.00'); - $name = "{$this->name(self::PRIZE_03)},每人 {$val} 元"; - } else { - $val = floatval($value * $this->order['rebate_amount'] / 100); - $name = "{$this->name(self::PRIZE_03)},订单 {$value}%"; - } - // 写入返利记录 - $this->writeRabate($this->from2['id'], $map, $name, $val); - } - return true; - } - - /** - * 用户差额奖励 - * @return false - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _prize05(): bool - { - $puids = array_reverse(str2arr($this->user['path'], '-')); - if (empty($puids) || $this->order['amount_total'] <= 0) return false; - // 获取可以参与奖励的代理 - $vips = BaseUserUpgrade::mk()->whereLike('rebate_rule', '%,' . self::PRIZE_05 . ',%')->column('number'); - $users = DataUser::mk()->whereIn('vip_code', $vips)->whereIn('id', $puids)->orderField('id', $puids)->select()->toArray(); - if (empty($vips) || empty($users)) return true; - // 查询需要计算奖励的商品 - foreach (ShopOrderItem::mk()->where(['order_no' => $this->order['order_no']])->cursor() as $item) { - if ($item['discount_id'] > 0 && $item['rebate_type'] === 1) { - [$tVip, $tRate] = [$item['vip_code'], $item['discount_rate']]; - $map = ['id' => $item['discount_id'], 'status' => 1, 'deleted' => 0]; - $rules = json_decode(BaseUserDiscount::mk()->where($map)->value('items', '[]'), true); - foreach ($users as $user) if (isset($rules[$user['vip_code']]) && $user['vip_code'] > $tVip) { - if (($rule = $rules[$user['vip_code']]) && $tRate > $rule['discount']) { - $map = ['uuid' => $user['id'], 'type' => self::PRIZE_05, 'order_no' => $this->order['order_no']]; - if (DataUserRebate::mk()->where($map)->count() < 1) { - $dRate = ($rate = $tRate - $rule['discount']) / 100; - $name = "等级差额奖励{$tVip}#{$user['vip_code']}商品原价{$item['total_selling']}元的{$rate}%"; - $amount = $dRate * $item['total_selling']; - // 写入用户返利记录 - $this->writeRabate($user['id'], $map, $name, $amount); - } - [$tVip, $tRate] = [$user['vip_code'], $rule['discount']]; - } - } - } - } - return true; - } - - /** - * 用户管理奖励发放 - * @return boolean - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _prize06(): bool - { - $puids = array_reverse(str2arr($this->user['path'], '-')); - if (empty($puids) || $this->order['amount_total'] <= 0) return false; - // 记录用户原始等级 - $prevLevel = $this->user['vip_code']; - // 获取参与奖励的代理 - $vips = BaseUserUpgrade::mk()->whereLike('rebate_rule', '%,' . self::PRIZE_06 . ',%')->column('number'); - foreach (DataUser::mk()->whereIn('vip_code', $vips)->whereIn('id', $puids)->orderField('id', $puids)->cursor() as $user) { - if ($user['vip_code'] > $prevLevel) { - if (($amount = $this->_prize06amount($prevLevel + 1, $user['vip_code'])) > 0.00) { - $map = ['uuid' => $user['id'], 'type' => self::PRIZE_06, 'order_no' => $this->order['order_no']]; - if (DataUserRebate::mk()->where($map)->count() < 1) { - $name = "{$this->name(self::PRIZE_06)},[ VIP{$prevLevel} > VIP{$user['vip_code']} ] 每单 {$amount} 元"; - $this->writeRabate($user['id'], $map, $name, $amount); - } - } - $prevLevel = $user['vip_code']; - } - } - return true; - } - - /** - * 计算两等级之间的管理奖差异 - * @param integer $prevLevel 上个等级 - * @param integer $nextLevel 下个等级 - * @return float - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _prize06amount(int $prevLevel, int $nextLevel): float - { - if ($this->config("manage_type_vip_{$nextLevel}") == 2) { - $amount = 0.00; - foreach (range($prevLevel, $nextLevel) as $level) { - [$state, $value] = [$this->config("manage_state_vip_{$level}"), $this->config("manage_value_vip_{$level}")]; - if ($state && $value > 0) $amount += $value; - } - return floatval($amount); - } elseif ($this->config("manage_state_vip_{$nextLevel}")) { - return floatval($this->config("manage_value_vip_{$nextLevel}")); - } else { - return floatval(0); - } - } - - /** - * 用户升级奖励发放 - * @return boolean - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _prize07(): bool - { - if (empty($this->from1)) return false; - if ($this->order['order_no'] !== $this->user['vip_order']) return false; - if (!$this->checkPrizeStatus(self::PRIZE_07, $this->from1['vip_code'])) return false; - // 创建返利奖励记录 - $vip = "{$this->user['vip_code']}"; - $map = ['type' => self::PRIZE_07, 'order_no' => $this->order['order_no'], 'order_uuid' => $this->order['uuid']]; - if ($this->config("upgrade_state_vip_{$vip}") && DataUserRebate::mk()->where($map)->count() < 1) { - $value = $this->config("upgrade_value_vip_{$vip}"); - if ($this->config("upgrade_type_vip_{$vip}") == 1) { - $val = floatval($value ?: '0.00'); - $name = "{$this->name(self::PRIZE_07)},每人 {$val} 元"; - } else { - $val = floatval($value * $this->order['rebate_amount'] / 100); - $name = "{$this->name(self::PRIZE_07)},订单 {$value}%"; - } - // 写入返利记录 - $this->writeRabate($this->from1['id'], $map, $name, $val); - } - return true; - } - - /** - * 用户平推奖励发放 - * @return boolean - */ - private function _prize08(): bool - { - if (empty($this->from1)) return false; - $map = ['vip_code' => $this->user['vip_code']]; - $uuids = array_reverse(str2arr(trim($this->user['path'], '-'), '-')); - $puids = DataUser::mk()->whereIn('id', $uuids)->orderField('id', $uuids)->where($map)->column('id'); - if (count($puids) < 2) return false; - - $this->app->db->transaction(function () use ($puids, $map) { - foreach ($puids as $key => $puid) { - // 最多两层 - if (($layer = $key + 1) > 2) break; - // 检查重复 - $map = ['uuid' => $puid, 'type' => self::PRIZE_08, 'order_no' => $this->order['order_no']]; - if (DataUserRebate::mk()->where($map)->count() < 1) { - // 返利比例 - $rate = $this->config("equal_value_vip_{$layer}_{$this->user['vip_code']}"); - // 返利金额 - $money = floatval($rate * $this->order['rebate_amount'] / 100); - $name = "{$this->name(self::PRIZE_08)}, 返回订单的 {$rate}%"; - // 写入返利 - $this->writeRabate($puid, $map, $name, $money); - } - } - }); - return true; - } - - /** - * 获取奖励名称 - * @param string $prize - * @return string - */ - public static function name(string $prize): string - { - return self::PRIZES[$prize]['name'] ?? $prize; - } - - /** - * 检查等级是否有奖励 - * @param string $prize 奖励规则 - * @param integer $level 用户等级 - * @return boolean - * @throws \think\db\exception\DbException - */ - private function checkPrizeStatus(string $prize, int $level): bool - { - $query = BaseUserUpgrade::mk()->where(['number' => $level]); - return $query->whereLike('rebate_rule', "%,{$prize},%")->count() > 0; - } - - /** - * 写返利记录 - * @param int $uuid 奖励用户 - * @param array $map 查询条件 - * @param string $name 奖励名称 - * @param float $amount 奖励金额 - */ - private function writeRabate(int $uuid, array $map, string $name, float $amount) - { - DataUserRebate::mk()->insert(array_merge($map, [ - 'uuid' => $uuid, - 'date' => date('Y-m-d'), - 'code' => CodeExtend::uniqidDate(20, 'R'), - 'name' => $name, - 'amount' => $amount, - 'status' => $this->status, - 'order_no' => $this->order['order_no'], - 'order_uuid' => $this->order['uuid'], - 'order_amount' => $this->order['amount_total'], - ])); - // 刷新用户返利统计 - UserRebateService::amount($uuid); - } -} \ No newline at end of file diff --git a/app/data/service/UserAdminService.php b/app/data/service/UserAdminService.php deleted file mode 100644 index 0a1534913..000000000 --- a/app/data/service/UserAdminService.php +++ /dev/null @@ -1,147 +0,0 @@ - [ - 'name' => '手机浏览器', - 'auth' => 'phone', - ], - self::API_TYPE_WEB => [ - 'name' => '电脑浏览器', - 'auth' => 'phone', - ], - self::API_TYPE_WXAPP => [ - 'name' => '微信小程序', - 'auth' => 'openid1', - ], - self::API_TYPE_WECHAT => [ - 'name' => '微信服务号', - 'auth' => 'openid2', - ], - self::API_TYPE_IOSAPP => [ - 'name' => '苹果APP应用', - 'auth' => 'phone', - ], - self::API_TYPE_ANDROID => [ - 'name' => '安卓APP应用', - 'auth' => 'phone', - ], - ]; - - /** - * 更新用户用户参数 - * @param mixed $map 查询条件 - * @param array $data 更新数据 - * @param string $type 接口类型 - * @param boolean $force 强刷令牌 - * @return array - * @throws \think\admin\Exception - * @throws \think\db\exception\DbException - */ - public static function set($map, array $data, string $type, bool $force = false): array - { - $user = DataUser::mk()->where($map)->where(['deleted' => 0])->findOrEmpty(); - unset($data['id'], $data['deleted'], $data['create_at']); - // 不更新无效的用户字段 - if (!empty($user['nickname']) && $data['nickname'] === '微信用户') { - unset($data['nickname'], $data['headimg']); - } - if (!$user->save($data)) throw new Exception("更新用户资料失败!"); - // 刷新用户认证令牌 - if ($force) UserTokenService::token($user['id'], $type); - // 返回当前用户资料 - return static::get($user['id'], $type); - } - - /** - * 获取用户数据 - * @param integer $uuid 用户UID - * @param string $type 接口类型 - * @return array - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function get(int $uuid, string $type): array - { - $map = ['id' => $uuid, 'deleted' => 0]; - $user = DataUser::mk()->where($map)->findOrEmpty(); - if ($user->isEmpty()) throw new Exception('用户还没有注册!'); - // 用户认证令牌处理 - $map = ['uuid' => $uuid, 'type' => $type]; - if (!($access = DataUserToken::mk()->where($map)->find())) { - [$state, $message, $access] = UserTokenService::token($uuid, $type); - if (empty($state) || empty($access)) throw new Exception($message); - } - $user['token'] = ['token' => $access['token'], 'expire' => $access['time']]; - return $user->hidden(['deleted', 'password'])->toArray(); - } - - /** - * 获取用户数据统计 - * @param int $uuid 用户UID - * @return array - * @throws \think\db\exception\DbException - */ - public static function total(int $uuid): array - { - return ['my_invite' => DataUser::mk()->where(['pid1' => $uuid])->count()]; - } - - /** - * 获取用户查询条件 - * @param string $field 认证字段 - * @param string $openid 用户OPENID值 - * @param string $unionid 用户UNIONID值 - * @return array - */ - public static function getUserUniMap(string $field, string $openid, string $unionid = ''): array - { - if (!empty($unionid)) { - [$map1, $map2] = [[['unionid', '=', $unionid]], [[$field, '=', $openid]]]; - if ($uuid = DataUser::mk()->whereOr([$map1, $map2])->value('id')) { - return ['id' => $uuid]; - } - } - return [$field => $openid]; - } - - /** - * 列表绑定用户数据 - * @param array $list 原数据列表 - * @param string $keys 用户UID字段 - * @param string $bind 绑定字段名称 - * @param string $cols 返回用户字段 - * @return array - */ - public static function buildByUid(array &$list, string $keys = 'uuid', string $bind = 'user', string $cols = '*'): array - { - if (count($list) < 1) return $list; - $uids = array_unique(array_column($list, $keys)); - $users = DataUser::mk()->whereIn('id', $uids)->column($cols, 'id'); - foreach ($list as &$vo) $vo[$bind] = $users[$vo[$keys]] ?? []; - return $list; - } -} \ No newline at end of file diff --git a/app/data/service/UserBalanceService.php b/app/data/service/UserBalanceService.php deleted file mode 100644 index 61af9bf17..000000000 --- a/app/data/service/UserBalanceService.php +++ /dev/null @@ -1,66 +0,0 @@ -where([['status', '>=', 4], ['order_no', '=', $orderNo]])->find(); - if (empty($order)) throw new Exception('需处理的订单状态异常'); - - if ($order['reward_balance'] > 0) DataUserBalance::mUpdate([ - 'uuid' => $order['uuid'], - 'code' => "CZ{$order['order_no']}", - 'name' => "订单余额充值", - 'remark' => "来自订单 {$order['order_no']} 的余额充值 {$order['reward_balance']} 元", - 'amount' => $order['reward_balance'], - ], 'code'); - - return static::amount($order['uuid']); - } - - /** - * 同步刷新用户余额 - * @param int $uuid 用户UID - * @param array $nots 排除的订单 - * @return array [total, count] - */ - public static function amount(int $uuid, array $nots = []): array - { - if ($uuid > 0) { - $total = abs(DataUserBalance::mk()->whereRaw("uuid='{$uuid}' and amount>0 and deleted=0")->sum('amount')); - $count = abs(DataUserBalance::mk()->whereRaw("uuid='{$uuid}' and amount<0 and deleted=0")->sum('amount')); - if (empty($nots)) { - DataUser::mk()->where(['id' => $uuid])->update(['balance_total' => $total, 'balance_used' => $count]); - } else { - $count -= DataUserBalance::mk()->whereRaw("uuid={$uuid}")->whereIn('code', $nots)->sum('amount'); - } - } else { - $total = abs(DataUserBalance::mk()->whereRaw("amount>0 and deleted=0")->sum('amount')); - $count = abs(DataUserBalance::mk()->whereRaw("amount<0 and deleted=0")->sum('amount')); - } - return [$total, $count]; - } -} \ No newline at end of file diff --git a/app/data/service/UserRebateService.php b/app/data/service/UserRebateService.php deleted file mode 100644 index 68b26951f..000000000 --- a/app/data/service/UserRebateService.php +++ /dev/null @@ -1,59 +0,0 @@ - 0) { - $count = DataUserTransfer::mk()->whereRaw("uuid='{$uuid}' and status>0")->sum('amount'); - $total = DataUserRebate::mk()->whereRaw("uuid='{$uuid}' and status=1 and deleted=0")->sum('amount'); - $locks = DataUserRebate::mk()->whereRaw("uuid='{$uuid}' and status=0 and deleted=0")->sum('amount'); - DataUser::mk()->where(['id' => $uuid])->update(['rebate_total' => $total, 'rebate_used' => $count, 'rebate_lock' => $locks]); - } else { - $count = DataUserTransfer::mk()->whereRaw("status>0")->sum('amount'); - $total = DataUserRebate::mk()->whereRaw("status=1 and deleted=0")->sum('amount'); - $locks = DataUserRebate::mk()->whereRaw("status=0 and deleted=0")->sum('amount'); - } - return [$total, $count, $locks]; - } - - /** - * 确认收货订单处理 - * @param string $orderNo - * @return array [status, message] - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function confirm(string $orderNo): array - { - $map = [['status', '>=', 4], ['order_no', '=', $orderNo]]; - $order = ShopOrder::mk()->where($map)->findOrEmpty()->toArray(); - if (empty($order)) return [0, '需处理的订单状态异常!']; - $map = [['status', '=', 0], ['order_no', 'like', "{$orderNo}%"]]; - DataUserRebate::mk()->where($map)->update(['status' => 1]); - if (UserUpgradeService::upgrade($order['uuid'])) { - return [1, '重新计算用户金额成功!']; - } else { - return [0, '重新计算用户金额失败!']; - } - } -} \ No newline at end of file diff --git a/app/data/service/UserTokenService.php b/app/data/service/UserTokenService.php deleted file mode 100644 index 02e0843dc..000000000 --- a/app/data/service/UserTokenService.php +++ /dev/null @@ -1,101 +0,0 @@ - $type, 'token' => $token]; - $data = DataUserToken::mk()->where($map)->find(); - } - if (empty($data) || empty($data['uuid'])) { - return [0, '请重新登录,登录认证无效', 0, 0]; - } elseif ($token !== 'token' && $data['time'] < time()) { - return [0, '请重新登录,登录认证失效', 0, 0]; - } elseif ($token !== 'token' && $data['tokenv'] !== static::buildVerify()) { - return [0, '请重新登录,客户端已更换', 0, 0]; - } else { - static::expire($type, $token); - return [1, '登录验证成功', $data['uuid'], $data['time']]; - } - } - - /** - * 获取令牌的认证值 - * @return string - */ - private static function buildVerify(): string - { - return md5('-'); - //return md5(Library::$sapp->request->server('HTTP_USER_AGENT', '-')); - } - - /** - * 延期 TOKEN 有效时间 - * @param string $type 接口类型 - * @param string $token 授权令牌 - */ - public static function expire(string $type, string $token) - { - $map = ['type' => $type, 'token' => $token]; - DataUserToken::mk()->where($map)->update([ - 'time' => time() + static::$expire, - ]); - } - - /** - * 生成新的用户令牌 - * @param int $uuid 授权用户 - * @param string $type 接口类型 - * @return array [创建状态, 状态描述, 令牌数据] - * @throws \think\db\exception\DbException - */ - public static function token(int $uuid, string $type): array - { - // 清理无效认证数据 - $map1 = [['token', '<>', 'token'], ['time', '<', $time = time()]]; - $map2 = [['token', '<>', 'token'], ['type', '=', $type], ['uuid', '=', $uuid]]; - DataUserToken::mk()->whereOr([$map1, $map2])->delete(); - // 创建新的认证数据 - do $map = ['type' => $type, 'token' => md5(uniqid(strval(rand(100, 999))))]; - while (DataUserToken::mk()->where($map)->count() > 0); - // 写入用户认证数据 - $data = array_merge($map, [ - 'uuid' => $uuid, - 'time' => $time + static::$expire, - 'tokenv' => static::buildVerify(), - ]); - if (DataUserToken::mk()->insert($data) !== false) { - return [1, '刷新认证成功', $data]; - } else { - return [0, '刷新认证失败', []]; - } - } -} \ No newline at end of file diff --git a/app/data/service/UserTransferService.php b/app/data/service/UserTransferService.php deleted file mode 100644 index 6b5e24007..000000000 --- a/app/data/service/UserTransferService.php +++ /dev/null @@ -1,156 +0,0 @@ - '转账到我的微信零钱', - 'wechat_banks' => '转账到我的银行卡账户', - 'wechat_qrcode' => '线下转账到微信收款码', - 'alipay_qrcode' => '线下转账到支付宝收款码', - 'alipay_account' => '线下转账到支付宝账户', - 'transfer_banks' => '线下转账到银行卡账户', - ]; - - /** - * 微信提现银行 - * @var array - */ - protected $banks = [ - ['wseq' => '1002', 'name' => '工商银行'], - ['wseq' => '1005', 'name' => '农业银行'], - ['wseq' => '1003', 'name' => '建设银行'], - ['wseq' => '1026', 'name' => '中国银行'], - ['wseq' => '1020', 'name' => '交通银行'], - ['wseq' => '1001', 'name' => '招商银行'], - ['wseq' => '1066', 'name' => '邮储银行'], - ['wseq' => '1006', 'name' => '民生银行'], - ['wseq' => '1010', 'name' => '平安银行'], - ['wseq' => '1021', 'name' => '中信银行'], - ['wseq' => '1004', 'name' => '浦发银行'], - ['wseq' => '1009', 'name' => '兴业银行'], - ['wseq' => '1022', 'name' => '光大银行'], - ['wseq' => '1027', 'name' => '广发银行'], - ['wseq' => '1025', 'name' => '华夏银行'], - ['wseq' => '1056', 'name' => '宁波银行'], - ['wseq' => '4836', 'name' => '北京银行'], - ['wseq' => '1024', 'name' => '上海银行'], - ['wseq' => '1054', 'name' => '南京银行'], - - // '4755' => '长子县融汇村镇银行', - // '4216' => '长沙银行', - // '4051' => '浙江泰隆商业银行', - // '4753' => '中原银行', - // '4761' => '企业银行(中国)', - // '4036' => '顺德农商银行', - // '4752' => '衡水银行', - // '4756' => '长治银行', - // '4767' => '大同银行', - // '4115' => '河南省农村信用社', - // '4150' => '宁夏黄河农村商业银行', - // '4156' => '山西省农村信用社', - // '4166' => '安徽省农村信用社', - // '4157' => '甘肃省农村信用社', - // '4153' => '天津农村商业银行', - // '4113' => '广西壮族自治区农村信用社', - // '4108' => '陕西省农村信用社', - // '4076' => '深圳农村商业银行', - // '4052' => '宁波鄞州农村商业银行', - // '4764' => '浙江省农村信用社联合社', - // '4217' => '江苏省农村信用社联合社', - // '4072' => '江苏紫金农村商业银行股份有限公司', - // '4769' => '北京中关村银行股份有限公司', - // '4778' => '星展银行(中国)有限公司', - // '4766' => '枣庄银行股份有限公司', - // '4758' => '海口联合农村商业银行股份有限公司', - // '4763' => '南洋商业银行(中国)有限公司', - ]; - - /** - * 获取微信提现银行 - * @param string|null $wsea - * @return array|string - */ - public function banks(?string $wsea = null) - { - if (is_null($wsea)) return $this->banks; - foreach ($this->banks as $bank) if ($bank['wseq'] === $wsea) { - return $bank['name']; - } - return $wsea; - } - - /** - * 获取转账类型 - * @param string|null $name - * @return array|string - */ - public function types(?string $name = null) - { - return is_null($name) ? $this->types : ($this->types[$name] ?? $name); - } - - /** - * 同步刷新用户返利 - * @param integer $uuid - * @return array [total, count, audit, locks] - */ - public static function amount(int $uuid): array - { - if ($uuid > 0) { - $locks = abs(DataUserTransfer::mk()->whereRaw("uuid='{$uuid}' and status=3")->sum('amount')); - $total = abs(DataUserTransfer::mk()->whereRaw("uuid='{$uuid}' and status>=1")->sum('amount')); - $count = abs(DataUserTransfer::mk()->whereRaw("uuid='{$uuid}' and status>=4")->sum('amount')); - $audit = abs(DataUserTransfer::mk()->whereRaw("uuid='{$uuid}' and status>=1 and status<3")->sum('amount')); - } else { - $locks = abs(DataUserTransfer::mk()->whereRaw("status=3")->sum('amount')); - $total = abs(DataUserTransfer::mk()->whereRaw("status>=1")->sum('amount')); - $count = abs(DataUserTransfer::mk()->whereRaw("status>=4")->sum('amount')); - $audit = abs(DataUserTransfer::mk()->whereRaw("status>=1 and status<3")->sum('amount')); - } - return [$total, $count, $audit, $locks]; - } - - /** - * 获取提现配置 - * @param ?string $name - * @return array|string - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function config(?string $name = null) - { - static $data = []; - if (empty($data)) $data = sysdata('TransferRule'); - return is_null($name) ? $data : ($data[$name] ?? ''); - } - - /** - * 获取转账配置 - * @param ?string $name - * @return array|string - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function payment(?string $name = null) - { - static $data = []; - if (empty($data)) $data = sysdata('TransferWxpay'); - return is_null($name) ? $data : ($data[$name] ?? ''); - } -} \ No newline at end of file diff --git a/app/data/service/UserUpgradeService.php b/app/data/service/UserUpgradeService.php deleted file mode 100644 index 0bed86186..000000000 --- a/app/data/service/UserUpgradeService.php +++ /dev/null @@ -1,142 +0,0 @@ -where(['id' => $uuid])->find(); - if (empty($user)) return [0, '查询用户资料失败']; - if ($user['pids'] && in_array($mode, [0, 1])) return [1, '已经绑定代理']; - // 检查代理用户 - if (empty($pid0)) $pid0 = $user['pid0']; - if (empty($pid0)) return [0, '绑定的代理不存在']; - if ($uuid == $pid0) return [0, '不能绑定自己为代理']; - // 检查代理资格 - $agent = DataUser::mk()->where(['id' => $pid0])->find(); - if (empty($agent['vip_code'])) return [0, '代理无推荐资格']; - if (strpos($agent['path'], "-{$uuid}-") !== false) return [0, '不能绑定下属']; - try { - Library::$sapp->db->transaction(function () use ($user, $agent, $mode) { - // 更新用户代理 - $path1 = rtrim($agent['path'] ?: '-', '-') . "-{$agent['id']}-"; - $user->save(['pid0' => $agent['id'], 'pid1' => $agent['id'], 'pid2' => $agent['pid1'], 'pids' => $mode > 0 ? 1 : 0, 'path' => $path1, 'layer' => substr_count($path1, '-')]); - // 更新下级代理 - $path2 = "{$user['path']}{$user['id']}-"; - if (DataUser::mk()->whereLike('path', "{$path2}%")->count() > 0) { - foreach (DataUser::mk()->whereLike('path', "{$path2}%")->order('layer desc')->select() as $item) { - $attr = array_reverse(str2arr($path3 = preg_replace("#^{$path2}#", "{$path1}{$user['id']}-", $item['path']), '-')); - $item->save(['pid0' => $attr[0] ?? 0, 'pid1' => $attr[0] ?? 0, 'pid2' => $attr[1] ?? 0, 'path' => $path3, 'layer' => substr_count($path3, '-')]); - } - } - }); - static::upgrade($user['id']); - return [1, '绑定代理成功']; - } catch (\Exception $exception) { - return [0, "绑定代理失败, {$exception->getMessage()}"]; - } - } - - /** - * 同步计算用户等级 - * @param integer $uuid 指定用户UID - * @param boolean $parent 同步计算上级 - * @param ?string $orderNo 升级触发订单 - * @return boolean - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function upgrade(int $uuid, bool $parent = true, ?string $orderNo = null): bool - { - $user = DataUser::mk()->where(['id' => $uuid])->find(); - if (empty($user)) return true; - // 初始化等级参数 - $levels = BaseUserUpgrade::items(); - [$vipName, $vipCode, $vipTeam] = [$levels[0]['name'] ?? '普通用户', 0, []]; - // 统计用户数据 - foreach ($levels as $key => $level) if ($level['upgrade_team'] === 1) $vipTeam[] = $key; - $orderAmount = ShopOrder::mk()->where("uuid={$uuid} and status>=4")->sum('amount_total'); - $teamsDirect = DataUser::mk()->where(['pid1' => $uuid])->whereIn('vip_code', $vipTeam)->count(); - $teamsIndirect = DataUser::mk()->where(['pid2' => $uuid])->whereIn('vip_code', $vipTeam)->count(); - $teamsUsers = $teamsDirect + $teamsIndirect; - // 动态计算用户等级 - foreach (array_reverse($levels) as $item) { - $l1 = empty($item['goods_vip_status']) || $user['buy_vip_entry'] > 0; - $l2 = empty($item['teams_users_status']) || $item['teams_users_number'] <= $teamsUsers; - $l3 = empty($item['order_amount_status']) || $item['order_amount_number'] <= $orderAmount; - $l4 = empty($item['teams_direct_status']) || $item['teams_direct_number'] <= $teamsDirect; - $l5 = empty($item['teams_indirect_status']) || $item['teams_indirect_number'] <= $teamsIndirect; - if ( - ($item['upgrade_type'] == 0 && ($l1 || $l2 || $l3 || $l4 || $l5)) /* 满足任何条件可以等级 */ - || - ($item['upgrade_type'] == 1 && ($l1 && $l2 && $l3 && $l4 && $l5)) /* 满足所有条件可以等级 */ - ) { - [$vipName, $vipCode] = [$item['name'], $item['number']]; - break; - } - } - // 购买入会商品升级 - $query = ShopOrderItem::mk()->alias('b')->join('shop_order a', 'b.order_no=a.order_no'); - $tmpCode = $query->whereRaw("a.uuid={$uuid} and a.payment_status=1 and a.status>=4 and b.vip_entry=1")->max('b.vip_upgrade'); - if ($tmpCode > $vipCode && isset($levels[$tmpCode])) { - [$vipName, $vipCode] = [$levels[$tmpCode]['name'], $levels[$tmpCode]['number']]; - } else { - $orderNo = null; - } - // 后台余额充值升级 - $tmpCode = DataUserBalance::mk()->where(['uuid' => $uuid, 'deleted' => 0])->max('upgrade'); - if ($tmpCode > $vipCode && isset($levels[$tmpCode])) { - [$vipName, $vipCode] = [$levels[$tmpCode]['name'], $levels[$tmpCode]['number']]; - } - // 统计用户订单金额 - $orderAmountTotal = ShopOrder::mk()->whereRaw("uuid={$uuid} and status>=4")->sum('amount_goods'); - $teamsAmountDirect = ShopOrder::mk()->whereRaw("puid1={$uuid} and status>=4")->sum('amount_goods'); - $teamsAmountIndirect = ShopOrder::mk()->whereRaw("puid2={$uuid} and status>=4")->sum('amount_goods'); - // 更新用户团队数据 - $data = [ - 'vip_name' => $vipName, - 'vip_code' => $vipCode, - 'teams_users_total' => $teamsUsers, - 'teams_users_direct' => $teamsDirect, - 'teams_users_indirect' => $teamsIndirect, - 'teams_amount_total' => $teamsAmountDirect + $teamsAmountIndirect, - 'teams_amount_direct' => $teamsAmountDirect, - 'teams_amount_indirect' => $teamsAmountIndirect, - 'order_amount_total' => $orderAmountTotal, - ]; - if (!empty($orderNo)) $data['vip_order'] = $orderNo; - if ($data['vip_code'] !== $user['vip_code']) $data['vip_datetime'] = date('Y-m-d H:i:s'); - DataUser::mk()->where(['id' => $uuid])->update($data); - // 用户升级事件 - if ($user['vip_code'] < $vipCode) Library::$sapp->event->trigger('UserUpgradeLevel', [ - 'uuid' => $user['id'], 'order_no' => $orderNo, 'vip_code_old' => $user['vip_code'], 'vip_code_new' => $vipCode, - ]); - return !($parent && $user['pid1'] > 0) || static::upgrade($user['pid1'], false); - } -} \ No newline at end of file diff --git a/app/data/service/payment/AlipayPaymentService.php b/app/data/service/payment/AlipayPaymentService.php deleted file mode 100644 index aae5c32cc..000000000 --- a/app/data/service/payment/AlipayPaymentService.php +++ /dev/null @@ -1,143 +0,0 @@ -type])) { - $tradeType = static::TYPES[$this->type]['type']; - } else { - throw new Exception(sprintf('支付类型[%s]未配置定义!', $this->type)); - } - $this->config['notify_url'] = sysuri("@data/api.notify/alipay/scene/order/param/{$this->code}", [], false, true); - if (in_array($tradeType, [static::PAYMENT_ALIPAY_WAP, static::PAYMENT_ALIPAY_WEB])) { - if (empty($payReturn)) { - throw new Exception('支付回跳地址不能为空!'); - } else { - $this->config['return_url'] = $payReturn; - } - } - if ($tradeType === static::PAYMENT_ALIAPY_APP) { - $payment = App::instance($this->config); - } elseif ($tradeType === static::PAYMENT_ALIPAY_WAP) { - $payment = Wap::instance($this->config); - } elseif ($tradeType === static::PAYMENT_ALIPAY_WEB) { - $payment = Web::instance($this->config); - } else { - throw new Exception("支付类型[{$tradeType}]暂时不支持!"); - } - $data = ['out_trade_no' => $orderNo, 'total_amount' => $payAmount, 'subject' => $payTitle]; - if (!empty($payRemark)) $data['body'] = $payRemark; - $result = $payment->apply($data); - // 创建支付记录 - $this->createPaymentAction($orderNo, $payTitle, $payAmount); - // 返回支付参数 - return ['result' => $result]; - } catch (Exception $exception) { - throw $exception; - } catch (\Exception $exception) { - throw new Exception($exception->getMessage(), $exception->getCode()); - } - } - - /** - * 支付结果处理 - * @return string - * @throws InvalidResponseException - */ - public function notify(): string - { - $notify = App::instance($this->config)->notify(); - if (in_array($notify['trade_status'], ['TRADE_SUCCESS', 'TRADE_FINISHED'])) { - if ($this->updatePaymentAction($notify['out_trade_no'], $notify['trade_no'], $notify['total_amount'])) { - return 'success'; - } else { - return 'error'; - } - } else { - return 'success'; - } - } - - /** - * 查询订单数据 - * @param string $orderNo - * @return array - * @throws InvalidResponseException - * @throws LocalCacheException - */ - public function query(string $orderNo): array - { - return App::instance($this->config)->query($orderNo); - } - - /** - * 支付服务初始化 - * @return $this - */ - protected function initialize(): AlipayPaymentService - { - $this->config = [ - // 沙箱模式 - 'debug' => false, - // 签名类型(RSA|RSA2) - 'sign_type' => "RSA2", - // 应用ID - 'appid' => $this->params['alipay_appid'], - // 支付宝公钥 (1行填写,特别注意,这里是支付宝公钥,不是应用公钥,最好从开发者中心的网页上去复制) - 'public_key' => $this->_trimCertHeader($this->params['alipay_public_key']), - // 支付宝私钥 (1行填写) - 'private_key' => $this->_trimCertHeader($this->params['alipay_private_key']), - // 支付成功通知地址 - 'notify_url' => '', - // 网页支付回跳地址 - 'return_url' => '', - ]; - return $this; - } - - /** - * 去除证书内容前后缀 - * @param string $content - * @return string - */ - private function _trimCertHeader(string $content): string - { - return preg_replace(['/\s+/', '/-{5}.*?-{5}/'], '', $content); - } -} \ No newline at end of file diff --git a/app/data/service/payment/BalancePaymentService.php b/app/data/service/payment/BalancePaymentService.php deleted file mode 100644 index 1eb9f8dda..000000000 --- a/app/data/service/payment/BalancePaymentService.php +++ /dev/null @@ -1,88 +0,0 @@ -where(['order_no' => $orderNo])->find(); - if (empty($order)) throw new Exception("订单不存在"); - if ($order['status'] !== 2) throw new Exception("不可发起支付"); - // 创建支付行为 - $this->createPaymentAction($orderNo, $payTitle, $payAmount); - // 检查能否支付 - [$total, $count] = UserBalanceService::amount($order['uuid'], [$orderNo]); - if ($payAmount > $total - $count) throw new Exception("可抵扣余额不足"); - try { - // 扣减用户余额 - $this->app->db->transaction(function () use ($order, $payAmount) { - // 更新订单余额 - ShopOrder::mk()->where(['order_no' => $order['order_no']])->update([ - 'payment_balance' => $payAmount, - ]); - // 扣除余额金额 - DataUserBalance::mUpdate([ - 'uuid' => $order['uuid'], - 'code' => "KC{$order['order_no']}", - 'name' => "账户余额支付", - 'remark' => "支付订单 {$order['order_no']} 的扣除余额 {$payAmount} 元", - 'amount' => -$payAmount, - ], 'code'); - // 更新支付行为 - $this->updatePaymentAction($order['order_no'], CodeExtend::uniqidDate(20), $payAmount, '账户余额支付'); - }); - // 刷新用户余额 - UserBalanceService::amount($order['uuid']); - return ['code' => 1, 'info' => '余额支付完成']; - } catch (\Exception $exception) { - return ['code' => 0, 'info' => $exception->getMessage()]; - } - } -} \ No newline at end of file diff --git a/app/data/service/payment/EmptyPaymentService.php b/app/data/service/payment/EmptyPaymentService.php deleted file mode 100644 index 18a091556..000000000 --- a/app/data/service/payment/EmptyPaymentService.php +++ /dev/null @@ -1,63 +0,0 @@ -where(['order_no' => $orderNo])->find(); - if (empty($order)) throw new Exception("订单不存在"); - if ($order['status'] !== 2) throw new Exception("不可发起支付"); - // 创建支付行为 - $this->createPaymentAction($orderNo, $payTitle, $payAmount); - // 更新支付行为 - $this->updatePaymentAction($orderNo, CodeExtend::uniqidDate(20), $payAmount, '无需支付'); - return ['code' => 1, 'info' => '订单无需支付']; - } -} \ No newline at end of file diff --git a/app/data/service/payment/JoinpayPaymentService.php b/app/data/service/payment/JoinpayPaymentService.php deleted file mode 100644 index 6a8f364dc..000000000 --- a/app/data/service/payment/JoinpayPaymentService.php +++ /dev/null @@ -1,168 +0,0 @@ -type])) { - $tradeType = static::TYPES[$this->type]['type']; - } else { - throw new Exception(sprintf('支付类型[%s]未配置定义!', $this->type)); - } - $data = [ - 'p0_Version' => '1.0', - 'p1_MerchantNo' => $this->mchid, - 'p2_OrderNo' => $orderNo, - 'p3_Amount' => $payAmount, - 'p4_Cur' => '1', - 'p5_ProductName' => $payTitle, - 'p6_ProductDesc' => $payRemark, - 'p9_NotifyUrl' => sysuri("@data/api.notify/joinpay/scene/order/param/{$this->code}", [], false, true), - 'q1_FrpCode' => $tradeType ?? '', - 'q5_OpenId' => $openid, - 'q7_AppId' => $this->appid, - 'qa_TradeMerchantNo' => $this->trade, - ]; - if (empty($data['q5_OpenId'])) unset($data['q5_OpenId']); - $this->uri = 'https://www.joinpay.com/trade/uniPayApi.action'; - $result = $this->_doReuest($data); - if (isset($result['ra_Code']) && intval($result['ra_Code']) === 100) { - // 创建支付记录 - $this->createPaymentAction($orderNo, $payTitle, $payAmount); - // 返回支付参数 - return json_decode($result['rc_Result'], true); - } elseif (isset($result['rb_CodeMsg'])) { - throw new Exception($result['rb_CodeMsg']); - } else { - throw new Exception('获取预支付码失败!'); - } - } catch (Exception $exception) { - throw $exception; - } catch (\Exception $exception) { - throw new Exception($exception->getMessage(), $exception->getCode()); - } - } - - /** - * 执行数据请求 - * @param array $data - * @return array - */ - private function _doReuest(array $data = []): array - { - $data['hmac'] = $this->_doSign($data); - return json_decode(HttpExtend::post($this->uri, $data), true); - } - - /** - * 请求数据签名 - * @param array $data - * @return string - */ - private function _doSign(array $data): string - { - ksort($data); - unset($data['hmac']); - return md5(join('', $data) . $this->mchkey); - } - - /** - * 查询订单数据 - * @param string $orderNo - * @return array - */ - public function query(string $orderNo): array - { - $this->uri = 'https://www.joinpay.com/trade/queryOrder.action'; - return $this->_doReuest(['p1_MerchantNo' => $this->mchid, 'p2_OrderNo' => $orderNo]); - } - - /** - * 支付结果处理 - * @return string - */ - public function notify(): string - { - $notify = $this->app->request->get(); - foreach ($notify as &$item) $item = urldecode($item); - if (empty($notify['hmac']) || $notify['hmac'] !== $this->_doSign($notify)) { - return 'error'; - } - if (isset($notify['r6_Status']) && intval($notify['r6_Status']) === 100) { - if ($this->updatePaymentAction($notify['r2_OrderNo'], $notify['r9_BankTrxNo'], $notify['r3_Amount'])) { - return 'success'; - } else { - return 'error'; - } - } else { - return 'success'; - } - } - - /** - * 汇聚支付服务初始化 - * @return JoinpayPaymentService - */ - protected function initialize(): JoinpayPaymentService - { - $this->appid = $this->params['joinpay_appid']; - $this->trade = $this->params['joinpay_trade']; - $this->mchid = $this->params['joinpay_mch_id']; - $this->mchkey = $this->params['joinpay_mch_key']; - return $this; - } -} \ No newline at end of file diff --git a/app/data/service/payment/VoucherPaymentService.php b/app/data/service/payment/VoucherPaymentService.php deleted file mode 100644 index 984cacd6d..000000000 --- a/app/data/service/payment/VoucherPaymentService.php +++ /dev/null @@ -1,60 +0,0 @@ -where(['order_no' => $orderNo])->find(); - if (empty($order)) throw new Exception("订单不存在"); - if ($order['status'] !== 2) throw new Exception("不可发起支付"); - if (empty($payImage)) throw new Exception('支付凭证不能为空'); - $this->updatePaymentOrder($orderNo, CodeExtend::uniqidDate(20), $payAmount, '单据凭证支付', $payImage); - return ['code' => 1, 'info' => '支付凭证上传成功!']; - } -} \ No newline at end of file diff --git a/app/data/service/payment/WechatPaymentService.php b/app/data/service/payment/WechatPaymentService.php deleted file mode 100644 index 183b09849..000000000 --- a/app/data/service/payment/WechatPaymentService.php +++ /dev/null @@ -1,178 +0,0 @@ -version = $this->params['wechat_type'] ?? 'v2'; - if ($this->version === 'v2') { - $this->payment = OrderV2::instance([ - 'appid' => $this->params['wechat_appid'], - 'mch_id' => $this->params['wechat_mch_id'], - 'mch_key' => $this->params['wechat_mch_key'], - 'cache_path' => with_path('runtime/wechat'), - ]); - } else { - $this->payment = OrderV3::instance([ - 'appid' => $this->params['wechat_appid'], - 'mch_id' => $this->params['wechat_mch_id'], - 'mch_v3_key' => $this->params['wechat_mch_v3_key'], - 'cert_public' => $this->params['wechat_mch_v3_public'], - 'cert_private' => $this->params['wechat_mch_v3_private'], - 'cache_path' => with_path('runtime/wechat'), - ]); - } - return $this; - } - - /** - * 创建订单支付参数 - * @param string $openid 用户OPENID - * @param string $orderNo 交易订单单号 - * @param string $payAmount 交易订单金额(元) - * @param string $payTitle 交易订单名称 - * @param string $payRemark 订单订单描述 - * @param string $payReturn 完成回跳地址 - * @param string $payImage 支付凭证图片 - * @return array - * @throws Exception - */ - public function create(string $openid, string $orderNo, string $payAmount, string $payTitle, string $payRemark, string $payReturn = '', string $payImage = ''): array - { - try { - if (empty(static::TYPES[$this->type])) { - throw new Exception(sprintf('支付类型[%s]未配置定义!', $this->type)); - } - $body = empty($payRemark) ? $payTitle : ($payTitle . '-' . $payRemark); - $notify = sysuri("@data/api.notify/wxpay/scene/order/param/{$this->code}", [], false, true); - if ($this->version === 'v2') { - $dataV2 = [ - 'body' => $body, - 'openid' => $openid, - 'attach' => $this->code, - 'out_trade_no' => $orderNo, - 'total_fee' => $payAmount * 100, - 'trade_type' => static::TYPES[$this->type]['type'] ?? '', - 'notify_url' => $notify, - 'spbill_create_ip' => $this->app->request->ip(), - ]; - if (empty($openid)) unset($dataV2['openid']); - $info = $this->payment->create($dataV2); - } else { - $dataV3 = [ - 'appid' => $this->params['wechat_appid'], - 'mchid' => $this->params['wechat_mch_id'], - 'payer' => ['openid' => $openid], - 'amount' => ['total' => $payAmount * 100, 'currency' => 'CNY'], - 'out_trade_no' => $orderNo, - 'notify_url' => $notify, - 'description' => $body, - ]; - if (empty($openid)) unset($dataV3['payer']); - $info = $this->payment->create(strtolower(static::TYPES[$this->type]['type']), $dataV3); - } - if ($info['return_code'] === 'SUCCESS' && $info['result_code'] === 'SUCCESS') { - // 创建支付记录 - $this->createPaymentAction($orderNo, $payTitle, $payAmount); - // 微信二维码及网页支付 - if (in_array($this->type, [static::PAYMENT_WECHAT_WAP, static::PAYMENT_WECHAT_QRC])) { - return $info; - } - // 返回JSAPI参数 - return $this->payment->jsapiParams($info['prepay_id']); - } - throw new Exception($info['err_code_des'] ?? '获取预支付码失败!'); - } catch (Exception $exception) { - throw $exception; - } catch (\Exception $exception) { - throw new Exception($exception->getMessage(), $exception->getCode()); - } - } - - /** - * 查询微信支付订单 - * @param string $orderNo 订单单号 - * @return array - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - */ - public function query(string $orderNo): array - { - $result = $this->payment->query(['out_trade_no' => $orderNo]); - if (isset($result['return_code']) && isset($result['result_code']) && isset($result['attach'])) { - if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') { - $this->updatePaymentAction($result['out_trade_no'], $result['cash_fee'] / 100, $result['transaction_id']); - } - } - return $result; - } - - /** - * 支付结果处理 - * @return string - * @throws \WeChat\Exceptions\InvalidDecryptException - * @throws \WeChat\Exceptions\InvalidResponseException - */ - public function notify(): string - { - $data = []; - if ($this->version === 'v3') { - $notify = $this->payment->notify(); - if ($notify['event_type'] === 'TRANSACTION.SUCCESS') { - $data['cash_fee'] = $notify['result']['amount']['total'] ?? 0; - $data['result_code'] = 'SUCCESS'; - $data['return_code'] = 'SUCCESS'; - $data['out_trade_no'] = $notify['result']['out_trade_no']; - $data['transaction_id'] = $notify['result']['transaction_id']; - } else { - $data['result_code'] = $notify['event_type'] ?? 'ERROR'; - } - } else { - $notify = $this->payment->getNotify(); - $data['cash_fee'] = $notify['cash_fee']; - $data['result_code'] = $notify['result_code']; - $data['return_code'] = $notify['return_code']; - $data['out_trade_no'] = $notify['out_trade_no']; - $data['transaction_id'] = $notify['transaction_id']; - } - // 更新订单支付信息 - if ($data['result_code'] == 'SUCCESS' && $data['return_code'] == 'SUCCESS') { - if ($this->updatePaymentAction($data['out_trade_no'], $data['transaction_id'], $data['cash_fee'] / 100)) { - return $this->payment->getNotifySuccessReply(); - } else { - return 'error'; - } - } else { - return $this->payment->getNotifySuccessReply(); - } - } -} \ No newline at end of file diff --git a/app/data/sys.php b/app/data/sys.php deleted file mode 100644 index 5b60f894d..000000000 --- a/app/data/sys.php +++ /dev/null @@ -1,59 +0,0 @@ -request->isCli()) { - // 动态注册操作指令 - Console::starting(function (Console $console) { - $console->addCommand(OrderClean::class); - $console->addCommand(UserAgent::class); - $console->addCommand(UserAmount::class); - $console->addCommand(UserUpgrade::class); - $console->addCommand(UserTransfer::class); - }); -} else { - // 注册订单支付处理事件 - Library::$sapp->event->listen('ShopOrderPayment', function ($orderNo) { - - Library::$sapp->log->notice("订单 {$orderNo} 支付事件,执行用户返利行为"); - RebateService::instance()->execute($orderNo); - - Library::$sapp->log->notice("订单 {$orderNo} 支付事件,执行发放余额行为"); - UserBalanceService::confirm($orderNo); - - Library::$sapp->log->notice("订单 {$orderNo} 支付事件,执行用户升级行为"); - OrderService::upgrade($orderNo); - }); - - // 注册订单确认支付事件 - Library::$sapp->event->listen('ShopOrderConfirm', function ($orderNo) { - Library::$sapp->log->notice("订单 {$orderNo} 确认事件,执行返利确认行为"); - UserRebateService::confirm($orderNo); - }); -} - -if (!function_exists('show_goods_spec')) { - /** - * 商品规格过滤显示 - * @param string $spec 原规格内容 - * @return string - */ - function show_goods_spec(string $spec): string - { - $specs = []; - foreach (explode(';;', $spec) as $sp) { - $specs[] = explode('::', $sp)[1]; - } - return join(' ', $specs); - } -} \ No newline at end of file diff --git a/app/data/view/base/config/cropper.html b/app/data/view/base/config/cropper.html deleted file mode 100644 index ac941759d..000000000 --- a/app/data/view/base/config/cropper.html +++ /dev/null @@ -1,65 +0,0 @@ -{extend name="main"} - -{block name="content"} -
-
-
-

1. 上传邀请码的背景图片( 支持 PNG 和 JPG 格式 )

-

2. 选择需要绘制二维码的区域,生成相对图片坐标参数

-

3. 保存位置数据,下次可直接显示

-
-
-
- img -
-
- - -
-
- -
- -
- - -{/block} \ No newline at end of file diff --git a/app/data/view/base/config/wxapp.html b/app/data/view/base/config/wxapp.html deleted file mode 100644 index 7b35d39d8..000000000 --- a/app/data/view/base/config/wxapp.html +++ /dev/null @@ -1,30 +0,0 @@ -{extend name="main"} - -{block name="content"} -
-
-
- {$title|default='小程序接口配置'} ( 微信公众号平台配置获取 ) -
-
- - - - - -
-
- -
-
-
-
-{/block} \ No newline at end of file diff --git a/app/data/view/base/discount/form.html b/app/data/view/base/discount/form.html deleted file mode 100644 index 89e87f203..000000000 --- a/app/data/view/base/discount/form.html +++ /dev/null @@ -1,61 +0,0 @@ -
-
- - - -
- 用户等级折扣Discount Scheme - - - - - - - - - {foreach $levels as $level} - - - - - {/foreach} - -
用户等级原价比例 ( 0.00% - 100.00% )
[ VIP{$level.number|default='0'} ] {$level.name|default=''} - -
-
- - - -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
- -
- - - - diff --git a/app/data/view/base/discount/index.html b/app/data/view/base/discount/index.html deleted file mode 100644 index 761479ad5..000000000 --- a/app/data/view/base/discount/index.html +++ /dev/null @@ -1,89 +0,0 @@ -{extend name='table'} - -{block name="button"} - - - -{/block} - -{block name="content"} -
-
    - {foreach ['index'=>'折扣管理','recycle'=>'回 收 站'] as $k=>$v}{if isset($type) and $type eq $k} -
  • {$v}
  • - {else} -
  • {$v}
  • - {/if}{/foreach} -
-
-
-
-
-{/block} - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/data/view/base/message/form.html b/app/data/view/base/message/form.html deleted file mode 100644 index bf818763d..000000000 --- a/app/data/view/base/message/form.html +++ /dev/null @@ -1,34 +0,0 @@ -{extend name="main"} - -{block name='content'} -
-
- - - -
- 通知内容Notify Content - -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
-
- - -{/block} \ No newline at end of file diff --git a/app/data/view/base/message/index.html b/app/data/view/base/message/index.html deleted file mode 100644 index 8ba23d428..000000000 --- a/app/data/view/base/message/index.html +++ /dev/null @@ -1,76 +0,0 @@ -{extend name='table'} - -{block name='button'} - - - - - - - -{/block} - -{block name="content"} -
- {include file='base/message/index_search'} -
-
-{/block} - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/data/view/base/message/index_search.html b/app/data/view/base/message/index_search.html deleted file mode 100644 index 85d8d3958..000000000 --- a/app/data/view/base/message/index_search.html +++ /dev/null @@ -1,38 +0,0 @@ -
- 条件搜索 - -
diff --git a/app/data/view/base/pager/form.html b/app/data/view/base/pager/form.html deleted file mode 100644 index 64eb8869a..000000000 --- a/app/data/view/base/pager/form.html +++ /dev/null @@ -1,33 +0,0 @@ -{extend name="main"} - -{block name='content'} -
-
- - - -
- 页面内容Page Content - -
- -
- - -
- - -
- -
-
- - -{/block} \ No newline at end of file diff --git a/app/data/view/base/pager/index.html b/app/data/view/base/pager/index.html deleted file mode 100644 index 946204054..000000000 --- a/app/data/view/base/pager/index.html +++ /dev/null @@ -1,30 +0,0 @@ -{extend name="main"} - -{block name='content'} -
- 温馨提示:如需添加新内容,需要在 系统管理 数据字典 中添加类型为 “{$type|default=''}” 的记录。 -
-
- {foreach $types as $key=>$type} -
- -
-
-
编辑页面
-
{$type.name|default=''}
-
- -
- -
-
-
编辑页面
-
{$type.name|default=''}
-
- -
- -
- {/foreach} -
-{/block} \ No newline at end of file diff --git a/app/data/view/base/payment/form.html b/app/data/view/base/payment/form.html deleted file mode 100644 index 350e007f3..000000000 --- a/app/data/view/base/payment/form.html +++ /dev/null @@ -1,90 +0,0 @@ -{extend name="main"} - -{block name='content'} -
-
- -
- 支付方式图标Payment Image - -
- - - -
- 支付通道方式Payment Channel - -
- -
{include file='base/payment/form_wechat'}
-
{include file='base/payment/form_alipay'}
-
{include file='base/payment/form_joinpay'}
-
{include file='base/payment/form_voucher'}
- - - -
- {notempty name='vo.id'}{/notempty} - {notempty name='vo.code'}{/notempty} - -
- - -
- -
- -
-{/block} - -{block name='script'} - -{/block} \ No newline at end of file diff --git a/app/data/view/base/payment/form_alipay.html b/app/data/view/base/payment/form_alipay.html deleted file mode 100644 index 5b0516650..000000000 --- a/app/data/view/base/payment/form_alipay.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/data/view/base/payment/form_joinpay.html b/app/data/view/base/payment/form_joinpay.html deleted file mode 100644 index 7671e55d5..000000000 --- a/app/data/view/base/payment/form_joinpay.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/data/view/base/payment/form_voucher.html b/app/data/view/base/payment/form_voucher.html deleted file mode 100644 index 999845aa8..000000000 --- a/app/data/view/base/payment/form_voucher.html +++ /dev/null @@ -1,8 +0,0 @@ -
- 线下支付二维码Payment Qrcode Image - -
\ No newline at end of file diff --git a/app/data/view/base/payment/form_wechat.html b/app/data/view/base/payment/form_wechat.html deleted file mode 100644 index 2e60d16df..000000000 --- a/app/data/view/base/payment/form_wechat.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - -
- 支付接口版本WeChat Payment Version -
- {empty name='vo.content.wechat_type'}{assign name='vo.content.wechat_type' value='v2'}{/empty} - {foreach ['v2'=>'V2 旧版接口','v3'=>'V3 新版接口'] as $k=>$v} - - {/foreach} -
- 微信支付版本,根据微信商户申请的不同支付通道版本配置 -
- - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/data/view/base/payment/index.html b/app/data/view/base/payment/index.html deleted file mode 100644 index 279b90fe0..000000000 --- a/app/data/view/base/payment/index.html +++ /dev/null @@ -1,95 +0,0 @@ -{extend name='table'} - -{block name="button"} - - - - - - - -{/block} - -{block name="content"} -
-
    - {foreach ['index'=>'支付管理','recycle'=>'回 收 站'] as $k=>$v}{if isset($type) and $type eq $k} -
  • {$v}
  • - {else} -
  • {$v}
  • - {/if}{/foreach} -
-
- {include file='base/payment/index_search'} -
-
-
-{/block} - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/data/view/base/payment/index_search.html b/app/data/view/base/payment/index_search.html deleted file mode 100644 index 06bd5d50f..000000000 --- a/app/data/view/base/payment/index_search.html +++ /dev/null @@ -1,42 +0,0 @@ - \ No newline at end of file diff --git a/app/data/view/base/postage/company/form.html b/app/data/view/base/postage/company/form.html deleted file mode 100644 index 52e25faf7..000000000 --- a/app/data/view/base/postage/company/form.html +++ /dev/null @@ -1,42 +0,0 @@ -
- -
- - - - - - - - - - -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
diff --git a/app/data/view/base/postage/company/index.html b/app/data/view/base/postage/company/index.html deleted file mode 100644 index 614aaf66e..000000000 --- a/app/data/view/base/postage/company/index.html +++ /dev/null @@ -1,100 +0,0 @@ -{extend name="table"} - -{block name="button"} - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="content"} -
-
    - {foreach ['index'=>'快递公司','recycle'=>'回 收 站'] as $k=>$v} - {if isset($type) and $type eq $k} -
  • {$v}
  • - {else} -
  • {$v}
  • - {/if}{/foreach} -
-
- {include file='base/postage/company/index_search'} -
-
-
-{/block} - - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/data/view/base/postage/company/index_search.html b/app/data/view/base/postage/company/index_search.html deleted file mode 100644 index cf2e892ab..000000000 --- a/app/data/view/base/postage/company/index_search.html +++ /dev/null @@ -1,27 +0,0 @@ - \ No newline at end of file diff --git a/app/data/view/base/postage/template/form.html b/app/data/view/base/postage/template/form.html deleted file mode 100644 index 9a569ac1c..000000000 --- a/app/data/view/base/postage/template/form.html +++ /dev/null @@ -1,340 +0,0 @@ -{extend name="main"} - -{block name="content"} -
-
-
- -
- 配送区域计费规则Region - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
可配送区域首件(个)运费(元)续件(个)续费(元)
- 自定区域: -
- - {{ShowProvinceCityName(province)}} -
- 编辑 - 删除 -
- - - - - - - -
添加可配送区域和运费
- 默认区域: -
- - {{ShowProvinceCityName(province)}} -
-
- - - - - - - -
-
- - - -
- {notempty name='vo.id'}{/notempty} - {notempty name='vo.code'}{/notempty} - -
- -
-
-
- -
-
-
-
-
-
- 全选 - 取消 -
-
-
-
- - {{x.name}} - {{x.name}} -
-
-
-
-
-
-
- 全选 - 取消 - -
-
- -
-
-
-
-
- -
-
-
- - - - -{/block} diff --git a/app/data/view/base/postage/template/form_region.html b/app/data/view/base/postage/template/form_region.html deleted file mode 100644 index 8a0a6a7f6..000000000 --- a/app/data/view/base/postage/template/form_region.html +++ /dev/null @@ -1,132 +0,0 @@ -{extend name="main"} - -{block name="content"} -
-
-
- 全国配送省份 - 全选 -
-
-
- -
-
-
- -
-
配送城市
-
-
- -
-
-
- -
-
配送区域
-
-
- -
-
-
- -
-
- - -
-
- - - - -{/block} \ No newline at end of file diff --git a/app/data/view/base/postage/template/index.html b/app/data/view/base/postage/template/index.html deleted file mode 100644 index 5c6230b93..000000000 --- a/app/data/view/base/postage/template/index.html +++ /dev/null @@ -1,87 +0,0 @@ -{extend name="table"} - -{block name="button"} - - - - - - - -{/block} - -{block name="content"} -
-
    - {foreach ['index'=>'费用模板','recycle'=>'回 收 站'] as $k=>$v} - {if isset($type) and $type eq $k} -
  • {$v}
  • - {else} -
  • {$v}
  • - {/if}{/foreach} -
-
- {include file='base/postage/template/index_search'} -
-
-
-{/block} - - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/data/view/base/postage/template/index_search.html b/app/data/view/base/postage/template/index_search.html deleted file mode 100644 index 1b391ce5b..000000000 --- a/app/data/view/base/postage/template/index_search.html +++ /dev/null @@ -1,26 +0,0 @@ - \ No newline at end of file diff --git a/app/data/view/base/slider/form.html b/app/data/view/base/slider/form.html deleted file mode 100644 index 2a49b64ad..000000000 --- a/app/data/view/base/slider/form.html +++ /dev/null @@ -1,143 +0,0 @@ -{extend name="main"} - -{block name="content"} - - -
-
-
- {$title|default='图片内容管理'} -
{$base.content|default='图片尺寸:1080px * 1882px'}
- - {$skey} - -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
- -
- - - -
-
-
- -
- -
-
若要跳转页面,请选择对应的数据或填写跳转的 URL 地址,不跳转请填写 “#” 号占位。
-
-
-
- - - - -{/block} \ No newline at end of file diff --git a/app/data/view/base/slider/index.html b/app/data/view/base/slider/index.html deleted file mode 100644 index ccb80288e..000000000 --- a/app/data/view/base/slider/index.html +++ /dev/null @@ -1,30 +0,0 @@ -{extend name="main"} - -{block name='content'} -
- 温馨提示:如需添加新内容,需要在 系统管理 数据字典 中添加类型为 “{$type|default=''}” 的记录。 -
-
- {foreach $types as $key=>$type} -
- -
-
-
编辑图片
-
{$type.name|default=''}
-
- -
- -
-
-
编辑图片
-
{$type.name|default=''}
-
- -
- -
- {/foreach} -
-{/block} \ No newline at end of file diff --git a/app/data/view/base/upgrade/form.html b/app/data/view/base/upgrade/form.html deleted file mode 100644 index 5962ae3f6..000000000 --- a/app/data/view/base/upgrade/form.html +++ /dev/null @@ -1,188 +0,0 @@ - - -
-
- -
- 用户等级 -
-
- 等级序号Serial - -
- -
-
- -
-
-
- 升级规则 -
- {php}$vo['upgrade_type'] = $vo['upgrade_type'] ?? 1;{/php} - {foreach [1=>'达成所有升级条件',0=>'达成任何升级条件'] as $k => $v} - {if isset($vo.upgrade_type) and $vo.upgrade_type eq $k} - - {else} - - {/if}{/foreach} -
-
-
-
-
- 团队计数 -
- {php}$vo['upgrade_team'] = $vo['upgrade_team'] ?? 1;{/php} - {foreach [1=>'参与团队人数统计',0=>'不参与团队人数统计'] as $k => $v} - {if isset($vo.upgrade_team) and $vo.upgrade_team eq $k} - - {else} - - {/if}{/foreach} -
-
-
-
- -
- 升级条件 -
-
- -
-
- -
-
- -
-
- -
-
- -
-
默认等级,无需配置升级规则
-
-
- -
- 奖利规则 -
- {foreach $prizes as $prize}{if isset($vo.rebate_rule) && is_array($vo.rebate_rule) && isset($vo.rebate_rule[$prize.code])} - - {else} - - {/if}{/foreach} -
默认等级,不能发放等级奖励
-
-
- -
- 等级描述 - -
- -
- -
- {if isset($vo.id)}{/if} - {if isset($vo.number)}{/if} - -
- - -
- -
- - diff --git a/app/data/view/base/upgrade/index.html b/app/data/view/base/upgrade/index.html deleted file mode 100644 index a795b2a0e..000000000 --- a/app/data/view/base/upgrade/index.html +++ /dev/null @@ -1,123 +0,0 @@ -{extend name="table"} - -{block name="button"} - - - - - - - -{/block} - -{block name="content"} -
- {include file='base/upgrade/index_search'} -
-
-{/block} - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/data/view/base/upgrade/index_search.html b/app/data/view/base/upgrade/index_search.html deleted file mode 100644 index af784d04c..000000000 --- a/app/data/view/base/upgrade/index_search.html +++ /dev/null @@ -1,38 +0,0 @@ -
- 条件搜索 - -
\ No newline at end of file diff --git a/app/data/view/full.html b/app/data/view/full.html deleted file mode 100644 index c76f00e6f..000000000 --- a/app/data/view/full.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - {block name="title"}{$title|default=''}{if !empty($title)} · {/if}{:sysconf('site_name')}{/block} - - - - - - - - - - - - {block name="style"}{/block} - - - - -{block name='body'} -
-
{block name='content'}{/block}
-
-{/block} - - - - -{block name='script'}{/block} - - \ No newline at end of file diff --git a/app/data/view/main.html b/app/data/view/main.html deleted file mode 100644 index c46b38d3b..000000000 --- a/app/data/view/main.html +++ /dev/null @@ -1,18 +0,0 @@ -
- {block name='style'}{/block} - {block name='header'} - {notempty name='title'} -
- {$title|default=''} -
{block name='button'}{/block}
-
- {/notempty} - {/block} -
-
-
- {block name='content'}{/block} -
-
- {block name='script'}{/block} -
\ No newline at end of file diff --git a/app/data/view/news/item/form.html b/app/data/view/news/item/form.html deleted file mode 100644 index e0e2553f6..000000000 --- a/app/data/view/news/item/form.html +++ /dev/null @@ -1,57 +0,0 @@ -{extend name="main"} - -{block name='content'} -
-
- - -
- 文章标签News Mark -
- {foreach $marks as $tag}{if isset($vo.mark) && is_array($vo.mark) && in_array($tag.name, $vo.mark)} - - {else} - - {/if}{/foreach} -
-
- - -
- 文章封面News Conver -
- - -
-
- - - -
- 文章内容News Content -
- -
-
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
- -
- - -{/block} diff --git a/app/data/view/news/item/index.html b/app/data/view/news/item/index.html deleted file mode 100644 index 4f9b39e88..000000000 --- a/app/data/view/news/item/index.html +++ /dev/null @@ -1,108 +0,0 @@ -{extend name='table'} - -{block name="button"} - - - - - - - - - - - -{/block} - -{block name="content"} -
-
    - {foreach ['index'=>'文章管理','recycle'=>'回 收 站'] as $k=>$v}{if isset($type) and $type eq $k} -
  • {$v}
  • - {else} -
  • {$v}
  • - {/if}{/foreach} -
-
- {include file='news/item/index_search'} -
-
-
-{/block} - -{block name='script'} - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/data/view/news/item/index_search.html b/app/data/view/news/item/index_search.html deleted file mode 100644 index 7d1d0f1fa..000000000 --- a/app/data/view/news/item/index_search.html +++ /dev/null @@ -1,36 +0,0 @@ - \ No newline at end of file diff --git a/app/data/view/news/item/select.html b/app/data/view/news/item/select.html deleted file mode 100644 index b9d1d69aa..000000000 --- a/app/data/view/news/item/select.html +++ /dev/null @@ -1,82 +0,0 @@ -
-
- 条件搜索 - -
-
-
- - - - - - - - \ No newline at end of file diff --git a/app/data/view/news/mark/form.html b/app/data/view/news/mark/form.html deleted file mode 100644 index 88390de21..000000000 --- a/app/data/view/news/mark/form.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
- - - -
- 标签描述Mark Remark - -
- -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
\ No newline at end of file diff --git a/app/data/view/news/mark/index.html b/app/data/view/news/mark/index.html deleted file mode 100644 index 6852bf936..000000000 --- a/app/data/view/news/mark/index.html +++ /dev/null @@ -1,100 +0,0 @@ -
-
- 条件搜索 - -
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/app/data/view/news/mark/index_search.html b/app/data/view/news/mark/index_search.html deleted file mode 100644 index e2c534178..000000000 --- a/app/data/view/news/mark/index_search.html +++ /dev/null @@ -1,38 +0,0 @@ -
- 条件搜索 - -
- diff --git a/app/data/view/shop/cate/form.html b/app/data/view/shop/cate/form.html deleted file mode 100644 index 0dcc84d74..000000000 --- a/app/data/view/shop/cate/form.html +++ /dev/null @@ -1,47 +0,0 @@ -
-
- -
- 绑定上级分类Category Parent - - 必选,请选择上级分类或顶级分类(目前最多支持{$cateLevel|default=0}级分类) -
- - - -
- 商品分类图标Category Cover - - 可选,请上传商品分类图标,需要是 http 可访问的图片资源链接 -
- - -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
- -
\ No newline at end of file diff --git a/app/data/view/shop/cate/index.html b/app/data/view/shop/cate/index.html deleted file mode 100644 index e18cf03ef..000000000 --- a/app/data/view/shop/cate/index.html +++ /dev/null @@ -1,91 +0,0 @@ -{extend name="table"} - -{block name="button"} - - - - - - - -{/block} - -{block name="content"} -
- 注意:商品分类需要在上传商品前添加,当商品分类关联有商品时不建议进行 移动删除 操作! -
- -
-
-
- - - - - - - - - - - -{/block} diff --git a/app/data/view/shop/goods/form.html b/app/data/view/shop/goods/form.html deleted file mode 100644 index f79ea34f7..000000000 --- a/app/data/view/shop/goods/form.html +++ /dev/null @@ -1,476 +0,0 @@ -{extend name="main"} - -{block name="content"} -{include file='shop/goods/formstyle'} -
-
- - -
- 商品标签Mark Name -
- {foreach $marks as $mark} - - {/foreach} -
-
- - - -
- 支付方式Goods Payment -
- {foreach $payments as $payment} - - {/foreach} -
-
- - - - - - - - - - - - -
- 商品封面及轮播图片Cover and Carousel Pictures - - - - - - - - - - - -
封面轮播图片
-
- - -
-
-
- - -
-
-
- -
-
-
- 商品返利配置 -
- {foreach ['非返利商品,其代理不会获得奖励','是返利商品,其代理将会获得奖励'] as $k => $v} - {if (isset($vo.rebate_type) and $vo.rebate_type eq $k) or (empty($vo.rebate_type) and $k eq 0)} - - {else} - - {/if}{/foreach} -
-
-
- 入会礼包配置 -
- {foreach ['非入会礼包,购买后不会升级等级','是入会礼包,购买后升级会员等级'] as $k=>$v} - {if (isset($vo.vip_entry) and $vo.vip_entry eq $k) or (empty($vo.vip_entry) and $k eq 0)} - - {else} - - {/if}{/foreach} -
-
- -
- 升级用户等级 - -
- -
- 物流配送发货类型 -
- {foreach ['虚拟商品,无需物流配送','实物商品,需要物流配送'] as $k=>$v} - {if (isset($vo.truck_type) and $vo.truck_type eq $k) or (empty($vo.truck_type) and $k eq 0)} - - {else} - - {/if}{/foreach} -
-
- -
- 用户购买折扣方案 - -
- - -
- 限制最低购买等级 - -
- -
- 商品限购数量 - -
-
-
- -
- 商品规格及商品SKU绑定(规格填写后不允许再次修改) - -
- 增加规则分组 -

请完成属性修改后再编辑下面的规格信息,否则规格数据会丢失!

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
商品SKU 市场价格 销售价格 奖励余额 奖励积分 虚拟销量 快递计件 销售状态
- - - - - - - - - - - - - - - -
-

请注意商品的SKU尽量不要重复,也不能产生订单后再修改,否则会造成订单数据无法关联!

- -
- - - -
- 商品富文本详情 - -
- -
- {notempty name='vo.code'}{/notempty} - -
- - -
-
-
-{/block} - -{block name='script'} - - - -{/block} \ No newline at end of file diff --git a/app/data/view/shop/goods/formstyle.html b/app/data/view/shop/goods/formstyle.html deleted file mode 100644 index 8d736998d..000000000 --- a/app/data/view/shop/goods/formstyle.html +++ /dev/null @@ -1,96 +0,0 @@ - \ No newline at end of file diff --git a/app/data/view/shop/goods/index.html b/app/data/view/shop/goods/index.html deleted file mode 100644 index 6ba1e7daa..000000000 --- a/app/data/view/shop/goods/index.html +++ /dev/null @@ -1,138 +0,0 @@ -{extend name="main"} - -{block name="button"} - - - - -{if isset($type) and $type eq 'index'} - - - -{else} - - - -{/if} - - - - -{/block} - -{block name="content"} -
-
    - {foreach ['index'=>'商品管理','recycle'=>'回 收 站'] as $k=>$v} - {if isset($type) and $type eq $k} -
  • {$v}
  • - {else} -
  • {$v}
  • - {/if}{/foreach} -
-
- {include file='shop/goods/index_search'} - - {notempty name='list'} - - - - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - - - - {/foreach} - -
- - - - 商品信息商品状态
- - - - - {notempty name='vo.cover'} -
- {/notempty} -
-
商品名称:{$vo.name|default='--'}
-
商品编号:{$vo.code|default='--'}
-
-
-
- {notempty name='vo.marks'}{foreach $vo.marks as $mark} - {$mark} - {/foreach}{/notempty} -
-
- {notempty name='vo.cateinfo'} - {:join('', $vo.cateinfo.names)} - {/notempty} -
-
- 累计库存 {$vo.stock_total} 件,剩余库存 {$vo.stock_total-$vo.stock_sales} 件 ( 已销售 {$vo.stock_sales} 件 ) -
- {eq name='vo.status' value='0'}已下架{else}销售中{/eq} - {eq name='vo.vip_entry' value='0'}非入会礼包{else}是入会礼包{/eq} - {eq name='vo.truck_type' value='0'}无需发货{else}需要发货{/eq} - {eq name='vo.rebate_type' value='0'}非返利商品{else}是返利商品{/eq} -
-
- - - 复 制 - - - - 编 辑 - - 编 辑 - - - {if isset($type) and $type eq 'index'} - {if isset($vo.status) and $vo.status eq 1} - - 下 架 - - 下 架 - - {else} - - 上 架 - - 上 架 - - {/if} - - 入 库 - - 入 库 - - - 删 除 - - {else} - - 恢 复 - - {/if} -
- {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-
-{/block} \ No newline at end of file diff --git a/app/data/view/shop/goods/index_search.html b/app/data/view/shop/goods/index_search.html deleted file mode 100644 index 46691cffb..000000000 --- a/app/data/view/shop/goods/index_search.html +++ /dev/null @@ -1,107 +0,0 @@ - \ No newline at end of file diff --git a/app/data/view/shop/goods/select.html b/app/data/view/shop/goods/select.html deleted file mode 100644 index ec346c026..000000000 --- a/app/data/view/shop/goods/select.html +++ /dev/null @@ -1,48 +0,0 @@ -{extend name="full"} - -{block name="content"} -
- {include file='shop/goods/select_search'} - - {notempty name='list'} - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - {/foreach} - -
商品信息商品状态
- {notempty name='vo.cover'} -
- {/notempty} -
- 商品编号:{$vo.code|default='--'}
- 商品名称:{$vo.name|default='--'}
-
-
- 销售状态:{if $vo.status eq 0}已下架{else}销售中{/if}
- 剩余库存 {$vo.stock_total-$vo.stock_sales} 件 ( 已销售 {$vo.stock_sales} 件 )
-
选择商品
- {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-{/block} - -{block name='script'} - -{/block} diff --git a/app/data/view/shop/goods/select_search.html b/app/data/view/shop/goods/select_search.html deleted file mode 100644 index 40d438929..000000000 --- a/app/data/view/shop/goods/select_search.html +++ /dev/null @@ -1,36 +0,0 @@ -
- 条件搜索 - -
diff --git a/app/data/view/shop/goods/stock.html b/app/data/view/shop/goods/stock.html deleted file mode 100644 index fea82084b..000000000 --- a/app/data/view/shop/goods/stock.html +++ /dev/null @@ -1,102 +0,0 @@ -
-
- -
- 商品编号 - Goods Code -
{$vo.code|default=''}
-
- -
- 商品名称 - Goods Name -
{$vo.name|default=''}
-
- -
-
- 库存数据 - Goods Stock Data - - - - - - - - - - - - - - - - - - - - - - - -
商品规格市场价格销售价格库存统计总销统计库存剩余 - 入库数量 -
-
- - - - - - - - - - - - {foreach $vo.items as $goods} - - - - - - - - - - {/foreach} - -
{$goods.goods_spec|show_goods_spec}¥{$goods.price_market+0}¥{$goods.price_selling+0}{$goods.stock_total|default=0}{$goods.stock_sales|default=0}{$goods.stock_total-$goods.stock_sales} - - - -
-
-
-
-
- -
- -
- - -
-
- - diff --git a/app/data/view/shop/mark/form.html b/app/data/view/shop/mark/form.html deleted file mode 100644 index dc4b5f3df..000000000 --- a/app/data/view/shop/mark/form.html +++ /dev/null @@ -1,26 +0,0 @@ -
-
- - - -
- 标签描述Mark Remark - -
- -
- -
- {notempty name='vo.id'}{/notempty} - -
- - -
-
\ No newline at end of file diff --git a/app/data/view/shop/mark/index.html b/app/data/view/shop/mark/index.html deleted file mode 100644 index 6852bf936..000000000 --- a/app/data/view/shop/mark/index.html +++ /dev/null @@ -1,100 +0,0 @@ -
-
- 条件搜索 - -
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/app/data/view/shop/order/audit.html b/app/data/view/shop/order/audit.html deleted file mode 100644 index 703acb5e4..000000000 --- a/app/data/view/shop/order/audit.html +++ /dev/null @@ -1,46 +0,0 @@ -
- -
- -
- - 支付单证凭证 - {$vo.order_no} - 订单需要支付 {$vo.amount_real+0} 元 - -
- img -
-
- -
- 审核操作类型 - Audit type -
- {php} $status = 0; {/php} - {foreach [1 => '审核通过并完成订单支付', 0 => '驳回审核并取消订单'] as $k => $v} - {if $k eq $status} - - {else} - - {/if}{/foreach} -
-
- - - - -
- {notempty name='vo.id'}{/notempty} - {notempty name='vo.order_no'}{/notempty} - -
- - -
-
-
\ No newline at end of file diff --git a/app/data/view/shop/order/index.html b/app/data/view/shop/order/index.html deleted file mode 100644 index 4e9be6588..000000000 --- a/app/data/view/shop/order/index.html +++ /dev/null @@ -1,144 +0,0 @@ -{extend name="main"} - -{block name="button"} - - - -{/block} - -{block name="content"} -
-
    - {php}$types = ['ta' => '全部订单', 't2' => '等待支付', 't3' => '等待审核', 't4' => '等待发货', 't5' => '等待收货', 't6' => '已经完成', 't0' => '已经取消'];{/php} - {foreach $types as $k=>$v}{if isset($type) and 't'.$type eq $k} -
  • {$v}{$total[$k]??0}
  • - {else} -
  • {$v}{$total[$k]??0}
  • - {/if}{/foreach} -
-
- {include file='shop/order/index_search'} - - {notempty name='list'} - - - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - - - {/foreach} - -
- - 用户信息订单信息发货信息商品信息
- - -
- -
-
-
推荐用户:{$vo.from.nickname|default='--'}[ VIP{$vo.from.vip_code} ] {$vo.from.vip_name}
-
推荐手机:{$vo.from.phone|default='--'}
-
- -
没有代理
- -
-
-
-
- 用户昵称:{$vo.user.nickname|default='--'}[ VIP{$vo.user.vip_code} ] {$vo.user.vip_name}
- 用户手机:{$vo.user.phone|default='--'}
-
-
-
- {eq name='vo.status' value='0'}已经取消{/eq} - {eq name='vo.status' value='1'}预购订单{/eq} - {eq name='vo.status' value='2'}等待待付款{/eq} - {eq name='vo.status' value='3'}等待审核{/eq} - {eq name='vo.status' value='4'}等待发货{/eq} - {eq name='vo.status' value='5'}已经发货{/eq} - {eq name='vo.status' value='6'}已经完成{/eq} -
-
- 订单单号:{$vo.order_no|default=''} - - 凭证审核 - -
-
- 订单总计:{$vo.amount_total+0} 元 - {if $vo.amount_express>0}(含运费 {$vo.amount_express+0} 元{else}(包邮{/if}, 随减 {$vo.amount_reduct+0} 元) - 已支付 {$vo.payment_amount+0} 元 -
-
下单时间:{$vo.create_at|format_datetime}
- -
- 支付时间:{$vo.payment_datetime|format_datetime} - {notempty name='vo.payment_name'} - - ({$vo.payment_name|default='-'}) - - ({$vo.payment_name|default='-'}) - - {/notempty} -
- - 支付状态:还未支付 - -
-
- {empty name='vo.truck_type'} - 无需发货 - {else} -
收货信息:{$vo.truck.address_name|default='--'}{$vo.truck.address_phone|default=''}
-
收货地址:{$vo.truck.address_province|default='--'}{$vo.truck.address_city|default=''}{$vo.truck.address_area|default=''}{$vo.truck.address_content|default=''}
-
发货状态:未发货{$vo.truck.company_name|default='--'} - {$vo.truck.send_number|default='--'} - - - - 填写发货 - - 修改发货 - - - - 取消订单 - -
-
发货时间:{$vo.truck.send_datetime|default='--'}
- {/empty} -
- {foreach $vo.items as $g} -
- {if $g.vip_entry > 0 and $g.vip_upgrade > $g.vip_code} - [ VIP{$g.vip_code} VIP{$g.vip_upgrade} ] - {else} - [ VIP{$g.vip_code} ] - {/if} - {if $g.discount_rate < 100.00} - 享{$g.discount_rate+0}%折扣 x - {/if} - {$g.stock_sales|default=0}件 x {$g.price_selling+0}元 - {$g.goods_name|default=''} ( {$g.goods_spec|show_goods_spec} ) -
- {/foreach} -
- {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-
-{/block} diff --git a/app/data/view/shop/order/index_search.html b/app/data/view/shop/order/index_search.html deleted file mode 100644 index e9aabdab9..000000000 --- a/app/data/view/shop/order/index_search.html +++ /dev/null @@ -1,140 +0,0 @@ - - - \ No newline at end of file diff --git a/app/data/view/shop/send/config.html b/app/data/view/shop/send/config.html deleted file mode 100644 index 7a9e9e725..000000000 --- a/app/data/view/shop/send/config.html +++ /dev/null @@ -1,43 +0,0 @@ -
-
- - - - - -
- 发货所在区域 -
- - - -
-
- - -
- -
- -
- - -
- - -
\ No newline at end of file diff --git a/app/data/view/shop/send/index.html b/app/data/view/shop/send/index.html deleted file mode 100644 index a512692d3..000000000 --- a/app/data/view/shop/send/index.html +++ /dev/null @@ -1,84 +0,0 @@ -{extend name="main"} - -{block name="button"} - -发货地址管理 - -{/block} - -{block name="content"} -
-
    - {foreach ['ta'=>'全部订单','t1'=>'等待发货','t2'=>'已经发货','t0'=>'已经取消'] as $k => $v} - {if isset($type) and 't'.$type eq $k} -
  • {$v}{$total[$k]??0}
  • - {else} -
  • {$v}{$total[$k]??0}
  • - {/if}{/foreach} -
-
- {include file='shop/send/index_search'} - - {notempty name='list'} - - - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - - - {/foreach} - -
- - 用户信息收货信息发货状态
- - -
-
-
用户昵称:{$vo.user.nickname|default='-'}[ VIP{$vo.user.vip_code} ] {$vo.user.vip_name}
-
用户手机:{$vo.user.phone|default='-'}
-
订单单号:{$vo.order_no|default='-'}
-
-
- {notempty name='vo.address_idcode'} -
身份证号:{$vo.address_idcode|default='-'}
- {/notempty} -
收货姓名:{$vo.address_name|default='-'}{$vo.address_phone}
-
收货地址:{$vo.address_province|default='-'}{$vo.address_city}{$vo.address_area}{$vo.address_content}
-
提交时间:{$vo.address_datetime|format_datetime}
-
- {if empty($vo.send_datetime)} - 未发货 - {else} - {$vo.company_name|default='-'} - {$vo.send_number|default='-'} -
{$vo.send_datetime|format_datetime} 发货!
- {/if} -
- - 填写发货 - - 修改发货 - -
- - {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} - -
-
-{/block} diff --git a/app/data/view/shop/send/index_search.html b/app/data/view/shop/send/index_search.html deleted file mode 100644 index 94d8105a1..000000000 --- a/app/data/view/shop/send/index_search.html +++ /dev/null @@ -1,114 +0,0 @@ - - - \ No newline at end of file diff --git a/app/data/view/shop/send/truck_form.html b/app/data/view/shop/send/truck_form.html deleted file mode 100644 index 0998586cc..000000000 --- a/app/data/view/shop/send/truck_form.html +++ /dev/null @@ -1,93 +0,0 @@ -
-
-
- 收货信息 -
- - - - -
- 收货所在区域 - (原区域:{$vo.address_province|default='--'} - {$vo.address_city|default=''} - {$vo.address_area|default=''} ) -
- - - -
-
- - -
-
- -
- - 快递信息 - 快递跟踪 - - - - - - -
-
- -
- {notempty name='vo.order_no'}{/notempty} - {notempty name='vo.send_datetime'}{/notempty} - -
- - -
- - -
\ No newline at end of file diff --git a/app/data/view/shop/send/truck_query.html b/app/data/view/shop/send/truck_query.html deleted file mode 100644 index e0e436f82..000000000 --- a/app/data/view/shop/send/truck_query.html +++ /dev/null @@ -1,17 +0,0 @@ -
- {empty name='result.data'} -
还没有快递记录哦!
- {else} -
    - {foreach $result.data as $key=>$vo} -
  • - {if $key eq 0 }{else}{/if} -
    - {$vo.time|format_datetime|default='--'} -

    {$vo.context|default='--'}

    -
    -
  • - {/foreach} -
- {/empty} -
\ No newline at end of file diff --git a/app/data/view/table.html b/app/data/view/table.html deleted file mode 100644 index 5725f4d26..000000000 --- a/app/data/view/table.html +++ /dev/null @@ -1,18 +0,0 @@ -
- {block name='style'}{/block} - {block name='header'} - {notempty name='title'} -
- {$title|default=''} -
{block name='button'}{/block}
-
- {/notempty} - {/block} -
-
-
- {block name='content'}{/block} -
-
- {block name='script'}{/block} -
\ No newline at end of file diff --git a/app/data/view/total/portal/index.html b/app/data/view/total/portal/index.html deleted file mode 100644 index e5acf4224..000000000 --- a/app/data/view/total/portal/index.html +++ /dev/null @@ -1,303 +0,0 @@ -{extend name="main"} - -{block name='content'} -
-
-
-
-
商品总量
-
{$goodsTotal|default='0'}
-
当前商品总数量
-
- -
-
-
-
用户总量
-
{$usersTotal|default='0'}
-
当前用户总数量
-
- -
-
-
-
订单总量
-
{$orderTotal|default='0'}
-
已付款订单总数
-
- -
-
-
-
交易金额
-
{$amountTotal|default='0'}
-
已成交金额总数
-
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - - - -{/block} diff --git a/app/data/view/user/admin/index.html b/app/data/view/user/admin/index.html deleted file mode 100644 index 4bae6a9fb..000000000 --- a/app/data/view/user/admin/index.html +++ /dev/null @@ -1,157 +0,0 @@ -{extend name="main"} - -{block name="button"} - - - - - - - -{/block} - -{block name="content"} -
-
    - {foreach $total as $k=>$v}{if isset($type) and 't'.$type eq $k} -
  • - {if is_numeric($v.vip)}[VIP{$v.vip}]{/if} - {$v.name}{$v.count|default=0} -
  • - {else} -
  • - {if is_numeric($v.vip)}[VIP{$v.vip}]{/if} - {$v.name}{$v.count|default=0} -
  • - {/if}{/foreach} -
-
- {include file='user/admin/index_search'} - - {notempty name='list'} - - - - - - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - - - - - - {/foreach} - -
- - 会员用户代理用户余额统计返利统计团队统计用户状态
- - -
-
-
- {notempty name='vo.username'} - 用户姓名:{$vo.username|default='-'} - {else} - 用户昵称:{$vo.nickname|default='-'} - {/notempty} -
-
用户手机:{$vo.phone|default='-'}
-
用户等级:[ VIP{$vo.vip_code} ] {$vo.vip_name}
-
-
- {notempty name='vo.from'} -
-
-
- {notempty name='vo.from.username'} - 用户姓名:{$vo.from.username|default='-'} - {else} - 用户昵称:{$vo.from.nickname|default='-'} - {/notempty} -
-
用户手机:{$vo.from.phone|default='-'}
-
用户等级:[ VIP{$vo.from.vip_code} ] {$vo.from.vip_name}
-
- {else} -
没有代理
- {/notempty} -
-
累计充值 {$vo.balance_total+0}
-
已经交易 {$vo.balance_used+0}
-
可用余额 {:round($vo.balance_total-$vo.balance_used,2)+0}
-
-
累计返利 {$vo.rebate_total+0}+{$vo.rebate_lock+0}
-
已经提现 {$vo.rebate_used+0}
-
剩余提现 {:round($vo.rebate_total-$vo.rebate_used,2)+0}
-
-
全部团队 {$vo.teams_users_total} 人 ( 业绩 {$vo.teams_amount_total+0} 元 )
-
直属团队 {$vo.teams_users_direct} 人 ( 业绩 {$vo.teams_amount_direct+0} 元 )
-
间接团队 {$vo.teams_users_indirect} 人 ( 业绩 {$vo.teams_amount_indirect+0} 元 )
-
-
注册时间:{$vo.create_at}
-
- 代理关联: - 永久绑定 - - 更改绑定 - - - {notempty name='vo.pid0'} - 临时绑定 - - 改为永久 - - {else} - 没有绑定 - - 设置绑定 - - {/notempty} - - - 设为总部 - -
-
- 用户状态: - {if $vo.status eq 0}已冻结{elseif $vo.status eq 1}已激活{/if} - {if $vo.buy_vip_entry}已入会{else}未入会{/if} - 累计交易 {$vo.order_amount_total+0} -
-
- - - 修改上级 - - - - 充 值 - - - - 冻 结 - - - - 解 冻 - -
- {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-
-{/block} diff --git a/app/data/view/user/admin/index_search.html b/app/data/view/user/admin/index_search.html deleted file mode 100644 index 13e2fe1a1..000000000 --- a/app/data/view/user/admin/index_search.html +++ /dev/null @@ -1,146 +0,0 @@ - - - diff --git a/app/data/view/user/admin/parent.html b/app/data/view/user/admin/parent.html deleted file mode 100644 index 6cd2953b3..000000000 --- a/app/data/view/user/admin/parent.html +++ /dev/null @@ -1,87 +0,0 @@ -{extend name="full"} - -{block name="content"} -
- {include file='user/admin/parent_search'} - - {notempty name='list'} - - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - - {/foreach} - -
用户信息注册时间
-
-
-
- {notempty name='vo.username'} - 姓名:{$vo.username|default='-'} - {else} - 昵称:{$vo.nickname|default='-'} - {/notempty} - [ VIP{$vo.vip_code} ] {$vo.vip_name} -
-
手机:{$vo.phone|default='-'}
-
-
- {notempty name='vo.from'} -
-
- - 永久 - - 临时 - -
-
-
- {notempty name='vo.from.username'} - 姓名:{$vo.from.username|default='-'} - {else} - 昵称:{$vo.from.nickname|default='-'} - {/notempty} - [ VIP{$vo.from.vip_code} ] {$vo.from.vip_name} -
-
手机:{$vo.from.phone|default='-'}
-
- {else} -
没有代理
- {/notempty} -
- 使用状态:{if $vo.status eq 0}已冻结{elseif $vo.status eq 1}已激活{/if}
- 注册时间:{$vo.create_at|format_datetime} -
- - 选择绑定 - -
- {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-{/block} - -{block name='script'} - -{/block} diff --git a/app/data/view/user/admin/parent_search.html b/app/data/view/user/admin/parent_search.html deleted file mode 100644 index 5584ca21a..000000000 --- a/app/data/view/user/admin/parent_search.html +++ /dev/null @@ -1,75 +0,0 @@ -
- 条件搜索 - - -
diff --git a/app/data/view/user/admin/teams.html b/app/data/view/user/admin/teams.html deleted file mode 100644 index be98bfd25..000000000 --- a/app/data/view/user/admin/teams.html +++ /dev/null @@ -1,51 +0,0 @@ -{extend name="main"} - -{block name="content"} -
-
- -
-{/block} diff --git a/app/data/view/user/balance/form.html b/app/data/view/user/balance/form.html deleted file mode 100644 index 55337e7d3..000000000 --- a/app/data/view/user/balance/form.html +++ /dev/null @@ -1,78 +0,0 @@ -
-
- -
- 用户资料 -
-
-
-
-
-
-
- - -
-
-
- - - - - - - -
- 升级用户等级Upgrade - - 请选择目标升级等级,当用户低于当前等级时会进行用户升级操作 -
- -
- 余额充值备注Remark - -
- -
- -
- - {notempty name='vo.id'}{/notempty} - -
- - -
-
- - \ No newline at end of file diff --git a/app/data/view/user/balance/index.html b/app/data/view/user/balance/index.html deleted file mode 100644 index 3af83667e..000000000 --- a/app/data/view/user/balance/index.html +++ /dev/null @@ -1,68 +0,0 @@ -{extend name="main"} - -{block name="button"} - - - -{/block} - -{block name="content"} -
- 余额统计:累计已充值余额 {$balance.0|default=0.00|number_format} 元,已使用 {$balance.1|default=0.00|number_format} 元,剩余可使用 {$balance.0-$balance.1|number_format} 元。 -
-
- {include file='user/balance/index_search'} - - {notempty name='list'} - - - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - - - {/foreach} - -
- - 用户信息充值金额充值描述
- - -
-
-
用户昵称:{$vo.user.nickname|default='--'}
-
用户手机:{$vo.user.phone|default='--'}
-
用户等级:[ VIP{$vo.user.vip_code} ] {$vo.user.vip_name}
-
-
-
交易金额:{if $vo.amount>=0}{$vo.amount+0}{else}{$vo.amount+0}{/if} 元
-
升级等级:{if $vo.upgrade>0}升级到 [ VIP{$vo.upgrade} ] {$vo.upgradeinfo.name|default=''}{else}不进行用户升级{/if}
-
操作时间:{$vo.create_at|format_datetime}
-
-
充值名称:{$vo.name|default='-'}
-
充值单号:{$vo.code|default='-'}
- -
充值备注:{$vo.remark}
- -
充值备注:未填写充值记录的备注内容
- -
- - 删 除 - -
- {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-{/block} \ No newline at end of file diff --git a/app/data/view/user/balance/index_search.html b/app/data/view/user/balance/index_search.html deleted file mode 100644 index 1ab81cfbf..000000000 --- a/app/data/view/user/balance/index_search.html +++ /dev/null @@ -1,62 +0,0 @@ -
- 条件搜索 - -
\ No newline at end of file diff --git a/app/data/view/user/message/config.html b/app/data/view/user/message/config.html deleted file mode 100644 index 7001a5b76..000000000 --- a/app/data/view/user/message/config.html +++ /dev/null @@ -1,58 +0,0 @@ -{extend name="main"} - -{block name="content"} -
- 注意:短信接口配置的参数不能随意修改,会影响到用户注册发送短信通知功能,若有需要调整请联系客服! -
-
-
- -
- - - - - - - - - - - -
- -
- -
- -
-
- -
-{/block} \ No newline at end of file diff --git a/app/data/view/user/message/index.html b/app/data/view/user/message/index.html deleted file mode 100644 index 8c408f538..000000000 --- a/app/data/view/user/message/index.html +++ /dev/null @@ -1,52 +0,0 @@ -{extend name="main"} - -{block name="button"} - - - -{/block} - -{block name="content"} -
- {include file='user/message/index_search'} - - {notempty name='list'} - - - - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - - - - {/foreach} - -
- - 目标手机短信内容执行结果发送时间
- - {$vo.phone|default=''}{$vo.content|default=''} - {if $vo.status eq 0}失败{/if} - {if $vo.status eq 1}成功{/if} - {$vo.result|default=''} - {$vo.create_at|default=''}
- - 删 除 - -
- {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-{/block} \ No newline at end of file diff --git a/app/data/view/user/message/index_search.html b/app/data/view/user/message/index_search.html deleted file mode 100644 index 13669ef51..000000000 --- a/app/data/view/user/message/index_search.html +++ /dev/null @@ -1,44 +0,0 @@ -
- 条件搜索 - -
\ No newline at end of file diff --git a/app/data/view/user/rebate/config.html b/app/data/view/user/rebate/config.html deleted file mode 100644 index d488a8996..000000000 --- a/app/data/view/user/rebate/config.html +++ /dev/null @@ -1,308 +0,0 @@ -{extend name="main"} - -{block name='content'} -
-
- - -
-
-
-
- 结算到账 -
- {php} $data['settl_type'] = $data['settl_type'] ?? 1; {/php} - {foreach [1 => '支付后立即到账', 2 => '确认收货后到账'] as $key => $val}{if $data.settl_type eq $key} - - {else} - - {/if}{/foreach} -
-
-
-
-
- 团队结算 -
- {php} $data['teams_type'] = $data['teams_type'] ?? 1; {/php} - {foreach [1 => '实时结算'] as $key=>$val}{if $data.teams_type eq $key} - - {else} - - {/if}{/foreach} -
-
-
-
-
- - -
-
- 平推奖励 -
-
- {foreach $levels as $level} -
-
- - {php} $key = 'equal_state_vip_'.$level['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 0; {/php} - {if isset($data[$key]) and $data[$key] eq 1} - - {else} - - {/if} - -
-
- - -
-
-
-
- {/foreach} -
-
-
-
- -
-
-
    - {foreach $levels as $level} -
  • [ VIP{$level.number|default=0} ] {$level.name|default=''}
  • - {/foreach} -
-
- {foreach $levels as $level} -
- - - - - {foreach $levels as $l} - - - - - {/foreach} -
- {$level.name} {$l.name} - -
-
-
- - {php} $key = 'frist_state_vip_'.$level['number'].'_'.$l['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 0; {/php} - {if isset($data[$key]) and $data[$key] eq 1} - - {else} - - {/if} - -
- {php} $key = 'frist_type_vip_'.$level['number'].'_'.$l['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 1; {/php} - {foreach [1 => '奖励固定金额 / 每单',2 => '按订单参与的返利金额比例'] as $k => $v} - {if isset($data[$key]) and $data[$key] eq $k} - - {else} - - {/if}{/foreach} - -
-
-
-
-
- - {php} $key = 'repeat_state_vip_'.$level['number'].'_'.$l['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 0; {/php} - {if isset($data[$key]) and $data[$key] eq 1} - - {else} - - {/if} - -
- {php} $key = 'repeat_type_vip_'.$level['number'].'_'.$l['number']; {/php} - {php} $data[$key] = $data[$key] ?? 1; {/php} - {foreach [1 => '奖励固定金额 / 每单', 2 => '按订单参与的返利金额比例'] as $k => $v} - {if isset($data[$key]) and $data[$key] eq $k} - - {else} - - {/if}{/foreach} - -
-
-
-
-
-
-
-
-
- - {php} $key = 'direct_state_vip_'.$level['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 0; {/php} - {if isset($data[$key]) and $data[$key] eq 1} - - {else} - - {/if} - -
- {php} $key = 'direct_type_vip_'.$level['number']; {/php} - {php} $data[$key] = $data[$key] ?? 1; {/php} - {foreach [1 => '奖励固定金额 / 每单',2 => '按订单参与的返利金额比例'] as $k => $v} - {if isset($data[$key]) and $data[$key] eq $k} - - {else} - - {/if}{/foreach} - -
-
-
-
-
- - {php} $key = 'indirect_state_vip_'.$level['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 0; {/php} - {if isset($data[$key]) and $data[$key] eq 1} - - {else} - - {/if} - -
- {php} $key = 'indirect_type_vip_'.$level['number']; {/php} - {php} $data[$key] = $data[$key] ?? 1; {/php} - {foreach [1 => '奖励固定金额 / 每单',2 => '按订单参与的返利金额比例'] as $k => $v} - {if isset($data[$key]) and $data[$key] eq $k} - - {else} - - {/if}{/foreach} - -
-
-
-
-
-
-
- - {php} $key = 'upgrade_state_vip_'.$level['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 0; {/php} - {if isset($data[$key]) and $data[$key] eq 1} - - {else} - - {/if} - -
- {php} $key = 'upgrade_type_vip_'.$level['number'].'_'.$l['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 1; {/php} - {foreach [1 => '奖励固定金额 / 每单',2 => '按订单参与的返利金额比例'] as $k => $v} - {if isset($data[$key]) and $data[$key] eq $k} - - {else} - - {/if}{/foreach} - -
-
-
-
-
- - {php} $key = 'manage_state_vip_'.$level['number']; {/php} - - {php} $data[$key] = $data[$key] ?? 0; {/php} - {if isset($data[$key]) and $data[$key] eq 1} - - {else} - - {/if} - -
- {php} $key = 'manage_type_vip_'.$level['number']; {/php} - {php} $data[$key] = $data[$key] ?? 1; {/php} - {foreach [1 => '不累计未发管理奖金额', 2 => '累计未发放管理奖金'] as $k => $v} - {if isset($data[$key]) and $data[$key] eq $k} - - {else} - - {/if}{/foreach} - -
-
-
-
-
-
- {/foreach} -
-
-
- -
- - -
- -
-
- - - -{/block} \ No newline at end of file diff --git a/app/data/view/user/rebate/index.html b/app/data/view/user/rebate/index.html deleted file mode 100644 index e9545d01e..000000000 --- a/app/data/view/user/rebate/index.html +++ /dev/null @@ -1,92 +0,0 @@ -{extend name="main"} - -{block name="button"} - -用户返利配置 - -{/block} - -{block name="content"} -
- 返利统计:累计已产生返利 {$rebate.0+$rebate.2} 元 ( 含未到账 {$rebate.2|default='0.00'} 元 ),累计已提现 {$total.1|default=0.00} 元。 -
-
- {include file='user/rebate/index_search'} - - {notempty name='list'} - - - - - - - - - - {/notempty} - - {foreach $list as $key=>$vo} - - - - - - - - {/foreach} - -
- - 代理用户交易用户订单信息商品信息
- - - {notempty name='vo.agent.headimg'} -
- {/notempty} -
- 代理昵称:{$vo.agent.nickname|default='--'}
- 代理手机:{$vo.agent.phone|default='--'}
- 代理等级:[ VIP{$vo.agent.vip_code|default=0} ] {$vo.agent.vip_name|default=''} -
-
- {notempty name='vo.user.headimg'} -
- {/notempty} -
- 用户昵称:{$vo.user.nickname|default='--'}
- 用户手机:{$vo.user.phone|default='--'}
- 用户等级:[ VIP{$vo.user.vip_code|default=0} ] {$vo.user.vip_name|default=''} -
-
- {if $vo.type eq '管理奖励'} - {$vo.type|default=''} - {elseif $vo.type eq '首推奖励'} - {$vo.type|default=''} - {elseif $vo.type eq '复购奖励'} - {$vo.type|default=''} - {elseif $vo.type eq '直属团队'} - {$vo.type|default=''} - {elseif $vo.type eq '间接团队'} - {$vo.type|default=''} - {elseif $vo.type eq '差额奖励'} - {$vo.type|default=''} - {elseif $vo.type eq '升级奖励'} - {$vo.type|default=''} - {else} - {$vo.type|default=''} - {/if} -
-
返利时间:{$vo.create_at|format_datetime}
-
返利描述:{$vo.name|default='-'} {empty name='vo.status'}未到账{else}已到账{/empty}
-
订单 {$vo.order_no|default='--'} 交易 {$vo.order_amount+0} 元返利 {$vo.amount+0}
-
-
- {foreach $vo.list as $g} -
{$g.goods_name|default=''} x {$g.stock_sales|default=0}
- {/foreach} -
- - {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} - -
-{/block} \ No newline at end of file diff --git a/app/data/view/user/rebate/index_search.html b/app/data/view/user/rebate/index_search.html deleted file mode 100644 index 996509c34..000000000 --- a/app/data/view/user/rebate/index_search.html +++ /dev/null @@ -1,63 +0,0 @@ -
- 条件搜索 - -
\ No newline at end of file diff --git a/app/data/view/user/transfer/audit.html b/app/data/view/user/transfer/audit.html deleted file mode 100644 index c53dc27c4..000000000 --- a/app/data/view/user/transfer/audit.html +++ /dev/null @@ -1,132 +0,0 @@ -
- -
- -
- - - - - -
- - {in name='vo.type' value='wechat_qrcode,alipay_qrcode'} -
- 付款二维码 -
-
- {/in} - - - {in name='vo.type' value='alipay_account'} -
- - -
- {/in} - - - {in name='vo.type' value='transfer_banks,wechat_banks'} -
- - - - -
- {/in} - -
- 审核操作类型 - - - - - - - - - - {if $vo.status eq 1} - {php} $types = [0=>'拒绝提现', 1=>'等待审核', 2=>'审核通过']; {/php} - {/if} - - {if $vo.status eq 2} - - {php} $types = [2=>'审核通过', 3=>'自动打款']; {/php} - - {php} $types = [2=>'审核通过', 3=>'准备打款', 4=>'已经打款']; {/php} - - {/if} - - {if $vo.status eq 3} - - {php} $types = [3=>'正在打款']; {/php} - - {php} $types = [3=>'准备打款', 4=>'已经打款']; {/php} - - {/if} - - {if $vo.status eq 4} - {php} $types =[4=>'已经打款']; {/php} - {/if} - -
- {foreach($types as $k => $v)}{if $k eq $vo.status} - - {else} - - {/if}{/foreach} -
-
- -
- -
- -
- -
- {notempty name='vo.code'}{/notempty} - -
- - -
- -
\ No newline at end of file diff --git a/app/data/view/user/transfer/config.html b/app/data/view/user/transfer/config.html deleted file mode 100644 index 03bf7bd76..000000000 --- a/app/data/view/user/transfer/config.html +++ /dev/null @@ -1,130 +0,0 @@ - - -
-
- -
- 用户提现状态Transfer Status -
- {php} $data['status'] = $data['status'] ?? 0; {/php} - {foreach ['关闭返利提现', '开启返利提现'] as $k => $v} - {if $data.status eq $k} - - {else} - - {/if}{/foreach} -
-
- - - -
- 提现方式状态配置Transfer Types - - - - - - - - - - - - - - {foreach $types as $k => $t} - - - - - - - - - - {/foreach} - -
提现转账方式是否需要审核图 标单笔最小金额( 元 )单笔最大金额( 元 )每日限提现次数
- {php} $key = 'transfer['.$k.']["state"]'; {/php} - - {if isset($data['transfer'][$k]['state']) and $data['transfer'][$k]['state'] eq 1} - - {else} - - {/if} - - {php} $key = 'transfer['.$k.']["audit"]'; {/php} - - {if isset($data['transfer'][$k]['audit']) and $data['transfer'][$k]['audit'] eq 1} - - {else} - - {/if} - {php} $key = 'transfer['.$k.'][title]'; {/php} - - - {php} $key = 'transfer['.$k.'][image]'; {/php} - - - - - - - - - -
-
- -
- 用户提现描述内容Transfer Remark - -
- -
- -
- -
- - -
-
\ No newline at end of file diff --git a/app/data/view/user/transfer/index.html b/app/data/view/user/transfer/index.html deleted file mode 100644 index bbc25b9a9..000000000 --- a/app/data/view/user/transfer/index.html +++ /dev/null @@ -1,122 +0,0 @@ -{extend name="main"} - -{block name="button"} - -用户提现配置 - - - -微信转账配置 - - - -后台打款服务 - -{/block} - -{block name="content"} -
- - 提现统计:已产生提现累计 {$transfer.0|default=0.00} 元( 含待转账 {$transfer.3|default='0.00'} 元,含待审核 {$transfer.2|default='0.00'} 元 ),累计已提现 {$transfer.1|default=0.00} 元。 -
-
- {include file='user/transfer/index_search'} - - {notempty name='list'} - - - - - - - - - - - {/notempty} - - {foreach $list as $key => $vo} - - - - - - - - - {/foreach} - -
- - 提现用户提现订单提现通道处理记录
- - -
-
-
- - 用户姓名:{$vo.user.username|default='-'} - - 用户昵称:{$vo.user.nickname|default='-'} - - [ VIP{$vo.user.vip_code} ] {$vo.user.vip_name} -
-
用户手机:{$vo.user.phone|default='-'}
-
剩余可提现 {$vo.user.rebate_total-$vo.user.rebate_used} 元 已提现 {$vo.user.rebate_used+0} 元 待到账 {$vo.user.rebate_lock+0}
-
-
- {eq name='vo.status' value='0'}已失败{/eq} - {eq name='vo.status' value='1'}待审核{/eq} - {eq name='vo.status' value='2'}已审核{/eq} - {eq name='vo.status' value='3'}待打款{/eq} - {eq name='vo.status' value='4'}已打款{/eq} - {eq name='vo.status' value='5'}已完成{/eq} -
- 提现金额:{$vo.amount+0} 元 - {if $vo.charge_amount>0} ( 含手续费 {$vo.charge_amount+0} 元 ){/if} -
提现单号:{$vo.code|default='--'}
-
提现方式:{$vo.type_name|default='-'}
-
提现描述:{$vo.remark|default='-'}
-
-
- - {in name='vo.type' value='wechat_banks,transfer_banks'} -
开户银行:{$vo.bank_name|default='-'}
-
开户分行:{$vo.bank_bran|default=''}
-
账户姓名:{$vo.bank_user|default=''}
-
银行卡号:{$vo.bank_code|default=''}
- {/in} - - {in name='vo.type' value='wechat_qrcode,alipay_qrcode'} -
- {/in} - - {in name='vo.type' value='alipay_account'} -
支付宝姓名:{$vo.alipay_user|default='-'}
-
支付宝账号:{$vo.alipay_code|default=''}
- {/in} - - {in name='vo.type' value='wechat_wallet'} -
提现到微信钱包零钱
- {/in} -
- 申请时间:{$vo.create_at|format_datetime}
- 最后处理:{$vo.change_time|format_datetime}
- 交易时间:{$vo.trade_time|format_datetime}
- 交易描述:{$vo.change_desc|default='--'}
-
- - {if auth('auditStatus') and $vo.status eq 1} - 提现审核 - {/if} - - {if auth('auditPayment') and in_array($vo.status, [2,3,4])} - 提现打款 - {/if} - -
- - {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} - -
-{/block} diff --git a/app/data/view/user/transfer/index_search.html b/app/data/view/user/transfer/index_search.html deleted file mode 100644 index e11a4ee70..000000000 --- a/app/data/view/user/transfer/index_search.html +++ /dev/null @@ -1,60 +0,0 @@ -
- 条件搜索 - -
\ No newline at end of file diff --git a/app/data/view/user/transfer/payment.html b/app/data/view/user/transfer/payment.html deleted file mode 100644 index 600a51a64..000000000 --- a/app/data/view/user/transfer/payment.html +++ /dev/null @@ -1,50 +0,0 @@ -
-
- -
- 绑定公众号Bind WeChat Type -
- {php} $data['wechat_type'] = $data['wechat_type'] ?? 'normal'; {/php} - {foreach ['normal'=>'兼容模式', 'wxapp'=>'微信小程序', 'wechat'=>'微信服务号'] as $k=>$v} - {if $k eq $data.wechat_type} - - {else} - - {/if}{/foreach} -
- 请选择正确的转账通道,以决定用户 OPENID 字段,兼容模式会自动选择通道 -
- - - - - - - - - -
- -
- -
- - -
-
\ No newline at end of file diff --git a/app/index/controller/Index.php b/app/index/controller/Index.php deleted file mode 100644 index 36ae54071..000000000 --- a/app/index/controller/Index.php +++ /dev/null @@ -1,31 +0,0 @@ -redirect(sysuri('admin/login/index')); - } -} \ No newline at end of file diff --git a/app/wechat/command/Auto.php b/app/wechat/command/Auto.php deleted file mode 100644 index 178297488..000000000 --- a/app/wechat/command/Auto.php +++ /dev/null @@ -1,149 +0,0 @@ -setName('xadmin:fansmsg'); - $this->addArgument('openid', Argument::OPTIONAL, 'wechat user openid', ''); - $this->addArgument('autocode', Argument::OPTIONAL, 'wechat auto message', ''); - $this->setDescription('Wechat Users Push AutoMessage for ThinkAdmin'); - } - - /** - * @param Input $input - * @param Output $output - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function execute(Input $input, Output $output) - { - $code = $input->getArgument('autocode'); - $this->openid = $input->getArgument('openid'); - if (empty($code)) $this->setQueueError("Message Code cannot be empty"); - if (empty($this->openid)) $this->setQueueError("Wechat Openid cannot be empty"); - - // 查询微信消息对象 - $map = ['code' => $code, 'status' => 1]; - $data = WechatAuto::mk()->where($map)->find(); - if (empty($data)) $this->setQueueError("Message Data Query failed"); - - // 发送微信客服消息 - $this->buildMessage($data->toArray()); - } - - /** - * 关键字处理 - * @param array $data - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function buildMessage(array $data) - { - $type = strtolower($data['type']); - $result = [0, '待发送的消息不符合规则']; - if ($type === 'text' && !empty($data['content'])) { - $result = $this->sendMessage('text', ['content' => $data['content']]); - } - if ($type === 'voice' && !empty($data['voice_url'])) { - if ($mediaId = MediaService::upload($data['voice_url'], 'voice')) { - $result = $this->sendMessage('voice', ['media_id' => $mediaId]); - } - } - if ($type === 'image' && !empty($data['image_url'])) { - if ($mediaId = MediaService::upload($data['image_url'], 'image')) { - $result = $this->sendMessage('image', ['media_id' => $mediaId]); - } - } - if ($type === 'news') { - [$item, $news] = [MediaService::news($data['news_id']), []]; - if (isset($item['articles']) && is_array($item['articles'])) { - $host = sysconf('base.site_host') ?: true; - foreach ($item['articles'] as $vo) if (empty($news)) $news[] = [ - 'url' => url("@wechat/api.view/item/id/{$vo['id']}", [], false, $host)->build(), - 'title' => $vo['title'], 'picurl' => $vo['local_url'], 'description' => $vo['digest'], - ]; - $result = $this->sendMessage('news', ['articles' => $news]); - } - } - if ($type === 'music' && !empty($data['music_url']) && !empty($data['music_title']) && !empty($data['music_desc'])) { - $mediaId = $data['music_image'] ? MediaService::upload($data['music_image'], 'image') : ''; - $result = $this->sendMessage('music', [ - 'hqmusicurl' => $data['music_url'], 'musicurl' => $data['music_url'], - 'description' => $data['music_desc'], 'title' => $data['music_title'], 'thumb_media_id' => $mediaId, - ]); - } - if ($type === 'video' && !empty($data['video_url']) && !empty($data['video_desc']) && !empty($data['video_title'])) { - $video = ['title' => $data['video_title'], 'introduction' => $data['video_desc']]; - if ($mediaId = MediaService::upload($data['video_url'], 'video', $video)) { - $result = $this->sendMessage('video', ['media_id' => $mediaId, 'title' => $data['video_title'], 'description' => $data['video_desc']]); - } - } - if (empty($result[0])) { - $this->setQueueError($result[1]); - } else { - $this->setQueueSuccess($result[1]); - } - } - - /** - * 推送客服消息 - * @param string $type 消息类型 - * @param array $data 消息对象 - * @return array - */ - private function sendMessage(string $type, array $data): array - { - try { - WechatService::WeChatCustom()->send([ - $type => $data, 'touser' => $this->openid, 'msgtype' => $type, - ]); - return [1, '向微信用户推送消息成功']; - } catch (\Exception $exception) { - return [0, $exception->getMessage()]; - } - } -} \ No newline at end of file diff --git a/app/wechat/command/Fans.php b/app/wechat/command/Fans.php deleted file mode 100644 index 316d50520..000000000 --- a/app/wechat/command/Fans.php +++ /dev/null @@ -1,156 +0,0 @@ -setName('xadmin:fansall'); - $this->setDescription('Wechat Users Data Synchronize for ThinkAdmin'); - } - - /** - * 任务执行处理 - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function handle() - { - $this->setQueueSuccess($this->_list() . $this->_tags() . $this->_black()); - } - - /** - * 同步微信粉丝列表 - * @param string $next - * @param integer $done - * @return string - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _list(string $next = '', int $done = 0): string - { - $appid = WechatService::getAppid(); - $this->process->message('开始获取微信用户数据'); - while (is_string($next)) { - $result = WechatService::WeChatUser()->getUserList($next); - if (is_array($result) && !empty($result['data']['openid'])) { - foreach (array_chunk($result['data']['openid'], 100) as $openids) { - $info = WechatService::WeChatUser()->getBatchUserInfo($openids); - if (is_array($info) && !empty($info['user_info_list'])) { - foreach ($info['user_info_list'] as $user) if (isset($user['nickname'])) { - $this->queue->message($result['total'], ++$done, "-> 开始获取 {$user['openid']} {$user['nickname']}"); - FansService::set($user, $appid); - $this->queue->message($result['total'], $done, "-> 完成更新 {$user['openid']} {$user['nickname']}", 1); - } - } - } - $next = $result['total'] > $done ? $result['next_openid'] : null; - } else { - $next = null; - } - } - $this->process->message($done > 0 ? '微信用户数据获取完成' : '未获取到微信用户数据'); - $this->process->message(''); - return "共获取 {$done} 个用户数据"; - } - - /** - * 同步粉丝黑名单列表 - * @param string $next - * @param integer $done - * @return string - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - */ - public function _black(string $next = '', int $done = 0): string - { - $wechat = WechatService::WeChatUser(); - $this->setQueueProgress("开始更新黑名单列表"); - - // 清理原来的黑名单,重新批量更新黑名单列表 - WechatFans::mk()->where(['is_black' => 1])->update(['is_black' => 0]); - - $result = ['total' => 0]; - while (!is_null($next) && is_array($result = $wechat->getBlackList($next))) { - if (empty($result['data']['openid'])) break; - foreach (array_chunk($result['data']['openid'], 100) as $chunk) { - $done += count($chunk); - WechatFans::mk()->whereIn('openid', $chunk)->update(['is_black' => 1]); - } - $next = $result['total'] > $done ? $result['next_openid'] : null; - } - $this->setQueueProgress("完成更新 {$result['total']} 个黑名单", null, 1); - $this->output->newLine(); - if (empty($result['total'])) { - return ', 其中黑名单 0 人'; - } else { - return ", 其中黑名单 {$result['total']} 人"; - } - } - - /** - * 同步粉丝标签列表 - * @param integer $done - * @return string - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function _tags(int $done = 0): string - { - $appid = WechatService::getAppid(); - $this->output->comment('开始获取微信用户标签数据'); - if (is_array($list = WechatService::WeChatTags()->getTags()) && !empty($list['tags'])) { - $count = count($list['tags']); - foreach ($list['tags'] as &$tag) { - $tag['appid'] = $appid; - $this->queue->message($count, ++$done, "-> {$tag['name']}"); - } - WechatFansTags::mk()->where(['appid' => $appid])->delete(); - WechatFansTags::mk()->insertAll($list['tags']); - } - $this->output->comment($done > 0 ? '微信用户标签数据获取完成' : '未获取到微信用户标签数据'); - $this->output->newLine(); - return ", 获取到 {$done} 个标签"; - } -} diff --git a/app/wechat/controller/Auto.php b/app/wechat/controller/Auto.php deleted file mode 100644 index 1640e7814..000000000 --- a/app/wechat/controller/Auto.php +++ /dev/null @@ -1,128 +0,0 @@ - '文字', 'news' => '图文', - 'image' => '图片', 'music' => '音乐', - 'video' => '视频', 'voice' => '语音', - ]; - - /** - * 关注自动回复 - * @auth true - * @menu true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function index() - { - $this->type = $this->get['type'] ?? 'index'; - WechatAuto::mQuery()->layTable(function () { - $this->title = '关注自动回复'; - }, function (QueryHelper $query) { - $query->like('code,type#mtype')->dateBetween('create_at'); - $query->where(['status' => intval($this->type === 'index')]); - }); - } - - /** - * 列表数据处理 - * @param array $data - */ - protected function _index_page_filter(array &$data) - { - foreach ($data as &$vo) { - $vo['type'] = $this->types[$vo['type']] ?? $vo['type']; - } - } - - /** - * 添加自动回复 - * @auth true - */ - public function add() - { - $this->title = '添加自动回复'; - WechatAuto::mForm('form'); - } - - /** - * 编辑自动回复 - * @auth true - */ - public function edit() - { - $this->title = '编辑自动回复'; - WechatAuto::mForm('form'); - } - - /** - * 添加数据处理 - * @param array $data - */ - protected function _form_filter(array &$data) - { - if (empty($data['code'])) { - $data['code'] = CodeExtend::uniqidNumber(18, 'AM'); - } - if ($this->request->isGet()) { - $this->defaultImage = SystemService::uri('/static/theme/img/image.png', '__FULL__'); - } else { - $data['content'] = strip_tags($data['content'] ?? '', ''); - } - } - - /** - * 修改规则状态 - * @auth true - */ - public function state() - { - WechatAuto::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除自动回复 - * @auth true - */ - public function remove() - { - WechatAuto::mDelete(); - } -} \ No newline at end of file diff --git a/app/wechat/controller/Config.php b/app/wechat/controller/Config.php deleted file mode 100644 index 32321c9ef..000000000 --- a/app/wechat/controller/Config.php +++ /dev/null @@ -1,157 +0,0 @@ -_applyFormToken(); - $this->thrNotify = sysuri('wechat/api.push/index', [], false, true); - if ($this->request->isGet()) { - try { - $source = enbase64url(sysuri('admin/index/index', [], false, true) . '#' . $this->request->url()); - $this->authurl = "https://open.cuci.cc/service/api.push/auth?source={$source}"; - if (input('?appid') && input('?appkey')) { - sysconf('wechat.type', 'thr'); - sysconf('wechat.thr_appid', input('appid')); - sysconf('wechat.thr_appkey', input('appkey')); - WechatService::ThinkServiceConfig()->setApiNotifyUri($this->thrNotify); - } - $this->wechat = WechatService::ThinkServiceConfig()->getConfig(); - } catch (\Exception $exception) { - $this->wechat = []; - $this->message = $exception->getMessage(); - } - $this->geoip = $this->app->cache->get('mygeoip', ''); - if (empty($this->geoip)) { - $this->geoip = gethostbyname($this->request->host()); - $this->app->cache->set('mygeoip', $this->geoip, 360); - } - $this->title = '微信授权配置'; - $this->fetch(); - } else { - foreach ($this->request->post() as $k => $v) sysconf($k, $v); - if ($this->request->post('wechat.type') === 'thr') { - try { - WechatService::ThinkServiceConfig()->setApiNotifyUri($this->thrNotify); - } catch (\Exception $exception) { - $this->error($exception->getMessage()); - } - } - sysoplog('微信授权配置', '修改微信授权配置成功'); - $location = url('wechat/config/options')->build() . '?uniqid=' . uniqid(); - $this->success('微信授权修改成功!', sysuri('admin/index/index') . "#{$location}"); - } - } - - /** - * 微信授权测试 - * @auth true - */ - public function options_test() - { - $this->fetch(); - } - - /** - * 微信支付配置 - * @auth true - * @menu true - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function payment() - { - if ($this->request->isGet()) { - $this->title = '微信支付配置'; - $local = LocalStorage::instance(); - $this->mch_ssl_cer = sysconf('wechat.mch_ssl_cer'); - $this->mch_ssl_key = sysconf('wechat.mch_ssl_key'); - $this->mch_ssl_p12 = sysconf('wechat.mch_ssl_p12'); - if (!$local->has($this->mch_ssl_cer, true)) $this->mch_ssl_cer = ''; - if (!$local->has($this->mch_ssl_key, true)) $this->mch_ssl_key = ''; - if (!$local->has($this->mch_ssl_p12, true)) $this->mch_ssl_p12 = ''; - $this->fetch(); - } else { - $this->error('抱歉,数据提交地址错误!'); - } - } - - /** - * 微信支付测试 - * @auth true - */ - public function payment_test() - { - $this->fetch(); - } - - /** - * 微信支付修改 - * @auth true - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function payment_save() - { - if ($this->request->isPost()) { - if ($this->request->post('wechat.mch_ssl_type') === 'p12') { - if (!LocalStorage::instance()->has(input('wechat.mch_ssl_p12', '-'), true)) { - $this->error('商户证书 P12 证书不能为空!'); - } - $content = LocalStorage::instance()->get(input('wechat.mch_ssl_p12', '-'), true); - if (!openssl_pkcs12_read($content, $certs, input('wechat.mch_id'))) { - $this->error('商户账号与 P12 证书不匹配!'); - } - } elseif ($this->request->post('wechat.mch_ssl_type') === 'pem') { - if (!LocalStorage::instance()->has(input('wechat.mch_ssl_key', '-'), true)) { - $this->error('商户证书 KEY 不能为空!'); - } - if (!LocalStorage::instance()->has(input('wechat.mch_ssl_cer', '-'), true)) { - $this->error('商户证书 CERT 不能为空!'); - } - } - foreach ($this->request->post() as $k => $v) sysconf($k, $v); - sysoplog('微信授权配置', '修改微信支付配置成功'); - $this->success('微信支付配置成功!'); - } else { - $this->error('抱歉,访问方式错误!'); - } - } -} diff --git a/app/wechat/controller/Fans.php b/app/wechat/controller/Fans.php deleted file mode 100644 index 974aac2e8..000000000 --- a/app/wechat/controller/Fans.php +++ /dev/null @@ -1,127 +0,0 @@ -layTable(function () { - $this->title = '微信用户管理'; - }, function (QueryHelper $query) { - $query->where(['appid' => WechatService::getAppid()]); - $query->like('nickname')->equal('subscribe,is_black')->dateBetween('subscribe_at'); - }); - } - - /** - * 列表数据处理 - * @param array $data - */ - protected function _index_page_filter(array &$data) - { - foreach ($data as &$vo) $vo['subscribe_at'] = format_datetime($vo['subscribe_at']); - } - - /** - * 同步用户数据 - * @auth true - */ - public function sync() - { - sysoplog('微信授权配置', '创建粉丝用户同步任务'); - $this->_queue('同步微信用户数据', "xadmin:fansall"); - } - - /** - * 黑名单列表操作 - * @auth true - */ - public function black() - { - try { - $data = $this->_vali([ - 'black.require' => '操作类型不能为空!', - 'openid.require' => '操作用户不能为空!', - ]); - foreach (array_chunk(str2arr($data['openid']), 20) as $openids) { - if ($data['black']) { - WechatService::WeChatUser()->batchBlackList($openids); - WechatFans::mk()->whereIn('openid', $openids)->update(['is_black' => 1]); - } else { - WechatService::WeChatUser()->batchUnblackList($openids); - WechatFans::mk()->whereIn('openid', $openids)->update(['is_black' => 0]); - } - } - if (empty($data['black'])) { - $this->success('移出黑名单成功!'); - } else { - $this->success('拉入黑名单成功!'); - } - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error("黑名单操作失败,请稍候再试!
{$exception->getMessage()}"); - } - } - - /** - * 删除用户信息 - * @auth true - */ - public function remove() - { - WechatFans::mDelete(); - } - - /** - * 清空用户数据 - * @auth true - */ - public function truncate() - { - try { - WechatFans::mQuery()->empty(); - WechatFansTags::mQuery()->empty(); - $this->success('清空用户数据成功!'); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error("清空用户数据失败,{$exception->getMessage()}"); - } - } -} diff --git a/app/wechat/controller/Keys.php b/app/wechat/controller/Keys.php deleted file mode 100644 index 9233e5d1a..000000000 --- a/app/wechat/controller/Keys.php +++ /dev/null @@ -1,161 +0,0 @@ - '文字', 'news' => '图文', 'image' => '图片', 'music' => '音乐', - 'video' => '视频', 'voice' => '语音', 'customservice' => '转客服', - ]; - - /** - * 回复规则管理 - * @auth true - * @menu true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function index() - { - // 关键字二维码生成 - if ($this->request->get('action') === 'qrc') try { - $wechat = WechatService::WeChatQrcode(); - $result = $wechat->create($this->request->get('keys', '')); - $this->success('生成二维码成功!', "javascript:$.previewImage('{$wechat->url($result['ticket'])}')"); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - $this->error("生成二维码失败,请稍候再试!
{$exception->getMessage()}"); - } - // 数据列表分页处理 - $this->type = $this->get['type'] ?? 'index'; - WechatKeys::mQuery()->layTable(function () { - $this->title = '回复规则管理'; - }, function (QueryHelper $query) { - $query->whereNotIn('keys', ['subscribe', 'default']); - $query->like('keys,type#mtype')->dateBetween('create_at'); - $query->where(['status' => intval($this->type === 'index')]); - }); - } - - /** - * 列表数据处理 - * @param array $data - */ - protected function _index_page_filter(array &$data) - { - foreach ($data as &$vo) { - $vo['type'] = $this->types[$vo['type']] ?? $vo['type']; - $vo['qrc'] = sysuri('wechat/keys/index') . "?action=qrc&keys={$vo['keys']}"; - } - } - - /** - * 添加回复规则 - * @auth true - */ - public function add() - { - $this->title = '添加回复规则'; - WechatKeys::mForm('form'); - } - - /** - * 编辑回复规则 - * @auth true - */ - public function edit() - { - $this->title = '编辑回复规则'; - WechatKeys::mForm('form'); - } - - /** - * 修改规则状态 - * @auth true - */ - public function state() - { - WechatKeys::mSave($this->_vali([ - 'status.in:0,1' => '状态值范围异常!', - 'status.require' => '状态值不能为空!', - ])); - } - - /** - * 删除回复规则 - * @auth true - */ - public function remove() - { - WechatKeys::mDelete(); - } - - /** - * 配置订阅回复 - * @auth true - */ - public function subscribe() - { - $this->title = '编辑订阅回复规则'; - WechatKeys::mForm('form', 'keys', [], ['keys' => 'subscribe']); - } - - /** - * 配置默认回复 - * @auth true - */ - public function defaults() - { - $this->title = '编辑默认回复规则'; - WechatKeys::mForm('form', 'keys', [], ['keys' => 'default']); - } - - /** - * 添加数据处理 - * @param array $data - * @throws \think\db\exception\DbException - */ - protected function _form_filter(array &$data) - { - if ($this->request->isPost()) { - $map = [['keys', '=', $data['keys']], ['id', '<>', $data['id'] ?? 0]]; - if (WechatKeys::mk()->where($map)->count() > 0) $this->error('关键字已经存在!'); - $data['content'] = strip_tags($data['content'] ?? '', '
'); - } elseif ($this->request->isGet()) { - $this->defaultImage = SystemService::uri('/static/theme/img/image.png', '__FULL__'); - } - } -} diff --git a/app/wechat/controller/Menu.php b/app/wechat/controller/Menu.php deleted file mode 100644 index f93f81e56..000000000 --- a/app/wechat/controller/Menu.php +++ /dev/null @@ -1,168 +0,0 @@ - '匹配规则', - 'view' => '跳转网页', - 'miniprogram' => '打开小程序', - 'customservice' => '转多客服', - 'scancode_push' => '扫码推事件', - 'scancode_waitmsg' => '扫码推事件且弹出“消息接收中”提示框', - 'pic_sysphoto' => '弹出系统拍照发图', - 'pic_photo_or_album' => '弹出拍照或者相册发图', - 'pic_weixin' => '弹出微信相册发图器', - 'location_select' => '弹出地理位置选择器', - ]; - - /** - * 微信菜单管理 - * @auth true - * @menu true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function index() - { - if ($this->request->get('output') === 'json') { - $map = [['keys', 'notin', ['subscribe', 'default']], ['status', '=', 1]]; - $result = $this->app->db->name('WechatKeys')->where($map)->order('sort desc,id desc')->select(); - $this->success('获取数据成功!', ['menudata' => sysdata($this->ckey), 'keysdata' => $result->toArray()]); - } else { - $this->title = '微信菜单定制'; - $this->fetch(); - } - } - - /** - * 取消微信菜单 - * @auth true - */ - public function cancel() - { - try { - WechatService::WeChatMenu()->delete(); - $this->success('菜单取消成功,重新订阅可立即生效!'); - } catch (HttpResponseException $exception) { - sysoplog('微信管理', '取消微信菜单成功'); - throw $exception; - } catch (\Exception $exception) { - $this->error("菜单取消失败,请稍候再试!
{$exception->getMessage()}"); - } - } - - /** - * 编辑微信菜单 - * @auth true - */ - public function push() - { - if ($this->request->isPost()) { - $data = $this->request->post('data'); - if (empty($data)) try { - WechatService::WeChatMenu()->delete(); - sysoplog('微信菜单管理', '删除微信菜单成功'); - $this->success('删除微信菜单成功!', ''); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - sysoplog('微信菜单管理', "删除微信菜单失败:{$exception->getMessage()}"); - $this->error("删除微信菜单失败,请稍候再试!
{$exception->getMessage()}"); - } else try { - sysdata($this->ckey, $this->_buildMenuData(json_decode($data, true))); - WechatService::WeChatMenu()->create(['button' => sysdata($this->ckey)]); - sysoplog('微信菜单管理', '发布微信菜单成功'); - $this->success('保存发布菜单成功!', ''); - } catch (HttpResponseException $exception) { - throw $exception; - } catch (\Exception $exception) { - sysoplog('微信菜单管理', "发布微信菜单失败:{$exception->getMessage()}"); - $this->error("微信菜单发布失败,请稍候再试!
{$exception->getMessage()}"); - } - } - } - - /** - * 菜单数据处理 - * @param array $list - * @return array - */ - private function _buildMenuData(array $list): array - { - foreach ($list as &$item) { - if (empty($item['sub_button'])) { - $item = $this->_buildMenuDataItem($item); - } else { - $button = ['name' => $item['name'], 'sub_button' => []]; - foreach ($item['sub_button'] as &$sub) { - $button['sub_button'][] = $this->_buildMenuDataItem($sub); - } - $item = $button; - } - } - return $list; - } - - /** - * 单个微信菜单数据处理 - * @param array $item - * @return array - */ - private function _buildMenuDataItem(array $item): array - { - switch (strtolower($item['type'])) { - case 'pic_weixin': - case 'pic_sysphoto': - case 'scancode_push': - case 'location_select': - case 'scancode_waitmsg': - case 'pic_photo_or_album': - return ['name' => $item['name'], 'type' => $item['type'], 'key' => $item['key'] ?? $item['type']]; - case 'click': - if (empty($item['key'])) $this->error('匹配规则存在空的选项'); - return ['name' => $item['name'], 'type' => $item['type'], 'key' => $item['key']]; - case 'view': - return ['name' => $item['name'], 'type' => $item['type'], 'url' => $item['url']]; - case 'miniprogram': - return ['name' => $item['name'], 'type' => $item['type'], 'url' => $item['url'], 'appid' => $item['appid'], 'pagepath' => $item['pagepath']]; - default: - return []; - } - } -} \ No newline at end of file diff --git a/app/wechat/controller/News.php b/app/wechat/controller/News.php deleted file mode 100644 index 5f5879626..000000000 --- a/app/wechat/controller/News.php +++ /dev/null @@ -1,152 +0,0 @@ -title = '微信图文列表'; - WechatNews::mQuery(null, function (QueryHelper $query) { - $query->where(['is_deleted' => 0])->order('id desc')->page(); - }); - } - - /** - * 图文列表数据处理 - * @param array $data - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function _page_filter(array &$data) - { - foreach ($data as &$vo) { - $vo = MediaService::news($vo['id']); - } - } - - /** - * 图文选择器 - * @auth true - */ - public function select() - { - $this->index(); - } - - /** - * 添加微信图文 - * @auth true - */ - public function add() - { - if ($this->request->isGet()) { - $this->title = '新建图文'; - $this->fetch('form'); - } else { - $update = [ - 'create_by' => AdminService::getUserId(), - 'article_id' => $this->_buildArticle($this->request->post('data', [])), - ]; - if (WechatNews::mk()->insert($update) !== false) { - $this->success('图文添加成功!', 'javascript:history.back()'); - } else { - $this->error('图文添加失败,请稍候再试!'); - } - } - } - - /** - * 编辑微信图文 - * @auth true - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function edit() - { - $this->id = $this->request->get('id'); - if (empty($this->id)) $this->error('参数错误,请稍候再试!'); - if ($this->request->isGet()) { - if ($this->request->get('output') === 'json') { - $this->success('获取数据成功!', MediaService::news($this->id)); - } else { - $this->title = '编辑图文'; - $this->fetch('form'); - } - } else { - $ids = $this->_buildArticle($this->request->post('data', [])); - [$map, $data] = [['id' => $this->id], ['article_id' => $ids]]; - if (WechatNews::mk()->where($map)->update($data) !== false) { - $this->success('更新成功!', 'javascript:history.back()'); - } else { - $this->error('更新失败,请稍候再试!'); - } - } - } - - /** - * 删除微信图文 - * auth true - */ - public function remove() - { - WechatNews::mDelete(); - } - - /** - * 图文更新操作 - * @param array $data - * @return string - */ - private function _buildArticle(array $data): string - { - $ids = []; - foreach ($data as $vo) { - if (empty($vo['digest'])) { - $vo['digest'] = mb_substr(strip_tags(str_replace(["\s", ' '], '', $vo['content'])), 0, 120); - } - $vo['create_at'] = date('Y-m-d H:i:s'); - if (empty($vo['id'])) { - $result = $id = WechatNewsArticle::mk()->insertGetId($vo); - } else { - $id = intval($vo['id']); - $result = WechatNewsArticle::mk()->where('id', $id)->update($vo); - } - if ($result !== false) $ids[] = $id; - } - return join(',', $ids); - } -} \ No newline at end of file diff --git a/app/wechat/controller/api/Js.php b/app/wechat/controller/api/Js.php deleted file mode 100644 index 9dc796693..000000000 --- a/app/wechat/controller/api/Js.php +++ /dev/null @@ -1,103 +0,0 @@ -request->get('mode', 1); - $source = $this->request->server('http_referer') ?: $this->request->url(true); - $userinfo = WechatService::getWebOauthInfo($source, $mode, false); - if (empty($userinfo['openid'])) { - $content = 'alert("Wechat webOauth failed.")'; - } else { - $this->openid = $userinfo['openid']; - $this->params = json_encode(WechatService::getWebJssdkSign($source)); - $this->fansinfo = json_encode($userinfo['fansinfo'] ?? [], JSON_UNESCAPED_UNICODE); - // 生成数据授权令牌 - $this->token = uniqid('oauth') . rand(10000, 99999); - $this->app->cache->set($this->openid, $this->token, 3600); - // 生成前端JS变量代码 - $content = $this->_buildContent(); - } - return Response::create($content)->contentType('application/x-javascript'); - } - - /** - * 给指定地址创建签名参数 - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function sdk() - { - $data = $this->_vali(['url.require' => '签名地址不能为空!']); - $this->success('获取签名参数', WechatService::getWebJssdkSign($data['url'])); - } - - /** - * 生成授权内容 - * @return string - */ - private function _buildContent(): string - { - return <<fansinfo}; - wx.config({$this->params}); - wx.ready(function(){ - wx.hideOptionMenu(); - wx.hideAllNonBaseMenuItem(); - }); -} -EOF; - } -} diff --git a/app/wechat/controller/api/Login.php b/app/wechat/controller/api/Login.php deleted file mode 100644 index d610c6d4f..000000000 --- a/app/wechat/controller/api/Login.php +++ /dev/null @@ -1,108 +0,0 @@ -prefix . md5(uniqid('t', true) . rand(10000, 99999)); - $text = url('wechat/api.login/oauth', [], false, true) . "?code={$code}&mode={$mode}"; - // 生成二维码并返回结果 - $qrcode = new \Endroid\QrCode\QrCode(); - $qrcode->setText($text)->setSize(300)->setPadding(20); - $content = base64_encode($qrcode->setImageType('png')->get()); - $this->success('获取二维码成功', ['code' => $code, 'image' => "data:image/png;base64,{$content}"]); - } - - /** - * 微信授权结果处理 - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function oauth() - { - $this->code = input('code', ''); - $this->mode = input('mode', '0'); - if (stripos($this->code, $this->prefix) === 0) { - $this->url = $this->request->url(true); - $this->fans = WechatService::getWebOauthInfo($this->url, $this->mode); - if (is_array($this->fans) && isset($this->fans['openid'])) { - $this->fans['token'] = md5(uniqid('t', true) . rand(10000, 99999)); - $this->app->cache->set("wxlogin{$this->code}", $this->fans, $this->expire); - $this->app->cache->set($this->fans['openid'], $this->fans['token'], $this->expire); - $this->message = '授权成功'; - $this->fetch('success'); - } else { - $this->message = '授权失败'; - $this->fetch('failed'); - } - } else { - $this->message = '授权失败'; - $this->fetch('failed'); - } - } - - /** - * 获取授权信息 - * 用定时器请求这个接口 - * @throws \think\exception\HttpResponseException - */ - public function query() - { - $this->code = input('code', ''); - if (stripos($this->code, $this->prefix) === 0) { - $this->ckey = "wxlogin{$this->code}"; - $this->fans = $this->app->cache->get($this->ckey, new \stdClass()); - $this->success('获取授权信息', $this->fans); - } else { - $this->error("授权CODE不能为空!"); - } - } -} \ No newline at end of file diff --git a/app/wechat/controller/api/Push.php b/app/wechat/controller/api/Push.php deleted file mode 100644 index 90edbdf00..000000000 --- a/app/wechat/controller/api/Push.php +++ /dev/null @@ -1,336 +0,0 @@ -request->ip(); - } - - /** - * 消息推送处理接口 - * @return string - */ - public function index(): string - { - try { - if (WechatService::getType() === 'thr') { - $this->forceJson = true; // 直接返回JSON数据到SERVICE - $this->forceCustom = false; // 直接使用客服消息模式推送 - $this->appid = $this->request->post('appid', '', null); - $this->openid = $this->request->post('openid', '', null); - $this->encrypt = boolval($this->request->post('encrypt', 0)); - $this->receive = $this->_arrayChangeKeyCase(json_decode(input('params', '[]'), true)); - if (empty($this->appid) || empty($this->openid) || empty($this->receive)) { - throw new \think\admin\Exception('微信API实例缺失必要参数[appid,openid,receive]'); - } - } else { - $this->forceJson = false; // 直接返回JSON对象数据 - $this->forceCustom = false; // 直接使用客服消息推送 - $this->appid = WechatService::getAppid(); - $this->wechat = WechatService::WeChatReceive(); - $this->openid = $this->wechat->getOpenid(); - $this->encrypt = $this->wechat->isEncrypt(); - $this->receive = $this->_arrayChangeKeyCase($this->wechat->getReceive()); - } - $this->fromOpenid = $this->receive['tousername']; - // 消息类型:text, event, image, voice, shortvideo, location, link - if (method_exists($this, ($method = $this->receive['msgtype']))) { - if (is_string($result = $this->$method())) return $result; - } else { - $this->app->log->notice("The {$method} event pushed by wechat was not handled. from {$this->openid}"); - } - } catch (\Exception $exception) { - $this->app->log->error("{$exception->getFile()}:{$exception->getLine()} [{$exception->getCode()}] {$exception->getMessage()}"); - } - return 'success'; - } - - /** - * 文件消息处理 - * @return boolean|string - * @throws \WeChat\Exceptions\InvalidDecryptException - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function text() - { - return $this->_keys("WechatKeys#keys#{$this->receive['content']}", false, $this->forceCustom); - } - - /** - * 事件消息处理 - * @return boolean|string - * @throws \WeChat\Exceptions\InvalidDecryptException - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - protected function event() - { - switch (strtolower($this->receive['event'])) { - case 'unsubscribe': - $this->app->event->trigger('WechatFansUnSubscribe', $this->openid); - return $this->_setUserInfo(false); - case 'subscribe': - [$this->app->event->trigger('WechatFansSubscribe', $this->openid), $this->_setUserInfo(true)]; - if (isset($this->receive['eventkey']) && is_string($this->receive['eventkey'])) { - if (($key = preg_replace('/^qrscene_/i', '', $this->receive['eventkey']))) { - return $this->_keys("WechatKeys#keys#{$key}", false, true); - } - } - return $this->_keys('WechatKeys#keys#subscribe', true, $this->forceCustom); - case 'scan': - case 'click': - if (empty($this->receive['eventkey'])) return false; - return $this->_keys("WechatKeys#keys#{$this->receive['eventkey']}", false, $this->forceCustom); - case 'scancode_push': - case 'scancode_waitmsg': - if (empty($this->receive['scancodeinfo']['scanresult'])) return false; - return $this->_keys("WechatKeys#keys#{$this->receive['scancodeinfo']['scanresult']}", false, $this->forceCustom); - case 'view': - case 'location': - default: - return false; - } - } - - /** - * 关键字处理 - * @param string $rule 关键字规则 - * @param boolean $last 重复回复消息处理 - * @param boolean $custom 是否使用客服消息发送 - * @return boolean|string - * @throws \WeChat\Exceptions\InvalidDecryptException - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _keys(string $rule, bool $last = false, bool $custom = false) - { - if (is_numeric(stripos($rule, '#reply#text:'))) { - [, $content] = explode('#reply#text:', $rule); - return $this->_buildMessage('text', ['Content' => $content]); - } - [$table, $field, $value] = explode('#', $rule . '##'); - $data = $this->app->db->name($table)->where([$field => $value])->find(); - if (empty($data['type']) || (array_key_exists('status', $data) && empty($data['status']))) { - return $last ? false : $this->_keys('WechatKeys#keys#default', true, $custom); - } - switch (strtolower($data['type'])) { - case 'keys': - $content = empty($data['content']) ? $data['name'] : $data['content']; - return $this->_keys("WechatKeys#keys#{$content}", $last, $custom); - case 'text': - return $this->_sendMessage('text', ['content' => $data['content']], $custom); - case 'customservice': - return $this->_sendMessage('customservice', ['content' => $data['content']], false); - case 'voice': - if (empty($data['voice_url']) || !($mediaId = MediaService::upload($data['voice_url'], 'voice'))) return false; - return $this->_sendMessage('voice', ['media_id' => $mediaId], $custom); - case 'image': - if (empty($data['image_url']) || !($mediaId = MediaService::upload($data['image_url'], 'image'))) return false; - return $this->_sendMessage('image', ['media_id' => $mediaId], $custom); - case 'news': - [$news, $articles] = [MediaService::news($data['news_id']), []]; - if (empty($news['articles'])) return false; - foreach ($news['articles'] as $vo) $articles[] = [ - 'url' => url("@wechat/api.view/item/id/{$vo['id']}", [], false, true)->build(), - 'title' => $vo['title'], 'picurl' => $vo['local_url'], 'description' => $vo['digest'], - ]; - return $this->_sendMessage('news', ['articles' => $articles], $custom); - case 'music': - if (empty($data['music_url']) || empty($data['music_title']) || empty($data['music_desc'])) return false; - $mediaId = $data['music_image'] ? MediaService::upload($data['music_image'], 'image') : ''; - return $this->_sendMessage('music', [ - 'hqmusicurl' => $data['music_url'], 'musicurl' => $data['music_url'], - 'description' => $data['music_desc'], 'title' => $data['music_title'], 'thumb_media_id' => $mediaId, - ], $custom); - case 'video': - if (empty($data['video_url']) || empty($data['video_desc']) || empty($data['video_title'])) return false; - $video = ['title' => $data['video_title'], 'introduction' => $data['video_desc']]; - if (!($mediaId = MediaService::upload($data['video_url'], 'video', $video))) return false; - return $this->_sendMessage('video', ['media_id' => $mediaId, 'title' => $data['video_title'], 'description' => $data['video_desc']], $custom); - default: - return false; - } - } - - /** - * 发送消息到微信 - * @param string $type 消息类型(text|image|voice|video|music|news|mpnews|wxcard) - * @param array $data 消息内容数据对象 - * @param boolean $custom 是否使用客服消息发送 - * @return string|void - * @throws \WeChat\Exceptions\InvalidDecryptException - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - */ - private function _sendMessage(string $type, array $data, bool $custom = false) - { - if ($custom) { - WechatService::WeChatCustom()->send(['touser' => $this->openid, 'msgtype' => $type, $type => $data]); - } else switch (strtolower($type)) { - case 'text': // 发送文本消息 - return $this->_buildMessage($type, ['Content' => $data['content']]); - case 'news': // 发送图文消息 - foreach ($data['articles'] as &$v) { - $v = ['PicUrl' => $v['picurl'], 'Title' => $v['title'], 'Description' => $v['description'], 'Url' => $v['url']]; - } - return $this->_buildMessage($type, ['Articles' => $data['articles'], 'ArticleCount' => count($data['articles'])]); - case 'image': // 发送图片消息 - return $this->_buildMessage($type, ['Image' => ['MediaId' => $data['media_id']]]); - case 'voice': // 发送语言消息 - return $this->_buildMessage($type, ['Voice' => ['MediaId' => $data['media_id']]]); - case 'video': // 发送视频消息 - return $this->_buildMessage($type, ['Video' => ['Title' => $data['title'], 'Description' => $data['description'], 'MediaId' => $data['media_id']]]); - case 'music': // 发送音乐消息 - return $this->_buildMessage($type, ['Music' => ['Title' => $data['title'], 'Description' => $data['description'], 'MusicUrl' => $data['musicurl'], 'HQMusicUrl' => $data['musicurl'], 'ThumbMediaId' => $data['thumb_media_id']]]); - case 'customservice': // 转交客服消息 - if ($data['content']) $this->_sendMessage('text', $data, true); - return $this->_buildMessage('transfer_customer_service', []); - default: - return 'success'; - } - } - - /** - * 消息数据生成 - * @param mixed $type 消息类型 - * @param array $data 消息内容 - * @return string - * @throws \WeChat\Exceptions\InvalidDecryptException - */ - private function _buildMessage(string $type, array $data = []): string - { - $data = array_merge($data, ['ToUserName' => $this->openid, 'FromUserName' => $this->fromOpenid, 'CreateTime' => time(), 'MsgType' => $type]); - return $this->forceJson ? json_encode($data, JSON_UNESCAPED_UNICODE) : WechatService::WeChatReceive()->reply($data, true, $this->encrypt); - } - - /** - * 同步粉丝状态 - * @param boolean $state 订阅状态 - * @return boolean - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - private function _setUserInfo(bool $state): bool - { - if ($state) { - try { - $user = WechatService::WeChatUser()->getUserInfo($this->openid); - return FansService::set(array_merge($user, ['subscribe' => 1, 'appid' => $this->appid])); - } catch (\Exception $exception) { - $this->app->log->error(__METHOD__ . " {$this->openid} get userinfo faild. {$exception->getMessage()}"); - return false; - } - } else { - return FansService::set(['subscribe' => 0, 'openid' => $this->openid, 'appid' => $this->appid]); - } - } - - /** - * 数组健值全部转小写 - * @param array $data - * @return array - */ - private function _arrayChangeKeyCase(array $data): array - { - $data = array_change_key_case($data, CASE_LOWER); - foreach ($data as $key => $vo) if (is_array($vo)) { - $data[$key] = $this->_arrayChangeKeyCase($vo); - } - return $data; - } - -} diff --git a/app/wechat/controller/api/Test.php b/app/wechat/controller/api/Test.php deleted file mode 100644 index fbec67943..000000000 --- a/app/wechat/controller/api/Test.php +++ /dev/null @@ -1,255 +0,0 @@ -url = sysuri('wechat/api.test/jsapi', [], false, true); - return $this->_buildQrcResponse($this->url); - } - - /** - * 显示网页授权二维码 - * @return Response - * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException - * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException - * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException - */ - public function oauthQrc(): Response - { - $this->url = sysuri('wechat/api.test/oauth', [], false, true); - return $this->_buildQrcResponse($this->url); - } - - /** - * 显示网页授权二维码 - * @return Response - * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException - * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException - * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException - */ - public function jssdkQrc(): Response - { - $this->url = sysuri('wechat/api.test/jssdk', [], false, true); - return $this->_buildQrcResponse($this->url); - } - - /** - * 微信扫码支付模式一二维码显示 - * @return Response - * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException - * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException - * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException - */ - public function scanOneQrc(): Response - { - $pay = WechatService::WePayOrder(); - return $this->_buildQrcResponse($pay->qrcParams('8888888')); - } - - /** - * 扫码支付模式二测试二维码 - * @return Response - * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException - * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException - * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - */ - public function scanTwoQrc(): Response - { - $result = WechatService::WePayOrder()->create([ - 'body' => '测试商品', - 'total_fee' => '1', - 'trade_type' => 'NATIVE', - 'notify_url' => sysuri('wechat/api.test/notify', [], false, true), - 'out_trade_no' => CodeExtend::uniqidNumber(18), - 'spbill_create_ip' => $this->request->ip(), - ]); - return $this->_buildQrcResponse($result['code_url']); - } - - /** - * 网页授权测试 - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function oauth() - { - $this->url = $this->request->url(true); - $this->fans = WechatService::getWebOauthInfo($this->url, 1); - $this->fetch(); - } - - /** - * JSSDK测试 - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function jssdk() - { - $this->options = WechatService::getWebJssdkSign(); - $this->fetch(); - } - - /** - * 微信扫码支付模式一通知处理 - * -- 注意,需要在微信商户配置支付通知地址 - * @return string - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - */ - public function scanOneNotify(): string - { - $pay = WechatService::WePayOrder(); - $notify = $pay->getNotify(); - p('======= 来自扫码支付1的数据 ======'); - p($notify); - // 微信统一下单处理 - $options = [ - 'body' => "测试商品,商品ID:{$notify['product_id']}", - 'total_fee' => '1', - 'trade_type' => 'NATIVE', - 'notify_url' => sysuri('wechat/api.test/notify', [], false, true), - 'out_trade_no' => CodeExtend::uniqidDate(18), - 'spbill_create_ip' => $this->request->ip(), - ]; - p('======= 来自扫码支付1统一下单结果 ======'); - p($order = $pay->create($options)); - // 回复XML文本 - $result = [ - 'return_code' => 'SUCCESS', - 'return_msg' => '处理成功', - 'appid' => $notify['appid'], - 'mch_id' => $notify['mch_id'], - 'nonce_str' => Tools::createNoncestr(), - 'prepay_id' => $order['prepay_id'], - 'result_code' => 'SUCCESS', - ]; - $result['sign'] = $pay->getPaySign($result); - p('======= 来自扫码支付1返回的结果 ======'); - p($result); - return Tools::arr2xml($result); - } - - /** - * 微信JSAPI支付测试 - * @return string - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - * @throws \WeChat\Exceptions\InvalidResponseException - */ - public function jsapi(): string - { - $this->url = $this->request->url(true); - $this->pay = WechatService::WePayOrder(); - $user = WechatService::getWebOauthInfo($this->url); - if (empty($user['openid'])) return '

网页授权获取OPENID失败!

'; - // 生成预支付码 - $result = $this->pay->create([ - 'body' => '测试商品', - 'openid' => $user['openid'], - 'total_fee' => '1', - 'trade_type' => 'JSAPI', - 'notify_url' => sysuri('wechat/api.test/notify', [], false, true), - 'out_trade_no' => CodeExtend::uniqidDate(18), - 'spbill_create_ip' => $this->request->ip(), - ]); - // 数据参数格式化 - $resultJson = var_export($result, true); - $optionJson = json_encode($this->pay->jsapiParams($result['prepay_id']), JSON_UNESCAPED_UNICODE); - $configJson = json_encode(WechatService::getWebJssdkSign(), JSON_UNESCAPED_UNICODE); - return << - 当前用户OPENID: {$user['openid']} - \n\n--- 创建微信预支付码结果 ---\n {$resultJson} - \n\n--- JSAPI 及 H5 支付参数 ---\n {$optionJson} - - - - -HTML; - } - - /** - * 支付通知接收处理 - * @return string - * @throws \WeChat\Exceptions\InvalidResponseException - */ - public function notify(): string - { - $wechat = WechatService::WePayOrder(); - p($wechat->getNotify()); - return 'SUCCESS'; - } - - /** - * 创建二维码响应对应 - * @param string $url 二维码内容 - * @return Response - * @throws \Endroid\QrCode\Exceptions\ImageFunctionFailedException - * @throws \Endroid\QrCode\Exceptions\ImageFunctionUnknownException - * @throws \Endroid\QrCode\Exceptions\ImageTypeInvalidException - */ - private function _buildQrcResponse(string $url): Response - { - $qrCode = new \Endroid\QrCode\QrCode(); - $qrCode->setText($url)->setSize(300)->setPadding(20)->setImageType('png'); - return response($qrCode->get(), 200, ['Content-Type' => 'image/png']); - } - -} diff --git a/app/wechat/controller/api/View.php b/app/wechat/controller/api/View.php deleted file mode 100644 index ba479781f..000000000 --- a/app/wechat/controller/api/View.php +++ /dev/null @@ -1,109 +0,0 @@ -id = $id ?: input('id', 0); - $this->news = MediaService::news($this->id); - $this->fetch(); - } - - /** - * 文章内容展示 - * @param string|integer $id 文章ID编号 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function item($id = 0) - { - $map = ['id' => $id ?: input('id', 0)]; - WechatNewsArticle::mk()->where($map)->update([ - 'read_num' => $this->app->db->raw('read_num+1'), - ]); - $this->info = WechatNewsArticle::mk()->where($map)->find(); - $this->fetch(); - } - - /** - * 文本展示 - */ - public function text() - { - $this->content = strip_tags(input('content', ''), '
'); - $this->fetch(); - } - - /** - * 图片展示 - */ - public function image() - { - $this->content = strip_tags(input('content', ''), ''); - $this->fetch(); - } - - /** - * 视频展示 - */ - public function video() - { - $this->url = strip_tags(input('url', ''), ''); - $this->title = strip_tags(input('title', ''), ''); - $this->fetch(); - } - - /** - * 语音展示 - */ - public function voice() - { - $this->url = strip_tags(input('url', ''), ''); - $this->fetch(); - } - - /** - * 音乐展示 - */ - public function music() - { - $this->url = strip_tags(input('url', ''), ''); - $this->desc = strip_tags(input('desc', ''), ''); - $this->title = strip_tags(input('title', ''), ''); - $this->fetch(); - } -} diff --git a/app/wechat/database/20221013045829_install_wechat.php b/app/wechat/database/20221013045829_install_wechat.php deleted file mode 100644 index f4188416c..000000000 --- a/app/wechat/database/20221013045829_install_wechat.php +++ /dev/null @@ -1,299 +0,0 @@ -_create_wechat_auto(); - $this->_create_wechat_fans(); - $this->_create_wechat_fans_tags(); - $this->_create_wechat_keys(); - $this->_create_wechat_media(); - $this->_create_wechat_news(); - $this->_create_wechat_news_article(); - } - - /** - * 创建数据对象 - * @class WechatAuto - * @table wechat_auto - * @return void - */ - private function _create_wechat_auto() - { - - // 当前数据表 - $table = 'wechat_auto'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-回复', - ]) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '类型(text,image,news)']) - ->addColumn('time', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '延迟时间']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '消息编号']) - ->addColumn('appid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '文本内容']) - ->addColumn('image_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '图片链接']) - ->addColumn('voice_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '语音链接']) - ->addColumn('music_title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '音乐标题']) - ->addColumn('music_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '音乐链接']) - ->addColumn('music_image', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '缩略图片']) - ->addColumn('music_desc', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '音乐描述']) - ->addColumn('video_title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '视频标题']) - ->addColumn('video_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '视频URL']) - ->addColumn('video_desc', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '视频描述']) - ->addColumn('news_id', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '图文ID']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '状态(0禁用,1启用)']) - ->addColumn('create_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '创建人']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_wechat_auto_type']) - ->addIndex('time', ['name' => 'idx_wechat_auto_time']) - ->addIndex('code', ['name' => 'idx_wechat_auto_code']) - ->addIndex('appid', ['name' => 'idx_wechat_auto_appid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatFans - * @table wechat_fans - * @return void - */ - private function _create_wechat_fans() - { - - // 当前数据表 - $table = 'wechat_fans'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-粉丝', - ]) - ->addColumn('appid', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('unionid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '粉丝unionid']) - ->addColumn('openid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '粉丝openid']) - ->addColumn('tagid_list', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '粉丝标签id']) - ->addColumn('is_black', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '是否为黑名单状态']) - ->addColumn('subscribe', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '关注状态(0未关注,1已关注)']) - ->addColumn('nickname', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '用户昵称']) - ->addColumn('sex', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '用户性别(1男性,2女性,0未知)']) - ->addColumn('country', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户所在国家']) - ->addColumn('province', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户所在省份']) - ->addColumn('city', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户所在城市']) - ->addColumn('language', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户的语言(zh_CN)']) - ->addColumn('headimgurl', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '用户头像']) - ->addColumn('subscribe_time', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '关注时间']) - ->addColumn('subscribe_at', 'datetime', ['default' => null, 'null' => true, 'comment' => '关注时间']) - ->addColumn('remark', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '备注']) - ->addColumn('subscribe_scene', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '扫码关注场景']) - ->addColumn('qr_scene', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '二维码场景值']) - ->addColumn('qr_scene_str', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '二维码场景内容']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('openid', ['name' => 'idx_wechat_fans_openid']) - ->addIndex('unionid', ['name' => 'idx_wechat_fans_unionid']) - ->addIndex('is_black', ['name' => 'idx_wechat_fans_is_black']) - ->addIndex('subscribe', ['name' => 'idx_wechat_fans_subscribe']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatFansTags - * @table wechat_fans_tags - * @return void - */ - private function _create_wechat_fans_tags() - { - - // 当前数据表 - $table = 'wechat_fans_tags'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-标签', - ]) - ->addColumn('appid', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('name', 'string', ['limit' => 35, 'default' => '', 'null' => true, 'comment' => '标签名称']) - ->addColumn('count', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '总数']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建日期']) - ->addIndex('id', ['name' => 'idx_wechat_fans_tags_id']) - ->addIndex('appid', ['name' => 'idx_wechat_fans_tags_appid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatKeys - * @table wechat_keys - * @return void - */ - private function _create_wechat_keys() - { - - // 当前数据表 - $table = 'wechat_keys'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-规则', - ]) - ->addColumn('appid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '类型(text,image,news)']) - ->addColumn('keys', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '关键字']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '文本内容']) - ->addColumn('image_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '图片链接']) - ->addColumn('voice_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '语音链接']) - ->addColumn('music_title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '音乐标题']) - ->addColumn('music_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '音乐链接']) - ->addColumn('music_image', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '缩略图片']) - ->addColumn('music_desc', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '音乐描述']) - ->addColumn('video_title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '视频标题']) - ->addColumn('video_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '视频URL']) - ->addColumn('video_desc', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '视频描述']) - ->addColumn('news_id', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '图文ID']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序字段']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '状态(0禁用,1启用)']) - ->addColumn('create_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '创建人']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('appid', ['name' => 'idx_wechat_keys_appid']) - ->addIndex('type', ['name' => 'idx_wechat_keys_type']) - ->addIndex('keys', ['name' => 'idx_wechat_keys_keys']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatMedia - * @table wechat_media - * @return void - */ - private function _create_wechat_media() - { - - // 当前数据表 - $table = 'wechat_media'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-素材', - ]) - ->addColumn('md5', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '文件md5']) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '媒体类型']) - ->addColumn('appid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号ID']) - ->addColumn('media_id', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '永久素材MediaID']) - ->addColumn('local_url', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '本地文件链接']) - ->addColumn('media_url', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '远程图片链接']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('appid', ['name' => 'idx_wechat_media_appid']) - ->addIndex('md5', ['name' => 'idx_wechat_media_md5']) - ->addIndex('type', ['name' => 'idx_wechat_media_type']) - ->addIndex('media_id', ['name' => 'idx_wechat_media_media_id']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatNews - * @table wechat_news - * @return void - */ - private function _create_wechat_news() - { - - // 当前数据表 - $table = 'wechat_news'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-图文', - ]) - ->addColumn('media_id', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '永久素材MediaID']) - ->addColumn('local_url', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '永久素材外网URL']) - ->addColumn('article_id', 'string', ['limit' => 60, 'default' => '', 'null' => true, 'comment' => '关联图文ID(用英文逗号做分割)']) - ->addColumn('is_deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删除,1已删除)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addColumn('create_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '创建人']) - ->addIndex('article_id', ['name' => 'idx_wechat_news_article_id']) - ->addIndex('media_id', ['name' => 'idx_wechat_news_media_id']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatNewsArticle - * @table wechat_news_article - * @return void - */ - private function _create_wechat_news_article() - { - - // 当前数据表 - $table = 'wechat_news_article'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-文章', - ]) - ->addColumn('title', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '素材标题']) - ->addColumn('local_url', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '永久素材显示URL']) - ->addColumn('show_cover_pic', 'integer', ['limit' => 4, 'default' => 0, 'null' => true, 'comment' => '显示封面(0不显示,1显示)']) - ->addColumn('author', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '文章作者']) - ->addColumn('digest', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '摘要内容']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '图文内容']) - ->addColumn('content_source_url', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '原文地址']) - ->addColumn('read_num', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '阅读数量']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } -} diff --git a/app/wechat/database/20221013045830_install_wechat_data.php b/app/wechat/database/20221013045830_install_wechat_data.php deleted file mode 100644 index 37776629e..000000000 --- a/app/wechat/database/20221013045830_install_wechat_data.php +++ /dev/null @@ -1,55 +0,0 @@ -insertMenu(); - } - - /** - * 初始化菜单 - */ - private function insertMenu() - { - // 写入微信菜单 - PhinxExtend::write2menu([ - [ - 'name' => '微信管理', - 'sort' => '200', - 'subs' => [ - [ - 'name' => '微信管理', - 'subs' => [ - ['name' => '微信接口配置', 'icon' => 'layui-icon layui-icon-set', 'node' => 'wechat/config/options'], - ['name' => '微信支付配置', 'icon' => 'layui-icon layui-icon-rmb', 'node' => 'wechat/config/payment'], - ], - ], - [ - 'name' => '微信定制', - 'subs' => [ - ['name' => '微信粉丝管理', 'icon' => 'layui-icon layui-icon-username', 'node' => 'wechat/fans/index'], - ['name' => '微信图文管理', 'icon' => 'layui-icon layui-icon-template-1', 'node' => 'wechat/news/index'], - ['name' => '微信菜单配置', 'icon' => 'layui-icon layui-icon-cellphone', 'node' => 'wechat/menu/index'], - ['name' => '回复规则管理', 'icon' => 'layui-icon layui-icon-engine', 'node' => 'wechat/keys/index'], - ['name' => '关注自动回复', 'icon' => 'layui-icon layui-icon-release', 'node' => 'wechat/auto/index'], - ], - ], - ], - ], - ], ['node' => 'wechat/config/options']); - } -} diff --git a/app/wechat/model/WechatAuto.php b/app/wechat/model/WechatAuto.php deleted file mode 100644 index 11802dab3..000000000 --- a/app/wechat/model/WechatAuto.php +++ /dev/null @@ -1,37 +0,0 @@ -where(['status' => 1])->order('time asc')->cursor() as $vo) { - [$name, $time] = ["推送客服消息 {$vo['code']}#{$openid}", static::parseTimeString($vo['time'])]; - QueueService::register($name, "xadmin:fansmsg {$openid} {$vo['code']}", $time, []); - } - } - - /** - * 解析配置时间格式 - * @param string $time - * @return int - */ - private static function parseTimeString(string $time): int - { - if (preg_match('|^.*?(\d{2}).*?(\d{2}).*?(\d{2}).*?$|', $time, $vars)) { - return intval($vars[1]) * 3600 * intval($vars[2]) * 60 + intval($vars[3]); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/app/wechat/service/FansService.php b/app/wechat/service/FansService.php deleted file mode 100644 index 032f23464..000000000 --- a/app/wechat/service/FansService.php +++ /dev/null @@ -1,61 +0,0 @@ - $v) if ($v === '') unset($user[$k]); - Library::$sapp->event->trigger('WechatFansUpdate', $user); - return !!WechatFans::mUpdate($user, 'openid'); - } - - /** - * 获取粉丝信息 - * @param string $openid - * @return array - */ - public static function get(string $openid): array - { - return WechatFans::mk()->where(['openid' => $openid])->findOrEmpty()->toArray(); - } -} diff --git a/app/wechat/service/MediaService.php b/app/wechat/service/MediaService.php deleted file mode 100644 index 50a7f7011..000000000 --- a/app/wechat/service/MediaService.php +++ /dev/null @@ -1,97 +0,0 @@ - $id, 'is_deleted' => 0]; - $data = WechatNews::mk()->where($map1)->where($map)->find(); - if (empty($data)) return []; - // 文章内容编号 - $data['articles'] = []; - $aids = $data['articleids'] = str2arr($data['article_id']); - if (empty($data['articleids'])) return $data->toArray(); - // 文章内容集合 - $query = WechatNewsArticle::mk()->whereIn('id', $aids)->orderField('id', $aids); - $data['articles'] = $query->withoutField('create_by,create_at')->select()->toArray(); - return $data->toArray(); - } - - /** - * 上传图片永久素材 - * @param string $url 文件地址 - * @param string $type 文件类型 - * @param array $video 视频信息 - * @return string media_id - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function upload(string $url, string $type = 'image', array $video = []): string - { - $map = ['md5' => md5($url), 'appid' => WechatService::getAppid()]; - if (($mediaId = WechatMedia::mk()->where($map)->value('media_id'))) return $mediaId; - $result = WechatService::WeChatMedia()->addMaterial(self::buildCurlFile($url), $type, $video); - WechatMedia::mUpdate([ - 'local_url' => $url, 'md5' => $map['md5'], 'type' => $type, 'appid' => $map['appid'], - 'media_url' => $result['url'] ?? '', 'media_id' => $result['media_id'], - ], 'type', $map); - return $result['media_id']; - } - - /** - * 创建 CURL 文件对象 - * @param string $local 文件路径或网络地址 - * @return MyCurlFile - * @throws \WeChat\Exceptions\LocalCacheException - */ - private static function buildCurlFile(string $local): MyCurlFile - { - if (file_exists($local)) { - return new MyCurlFile($local); - } else { - return new MyCurlFile(Storage::down($local)['file']); - } - } -} diff --git a/app/wechat/service/WechatService.php b/app/wechat/service/WechatService.php deleted file mode 100644 index ba46e6367..000000000 --- a/app/wechat/service/WechatService.php +++ /dev/null @@ -1,290 +0,0 @@ - $name, 'appid' => $appid, 'time' => time(), 'nostr' => uniqid()]; - $data['sign'] = md5("{$data['class']}#{$appid}#{$appkey}#{$data['time']}#{$data['nostr']}"); - // 创建远程连接,默认使用 JSON-RPC 方式调用接口 - $token = enbase64url(json_encode($data, JSON_UNESCAPED_UNICODE)); - return new JsonRpcClient("https://open.cuci.cc/service/api.client/jsonrpc?not_init_session=1&token={$token}"); - } - } - - /** - * 解析调用对象名称 - * @param string $name - * @return array - */ - private static function parseName(string $name): array - { - foreach (['WeChat', 'WeMini', 'WeOpen', 'WePay', 'ThinkService'] as $type) { - if (strpos($name, $type) === 0) { - [, $base] = explode($type, $name); - return [$type, $base, "\\{$type}\\{$base}"]; - } - } - return ['-', '-', $name]; - } - - /** - * 获取当前微信APPID - * @return string - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function getAppid(): string - { - if (static::getType() === 'api') { - return sysconf('wechat.appid'); - } else { - return sysconf('wechat.thr_appid'); - } - } - - /** - * 获取接口授权模式 - * @return string - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function getType(): string - { - $type = strtolower(sysconf('wechat.type')); - if (in_array($type, ['api', 'thr'])) return $type; - throw new Exception('请在后台配置微信对接授权模式'); - } - - /** - * 获取公众号配置参数 - * @return array - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function getConfig(): array - { - $options = [ - 'appid' => static::getAppid(), - 'token' => sysconf('wechat.token'), - 'appsecret' => sysconf('wechat.appsecret'), - 'encodingaeskey' => sysconf('wechat.encodingaeskey'), - 'mch_id' => sysconf('wechat.mch_id'), - 'mch_key' => sysconf('wechat.mch_key'), - 'cache_path' => Library::$sapp->getRuntimePath() . 'wechat', - ]; - $local = LocalStorage::instance(); - switch (strtolower(sysconf('wechat.mch_ssl_type'))) { - case 'p12': - $options['ssl_p12'] = $local->path(sysconf('wechat.mch_ssl_p12'), true); - break; - case 'pem': - $options['ssl_key'] = $local->path(sysconf('wechat.mch_ssl_key'), true); - $options['ssl_cer'] = $local->path(sysconf('wechat.mch_ssl_cer'), true); - break; - } - return $options; - } - - /** - * 通过网页授权获取粉丝信息 - * @param string $source 回跳URL地址 - * @param integer $isfull 获取资料模式 - * @param boolean $redirect 是否直接跳转 - * @return array - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function getWebOauthInfo(string $source, int $isfull = 0, bool $redirect = true): array - { - $appid = static::getAppid(); - $openid = Library::$sapp->session->get("{$appid}_openid"); - $userinfo = Library::$sapp->session->get("{$appid}_fansinfo"); - if ((empty($isfull) && !empty($openid)) || (!empty($isfull) && !empty($openid) && !empty($userinfo))) { - empty($userinfo) || FansService::set($userinfo, $appid); - return ['openid' => $openid, 'fansinfo' => $userinfo]; - } - if (static::getType() === 'api') { - // 解析 GET 参数 - parse_str(parse_url($source, PHP_URL_QUERY), $params); - $getVars = [ - 'code' => $params['code'] ?? input('code', ''), - 'rcode' => $params['rcode'] ?? input('rcode', ''), - 'state' => $params['state'] ?? input('state', ''), - ]; - $wechat = static::WeChatOauth(); - if ($getVars['state'] !== $appid || empty($getVars['code'])) { - $params['rcode'] = enbase64url($source); - $location = strstr("{$source}?", '?', true) . '?' . http_build_query($params); - $oauthurl = $wechat->getOauthRedirect($location, $appid, $isfull ? 'snsapi_userinfo' : 'snsapi_base'); - throw new HttpResponseException($redirect ? redirect($oauthurl, 301) : response("location.href='{$oauthurl}'")); - } elseif (($token = $wechat->getOauthAccessToken($getVars['code'])) && isset($token['openid'])) { - Library::$sapp->session->set("{$appid}_openid", $openid = $token['openid']); - if ($isfull && isset($token['access_token'])) { - $userinfo = $wechat->getUserInfo($token['access_token'], $openid); - Library::$sapp->session->set("{$appid}_fansinfo", $userinfo); - empty($userinfo) || FansService::set($userinfo, $appid); - } - } - if ($getVars['rcode']) { - $location = debase64url($getVars['rcode']); - throw new HttpResponseException($redirect ? redirect($location, 301) : response("location.href='{$location}'")); - } elseif ((empty($isfull) && !empty($openid)) || (!empty($isfull) && !empty($openid) && !empty($userinfo))) { - return ['openid' => $openid, 'fansinfo' => $userinfo]; - } else { - throw new Exception('Query params [rcode] not find.'); - } - } else { - $result = static::ThinkServiceConfig()->oauth(Library::$sapp->session->getId(), $source, $isfull); - Library::$sapp->session->set("{$appid}_openid", $openid = $result['openid']); - Library::$sapp->session->set("{$appid}_fansinfo", $userinfo = $result['fans']); - if ((empty($isfull) && !empty($openid)) || (!empty($isfull) && !empty($openid) && !empty($userinfo))) { - empty($userinfo) || FansService::set($userinfo, $appid); - return ['openid' => $openid, 'fansinfo' => $userinfo]; - } - if ($redirect) { - throw new HttpResponseException(redirect($result['url'], 301)); - } else { - throw new HttpResponseException(response("location.href='{$result['url']}'")); - } - } - } - - /** - * 获取微信网页JSSDK签名参数 - * @param null|string $location 签名地址 - * @return array - * @throws \WeChat\Exceptions\InvalidResponseException - * @throws \WeChat\Exceptions\LocalCacheException - * @throws \think\admin\Exception - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function getWebJssdkSign(?string $location = null): array - { - $location = $location ?: Library::$sapp->request->url(true); - if (static::getType() === 'api') { - return static::WeChatScript()->getJsSign($location); - } else { - return static::ThinkServiceConfig()->jsSign($location); - } - } -} \ No newline at end of file diff --git a/app/wechat/sys.php b/app/wechat/sys.php deleted file mode 100644 index e7e95a114..000000000 --- a/app/wechat/sys.php +++ /dev/null @@ -1,31 +0,0 @@ -request->isCli()) { - Console::starting(function (Console $console) { - $console->addCommands([Fans::class, Auto::class]); - }); -} else { - Library::$sapp->event->listen('WechatFansSubscribe', function ($openid) { - AutoService::register($openid); - }); -} \ No newline at end of file diff --git a/app/wechat/view/api/login/failed.html b/app/wechat/view/api/login/failed.html deleted file mode 100644 index edf4d3b81..000000000 --- a/app/wechat/view/api/login/failed.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - 扫码登录失败 - - - - - - - -
-
- img -
{$message|default='授权失败'}
-
-
- - \ No newline at end of file diff --git a/app/wechat/view/api/login/success.html b/app/wechat/view/api/login/success.html deleted file mode 100644 index b520132c1..000000000 --- a/app/wechat/view/api/login/success.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - 扫码登录成功 - - - - - - - -
-
- img -
{$message|default='授权成功'}
-
-
-

授权时间:{:date('Y年m月d日H:i')}

-
-
- - \ No newline at end of file diff --git a/app/wechat/view/api/test/jssdk.html b/app/wechat/view/api/test/jssdk.html deleted file mode 100644 index 9a4b1d38f..000000000 --- a/app/wechat/view/api/test/jssdk.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - JSSDK 功能测试 - - - - - - - -
-

JSSDK 功能测试

-
- -
- -
- - - - - - - - diff --git a/app/wechat/view/api/test/oauth.html b/app/wechat/view/api/test/oauth.html deleted file mode 100644 index 44e743bae..000000000 --- a/app/wechat/view/api/test/oauth.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - 微信网页授权测试 - - - - - - - -{if empty($fans.fansinfo)} -
- 操作失败 -
-

通过网页授权获取用户资料失败,请检查权限再试!

-

- 重新获取(刷新) -

-
-
-{else} -
- img -

{$fans.fansinfo.nickname}

-
-
- 用户标识 -
-
OPENID
-

{$fans.fansinfo.openid}

-
UNIONID
-

{$fans.fansinfo.unionid|default='未获取到'}

-
-
-
- 详细资料 -
-
性别
-

{:[1=>'男',2=>'女'][$fans.fansinfo.sex]??'未知'}

-
系统语言
-

{$fans.fansinfo.language}

-
所在区域
-

{$fans.fansinfo.country} - {$fans.fansinfo.province} - {$fans.fansinfo.city}

- {if isset($fans.fansinfo.privilege.0)} -
设备网络
-

{$fans.fansinfo.privilege.0|default='未获取到网络信息'}

- {/if} -
-
-{/if} - - \ No newline at end of file diff --git a/app/wechat/view/api/view/image.html b/app/wechat/view/api/view/image.html deleted file mode 100644 index 8dfe6226c..000000000 --- a/app/wechat/view/api/view/image.html +++ /dev/null @@ -1,28 +0,0 @@ -{extend name='api/view/main'} - -{block name='content'} -
{:date('H:i')}
-
- -
img
-
-{/block} - -{block name='style'} - -{/block} \ No newline at end of file diff --git a/app/wechat/view/api/view/item.html b/app/wechat/view/api/view/item.html deleted file mode 100644 index 6a76feaa3..000000000 --- a/app/wechat/view/api/view/item.html +++ /dev/null @@ -1,72 +0,0 @@ -{extend name='api/view/main'} - -{block name='title'}{/block} - -{block name='content'} -
- {notempty name='info'} -

{$info.title|default=''}

-

- {$info.author} - {:date('Y年m月d日',strtotime($info.create_at))} -

- {if $info.show_cover_pic and $info.local_url}img{/if} -
{$info.content|raw}
-
阅读 {$info.read_num}
- {else} -

404

访问资源不存在哦!
- {/notempty} -
-{/block} - -{block name='style'} - -{/block} \ No newline at end of file diff --git a/app/wechat/view/api/view/main.html b/app/wechat/view/api/view/main.html deleted file mode 100644 index a35e7df14..000000000 --- a/app/wechat/view/api/view/main.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - {block name='title'}{/block} - - - - - - - - - - {block name='style'}{/block} - - -{block name='content'}{/block} - \ No newline at end of file diff --git a/app/wechat/view/api/view/music.html b/app/wechat/view/api/view/music.html deleted file mode 100644 index 0e5f14de0..000000000 --- a/app/wechat/view/api/view/music.html +++ /dev/null @@ -1,78 +0,0 @@ -{extend name='api/view/main'} - -{block name='content'} -
{:date('H:i')}
-
- -
-
-
{$title|default=''}
-
{$desc|default=''}
-
- -
-
- - -{/block} - -{block name='style'} - -{/block} \ No newline at end of file diff --git a/app/wechat/view/api/view/news.html b/app/wechat/view/api/view/news.html deleted file mode 100644 index a6d11b939..000000000 --- a/app/wechat/view/api/view/news.html +++ /dev/null @@ -1,147 +0,0 @@ -{extend name='api/view/main'} - -{block name='content'} -
{:date('H:i')}
-
- {notempty name='news.articles'} {foreach $news.articles as $k => $v} {if $k < 1} - - {if $v.title}{$v.title}{/if} - - {else} -
- - {$v.title} - - {/if} {/foreach} {else} -

404

访问资源不存在哦!
- {/notempty} -
- -{/block} - -{block name='style'} - - -{/block} \ No newline at end of file diff --git a/app/wechat/view/api/view/text.html b/app/wechat/view/api/view/text.html deleted file mode 100644 index ddae68acc..000000000 --- a/app/wechat/view/api/view/text.html +++ /dev/null @@ -1,9 +0,0 @@ -{extend name='api/view/main'} - -{block name='content'} -
{:date('H:i')}
-
- -
{$content|raw|default=''}
-
-{/block} \ No newline at end of file diff --git a/app/wechat/view/api/view/video.html b/app/wechat/view/api/view/video.html deleted file mode 100644 index 4ce831416..000000000 --- a/app/wechat/view/api/view/video.html +++ /dev/null @@ -1,44 +0,0 @@ -{extend name='api/view/main'} - -{block name='content'} -
{:date('H:i')}
-
-
-
{$title|default=''}
-
{:date('m月d日')}
- -
-
-{/block} - -{block name='style'} - - -{/block} \ No newline at end of file diff --git a/app/wechat/view/api/view/voice.html b/app/wechat/view/api/view/voice.html deleted file mode 100644 index 762555146..000000000 --- a/app/wechat/view/api/view/voice.html +++ /dev/null @@ -1,45 +0,0 @@ -{extend name='api/view/main'} - -{block name='content'} -
{:date('H:i')}
-
- -
- - - -
-
- -{/block} - -{block name='style'} - -{/block} \ No newline at end of file diff --git a/app/wechat/view/auto/form.html b/app/wechat/view/auto/form.html deleted file mode 100644 index 839ba6e05..000000000 --- a/app/wechat/view/auto/form.html +++ /dev/null @@ -1,253 +0,0 @@ - - -
-
-
公众号
-
-
-
-
-
-
编辑回复规则
-
-
- -
- - -
-
-
- -
- {foreach ['1'=>'启用','0'=>'禁用'] as $k=>$v} - - {/foreach} -
-
- -
- -
- {foreach $types as $k=>$v} - - {/foreach} -
-
- -
- -
- -
-
- -
- -
- - 选择图文 -
-
- -
- -
- - -

文件最大2Mb,支持bmp/png/jpeg/jpg/gif格式

- img -
-
- -
- -
- - -

文件最大2Mb,播放长度不超过60s,mp3/wma/wav/amr格式

-
-
- -
- -
- -
-
- -
- -
- - -
-
- -
- -
- -
-
- -
- -
- - -

文件最大64KB,只支持JPG格式

-
-
- -
- -
- -
-
- -
- -
- - -

文件最大10MB,只支持MP4格式

-
-
- -
- -
- -
-
- -
-
-
-
- {if isset($vo['id'])}{/if} - {if isset($vo['code'])}{/if} - - -
-
-
-
- - \ No newline at end of file diff --git a/app/wechat/view/auto/index.html b/app/wechat/view/auto/index.html deleted file mode 100644 index 70363e46b..000000000 --- a/app/wechat/view/auto/index.html +++ /dev/null @@ -1,112 +0,0 @@ -{extend name="../../admin/view/table"} - -{block name="button"} - - - - - - - - - - - - - - - -{/block} - -{block name="content"} -
- 特别注意:关注自动回复使用微信客服消息接口发送,因此多图文只能发送每组图文的第一篇文章,另外还需要开启系统任务功能。 -
- -
-
    - {foreach ['index'=>'回复规则','recycle'=>'回 收 站'] as $k=>$v} - {if isset($type) and $type eq $k} -
  • {$v}
  • - {else} -
  • {$v}
  • - {/if}{/foreach} -
-
- {include file='auto/index_search'} -
-
-
-{/block} - -{block name='script'} - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/wechat/view/auto/index_search.html b/app/wechat/view/auto/index_search.html deleted file mode 100644 index 4823aa9eb..000000000 --- a/app/wechat/view/auto/index_search.html +++ /dev/null @@ -1,49 +0,0 @@ - \ No newline at end of file diff --git a/app/wechat/view/config/options.html b/app/wechat/view/config/options.html deleted file mode 100644 index 3a256300d..000000000 --- a/app/wechat/view/config/options.html +++ /dev/null @@ -1,39 +0,0 @@ -{extend name="../../admin/view/main"} - -{block name="button"} - - - -{/block} - -{block name="content"} -
-
- {foreach ['api'=>'微信公众平台直接模式','thr'=>'微信开放平台授权模式'] as $k=>$v} - - {/foreach} -

请选择微信对接方式,其中微信开放平台授权模式是需要微信开放平台支持,还需要搭建微信授权服务!

-
-
-
-
-
{include file='config/options_form_api'}
-
{include file='config/options_form_thr'}
-
-
-{/block} - -{block name='script'} - -{/block} diff --git a/app/wechat/view/config/options_form_api.html b/app/wechat/view/config/options_form_api.html deleted file mode 100644 index 3d7fec1e6..000000000 --- a/app/wechat/view/config/options_form_api.html +++ /dev/null @@ -1,66 +0,0 @@ -
- -
-
- 使用微信公众平台直接模式时,需要在微信公众号平台配置授权IP及网页授权域名,将公众号平台获取到的参数填写到下面。 -
-
- -
- -
- -
- -

公众号平台与系统对接认证Token,请优先填写此参数并保存,然后再在微信公众号平台操作对接。

-
-
- -
- -
- -

公众号APPID是所有接口必要参数,可以在公众号平台 [ 开发 > 基本配置 ] 页面获取。

-
-
- -
- -
- -

公众号应用密钥是所有接口必要参数,可以在公众号平台 [ 开发 > 基本配置 ] 页面授权后获取。

-
-
- -
- -
- -

若开启了消息加密时必需填写,消息加密密钥必需填写并保持与公众号平台一致。

-
-
- -
- -
- - -

公众号服务平台消息推送接口及服务器授权IP地址,需在公众号接口开发处配置。

-
-
- -
- -
- - -
- -
-
\ No newline at end of file diff --git a/app/wechat/view/config/options_form_thr.html b/app/wechat/view/config/options_form_thr.html deleted file mode 100644 index 5c95c49c7..000000000 --- a/app/wechat/view/config/options_form_thr.html +++ /dev/null @@ -1,74 +0,0 @@ -
- -
-
- 使用微信开放平台授权模式时,需要使用楚才开放平台的 微信授权 服务,接口需要使用 YarJsonRpc 通信。 -
-
- -
- - -
- -
-
-
-
-
-

微信昵称:{$wechat.user_nickname|default='-'}

-

微信类型:{$wechat.service_type|default='-'} / {$wechat.service_verify == '未认证' ? '未认证' : '已认证'}

-

注册公司:{$wechat.user_company|default='-'}

-

授权绑定:{$wechat.create_at|format_datetime}

-
-
-
-
- - -
- -
- -

点击链接将跳转到微信第三方平台进行公众号授权。

- {if !empty($message)}

{$message|default=''}

{/if} -
-
- -
- -
- -

众号 appid 通过微信第三方授权自动获取. 若没有值请进行微信第三方授权。

-
-
- -
- -
- -
-
- -
- -
- -

公众号绑定服务平台接口通知 URL, 公众号消息接收与回复等。

-
-
-
- -
- - -
- -
-
\ No newline at end of file diff --git a/app/wechat/view/config/options_test.html b/app/wechat/view/config/options_test.html deleted file mode 100644 index 9ae3e40dd..000000000 --- a/app/wechat/view/config/options_test.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
-
-
- img -

OAUTH 网页授权

-
-
- img -

JSSDK 接口签名

-
-
-
-
- - diff --git a/app/wechat/view/config/payment.html b/app/wechat/view/config/payment.html deleted file mode 100644 index 8da6df6e7..000000000 --- a/app/wechat/view/config/payment.html +++ /dev/null @@ -1,102 +0,0 @@ -{extend name="../../admin/view/main"} - -{block name="button"} - - - -{/block} - -{block name="content"} -
-
-
- -
-
- 微信商户参数配置,此处交易的商户号需要与微信公众号对接的公众号 APPID 匹配。 -
-
- -
-
- -
- -

微信商户账号,需要在微信商户平台获取,MCH_ID 与 APPID 匹配

-
-
- -
- -
- -

微信商户密钥,需要在微信商户平台操作设置操作密码并获取商户接口密钥

-
-
- -
- -
- -
- {foreach ['none'=>'暂不使用证书', 'pem'=>'上传 PEM 证书', 'p12'=>'上传 P12 证书'] as $k=>$v} - - {/foreach} -
-

请选择需要上传证书类型,P12 或 PEM 二选一,证书需要从微信商户平台获取

-
- - -

微信商户支付 P12 证书,实现订单退款、打款、发红包等支出功能都使用证书

-
-
- - - - -

微信商户支付 PEM 双向证书,实现订单退款、打款、发红包等支出功能都使用证书

-
-
-
- -
-
- -
- -
-
-
-
-{/block} - -{block name="script"} - -{/block} diff --git a/app/wechat/view/config/payment_test.html b/app/wechat/view/config/payment_test.html deleted file mode 100644 index 758b7ced9..000000000 --- a/app/wechat/view/config/payment_test.html +++ /dev/null @@ -1,40 +0,0 @@ -
-
-
-
-

微信开放平台授权

-

JSSDK 签名测试需要在开放平台配置当前的授权域名:{:request()->host()}

-
-
-

公众号平台域名授权

-

网页授权及 JSSDK 签名都需要在公众号平台授权域名:{:request()->host()}

-
-
-

微信商户支付测试配置

-

JSAPI 支付测试需要在微信商户平台配置支付目录:{:sysuri('wechat/api.test/index',[],'',true)}

-

扫码支付①需要在微信商户平台配置支付通知地址:{:url('wechat/api.test/scanOneNotify',[],'',true)}

-
-
-
-
- img -

微信 JSAPI 支付

-
-
- img -

微信扫码支付①

-
-
- img -

微信扫码支付②

-
-
-
-
- - diff --git a/app/wechat/view/fans/index.html b/app/wechat/view/fans/index.html deleted file mode 100644 index 4cd04dd74..000000000 --- a/app/wechat/view/fans/index.html +++ /dev/null @@ -1,82 +0,0 @@ -{extend name="../../admin/view/table"} - -{block name="button"} - - - - - - - - - - - - -{/block} - -{block name="content"} -
- {include file='fans/index_search'} -
-
-{/block} - -{block name='script'} - - - - - - -{/block} \ No newline at end of file diff --git a/app/wechat/view/fans/index_search.html b/app/wechat/view/fans/index_search.html deleted file mode 100644 index a71bff173..000000000 --- a/app/wechat/view/fans/index_search.html +++ /dev/null @@ -1,79 +0,0 @@ -
- 条件搜索 - -
- - \ No newline at end of file diff --git a/app/wechat/view/keys/form.html b/app/wechat/view/keys/form.html deleted file mode 100644 index 346da5ab7..000000000 --- a/app/wechat/view/keys/form.html +++ /dev/null @@ -1,254 +0,0 @@ - - -
-
-
公众号
-
-
-
-
-
-
编辑关键字
-
- -
- -
- -
-
- - - -
- -
- {foreach ['1'=>'启用','0'=>'禁用'] as $k=>$v} - - {/foreach} -
-
- -
- -
- {foreach $types as $k=>$v} - - {/foreach} -
-
- -
- -
- -
-
- -
- -
- - 选择图文 -
-
- -
- -
- - -

文件最大2Mb,支持bmp/png/jpeg/jpg/gif格式

- img -
-
- -
- -
- - -

文件最大2Mb,播放长度不超过60s,mp3/wma/wav/amr格式

-
-
- -
- -
- -
-
- -
- -
- - -
-
- -
- -
- -
-
- -
- -
- - -

文件最大64KB,只支持JPG格式

-
-
- -
- -
- -
-
- -
- -
- - -

文件最大10MB,只支持MP4格式

-
-
- -
- -
- -
-
-
-
-
-
- {if isset($vo['id'])}{/if} - {if isset($vo['code'])}{/if} - - -
-
-
-
- - \ No newline at end of file diff --git a/app/wechat/view/keys/index.html b/app/wechat/view/keys/index.html deleted file mode 100644 index b46310dc8..000000000 --- a/app/wechat/view/keys/index.html +++ /dev/null @@ -1,126 +0,0 @@ -{extend name="../../admin/view/table"} - -{block name="button"} - - - - - - - - - - - - - - - - - - - - - - - -{/block} - -{block name="content"} -
-
    - {foreach ['index'=>'回复规则','recycle'=>'回 收 站'] as $k=>$v} - {if isset($type) and $type eq $k} -
  • {$v}
  • - {else} -
  • {$v}
  • - {/if}{/foreach} -
-
- {include file='keys/index_search'} -
-
-
-{/block} - -{block name='script'} - - - - - - - - - - - - -{/block} \ No newline at end of file diff --git a/app/wechat/view/keys/index_search.html b/app/wechat/view/keys/index_search.html deleted file mode 100644 index 95cb9b044..000000000 --- a/app/wechat/view/keys/index_search.html +++ /dev/null @@ -1,49 +0,0 @@ - \ No newline at end of file diff --git a/app/wechat/view/menu/index.html b/app/wechat/view/menu/index.html deleted file mode 100644 index 7a0f1bcb6..000000000 --- a/app/wechat/view/menu/index.html +++ /dev/null @@ -1,201 +0,0 @@ -{extend name="../../admin/view/main"} - -{block name='content'} - - - - -{/block} \ No newline at end of file diff --git a/app/wechat/view/news/form.html b/app/wechat/view/news/form.html deleted file mode 100644 index d22b700f5..000000000 --- a/app/wechat/view/news/form.html +++ /dev/null @@ -1,215 +0,0 @@ -{extend name="../../admin/view/main"} - -{block name="style"}{include file='news/formstyle'}{/block} - -{block name='content'} -
-
-
-
-
- - - - -
-
-
-
- - - - -
-
- -
-
-
-
-
- - -
- 图文封面大图片 -
-
- -
-
- -
- -
-
-

封面大图片建议尺寸 900像素 * 500像素

-
-
- 图文文章内容 - -
- - -
- - -
-
-
-
-
- -{/block} - - -{block name='script'} - -{/block} \ No newline at end of file diff --git a/app/wechat/view/news/formstyle.html b/app/wechat/view/news/formstyle.html deleted file mode 100644 index f934580be..000000000 --- a/app/wechat/view/news/formstyle.html +++ /dev/null @@ -1,87 +0,0 @@ - \ No newline at end of file diff --git a/app/wechat/view/news/index.html b/app/wechat/view/news/index.html deleted file mode 100644 index 25612fb33..000000000 --- a/app/wechat/view/news/index.html +++ /dev/null @@ -1,158 +0,0 @@ -{extend name="../../admin/view/main"} - -{block name="button"} - -{if auth('add')} - -{/if} - -{/block} - -{block name='content'} -
-
- {foreach $list as $vo} -
-
- 预览 - 编辑 - 删除 -
- {foreach $vo.articles as $k => $v} - {if $k < 1} -
- {if $v.title}

{$v.title}

{/if} -
-
- {else} -
- {$v.title} -
-
-
- {/if}{/foreach} -
- {/foreach} -
- {empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -
-{/block} - -{block name='script'} - -{/block} - -{block name="style"} - -{/block} diff --git a/app/wechat/view/news/select.html b/app/wechat/view/news/select.html deleted file mode 100644 index ba61a7cd2..000000000 --- a/app/wechat/view/news/select.html +++ /dev/null @@ -1,146 +0,0 @@ -{extend name="../../admin/view/index/index"} - -{block name='style'} - -{/block} - -{block name="body"} -
- {foreach $list as $vo} -
- {foreach $vo.articles as $k => $v}{if $k < 1} -
- {if $v.title}

{$v.title}

{/if} -
-
- {else} -
-
{$v.title}
-
-
-
- {/if}{/foreach} -
- {/foreach} -
-{empty name='list'}没有记录哦{else}{$pagehtml|raw|default=''}{/empty} -{/block} - -{block name="script"} - -{/block} \ No newline at end of file diff --git a/build.cmd b/build.cmd deleted file mode 100644 index c7d15da73..000000000 --- a/build.cmd +++ /dev/null @@ -1 +0,0 @@ -composer update --profile --prefer-dist --no-dev --optimize-autoloader \ No newline at end of file diff --git a/composer.json b/composer.json index 2bd66434e..97ce2e857 100644 --- a/composer.json +++ b/composer.json @@ -29,20 +29,20 @@ "topthink/think-view": "^1.0", "zoujingli/ip2region": "^2.0", "zoujingli/think-library": "6.0.x-dev", - "zoujingli/wechat-developer": "^1.2" + "zoujingli/wechat-developer": "^1.2", + "zoujingli/think-plugs-admin": "dev-master", + "zoujingli/think-plugs-static": "dev-master", + "zoujingli/think-plugs-wechat": "dev-master", + "zoujingli/think-plugs-center": "dev-master" }, "autoload": { - "psr-0": { - "": "extend" - }, "psr-4": { "app\\": "app" } }, - "scripts": { - "post-autoload-dump": [ - "@php think service:discover", - "@php think vendor:publish" - ] + "config": { + "allow-plugins": { + "zoujingli/think-plugs-installer": true + } } } diff --git a/config/app.php b/config/app.php deleted file mode 100644 index 2176976a8..000000000 --- a/config/app.php +++ /dev/null @@ -1,49 +0,0 @@ - '', - // 应用快速访问 - 'app_express' => true, - // 是否启用路由 - 'with_route' => true, - // 超级用户账号 - 'super_user' => 'admin', - // 默认时区 - 'default_timezone' => 'Asia/Shanghai', - // 应用映射(自动多应用模式有效) - 'app_map' => [], - // 域名绑定(自动多应用模式有效) - 'domain_bind' => [], - // 禁止访问(自动多应用模式有效) - 'deny_app_list' => [], - // CORS 自动配置跨域 - 'cors_auto' => true, - // CORS 配置跨域域名 - 'cors_host' => [], - // CORS 授权请求方法 - 'cors_methods' => 'GET,PUT,POST,PATCH,DELETE', - // CORS 跨域头部字段 - 'cors_headers' => 'Api-Type,Api-Name,Api-Uuid,Jwt-Token,Api-Token,User-Form-Token,User-Token,Token', - // 显示错误消息内容,仅生产模式有效 - 'error_message' => '页面错误!请稍后再试~', - // 异常状态模板配置,仅生产模式有效 - 'http_exception_template' => [ - 404 => with_path('public/static/theme/err/404.html'), - 500 => with_path('public/static/theme/err/500.html'), - ], -]; \ No newline at end of file diff --git a/config/cache.php b/config/cache.php deleted file mode 100644 index 31a4851d0..000000000 --- a/config/cache.php +++ /dev/null @@ -1,51 +0,0 @@ - 'file', - // 缓存连接配置 - 'stores' => [ - 'file' => [ - // 驱动方式 - 'type' => 'File', - // 缓存保存目录 - 'path' => '', - // 缓存名称前缀 - 'prefix' => '', - // 缓存有效期 0 表示永久缓存 - 'expire' => 0, - // 缓存标签前缀 - 'tag_prefix' => 'tag:', - // 序列化机制 - 'serialize' => [], - ], - 'safe' => [ - // 驱动方式 - 'type' => 'File', - // 缓存保存目录 - 'path' => with_path('safefile/cache/'), - // 缓存名称前缀 - 'prefix' => '', - // 缓存有效期 0 表示永久缓存 - 'expire' => 0, - // 缓存标签前缀 - 'tag_prefix' => 'tag:', - // 序列化机制 - 'serialize' => [], - ], - ], -]; \ No newline at end of file diff --git a/config/cookie.php b/config/cookie.php deleted file mode 100644 index b40ea183f..000000000 --- a/config/cookie.php +++ /dev/null @@ -1,32 +0,0 @@ - 0, - // cookie 保存路径 - 'path' => '/', - // cookie 有效域名 - 'domain' => '', - // httponly 访问设置 - 'httponly' => true, - // 是否使用 setcookie - 'setcookie' => true, - // cookie 安全传输,只支持 https 协议 - 'secure' => request()->isSsl(), - // samesite 安全设置,支持 'strict' 'lax' 'none' - 'samesite' => request()->isSsl() ? 'none' : 'lax', -]; diff --git a/config/database.php b/config/database.php deleted file mode 100644 index bda6f2a22..000000000 --- a/config/database.php +++ /dev/null @@ -1,81 +0,0 @@ - 'sqlite', - // 自定义时间查询规则 - 'time_query_rule' => [], - // 自动写入时间戳字段 - 'auto_timestamp' => true, - // 时间字段取出后的默认时间格式 - 'datetime_format' => 'Y-m-d H:i:s', - // 数据库连接配置信息 - 'connections' => [ - 'mysql' => [ - // 数据库类型 - 'type' => 'mysql', - // 服务器地址 - 'hostname' => '127.0.0.1', - // 数据库名 - 'database' => 'admin_v6', - // 用户名 - 'username' => 'admin_v6', - // 密码 - 'password' => 'FbYBHcWKr2', - // 端口 - 'hostport' => '3306', - // 数据库连接参数 - 'params' => [], - // 数据库编码默认采用 utf8 - 'charset' => 'utf8mb4', - // 数据库表前缀 - 'prefix' => '', - // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) - 'deploy' => 0, - // 数据库读写是否分离 主从式有效 - 'rw_separate' => false, - // 读写分离后 主服务器数量 - 'master_num' => 1, - // 指定从服务器序号 - 'slave_no' => '', - // 检查字段是否存在 - 'fields_strict' => true, - // 是否需要断线重连 - 'break_reconnect' => false, - // 监听SQL执行日志 - 'trigger_sql' => true, - // 开启字段类型缓存 - 'fields_cache' => isOnline(), - ], - 'sqlite' => [ - 'charset' => 'utf8', - // 数据库类型 - 'type' => 'sqlite', - // 数据库文件 - 'database' => with_path('database/sqlite.db'), - // 监听执行日志 - 'trigger_sql' => true, - // 其他参数字段 - 'deploy' => 0, - 'prefix' => '', - 'hostname' => '', - 'hostport' => '', - 'username' => '', - 'password' => '', - ], - ], -]; diff --git a/config/lang.php b/config/lang.php deleted file mode 100644 index 03603917e..000000000 --- a/config/lang.php +++ /dev/null @@ -1,39 +0,0 @@ - 'zh-cn', - // 允许的语言列表 - 'allow_lang_list' => ['zh-cn'], - // 转义为对应语言包名称 - 'accept_language' => [ - 'en' => 'en-us', - 'zh-hans-cn' => 'zh-cn', - ], - // 多语言自动侦测变量名 - 'detect_var' => 'lang', - // 多语言 Cookie 变量 - 'cookie_var' => 'lang', - // 多语言 Header 变量 - 'header_var' => 'lang', - // 使用 Cookie 记录 - 'use_cookie' => true, - // 是否支持语言分组 - 'allow_group' => false, - // 扩展语言包 - 'extend_list' => [], -]; \ No newline at end of file diff --git a/config/log.php b/config/log.php deleted file mode 100644 index 1aa1650a8..000000000 --- a/config/log.php +++ /dev/null @@ -1,57 +0,0 @@ - 'file', - // 日志记录级别 - 'level' => [], - // 日志类型记录的通道 - 'type_channel' => [], - // 关闭全局日志写入 - 'close' => false, - // 全局日志处理 支持闭包 - 'processor' => null, - // 日志通道列表 - 'channels' => [ - 'file' => [ - // 日志记录方式 - 'type' => 'File', - // 日志保存目录 - 'path' => '', - // 单文件日志写入 - 'single' => true, - // 独立日志级别 - 'apart_level' => true, - // 每个文件大小 ( 10兆 ) - 'file_size' => 10485760, - // 日志日期格式 - 'time_format' => 'Y-m-d H:i:s', - // 最大日志文件数量 - 'max_files' => 100, - // 使用JSON格式记录 - 'json' => false, - // 日志处理 - 'processor' => null, - // 关闭通道日志写入 - 'close' => false, - // 日志输出格式化 - 'format' => '[%s][%s] %s', - // 是否实时写入 - 'realtime_write' => false, - ], - ], -]; \ No newline at end of file diff --git a/config/phinx.php b/config/phinx.php deleted file mode 100644 index ea5968b5c..000000000 --- a/config/phinx.php +++ /dev/null @@ -1,24 +0,0 @@ - [], - // 创建数据表 - 'tables' => [], - // 备份数据表 - 'backup' => [], -]; \ No newline at end of file diff --git a/config/route.php b/config/route.php deleted file mode 100644 index 756fa6e52..000000000 --- a/config/route.php +++ /dev/null @@ -1,58 +0,0 @@ - '/', - // URL伪静态后缀 - 'url_html_suffix' => 'html', - // URL普通方式参数 用于自动生成 - 'url_common_param' => true, - // 是否开启路由延迟解析 - 'url_lazy_route' => false, - // 是否强制使用路由 - 'url_route_must' => false, - // 合并路由规则 - 'route_rule_merge' => true, - // 路由是否完全匹配 - 'route_complete_match' => true, - // 访问控制器层名称 - 'controller_layer' => 'controller', - // 空控制器名 - 'empty_controller' => 'Error', - // 是否使用控制器后缀 - 'controller_suffix' => false, - // 默认的路由变量规则 - 'default_route_pattern' => '[\w\.]+', - // 是否开启请求缓存 true 自动缓存 支持设置请求缓存规则 - 'request_cache' => false, - // 请求缓存有效期 - 'request_cache_expire' => null, - // 全局请求缓存排除规则 - 'request_cache_except' => [], - // 默认应用 - 'default_app' => 'index', - // 默认控制器名 - 'default_controller' => 'Index', - // 默认操作名 - 'default_action' => 'index', - // 操作方法后缀 - 'action_suffix' => '', - // 默认JSONP格式返回的处理方法 - 'default_jsonp_handler' => 'jsonpReturn', - // 默认JSONP处理方法 - 'var_jsonp_handler' => 'callback', -]; \ No newline at end of file diff --git a/config/session.php b/config/session.php deleted file mode 100644 index b0d917f59..000000000 --- a/config/session.php +++ /dev/null @@ -1,28 +0,0 @@ - 'ssid', - // 驱动方式 - 'type' => 'file', - // 存储连接 - 'store' => null, - // 过期时间 - 'expire' => 7200, - // 文件前缀 - 'prefix' => '', -]; \ No newline at end of file diff --git a/config/view.php b/config/view.php deleted file mode 100644 index a720b0bfd..000000000 --- a/config/view.php +++ /dev/null @@ -1,42 +0,0 @@ - 'Think', - // 默认模板渲染规则 1.解析为小写+下划线 2.全部转换小写 3.保持操作方法 - 'auto_rule' => 1, - // 模板目录名 - 'view_dir_name' => 'view', - // 模板文件后缀 - 'view_suffix' => 'html', - // 模板文件名分隔符 - 'view_depr' => DIRECTORY_SEPARATOR, - // 模板缓存配置 - 'tpl_cache' => isOnline(), - // 模板引擎标签开始标记 - 'tpl_begin' => '{', - // 模板引擎标签结束标记 - 'tpl_end' => '}', - // 标签库标签开始标记 - 'taglib_begin' => '{', - // 标签库标签结束标记 - 'taglib_end' => '}', - // 去除HTML空格换行 - 'strip_space' => true, - // 标签默认过滤输出方法 - 'default_filter' => 'htmlentities=###,ENT_QUOTES', -]; \ No newline at end of file diff --git a/database/migrations/20221013031925_install_admin.php b/database/migrations/20221013031925_install_admin.php deleted file mode 100644 index edb24218a..000000000 --- a/database/migrations/20221013031925_install_admin.php +++ /dev/null @@ -1,387 +0,0 @@ -_create_system_auth(); - $this->_create_system_auth_node(); - $this->_create_system_base(); - $this->_create_system_config(); - $this->_create_system_data(); - $this->_create_system_file(); - $this->_create_system_menu(); - $this->_create_system_oplog(); - $this->_create_system_queue(); - $this->_create_system_user(); - } - - /** - * 创建数据对象 - * @class SystemAuth - * @table system_auth - * @return void - */ - private function _create_system_auth() - { - - // 当前数据表 - $table = 'system_auth'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-权限', - ]) - ->addColumn('title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '权限名称']) - ->addColumn('utype', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '身份权限']) - ->addColumn('desc', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '备注说明']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '权限状态(1使用,0禁用)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_system_auth_status']) - ->addIndex('title', ['name' => 'idx_system_auth_title']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemAuthNode - * @table system_auth_node - * @return void - */ - private function _create_system_auth_node() - { - - // 当前数据表 - $table = 'system_auth_node'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-授权', - ]) - ->addColumn('auth', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '角色']) - ->addColumn('node', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '节点']) - ->addIndex('auth', ['name' => 'idx_system_auth_node_auth']) - ->addIndex('node', ['name' => 'idx_system_auth_node_node']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemBase - * @table system_base - * @return void - */ - private function _create_system_base() - { - - // 当前数据表 - $table = 'system_base'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-字典', - ]) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '数据类型']) - ->addColumn('code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '数据代码']) - ->addColumn('name', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '数据名称']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '数据内容']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '数据状态(0禁用,1启动)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0正常,1已删)']) - ->addColumn('deleted_at', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '删除时间']) - ->addColumn('deleted_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '删除用户']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_system_base_type']) - ->addIndex('code', ['name' => 'idx_system_base_code']) - ->addIndex('name', ['name' => 'idx_system_base_name']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemConfig - * @table system_config - * @return void - */ - private function _create_system_config() - { - - // 当前数据表 - $table = 'system_config'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-配置', - ]) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '配置分类']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '配置名称']) - ->addColumn('value', 'string', ['limit' => 2048, 'default' => '', 'null' => true, 'comment' => '配置内容']) - ->addIndex('type', ['name' => 'idx_system_config_type']) - ->addIndex('name', ['name' => 'idx_system_config_name']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemData - * @table system_data - * @return void - */ - private function _create_system_data() - { - - // 当前数据表 - $table = 'system_data'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-数据', - ]) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '配置名']) - ->addColumn('value', 'text', ['default' => null, 'null' => true, 'comment' => '配置值']) - ->addIndex('name', ['name' => 'idx_system_data_name']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemFile - * @table system_file - * @return void - */ - private function _create_system_file() - { - - // 当前数据表 - $table = 'system_file'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-文件', - ]) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '上传类型']) - ->addColumn('hash', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '文件哈希']) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '文件名称']) - ->addColumn('xext', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '文件后缀']) - ->addColumn('xurl', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '访问链接']) - ->addColumn('xkey', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '文件路径']) - ->addColumn('mime', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '文件类型']) - ->addColumn('size', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文件大小']) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户编号']) - ->addColumn('isfast', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '是否秒传']) - ->addColumn('issafe', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '安全模式']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '上传状态(1悬空,2落地)']) - ->addColumn('create_at', 'datetime', ['default' => null, 'null' => true, 'comment' => '创建时间']) - ->addColumn('update_at', 'datetime', ['default' => null, 'null' => true, 'comment' => '更新时间']) - ->addIndex('type', ['name' => 'idx_system_file_type']) - ->addIndex('hash', ['name' => 'idx_system_file_hash']) - ->addIndex('uuid', ['name' => 'idx_system_file_uuid']) - ->addIndex('xext', ['name' => 'idx_system_file_xext']) - ->addIndex('status', ['name' => 'idx_system_file_status']) - ->addIndex('issafe', ['name' => 'idx_system_file_issafe']) - ->addIndex('isfast', ['name' => 'idx_system_file_isfast']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemMenu - * @table system_menu - * @return void - */ - private function _create_system_menu() - { - - // 当前数据表 - $table = 'system_menu'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-菜单', - ]) - ->addColumn('pid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '上级ID']) - ->addColumn('title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '菜单名称']) - ->addColumn('icon', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '菜单图标']) - ->addColumn('node', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '节点代码']) - ->addColumn('url', 'string', ['limit' => 400, 'default' => '', 'null' => true, 'comment' => '链接节点']) - ->addColumn('params', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '链接参数']) - ->addColumn('target', 'string', ['limit' => 20, 'default' => '_self', 'null' => true, 'comment' => '打开方式']) - ->addColumn('sort', 'integer', ['limit' => 11, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '状态(0:禁用,1:启用)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_system_menu_status']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemOplog - * @table system_oplog - * @return void - */ - private function _create_system_oplog() - { - - // 当前数据表 - $table = 'system_oplog'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-日志', - ]) - ->addColumn('node', 'string', ['limit' => 200, 'default' => '', 'null' => false, 'comment' => '当前操作节点']) - ->addColumn('geoip', 'string', ['limit' => 15, 'default' => '', 'null' => false, 'comment' => '操作者IP地址']) - ->addColumn('action', 'string', ['limit' => 200, 'default' => '', 'null' => false, 'comment' => '操作行为名称']) - ->addColumn('content', 'string', ['limit' => 1024, 'default' => '', 'null' => false, 'comment' => '操作内容描述']) - ->addColumn('username', 'string', ['limit' => 50, 'default' => '', 'null' => false, 'comment' => '操作人用户名']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => false, 'comment' => '创建时间']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemQueue - * @table system_queue - * @return void - */ - private function _create_system_queue() - { - - // 当前数据表 - $table = 'system_queue'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-任务', - ]) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => false, 'comment' => '任务编号']) - ->addColumn('title', 'string', ['limit' => 100, 'default' => '', 'null' => false, 'comment' => '任务名称']) - ->addColumn('command', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '执行指令']) - ->addColumn('exec_pid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '执行进程']) - ->addColumn('exec_data', 'text', ['default' => null, 'null' => true, 'comment' => '执行参数']) - ->addColumn('exec_time', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '执行时间']) - ->addColumn('exec_desc', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '执行描述']) - ->addColumn('enter_time', 'decimal', ['precision' => 20, 'scale' => 4, 'default' => '0.0000', 'null' => true, 'comment' => '开始时间']) - ->addColumn('outer_time', 'decimal', ['precision' => 20, 'scale' => 4, 'default' => '0.0000', 'null' => true, 'comment' => '结束时间']) - ->addColumn('loops_time', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '循环时间']) - ->addColumn('attempts', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '执行次数']) - ->addColumn('rscript', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '任务类型(0单例,1多例)']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '任务状态(1新任务,2处理中,3成功,4失败)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => false, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_system_queue_code']) - ->addIndex('title', ['name' => 'idx_system_queue_title']) - ->addIndex('status', ['name' => 'idx_system_queue_status']) - ->addIndex('rscript', ['name' => 'idx_system_queue_rscript']) - ->addIndex('create_at', ['name' => 'idx_system_queue_create_at']) - ->addIndex('exec_time', ['name' => 'idx_system_queue_exec_time']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class SystemUser - * @table system_user - * @return void - */ - private function _create_system_user() - { - - // 当前数据表 - $table = 'system_user'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '系统-用户', - ]) - ->addColumn('usertype', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '用户类型']) - ->addColumn('username', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户账号']) - ->addColumn('password', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '用户密码']) - ->addColumn('nickname', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户昵称']) - ->addColumn('headimg', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '头像地址']) - ->addColumn('authorize', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '权限授权']) - ->addColumn('contact_qq', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '联系QQ']) - ->addColumn('contact_mail', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '联系邮箱']) - ->addColumn('contact_phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '联系手机']) - ->addColumn('login_ip', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '登录地址']) - ->addColumn('login_at', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '登录时间']) - ->addColumn('login_num', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '登录次数']) - ->addColumn('describe', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '备注说明']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '状态(0禁用,1启用)']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('is_deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除(1删除,0未删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_system_user_status']) - ->addIndex('username', ['name' => 'idx_system_user_username']) - ->addIndex('is_deleted', ['name' => 'idx_system_user_is_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } -} diff --git a/database/migrations/20221013031926_install_admin_data.php b/database/migrations/20221013031926_install_admin_data.php deleted file mode 100644 index ce98ded7c..000000000 --- a/database/migrations/20221013031926_install_admin_data.php +++ /dev/null @@ -1,111 +0,0 @@ -insertUser(); - $this->insertMenu(); - $this->insertConf(); - } - - /** - * 初始化用户数据 - * @return void - * @throws \think\db\exception\DbException - */ - private function insertUser() - { - // 检查是否存在 - $map = ['username' => 'admin']; - if (SystemUser::mk()->where($map)->count() > 0) { - return; - } - - // 初始化默认数据 - SystemUser::mk()->save([ - 'id' => '10000', - 'username' => 'admin', - 'nickname' => '超级管理员', - 'password' => '21232f297a57a5a743894a0e4a801fc3', - 'headimg' => 'https://thinkadmin.top/static/img/icon.png', - ]); - } - - /** - * 初始化系统菜单 - * @return void - */ - private function insertMenu() - { - // 初始化菜单数据 - PhinxExtend::write2menu([ - [ - 'name' => '系统管理', - 'sort' => '100', - 'subs' => [ - [ - 'name' => '系统配置', - 'subs' => [ - ['name' => '系统参数配置', 'icon' => 'layui-icon layui-icon-set', 'node' => 'admin/config/index'], - ['name' => '系统任务管理', 'icon' => 'layui-icon layui-icon-log', 'node' => 'admin/queue/index'], - ['name' => '系统日志管理', 'icon' => 'layui-icon layui-icon-form', 'node' => 'admin/oplog/index'], - ['name' => '数据字典管理', 'icon' => 'layui-icon layui-icon-code-circle', 'node' => 'admin/base/index'], - ['name' => '系统文件管理', 'icon' => 'layui-icon layui-icon-carousel', 'node' => 'admin/file/index'], - ['name' => '系统菜单管理', 'icon' => 'layui-icon layui-icon-layouts', 'node' => 'admin/menu/index'], - ], - ], - [ - 'name' => '权限管理', - 'subs' => [ - ['name' => '访问权限管理', 'icon' => 'layui-icon layui-icon-vercode', 'node' => 'admin/auth/index'], - ['name' => '系统用户管理', 'icon' => 'layui-icon layui-icon-username', 'node' => 'admin/user/index'], - ], - ], - ], - ], - ], ['node' => 'admin/config/index']); - } - - /** - * 初始化配置参数 - * @return void - * @throws \think\db\exception\DbException - */ - private function insertConf() - { - // 检查数据 - if (SystemConfig::mk()->count()) return; - - // 写入数据 - SystemConfig::mk()->insertAll([ - ['type' => 'base', 'name' => 'app_name', 'value' => 'ThinkAdmin'], - ['type' => 'base', 'name' => 'app_version', 'value' => 'v6'], - ['type' => 'base', 'name' => 'editor', 'value' => 'ckeditor5'], - ['type' => 'base', 'name' => 'login_name', 'value' => '系统管理'], - ['type' => 'base', 'name' => 'site_copy', 'value' => '©版权所有 2014-' . date('Y') . ' 楚才科技'], - ['type' => 'base', 'name' => 'site_icon', 'value' => 'https://v6.thinkadmin.top/upload/4b/5a423974e447d5502023f553ed370f.png'], - ['type' => 'base', 'name' => 'site_name', 'value' => 'ThinkAdmin'], - ['type' => 'base', 'name' => 'site_theme', 'value' => 'default'], - ['type' => 'storage', 'name' => 'allow_exts', 'value' => 'doc,gif,ico,jpg,mp3,mp4,p12,pem,png,zip,rar,xls,xlsx'], - ['type' => 'storage', 'name' => 'type', 'value' => 'local'], - ['type' => 'wechat', 'name' => 'type', 'value' => 'api'], - ]); - } -} diff --git a/database/migrations/20221013045829_install_wechat.php b/database/migrations/20221013045829_install_wechat.php deleted file mode 100644 index f4188416c..000000000 --- a/database/migrations/20221013045829_install_wechat.php +++ /dev/null @@ -1,299 +0,0 @@ -_create_wechat_auto(); - $this->_create_wechat_fans(); - $this->_create_wechat_fans_tags(); - $this->_create_wechat_keys(); - $this->_create_wechat_media(); - $this->_create_wechat_news(); - $this->_create_wechat_news_article(); - } - - /** - * 创建数据对象 - * @class WechatAuto - * @table wechat_auto - * @return void - */ - private function _create_wechat_auto() - { - - // 当前数据表 - $table = 'wechat_auto'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-回复', - ]) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '类型(text,image,news)']) - ->addColumn('time', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '延迟时间']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '消息编号']) - ->addColumn('appid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '文本内容']) - ->addColumn('image_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '图片链接']) - ->addColumn('voice_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '语音链接']) - ->addColumn('music_title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '音乐标题']) - ->addColumn('music_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '音乐链接']) - ->addColumn('music_image', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '缩略图片']) - ->addColumn('music_desc', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '音乐描述']) - ->addColumn('video_title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '视频标题']) - ->addColumn('video_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '视频URL']) - ->addColumn('video_desc', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '视频描述']) - ->addColumn('news_id', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '图文ID']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '状态(0禁用,1启用)']) - ->addColumn('create_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '创建人']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_wechat_auto_type']) - ->addIndex('time', ['name' => 'idx_wechat_auto_time']) - ->addIndex('code', ['name' => 'idx_wechat_auto_code']) - ->addIndex('appid', ['name' => 'idx_wechat_auto_appid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatFans - * @table wechat_fans - * @return void - */ - private function _create_wechat_fans() - { - - // 当前数据表 - $table = 'wechat_fans'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-粉丝', - ]) - ->addColumn('appid', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('unionid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '粉丝unionid']) - ->addColumn('openid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '粉丝openid']) - ->addColumn('tagid_list', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '粉丝标签id']) - ->addColumn('is_black', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '是否为黑名单状态']) - ->addColumn('subscribe', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '关注状态(0未关注,1已关注)']) - ->addColumn('nickname', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '用户昵称']) - ->addColumn('sex', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '用户性别(1男性,2女性,0未知)']) - ->addColumn('country', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户所在国家']) - ->addColumn('province', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户所在省份']) - ->addColumn('city', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户所在城市']) - ->addColumn('language', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户的语言(zh_CN)']) - ->addColumn('headimgurl', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '用户头像']) - ->addColumn('subscribe_time', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '关注时间']) - ->addColumn('subscribe_at', 'datetime', ['default' => null, 'null' => true, 'comment' => '关注时间']) - ->addColumn('remark', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '备注']) - ->addColumn('subscribe_scene', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '扫码关注场景']) - ->addColumn('qr_scene', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '二维码场景值']) - ->addColumn('qr_scene_str', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '二维码场景内容']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('openid', ['name' => 'idx_wechat_fans_openid']) - ->addIndex('unionid', ['name' => 'idx_wechat_fans_unionid']) - ->addIndex('is_black', ['name' => 'idx_wechat_fans_is_black']) - ->addIndex('subscribe', ['name' => 'idx_wechat_fans_subscribe']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatFansTags - * @table wechat_fans_tags - * @return void - */ - private function _create_wechat_fans_tags() - { - - // 当前数据表 - $table = 'wechat_fans_tags'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-标签', - ]) - ->addColumn('appid', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('name', 'string', ['limit' => 35, 'default' => '', 'null' => true, 'comment' => '标签名称']) - ->addColumn('count', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '总数']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建日期']) - ->addIndex('id', ['name' => 'idx_wechat_fans_tags_id']) - ->addIndex('appid', ['name' => 'idx_wechat_fans_tags_appid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatKeys - * @table wechat_keys - * @return void - */ - private function _create_wechat_keys() - { - - // 当前数据表 - $table = 'wechat_keys'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-规则', - ]) - ->addColumn('appid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '类型(text,image,news)']) - ->addColumn('keys', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '关键字']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '文本内容']) - ->addColumn('image_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '图片链接']) - ->addColumn('voice_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '语音链接']) - ->addColumn('music_title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '音乐标题']) - ->addColumn('music_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '音乐链接']) - ->addColumn('music_image', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '缩略图片']) - ->addColumn('music_desc', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '音乐描述']) - ->addColumn('video_title', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '视频标题']) - ->addColumn('video_url', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '视频URL']) - ->addColumn('video_desc', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '视频描述']) - ->addColumn('news_id', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '图文ID']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序字段']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '状态(0禁用,1启用)']) - ->addColumn('create_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '创建人']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('appid', ['name' => 'idx_wechat_keys_appid']) - ->addIndex('type', ['name' => 'idx_wechat_keys_type']) - ->addIndex('keys', ['name' => 'idx_wechat_keys_keys']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatMedia - * @table wechat_media - * @return void - */ - private function _create_wechat_media() - { - - // 当前数据表 - $table = 'wechat_media'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-素材', - ]) - ->addColumn('md5', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '文件md5']) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '媒体类型']) - ->addColumn('appid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号ID']) - ->addColumn('media_id', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '永久素材MediaID']) - ->addColumn('local_url', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '本地文件链接']) - ->addColumn('media_url', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '远程图片链接']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('appid', ['name' => 'idx_wechat_media_appid']) - ->addIndex('md5', ['name' => 'idx_wechat_media_md5']) - ->addIndex('type', ['name' => 'idx_wechat_media_type']) - ->addIndex('media_id', ['name' => 'idx_wechat_media_media_id']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatNews - * @table wechat_news - * @return void - */ - private function _create_wechat_news() - { - - // 当前数据表 - $table = 'wechat_news'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-图文', - ]) - ->addColumn('media_id', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '永久素材MediaID']) - ->addColumn('local_url', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '永久素材外网URL']) - ->addColumn('article_id', 'string', ['limit' => 60, 'default' => '', 'null' => true, 'comment' => '关联图文ID(用英文逗号做分割)']) - ->addColumn('is_deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删除,1已删除)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addColumn('create_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '创建人']) - ->addIndex('article_id', ['name' => 'idx_wechat_news_article_id']) - ->addIndex('media_id', ['name' => 'idx_wechat_news_media_id']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class WechatNewsArticle - * @table wechat_news_article - * @return void - */ - private function _create_wechat_news_article() - { - - // 当前数据表 - $table = 'wechat_news_article'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '微信-文章', - ]) - ->addColumn('title', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '素材标题']) - ->addColumn('local_url', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '永久素材显示URL']) - ->addColumn('show_cover_pic', 'integer', ['limit' => 4, 'default' => 0, 'null' => true, 'comment' => '显示封面(0不显示,1显示)']) - ->addColumn('author', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '文章作者']) - ->addColumn('digest', 'string', ['limit' => 300, 'default' => '', 'null' => true, 'comment' => '摘要内容']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '图文内容']) - ->addColumn('content_source_url', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '原文地址']) - ->addColumn('read_num', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '阅读数量']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } -} diff --git a/database/migrations/20221013045830_install_wechat_data.php b/database/migrations/20221013045830_install_wechat_data.php deleted file mode 100644 index 37776629e..000000000 --- a/database/migrations/20221013045830_install_wechat_data.php +++ /dev/null @@ -1,55 +0,0 @@ -insertMenu(); - } - - /** - * 初始化菜单 - */ - private function insertMenu() - { - // 写入微信菜单 - PhinxExtend::write2menu([ - [ - 'name' => '微信管理', - 'sort' => '200', - 'subs' => [ - [ - 'name' => '微信管理', - 'subs' => [ - ['name' => '微信接口配置', 'icon' => 'layui-icon layui-icon-set', 'node' => 'wechat/config/options'], - ['name' => '微信支付配置', 'icon' => 'layui-icon layui-icon-rmb', 'node' => 'wechat/config/payment'], - ], - ], - [ - 'name' => '微信定制', - 'subs' => [ - ['name' => '微信粉丝管理', 'icon' => 'layui-icon layui-icon-username', 'node' => 'wechat/fans/index'], - ['name' => '微信图文管理', 'icon' => 'layui-icon layui-icon-template-1', 'node' => 'wechat/news/index'], - ['name' => '微信菜单配置', 'icon' => 'layui-icon layui-icon-cellphone', 'node' => 'wechat/menu/index'], - ['name' => '回复规则管理', 'icon' => 'layui-icon layui-icon-engine', 'node' => 'wechat/keys/index'], - ['name' => '关注自动回复', 'icon' => 'layui-icon layui-icon-release', 'node' => 'wechat/auto/index'], - ], - ], - ], - ], - ], ['node' => 'wechat/config/options']); - } -} diff --git a/database/migrations/20221013045838_install_user.php b/database/migrations/20221013045838_install_user.php deleted file mode 100644 index 4b137344d..000000000 --- a/database/migrations/20221013045838_install_user.php +++ /dev/null @@ -1,1213 +0,0 @@ -_create_base_postage_company(); - $this->_create_base_postage_region(); - $this->_create_base_postage_template(); - $this->_create_base_user_discount(); - $this->_create_base_user_message(); - $this->_create_base_user_payment(); - $this->_create_base_user_upgrade(); - $this->_create_data_news_item(); - $this->_create_data_news_mark(); - $this->_create_data_news_x_collect(); - $this->_create_data_user(); - $this->_create_data_user_address(); - $this->_create_data_user_balance(); - $this->_create_data_user_logger(); - $this->_create_data_user_message(); - $this->_create_data_user_payment(); - $this->_create_data_user_rebate(); - $this->_create_data_user_token(); - $this->_create_data_user_transfer(); - $this->_create_shop_goods(); - $this->_create_shop_goods_cate(); - $this->_create_shop_goods_item(); - $this->_create_shop_goods_mark(); - $this->_create_shop_goods_stock(); - $this->_create_shop_order(); - $this->_create_shop_order_item(); - $this->_create_shop_order_send(); - } - - /** - * 创建数据对象 - * @class BasePostageCompany - * @table base_postage_company - * @return void - */ - private function _create_base_postage_company() - { - - // 当前数据表 - $table = 'base_postage_company'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-快递-公司', - ]) - ->addColumn('name', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '快递公司名称']) - ->addColumn('code_1', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '快递公司代码']) - ->addColumn('code_2', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '百度快递100代码']) - ->addColumn('code_3', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '官方快递100代码']) - ->addColumn('remark', 'string', ['limit' => 512, 'default' => '', 'null' => true, 'comment' => '快递公司描述']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '状态(0.无效,1.有效)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(1已删除,0未删除)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code_1', ['name' => 'idx_base_postage_company_code_1']) - ->addIndex('code_2', ['name' => 'idx_base_postage_company_code_2']) - ->addIndex('code_3', ['name' => 'idx_base_postage_company_code_3']) - ->addIndex('status', ['name' => 'idx_base_postage_company_status']) - ->addIndex('deleted', ['name' => 'idx_base_postage_company_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BasePostageRegion - * @table base_postage_region - * @return void - */ - private function _create_base_postage_region() - { - - // 当前数据表 - $table = 'base_postage_region'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-快递-区域', - ]) - ->addColumn('pid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '上级PID']) - ->addColumn('first', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '首字母']) - ->addColumn('short', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '区域简称']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '区域名称']) - ->addColumn('level', 'integer', ['limit' => 4, 'default' => 0, 'null' => true, 'comment' => '区域层级']) - ->addColumn('pinyin', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '区域拼音']) - ->addColumn('code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '区域邮编']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '使用状态']) - ->addColumn('lng', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '所在经度']) - ->addColumn('lat', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '所在纬度']) - ->addIndex('pid', ['name' => 'idx_base_postage_region_pid']) - ->addIndex('name', ['name' => 'idx_base_postage_region_name']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BasePostageTemplate - * @table base_postage_template - * @return void - */ - private function _create_base_postage_template() - { - - // 当前数据表 - $table = 'base_postage_template'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-快递-模板', - ]) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '模板编号']) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '模板名称']) - ->addColumn('normal', 'text', ['default' => null, 'null' => true, 'comment' => '默认规则']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '模板规则']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '模板状态']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_base_postage_template_code']) - ->addIndex('status', ['name' => 'idx_base_postage_template_status']) - ->addIndex('deleted', ['name' => 'idx_base_postage_template_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BaseUserDiscount - * @table base_user_discount - * @return void - */ - private function _create_base_user_discount() - { - - // 当前数据表 - $table = 'base_user_discount'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-基础-折扣', - ]) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '方案名称']) - ->addColumn('items', 'text', ['default' => null, 'null' => true, 'comment' => '方案规则']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '方案描述']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '方案状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_base_user_discount_status']) - ->addIndex('deleted', ['name' => 'idx_base_user_discount_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BaseUserMessage - * @table base_user_message - * @return void - */ - private function _create_base_user_message() - { - - // 当前数据表 - $table = 'base_user_message'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-基础-通知', - ]) - ->addColumn('type', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '消息类型']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '消息名称']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '消息内容']) - ->addColumn('num_read', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '阅读次数']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '消息状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_base_user_message_type']) - ->addIndex('status', ['name' => 'idx_base_user_message_status']) - ->addIndex('deleted', ['name' => 'idx_base_user_message_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BaseUserPayment - * @table base_user_payment - * @return void - */ - private function _create_base_user_payment() - { - - // 当前数据表 - $table = 'base_user_payment'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-基础-支付', - ]) - ->addColumn('type', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '支付类型']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '通道编号']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '支付名称']) - ->addColumn('cover', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '支付图标']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '支付参数']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '支付说明']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '支付状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_base_user_payment_type']) - ->addIndex('code', ['name' => 'idx_base_user_payment_code']) - ->addIndex('status', ['name' => 'idx_base_user_payment_status']) - ->addIndex('deleted', ['name' => 'idx_base_user_payment_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class BaseUserUpgrade - * @table base_user_upgrade - * @return void - */ - private function _create_base_user_upgrade() - { - - // 当前数据表 - $table = 'base_user_upgrade'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-等级', - ]) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '用户级别名称']) - ->addColumn('number', 'integer', ['limit' => 2, 'default' => 0, 'null' => true, 'comment' => '用户级别序号']) - ->addColumn('rebate_rule', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '用户奖利规则']) - ->addColumn('upgrade_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '会员升级规则(0单个,1同时)']) - ->addColumn('upgrade_team', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '团队人数统计(0不计,1累计)']) - ->addColumn('goods_vip_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '入会礼包状态']) - ->addColumn('order_amount_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '订单金额状态']) - ->addColumn('order_amount_number', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单金额累计']) - ->addColumn('teams_users_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '团队人数状态']) - ->addColumn('teams_users_number', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '团队人数累计']) - ->addColumn('teams_direct_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '直推人数状态']) - ->addColumn('teams_direct_number', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '直推人数累计']) - ->addColumn('teams_indirect_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '间推人数状态']) - ->addColumn('teams_indirect_number', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '间推人数累计']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '用户级别描述']) - ->addColumn('utime', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '等级更新时间']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '用户等级状态(1使用,0禁用)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '等级创建时间']) - ->addIndex('status', ['name' => 'idx_base_user_upgrade_status']) - ->addIndex('number', ['name' => 'idx_base_user_upgrade_number']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataNewsItem - * @table data_news_item - * @return void - */ - private function _create_data_news_item() - { - - // 当前数据表 - $table = 'data_news_item'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-文章-内容', - ]) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '文章编号']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '文章标题']) - ->addColumn('mark', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '文章标签']) - ->addColumn('cover', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '文章封面']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '备注说明']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '文章内容']) - ->addColumn('num_like', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文章点赞数']) - ->addColumn('num_read', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文章阅读数']) - ->addColumn('num_collect', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文章收藏数']) - ->addColumn('num_comment', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '文章评论数']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '文章状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_data_news_item_code']) - ->addIndex('status', ['name' => 'idx_data_news_item_status']) - ->addIndex('deleted', ['name' => 'idx_data_news_item_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataNewsMark - * @table data_news_mark - * @return void - */ - private function _create_data_news_mark() - { - - // 当前数据表 - $table = 'data_news_mark'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-文章-标签', - ]) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '标签名称']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '标签说明']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '标签状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_data_news_mark_status']) - ->addIndex('deleted', ['name' => 'idx_data_news_mark_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataNewsXCollect - * @table data_news_x_collect - * @return void - */ - private function _create_data_news_x_collect() - { - - // 当前数据表 - $table = 'data_news_x_collect'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-文章-标记', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('type', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '记录类型(1收藏,2点赞,3历史,4评论)']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '文章编号']) - ->addColumn('reply', 'text', ['default' => null, 'null' => true, 'comment' => '评论内容']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '记录状态(0无效,1待审核,2已审核)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_data_news_x_collect_type']) - ->addIndex('code', ['name' => 'idx_data_news_x_collect_code']) - ->addIndex('status', ['name' => 'idx_data_news_x_collect_status']) - ->addIndex('uuid', ['name' => 'idx_data_news_x_collect_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUser - * @table data_user - * @return void - */ - private function _create_data_user() - { - - // 当前数据表 - $table = 'data_user'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-会员', - ]) - ->addColumn('pid0', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '临时推荐人UID']) - ->addColumn('pid1', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '推荐人一级UID']) - ->addColumn('pid2', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '推荐人二级UID']) - ->addColumn('pids', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '推荐人绑定状态']) - ->addColumn('path', 'string', ['limit' => 999, 'default' => '-', 'null' => true, 'comment' => '推荐关系路径']) - ->addColumn('layer', 'integer', ['limit' => 20, 'default' => 1, 'null' => true, 'comment' => '推荐关系层级']) - ->addColumn('openid1', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '小程序OPENID']) - ->addColumn('openid2', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '服务号OPENID']) - ->addColumn('unionid', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '公众号UnionID']) - ->addColumn('phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '用户手机']) - ->addColumn('headimg', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '用户头像']) - ->addColumn('username', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '用户姓名']) - ->addColumn('nickname', 'string', ['limit' => 99, 'default' => '', 'null' => true, 'comment' => '用户昵称']) - ->addColumn('password', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '登录密码']) - ->addColumn('region_province', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '所在省份']) - ->addColumn('region_city', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '所在城市']) - ->addColumn('region_area', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '所在区域']) - ->addColumn('base_age', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户年龄']) - ->addColumn('base_sex', 'string', ['limit' => 10, 'default' => '', 'null' => true, 'comment' => '用户性别']) - ->addColumn('base_height', 'string', ['limit' => 10, 'default' => '', 'null' => true, 'comment' => '用户身高']) - ->addColumn('base_weight', 'string', ['limit' => 10, 'default' => '', 'null' => true, 'comment' => '用户体重']) - ->addColumn('base_birthday', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '用户生日']) - ->addColumn('vip_code', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => 'VIP等级编号']) - ->addColumn('vip_name', 'string', ['limit' => 30, 'default' => '普通用户', 'null' => true, 'comment' => 'VIP等级名称']) - ->addColumn('vip_order', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => 'VIP升级订单']) - ->addColumn('vip_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => 'VIP等级时间']) - ->addColumn('buy_vip_entry', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '是否入会礼包']) - ->addColumn('buy_last_date', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '最后支付时间']) - ->addColumn('rebate_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '返利金额统计']) - ->addColumn('rebate_used', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '返利提现统计']) - ->addColumn('rebate_lock', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '返利锁定统计']) - ->addColumn('balance_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '累计充值统计']) - ->addColumn('balance_used', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '已经使用统计']) - ->addColumn('teams_users_total', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '团队人数统计']) - ->addColumn('teams_users_direct', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '直属人数团队']) - ->addColumn('teams_users_indirect', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '间接人数团队']) - ->addColumn('order_amount_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单交易统计']) - ->addColumn('teams_amount_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '二级团队业绩']) - ->addColumn('teams_amount_direct', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '直属团队业绩']) - ->addColumn('teams_amount_indirect', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '间接团队业绩']) - ->addColumn('remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '用户备注描述']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '用户状态(1正常,0已黑)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '注册时间']) - ->addIndex('status', ['name' => 'idx_data_user_status']) - ->addIndex('deleted', ['name' => 'idx_data_user_deleted']) - ->addIndex('openid1', ['name' => 'idx_data_user_openid1']) - ->addIndex('openid2', ['name' => 'idx_data_user_openid2']) - ->addIndex('unionid', ['name' => 'idx_data_user_unionid']) - ->addIndex('pid1', ['name' => 'idx_data_user_pid1']) - ->addIndex('pid2', ['name' => 'idx_data_user_pid2']) - ->addIndex('pid0', ['name' => 'idx_data_user_pid0']) - ->addIndex('pids', ['name' => 'idx_data_user_pids']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserAddress - * @table data_user_address - * @return void - */ - private function _create_data_user_address() - { - - // 当前数据表 - $table = 'data_user_address'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-地址', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '地址类型(0普通,1默认)']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '地址编号']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '收货姓名']) - ->addColumn('phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '收货手机']) - ->addColumn('idcode', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '身体证号']) - ->addColumn('idimg1', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '身份证正面']) - ->addColumn('idimg2', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '身份证反面']) - ->addColumn('province', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '地址-省份']) - ->addColumn('city', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '地址-城市']) - ->addColumn('area', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '地址-区域']) - ->addColumn('address', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '地址-详情']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_data_user_address_type']) - ->addIndex('code', ['name' => 'idx_data_user_address_code']) - ->addIndex('deleted', ['name' => 'idx_data_user_address_deleted']) - ->addIndex('uuid', ['name' => 'idx_data_user_address_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserBalance - * @table data_user_balance - * @return void - */ - private function _create_data_user_balance() - { - - // 当前数据表 - $table = 'data_user_balance'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-余额', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '充值编号']) - ->addColumn('name', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '充值名称']) - ->addColumn('remark', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '充值备注']) - ->addColumn('amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '充值金额']) - ->addColumn('upgrade', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '强制升级']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_by', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '系统用户']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_data_user_balance_code']) - ->addIndex('deleted', ['name' => 'idx_data_user_balance_deleted']) - ->addIndex('uuid', ['name' => 'idx_data_user_balance_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserLogger - * @table data_user_logger - * @return void - */ - private function _create_data_user_logger() - { - - // 当前数据表 - $table = 'data_user_logger'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-会员', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '登录用户']) - ->addColumn('phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '用户手机']) - ->addColumn('regon_ip', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '登录地址']) - ->addColumn('region_prov', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '所有省份']) - ->addColumn('region_city', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '所在城市']) - ->addColumn('region_area', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '所在区间']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '注册时间']) - ->addIndex('uuid', ['name' => 'idx_data_user_logger_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserMessage - * @table data_user_message - * @return void - */ - private function _create_data_user_message() - { - - // 当前数据表 - $table = 'data_user_message'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-短信', - ]) - ->addColumn('type', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '短信类型']) - ->addColumn('msgid', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '消息编号']) - ->addColumn('phone', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '目标手机']) - ->addColumn('region', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '国家编号']) - ->addColumn('result', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '返回结果']) - ->addColumn('content', 'string', ['limit' => 512, 'default' => '', 'null' => true, 'comment' => '短信内容']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '短信状态(0失败,1成功)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_data_user_message_type']) - ->addIndex('status', ['name' => 'idx_data_user_message_status']) - ->addIndex('phone', ['name' => 'idx_data_user_message_phone']) - ->addIndex('msgid', ['name' => 'idx_data_user_message_msgid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserPayment - * @table data_user_payment - * @return void - */ - private function _create_data_user_payment() - { - - // 当前数据表 - $table = 'data_user_payment'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-支付', - ]) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '订单单号']) - ->addColumn('order_name', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '订单描述']) - ->addColumn('order_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单金额']) - ->addColumn('payment_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '支付编号']) - ->addColumn('payment_type', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '支付通道']) - ->addColumn('payment_trade', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '支付单号']) - ->addColumn('payment_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '支付状态']) - ->addColumn('payment_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '支付金额']) - ->addColumn('payment_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '支付时间']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('order_no', ['name' => 'idx_data_user_payment_order_no']) - ->addIndex('payment_code', ['name' => 'idx_data_user_payment_payment_code']) - ->addIndex('payment_type', ['name' => 'idx_data_user_payment_payment_type']) - ->addIndex('payment_trade', ['name' => 'idx_data_user_payment_payment_trade']) - ->addIndex('payment_status', ['name' => 'idx_data_user_payment_payment_status']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserRebate - * @table data_user_rebate - * @return void - */ - private function _create_data_user_rebate() - { - - // 当前数据表 - $table = 'data_user_rebate'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-返利', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('date', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '奖励日期']) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '奖励编号']) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '奖励类型']) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '奖励名称']) - ->addColumn('amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '奖励数量']) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '订单单号']) - ->addColumn('order_uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '订单用户']) - ->addColumn('order_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单金额']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '生效状态(0未生效,1已生效)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删除,1已删除)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('type', ['name' => 'idx_data_user_rebate_type']) - ->addIndex('date', ['name' => 'idx_data_user_rebate_date']) - ->addIndex('code', ['name' => 'idx_data_user_rebate_code']) - ->addIndex('name', ['name' => 'idx_data_user_rebate_name']) - ->addIndex('status', ['name' => 'idx_data_user_rebate_status']) - ->addIndex('uuid', ['name' => 'idx_data_user_rebate_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserToken - * @table data_user_token - * @return void - */ - private function _create_data_user_token() - { - - // 当前数据表 - $table = 'data_user_token'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-认证', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '授权类型']) - ->addColumn('time', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '有效时间']) - ->addColumn('token', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '授权令牌']) - ->addColumn('tokenv', 'string', ['limit' => 32, 'default' => '', 'null' => true, 'comment' => '授权验证']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('uuid', ['name' => 'idx_data_user_token_uuid']) - ->addIndex('type', ['name' => 'idx_data_user_token_type']) - ->addIndex('time', ['name' => 'idx_data_user_token_time']) - ->addIndex('token', ['name' => 'idx_data_user_token_token']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class DataUserTransfer - * @table data_user_transfer - * @return void - */ - private function _create_data_user_transfer() - { - - // 当前数据表 - $table = 'data_user_transfer'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '数据-用户-提现', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户UID']) - ->addColumn('type', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '提现方式']) - ->addColumn('date', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '提现日期']) - ->addColumn('code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '提现单号']) - ->addColumn('appid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号APPID']) - ->addColumn('openid', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '公众号OPENID']) - ->addColumn('charge_rate', 'decimal', ['precision' => 20, 'scale' => 4, 'default' => '0.0000', 'null' => true, 'comment' => '提现手续费比例']) - ->addColumn('charge_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '提现手续费金额']) - ->addColumn('amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '提现转账金额']) - ->addColumn('qrcode', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '收款码图片地址']) - ->addColumn('bank_wseq', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '微信银行编号']) - ->addColumn('bank_name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '开户银行名称']) - ->addColumn('bank_bran', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '开户分行名称']) - ->addColumn('bank_user', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '开户账号姓名']) - ->addColumn('bank_code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '开户银行卡号']) - ->addColumn('alipay_user', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '支付宝姓名']) - ->addColumn('alipay_code', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '支付宝账号']) - ->addColumn('remark', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '提现描述']) - ->addColumn('trade_no', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '交易单号']) - ->addColumn('trade_time', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '打款时间']) - ->addColumn('change_time', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '处理时间']) - ->addColumn('change_desc', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '处理描述']) - ->addColumn('audit_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '审核状态']) - ->addColumn('audit_remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '审核描述']) - ->addColumn('audit_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '审核时间']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '提现状态(0失败,1待审核,2已审核,3打款中,4已打款,5已收款)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_data_user_transfer_code']) - ->addIndex('status', ['name' => 'idx_data_user_transfer_status']) - ->addIndex('date', ['name' => 'idx_data_user_transfer_date']) - ->addIndex('type', ['name' => 'idx_data_user_transfer_type']) - ->addIndex('audit_status', ['name' => 'idx_data_user_transfer_audit_status']) - ->addIndex('appid', ['name' => 'idx_data_user_transfer_appid']) - ->addIndex('openid', ['name' => 'idx_data_user_transfer_openid']) - ->addIndex('uuid', ['name' => 'idx_data_user_transfer_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoods - * @table shop_goods - * @return void - */ - private function _create_shop_goods() - { - - // 当前数据表 - $table = 'shop_goods'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-内容', - ]) - ->addColumn('code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品编号']) - ->addColumn('name', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '商品名称']) - ->addColumn('marks', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '商品标签']) - ->addColumn('cateids', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '分类编号']) - ->addColumn('cover', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '商品封面']) - ->addColumn('slider', 'text', ['default' => null, 'null' => true, 'comment' => '轮播图片']) - ->addColumn('remark', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '商品描述']) - ->addColumn('content', 'text', ['default' => null, 'null' => true, 'comment' => '商品详情']) - ->addColumn('payment', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '支付方式']) - ->addColumn('data_specs', 'text', ['default' => null, 'null' => true, 'comment' => '商品规格(JSON)']) - ->addColumn('data_items', 'text', ['default' => null, 'null' => true, 'comment' => '商品规格(JSON)']) - ->addColumn('stock_total', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商品库存统计']) - ->addColumn('stock_sales', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商品销售统计']) - ->addColumn('stock_virtual', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商品虚拟销量']) - ->addColumn('price_selling', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '最低销售价格']) - ->addColumn('price_market', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '最低市场价格']) - ->addColumn('discount_id', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '折扣方案编号']) - ->addColumn('truck_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '物流运费模板']) - ->addColumn('truck_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '物流配送(0无需配送,1需要配送)']) - ->addColumn('rebate_type', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '参与返利(0无需返利,1需要返利)']) - ->addColumn('vip_entry', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '入会礼包(0非入会礼包,1是入会礼包)']) - ->addColumn('vip_upgrade', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '购买升级等级(0不升级,其他升级)']) - ->addColumn('limit_low_vip', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '限制最低等级(0不限制,其他限制)']) - ->addColumn('limit_max_num', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '最大购买数量(0不限制,其他限制)']) - ->addColumn('num_read', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '访问阅读统计']) - ->addColumn('state_hot', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '设置热度标签']) - ->addColumn('state_home', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '设置首页推荐']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '列表排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '商品状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('code', ['name' => 'idx_shop_goods_code']) - ->addIndex('status', ['name' => 'idx_shop_goods_status']) - ->addIndex('deleted', ['name' => 'idx_shop_goods_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoodsCate - * @table shop_goods_cate - * @return void - */ - private function _create_shop_goods_cate() - { - - // 当前数据表 - $table = 'shop_goods_cate'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-分类', - ]) - ->addColumn('pid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '上级分类']) - ->addColumn('name', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '分类名称']) - ->addColumn('cover', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '分类图标']) - ->addColumn('remark', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '分类描述']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '使用状态']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('sort', ['name' => 'idx_shop_goods_cate_sort']) - ->addIndex('status', ['name' => 'idx_shop_goods_cate_status']) - ->addIndex('deleted', ['name' => 'idx_shop_goods_cate_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoodsItem - * @table shop_goods_item - * @return void - */ - private function _create_shop_goods_item() - { - - // 当前数据表 - $table = 'shop_goods_item'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-规格', - ]) - ->addColumn('goods_sku', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品SKU']) - ->addColumn('goods_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品编号']) - ->addColumn('goods_spec', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '商品规格']) - ->addColumn('stock_sales', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '销售数量']) - ->addColumn('stock_total', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商品库存']) - ->addColumn('price_selling', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '销售价格']) - ->addColumn('price_market', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '市场价格']) - ->addColumn('number_virtual', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '虚拟销量']) - ->addColumn('number_express', 'integer', ['limit' => 20, 'default' => 1, 'null' => true, 'comment' => '配送计件']) - ->addColumn('reward_balance', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '奖励余额']) - ->addColumn('reward_integral', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '奖励积分']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '商品状态']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('goods_code', ['name' => 'idx_shop_goods_item_goods_code']) - ->addIndex('goods_spec', ['name' => 'idx_shop_goods_item_goods_spec']) - ->addIndex('status', ['name' => 'idx_shop_goods_item_status']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoodsMark - * @table shop_goods_mark - * @return void - */ - private function _create_shop_goods_mark() - { - - // 当前数据表 - $table = 'shop_goods_mark'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-标签', - ]) - ->addColumn('name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '标签名称']) - ->addColumn('remark', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '标签描述']) - ->addColumn('sort', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '排序权重']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '标签状态(1使用,0禁用)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('sort', ['name' => 'idx_shop_goods_mark_sort']) - ->addIndex('status', ['name' => 'idx_shop_goods_mark_status']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopGoodsStock - * @table shop_goods_stock - * @return void - */ - private function _create_shop_goods_stock() - { - - // 当前数据表 - $table = 'shop_goods_stock'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-商品-库存', - ]) - ->addColumn('batch_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '操作批量']) - ->addColumn('goods_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品编号']) - ->addColumn('goods_spec', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '商品规格']) - ->addColumn('goods_stock', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '入库数量']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '数据状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_shop_goods_stock_status']) - ->addIndex('deleted', ['name' => 'idx_shop_goods_stock_deleted']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopOrder - * @table shop_order - * @return void - */ - private function _create_shop_order() - { - - // 当前数据表 - $table = 'shop_order'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-订单-内容', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '下单用户编号']) - ->addColumn('puid1', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '推荐一层用户']) - ->addColumn('puid2', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '推荐二层用户']) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商品订单单号']) - ->addColumn('amount_real', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单实际金额']) - ->addColumn('amount_total', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '订单统计金额']) - ->addColumn('amount_goods', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品统计金额']) - ->addColumn('amount_reduct', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '随机减免金额']) - ->addColumn('amount_express', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '快递费用金额']) - ->addColumn('amount_discount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '折扣后的金额']) - ->addColumn('payment_type', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '实际支付平台']) - ->addColumn('payment_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '实际通道编号']) - ->addColumn('payment_allow', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '允许支付通道']) - ->addColumn('payment_trade', 'string', ['limit' => 80, 'default' => '', 'null' => true, 'comment' => '实际支付单号']) - ->addColumn('payment_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '实际支付状态']) - ->addColumn('payment_image', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '支付凭证图片']) - ->addColumn('payment_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '实际支付金额']) - ->addColumn('payment_balance', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '余额抵扣金额']) - ->addColumn('payment_remark', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '支付结果描述']) - ->addColumn('payment_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '支付到账时间']) - ->addColumn('number_goods', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '订单商品数量']) - ->addColumn('number_express', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '订单快递计数']) - ->addColumn('truck_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '物流配送类型(0无需配送,1需要配送)']) - ->addColumn('rebate_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '参与返利金额']) - ->addColumn('reward_balance', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '奖励账户余额']) - ->addColumn('order_remark', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '订单用户备注']) - ->addColumn('cancel_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '订单取消状态']) - ->addColumn('cancel_remark', 'string', ['limit' => 200, 'default' => '', 'null' => true, 'comment' => '订单取消描述']) - ->addColumn('cancel_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '订单取消时间']) - ->addColumn('deleted_status', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '订单删除状态(0未删,1已删)']) - ->addColumn('deleted_remark', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '订单删除描述']) - ->addColumn('deleted_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '订单删除时间']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '订单流程状态(0已取消,1预订单,2待支付,3支付中,4已支付,5已发货,6已完成)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '订单创建时间']) - ->addIndex('status', ['name' => 'idx_shop_order_status']) - ->addIndex('order_no', ['name' => 'idx_shop_order_order_no']) - ->addIndex('cancel_status', ['name' => 'idx_shop_order_cancel_status']) - ->addIndex('payment_status', ['name' => 'idx_shop_order_payment_status']) - ->addIndex('puid1', ['name' => 'idx_shop_order_puid1']) - ->addIndex('deleted_status', ['name' => 'idx_shop_order_deleted_status']) - ->addIndex('uuid', ['name' => 'idx_shop_order_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopOrderItem - * @table shop_order_item - * @return void - */ - private function _create_shop_order_item() - { - - // 当前数据表 - $table = 'shop_order_item'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-订单-商品', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商城用户编号']) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商城订单单号']) - ->addColumn('goods_sku', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商城商品SKU']) - ->addColumn('goods_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商城商品编号']) - ->addColumn('goods_spec', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '商城商品规格']) - ->addColumn('goods_name', 'string', ['limit' => 250, 'default' => '', 'null' => true, 'comment' => '商城商品名称']) - ->addColumn('goods_cover', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '商品封面图片']) - ->addColumn('goods_payment', 'string', ['limit' => 999, 'default' => '', 'null' => true, 'comment' => '指定支付通道']) - ->addColumn('price_market', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品市场单价']) - ->addColumn('price_selling', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品销售单价']) - ->addColumn('total_market', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品市场总价']) - ->addColumn('total_selling', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品销售总价']) - ->addColumn('reward_balance', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品奖励余额']) - ->addColumn('reward_integral', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品奖励积分']) - ->addColumn('stock_sales', 'integer', ['limit' => 20, 'default' => 1, 'null' => true, 'comment' => '包含商品数量']) - ->addColumn('vip_name', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '用户等级名称']) - ->addColumn('vip_code', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '用户等级序号']) - ->addColumn('vip_entry', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '是否入会礼包(0非礼包,1是礼包)']) - ->addColumn('vip_upgrade', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '升级用户等级']) - ->addColumn('truck_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '物流配送类型(0虚物,1实物)']) - ->addColumn('truck_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '快递邮费模板']) - ->addColumn('truck_number', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '快递计费基数']) - ->addColumn('rebate_type', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '参与返利状态(0不返,1返利)']) - ->addColumn('rebate_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '参与返利金额']) - ->addColumn('discount_id', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '优惠方案编号']) - ->addColumn('discount_rate', 'decimal', ['precision' => 20, 'scale' => 6, 'default' => '100.000000', 'null' => true, 'comment' => '销售价格折扣']) - ->addColumn('discount_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '商品优惠金额']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '商品状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '订单创建时间']) - ->addIndex('status', ['name' => 'idx_shop_order_item_status']) - ->addIndex('deleted', ['name' => 'idx_shop_order_item_deleted']) - ->addIndex('order_no', ['name' => 'idx_shop_order_item_order_no']) - ->addIndex('goods_sku', ['name' => 'idx_shop_order_item_goods_sku']) - ->addIndex('goods_code', ['name' => 'idx_shop_order_item_goods_code']) - ->addIndex('goods_spec', ['name' => 'idx_shop_order_item_goods_spec']) - ->addIndex('rebate_type', ['name' => 'idx_shop_order_item_rebate_type']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - - /** - * 创建数据对象 - * @class ShopOrderSend - * @table shop_order_send - * @return void - */ - private function _create_shop_order_send() - { - - // 当前数据表 - $table = 'shop_order_send'; - - // 存在则跳过 - if ($this->hasTable($table)) return; - - // 创建数据表 - $this->table($table, [ - 'engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => '商城-订单-配送', - ]) - ->addColumn('uuid', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '商城用户编号']) - ->addColumn('order_no', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '商城订单单号']) - ->addColumn('address_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '配送地址编号']) - ->addColumn('address_name', 'string', ['limit' => 50, 'default' => '', 'null' => true, 'comment' => '配送收货人姓名']) - ->addColumn('address_phone', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '配送收货人手机']) - ->addColumn('address_idcode', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '配送收货人证件号码']) - ->addColumn('address_idimg1', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '配送收货人证件正面']) - ->addColumn('address_idimg2', 'string', ['limit' => 500, 'default' => '', 'null' => true, 'comment' => '配送收货人证件反面']) - ->addColumn('address_province', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '配送地址的省份']) - ->addColumn('address_city', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '配送地址的城市']) - ->addColumn('address_area', 'string', ['limit' => 30, 'default' => '', 'null' => true, 'comment' => '配送地址的区域']) - ->addColumn('address_content', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '配送的详细地址']) - ->addColumn('address_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '地址确认时间']) - ->addColumn('template_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '配送模板编号']) - ->addColumn('template_count', 'integer', ['limit' => 20, 'default' => 0, 'null' => true, 'comment' => '快递计费基数']) - ->addColumn('template_remark', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '配送计算描述']) - ->addColumn('template_amount', 'decimal', ['precision' => 20, 'scale' => 2, 'default' => '0.00', 'null' => true, 'comment' => '配送计算金额']) - ->addColumn('company_code', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '快递公司编码']) - ->addColumn('company_name', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '快递公司名称']) - ->addColumn('send_number', 'string', ['limit' => 100, 'default' => '', 'null' => true, 'comment' => '快递运送单号']) - ->addColumn('send_remark', 'string', ['limit' => 255, 'default' => '', 'null' => true, 'comment' => '快递发送备注']) - ->addColumn('send_datetime', 'string', ['limit' => 20, 'default' => '', 'null' => true, 'comment' => '快递发送时间']) - ->addColumn('status', 'integer', ['limit' => 1, 'default' => 1, 'null' => true, 'comment' => '发货商品状态(1使用,0禁用)']) - ->addColumn('deleted', 'integer', ['limit' => 1, 'default' => 0, 'null' => true, 'comment' => '发货删除状态(0未删,1已删)']) - ->addColumn('create_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'null' => true, 'comment' => '创建时间']) - ->addIndex('status', ['name' => 'idx_shop_order_send_status']) - ->addIndex('deleted', ['name' => 'idx_shop_order_send_deleted']) - ->addIndex('order_no', ['name' => 'idx_shop_order_send_order_no']) - ->addIndex('uuid', ['name' => 'idx_shop_order_send_uuid']) - ->save(); - - // 修改主键长度 - $this->table($table)->changeColumn('id', 'integer', ['limit' => 20, 'identity' => true]); - } - -} diff --git a/database/migrations/20221013045839_install_user_data.php b/database/migrations/20221013045839_install_user_data.php deleted file mode 100644 index f6ce2c5ec..000000000 --- a/database/migrations/20221013045839_install_user_data.php +++ /dev/null @@ -1,72 +0,0 @@ -insertMenu(); - } - - /** - * 创建菜单 - * @return void - */ - protected function insertMenu() - { - PhinxExtend::write2menu([ - [ - 'name' => '控制台', - 'sort' => '300', - 'subs' => [ - [ - 'name' => '数据管理', - 'subs' => [ - ['name' => '数据统计报表', 'icon' => 'layui-icon layui-icon-theme', 'node' => 'data/total.portal/index'], - ['name' => '轮播图片管理', 'icon' => 'layui-icon layui-icon-carousel', 'node' => 'data/base.slider/index'], - ['name' => '页面内容管理', 'icon' => 'layui-icon layui-icon-read', 'node' => 'data/base.pager/index'], - ['name' => '文章内容管理', 'icon' => 'layui-icon layui-icon-template', 'node' => 'data/news.item/index'], - ['name' => '支付参数管理', 'icon' => 'layui-icon layui-icon-rmb', 'node' => 'data/base.payment/index'], - ['name' => '系统通知管理', 'icon' => 'layui-icon layui-icon-notice', 'node' => 'data/base.message/index'], - ['name' => '微信小程序配置', 'icon' => 'layui-icon layui-icon-set', 'node' => 'data/base.config/wxapp'], - ['name' => '邀请二维码设置', 'icon' => 'layui-icon layui-icon-cols', 'node' => 'data/base.config/cropper'], - ], - ], - [ - 'name' => '用户管理', - 'subs' => [ - ['name' => '会员用户管理', 'icon' => 'layui-icon layui-icon-user', 'node' => 'data/user.admin/index'], - ['name' => '余额充值管理', 'icon' => 'layui-icon layui-icon-rmb', 'node' => 'data/user.balance/index'], - ['name' => '用户返利管理', 'icon' => 'layui-icon layui-icon-transfer', 'node' => 'data/user.rebate/index'], - ['name' => '用户提现管理', 'icon' => 'layui-icon layui-icon-component', 'node' => 'data/user.transfer/index'], - ['name' => '用户等级管理', 'icon' => 'layui-icon layui-icon-senior', 'node' => 'data/base.upgrade/index'], - ['name' => '用户折扣方案', 'icon' => 'layui-icon layui-icon-set', 'node' => 'data/base.discount/index'], - ], - ], - [ - 'name' => '商城管理', - 'subs' => [ - ['name' => '商品数据管理', 'icon' => 'layui-icon layui-icon-star', 'node' => 'data/shop.goods/index'], - ['name' => '商品分类管理', 'icon' => 'layui-icon layui-icon-tabs', 'node' => 'data/shop.cate/index'], - ['name' => '订单数据管理', 'icon' => 'layui-icon layui-icon-template', 'node' => 'data/shop.order/index'], - ['name' => '订单发货管理', 'icon' => 'layui-icon layui-icon-transfer', 'node' => 'data/shop.send/index'], - ['name' => '快递公司管理', 'icon' => 'layui-icon layui-icon-website', 'node' => 'data/base.postage.company/index'], - ['name' => '邮费模板管理', 'icon' => 'layui-icon layui-icon-template-1', 'node' => 'data/base.postage.template/index'], - ], - ], - ], - ], - ], ['node' => 'data/user.admin/index']); - } -} diff --git a/database/migrations/20221013045840_install_user_region.php b/database/migrations/20221013045840_install_user_region.php deleted file mode 100644 index 85dec6d56..000000000 --- a/database/migrations/20221013045840_install_user_region.php +++ /dev/null @@ -1,3784 +0,0 @@ -installRegion(); - } - - /** - * 写入默认区域数据 - * @return void - * @throws \think\db\exception\DbException - */ - private function installRegion() - { - // 检查数据 - $table = 'base_postage_region'; - $result = $this->fetchRow("select count(1) _count from $table"); - if (isset($result['_count']) && $result['_count'] > 0) return; - - // 写入数据 - $this->execute(<< - Options +FollowSymlinks -Multiviews - RewriteEngine On - - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] - \ No newline at end of file diff --git a/public/index.php b/public/index.php deleted file mode 100644 index a7a0d2715..000000000 --- a/public/index.php +++ /dev/null @@ -1,25 +0,0 @@ - 0 ? rule.replace('{key}', array.join(',')) : ''; - })(elem.dataset.rule || '', []) || ''; - if (value.length < 1) return $.msg.tips('请选择需要更改的数据!'), false; - value.split(';').forEach(function (item) { - data[item.split('#')[0]] = item.split('#')[1]; - }); - return onConfirm(elem.dataset.confirm, function () { - return callabel.call(elem, data); - }); - } else { - return onConfirm(elem.dataset.confirm, function () { - return callabel.call(elem, data); - }); - } - } - - /*! 消息组件实例 */ - $.msg = new function () { - this.idx = [], this.mdx = [], this.shade = [0.02, '#000000']; - /*! 关闭最新窗口 */ - this.closeLastModal = function () { - while ($.msg.mdx.length > 0 && (this.tdx = $.msg.mdx.pop()) > 0) { - if ($('#layui-layer' + this.tdx).size()) return layer.close(this.tdx); - } - }; - /*! 关闭消息框 */ - this.close = function (idx) { - if (idx !== null) return layer.close(idx); - for (var i in this.idx) $.msg.close(this.idx[i]); - this.idx = []; - }; - /*! 弹出警告框 */ - this.alert = function (msg, call) { - var idx = layer.alert(msg, {end: call, scrollbar: false}); - return $.msg.idx.push(idx), idx; - }; - /*! 显示成功类型的消息 */ - this.success = function (msg, time, call) { - var idx = layer.msg(msg, {icon: 1, shade: this.shade, scrollbar: false, end: call, time: (time || 2) * 1000, shadeClose: true}); - return $.msg.idx.push(idx), idx; - }; - /*! 显示失败类型的消息 */ - this.error = function (msg, time, call) { - var idx = layer.msg(msg, {icon: 2, shade: this.shade, scrollbar: false, time: (time || 3) * 1000, end: call, shadeClose: true}); - return $.msg.idx.push(idx), idx; - }; - /*! 状态消息提示 */ - this.tips = function (msg, time, call) { - var idx = layer.msg(msg, {time: (time || 3) * 1000, shade: this.shade, end: call, shadeClose: true}); - return $.msg.idx.push(idx), idx; - }; - /*! 显示加载提示 */ - this.loading = function (msg, call) { - var idx = msg ? layer.msg(msg, {icon: 16, scrollbar: false, shade: this.shade, time: 0, end: call}) : layer.load(0, {time: 0, scrollbar: false, shade: this.shade, end: call}); - return $.msg.idx.push(idx), idx; - }; - /*! Notify 调用入口 */ - // https://www.jq22.com/demo/jquerygrowl-notification202104021049 - this.notify = function (title, msg, time, option) { - require(['notify'], function (Notify) { - Notify.notify(Object.assign({title: title || '', description: msg || '', position: 'top-right', closeTimeout: time || 3000}, (option || {}))); - }); - }; - /*! 页面加载层 */ - this.page = new function () { - this.$body = $('body>.think-page-loader'); - this.$main = $('.think-page-body+.think-page-loader'); - this.stat = function () { - return this.$body.is(':visible'); - }, this.done = function () { - $.msg.page.$body.fadeOut(); - }, this.show = function () { - this.stat() || this.$main.removeClass('layui-hide').show(); - }, this.hide = function () { - if (this.time) clearTimeout(this.time); - this.time = setTimeout(function () { - ($.msg.page.time = 0) || $.msg.page.$main.fadeOut(); - }, 200); - }; - }; - /*! 确认对话框 */ - this.confirm = function (msg, ok, no) { - return layer.confirm(msg, {title: '操作确认', btn: ['确认', '取消']}, function (idx) { - (typeof ok === 'function' && ok.call(this, idx)), $.msg.close(idx); - }, function (idx) { - (typeof no === 'function' && no.call(this, idx)), $.msg.close(idx); - }); - }; - /*! 自动处理JSON数据 */ - this.auto = function (ret, time) { - var url = ret.url || (typeof ret.data === 'string' ? ret.data : ''); - var msg = ret.msg || (typeof ret.info === 'string' ? ret.info : ''); - if (parseInt(ret.code) === 1 && time === 'false') { - return url ? $.form.goto(url) : $.form.reload(); - } else return (parseInt(ret.code) === 1) ? this.success(msg, time, function () { - $.msg.closeLastModal(url ? $.form.goto(url) : $.form.reload()); - }) : this.error(msg, 3, function () { - $.form.goto(url); - }); - }; - }; - - /*! 表单自动化组件 */ - $.form = new function () { - /*! 内容区选择器 */ - this.selecter = '.layui-layout-admin>.layui-body>.think-page-body'; - /*! 刷新当前页面 */ - this.reload = function (force) { - if (force) return top.location.reload(); - if (self !== top) return location.reload(); - return $.menu.href(location.hash); - }; - /*! 内容区域动态加载后初始化 */ - this.reInit = function ($dom) { - layui.form.render(), layui.element.render(), $(window).trigger('scroll'); - $.vali.listen($dom = $dom || $(this.selecter)), $body.trigger('reInit', $dom); - return $dom.find('[required]').map(function () { - this.$parent = $(this).parent(); - if (this.$parent.is('label')) this.$parent.addClass('label-required-prev'); else this.$parent.prevAll('label.layui-form-label').addClass('label-required-next'); - }), $dom.find('[data-lazy-src]:not([data-lazy-loaded])').map(function () { - if (this.dataset.lazyLoaded === 'true') return; else this.dataset.lazyLoaded = 'true'; - if (this.nodeName === 'IMG') this.src = this.dataset.lazySrc; else this.style.backgroundImage = 'url(' + this.dataset.lazySrc + ')'; - }), $dom.find('input[data-date-range]').map(function () { - this.setAttribute('autocomplete', 'off'), laydate.render({ - type: this.dataset.dateRange || 'date', range: true, elem: this, done: function (value) { - $(this.elem).val(value).trigger('change'); - } - }); - }), $dom.find('input[data-date-input]').map(function () { - this.setAttribute('autocomplete', 'off'), laydate.render({ - type: this.dataset.dateInput || 'date', range: false, elem: this, done: function (value) { - $(this.elem).val(value).trigger('change'); - } - }); - }), $dom; - }; - /*! 在内容区显示视图 */ - this.show = function (html) { - $.form.reInit($(this.selecter).html(html)); - }; - /*! 异步加载的数据 */ - this.load = function (url, data, method, callable, loading, tips, time, headers) { - // 如果主页面 loader 显示中,绝对不显示 loading 图标 - loading = $('.layui-page-loader').is(':visible') ? false : loading; - var loadidx = loading !== false ? $.msg.loading(tips) : 0; - if (typeof data === 'object' && typeof data['_token_'] === 'string') { - headers = headers || {}, headers['User-Form-Token'] = data['_token_'], delete data['_token_']; - } - $.ajax({ - data: data || {}, type: method || 'GET', url: $.menu.parseUri(url), beforeSend: function (xhr, i) { - if (typeof Pace === 'object' && loading !== false) Pace.restart(); - if (typeof headers === 'object') for (i in headers) xhr.setRequestHeader(i, headers[i]); - }, error: function (XMLHttpRequest, $dialog, layIdx, iframe) { - // 异常消息显示处理 - if (parseInt(XMLHttpRequest.status) !== 200 && XMLHttpRequest.responseText.indexOf('Call Stack') > -1) try { - layIdx = layer.open({title: XMLHttpRequest.status + ' - ' + XMLHttpRequest.statusText, type: 2, move: false, content: 'javascript:;'}); - layer.full(layIdx), $dialog = $('#layui-layer' + layIdx), iframe = $dialog.find('iframe').get(0); - (iframe.contentDocument || iframe.contentWindow.document).write(XMLHttpRequest.responseText); - iframe.winClose = {width: '30px', height: '30px', lineHeight: '30px', fontSize: '30px', marginLeft: 0}; - iframe.winTitle = {color: 'red', height: '60px', lineHeight: '60px', fontSize: '20px', textAlign: 'center', fontWeight: 700}; - $dialog.find('.layui-layer-title').css(iframe.winTitle) && $dialog.find('.layui-layer-setwin').css(iframe.winClose).find('span').css(iframe.winClose); - setTimeout(function () { - $(iframe).height($dialog.height() - 60); - }, 100); - } catch (e) { - layer.close(layIdx); - } - layer.closeAll('loading'); - if (parseInt(XMLHttpRequest.status) !== 200) { - $.msg.tips('E' + XMLHttpRequest.status + ' - 服务器繁忙,请稍候再试!'); - } else { - this.success(XMLHttpRequest.responseText); - } - }, success: function (ret) { - time = time || ret.wait || undefined; - if (typeof callable === 'function' && callable.call($.form, ret, time) === false) return false; - return typeof ret === 'object' ? $.msg.auto(ret, time) : $.form.show(ret); - }, complete: function () { - $.msg.page.done(); - $.msg.close(loadidx); - } - }); - }; - /*! 兼容跳转与执行 */ - this.goto = function (url) { - if (typeof url !== 'string' || url.length < 1) return; - if (url.toLocaleString().indexOf('javascript:') === 0) { - return eval(url.split('javascript:', 2)[1]); - } else { - return location.href = url; - } - }; - /*! 以 HASH 打开新网页 */ - this.href = function (url, elem) { - this.isMenu = elem && elem.dataset.menuNode; - if (this.isMenu) layui.sessionData('pages', null); - if (url !== '#') return location.hash = $.menu.parseUri(url, elem); - if (this.isMenu) return $('[data-menu-node^="' + elem.dataset.menuNode + '-"]:first').trigger('click'); - }; - /*! 加载 HTML 到 BODY 位置 */ - this.open = function (url, data, call, load, tips) { - this.load(url, data, 'get', function (ret) { - return (typeof ret === 'object' ? $.msg.auto(ret) : $.form.show(ret)), false; - }, load, tips); - }; - /*! 打开 IFRAME 窗口 */ - this.iframe = function (url, name, area, offset, destroy, success, isfull) { - this.idx = layer.open({title: name || '窗口', type: 2, area: area || ['800px', '580px'], end: destroy || null, offset: offset, fixed: true, maxmin: false, content: url, success: success}); - return isfull && layer.full(this.idx), this.idx; - }; - /*! 加载 HTML 到弹出层 */ - this.modal = function (url, data, name, call, load, tips, area, offset, isfull) { - this.load(url, data, 'GET', function (res) { - if (typeof res === 'object') return $.msg.auto(res), false; - return $.msg.mdx.push(this.idx = layer.open({ - type: 1, btn: false, area: area || "800px", resize: false, content: res, title: name || '', offset: offset || 'auto', success: function ($dom, idx) { - typeof call === 'function' && call.call($.form, $dom); - $.form.reInit($dom.off('click', '[data-close]').on('click', '[data-close]', function () { - onConfirm(this.dataset.confirm, function () { - layer.close(idx); - }); - })); - } - })), isfull && layer.full(this.idx), false; - }, load, tips); - }; - }; - - /*! 后台菜单辅助插件 */ - $.menu = new function () { - /*! 计算 URL 地址中有效的 URI */ - this.getUri = function (uri) { - uri = uri || location.href; - uri = uri.indexOf(location.host) > -1 ? uri.split(location.host)[1] : uri; - return (uri.indexOf('#') > -1 ? uri.split('#')[1] : uri).split('?')[0]; - }; - /*! 通过 URI 查询最佳菜单 NODE */ - this.queryNode = function (uri, node) { - if (!/^m-/.test(node = node || location.href.replace(/.*spm=([\d\-m]+).*/ig, '$1'))) { - var $menu = $('[data-menu-node][data-open*="' + uri.replace(/\.html$/ig, '') + '"]'); - return $menu.size() ? $menu.get(0).dataset.menuNode : ''; - } - return node; - }; - /*! 完整 URL 转 URI 地址 */ - this.parseUri = function (uri, elem, vars, temp, attrs) { - vars = {}, attrs = [], elem = elem || document.createElement('a'); - if (uri.indexOf('?') > -1) uri.split('?')[1].split('&').forEach(function (item) { - if (item.indexOf('=') > -1 && (temp = item.split('=')) && typeof temp[0] === 'string' && temp[0].length > 0) { - vars[temp[0]] = encodeURIComponent(decodeURIComponent(temp[1].replace(/%2B/ig, '%20'))); - } - }); - uri = this.getUri(uri); - if (typeof vars.spm !== 'string') vars.spm = elem.dataset.menuNode || this.queryNode(uri) || ''; - if (typeof vars.spm !== 'string' || vars.spm.length < 1) delete vars.spm; - for (var i in vars) attrs.push(i + '=' + vars[i]); - return uri + (attrs.length > 0 ? '?' + attrs.join('&') : ''); - }; - /*! 后台菜单动作初始化 */ - this.listen = function () { - var layout = $('.layui-layout-admin'), mclass = 'layui-layout-left-mini'; - /*! 菜单切及MiniTips处理 */ - onEvent('click', '[data-target-menu-type]', function () { - layui.data('AdminMenuType', {key: 'mini', value: layout.toggleClass(mclass).hasClass(mclass)}); - }).on('click', '[data-submenu-layout]>a', function () { - setTimeout("$.menu.sync(1)", 100); - }).on('mouseenter', '[data-target-tips]', function (evt) { - if (!layout.hasClass(mclass) || !this.dataset.targetTips) return; - evt.idx = layer.tips(this.dataset.targetTips, this, {time: 0}); - $(this).mouseleave(function () { - layer.close(evt.idx); - }); - }); - /*! 监听窗口大小及HASH切换 */ - $(window).on('resize', function () { - (layui.data('AdminMenuType')['mini'] || $body.width() < 1000) ? layout.addClass(mclass) : layout.removeClass(mclass); - }).trigger('resize').on('hashchange', function () { - if (/^#(https?:)?(\/\/|\\\\)/.test(location.hash)) return $.msg.tips('禁止访问外部链接!'); - if (location.hash.length < 1) return $body.find('[data-menu-node]:first').trigger('click'); else return $.menu.href(location.hash); - }).trigger('hashchange'); - }; - /*! 同步二级菜单展示状态 */ - this.sync = function (mode) { - $('[data-submenu-layout]').map(function () { - var node = this.dataset.submenuLayout; - if (mode === 1) layui.data('AdminMenuState', {key: node, value: $(this).hasClass('layui-nav-itemed') ? 2 : 1}); else if (mode === 2) (layui.data('AdminMenuState')[node] || 2) === 2 && $(this).addClass('layui-nav-itemed'); - }); - }; - /*! 页面 LOCATION-HASH 跳转 */ - this.href = function (hash, node) { - if ((hash || '').length < 1) return $('[data-menu-node]:first').trigger('click'); - // $.msg.page.show(),$.form.load(hash, {}, 'get', $.msg.page.hide, true),$.menu.sync(2); - $.form.load(hash, {}, 'get', false, !$.msg.page.stat()), $.menu.sync(2); - /*! 菜单选择切换 */ - if (/^m-/.test(node = node || $.menu.queryNode($.menu.getUri()))) { - var arr = node.split('-'), tmp = arr.shift(), $all = $('a[data-menu-node]').parent('.layui-this'); - while (arr.length > 0) { - tmp = tmp + '-' + arr.shift(); - $all = $all.not($('a[data-menu-node="' + tmp + '"]').parent().addClass('layui-this')); - } - $all.removeClass('layui-this'); - /*! 菜单模式切换 */ - if (node.split('-').length > 2) { - var _tmp = node.split('-'), _node = _tmp.shift() + '-' + _tmp.shift(); - $('[data-menu-layout]').not($('[data-menu-layout="' + _node + '"]').removeClass('layui-hide')).addClass('layui-hide'); - $('[data-menu-node="' + node + '"]').parent().parent().parent().addClass('layui-nav-itemed'); - $('.layui-layout-admin').removeClass('layui-layout-left-hide'); - } else { - $('.layui-layout-admin').addClass('layui-layout-left-hide'); - } - setTimeout("$.menu.sync(1);", 100); - } - }; - }; - - /*! 表单验证组件 */ - $.vali = function (form, callable) { - return $(form).data('validate') || new Validate(); - - function Validate() { - var that = this; - /* 绑定表单元素 */ - this.form = $(form); - /* 绑定元素事件, 筛选表单元素 */ - this.evts = 'blur change'; - this.tags = 'input,textarea'; - /* 预设检测规则 */ - this.patterns = { - phone: '^1[3-9][0-9]{9}$', email: '^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$' - }; - /*! 检测属性是否有定义 */ - this.hasProp = function (ele, prop) { - var attrProp = ele.getAttribute(prop); - return typeof attrProp !== 'undefined' && attrProp !== null && attrProp !== false; - }, this.isRegex = function (ele) { - var real = $.trim($(ele).val()); - var regexp = ele.getAttribute('pattern'); - regexp = this.patterns[regexp] || regexp; - if (real === "" || !regexp) return true; - return new RegExp(regexp, 'i').test(real); - }, this.checkAllInput = function () { - var status = true; - return that.form.find(this.tags).each(function () { - if (that.checkInput(this) === false) return $(this).focus(), status = false; - }), status; - }, this.checkInput = function (input) { - if (this.hasProp(input, 'data-auto-none')) return true; - var type = (input.getAttribute('type') || '').replace(/\W+/, "").toLowerCase(); - var ingores = ['file', 'reset', 'image', 'radio', 'checkbox', 'submit', 'hidden']; - if (ingores.length > 0) for (var i in ingores) if (type === ingores[i]) return true; - if (this.hasProp(input, 'required') && $.trim($(input).val()) === '') return this.remind(input); - return this.isRegex(input) ? (this.hideError(input), true) : this.remind(input); - }, this.remind = function (input) { - if (!$(input).is(':visible')) return true; - return this.showError(input, input.getAttribute('title') || input.getAttribute('placeholder') || '输入错误'), false; - }, this.showError = function (ele, tip) { - $(ele).addClass('validate-error'); - this.insertError(ele).addClass('layui-anim-fadein').css({width: 'auto'}).html(tip); - }, this.hideError = function (ele) { - $(ele).removeClass('validate-error'); - this.insertError(ele).removeClass('layui-anim-fadein').css({width: '30px'}).html(''); - }, this.insertError = function (ele) { - if ($(ele).data('input-info')) return $(ele).data('input-info'); - var $html = $(''); - var $next = $(ele).nextAll('.input-right-icon'), right = ($next ? $next.width() + parseFloat($next.css('right') || '0') : 0) + 10; - var style = {top: $(ele).position().top + 'px', right: right + 'px', lineHeight: ele.nodeName === 'TEXTAREA' ? '32px' : $(ele).css('height')}; - return $(ele).data('input-info', $html.css(style).insertAfter(ele)), $html; - }; - /*! 表单元素验证 */ - this.form.attr({onsubmit: 'return false', novalidate: 'novalidate', autocomplete: 'off'}); - this.form.off(this.evts, this.tags).on(this.evts, this.tags, function () { - that.checkInput(this); - }).data('validate', this).bind("submit", function (evt) { - evt.button = that.form.find('button[type=submit],button:not([type=button])'); - /* 检查所有表单元素是否通过H5的规则验证 */ - if (that.checkAllInput() && typeof callable === 'function') { - if (typeof CKEDITOR === 'object' && typeof CKEDITOR.instances === 'object') { - for (var i in CKEDITOR.instances) CKEDITOR.instances[i].updateElement(); - } - /* 触发表单提交后,锁定三秒不能再次提交表单 */ - if (that.form.attr('submit-locked')) return false; - that.form.attr('submit-locked', 1), evt.button.addClass('submit-button-loading'); - callable.call(this, that.form.formToJson(), []), setTimeout(function () { - that.form.removeAttr('submit-locked'), evt.button.removeClass('submit-button-loading'); - }, 3000); - } - return evt.preventDefault(), false; - }).find('[data-form-loaded]').map(function () { - $(this).html(this.dataset.formLoaded || this.innerHTML); - $(this).removeAttr('data-form-loaded').removeClass('layui-disabled'); - }); - } - }; - - /*! 自动监听表单 */ - $.vali.listen = function ($dom, $els) { - $els = $($dom || $body).find('form[data-auto]'); - $dom && $($dom).filter('form[data-auto]') && $els.add($dom); - $els.size() > 0 && $els.map(function (idx, form) { - $(this).vali(function (data) { - var emap = form.dataset, type = form.method || 'POST', href = form.action || location.href; - var tips = emap.tips || undefined, time = emap.time || undefined, taid = emap.tableId || false; - var call = window[emap.callable || '_default_callable'] || (taid ? function (ret) { - if (typeof ret === 'object' && ret.code > 0 && $('#' + taid).size() > 0) { - return $.msg.success(ret.info, 3, function () { - $.msg.closeLastModal(); - (typeof ret.data === 'string' && ret.data) ? $.form.goto(ret.data) : $.layTable.reload(taid); - }) && false; - } - } : undefined); - onConfirm(emap.confirm, function () { - $.form.load(href, data, type, call, true, tips, time); - }); - }); - }); - }; - - /*! 注册对象到JqFn */ - $.fn.vali = function (callable) { - return this.each(function () { - $.vali(this, callable); - }); - }; - - /*! 表单转JSON */ - $.fn.formToJson = function () { - var self = this, data = {}, push = {}; - var rules = {key: /\w+|(?=\[])/g, push: /^$/, fixed: /^\d+$/, named: /^\w+$/}; - this.build = function (base, key, value) { - return (base[key] = value), base; - }, this.pushCounter = function (name) { - if (push[name] === undefined) push[name] = 0; - return push[name]++; - }, $.each($(this).serializeArray(), function () { - var key, keys = this.name.match(rules.key), merge = this.value, name = this.name; - while ((key = keys.pop()) !== undefined) { - name = name.replace(new RegExp("\\[" + key + "\\]$"), ''); - if (key.match(rules.push)) merge = self.build([], self.pushCounter(name), merge); - else if (key.match(rules.fixed)) merge = self.build([], key, merge); - else if (key.match(rules.named)) merge = self.build({}, key, merge); - } - data = $.extend(true, data, merge); - }); - return data; - }; - - /*! 全局文件上传 */ - $.fn.uploadFile = function (callable, initialize) { - return this.each(function (idx, elem) { - if (elem.dataset.inited) return false; else elem.dataset.inited = 'true'; - elem.dataset.multiple = '|one|btn|'.indexOf(elem.dataset.file || 'one') > -1 ? '0' : '1'; - require(['upload'], function (apply) { - apply(elem, callable) && setTimeout(function () { - typeof initialize === 'function' && initialize.call(elem, elem); - }, 100); - }); - }); - }; - - /*! 上传单个视频 */ - $.fn.uploadOneVideo = function () { - return this.each(function () { - if (this.dataset.inited) return; else this.dataset.inited = 'true'; - var $bt = $('
'); - var $in = $(this).on('change', function () { - if (this.value) $bt.css('backgroundImage', 'url("")').find('span[data-file]').html(''); - }).after($bt).trigger('change'); - $bt.on('click', 'i.layui-icon-search', function (event) { - event.stopPropagation(), $in.val() && $.form.iframe(encodeURI($in.val()), '视频预览'); - }).on('click', 'i.layui-icon-close', function (event) { - event.stopPropagation(), $bt.attr('style', '').find('span[data-file]').html('') && $in.val('').trigger('change'); - }).find('[data-file]').data('input', this).attr({ - 'data-path': $in.data('path') || '', 'data-size': $in.data('size') || 0, 'data-type': $in.data('type') || 'mp4', - }); - }); - }; - - /*! 上传单张图片 */ - $.fn.uploadOneImage = function () { - return this.each(function () { - if (this.dataset.inited) return; else this.dataset.inited = 'true'; - var $bt = $('
'); - var $in = $(this).on('change', function () { - if (this.value) $bt.css('backgroundImage', 'url(' + encodeURI(this.value) + ')'); - }).after($bt).trigger('change'); - $bt.on('click', 'i.layui-icon-search', function (event) { - event.stopPropagation(), $in.val() && $.previewImage(encodeURI($in.val())); - }).on('click', 'i.layui-icon-close', function (event) { - event.stopPropagation(), $bt.attr('style', '') && $in.val('').trigger('change'); - }).find('[data-file]').data('input', this).attr({ - 'data-path': $in.data('path') || '', 'data-size': $in.data('size') || 0, 'data-type': $in.data('type') || 'gif,png,jpg,jpeg', - 'data-max-width': $in.data('max-width') || 0, 'data-max-height': $in.data('max-height') || 0, - 'data-cut-width': $in.data('cut-width') || 0, 'data-cut-height': $in.data('cut-height') || 0, - }); - }); - }; - - /*! 上传多张图片 */ - $.fn.uploadMultipleImage = function () { - return this.each(function () { - if (this.dataset.inited) return; else this.dataset.inited = 'true'; - var $bt = $('
'); - var ims = this.value ? this.value.split('|') : [], $in = $(this).after($bt); - $bt.find('[data-file]').attr({ - 'data-path': $in.data('path') || '', 'data-size': $in.data('size') || 0, 'data-type': $in.data('type') || 'gif,png,jpg,jpeg', - 'data-max-width': $in.data('max-width') || 0, 'data-max-height': $in.data('max-height') || 0, - 'data-cut-width': $in.data('cut-width') || 0, 'data-cut-height': $in.data('cut-height') || 0, - }).on('push', function (evt, src) { - ims.push(src), $in.val(ims.join('|')), showImageContainer([src]); - }) && (ims.length > 0 && showImageContainer(ims)); - - function showImageContainer(srcs) { - $(srcs).each(function (idx, src, $img) { - $img = $(''); - $img.attr('data-tips-image', encodeURI(src)).css('backgroundImage', 'url(' + encodeURI(src) + ')').on('click', 'a', function (event, index, prevs, $item) { - event.stopPropagation(), $item = $(this).parent().parent(), index = $(this).index(); - if (index === 2 && $item.index() !== $bt.prevAll('div.uploadimage').length) $item.next().after($item); - else if (index === 0 && $item.index() > 1) $item.prev().before($item); else if (index === 1) $item.remove(); - ims = [], $bt.prevAll('.uploadimage').map(function () { - ims.push($(this).attr('data-tips-image')); - }); - ims.reverse(), $in.val(ims.join('|')); - }), $bt.before($img); - }); - } - }); - }; - - /*! 标签输入插件 */ - $.fn.initTagInput = function () { - return this.each(function () { - var $this = $(this), tags = this.value ? this.value.split(',') : []; - var $text = $(''); - var $tags = $('
').append($text); - $this.parent().append($tags), $text.off('keydown blur'), (tags.length > 0 && showTags(tags)); - $text.on('blur keydown', function (event, value) { - if (event.keyCode === 13 || event.type === 'blur') { - event.preventDefault(), (value = $text.val().replace(/^\s*|\s*$/g, '')); - if (tags.indexOf($(this).val()) > -1) return layer.msg('该标签已经存在!'); - if (value.length > 0) tags.push(value), $this.val(tags.join(',')), showTags([value]), this.focus(), $text.val(''); - } - }); - - function showTags(tagsArr) { - $(tagsArr).each(function (idx, text, elem) { - elem = $('
').html(text + ''); - elem.on('click', 'i', function (tagText, tagIdx) { - tagText = $(this).parent().text(), tagIdx = tags.indexOf(tagText); - tags.splice(tagIdx, 1), $(this).parent().remove(), $this.val(tags.join(',')); - }), $tags.append(elem, $text); - }); - } - }); - }; - - /*! 文本框插入内容 */ - $.fn.insertAtCursor = function (value) { - return this.each(function () { - this.focus(); - if (document.selection) { - var selection = document.selection.createRange(); - (selection.text = value), selection.select(), selection.unselect(); - } else if (this.selectionStart || this.selectionStart === 0) { - var spos = this.selectionStart, apos = this.selectionEnd || spos; - this.value = this.value.substring(0, spos) + value + this.value.substring(apos); - this.selectionEnd = this.selectionStart = spos + value.length; - } else { - this.value += value; - } - this.focus(); - }); - }; - - /*! 组件 layui.table 封装 */ - $.fn.layTable = function (params) { - return this.each(function () { - $.layTable.create(this, params); - }); - }; - $.layTable = new function () { - this.render = function (tabldId) { - return this.reload(tabldId, true); - }, this.reload = function (tabldId, force) { - return typeof tabldId === 'string' ? $('#' + tabldId).trigger(force ? 'render' : 'reload') : $.form.reload(); - }, this.create = function (table, params) { - // 动态初始化表格 - table.id = table.id || 't' + Math.random().toString().replace('.', ''); - var $table = $(table).attr('lay-filter', table.dataset.id = table.getAttribute('lay-filter') || table.id); - // 插件初始化参数 - var option = params || {}, data = option.where || {}, sort = option.initSort || option.sort || {}; - option.id = table.id, option.elem = table, option.url = params.url || table.dataset.url || location.href; - option.limit = params.limit || 20, option.loading = params.loading !== false, option.autoSort = params.autoSort === true; - option.page = params.page !== false ? (params.page || true) : false, option.cols = params.cols || [[]], option.success = params.done || ''; - // 初始化不显示头部 - var cls = ['.layui-table-header', '.layui-table-fixed', '.layui-table-body', '.layui-table-page']; - option.css = (option.css || '') + cls.join('{opacity:0}') + '{opacity:0}'; - // 默认动态设置页数, 动态设置最大高度 - if (option.page === true) option.page = {curr: layui.sessionData('pages')[option.id] || 1}; - if (option.height === 'full') if ($table.parents('.iframe-pagination').size()) { - $table.parents('.iframe-pagination').addClass('not-footer'); - option.height = $(window).height() - $table.removeClass('layui-hide').offset().top - 20; - } else { - option.height = $(window).height() - $table.removeClass('layui-hide').offset().top - 35; - } - // 动态计算最大页数 - option.done = function (res, curr, count) { - layui.sessionData('pages', {key: table.id, value: this.page.curr || 1}); - typeof option.success === 'function' && option.success.call(this, res, curr, count); - $.form.reInit($table.next()).find('[data-load][data-time!="false"],[data-action][data-time!="false"],[data-queue],[data-iframe]').not('[data-table-id]').attr('data-table-id', table.id); - (option.loading = this.loading = true) && $table.data('next', this).next().find(cls.join(',')).animate({opacity: 1}); - }, option.parseData = function (res) { - if (typeof params.filter === 'function') { - res.data = params.filter(res.data, res); - } - if (!this.page || !this.page.curr) return res; - var curp = this.page.curr, maxp = Math.ceil(res.count / option.limit); - if (curp > maxp && maxp > 1) $table.trigger('reload', {page: {curr: maxp}}); - return res; - }; - // 关联搜索表单 - var sform, search = params.search || table.dataset.targetSearch; - if (search) (sform = $body.find(search)).map(function () { - $(this).attr('data-table-id', table.id); - }); - // 关联绑定选择项 - var checked = params.checked || table.dataset.targetChecked; - if (checked) $body.find(checked).map(function () { - $(this).attr('data-table-id', table.id); - }); - // 实例并绑定事件 - $table.data('this', layui.table.render(bindData(option))); - $table.bind('reload render reloadData', function (evt, opts) { - data = $.extend({}, data, (opts || {}).where || {}); - opts = bindData($.extend({}, opts || {}, {loading: true})); - if (evt.type.indexOf('reload') > -1) { - layui.table.reloadData(table.id, opts); - } else { - layui.table.render(table.id, opts); - } - }).bind('row sort tool edit radio toolbar checkbox rowDouble', function (evt, call) { - layui.table.on(evt.type + '(' + table.dataset.id + ')', call) - }).bind('setFullHeight', function () { - $table.trigger('render', {height: $(window).height() - $table.next().offset().top - 35}) - }).trigger('sort', function (rets) { - (sort = rets), $table.trigger('reload') - }).trigger('rowDouble', function (event) { - $(event.tr[0]).find('[data-event-dbclick]').map(function () { - $(this).trigger(this.dataset.eventDbclick || 'click', event); - }); - }); - return $table; - - // 生成初始化参数 - function bindData(options) { - data['output'] = 'layui.table'; - if (sort.field && sort.type) { - data['_order_'] = sort.type, data['_field_'] = sort.field; - options.initSort = {type: sort.type.split(',')[0].split(' ')[0], field: sort.field.split(',')[0].split(' ')[0]}; - if (sform) $(sform).find('[data-form-export]').attr({'data-sort-type': sort.type, 'data-sort-field': sort.field}); - } - if (options.page === false) options.limit = ''; - return (options['where'] = data), options; - } - }; - }; - - /*!格式化文件大小 */ - $.formatFileSize = function (size, fixed, units) { - var unit; - units = units || ['B', 'K', 'M', 'G', 'TB']; - while ((unit = units.shift()) && size > 1024) size = size / 1024; - return (unit === 'B' ? size : size.toFixed(fixed === undefined ? 2 : fixed)) + unit; - } - - /*! 弹出图片层 */ - $.previewImage = function (src, area) { - var img = new Image(), defer = $.Deferred(), loaded = $.msg.loading(); - img.style.background = '#FFF', img.referrerPolicy = 'no-referrer'; - img.style.height = 'auto', img.style.width = area || '100%', img.style.display = 'none'; - return document.body.appendChild(img), img.onerror = function () { - $.msg.close(loaded), defer.reject(); - }, img.src = src, img.onload = function () { - layer.open({ - type: 1, title: false, shadeClose: true, content: $(img), success: function ($elem, idx) { - $.msg.close(loaded), defer.notify($elem, idx); - }, area: area || '480px', skin: 'layui-layer-nobg', closeBtn: 1, end: function () { - document.body.removeChild(img), defer.resolve() - } - }); - }, defer.promise(); - }; - - /*! 以手机模式显示内容 */ - $.previewPhonePage = function (href, title) { - var template = '
{{d.title}}
'; - layer.style(layer.open({type: true, resize: false, scrollbar: false, area: ['320px', '600px'], title: false, closeBtn: true, shadeClose: false, skin: 'layui-layer-nobg', content: laytpl(template).render({title: title || '公众号', url: href})}), {boxShadow: 'none'}); - }; - - /*! 显示任务进度消息 */ - $.loadQueue = function (code, doScript, element) { - var doAjax = true, doReload = false, template = '
...
' + '
'; - layer.open({ - type: 1, title: false, area: ['560px', '315px'], anim: 2, shadeClose: false, end: function () { - doAjax = doReload && doScript && $.layTable.reload(((element || {}).dataset || {}).tableId || true), false; - }, content: laytpl(template).render({code: code}), success: function ($elem) { - new function () { - var that = this; - this.$box = $elem.find('[data-queue-load=' + code + ']'); - if (doAjax === false || this.$box.length < 1) return false; - this.$coder = this.$box.find('code'), this.$name = this.$box.find('[data-message-title]'); - this.$percent = this.$box.find('.layui-progress div'), this.SetCache = function (code, index, value) { - var ckey = code + '_' + index, ctype = 'admin-queue-script'; - return value !== undefined ? layui.data(ctype, {key: ckey, value: value}) : layui.data(ctype)[ckey] || 0; - }, this.SetState = function (status, message) { - if (message.indexOf('javascript:') === -1) if (status === 1) { - that.$name.html('' + message + '').addClass('text-center'); - that.$percent.addClass('layui-bg-blue').removeClass('layui-bg-green layui-bg-red'); - } else if (status === 2) { - if (message.indexOf('>>>') > -1) { - that.$name.html('' + message + '').addClass('text-center'); - } else { - that.$name.html('正在处理:' + message).removeClass('text-center'); - } - that.$percent.addClass('layui-bg-blue').removeClass('layui-bg-green layui-bg-red'); - } else if (status === 3) { - doReload = true; - that.$name.html('' + message + '').addClass('text-center'); - that.$percent.addClass('layui-bg-green').removeClass('layui-bg-blue layui-bg-red'); - } else if (status === 4) { - that.$name.html('' + message + '').addClass('text-center'); - that.$percent.addClass('layui-bg-red').removeClass('layui-bg-blue layui-bg-green'); - } - }, (this.LoadProgress = function () { - if (doAjax === false || that.$box.length < 1) return false; - $.form.load(tapiRoot + '/api.queue/progress', {code: code}, 'post', function (ret) { - if (ret.code) { - var lines = []; - for (var idx in ret.data.history) { - var line = ret.data.history[idx], percent = '[ ' + line.progress + '% ] '; - if (line.message.indexOf('javascript:') === -1) { - lines.push(line.message.indexOf('>>>') > -1 ? line.message : percent + line.message); - } else if (!that.SetCache(code, idx) && doScript !== false) { - that.SetCache(code, idx, 1), $.form.goto(line.message); - } - } - if (ret.data.status > 0) { - that.SetState(parseInt(ret.data.status), ret.data.message); - that.$percent.attr('lay-percent', (parseFloat(ret.data.progress || '0.00').toFixed(2)) + '%'), layui.element.render(); - that.$coder.html('

' + lines.join('

') + '

').animate({scrollTop: that.$coder[0].scrollHeight + 'px'}, 200); - return parseInt(ret.data.status) === 3 || parseInt(ret.data.status) === 4 || setTimeout(that.LoadProgress, Math.floor(Math.random() * 200)), false; - } else { - return setTimeout(that.LoadProgress, Math.floor(Math.random() * 500) + 200), false; - } - } - }, false); - })(); - }; - } - }); - }; - - /*! 注册 data-search 表单搜索行为 */ - onEvent('submit', 'form.form-search', function () { - if (this.dataset.tableId) return $('table#' + this.dataset.tableId).trigger('reload', { - page: {curr: 1}, where: $(this).formToJson() - }); - var url = $(this).attr('action').replace(/&?page=\d+/g, ''); - if ((this.method || 'get').toLowerCase() === 'get') { - var split = url.indexOf('?') > -1 ? '&' : '?', stype = location.href.indexOf('spm=') > -1 ? '#' : ''; - return $.form.goto(stype + $.menu.parseUri(url + split + $(this).serialize().replace(/\+/g, ' '))); - } - return $.form.load(url, this, 'post'); - }); - - /*! 注册 data-file 事件行为 */ - onEvent('click', '[data-file]', function () { - this.id = this.dataset.id = this.id || (function (date) { - return (date + Math.random()).replace('0.', ''); - })(layui.util.toDateString(Date.now(), 'yyyyMMddHHmmss-')); - /*! 查找表单元素, 如果没有找到将不会自动写值 */ - if (!(this.$elem = $(this)).data('input') && this.$elem.data('field')) { - var $input = $('input[name="' + this.$elem.data('field') + '"]:not([type=file])'); - this.$elem.data('input', $input.size() > 0 ? $input.get(0) : null); - } - // 单图或多图选择器 ( image|images ) - if (typeof this.dataset.file === 'string' && /^images?$/.test(this.dataset.file)) { - return $.form.modal(tapiRoot + '/api.upload/image', this.dataset, '图片选择器') - } - // 其他文件上传处理 - this.dataset.inited || $(this).uploadFile(undefined, function () { - $(this).trigger('upload.start'); - }); - }); - - /*! 注册 data-load 事件行为 */ - onEvent('click', '[data-load]', function () { - var emap = this.dataset, data = {}; - return applyRuleValue(this, data, function () { - $.form.load(emap.load, data, 'get', onConfirm.getLoadCallable(emap.tableId), true, emap.tips, emap.time); - }); - }); - - /*! 注册 data-reload 事件行为 */ - onEvent('click', '[data-reload]', function () { - $.layTable.reload(this.dataset.tableId || true); - }); - - /*! 注册 data-dbclick 事件行为 */ - onEvent('dblclick', '[data-dbclick]', function () { - $(this).find(this.dataset.dbclick || '[data-dbclick]').trigger('click'); - }); - - /*! 注册 data-check 事件行为 */ - onEvent('click', '[data-check-target]', function () { - var target = this; - $(this.dataset.checkTarget).map(function () { - (this.checked = !!target.checked), $(this).trigger('change'); - }); - }); - - /*! 表单元素失去焦点时数字 */ - onEvent('blur', '[data-blur-number]', function () { - var emap = this.dataset, min = emap.valueMin, max = emap.valueMax; - var value = parseFloat(this.value) || 0, fiexd = parseInt(emap.blurNumber || 0); - if (typeof min !== 'undefined' && value < min) value = min; - if (typeof max !== 'undefined' && value > max) value = max; - this.value = parseFloat(value).toFixed(fiexd); - }); - - /*! 表单元素失焦时提交 */ - onEvent('blur', '[data-action-blur],[data-blur-action]', function () { - var that = $(this), emap = this.dataset, data = {'_token_': emap.token || emap.csrf || '--'}; - var attrs = (emap.value || '').replace('{value}', that.val()).split(';'); - for (var i in attrs) data[attrs[i].split('#')[0]] = attrs[i].split('#')[1]; - onConfirm(emap.confirm, function () { - $.form.load(emap.actionBlur || emap.blurAction, data, emap.method || 'post', function (ret) { - return that.css('border', (ret && ret.code) ? '1px solid #e6e6e6' : '1px solid red') && false; - }, emap.loading !== 'false', emap.loading, emap.time); - }); - }); - - /*! 注册 data-href 事件行为 */ - onEvent('click', '[data-href]', function () { - if (this.dataset.href && this.dataset.href.indexOf('#') !== 0) { - $.form.goto(this.dataset.href); - } - }); - - /*! 注册 data-open 事件行为 */ - onEvent('click', '[data-open]', function () { - if (this.dataset.open.match(/^https?:/)) { - $.form.goto(this.dataset.open); - } else { - $.form.href(this.dataset.open, this); - } - }); - - /*! 注册 data-action 事件行为 */ - onEvent('click', '[data-action]', function () { - var emap = this.dataset, data = {'_token_': emap.token || emap.csrf || '--'}; - var load = emap.loading !== 'false', tips = typeof load === 'string' ? load : undefined; - return applyRuleValue(this, data, function () { - $.form.load(emap.action, data, emap.method || 'post', onConfirm.getLoadCallable(emap.tableId), load, tips, emap.time) - }); - }); - - /*! 注册 data-modal 事件行为 */ - onEvent('click', '[data-modal]', function () { - var un = undefined, emap = this.dataset, data = {open_type: 'modal'}; - return applyRuleValue(this, data, function () { - return $.form.modal(emap.modal, data, emap.title || this.innerText || '编辑', un, un, un, emap.area || emap.width || '800px', emap.offset || 'auto', emap.full !== un); - }) - }); - - /*! 注册 data-iframe 事件行为 */ - onEvent('click', '[data-iframe]', function () { - var emap = this.dataset, data = {open_type: 'iframe'}; - var name = emap.title || this.innerText || 'IFRAME 窗口'; - var area = emap.area || [emap.width || '800px', emap.height || '580px']; - var frame = emap.iframe + (emap.iframe.indexOf('?') > -1 ? '&' : '?') + $.param(data); - return applyRuleValue(this, data, function () { - $(this).attr('data-index', $.form.iframe(frame, name, area, emap.offset || 'auto', function () { - typeof emap.refresh !== 'undefined' && $.layTable.reload(emap.tableId || true); - }, undefined, emap.full !== undefined)); - }) - }); - - /*! 注册 data-icon 事件行为 */ - onEvent('click', '[data-icon]', function () { - var location = tapiRoot + '/api.plugs/icon', field = this.dataset.icon || this.dataset.field || 'icon'; - $.form.iframe(location + (location.indexOf('?') > -1 ? '&' : '?') + 'field=' + field, '图标选择', ['900px', '700px']); - }); - - /*! 注册 data-copy 事件行为 */ - onEvent('click', '[data-copy]', function () { - var copy = this.dataset.copy || this.innerText; - if (window.clipboardData) { - window.clipboardData.setData('text', copy); - $.msg.tips('已复制到剪贴板!'); - } else { - var $input = $(''); - $input.css({position: 'fixed', top: '-500px'}).appendTo($body).val(copy).select(); - $.msg.tips(document.execCommand('Copy') ? '已复制到剪贴板!' : '请使用鼠标操作复制!') && $input.remove(); - } - }); - - /*! 异步任务状态监听与展示 */ - onEvent('click', '[data-queue]', function () { - var that = this, emap = this.dataset; - onConfirm(emap.confirm || false, function () { - $.form.load(emap.queue, {}, 'post', function (ret) { - if (typeof ret.data === 'string' && ret.data.indexOf('Q') === 0) { - return $.loadQueue(ret.data, true, that), false; - } - }); - }); - }); - - /*! 注册 data-tips-text 事件行为 */ - onEvent('mouseenter', '[data-tips-text]', function () { - var opts = {tips: [$(this).attr('data-tips-type') || 3, '#78BA32'], time: 0}; - var layidx = layer.tips($(this).attr('data-tips-text') || this.innerText, this, opts); - $(this).off('mouseleave').on('mouseleave', function () { - setTimeout("layer.close('" + layidx + "')", 100); - }); - }); - - /*! 注册 data-tips-hover 事件行为 */ - onEvent('mouseenter', '[data-tips-image][data-tips-hover]', function () { - var img = new Image(), ele = $(this); - if ((img.src = this.dataset.tipsImage || this.dataset.lazySrc || this.src)) { - img.layopt = {time: 0, skin: 'layui-layer-image', anim: 5, isOutAnim: false, scrollbar: false}; - img.referrerPolicy = 'no-referrer', img.style.maxWidth = '260px', img.style.maxHeight = '260px'; - ele.data('layidx', layer.tips(img.outerHTML, this, img.layopt)).off('mouseleave').on('mouseleave', function () { - layer.close(ele.data('layidx')); - }); - } - }); - - /*! 注册 data-tips-image 事件行为 */ - onEvent('click', '[data-tips-image]', function (event) { - (event.items = [], event.$imgs = $(this).parent().find('[data-tips-image]')).map(function () { - event.items.push({src: this.dataset.tipsImage || this.dataset.lazySrc || this.src}); - }) && layer.photos({ - anim: 5, closeBtn: 1, photos: {start: event.$imgs.index(this), data: event.items}, tab: function (pic, $ele) { - $ele.find('img').attr('referrerpolicy', 'no-referrer'); - $ele.find('.layui-layer-close').css({top: '20px', right: '20px', position: 'fixed'}); - } - }); - }); - - /*! 注册 data-phone-view 事件行为 */ - onEvent('click', '[data-phone-view]', function () { - $.previewPhonePage(this.dataset.phoneView || this.href); - }); - - /*! 注册 data-target-submit 事件行为 */ - onEvent('click', '[data-target-submit]', function () { - $(this.dataset.eventSubmit || this).submit(); - }); - - /*! 表单编辑返回操作 */ - onEvent('click', '[data-history-back]', function () { - $.msg.confirm(this.dataset.historyBack || '确定要返回吗?', function () { - history.back(); - }) - }); - - /*! 图片加载异常处理 */ - document.addEventListener('error', function (event) { - if (event.target.nodeName !== 'IMG') return; - event.target.src = baseRoot + 'theme/img/404_icon.png'; - }, true); - - /*! 系统菜单表单页面初始化 */ - $.menu.listen(), $.form.reInit($body); -}); \ No newline at end of file diff --git a/public/static/extra/script.js b/public/static/extra/script.js deleted file mode 100644 index 1e04aeee5..000000000 --- a/public/static/extra/script.js +++ /dev/null @@ -1,40 +0,0 @@ -// -------------------------------------------------- -// 自定义后台扩展脚本,需要在加载 admin.js 后载入 -// 使用 php think xadmin:install static 时不会更新此文件 -// -------------------------------------------------- -$(function () { - window.$body = $('body'); - - /*! 初始化异步加载的内容扩展动作 */ - // $body.on('reInit', function (evt, $dom) { - // console.log('Event.reInit', $dom); - // }); - - /*! 追加 require 配置参数 - /*! 加载的文件不能与主配置重复 */ - // require.config({ - // paths: { - // 'vue': ['plugs/vue/vue.min'], - // }, - // shim: { - // 'vue': ['json'] - // }, - // }); - // // 基于 Require 加载测试 - // require(['vue', 'md5'], function (vue, md5) { - // console.log(vue) - // console.log(md5.hash('content')) - // }); - - /*! 其他 javascript 脚本代码 */ - - // 显示表格图片 - window.showTableImage = function (image, circle, size, title) { - if (typeof image !== 'string' || image.length < 5) { - return '-' + (title ? laytpl('{{d.title}}').render({title: title}) : ''); - } - return laytpl('
').render({ - size: size || 'ss', class: circle ? 'shadow-inset' : 'headimg-no', image: image, style: 'background-image:url(' + image + ');margin-right:0' - }) + (title ? laytpl('{{d.title}}').render({title: title}) : ''); - }; -}); \ No newline at end of file diff --git a/public/static/extra/style.css b/public/static/extra/style.css deleted file mode 100644 index c11e852b5..000000000 --- a/public/static/extra/style.css +++ /dev/null @@ -1,4 +0,0 @@ -/* -------------------------------------------------- -/* 自定义后台扩展样式,需要在加载 console.css 后载入 -/* 使用 php think xadmin:install static 时不会更新此文件 -/* -------------------------------------------------- */ \ No newline at end of file diff --git a/public/static/login.js b/public/static/login.js deleted file mode 100644 index e7bcec15a..000000000 --- a/public/static/login.js +++ /dev/null @@ -1,72 +0,0 @@ -// +---------------------------------------------------------------------- -// | ThinkAdmin -// +---------------------------------------------------------------------- -// | 版权所有 2014~2022 广州楚才信息科技有限公司 [ http://www.cuci.cc ] -// +---------------------------------------------------------------------- -// | 官方网站: https://thinkadmin.top -// +---------------------------------------------------------------------- -// | 开源协议 ( https://mit-license.org ) -// | 免费声明 ( https://thinkadmin.top/disclaimer ) -// +---------------------------------------------------------------------- -// | gitee 代码仓库:https://gitee.com/zoujingli/ThinkAdmin -// | github 代码仓库:https://github.com/zoujingli/ThinkAdmin -// +---------------------------------------------------------------------- - -$(function () { - - window.$body = $('body'); - - /*! 登录界面背景切换 */ - $('[data-bg-transition]').each(function (i, el) { - el.idx = 0, el.imgs = [], el.SetBackImage = function (css) { - window.setTimeout(function () { - $(el).removeClass(el.imgs.join(' ')).addClass(css) - }, 1000) && $body.removeClass(el.imgs.join(' ')).addClass(css) - }, el.lazy = window.setInterval(function () { - el.imgs.length > 0 && el.SetBackImage(el.imgs[++el.idx] || el.imgs[el.idx = 0]); - }, 5000) && el.dataset.bgTransition.split(',').forEach(function (image) { - layui.img(image, function (img, cssid, style) { - style = document.createElement('style'), cssid = 'LoginBackImage' + (el.imgs.length + 1); - style.innerHTML = '.' + cssid + '{background-image:url("' + encodeURI(image) + '")!important}'; - document.head.appendChild(style) && el.imgs.push(cssid); - }); - }); - }); - - /*! 后台加密登录处理 */ - $body.find('form[data-login-form]').each(function (idx, form) { - require(['md5'], function (md5) { - $(form).vali(function (data) { - data['password'] = md5.hash(md5.hash(data['password']) + data['uniqid']); - $.form.load(location.href, data, "post", function (ret) { - if (parseInt(ret.code) !== 1) { - $(form).find('[data-captcha]').trigger('click'); - $(form).find('.verify.layui-hide').removeClass('layui-hide'); - } - }, null, null, 'false'); - }); - }); - }); - - /*! 登录图形验证码刷新 */ - $body.on('click', '[data-captcha]', function () { - var $that = $(this), $form = $that.parents('form'); - var action = this.dataset.captcha || location.href; - if (action.length < 5) return $.msg.tips('请设置验证码请求及验证地址'); - var type = this.dataset.captchaType || 'captcha-type', token = this.dataset.captchaToken || 'captcha-token'; - var uniqid = this.dataset.fieldUniqid || 'captcha-uniqid', verify = this.dataset.fieldVerify || 'captcha-verify'; - $.form.load(action, {type: type, token: token}, 'post', function (ret) { - if (ret.code) { - $that.html('img').find('input').attr('name', uniqid).val(ret.data.uniqid || ''); - $form.find('[name="' + verify + '"]').attr('value', ret.data.code || '').val(ret.data.code || ''); - return (ret.data.code || $form.find('.verify.layui-hide').removeClass('layui-hide')), false; - } - }, false); - }); - - /*! 初始化登录图形 */ - $('[data-captcha]').map(function () { - $(this).trigger('click'); - }); - -}); \ No newline at end of file diff --git a/public/static/plugs/angular/angular.min.js b/public/static/plugs/angular/angular.min.js deleted file mode 100644 index 3dd9898e7..000000000 --- a/public/static/plugs/angular/angular.min.js +++ /dev/null @@ -1,351 +0,0 @@ -/* - AngularJS v1.8.2 - (c) 2010-2020 Google LLC. http://angularjs.org - License: MIT -*/ -(function(z){'use strict';function ve(a){if(D(a))w(a.objectMaxDepth)&&(Xb.objectMaxDepth=Yb(a.objectMaxDepth)?a.objectMaxDepth:NaN),w(a.urlErrorParamsEnabled)&&Ga(a.urlErrorParamsEnabled)&&(Xb.urlErrorParamsEnabled=a.urlErrorParamsEnabled);else return Xb}function Yb(a){return X(a)&&0c)return"...";var d=b.$$hashKey,f;if(H(a)){f=0;for(var g=a.length;f").append(a).html();try{return a[0].nodeType===Pa?K(b):b.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+K(b)})}catch(d){return K(b)}}function Vc(a){try{return decodeURIComponent(a)}catch(b){}}function hc(a){var b={};r((a||"").split("&"), -function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=Vc(e),w(e)&&(f=w(f)?Vc(f):!0,ta.call(b,e)?H(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Ce(a){var b=[];r(a,function(a,c){H(a)?r(a,function(a){b.push(ba(c,!0)+(!0===a?"":"="+ba(a,!0)))}):b.push(ba(c,!0)+(!0===a?"":"="+ba(a,!0)))});return b.length?b.join("&"):""}function ic(a){return ba(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ba(a, -b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function De(a,b){var d,c,e=Qa.length;for(c=0;c protocol indicates an extension, document.location.href does not match."))}function Wc(a,b,d){D(d)||(d={});d=S({strictDi:!1},d);var c=function(){a=x(a);if(a.injector()){var c=a[0]===z.document?"document":Aa(a);throw oa("btstrpd",c.replace(//,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider", -function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=fb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;z&&e.test(z.name)&&(d.debugInfoEnabled=!0,z.name=z.name.replace(e,""));if(z&&!f.test(z.name))return c();z.name=z.name.replace(f,"");ca.resumeBootstrap=function(a){r(a,function(a){b.push(a)});return c()};B(ca.resumeDeferredBootstrap)&& -ca.resumeDeferredBootstrap()}function Ge(){z.name="NG_ENABLE_DEBUG_INFO!"+z.name;z.location.reload()}function He(a){a=ca.element(a).injector();if(!a)throw oa("test");return a.get("$$testability")}function Xc(a,b){b=b||"_";return a.replace(Ie,function(a,c){return(c?b:"")+a.toLowerCase()})}function Je(){var a;if(!Yc){var b=rb();(sb=A(b)?z.jQuery:b?z[b]:void 0)&&sb.fn.on?(x=sb,S(sb.fn,{scope:Wa.scope,isolateScope:Wa.isolateScope,controller:Wa.controller,injector:Wa.injector,inheritedData:Wa.inheritedData})): -x=U;a=x.cleanData;x.cleanData=function(b){for(var c,e=0,f;null!=(f=b[e]);e++)(c=(x._data(f)||{}).events)&&c.$destroy&&x(f).triggerHandler("$destroy");a(b)};ca.element=x;Yc=!0}}function Ke(){U.legacyXHTMLReplacement=!0}function gb(a,b,d){if(!a)throw oa("areq",b||"?",d||"required");return a}function tb(a,b,d){d&&H(a)&&(a=a[a.length-1]);gb(B(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ja(a,b){if("hasOwnProperty"===a)throw oa("badname", -b);}function Le(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g"):a;if(10>wa)for(c=hb[c]||hb._default,d.innerHTML=c[1]+e+c[2],k=c[0];k--;)d=d.firstChild;else{c=qa[c]||[];for(k=c.length;-1<--k;)d.appendChild(z.document.createElement(c[k])),d=d.firstChild;d.innerHTML=e}g=db(g,d.childNodes);d=f.firstChild;d.textContent=""}else g.push(b.createTextNode(a)); -f.textContent="";f.innerHTML="";r(g,function(a){f.appendChild(a)});return f}function U(a){if(a instanceof U)return a;var b;C(a)&&(a=V(a),b=!0);if(!(this instanceof U)){if(b&&"<"!==a.charAt(0))throw oc("nosel");return new U(a)}if(b){b=z.document;var d;a=(d=tg.exec(a))?[b.createElement(d[1])]:(d=gd(a,b))?d.childNodes:[];pc(this,a)}else B(a)?hd(a):pc(this,a)}function qc(a){return a.cloneNode(!0)}function zb(a,b){!b&&mc(a)&&x.cleanData([a]);a.querySelectorAll&&x.cleanData(a.querySelectorAll("*"))}function id(a){for(var b in a)return!1; -return!0}function jd(a){var b=a.ng339,d=b&&Ka[b],c=d&&d.events,d=d&&d.data;d&&!id(d)||c&&!id(c)||(delete Ka[b],a.ng339=void 0)}function kd(a,b,d,c){if(w(c))throw oc("offargs");var e=(c=Ab(a))&&c.events,f=c&&c.handle;if(f){if(b){var g=function(b){var c=e[b];w(d)&&cb(c||[],d);w(d)&&c&&0l&&this.remove(n.key);return b}},get:function(a){if(l";b=Fa.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function sa(a,b){try{a.addClass(b)}catch(c){}}function da(a,b,c,d,e){a instanceof x||(a=x(a));var f=Xa(a,b,a,c,d,e);da.$$addScopeClass(a);var g=null;return function(b,c,d){if(!a)throw $("multilink");gb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement; -h&&h.$$boundTransclude&&(h=h.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ua(d)&&la.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==g?x(ja(g,x("
").append(a).html())):c?Wa.clone.call(a):a;if(k)for(var l in k)d.data("$"+l+"Controller",k[l].instance);da.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,h);c||(a=f=null);return d}}function Xa(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,p,I,t;if(n)for(t=Array(c.length),m=0;mu.priority)break;if(O=u.scope)u.templateUrl||(D(O)?(ba("new/isolated scope",s||t,u,y),s=u):ba("new/isolated scope",s,u,y)),t=t||u;Q=u.name;if(!ma&&(u.replace&&(u.templateUrl||u.template)||u.transclude&& -!u.$$tlb)){for(O=sa+1;ma=a[O++];)if(ma.transclude&&!ma.$$tlb||ma.replace&&(ma.templateUrl||ma.template)){Jb=!0;break}ma=!0}!u.templateUrl&&u.controller&&(J=J||T(),ba("'"+Q+"' controller",J[Q],u,y),J[Q]=u);if(O=u.transclude)if(G=!0,u.$$tlb||(ba("transclusion",L,u,y),L=u),"element"===O)N=!0,n=u.priority,M=y,y=d.$$element=x(da.$$createComment(Q,d[Q])),b=y[0],oa(f,Ha.call(M,0),b),R=Z(Jb,M,e,n,g&&g.name,{nonTlbTranscludeDirective:L});else{var ka=T();if(D(O)){M=z.document.createDocumentFragment();var Xa= -T(),F=T();r(O,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Xa[a]=b;ka[b]=null;F[b]=c});r(y.contents(),function(a){var b=Xa[xa(ua(a))];b?(F[b]=!0,ka[b]=ka[b]||z.document.createDocumentFragment(),ka[b].appendChild(a)):M.appendChild(a)});r(F,function(a,b){if(!a)throw $("reqslot",b);});for(var K in ka)ka[K]&&(R=x(ka[K].childNodes),ka[K]=Z(Jb,R,e));M=x(M.childNodes)}else M=x(qc(b)).contents();y.empty();R=Z(Jb,M,e,void 0,void 0,{needsNewScope:u.$$isolateScope||u.$$newScope});R.$$slots=ka}if(u.template)if(P= -!0,ba("template",v,u,y),v=u,O=B(u.template)?u.template(y,d):u.template,O=Na(O),u.replace){g=u;M=nc.test(O)?td(ja(u.templateNamespace,V(O))):[];b=M[0];if(1!==M.length||1!==b.nodeType)throw $("tplrt",Q,"");oa(f,y,b);C={$attr:{}};O=tc(b,[],C);var Ig=a.splice(sa+1,a.length-(sa+1));(s||t)&&fa(O,s,t);a=a.concat(O).concat(Ig);ga(d,C);C=a.length}else y.html(O);if(u.templateUrl)P=!0,ba("template",v,u,y),v=u,u.replace&&(g=u),p=ha(a.splice(sa,a.length-sa),y,d,f,G&&R,h,k,{controllerDirectives:J,newScopeDirective:t!== -u&&t,newIsolateScopeDirective:s,templateDirective:v,nonTlbTranscludeDirective:L}),C=a.length;else if(u.compile)try{q=u.compile(y,d,R);var Y=u.$$originalDirective||u;B(q)?m(null,Va(Y,q),E,jb):q&&m(Va(Y,q.pre),Va(Y,q.post),E,jb)}catch(ca){c(ca,Aa(y))}u.terminal&&(p.terminal=!0,n=Math.max(n,u.priority))}p.scope=t&&!0===t.scope;p.transcludeOnThisElement=G;p.templateOnThisElement=P;p.transclude=R;l.hasElementTranscludeDirective=N;return p}function X(a,b,c,d){var e;if(C(b)){var f=b.match(l);b=b.substring(f[0].length); -var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e="^^"===g&&c[0]&&9===c[0].nodeType?null:g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw $("ctreq",b,a);}else if(H(b))for(e=[],g=0,f=b.length;gc.priority)&&-1!==c.restrict.indexOf(e)){k&&(c=bc(c,{$$start:k,$$end:l}));if(!c.$$bindings){var I=m=c,t=c.name,u={isolateScope:null,bindToController:null}; -D(I.scope)&&(!0===I.bindToController?(u.bindToController=d(I.scope,t,!0),u.isolateScope={}):u.isolateScope=d(I.scope,t,!1));D(I.bindToController)&&(u.bindToController=d(I.bindToController,t,!0));if(u.bindToController&&!I.controller)throw $("noctrl",t);m=m.$$bindings=u;D(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c);m=c}}return m}function ca(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function qa(a,b){if("srcdoc"=== -b)return u.HTML;if("src"===b||"ngSrc"===b)return-1===["img","video","audio","source","track"].indexOf(a)?u.RESOURCE_URL:u.MEDIA_URL;if("xlinkHref"===b)return"image"===a?u.MEDIA_URL:"a"===a?u.URL:u.RESOURCE_URL;if("form"===a&&"action"===b||"base"===a&&"href"===b||"link"===a&&"href"===b)return u.RESOURCE_URL;if("a"===a&&("href"===b||"ngHref"===b))return u.URL}function ya(a,b){var c=b.toLowerCase();return v[a+"|"+c]||v["*|"+c]}function za(a){return ma(u.valueOf(a),"ng-prop-srcset")}function Ea(a,b,c, -d){if(m.test(d))throw $("nodomevents");a=ua(a);var e=ya(a,d),f=Ta;"srcset"!==d||"img"!==a&&"source"!==a?e&&(f=u.getTrusted.bind(u,e)):f=za;b.push({priority:100,compile:function(a,b){var e=p(b[c]),g=p(b[c],function(a){return u.valueOf(a)});return{pre:function(a,b){function c(){var g=e(a);b[0][d]=f(g)}c();a.$watch(g,c)}}}})}function Ia(a,c,d,e,f){var g=ua(a),k=qa(g,e),l=h[e]||f,p=b(d,!f,k,l);if(p){if("multiple"===e&&"select"===g)throw $("selmulti",Aa(a));if(m.test(e))throw $("nodomevents");c.push({priority:100, -compile:function(){return{pre:function(a,c,f){c=f.$$observers||(f.$$observers=T());var g=f[e];g!==d&&(p=g&&b(g,!0,k,l),d=g);p&&(f[e]=p(a),(c[e]||(c[e]=[])).$$inter=!0,(f.$$observers&&f.$$observers[e].$$scope||a).$watch(p,function(a,b){"class"===e&&a!==b?f.$updateClass(a,b):f.$set(e,a)}))}}}})}}function oa(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===Pa&&""===d.nodeValue.trim())&&Kg.call(a,b,1)}return a} -function Gg(a,b){if(b&&C(b))return b;if(C(a)){var d=wd.exec(a);if(d)return d[3]}}function Kf(){var a={};this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,d){Ja(b,"controller");D(b)?S(a,b):a[b]=d};this.$get=["$injector",function(b){function d(a,b,d,g){if(!a||!D(a.$scope))throw F("$controller")("noscp",g,b);a.$scope[b]=d}return function(c,e,f,g){var k,h,l;f=!0===f;g&&C(g)&&(l=g);if(C(c)){g=c.match(wd);if(!g)throw xd("ctrlfmt",c);h=g[1];l=l||g[3];c=a.hasOwnProperty(h)?a[h]:Le(e.$scope, -h,!0);if(!c)throw xd("ctrlreg",h);tb(c,h,!0)}if(f)return f=(H(c)?c[c.length-1]:c).prototype,k=Object.create(f||null),l&&d(e,l,k,h||c.name),S(function(){var a=b.invoke(c,k,e,h);a!==k&&(D(a)||B(a))&&(k=a,l&&d(e,l,k,h||c.name));return k},{instance:k,identifier:l});k=b.instantiate(c,e,h);l&&d(e,l,k,h||c.name);return k}}]}function Lf(){this.$get=["$window",function(a){return x(a.document)}]}function Mf(){this.$get=["$document","$rootScope",function(a,b){function d(){e=c.hidden}var c=a[0],e=c&&c.hidden; -a.on("visibilitychange",d);b.$on("$destroy",function(){a.off("visibilitychange",d)});return function(){return e}}]}function Nf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function vc(a){return D(a)?ha(a)?a.toISOString():eb(a):a}function Tf(){this.$get=function(){return function(a){if(!a)return"";var b=[];Qc(a,function(a,c){null===a||A(a)||B(a)||(H(a)?r(a,function(a){b.push(ba(c)+"="+ba(vc(a)))}):b.push(ba(c)+"="+ba(vc(a))))});return b.join("&")}}}function Uf(){this.$get= -function(){return function(a){function b(a,e,f){H(a)?r(a,function(a,c){b(a,e+"["+(D(a)?c:"")+"]")}):D(a)&&!ha(a)?Qc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):(B(a)&&(a=a()),d.push(ba(e)+"="+(null==a?"":ba(vc(a)))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function wc(a,b){if(C(a)){var d=a.replace(Lg,"").trim();if(d){var c=b("Content-Type"),c=c&&0===c.indexOf(yd),e;(e=c)||(e=(e=d.match(Mg))&&Ng[e[0]].test(d));if(e)try{a=Tc(d)}catch(f){if(!c)return a;throw Lb("baddata",a,f);}}}return a} -function zd(a){var b=T(),d;C(a)?r(a.split("\n"),function(a){d=a.indexOf(":");var e=K(V(a.substr(0,d)));a=V(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):D(a)&&r(a,function(a,d){var f=K(d),g=V(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function Ad(a){var b;return function(d){b||(b=zd(a));return d?(d=b[K(d)],void 0===d&&(d=null),d):b}}function Bd(a,b,d,c){if(B(c))return c(a,b,d);r(c,function(c){a=c(a,b,d)});return a}function Sf(){var a=this.defaults={transformResponse:[wc],transformRequest:[function(a){return D(a)&& -"[object File]"!==la.call(a)&&"[object Blob]"!==la.call(a)&&"[object FormData]"!==la.call(a)?eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ja(xc),put:ja(xc),patch:ja(xc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},b=!1;this.useApplyAsync=function(a){return w(a)?(b=!!a,this):b};var d=this.interceptors=[],c=this.xsrfTrustedOrigins=[];Object.defineProperty(this,"xsrfWhitelistedOrigins", -{get:function(){return this.xsrfTrustedOrigins},set:function(a){this.xsrfTrustedOrigins=a}});this.$get=["$browser","$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector","$sce",function(e,f,g,k,h,l,m,p){function n(b){function c(a,b){for(var d=0,e=b.length;da?b:l.reject(b)}if(!D(b))throw F("$http")("badreq",b);if(!C(p.valueOf(b.url)))throw F("$http")("badreq",b.url);var g=S({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer,jsonpCallbackParam:a.jsonpCallbackParam},b);g.headers=function(b){var c=a.headers,e=S({},b.headers),f,g,h,c=S({},c.common,c[K(b.method)]);a:for(f in c){g=K(f);for(h in e)if(K(h)===g)continue a;e[f]=c[f]}return d(e,ja(b))}(b);g.method= -vb(g.method);g.paramSerializer=C(g.paramSerializer)?m.get(g.paramSerializer):g.paramSerializer;e.$$incOutstandingRequestCount("$http");var h=[],k=[];b=l.resolve(g);r(v,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&k.push(a.response,a.responseError)});b=c(b,h);b=b.then(function(b){var c=b.headers,d=Bd(b.data,Ad(c),void 0,b.transformRequest);A(d)&&r(c,function(a,b){"content-type"===K(b)&&delete c[b]});A(b.withCredentials)&&!A(a.withCredentials)&& -(b.withCredentials=a.withCredentials);return s(b,d).then(f,f)});b=c(b,k);return b=b.finally(function(){e.$$completeOutstandingRequest(E,"$http")})}function s(c,d){function e(a){if(a){var c={};r(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function k(a,c,d,e,f){function g(){m(c,a,d,e,f)}R&&(200<=a&&300>a?R.put(O,[a,c,zd(d),e,f]):R.remove(O));b?h.$applyAsync(g):(g(),h.$$phase||h.$apply())}function m(a,b,d,e,f){b=-1<=b?b:0;(200<=b&&300> -b?L.resolve:L.reject)({data:a,status:b,headers:Ad(d),config:c,statusText:e,xhrStatus:f})}function s(a){m(a.data,a.status,ja(a.headers()),a.statusText,a.xhrStatus)}function v(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var L=l.defer(),u=L.promise,R,q,ma=c.headers,x="jsonp"===K(c.method),O=c.url;x?O=p.getTrustedResourceUrl(O):C(O)||(O=p.valueOf(O));O=G(O,c.paramSerializer(c.params));x&&(O=t(O,c.jsonpCallbackParam));n.pendingRequests.push(c);u.then(v,v);!c.cache&&!a.cache|| -!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(R=D(c.cache)?c.cache:D(a.cache)?a.cache:N);R&&(q=R.get(O),w(q)?q&&B(q.then)?q.then(s,s):H(q)?m(q[1],q[0],ja(q[2]),q[3],q[4]):m(q,200,{},"OK","complete"):R.put(O,u));A(q)&&((q=kc(c.url)?g()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(ma[c.xsrfHeaderName||a.xsrfHeaderName]=q),f(c.method,O,d,k,ma,c.timeout,c.withCredentials,c.responseType,e(c.eventHandlers),e(c.uploadEventHandlers)));return u}function G(a,b){0=h&&(t.resolve(s),f(r.$$intervalId));G||c.$apply()},k,t,G);return r}}}]}function Cd(a,b){var d=ga(a);b.$$protocol=d.protocol;b.$$host= -d.hostname;b.$$port=fa(d.port)||Rg[d.protocol]||null}function Dd(a,b,d){if(Sg.test(a))throw kb("badpath",a);var c="/"!==a.charAt(0);c&&(a="/"+a);a=ga(a);for(var c=(c&&"/"===a.pathname.charAt(0)?a.pathname.substring(1):a.pathname).split("/"),e=c.length;e--;)c[e]=decodeURIComponent(c[e]),d&&(c[e]=c[e].replace(/\//g,"%2F"));d=c.join("/");b.$$path=d;b.$$search=hc(a.search);b.$$hash=decodeURIComponent(a.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function yc(a,b){return a.slice(0, -b.length)===b}function ya(a,b){if(yc(b,a))return b.substr(a.length)}function Da(a){var b=a.indexOf("#");return-1===b?a:a.substr(0,b)}function zc(a,b,d){this.$$html5=!0;d=d||"";Cd(a,this);this.$$parse=function(a){var d=ya(b,a);if(!C(d))throw kb("ipthprfx",a,b);Dd(d,this,!0);this.$$path||(this.$$path="/");this.$$compose()};this.$$normalizeUrl=function(a){return b+a.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;w(f=ya(a,c))?(g=f,g=d&&w(f=ya(d,f))? -b+(ya("/",f)||f):a+g):w(f=ya(b,c))?g=b+f:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function Ac(a,b,d){Cd(a,this);this.$$parse=function(c){var e=ya(a,c)||ya(b,c),f;A(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",A(e)&&(a=c,this.replace())):(f=ya(d,e),A(f)&&(f=e));Dd(f,this,!1);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;yc(f,e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$normalizeUrl=function(b){return a+(b?d+b:"")};this.$$parseLinkUrl=function(b, -d){return Da(a)===Da(b)?(this.$$parse(b),!0):!1}}function Ed(a,b,d){this.$$html5=!0;Ac.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a===Da(c)?f=c:(g=ya(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$normalizeUrl=function(b){return a+d+b}}function Mb(a){return function(){return this[a]}}function Fd(a,b){return function(d){if(A(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Yf(){var a="!", -b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return w(b)?(a=b,this):a};this.html5Mode=function(a){if(Ga(a))return b.enabled=a,this;if(D(a)){Ga(a.enabled)&&(b.enabled=a.enabled);Ga(a.requireBase)&&(b.requireBase=a.requireBase);if(Ga(a.rewriteLinks)||C(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function k(a,b){return a===b||ga(a).href===ga(b).href}function h(a, -b,d){var e=m.url(),f=m.$$state;try{c.url(a,b,d),m.$$state=c.state()}catch(g){throw m.url(e),m.$$state=f,g;}}function l(a,b){d.$broadcast("$locationChangeSuccess",m.absUrl(),a,m.$$state,b)}var m,p;p=c.baseHref();var n=c.url(),s;if(b.enabled){if(!p&&b.requireBase)throw kb("nobase");s=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(p||"/");p=e.history?zc:Ed}else s=Da(n),p=Ac;var r=s.substr(0,Da(s).lastIndexOf("/")+1);m=new p(s,r,"#"+a);m.$$parseLinkUrl(n,n);m.$$state=c.state();var t=/^\s*(javascript|mailto):/i; -f.on("click",function(a){var e=b.rewriteLinks;if(e&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var g=x(a.target);"a"!==ua(g[0]);)if(g[0]===f[0]||!(g=g.parent())[0])return;if(!C(e)||!A(g.attr(e))){var e=g.prop("href"),h=g.attr("href")||g.attr("xlink:href");D(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=ga(e.animVal).href);t.test(e)||!e||g.attr("target")||a.isDefaultPrevented()||!m.$$parseLinkUrl(e,h)||(a.preventDefault(),m.absUrl()!==c.url()&&d.$apply())}}});m.absUrl()!== -n&&c.url(m.absUrl(),!0);var N=!0;c.onUrlChange(function(a,b){yc(a,r)?(d.$evalAsync(function(){var c=m.absUrl(),e=m.$$state,f;m.$$parse(a);m.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;m.absUrl()===a&&(f?(m.$$parse(c),m.$$state=e,h(c,!1,e)):(N=!1,l(c,e)))}),d.$$phase||d.$digest()):g.location.href=a});d.$watch(function(){if(N||m.$$urlUpdatedByLocation){m.$$urlUpdatedByLocation=!1;var a=c.url(),b=m.absUrl(),f=c.state(),g=m.$$replace,n=!k(a,b)||m.$$html5&&e.history&&f!== -m.$$state;if(N||n)N=!1,d.$evalAsync(function(){var b=m.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,m.$$state,f).defaultPrevented;m.absUrl()===b&&(c?(m.$$parse(a),m.$$state=f):(n&&h(b,g,f===m.$$state?null:m.$$state),l(a,f)))})}m.$$replace=!1});return m}]}function Zf(){var a=!0,b=this;this.debugEnabled=function(b){return w(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){dc(a)&&(a.stack&&f?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&& -(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||E;return function(){var a=[];r(arguments,function(b){a.push(c(b))});return Function.prototype.apply.call(e,b,a)}}var f=wa||/\bEdge\//.test(d.navigator&&d.navigator.userAgent);return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Tg(a){return a+""}function Ug(a,b){return"undefined"!==typeof a?a: -b}function Gd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function Vg(a,b){switch(a.type){case q.MemberExpression:if(a.computed)return!1;break;case q.UnaryExpression:return 1;case q.BinaryExpression:return"+"!==a.operator?1:!1;case q.CallExpression:return!1}return void 0===b?Hd:b}function Z(a,b,d){var c,e,f=a.isPure=Vg(a,d);switch(a.type){case q.Program:c=!0;r(a.body,function(a){Z(a.expression,b,f);c=c&&a.expression.constant});a.constant=c;break;case q.Literal:a.constant=!0;a.toWatch= -[];break;case q.UnaryExpression:Z(a.argument,b,f);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case q.BinaryExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case q.LogicalExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case q.ConditionalExpression:Z(a.test,b,f);Z(a.alternate,b,f);Z(a.consequent,b,f);a.constant=a.test.constant&& -a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case q.Identifier:a.constant=!1;a.toWatch=[a];break;case q.MemberExpression:Z(a.object,b,f);a.computed&&Z(a.property,b,f);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=a.constant?[]:[a];break;case q.CallExpression:c=d=a.filter?!b(a.callee.name).$stateful:!1;e=[];r(a.arguments,function(a){Z(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=d?e:[a];break;case q.AssignmentExpression:Z(a.left, -b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case q.ArrayExpression:c=!0;e=[];r(a.elements,function(a){Z(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=e;break;case q.ObjectExpression:c=!0;e=[];r(a.properties,function(a){Z(a.value,b,f);c=c&&a.value.constant;e.push.apply(e,a.value.toWatch);a.computed&&(Z(a.key,b,!1),c=c&&a.key.constant,e.push.apply(e,a.key.toWatch))});a.constant=c;a.toWatch=e;break;case q.ThisExpression:a.constant= -!1;a.toWatch=[];break;case q.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Id(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function Jd(a){return a.type===q.Identifier||a.type===q.MemberExpression}function Kd(a){if(1===a.body.length&&Jd(a.body[0].expression))return{type:q.AssignmentExpression,left:a.body[0].expression,right:{type:q.NGValueParameter},operator:"="}}function Ld(a){this.$filter=a}function Md(a){this.$filter=a}function Nb(a,b,d){this.ast= -new q(a,d);this.astCompiler=d.csp?new Md(b):new Ld(b)}function Bc(a){return B(a.valueOf)?a.valueOf():Wg.call(a)}function $f(){var a=T(),b={"true":!0,"false":!1,"null":null,undefined:void 0},d,c;this.addLiteral=function(a,c){b[a]=c};this.setIdentifierFns=function(a,b){d=a;c=b;return this};this.$get=["$filter",function(e){function f(b,c){var d,f;switch(typeof b){case "string":return f=b=b.trim(),d=a[f],d||(d=new Ob(G),d=(new Nb(d,e,G)).parse(b),a[f]=p(d)),s(d,c);case "function":return s(b,c);default:return s(E, -c)}}function g(a,b,c){return null==a||null==b?a===b:"object"!==typeof a||(a=Bc(a),"object"!==typeof a||c)?a===b||a!==a&&b!==b:!1}function k(a,b,c,d,e){var f=d.inputs,h;if(1===f.length){var k=g,f=f[0];return a.$watch(function(a){var b=f(a);g(b,k,f.isPure)||(h=d(a,void 0,void 0,[b]),k=b&&Bc(b));return h},b,c,e)}for(var l=[],m=[],n=0,p=f.length;n=c.$$state.status&&e&&e.length&&a(function(){for(var a,c,f=0,g=e.length;fa)for(b in l++, -f)ta.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$$pure=g(a).literal;c.$stateful=!c.$$pure;var d=this,e,f,h,k=1r&&(A=4-r,N[A]||(N[A]=[]),N[A].push({msg:B(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:h}));else if(a===c){s= -!1;break a}}catch(E){f(E)}if(!(n=!q.$$suspended&&q.$$watchersCount&&q.$$childHead||q!==y&&q.$$nextSibling))for(;q!==y&&!(n=q.$$nextSibling);)q=q.$parent}while(q=n);if((s||w.length)&&!r--)throw v.$$phase=null,d("infdig",b,N);}while(s||w.length);for(v.$$phase=null;Jwa)throw Ea("iequirks");var c=ja(W);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=Ta);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;r(W, -function(a,b){var d=K(b);c[("parse_as_"+d).replace(Dc,xb)]=function(b){return e(a,b)};c[("get_trusted_"+d).replace(Dc,xb)]=function(b){return f(a,b)};c[("trust_as_"+d).replace(Dc,xb)]=function(b){return g(a,b)}});return c}]}function fg(){this.$get=["$window","$document",function(a,b){var d={},c=!((!a.nw||!a.nw.process)&&a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,e=fa((/android (\d+)/.exec(K((a.navigator||{}).userAgent))|| -[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},k=g.body&&g.body.style,h=!1,l=!1;k&&(h=!!("transition"in k||"webkitTransition"in k),l=!!("animation"in k||"webkitAnimation"in k));return{history:!(!c||4>e||f),hasEvent:function(a){if("input"===a&&wa)return!1;if(A(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ba(),transitions:h,animations:l,android:e}}]}function gg(){this.$get=ia(function(a){return new Yg(a)})}function Yg(a){function b(){var a=e.pop();return a&& -a.cb}function d(a){for(var b=e.length-1;0<=b;--b){var c=e[b];if(c.type===a)return e.splice(b,1),c.cb}}var c={},e=[],f=this.ALL_TASKS_TYPE="$$all$$",g=this.DEFAULT_TASK_TYPE="$$default$$";this.completeTask=function(e,h){h=h||g;try{e()}finally{var l;l=h||g;c[l]&&(c[l]--,c[f]--);l=c[h];var m=c[f];if(!m||!l)for(l=m?d:b;m=l(h);)try{m()}catch(p){a.error(p)}}};this.incTaskCount=function(a){a=a||g;c[a]=(c[a]||0)+1;c[f]=(c[f]||0)+1};this.notifyWhenNoPendingTasks=function(a,b){b=b||f;c[b]?e.push({type:b,cb:a}): -a()}}function ig(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$exceptionHandler","$templateCache","$http","$q","$sce",function(b,d,c,e,f){function g(k,h){g.totalPendingRequests++;if(!C(k)||A(d.get(k)))k=f.getTrustedResourceUrl(k);var l=c.defaults&&c.defaults.transformResponse;H(l)?l=l.filter(function(a){return a!==wc}):l===wc&&(l=null);return c.get(k,S({cache:d,transformResponse:l},a)).finally(function(){g.totalPendingRequests--}).then(function(a){return d.put(k,a.data)}, -function(a){h||(a=Zg("tpload",k,a.status,a.statusText),b(a));return e.reject(a)})}g.totalPendingRequests=0;return g}]}function jg(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var c=ca.element(a).data("$binding");c&&r(c,function(c){d?(new RegExp("(^|\\s)"+Od(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!==c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-", -"data-ng-","ng\\:"],k=0;kc&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)===Fc;e++);if(e===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===Fc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Yd&&(d=d.splice(0,Yd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function ih(a, -b,d,c){var e=a.d,f=e.length-a.i;b=A(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;fk;)h.unshift(0),k++;0=b.lgSize&&k.unshift(h.splice(-b.lgSize,h.length).join(""));h.length>b.gSize;)k.unshift(h.splice(-b.gSize,h.length).join(""));h.length&&k.unshift(h.join(""));h=k.join(d);f.length&&(h+=c+f.join(""));e&&(h+="e+"+e)}return 0>a&&!g?b.negPre+h+b.negSuf:b.posPre+ -h+b.posSuf}function Pb(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length-d)f+=d;0===f&&-12===d&&(f=12);return Pb(f,b,c,e)}}function lb(a,b,d){return function(c,e){var f=c["get"+a](),g=vb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Zd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function $d(a){return function(b){var d= -Zd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Pb(b,a)}}function Gc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Td(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,k=b[8]?a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=fa(b[9]+b[10]),g=fa(b[9]+b[11]));k.call(a,fa(b[1]),fa(b[2])-1,fa(b[3]));f=fa(b[4]||0)-f;g=fa(b[5]||0)-g;k=fa(b[6]||0);b=Math.round(1E3*parseFloat("0."+ -(b[7]||0)));h.call(a,f,g,k,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",k=[],h,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;C(c)&&(c=jh.test(c)?fa(c):b(c));X(c)&&(c=new Date(c));if(!ha(c)||!isFinite(c.getTime()))return c;for(;d;)(l=kh.exec(d))?(k=db(k,l,1),d=k.pop()):(k.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=fc(f,m),c=gc(c,f,!0));r(k,function(b){h=lh[b];g+=h?h(c,a.DATETIME_FORMATS, -m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function ch(){return function(a,b){A(b)&&(b=2);return eb(a,b)}}function dh(){return function(a,b,d){b=Infinity===Math.abs(Number(b))?Number(b):fa(b);if(Y(b))return a;X(a)&&(a=a.toString());if(!za(a))return a;d=!d||isNaN(d)?0:fa(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?Hc(a,d,d+b):0===d?Hc(a,b,a.length):Hc(a,Math.max(0,d+b),d)}}function Hc(a,b,d){return C(a)?a.slice(b,d):Ha.call(a,b,d)}function Vd(a){function b(b){return b.map(function(b){var c= -1,d=Ta;if(B(b))d=b;else if(C(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var e=d(),d=function(a){return a[e]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,h=b.type;if(d===h){var h=a.value,l=b.value;"string"===d?(h=h.toLowerCase(),l=l.toLowerCase()):"object"===d&&(D(h)&&(h=a.index),D(l)&&(l=b.index));h!==l&&(c= -hb||37<=b&&40>=b|| -m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut drop",m)}b.on("change",l);if(ee[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!h){var b=this.validity,c=b.badInput,d=b.typeMismatch;h=f.defer(function(){h=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Rb(a,b){return function(d,c){var e,f;if(ha(d))return d;if(C(d)){'"'===d.charAt(0)&&'"'===d.charAt(d.length- -1)&&(d=d.substring(1,d.length-1));if(mh.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,function(a,c){cf.yyyy&&e.setFullYear(f.yyyy),e}return NaN}}function ob(a,b,d,c){return function(e,f,g,k,h,l,m, -p){function n(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function s(a){return w(a)&&!ha(a)?r(a)||void 0:a}function r(a,b){var c=k.$options.getOption("timezone");v&&v!==c&&(b=Uc(b,fc(v)));var e=d(a,b);!isNaN(e)&&c&&(e=gc(e,c));return e}Jc(e,f,g,k,a);Sa(e,f,g,k,h,l);var t="time"===a||"datetimelocal"===a,q,v;k.$parsers.push(function(c){if(k.$isEmpty(c))return null;if(b.test(c))return r(c,q);k.$$parserName=a});k.$formatters.push(function(a){if(a&&!ha(a))throw pb("datefmt",a);if(n(a)){q=a;var b= -k.$options.getOption("timezone");b&&(v=b,q=gc(q,b,!0));var d=c;t&&C(k.$options.getOption("timeSecondsFormat"))&&(d=c.replace("ss.sss",k.$options.getOption("timeSecondsFormat")).replace(/:$/,""));a=m("date")(a,d,b);t&&k.$options.getOption("timeStripZeroSeconds")&&(a=a.replace(/(?::00)?(?:\.000)?$/,""));return a}v=q=null;return""});if(w(g.min)||g.ngMin){var x=g.min||p(g.ngMin)(e),z=s(x);k.$validators.min=function(a){return!n(a)||A(z)||d(a)>=z};g.$observe("min",function(a){a!==x&&(z=s(a),x=a,k.$validate())})}if(w(g.max)|| -g.ngMax){var y=g.max||p(g.ngMax)(e),J=s(y);k.$validators.max=function(a){return!n(a)||A(J)||d(a)<=J};g.$observe("max",function(a){a!==y&&(J=s(a),y=a,k.$validate())})}}}function Jc(a,b,d,c,e){(c.$$hasNativeValidators=D(b[0].validity))&&c.$parsers.push(function(a){var d=b.prop("validity")||{};if(d.badInput||d.typeMismatch)c.$$parserName=e;else return a})}function fe(a){a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if(nh.test(b))return parseFloat(b);a.$$parserName="number"});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!X(b))throw pb("numfmt", -b);b=b.toString()}return b})}function na(a){w(a)&&!X(a)&&(a=parseFloat(a));return Y(a)?void 0:a}function Kc(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function ge(a,b,d){a=Number(a);var c=(a|0)!==a,e=(b|0)!==b,f=(d|0)!==d;if(c||e||f){var g=c?Kc(a):0,k=e?Kc(b):0,h=f?Kc(d):0,g=Math.max(g,k,h),g=Math.pow(10,g);a*=g;b*=g;d*=g;c&&(a=Math.round(a));e&&(b=Math.round(b));f&&(d=Math.round(d))}return 0===(a-b)%d}function he(a,b,d,c,e){if(w(c)){a= -a(c);if(!a.constant)throw pb("constexpr",d,c);return a(b)}return e}function Lc(a,b){function d(a,b){if(!a||!a.length)return[];if(!b||!b.length)return a;var c=[],d=0;a:for(;d(?:<\/\1>|)$/,nc=/<|&#?\w+;/,rg=/<([\w:-]+)/,sg=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,qa={thead:["table"],col:["colgroup","table"],tr:["tbody","table"],td:["tr", -"tbody","table"]};qa.tbody=qa.tfoot=qa.colgroup=qa.caption=qa.thead;qa.th=qa.td;var hb={option:[1,'"],_default:[0,"",""]},Nc;for(Nc in qa){var le=qa[Nc],me=le.slice().reverse();hb[Nc]=[me.length,"<"+me.join("><")+">",""]}hb.optgroup=hb.option;var zg=z.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Wa=U.prototype={ready:hd,toString:function(){var a=[];r(this,function(b){a.push(""+b)});return"["+a.join(", ")+ -"]"},eq:function(a){return 0<=a?x(this[a]):x(this[this.length+a])},length:0,push:ph,sort:[].sort,splice:[].splice},Hb={};r("multiple selected checked disabled readOnly required open".split(" "),function(a){Hb[K(a)]=a});var od={};r("input select option textarea button form details".split(" "),function(a){od[a]=!0});var vd={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern",ngStep:"step"};r({data:sc,removeData:rc,hasData:function(a){for(var b in Ka[a.ng339])return!0; -return!1},cleanData:function(a){for(var b=0,d=a.length;b/,Cg=/^[^(]*\(\s*([^)]*)\)/m,sh=/,/,th=/^\s*(_?)(\S+?)\1\s*$/,Ag=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ca=F("$injector");fb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw C(d)&&d||(d=a.name||Dg(a)),Ca("strictdi",d);b=qd(a);r(b[1].split(sh),function(a){a.replace(th,function(a,b,d){c.push(d)})})}a.$inject=c}}else H(a)?(b=a.length-1,tb(a[b],"fn"),c=a.slice(0,b)):tb(a,"fn",!0);return c};var ne=F("$animate"), -Ef=function(){this.$get=E},Ff=function(){var a=new Ib,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=C(b)?b.split(" "):H(b)?b:[],r(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){r(b,function(b){var c=a.get(b);if(c){var d=Eg(b.attr("class")),e="",f="";r(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});r(b,function(a){e&&Eb(a,e);f&&Db(a,f)});a.delete(b)}});b.length=0}return{enabled:E,on:E,off:E,pin:E,push:function(g, -k,h,l){l&&l();h=h||{};h.from&&g.css(h.from);h.to&&g.css(h.to);if(h.addClass||h.removeClass)if(k=h.addClass,l=h.removeClass,h=a.get(g)||{},k=e(h,k,!0),l=e(h,l,!1),k||l)a.set(g,h),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Cf=["$provide",function(a){var b=this,d=null,c=null;this.$$registeredAnimations=Object.create(null);this.register=function(c,d){if(c&&"."!==c.charAt(0))throw ne("notcsel",c);var g=c+"-animation";b.$$registeredAnimations[c.substr(1)]=g;a.factory(g, -d)};this.customFilter=function(a){1===arguments.length&&(c=B(a)?a:null);return c};this.classNameFilter=function(a){if(1===arguments.length&&(d=a instanceof RegExp?a:null)&&/[(\s|\/)]ng-animate[(\s|\/)]/.test(d.toString()))throw d=null,ne("nongcls","ng-animate");return d};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var e;a:{for(e=0;e <= >= && || ! = |".split(" "),function(a){Vb[a]= -!0});var wh={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Ob=function(a){this.options=a};Ob.prototype={constructor:Ob,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"=== -typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)}, -isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b= -w(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw Ya("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index","<=",">=");)a={type:q.BinaryExpression,operator:b.text, -left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:q.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()}, -primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=Ia(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:q.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression", -this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:q.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:q.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:q.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:q.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression()); -return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:q.Identifier,name:a.text}},constant:function(){return{type:q.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]"); -return{type:q.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:q.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"), -b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:q.ObjectExpression,properties:a}},throwError:function(a,b){throw Ya("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw Ya("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw Ya("ueoe", -this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:q.ThisExpression},$locals:{type:q.LocalsExpression}}};var Hd=2;Ld.prototype={compile:function(a){var b=this;this.state={nextId:0,filters:{},fn:{vars:[], -body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};Z(a,b.$filter);var d="",c;this.stage="assign";if(c=Kd(a))this.state.computing="assign",d=this.nextId(),this.recurse(c,d),this.return_(d),d="fn.assign="+this.generateFunction("assign","s,v,l");c=Id(a.body);b.stage="inputs";r(c,function(a,c){var d="fn"+c;b.state[d]={vars:[],body:[],own:{}};b.state.computing=d;var k=b.nextId();b.recurse(a,k);b.return_(k);b.state.inputs.push({name:d,isPure:a.isPure});a.watchId=c});this.state.computing="fn";this.stage= -"main";this.recurse(a);a='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+d+this.watchFns()+"return fn;";a=(new Function("$filter","getStringValue","ifDefined","plus",a))(this.$filter,Tg,Ug,Gd);this.state=this.stage=void 0;return a},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;r(b,function(b){a.push("var "+b.name+"="+d.generateFunction(b.name,"s"));b.isPure&&a.push(b.name,".isPure="+JSON.stringify(b.isPure)+ -";")});b.length&&a.push("fn.inputs=["+b.map(function(a){return a.name}).join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;r(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")}, -recurse:function(a,b,d,c,e,f){var g,k,h=this,l,m,p;c=c||E;if(!f&&w(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case q.Program:r(a.body,function(b,c){h.recurse(b.expression,void 0,void 0,function(a){k=a});c!==a.body.length-1?h.current().body.push(k,";"):h.return_(k)});break;case q.Literal:m=this.escape(a.value);this.assign(b,m);c(b||m);break;case q.UnaryExpression:this.recurse(a.argument,void 0, -void 0,function(a){k=a});m=a.operator+"("+this.ifDefined(k,0)+")";this.assign(b,m);c(m);break;case q.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){k=a});m="+"===a.operator?this.plus(g,k):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(k,0):"("+g+")"+a.operator+"("+k+")";this.assign(b,m);c(m);break;case q.LogicalExpression:b=b||this.nextId();h.recurse(a.left,b);h.if_("&&"===a.operator?b:h.not(b),h.lazyRecurse(a.right, -b));c(b);break;case q.ConditionalExpression:b=b||this.nextId();h.recurse(a.test,b);h.if_(b,h.lazyRecurse(a.alternate,b),h.lazyRecurse(a.consequent,b));c(b);break;case q.Identifier:b=b||this.nextId();d&&(d.context="inputs"===h.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);h.if_("inputs"===h.stage||h.not(h.getHasOwnProperty("l",a.name)),function(){h.if_("inputs"===h.stage||"s",function(){e&&1!==e&&h.if_(h.isNull(h.nonComputedMember("s",a.name)), -h.lazyAssign(h.nonComputedMember("s",a.name),"{}"));h.assign(b,h.nonComputedMember("s",a.name))})},b&&h.lazyAssign(b,h.nonComputedMember("l",a.name)));c(b);break;case q.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();h.recurse(a.object,g,void 0,function(){h.if_(h.notNull(g),function(){a.computed?(k=h.nextId(),h.recurse(a.property,k),h.getStringValue(k),e&&1!==e&&h.if_(h.not(h.computedMember(g,k)),h.lazyAssign(h.computedMember(g,k),"{}")),m=h.computedMember(g,k),h.assign(b, -m),d&&(d.computed=!0,d.name=k)):(e&&1!==e&&h.if_(h.isNull(h.nonComputedMember(g,a.property.name)),h.lazyAssign(h.nonComputedMember(g,a.property.name),"{}")),m=h.nonComputedMember(g,a.property.name),h.assign(b,m),d&&(d.computed=!1,d.name=a.property.name))},function(){h.assign(b,"undefined")});c(b)},!!e);break;case q.CallExpression:b=b||this.nextId();a.filter?(k=h.filter(a.callee.name),l=[],r(a.arguments,function(a){var b=h.nextId();h.recurse(a,b);l.push(b)}),m=k+"("+l.join(",")+")",h.assign(b,m),c(b)): -(k=h.nextId(),g={},l=[],h.recurse(a.callee,k,g,function(){h.if_(h.notNull(k),function(){r(a.arguments,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m=g.name?h.member(g.context,g.name,g.computed)+"("+l.join(",")+")":k+"("+l.join(",")+")";h.assign(b,m)},function(){h.assign(b,"undefined")});c(b)}));break;case q.AssignmentExpression:k=this.nextId();g={};this.recurse(a.left,void 0,g,function(){h.if_(h.notNull(g.context),function(){h.recurse(a.right,k);m=h.member(g.context, -g.name,g.computed)+a.operator+k;h.assign(b,m);c(b||m)})},1);break;case q.ArrayExpression:l=[];r(a.elements,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(b||m);break;case q.ObjectExpression:l=[];p=!1;r(a.properties,function(a){a.computed&&(p=!0)});p?(b=b||this.nextId(),this.assign(b,"{}"),r(a.properties,function(a){a.computed?(g=h.nextId(),h.recurse(a.key,g)):g=a.key.type===q.Identifier?a.key.name:""+a.key.value;k=h.nextId(); -h.recurse(a.value,k);h.assign(h.member(b,g,a.computed),k)})):(r(a.properties,function(b){h.recurse(b.value,a.constant?void 0:h.nextId(),void 0,function(a){l.push(h.escape(b.key.type===q.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case q.ThisExpression:this.assign(b,"s");c(b||"s");break;case q.LocalsExpression:this.assign(b,"l");c(b||"l");break;case q.NGValueParameter:this.assign(b,"v"),c(b||"v")}},getHasOwnProperty:function(a,b){var d=a+"."+ -b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a, -b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},isNull:function(a){return a+"==null"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a, -b)},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(C(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(X(a))return a.toString();if(!0===a)return"true";if(!1=== -a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw Ya("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};Md.prototype={compile:function(a){var b=this;Z(a,b.$filter);var d,c;if(d=Kd(a))c=this.recurse(d);d=Id(a.body);var e;d&&(e=[],r(d,function(a,c){var d=b.recurse(a);d.isPure=a.isPure;a.input=d;e.push(d);a.watchId=c}));var f=[];r(a.body, -function(a){f.push(b.recurse(a.expression))});a=0===a.body.length?E:1===a.body.length?f[0]:function(a,b){var c;r(f,function(d){c=d(a,b)});return c};c&&(a.assign=function(a,b,d){return c(a,d,b)});e&&(a.inputs=e);return a},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case q.Literal:return this.value(a.value,b);case q.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case q.BinaryExpression:return c=this.recurse(a.left), -e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case q.Identifier:return f.identifier(a.name,b,d);case q.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c, -e,b,d):this.nonComputedMember(c,e,b,d);case q.CallExpression:return g=[],r(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var p=[],n=0;n":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c= -a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k)?b(e,f,g,k):d(e,f,g,k);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0,name:void 0,value:a}:a}},identifier:function(a,b,d){return function(c,e,f,g){c= -e&&a in e?e:c;d&&1!==d&&c&&null==c[a]&&(c[a]={});e=c?c[a]:void 0;return b?{context:c,name:a,value:e}:e}},computedMember:function(a,b,d,c){return function(e,f,g,k){var h=a(e,f,g,k),l,m;null!=h&&(l=b(e,f,g,k),l+="",c&&1!==c&&h&&!h[l]&&(h[l]={}),m=h[l]);return d?{context:h,name:l,value:m}:m}},nonComputedMember:function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k);c&&1!==c&&e&&null==e[b]&&(e[b]={});f=null!=e?e[b]:void 0;return d?{context:e,name:b,value:f}:f}},inputs:function(a,b){return function(d, -c,e,f){return f?f[b]:a(d,c,e)}}};Nb.prototype={constructor:Nb,parse:function(a){a=this.getAst(a);var b=this.astCompiler.compile(a.ast),d=a.ast;b.literal=0===d.body.length||1===d.body.length&&(d.body[0].expression.type===q.Literal||d.body[0].expression.type===q.ArrayExpression||d.body[0].expression.type===q.ObjectExpression);b.constant=a.ast.constant;b.oneTime=a.oneTime;return b},getAst:function(a){var b=!1;a=a.trim();":"===a.charAt(0)&&":"===a.charAt(1)&&(b=!0,a=a.substring(2));return{ast:this.ast.ast(a), -oneTime:b}}};var Ea=F("$sce"),W={HTML:"html",CSS:"css",MEDIA_URL:"mediaUrl",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Dc=/_([a-z])/g,Zg=F("$templateRequest"),$g=F("$timeout"),aa=z.document.createElement("a"),Qd=ga(z.location.href),Na;aa.href="http://[::1]";var ah="[::1]"===aa.hostname;Rd.$inject=["$document"];fd.$inject=["$provide"];var Yd=22,Xd=".",Fc="0";Sd.$inject=["$locale"];Ud.$inject=["$locale"];var lh={yyyy:ea("FullYear",4,0,!1,!0),yy:ea("FullYear",2,0,!0,!0),y:ea("FullYear",1,0,!1,!0), -MMMM:lb("Month"),MMM:lb("Month",!0),MM:ea("Month",2,1),M:ea("Month",1,1),LLLL:lb("Month",!1,!0),dd:ea("Date",2),d:ea("Date",1),HH:ea("Hours",2),H:ea("Hours",1),hh:ea("Hours",2,-12),h:ea("Hours",1,-12),mm:ea("Minutes",2),m:ea("Minutes",1),ss:ea("Seconds",2),s:ea("Seconds",1),sss:ea("Milliseconds",3),EEEE:lb("Day"),EEE:lb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Pb(Math[0=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},kh=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\s\S]*)/,jh=/^-?\d+$/;Td.$inject=["$locale"];var eh=ia(K),fh=ia(vb);Vd.$inject=["$parse"];var Re=ia({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===la.call(b.prop("href"))?"xlink:href":"href"; -b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),wb={};r(Hb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!==a){var c=xa("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,e)});wb[c]=function(){return{restrict:"A",priority:100,link:e}}}});r(vd,function(a,b){wb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"===e.ngPattern.charAt(0)&&(c=e.ngPattern.match(ke))){e.$set("ngPattern",new RegExp(c[1], -c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});r(["src","srcset","href"],function(a){var b=xa("ng-"+a);wb[b]=["$sce",function(d){return{priority:99,link:function(c,e,f){var g=a,k=a;"href"===a&&"[object SVGAnimatedString]"===la.call(e.prop("href"))&&(k="xlinkHref",f.$attr[k]="xlink:href",g=null);f.$set(b,d.getTrustedMediaUrl(f[b]));f.$observe(b,function(b){b?(f.$set(k,b),wa&&g&&e.prop(g,f[k])):"href"===a&&f.$set(k,null)})}}}]});var mb={$addControl:E,$getControls:ia([]),$$renameControl:function(a, -b){a.$name=b},$removeControl:E,$setValidity:E,$setDirty:E,$setPristine:E,$setSubmitted:E,$$setSubmitted:E};Qb.$inject=["$element","$attrs","$scope","$animate","$interpolate"];Qb.prototype={$rollbackViewValue:function(){r(this.$$controls,function(a){a.$rollbackViewValue()})},$commitViewValue:function(){r(this.$$controls,function(a){a.$commitViewValue()})},$addControl:function(a){Ja(a.$name,"input");this.$$controls.push(a);a.$name&&(this[a.$name]=a);a.$$parentForm=this},$getControls:function(){return ja(this.$$controls)}, -$$renameControl:function(a,b){var d=a.$name;this[d]===a&&delete this[d];this[b]=a;a.$name=b},$removeControl:function(a){a.$name&&this[a.$name]===a&&delete this[a.$name];r(this.$pending,function(b,d){this.$setValidity(d,null,a)},this);r(this.$error,function(b,d){this.$setValidity(d,null,a)},this);r(this.$$success,function(b,d){this.$setValidity(d,null,a)},this);cb(this.$$controls,a);a.$$parentForm=mb},$setDirty:function(){this.$$animate.removeClass(this.$$element,Za);this.$$animate.addClass(this.$$element, -Wb);this.$dirty=!0;this.$pristine=!1;this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,Za,Wb+" ng-submitted");this.$dirty=!1;this.$pristine=!0;this.$submitted=!1;r(this.$$controls,function(a){a.$setPristine()})},$setUntouched:function(){r(this.$$controls,function(a){a.$setUntouched()})},$setSubmitted:function(){for(var a=this;a.$$parentForm&&a.$$parentForm!==mb;)a=a.$$parentForm;a.$$setSubmitted()},$$setSubmitted:function(){this.$$animate.addClass(this.$$element, -"ng-submitted");this.$submitted=!0;r(this.$$controls,function(a){a.$$setSubmitted&&a.$$setSubmitted()})}};ce({clazz:Qb,set:function(a,b,d){var c=a[b];c?-1===c.indexOf(d)&&c.push(d):a[b]=[d]},unset:function(a,b,d){var c=a[b];c&&(cb(c,d),0===c.length&&delete a[b])}});var oe=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||E}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Qb,compile:function(d,f){d.addClass(Za).addClass(nb); -var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var p=f[0];if(!("action"in e)){var n=function(b){a.$apply(function(){p.$commitViewValue();p.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",n);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",n)},0,!1)})}(f[1]||p.$$parentForm).$addControl(p);var s=g?c(p.$name):E;g&&(s(a,p),e.$observe(g,function(b){p.$name!==b&&(s(a,void 0),p.$$parentForm.$$renameControl(p,b),s=c(p.$name),s(a,p))})); -d.on("$destroy",function(){p.$$parentForm.$removeControl(p);s(a,void 0);S(p,mb)})}}}}}]},Se=oe(),df=oe(!0),mh=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,xh=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,yh=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/, -nh=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,pe=/^(\d{4,})-(\d{2})-(\d{2})$/,qe=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Oc=/^(\d{4,})-W(\d\d)$/,re=/^(\d{4,})-(\d\d)$/,se=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,ee=T();r(["date","datetime-local","month","time","week"],function(a){ee[a]=!0});var te={text:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c)},date:ob("date",pe,Rb(pe,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":ob("datetimelocal",qe,Rb(qe,"yyyy MM dd HH mm ss sss".split(" ")), -"yyyy-MM-ddTHH:mm:ss.sss"),time:ob("time",se,Rb(se,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:ob("week",Oc,function(a,b){if(ha(a))return a;if(C(a)){Oc.lastIndex=0;var d=Oc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,k=0,h=Zd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),k=b.getMilliseconds());return new Date(c,0,h.getDate()+e,d,f,g,k)}}return NaN},"yyyy-Www"),month:ob("month",re,Rb(re,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f,g,k){Jc(a,b,d,c,"number");fe(c);Sa(a, -b,d,c,e,f);var h;if(w(d.min)||d.ngMin){var l=d.min||k(d.ngMin)(a);h=na(l);c.$validators.min=function(a,b){return c.$isEmpty(b)||A(h)||b>=h};d.$observe("min",function(a){a!==l&&(h=na(a),l=a,c.$validate())})}if(w(d.max)||d.ngMax){var m=d.max||k(d.ngMax)(a),p=na(m);c.$validators.max=function(a,b){return c.$isEmpty(b)||A(p)||b<=p};d.$observe("max",function(a){a!==m&&(p=na(a),m=a,c.$validate())})}if(w(d.step)||d.ngStep){var n=d.step||k(d.ngStep)(a),s=na(n);c.$validators.step=function(a,b){return c.$isEmpty(b)|| -A(s)||ge(b,h||0,s)};d.$observe("step",function(a){a!==n&&(s=na(a),n=a,c.$validate())})}},url:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c);c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||xh.test(d)}},email:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c);c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||yh.test(d)}},radio:function(a,b,d,c){var e=!d.ngTrim||"false"!==V(d.ngTrim);A(d.name)&&b.attr("name",++qb);b.on("change",function(a){var g;b[0].checked&&(g=d.value,e&&(g= -V(g)),c.$setViewValue(g,a&&a.type))});c.$render=function(){var a=d.value;e&&(a=V(a));b[0].checked=a===c.$viewValue};d.$observe("value",c.$render)},range:function(a,b,d,c,e,f){function g(a,c){b.attr(a,d[a]);var e=d[a];d.$observe(a,function(a){a!==e&&(e=a,c(a))})}function k(a){p=na(a);Y(c.$modelValue)||(m?(a=b.val(),p>a&&(a=p,b.val(a)),c.$setViewValue(a)):c.$validate())}function h(a){n=na(a);Y(c.$modelValue)||(m?(a=b.val(),n=p},g("min",k)); -e&&(n=na(d.max),c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||A(n)||b<=n},g("max",h));f&&(s=na(d.step),c.$validators.step=m?function(){return!r.stepMismatch}:function(a,b){return c.$isEmpty(b)||A(s)||ge(b,p||0,s)},g("step",l))},checkbox:function(a,b,d,c,e,f,g,k){var h=he(k,a,"ngTrueValue",d.ngTrueValue,!0),l=he(k,a,"ngFalseValue",d.ngFalseValue,!1);b.on("change",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty= -function(a){return!1===a};c.$formatters.push(function(a){return va(a,h)});c.$parsers.push(function(a){return a?h:l})},hidden:E,button:E,submit:E,reset:E,file:E},$c=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,k){k[0]&&(te[K(g.type)]||te.text)(e,f,g,k[0],b,a,d,c)}}}}],Af=function(){var a={configurable:!0,enumerable:!1,get:function(){return this.getAttribute("value")||""},set:function(a){this.setAttribute("value",a)}}; -return{restrict:"E",priority:200,compile:function(b,d){if("hidden"===K(d.type))return{pre:function(b,d,f,g){b=d[0];b.parentNode&&b.parentNode.insertBefore(b,b.nextSibling);Object.defineProperty&&Object.defineProperty(b,"value",a)}}}}},zh=/^(true|false|\d+)$/,xf=function(){function a(a,d,c){var e=w(c)?c:9===wa?"":null;a.prop("value",e);d.$set("value",c)}return{restrict:"A",priority:100,compile:function(b,d){return zh.test(d.ngValue)?function(b,d,f){b=b.$eval(f.ngValue);a(d,f,b)}:function(b,d,f){b.$watch(f.ngValue, -function(b){a(d,f,b)})}}}},We=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=jc(a)})}}}}],Ye=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=A(a)?"":a})}}}}], -Xe=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){var d=f(b);c.html(a.getTrustedHtml(d)||"")})}}}}],wf=ia({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Ze=Lc("",!0),af=Lc("Odd",0),$e=Lc("Even",1),bf=Ra({compile:function(a, -b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),cf=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],ed={},Ah={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=xa("ng-"+a);ed[b]=["$parse","$rootScope","$exceptionHandler",function(d,c,e){return sd(d,c,e,b,a,Ah[a])}]});var ff=["$animate","$compile",function(a,b){return{multiElement:!0, -transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var k,h,l;d.$watch(e.ngIf,function(d){d?h||g(function(d,f){h=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);k={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),h&&(h.$destroy(),h=null),k&&(l=ub(k.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),k=null))})}}}],gf=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element", -controller:ca.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",k=e.autoscroll;return function(c,e,m,p,n){var r=0,q,t,x,v=function(){t&&(t.remove(),t=null);q&&(q.$destroy(),q=null);x&&(d.leave(x).done(function(a){!1!==a&&(t=null)}),t=x,x=null)};c.$watch(f,function(f){var m=function(a){!1===a||!w(k)||k&&!c.$eval(k)||b()},t=++r;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&t===r){var b=c.$new();p.template=a;a=n(b,function(a){v();d.enter(a,null,e).done(m)});q=b;x=a;q.$emit("$includeContentLoaded", -f);c.$eval(g)}},function(){c.$$destroyed||t!==r||(v(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(v(),p.template=null)})}}}}],zf=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){la.call(d[0]).match(/SVG/)?(d.empty(),a(gd(e.template,z.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],hf=Ra({priority:450,compile:function(){return{pre:function(a, -b,d){a.$eval(d.ngInit)}}}}),vf=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=d.ngList||", ",f="false"!==d.ngTrim,g=f?V(e):e;c.$parsers.push(function(a){if(!A(a)){var b=[];a&&r(a.split(g),function(a){a&&b.push(f?V(a):a)});return b}});c.$formatters.push(function(a){if(H(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},nb="ng-valid",be="ng-invalid",Za="ng-pristine",Wb="ng-dirty",pb=F("ngModel");Sb.$inject="$scope $exceptionHandler $attrs $element $parse $animate $timeout $q $interpolate".split(" "); -Sb.prototype={$$initGetterSetters:function(){if(this.$options.getOption("getterSetter")){var a=this.$$parse(this.$$attr.ngModel+"()"),b=this.$$parse(this.$$attr.ngModel+"($$$p)");this.$$ngModelGet=function(b){var c=this.$$parsedNgModel(b);B(c)&&(c=a(b));return c};this.$$ngModelSet=function(a,c){B(this.$$parsedNgModel(a))?b(a,{$$$p:c}):this.$$parsedNgModelAssign(a,c)}}else if(!this.$$parsedNgModel.assign)throw pb("nonassign",this.$$attr.ngModel,Aa(this.$$element));},$render:E,$isEmpty:function(a){return A(a)|| -""===a||null===a||a!==a},$$updateEmptyClasses:function(a){this.$isEmpty(a)?(this.$$animate.removeClass(this.$$element,"ng-not-empty"),this.$$animate.addClass(this.$$element,"ng-empty")):(this.$$animate.removeClass(this.$$element,"ng-empty"),this.$$animate.addClass(this.$$element,"ng-not-empty"))},$setPristine:function(){this.$dirty=!1;this.$pristine=!0;this.$$animate.removeClass(this.$$element,Wb);this.$$animate.addClass(this.$$element,Za)},$setDirty:function(){this.$dirty=!0;this.$pristine=!1;this.$$animate.removeClass(this.$$element, -Za);this.$$animate.addClass(this.$$element,Wb);this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1;this.$untouched=!0;this.$$animate.setClass(this.$$element,"ng-untouched","ng-touched")},$setTouched:function(){this.$touched=!0;this.$untouched=!1;this.$$animate.setClass(this.$$element,"ng-touched","ng-untouched")},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce);this.$viewValue=this.$$lastCommittedViewValue;this.$render()},$validate:function(){if(!Y(this.$modelValue)){var a= -this.$$lastCommittedViewValue,b=this.$$rawModelValue,d=this.$valid,c=this.$modelValue,e=this.$options.getOption("allowInvalid"),f=this;this.$$runValidators(b,a,function(a){e||d===a||(f.$modelValue=a?b:void 0,f.$modelValue!==c&&f.$$writeModelToScope())})}},$$runValidators:function(a,b,d){function c(){var c=!0;r(h.$validators,function(d,e){var g=Boolean(d(a,b));c=c&&g;f(e,g)});return c?!0:(r(h.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;r(h.$asyncValidators,function(e, -g){var h=e(a,b);if(!h||!B(h.then))throw pb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?h.$$q.all(c).then(function(){g(d)},E):g(!0)}function f(a,b){k===h.$$currentValidationRunId&&h.$setValidity(a,b)}function g(a){k===h.$$currentValidationRunId&&d(a)}this.$$currentValidationRunId++;var k=this.$$currentValidationRunId,h=this;(function(){var a=h.$$parserName;if(A(h.$$parserValid))f(a,null);else return h.$$parserValid||(r(h.$validators,function(a, -b){f(b,null)}),r(h.$asyncValidators,function(a,b){f(b,null)})),f(a,h.$$parserValid),h.$$parserValid;return!0})()?c()?e():g(!1):g(!1)},$commitViewValue:function(){var a=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce);if(this.$$lastCommittedViewValue!==a||""===a&&this.$$hasNativeValidators)this.$$updateEmptyClasses(a),this.$$lastCommittedViewValue=a,this.$pristine&&this.$setDirty(),this.$$parseAndValidate()},$$parseAndValidate:function(){var a=this.$$lastCommittedViewValue,b=this;this.$$parserValid= -A(a)?void 0:!0;this.$setValidity(this.$$parserName,null);this.$$parserName="parse";if(this.$$parserValid)for(var d=0;dg||e.$isEmpty(b)||b.length<=g}}}}}],cd= -["$parse",function(a){return{restrict:"A",require:"?ngModel",link:function(b,d,c,e){if(e){var f=c.minlength||a(c.ngMinlength)(b),g=Ub(f)||-1;c.$observe("minlength",function(a){f!==a&&(g=Ub(a)||-1,f=a,e.$validate())});e.$validators.minlength=function(a,b){return e.$isEmpty(b)||b.length>=g}}}}}];z.angular.bootstrap?z.console&&console.log("WARNING: Tried to load AngularJS more than once."):(Je(),Oe(ca),ca.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1== -b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "), -WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a, -c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),x(function(){Ee(z.document,Wc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(window.angular.element("'];r.cellXfs.forEach(function(e,r){var a=[];a.push(lr("NumberFormat",null,{"ss:Format":He(D._table[e.numFmtId])}));var n={"ss:ID":"s"+(21+r)};t.push(lr("Style",a.join(""),n))});return lr("Styles",t.join(""))}function dp(e){return lr("NamedRange",null,{"ss:Name":e.Name,"ss:RefersTo":"="+sc(e.Ref,{r:0,c:0})})}function vp(e){if(!((e||{}).Workbook||{}).Names)return"";var r=e.Workbook.Names;var t=[];for(var a=0;a");if(e["!margins"].header)n.push(lr("Header",null,{"x:Margin":e["!margins"].header}));if(e["!margins"].footer)n.push(lr("Footer",null,{"x:Margin":e["!margins"].footer}));n.push(lr("PageMargins",null,{"x:Bottom":e["!margins"].bottom||"0.75","x:Left":e["!margins"].left||"0.7","x:Right":e["!margins"].right||"0.7","x:Top":e["!margins"].top||"0.75"}));n.push("")}if(a&&a.Workbook&&a.Workbook.Sheets&&a.Workbook.Sheets[t]){if(a.Workbook.Sheets[t].Hidden)n.push(lr("Visible",a.Workbook.Sheets[t].Hidden==1?"SheetHidden":"SheetVeryHidden",{}));else{for(var i=0;i")}}if(((((a||{}).Workbook||{}).Views||[])[0]||{}).RTL)n.push("");if(e["!protect"]){n.push(fr("ProtectContents","True"));if(e["!protect"].objects)n.push(fr("ProtectObjects","True"));if(e["!protect"].scenarios)n.push(fr("ProtectScenarios","True"));if(e["!protect"].selectLockedCells!=null&&!e["!protect"].selectLockedCells)n.push(fr("EnableSelection","NoSelection"));else if(e["!protect"].selectUnlockedCells!=null&&!e["!protect"].selectUnlockedCells)n.push(fr("EnableSelection","UnlockedCells"));[["formatCells","AllowFormatCells"],["formatColumns","AllowSizeCols"],["formatRows","AllowSizeRows"],["insertColumns","AllowInsertCols"],["insertRows","AllowInsertRows"],["insertHyperlinks","AllowInsertHyperlinks"],["deleteColumns","AllowDeleteCols"],["deleteRows","AllowDeleteRows"],["sort","AllowSort"],["autoFilter","AllowFilter"],["pivotTables","AllowUsePivotTables"]].forEach(function(r){if(e["!protect"][r[0]])n.push("<"+r[1]+"/>")})}if(n.length==0)return"";return lr("WorksheetOptions",n.join(""),{xmlns:dr.x})}function bp(e){return e.map(function(e){var r=Ke(e.t||"");var t=lr("ss:Data",r,{xmlns:"http://www.w3.org/TR/REC-html40"});return lr("Comment",t,{"ss:Author":e.a})}).join("")}function gp(e,r,t,a,n,i,s){if(!e||e.v==undefined&&e.f==undefined)return"";var f={};if(e.f)f["ss:Formula"]="="+He(sc(e.f,s));if(e.F&&e.F.slice(0,r.length)==r){var o=mt(e.F.slice(r.length+1));f["ss:ArrayRange"]="RC:R"+(o.r==s.r?"":"["+(o.r-s.r)+"]")+"C"+(o.c==s.c?"":"["+(o.c-s.c)+"]")}if(e.l&&e.l.Target){f["ss:HRef"]=He(e.l.Target);if(e.l.Tooltip)f["x:HRefScreenTip"]=He(e.l.Tooltip)}if(t["!merges"]){var l=t["!merges"];for(var c=0;c!=l.length;++c){if(l[c].s.c!=s.c||l[c].s.r!=s.r)continue;if(l[c].e.c>l[c].s.c)f["ss:MergeAcross"]=l[c].e.c-l[c].s.c;if(l[c].e.r>l[c].s.r)f["ss:MergeDown"]=l[c].e.r-l[c].s.r}}var u="",h="";switch(e.t){case"z":if(!a.sheetStubs)return"";break;case"n":u="Number";h=String(e.v);break;case"b":u="Boolean";h=e.v?"1":"0";break;case"e":u="Error";h=xa[e.v];break;case"d":u="DateTime";h=new Date(e.v).toISOString();if(e.z==null)e.z=e.z||D._table[14];break;case"s":u="String";h=Ge(e.v||"");break;}var d=vh(a.cellXfs,e,a);f["ss:StyleID"]="s"+(21+d);f["ss:Index"]=s.c+1;var v=e.v!=null?h:"";var p=e.t=="z"?"":''+v+"";if((e.c||[]).length>0)p+=bp(e.c);return lr("Cell",p,f)}function wp(e,r){var t='"}function kp(e,r,t,a){if(!e["!ref"])return"";var n=kt(e["!ref"]);var i=e["!merges"]||[],s=0;var f=[];if(e["!cols"])e["!cols"].forEach(function(e,r){So(e);var t=!!e.width;var a=hh(r,e);var n={"ss:Index":r+1};if(t)n["ss:Width"]=bo(a.width);if(e.hidden)n["ss:Hidden"]="1";f.push(lr("Column",null,n))});var o=Array.isArray(e);for(var l=n.s.r;l<=n.e.r;++l){var c=[wp(l,(e["!rows"]||[])[l])];for(var u=n.s.c;u<=n.e.c;++u){var h=false;for(s=0;s!=i.length;++s){if(i[s].s.c>u)continue;if(i[s].s.r>l)continue;if(i[s].e.c");if(c.length>2)f.push(c.join(""))}return f.join("")}function Ep(e,r,t){var a=[];var n=t.SheetNames[e];var i=t.Sheets[n];var s=i?pp(i,r,e,t):"";if(s.length>0)a.push(""+s+"");s=i?kp(i,r,e,t):"";if(s.length>0)a.push(""+s+"
");a.push(mp(i,r,e,t));return a.join("")}function Sp(e,r){if(!r)r={};if(!e.SSF)e.SSF=D.get_table();if(e.SSF){F(D);D.load_table(e.SSF);r.revssf=J(e.SSF);r.revssf[e.SSF[65535]]=0;r.ssf=e.SSF;r.cellXfs=[];vh(r.cellXfs,{},{revssf:{General:0}})}var t=[];t.push(cp(e,r));t.push(up(e,r));t.push("");t.push("");for(var a=0;a40)return r;t.l-=4;r.Reserved1=t._R(0,"lpstr-ansi");if(t.length-t.l<=4)return r;a=t._R(4);if(a!==1907505652)return r;r.UnicodeClipboardFormat=na(t);a=t._R(4);if(a==0||a>40)return r;t.l-=4;r.Reserved2=t._R(0,"lpwstr")}function Cp(e,r,t,a){var n=t;var i=[];var s=r.slice(r.l,r.l+n);if(a&&a.enc&&a.enc.insitu)switch(e.n){case"BOF":;case"FilePass":;case"FileLock":;case"InterfaceHdr":;case"RRDInfo":;case"RRDHead":;case"UsrExcl":break;default:if(s.length===0)break;a.enc.insitu(s);}i.push(s);r.l+=n;var f=Pp[Mr(r,r.l)];var o=0;while(f!=null&&f.n.slice(0,8)==="Continue"){n=Mr(r,r.l+2);o=r.l+4;if(f.n=="ContinueFrt")o+=4;else if(f.n.slice(0,11)=="ContinueFrt")o+=12;i.push(r.slice(o,r.l+4+n));r.l+=4+n;f=Pp[Mr(r,r.l)]}var l=I(i);Yr(l,0);var c=0;l.lens=[];for(var u=0;u1)return;if(t.sheetRows&&e.r>=t.sheetRows)_=false;if(!_)return;if(t.cellStyles&&r.XF&&r.XF.data)A(e,r,t);delete r.ixfe;delete r.XF;h=e;d=bt(e);if(!s||!s.s||!s.e)s={s:{r:0,c:0},e:{r:0,c:0}};if(e.rs.e.r)s.e.r=e.r+1;if(e.c+1>s.e.c)s.e.c=e.c+1;if(t.cellFormula&&r.f){for(var a=0;ae.c||k[a][0].s.r>e.r)continue;if(k[a][0].e.c>8)!==J)throw new Error("rt mismatch: "+ee+"!="+J);if(q.r==12){e.l+=10;Q-=10}}var re={};if(q.n==="EOF")re=q.f(e,Q,R);else re=Cp(q,e,Q,R);var te=q.n;if(V==0&&te!="BOF")continue;switch(te){case"Date1904":t.opts.Date1904=T.WBProps.date1904=re;break;case"WriteProtect":t.opts.WriteProtect=true;break;case"FilePass":if(!R.enc)e.l=0;R.enc=re;if(!r.password)throw new Error("File is password-protected");if(re.valid==null)throw new Error("Encryption scheme unsupported");if(!re.valid)throw new Error("Password is incorrect");break;case"WriteAccess":R.lastuser=re;break;case"FileSharing":break;case"CodePage":var ae=Number(re);switch(ae){case 21010:ae=1200;break;case 32768:ae=1e4;break;case 32769:ae=1252;break;}o(R.codepage=ae);Y=true;break;case"RRTabId":R.rrtabid=re;break;case"WinProtect":R.winlocked=re;break;case"Template":break;case"BookBool":break;case"UsesELFs":break;case"MTRSettings":break;case"RefreshAll":;case"CalcCount":;case"CalcDelta":;case"CalcIter":;case"CalcMode":;case"CalcPrecision":;case"CalcSaveRecalc":t.opts[te]=re;break;case"CalcRefMode":R.CalcRefMode=re;break;case"Uncalced":break;case"ForceFullCalculation":t.opts.FullCalc=re;break;case"WsBool":if(re.fDialog)n["!type"]="dialog";break;case"XF":C.push(re);break;case"ExtSST":break;case"BookExt":break;case"RichTextStream":break;case"BkHim":break;case"SupBook":H.push([re]);H[H.length-1].XTI=[];break;case"ExternName":H[H.length-1].push(re);break;case"Index":break;case"Lbl":$={Name:re.Name,Ref:zu(re.rgce,s,null,H,R)};if(re.itab>0)$.Sheet=re.itab-1;H.names.push($);if(!H[0]){H[0]=[];H[0].XTI=[]}H[H.length-1].push(re);if(re.Name=="_xlnm._FilterDatabase"&&re.itab>0)if(re.rgce&&re.rgce[0]&&re.rgce[0][0]&&re.rgce[0][0][0]=="PtgArea3d")j[re.itab-1]={ref:wt(re.rgce[0][0][1][2])};break;case"ExternCount":R.ExternCount=re;break;case"ExternSheet":if(H.length==0){H[0]=[];H[0].XTI=[]}H[H.length-1].XTI=H[H.length-1].XTI.concat(re);H.XTI=H.XTI.concat(re);break;case"NameCmt":if(R.biff<8)break;if($!=null)$.Comment=re[1];break;case"Protect":n["!protect"]=re;break;case"Password":if(re!==0&&R.WTF)console.error("Password verifier: "+re);break;case"Prot4Rev":;case"Prot4RevPass":break;case"BoundSheet8":{i[re.pos]=re;R.snames.push(re.name)}break;case"EOF":{if(--V)break;if(s.e){if(s.e.r>0&&s.e.c>0){s.e.r--;s.e.c--;n["!ref"]=wt(s);if(r.sheetRows&&r.sheetRows<=s.e.r){var ne=s.e.r;s.e.r=r.sheetRows-1;n["!fullref"]=n["!ref"];n["!ref"]=wt(s);s.e.r=ne}s.e.r++;s.e.c++}if(F.length>0)n["!merges"]=F;if(P.length>0)n["!objects"]=P;if(N.length>0)n["!cols"]=N;if(L.length>0)n["!rows"]=L;T.Sheets.push(y)}if(c==="")u=n;else a[c]=n;n=r.dense?[]:{}}break;case"BOF":{if(R.biff===8)R.biff={9:2,521:3,1033:4}[J]||{512:2,768:3,1024:4,1280:5,1536:8,2:2,7:2}[re.BIFFVer]||8;if(R.biff==8&&re.BIFFVer==0&&re.dt==16)R.biff=2;if(V++)break;_=true;n=r.dense?[]:{};if(R.biff<8&&!Y){Y=true;o(R.codepage=r.codepage||1252)}if(R.biff<5){if(c==="")c="Sheet1";s={s:{r:0,c:0},e:{r:0,c:0}};var ie={pos:e.l-Q,name:c};i[ie.pos]=ie;R.snames.push(c)}else c=(i[Z]||{name:""}).name;if(re.dt==32)n["!type"]="chart";if(re.dt==64)n["!type"]="macro";F=[];P=[];R.arrayf=k=[];N=[];L=[];M=U=0;z=false;y={Hidden:(i[Z]||{hs:0}).hs,name:c}}break;case"Number":;case"BIFF2NUM":;case"BIFF2INT":{if(n["!type"]=="chart")if(r.dense?(n[re.r]||[])[re.c]:n[bt({c:re.c,r:re.r})])++re.c;E={ixfe:re.ixfe,XF:C[re.ixfe]||{},v:re.val,t:"n"};if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I({c:re.c,r:re.r},E,r)}break;case"BoolErr":{E={ixfe:re.ixfe,XF:C[re.ixfe],v:re.val,t:re.t};if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I({c:re.c,r:re.r},E,r)}break;case"RK":{E={ixfe:re.ixfe,XF:C[re.ixfe],v:re.rknum,t:"n"};if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I({c:re.c,r:re.r},E,r)}break;case"MulRk":{for(var se=re.c;se<=re.C;++se){var fe=re.rkrec[se-re.c][0];E={ixfe:fe,XF:C[fe],v:re.rkrec[se-re.c][1],t:"n"};if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I({c:se,r:re.r},E,r)}}break;case"Formula":{if(re.val=="String"){f=re;break}E=Tp(re.val,re.cell.ixfe,re.tt);E.XF=C[E.ixfe];if(r.cellFormula){var oe=re.formula;if(oe&&oe[0]&&oe[0][0]&&oe[0][0][0]=="PtgExp"){var le=oe[0][0][1][0],ce=oe[0][0][1][1];var ue=bt({r:le,c:ce});if(w[ue])E.f=""+zu(re.formula,s,re.cell,H,R);else E.F=((r.dense?(n[le]||[])[ce]:n[ue])||{}).F}else E.f=""+zu(re.formula,s,re.cell,H,R)}if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I(re.cell,E,r);f=re}break;case"String":{if(f){f.val=re;E=Tp(re,f.cell.ixfe,"s");E.XF=C[E.ixfe];if(r.cellFormula){E.f=""+zu(f.formula,s,f.cell,H,R)}if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I(f.cell,E,r);f=null}else throw new Error("String record expects Formula")}break;case"Array":{k.push(re);var he=bt(re[0].s);v=r.dense?(n[re[0].s.r]||[])[re[0].s.c]:n[he];if(r.cellFormula&&v){if(!f)break;if(!he||!v)break;v.f=""+zu(re[1],s,re[0],H,R);v.F=wt(re[0])}}break;case"ShrFmla":{if(!_)break;if(!r.cellFormula)break;if(d){if(!f)break;w[bt(f.cell)]=re[0];v=r.dense?(n[f.cell.r]||[])[f.cell.c]:n[bt(f.cell)];(v||{}).f=""+zu(re[0],s,h,H,R)}}break;case"LabelSst":E=Tp(l[re.isst].t,re.ixfe,"s");if(l[re.isst].h)E.h=l[re.isst].h;E.XF=C[E.ixfe];if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I({c:re.c,r:re.r},E,r);break;case"Blank":if(r.sheetStubs){E={ixfe:re.ixfe,XF:C[re.ixfe],t:"z"};if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I({c:re.c,r:re.r},E,r)}break;case"MulBlank":if(r.sheetStubs){for(var de=re.c;de<=re.C;++de){var ve=re.ixfe[de-re.c];E={ixfe:ve,XF:C[ve],t:"z"};if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I({c:de,r:re.r},E,r)}}break;case"RString":;case"Label":;case"BIFF2STR":E=Tp(re.val,re.ixfe,"s");E.XF=C[E.ixfe];if(X>0)E.z=G[E.ixfe>>8&31];Bp(E,r,t.opts.Date1904);I({c:re.c,r:re.r},E,r);break;case"Dimensions":{if(V===1)s=re}break;case"SST":{l=re}break;case"Format":{if(R.biff==4){G[X++]=re[1];for(var pe=0;pe=163)D.load(re[1],X+163)}else D.load(re[1],re[0])}break;case"BIFF2FORMAT":{G[X++]=re;for(var me=0;me=163)D.load(re,X+163)}break;case"MergeCells":F=F.concat(re);break;case"Obj":P[re.cmo[0]]=R.lastobj=re;break;case"TxO":R.lastobj.TxO=re;break;case"ImData":R.lastobj.ImData=re;break;case"HLink":{for(g=re[0].s.r;g<=re[0].e.r;++g)for(b=re[0].s.c;b<=re[0].e.c;++b){v=r.dense?(n[g]||[])[b]:n[bt({c:b,r:g})];if(v)v.l=re[1]}}break;case"HLinkTooltip":{for(g=re[0].s.r;g<=re[0].e.r;++g)for(b=re[0].s.c;b<=re[0].e.c;++b){v=r.dense?(n[g]||[])[b]:n[bt({c:b,r:g})];if(v&&v.l)v.l.Tooltip=re[1]}}break;case"Note":{if(R.biff<=5&&R.biff>=2)break;v=r.dense?(n[re[0].r]||[])[re[0].c]:n[bt(re[0])];var be=P[re[2]];if(!v){if(r.dense){if(!n[re[0].r])n[re[0].r]=[];v=n[re[0].r][re[0].c]={t:"z"}}else{v=n[bt(re[0])]={t:"z"}}s.e.r=Math.max(s.e.r,re[0].r);s.s.r=Math.min(s.s.r,re[0].r);s.e.c=Math.max(s.e.c,re[0].c);s.s.c=Math.min(s.s.c,re[0].c)}if(!v.c)v.c=[];p={a:re[1],t:be.TxO.t};v.c.push(p)}break;default:switch(q.n){case"ClrtClient":break;case"XFExt":Rl(C[re.ixfe],re.ext);break;case"DefColWidth":M=re;break;case"DefaultRowHeight":U=re[1];break;case"ColInfo":{if(!R.cellStyles)break;while(re.e>=re.s){N[re.e--]={width:re.w/256};if(!z){z=true;Eo(re.w/256)}So(N[re.e+1])}}break;case"Row":{var ge={};if(re.level!=null){L[re.r]=ge;ge.level=re.level}if(re.hidden){L[re.r]=ge;ge.hidden=true}if(re.hpt){L[re.r]=ge;ge.hpt=re.hpt;ge.hpx=To(re.hpt)}}break;case"LeftMargin":;case"RightMargin":;case"TopMargin":;case"BottomMargin":if(!n["!margins"])dh(n["!margins"]={});n["!margins"][te.slice(0,-6).toLowerCase()]=re;break;case"Setup":if(!n["!margins"])dh(n["!margins"]={});n["!margins"].header=re.header;n["!margins"].footer=re.footer;break;case"Window2":if(re.RTL)T.Views[0].RTL=true;break;case"Header":break;case"Footer":break;case"HCenter":break;case"VCenter":break;case"Pls":break;case"GCW":break;case"LHRecord":break;case"DBCell":break;case"EntExU2":break;case"SxView":break;case"Sxvd":break;case"SXVI":break;case"SXVDEx":break;case"SxIvd":break;case"SXString":break;case"Sync":break;case"Addin":break;case"SXDI":break;case"SXLI":break;case"SXEx":break;case"QsiSXTag":break;case"Selection":break;case"Feat":break;case"FeatHdr":;case"FeatHdr11":break;case"Feature11":;case"Feature12":;case"List12":break;case"Country":S=re;break;case"RecalcId":break;case"DxGCol":break;case"Fbi":;case"Fbi2":;case"GelFrame":break;case"Font":break;case"XFCRC":break;case"Style":break;case"StyleExt":break;case"Palette":B=re;break;case"Theme":O=re;break;case"ScenarioProtect":break;case"ObjProtect":break;case"CondFmt12":break;case"Table":break;case"TableStyles":break;case"TableStyle":break;case"TableStyleElement":break;case"SXStreamID":break;case"SXVS":break;case"DConRef":break;case"SXAddl":break;case"DConBin":break;case"DConName":break;case"SXPI":break;case"SxFormat":break;case"SxSelect":break;case"SxRule":break;case"SxFilt":break;case"SxItm":break;case"SxDXF":break;case"ScenMan":break;case"DCon":break;case"CellWatch":break;case"PrintRowCol":break;case"PrintGrid":break;case"PrintSize":break;case"XCT":break;case"CRN":break;case"Scl":{}break;case"SheetExt":{}break;case"SheetExtOptional":{}break;case"ObNoMacros":{}break;case"ObProj":{}break;case"CodeName":{if(!c)T.WBProps.CodeName=re||"ThisWorkbook";else y.CodeName=re||y.name}break;case"GUIDTypeLib":{}break;case"WOpt":break;case"PhoneticInfo":break;case"OleObjectSize":break;case"DXF":;case"DXFN":;case"DXFN12":;case"DXFN12List":;case"DXFN12NoCB":break;case"Dv":;case"DVal":break;case"BRAI":;case"Series":;case"SeriesText":break;case"DConn":break;case"DbOrParamQry":break;case"DBQueryExt":break;case"OleDbConn":break;case"ExtString":break;case"IFmtRecord":break;case"CondFmt":;case"CF":;case"CF12":;case"CFEx":break;case"Excel9File":break;case"Units":break;case"InterfaceHdr":;case"Mms":;case"InterfaceEnd":;case"DSF":break;case"BuiltInFnGroupCount":break;case"Window1":;case"HideObj":;case"GridSet":;case"Guts":;case"UserBView":;case"UserSViewBegin":;case"UserSViewEnd":break;case"Pane":break;default:switch(q.n){case"Dat":;case"Begin":;case"End":;case"StartBlock":;case"EndBlock":;case"Frame":;case"Area":;case"Axis":;case"AxisLine":;case"Tick":break;case"AxesUsed":;case"CrtLayout12":;case"CrtLayout12A":;case"CrtLink":;case"CrtLine":;case"CrtMlFrt":;case"CrtMlFrtContinue":break;case"LineFormat":;case"AreaFormat":;case"Chart":;case"Chart3d":;case"Chart3DBarShape":;case"ChartFormat":;case"ChartFrtInfo":break;case"PlotArea":;case"PlotGrowth":break;case"SeriesList":;case"SerParent":;case"SerAuxTrend":break;case"DataFormat":;case"SerToCrt":;case"FontX":break;case"CatSerRange":;case"AxcExt":;case"SerFmt":break;case"ShtProps":break;case"DefaultText":;case"Text":;case"CatLab":break;case"DataLabExtContents":break;case"Legend":;case"LegendException":break;case"Pie":;case"Scatter":break;case"PieFormat":;case"MarkerFormat":break;case"StartObject":;case"EndObject":break;case"AlRuns":;case"ObjectLink":break;case"SIIndex":break;case"AttachedLabel":;case"YMult":break;case"Line":;case"Bar":break;case"Surf":break;case"AxisParent":break;case"Pos":break;case"ValueRange":break;case"SXViewEx9":break;case"SXViewLink":break;case"PivotChartBits":break;case"SBaseRef":break;case"TextPropsStream":break;case"LnExt":break;case"MkrExt":break;case"CrtCoopt":break;case"Qsi":;case"Qsif":;case"Qsir":;case"QsiSXTag":break;case"TxtQry":break;case"FilterMode":break;case"AutoFilter":;case"AutoFilterInfo":break;case"AutoFilter12":break;case"DropDownObjIds":break;case"Sort":break;case"SortData":break;case"ShapePropsStream":break;case"MsoDrawing":;case"MsoDrawingGroup":;case"MsoDrawingSelection":break;case"WebPub":;case"AutoWebPub":break;case"HeaderFooter":;case"HFPicture":;case"PLV":;case"HorizontalPageBreaks":;case"VerticalPageBreaks":break;case"Backup":;case"CompressPictures":;case"Compat12":break;case"Continue":;case"ContinueFrt12":break;case"FrtFontList":;case"FrtWrapper":break;default:switch(q.n){case"TabIdConf":;case"Radar":;case"RadarArea":;case"DropBar":;case"Intl":;case"CoordList":;case"SerAuxErrBar":break;case"BIFF2FONTCLR":;case"BIFF2FMTCNT":;case"BIFF2FONTXTRA":break;case"BIFF2XF":;case"BIFF3XF":;case"BIFF4XF":break;case"BIFF4FMTCNT":;case"BIFF2ROW":;case"BIFF2WINDOW2":break;case"SCENARIO":;case"DConBin":;case"PicF":;case"DataLabExt":;case"Lel":;case"BopPop":;case"BopPopCustom":;case"RealTimeData":;case"Name":break;case"LHNGraph":;case"FnGroupName":;case"AddMenu":;case"LPr":break;case"ListObj":;case"ListField":break;case"RRSort":break;case"BigName":break;case"ToolbarHdr":;case"ToolbarEnd":break;case"DDEObjName":break;case"FRTArchId$":break;default:if(r.WTF)throw"Unrecognized Record "+q.n;};};};}}else e.l+=Q}t.SheetNames=K(i).sort(function(e,r){return Number(e)-Number(r)}).map(function(e){return i[e].name});if(!r.bookSheets)t.Sheets=a;if(t.Sheets)j.forEach(function(e,r){t.Sheets[t.SheetNames[r]]["!autofilter"]=e});t.Preamble=u;t.Strings=l;t.SSF=D.get_table();if(R.enc)t.Encryption=R.enc;if(O)t.Themes=O;t.Metadata={};if(S!==undefined)t.Metadata.Country=S;if(H.names.length>0)T.Names=H.names;t.Workbook=T;return t}var xp={SI:"e0859ff2f94f6810ab9108002b27b3d9",DSI:"02d5cdd59c2e1b10939708002b2cf9ae",UDI:"05d5cdd59c2e1b10939708002b2cf9ae"};function Ap(e,r,t){var a=W.find(e,"!DocumentSummaryInformation");if(a&&a.size>0)try{var n=Hn(a,ga,xp.DSI);for(var i in n)r[i]=n[i]}catch(s){if(t.WTF)throw s}var f=W.find(e,"!SummaryInformation");if(f&&f.size>0)try{var o=Hn(f,wa,xp.SI);for(var l in o)if(r[l]==null)r[l]=o[l]}catch(s){if(t.WTF)throw s}if(r.HeadingPairs&&r.TitlesOfParts){fn(r.HeadingPairs,r.TitlesOfParts,r,t);delete r.HeadingPairs;delete r.TitlesOfParts}}function Ip(e,r){var t=[],a=[],n=[];var i=0,s;if(e.Props){s=K(e.Props);for(i=0;i-1)continue;if(n[i][1]==null)continue;f.push(n[i])}if(a.length)W.utils.cfb_add(r,"/SummaryInformation",Wn(a,xp.SI,Sa,wa));if(t.length||f.length)W.utils.cfb_add(r,"/DocumentSummaryInformation",Wn(t,xp.DSI,Ea,ga,f.length?f:null,xp.UDI))}function Rp(e,r){if(!r)r={};Bm(r);l();if(r.codepage)s(r.codepage);var t,a;if(e.FullPaths){if(W.find(e,"/encryption"))throw new Error("File is password-protected");t=W.find(e,"!CompObj");a=W.find(e,"/Workbook")||W.find(e,"/Book")}else{switch(r.type){case"base64":e=B(g.decode(e));break;case"binary":e=B(e);break;case"buffer":break;case"array":if(!Array.isArray(e))e=Array.prototype.slice.call(e);break;}Yr(e,0);a={content:e}}var n;var i;if(t)_p(t);if(r.bookProps&&!r.bookSheets)n={};else{var f=w?"buffer":"array";if(a&&a.content)n=yp(a.content,r);else if((i=W.find(e,"PerfectOffice_MAIN"))&&i.content)n=gf.to_workbook(i.content,(r.type=f,r));else if((i=W.find(e,"NativeContent_MAIN"))&&i.content)n=gf.to_workbook(i.content,(r.type=f,r));else throw new Error("Cannot find Workbook stream");if(r.bookVBA&&e.FullPaths&&W.find(e,"/_VBA_PROJECT_CUR/VBA/dir"))n.vbaraw=Jl(e)}var o={};if(e.FullPaths)Ap(e,o,r);n.Props=n.Custprops=o;if(r.bookFiles)n.cfb=e;return n}function Op(e,r){var t=r||{};var a=W.utils.cfb_new({root:"R"});var n="/Workbook";switch(t.bookType||"xls"){case"xls":t.bookType="biff8";case"xla":if(!t.bookType)t.bookType="xla";case"biff8":n="/Workbook";t.biff=8;break;case"biff5":n="/Book";t.biff=5;break;default:throw new Error("invalid type "+t.bookType+" for XLS CFB");}W.utils.cfb_add(a,n,em(e,t));if(t.biff==8&&(e.Props||e.Custprops))Ip(e,a);if(t.biff==8&&e.vbaraw)Ql(a,W.read(e.vbaraw,{type:typeof e.vbaraw=="string"?"binary":"buffer"}));return a}var Dp={0:{n:"BrtRowHdr",f:Yh},1:{n:"BrtCellBlank",f:ad},2:{n:"BrtCellRk",f:hd},3:{n:"BrtCellError",f:fd},4:{n:"BrtCellBool",f:id},5:{n:"BrtCellReal",f:cd},6:{n:"BrtCellSt",f:vd},7:{n:"BrtCellIsst",f:od},8:{n:"BrtFmlaString",f:wd},9:{n:"BrtFmlaNum",f:gd},10:{n:"BrtFmlaBool",f:md},11:{n:"BrtFmlaError",f:bd},16:{n:"BrtFRTArchID$",f:Bv},19:{n:"BrtSSTItem",f:Rt},20:{n:"BrtPCDIMissing"},21:{n:"BrtPCDINumber"},22:{n:"BrtPCDIBoolean"},23:{n:"BrtPCDIError"},24:{n:"BrtPCDIString"},25:{n:"BrtPCDIDatetime"},26:{n:"BrtPCDIIndex"},27:{n:"BrtPCDIAMissing"},28:{n:"BrtPCDIANumber"},29:{n:"BrtPCDIABoolean"},30:{n:"BrtPCDIAError"},31:{n:"BrtPCDIAString"},32:{n:"BrtPCDIADatetime"},33:{n:"BrtPCRRecord"},34:{n:"BrtPCRRecordDt"},35:{n:"BrtFRTBegin"},36:{n:"BrtFRTEnd"},37:{n:"BrtACBegin"},38:{n:"BrtACEnd"},39:{n:"BrtName",f:Tv},40:{n:"BrtIndexRowBlock"},42:{n:"BrtIndexBlock"},43:{n:"BrtFont",f:Wo},44:{n:"BrtFmt",f:zo},45:{n:"BrtFill",f:jo},46:{n:"BrtBorder",f:Jo},47:{n:"BrtXF",f:$o},48:{n:"BrtStyle"},49:{n:"BrtCellMeta"},50:{n:"BrtValueMeta"},51:{n:"BrtMdb"},52:{n:"BrtBeginFmd"},53:{n:"BrtEndFmd"},54:{n:"BrtBeginMdx"},55:{n:"BrtEndMdx"},56:{n:"BrtBeginMdxTuple"},57:{n:"BrtEndMdxTuple"},58:{n:"BrtMdxMbrIstr"},59:{n:"BrtStr"},60:{n:"BrtColInfo",f:Ys},62:{n:"BrtCellRString"},63:{n:"BrtCalcChainItem$",f:Dl},64:{n:"BrtDVal",f:Nd},65:{n:"BrtSxvcellNum"},66:{n:"BrtSxvcellStr"},67:{n:"BrtSxvcellBool"},68:{n:"BrtSxvcellErr"},69:{n:"BrtSxvcellDate"},70:{n:"BrtSxvcellNil"},128:{n:"BrtFileVersion"},129:{n:"BrtBeginSheet"},130:{n:"BrtEndSheet"},131:{n:"BrtBeginBook",f:Zr,p:0},132:{n:"BrtEndBook"},133:{n:"BrtBeginWsViews"},134:{n:"BrtEndWsViews"},135:{n:"BrtBeginBookViews"},136:{n:"BrtEndBookViews"},137:{n:"BrtBeginWsView",f:Od},138:{n:"BrtEndWsView"},139:{n:"BrtBeginCsViews"},140:{n:"BrtEndCsViews"},141:{n:"BrtBeginCsView"},142:{n:"BrtEndCsView"},143:{n:"BrtBeginBundleShs"},144:{n:"BrtEndBundleShs"},145:{n:"BrtBeginSheetData"},146:{n:"BrtEndSheetData"},147:{n:"BrtWsProp",f:rd},148:{n:"BrtWsDim",f:Qh,p:16},151:{n:"BrtPane",f:Bd},152:{n:"BrtSel"},153:{n:"BrtWbProp",f:_v},154:{n:"BrtWbFactoid"},155:{n:"BrtFileRecover"},156:{n:"BrtBundleSh",f:Ev},157:{n:"BrtCalcProp"},158:{n:"BrtBookView"},159:{n:"BrtBeginSst",f:Of},160:{n:"BrtEndSst"},161:{n:"BrtBeginAFilter",f:$t},162:{n:"BrtEndAFilter"},163:{n:"BrtBeginFilterColumn"},164:{n:"BrtEndFilterColumn"},165:{n:"BrtBeginFilters"},166:{n:"BrtEndFilters"},167:{n:"BrtFilter"},168:{n:"BrtColorFilter"},169:{n:"BrtIconFilter"},170:{n:"BrtTop10Filter"},171:{n:"BrtDynamicFilter"},172:{n:"BrtBeginCustomFilters"},173:{n:"BrtEndCustomFilters"},174:{n:"BrtCustomFilter"},175:{n:"BrtAFilterDateGroupItem"},176:{n:"BrtMergeCell",f:kd},177:{n:"BrtBeginMergeCells"},178:{n:"BrtEndMergeCells"},179:{n:"BrtBeginPivotCacheDef"},180:{n:"BrtEndPivotCacheDef"},181:{n:"BrtBeginPCDFields"},182:{n:"BrtEndPCDFields"},183:{n:"BrtBeginPCDField"},184:{n:"BrtEndPCDField"},185:{n:"BrtBeginPCDSource"},186:{n:"BrtEndPCDSource"},187:{n:"BrtBeginPCDSRange"},188:{n:"BrtEndPCDSRange"},189:{n:"BrtBeginPCDFAtbl"},190:{n:"BrtEndPCDFAtbl"},191:{n:"BrtBeginPCDIRun"},192:{n:"BrtEndPCDIRun"},193:{n:"BrtBeginPivotCacheRecords"},194:{n:"BrtEndPivotCacheRecords"},195:{n:"BrtBeginPCDHierarchies"},196:{n:"BrtEndPCDHierarchies"},197:{n:"BrtBeginPCDHierarchy"},198:{n:"BrtEndPCDHierarchy"},199:{n:"BrtBeginPCDHFieldsUsage"},200:{n:"BrtEndPCDHFieldsUsage"},201:{n:"BrtBeginExtConnection"},202:{n:"BrtEndExtConnection"},203:{n:"BrtBeginECDbProps"},204:{n:"BrtEndECDbProps"},205:{n:"BrtBeginECOlapProps"},206:{n:"BrtEndECOlapProps"},207:{n:"BrtBeginPCDSConsol"},208:{n:"BrtEndPCDSConsol"},209:{n:"BrtBeginPCDSCPages"},210:{n:"BrtEndPCDSCPages"},211:{n:"BrtBeginPCDSCPage"},212:{n:"BrtEndPCDSCPage"},213:{n:"BrtBeginPCDSCPItem"},214:{n:"BrtEndPCDSCPItem"},215:{n:"BrtBeginPCDSCSets"},216:{n:"BrtEndPCDSCSets" -},217:{n:"BrtBeginPCDSCSet"},218:{n:"BrtEndPCDSCSet"},219:{n:"BrtBeginPCDFGroup"},220:{n:"BrtEndPCDFGroup"},221:{n:"BrtBeginPCDFGItems"},222:{n:"BrtEndPCDFGItems"},223:{n:"BrtBeginPCDFGRange"},224:{n:"BrtEndPCDFGRange"},225:{n:"BrtBeginPCDFGDiscrete"},226:{n:"BrtEndPCDFGDiscrete"},227:{n:"BrtBeginPCDSDTupleCache"},228:{n:"BrtEndPCDSDTupleCache"},229:{n:"BrtBeginPCDSDTCEntries"},230:{n:"BrtEndPCDSDTCEntries"},231:{n:"BrtBeginPCDSDTCEMembers"},232:{n:"BrtEndPCDSDTCEMembers"},233:{n:"BrtBeginPCDSDTCEMember"},234:{n:"BrtEndPCDSDTCEMember"},235:{n:"BrtBeginPCDSDTCQueries"},236:{n:"BrtEndPCDSDTCQueries"},237:{n:"BrtBeginPCDSDTCQuery"},238:{n:"BrtEndPCDSDTCQuery"},239:{n:"BrtBeginPCDSDTCSets"},240:{n:"BrtEndPCDSDTCSets"},241:{n:"BrtBeginPCDSDTCSet"},242:{n:"BrtEndPCDSDTCSet"},243:{n:"BrtBeginPCDCalcItems"},244:{n:"BrtEndPCDCalcItems"},245:{n:"BrtBeginPCDCalcItem"},246:{n:"BrtEndPCDCalcItem"},247:{n:"BrtBeginPRule"},248:{n:"BrtEndPRule"},249:{n:"BrtBeginPRFilters"},250:{n:"BrtEndPRFilters"},251:{n:"BrtBeginPRFilter"},252:{n:"BrtEndPRFilter"},253:{n:"BrtBeginPNames"},254:{n:"BrtEndPNames"},255:{n:"BrtBeginPName"},256:{n:"BrtEndPName"},257:{n:"BrtBeginPNPairs"},258:{n:"BrtEndPNPairs"},259:{n:"BrtBeginPNPair"},260:{n:"BrtEndPNPair"},261:{n:"BrtBeginECWebProps"},262:{n:"BrtEndECWebProps"},263:{n:"BrtBeginEcWpTables"},264:{n:"BrtEndECWPTables"},265:{n:"BrtBeginECParams"},266:{n:"BrtEndECParams"},267:{n:"BrtBeginECParam"},268:{n:"BrtEndECParam"},269:{n:"BrtBeginPCDKPIs"},270:{n:"BrtEndPCDKPIs"},271:{n:"BrtBeginPCDKPI"},272:{n:"BrtEndPCDKPI"},273:{n:"BrtBeginDims"},274:{n:"BrtEndDims"},275:{n:"BrtBeginDim"},276:{n:"BrtEndDim"},277:{n:"BrtIndexPartEnd"},278:{n:"BrtBeginStyleSheet"},279:{n:"BrtEndStyleSheet"},280:{n:"BrtBeginSXView"},281:{n:"BrtEndSXVI"},282:{n:"BrtBeginSXVI"},283:{n:"BrtBeginSXVIs"},284:{n:"BrtEndSXVIs"},285:{n:"BrtBeginSXVD"},286:{n:"BrtEndSXVD"},287:{n:"BrtBeginSXVDs"},288:{n:"BrtEndSXVDs"},289:{n:"BrtBeginSXPI"},290:{n:"BrtEndSXPI"},291:{n:"BrtBeginSXPIs"},292:{n:"BrtEndSXPIs"},293:{n:"BrtBeginSXDI"},294:{n:"BrtEndSXDI"},295:{n:"BrtBeginSXDIs"},296:{n:"BrtEndSXDIs"},297:{n:"BrtBeginSXLI"},298:{n:"BrtEndSXLI"},299:{n:"BrtBeginSXLIRws"},300:{n:"BrtEndSXLIRws"},301:{n:"BrtBeginSXLICols"},302:{n:"BrtEndSXLICols"},303:{n:"BrtBeginSXFormat"},304:{n:"BrtEndSXFormat"},305:{n:"BrtBeginSXFormats"},306:{n:"BrtEndSxFormats"},307:{n:"BrtBeginSxSelect"},308:{n:"BrtEndSxSelect"},309:{n:"BrtBeginISXVDRws"},310:{n:"BrtEndISXVDRws"},311:{n:"BrtBeginISXVDCols"},312:{n:"BrtEndISXVDCols"},313:{n:"BrtEndSXLocation"},314:{n:"BrtBeginSXLocation"},315:{n:"BrtEndSXView"},316:{n:"BrtBeginSXTHs"},317:{n:"BrtEndSXTHs"},318:{n:"BrtBeginSXTH"},319:{n:"BrtEndSXTH"},320:{n:"BrtBeginISXTHRws"},321:{n:"BrtEndISXTHRws"},322:{n:"BrtBeginISXTHCols"},323:{n:"BrtEndISXTHCols"},324:{n:"BrtBeginSXTDMPS"},325:{n:"BrtEndSXTDMPs"},326:{n:"BrtBeginSXTDMP"},327:{n:"BrtEndSXTDMP"},328:{n:"BrtBeginSXTHItems"},329:{n:"BrtEndSXTHItems"},330:{n:"BrtBeginSXTHItem"},331:{n:"BrtEndSXTHItem"},332:{n:"BrtBeginMetadata"},333:{n:"BrtEndMetadata"},334:{n:"BrtBeginEsmdtinfo"},335:{n:"BrtMdtinfo"},336:{n:"BrtEndEsmdtinfo"},337:{n:"BrtBeginEsmdb"},338:{n:"BrtEndEsmdb"},339:{n:"BrtBeginEsfmd"},340:{n:"BrtEndEsfmd"},341:{n:"BrtBeginSingleCells"},342:{n:"BrtEndSingleCells"},343:{n:"BrtBeginList"},344:{n:"BrtEndList"},345:{n:"BrtBeginListCols"},346:{n:"BrtEndListCols"},347:{n:"BrtBeginListCol"},348:{n:"BrtEndListCol"},349:{n:"BrtBeginListXmlCPr"},350:{n:"BrtEndListXmlCPr"},351:{n:"BrtListCCFmla"},352:{n:"BrtListTrFmla"},353:{n:"BrtBeginExternals"},354:{n:"BrtEndExternals"},355:{n:"BrtSupBookSrc",f:Wt},357:{n:"BrtSupSelf"},358:{n:"BrtSupSame"},359:{n:"BrtSupTabs"},360:{n:"BrtBeginSupBook"},361:{n:"BrtPlaceholderName"},362:{n:"BrtExternSheet",f:Ts},363:{n:"BrtExternTableStart"},364:{n:"BrtExternTableEnd"},366:{n:"BrtExternRowHdr"},367:{n:"BrtExternCellBlank"},368:{n:"BrtExternCellReal"},369:{n:"BrtExternCellBool"},370:{n:"BrtExternCellError"},371:{n:"BrtExternCellString"},372:{n:"BrtBeginEsmdx"},373:{n:"BrtEndEsmdx"},374:{n:"BrtBeginMdxSet"},375:{n:"BrtEndMdxSet"},376:{n:"BrtBeginMdxMbrProp"},377:{n:"BrtEndMdxMbrProp"},378:{n:"BrtBeginMdxKPI"},379:{n:"BrtEndMdxKPI"},380:{n:"BrtBeginEsstr"},381:{n:"BrtEndEsstr"},382:{n:"BrtBeginPRFItem"},383:{n:"BrtEndPRFItem"},384:{n:"BrtBeginPivotCacheIDs"},385:{n:"BrtEndPivotCacheIDs"},386:{n:"BrtBeginPivotCacheID"},387:{n:"BrtEndPivotCacheID"},388:{n:"BrtBeginISXVIs"},389:{n:"BrtEndISXVIs"},390:{n:"BrtBeginColInfos"},391:{n:"BrtEndColInfos"},392:{n:"BrtBeginRwBrk"},393:{n:"BrtEndRwBrk"},394:{n:"BrtBeginColBrk"},395:{n:"BrtEndColBrk"},396:{n:"BrtBrk"},397:{n:"BrtUserBookView"},398:{n:"BrtInfo"},399:{n:"BrtCUsr"},400:{n:"BrtUsr"},401:{n:"BrtBeginUsers"},403:{n:"BrtEOF"},404:{n:"BrtUCR"},405:{n:"BrtRRInsDel"},406:{n:"BrtRREndInsDel"},407:{n:"BrtRRMove"},408:{n:"BrtRREndMove"},409:{n:"BrtRRChgCell"},410:{n:"BrtRREndChgCell"},411:{n:"BrtRRHeader"},412:{n:"BrtRRUserView"},413:{n:"BrtRRRenSheet"},414:{n:"BrtRRInsertSh"},415:{n:"BrtRRDefName"},416:{n:"BrtRRNote"},417:{n:"BrtRRConflict"},418:{n:"BrtRRTQSIF"},419:{n:"BrtRRFormat"},420:{n:"BrtRREndFormat"},421:{n:"BrtRRAutoFmt"},422:{n:"BrtBeginUserShViews"},423:{n:"BrtBeginUserShView"},424:{n:"BrtEndUserShView"},425:{n:"BrtEndUserShViews"},426:{n:"BrtArrFmla",f:Td},427:{n:"BrtShrFmla",f:yd},428:{n:"BrtTable"},429:{n:"BrtBeginExtConnections"},430:{n:"BrtEndExtConnections"},431:{n:"BrtBeginPCDCalcMems"},432:{n:"BrtEndPCDCalcMems"},433:{n:"BrtBeginPCDCalcMem"},434:{n:"BrtEndPCDCalcMem"},435:{n:"BrtBeginPCDHGLevels"},436:{n:"BrtEndPCDHGLevels"},437:{n:"BrtBeginPCDHGLevel"},438:{n:"BrtEndPCDHGLevel"},439:{n:"BrtBeginPCDHGLGroups"},440:{n:"BrtEndPCDHGLGroups"},441:{n:"BrtBeginPCDHGLGroup"},442:{n:"BrtEndPCDHGLGroup"},443:{n:"BrtBeginPCDHGLGMembers"},444:{n:"BrtEndPCDHGLGMembers"},445:{n:"BrtBeginPCDHGLGMember"},446:{n:"BrtEndPCDHGLGMember"},447:{n:"BrtBeginQSI"},448:{n:"BrtEndQSI"},449:{n:"BrtBeginQSIR"},450:{n:"BrtEndQSIR"},451:{n:"BrtBeginDeletedNames"},452:{n:"BrtEndDeletedNames"},453:{n:"BrtBeginDeletedName"},454:{n:"BrtEndDeletedName"},455:{n:"BrtBeginQSIFs"},456:{n:"BrtEndQSIFs"},457:{n:"BrtBeginQSIF"},458:{n:"BrtEndQSIF"},459:{n:"BrtBeginAutoSortScope"},460:{n:"BrtEndAutoSortScope"},461:{n:"BrtBeginConditionalFormatting"},462:{n:"BrtEndConditionalFormatting"},463:{n:"BrtBeginCFRule"},464:{n:"BrtEndCFRule"},465:{n:"BrtBeginIconSet"},466:{n:"BrtEndIconSet"},467:{n:"BrtBeginDatabar"},468:{n:"BrtEndDatabar"},469:{n:"BrtBeginColorScale"},470:{n:"BrtEndColorScale"},471:{n:"BrtCFVO"},472:{n:"BrtExternValueMeta"},473:{n:"BrtBeginColorPalette"},474:{n:"BrtEndColorPalette"},475:{n:"BrtIndexedColor"},476:{n:"BrtMargins",f:Id},477:{n:"BrtPrintOptions"},478:{n:"BrtPageSetup"},479:{n:"BrtBeginHeaderFooter"},480:{n:"BrtEndHeaderFooter"},481:{n:"BrtBeginSXCrtFormat"},482:{n:"BrtEndSXCrtFormat"},483:{n:"BrtBeginSXCrtFormats"},484:{n:"BrtEndSXCrtFormats"},485:{n:"BrtWsFmtInfo",f:ed},486:{n:"BrtBeginMgs"},487:{n:"BrtEndMGs"},488:{n:"BrtBeginMGMaps"},489:{n:"BrtEndMGMaps"},490:{n:"BrtBeginMG"},491:{n:"BrtEndMG"},492:{n:"BrtBeginMap"},493:{n:"BrtEndMap"},494:{n:"BrtHLink",f:_d},495:{n:"BrtBeginDCon"},496:{n:"BrtEndDCon"},497:{n:"BrtBeginDRefs"},498:{n:"BrtEndDRefs"},499:{n:"BrtDRef"},500:{n:"BrtBeginScenMan"},501:{n:"BrtEndScenMan"},502:{n:"BrtBeginSct"},503:{n:"BrtEndSct"},504:{n:"BrtSlc"},505:{n:"BrtBeginDXFs"},506:{n:"BrtEndDXFs"},507:{n:"BrtDXF"},508:{n:"BrtBeginTableStyles"},509:{n:"BrtEndTableStyles"},510:{n:"BrtBeginTableStyle"},511:{n:"BrtEndTableStyle"},512:{n:"BrtTableStyleElement"},513:{n:"BrtTableStyleClient"},514:{n:"BrtBeginVolDeps"},515:{n:"BrtEndVolDeps"},516:{n:"BrtBeginVolType"},517:{n:"BrtEndVolType"},518:{n:"BrtBeginVolMain"},519:{n:"BrtEndVolMain"},520:{n:"BrtBeginVolTopic"},521:{n:"BrtEndVolTopic"},522:{n:"BrtVolSubtopic"},523:{n:"BrtVolRef"},524:{n:"BrtVolNum"},525:{n:"BrtVolErr"},526:{n:"BrtVolStr"},527:{n:"BrtVolBool"},528:{n:"BrtBeginCalcChain$"},529:{n:"BrtEndCalcChain$"},530:{n:"BrtBeginSortState"},531:{n:"BrtEndSortState"},532:{n:"BrtBeginSortCond"},533:{n:"BrtEndSortCond"},534:{n:"BrtBookProtection"},535:{n:"BrtSheetProtection"},536:{n:"BrtRangeProtection"},537:{n:"BrtPhoneticInfo"},538:{n:"BrtBeginECTxtWiz"},539:{n:"BrtEndECTxtWiz"},540:{n:"BrtBeginECTWFldInfoLst"},541:{n:"BrtEndECTWFldInfoLst"},542:{n:"BrtBeginECTwFldInfo"},548:{n:"BrtFileSharing"},549:{n:"BrtOleSize"},550:{n:"BrtDrawing",f:Wt},551:{n:"BrtLegacyDrawing"},552:{n:"BrtLegacyDrawingHF"},553:{n:"BrtWebOpt"},554:{n:"BrtBeginWebPubItems"},555:{n:"BrtEndWebPubItems"},556:{n:"BrtBeginWebPubItem"},557:{n:"BrtEndWebPubItem"},558:{n:"BrtBeginSXCondFmt"},559:{n:"BrtEndSXCondFmt"},560:{n:"BrtBeginSXCondFmts"},561:{n:"BrtEndSXCondFmts"},562:{n:"BrtBkHim"},564:{n:"BrtColor"},565:{n:"BrtBeginIndexedColors"},566:{n:"BrtEndIndexedColors"},569:{n:"BrtBeginMRUColors"},570:{n:"BrtEndMRUColors"},572:{n:"BrtMRUColor"},573:{n:"BrtBeginDVals"},574:{n:"BrtEndDVals"},577:{n:"BrtSupNameStart"},578:{n:"BrtSupNameValueStart"},579:{n:"BrtSupNameValueEnd"},580:{n:"BrtSupNameNum"},581:{n:"BrtSupNameErr"},582:{n:"BrtSupNameSt"},583:{n:"BrtSupNameNil"},584:{n:"BrtSupNameBool"},585:{n:"BrtSupNameFmla"},586:{n:"BrtSupNameBits"},587:{n:"BrtSupNameEnd"},588:{n:"BrtEndSupBook"},589:{n:"BrtCellSmartTagProperty"},590:{n:"BrtBeginCellSmartTag"},591:{n:"BrtEndCellSmartTag"},592:{n:"BrtBeginCellSmartTags"},593:{n:"BrtEndCellSmartTags"},594:{n:"BrtBeginSmartTags"},595:{n:"BrtEndSmartTags"},596:{n:"BrtSmartTagType"},597:{n:"BrtBeginSmartTagTypes"},598:{n:"BrtEndSmartTagTypes"},599:{n:"BrtBeginSXFilters"},600:{n:"BrtEndSXFilters"},601:{n:"BrtBeginSXFILTER"},602:{n:"BrtEndSXFilter"},603:{n:"BrtBeginFills"},604:{n:"BrtEndFills"},605:{n:"BrtBeginCellWatches"},606:{n:"BrtEndCellWatches"},607:{n:"BrtCellWatch"},608:{n:"BrtBeginCRErrs"},609:{n:"BrtEndCRErrs"},610:{n:"BrtCrashRecErr"},611:{n:"BrtBeginFonts"},612:{n:"BrtEndFonts"},613:{n:"BrtBeginBorders"},614:{n:"BrtEndBorders"},615:{n:"BrtBeginFmts"},616:{n:"BrtEndFmts"},617:{n:"BrtBeginCellXFs"},618:{n:"BrtEndCellXFs"},619:{n:"BrtBeginStyles"},620:{n:"BrtEndStyles"},625:{n:"BrtBigName"},626:{n:"BrtBeginCellStyleXFs"},627:{n:"BrtEndCellStyleXFs"},628:{n:"BrtBeginComments"},629:{n:"BrtEndComments"},630:{n:"BrtBeginCommentAuthors"},631:{n:"BrtEndCommentAuthors"},632:{n:"BrtCommentAuthor",f:jl},633:{n:"BrtBeginCommentList"},634:{n:"BrtEndCommentList"},635:{n:"BrtBeginComment",f:Xl},636:{n:"BrtEndComment"},637:{n:"BrtCommentText",f:Dt},638:{n:"BrtBeginOleObjects"},639:{n:"BrtOleObject"},640:{n:"BrtEndOleObjects"},641:{n:"BrtBeginSxrules"},642:{n:"BrtEndSxRules"},643:{n:"BrtBeginActiveXControls"},644:{n:"BrtActiveX"},645:{n:"BrtEndActiveXControls"},646:{n:"BrtBeginPCDSDTCEMembersSortBy"},648:{n:"BrtBeginCellIgnoreECs"},649:{n:"BrtCellIgnoreEC"},650:{n:"BrtEndCellIgnoreECs"},651:{n:"BrtCsProp",f:tv},652:{n:"BrtCsPageSetup"},653:{n:"BrtBeginUserCsViews"},654:{n:"BrtEndUserCsViews"},655:{n:"BrtBeginUserCsView"},656:{n:"BrtEndUserCsView"},657:{n:"BrtBeginPcdSFCIEntries"},658:{n:"BrtEndPCDSFCIEntries"},659:{n:"BrtPCDSFCIEntry"},660:{n:"BrtBeginListParts"},661:{n:"BrtListPart"},662:{n:"BrtEndListParts"},663:{n:"BrtSheetCalcProp"},664:{n:"BrtBeginFnGroup"},665:{n:"BrtFnGroup"},666:{n:"BrtEndFnGroup"},667:{n:"BrtSupAddin"},668:{n:"BrtSXTDMPOrder"},669:{n:"BrtCsProtection"},671:{n:"BrtBeginWsSortMap"},672:{n:"BrtEndWsSortMap"},673:{n:"BrtBeginRRSort"},674:{n:"BrtEndRRSort"},675:{n:"BrtRRSortItem"},676:{n:"BrtFileSharingIso"},677:{n:"BrtBookProtectionIso"},678:{n:"BrtSheetProtectionIso"},679:{n:"BrtCsProtectionIso"},680:{n:"BrtRangeProtectionIso"},681:{n:"BrtDValList"},1024:{n:"BrtRwDescent"},1025:{n:"BrtKnownFonts"},1026:{n:"BrtBeginSXTupleSet"},1027:{n:"BrtEndSXTupleSet"},1028:{n:"BrtBeginSXTupleSetHeader"},1029:{n:"BrtEndSXTupleSetHeader"},1030:{n:"BrtSXTupleSetHeaderItem"},1031:{n:"BrtBeginSXTupleSetData"},1032:{n:"BrtEndSXTupleSetData"},1033:{n:"BrtBeginSXTupleSetRow"},1034:{n:"BrtEndSXTupleSetRow"},1035:{n:"BrtSXTupleSetRowItem"},1036:{n:"BrtNameExt"},1037:{n:"BrtPCDH14"},1038:{n:"BrtBeginPCDCalcMem14"},1039:{n:"BrtEndPCDCalcMem14"},1040:{n:"BrtSXTH14"},1041:{n:"BrtBeginSparklineGroup"},1042:{n:"BrtEndSparklineGroup"},1043:{n:"BrtSparkline"},1044:{n:"BrtSXDI14"},1045:{n:"BrtWsFmtInfoEx14"},1046:{n:"BrtBeginConditionalFormatting14"},1047:{n:"BrtEndConditionalFormatting14"},1048:{n:"BrtBeginCFRule14"},1049:{n:"BrtEndCFRule14"},1050:{n:"BrtCFVO14"},1051:{n:"BrtBeginDatabar14"},1052:{n:"BrtBeginIconSet14"},1053:{n:"BrtDVal14",f:Ld},1054:{n:"BrtBeginDVals14"},1055:{n:"BrtColor14"},1056:{n:"BrtBeginSparklines"},1057:{n:"BrtEndSparklines"},1058:{n:"BrtBeginSparklineGroups"},1059:{n:"BrtEndSparklineGroups"},1061:{n:"BrtSXVD14"},1062:{n:"BrtBeginSXView14"},1063:{n:"BrtEndSXView14"},1064:{n:"BrtBeginSXView16"},1065:{n:"BrtEndSXView16"},1066:{n:"BrtBeginPCD14"},1067:{n:"BrtEndPCD14"},1068:{n:"BrtBeginExtConn14"},1069:{n:"BrtEndExtConn14"},1070:{n:"BrtBeginSlicerCacheIDs"},1071:{n:"BrtEndSlicerCacheIDs"},1072:{n:"BrtBeginSlicerCacheID"},1073:{n:"BrtEndSlicerCacheID"},1075:{n:"BrtBeginSlicerCache"},1076:{n:"BrtEndSlicerCache"},1077:{n:"BrtBeginSlicerCacheDef"},1078:{n:"BrtEndSlicerCacheDef"},1079:{n:"BrtBeginSlicersEx"},1080:{n:"BrtEndSlicersEx"},1081:{n:"BrtBeginSlicerEx"},1082:{n:"BrtEndSlicerEx"},1083:{n:"BrtBeginSlicer"},1084:{n:"BrtEndSlicer"},1085:{n:"BrtSlicerCachePivotTables"},1086:{n:"BrtBeginSlicerCacheOlapImpl"},1087:{n:"BrtEndSlicerCacheOlapImpl"},1088:{n:"BrtBeginSlicerCacheLevelsData"},1089:{n:"BrtEndSlicerCacheLevelsData"},1090:{n:"BrtBeginSlicerCacheLevelData"},1091:{n:"BrtEndSlicerCacheLevelData"},1092:{n:"BrtBeginSlicerCacheSiRanges"},1093:{n:"BrtEndSlicerCacheSiRanges"},1094:{n:"BrtBeginSlicerCacheSiRange"},1095:{n:"BrtEndSlicerCacheSiRange"},1096:{n:"BrtSlicerCacheOlapItem"},1097:{n:"BrtBeginSlicerCacheSelections"},1098:{n:"BrtSlicerCacheSelection"},1099:{n:"BrtEndSlicerCacheSelections"},1100:{n:"BrtBeginSlicerCacheNative"},1101:{n:"BrtEndSlicerCacheNative"},1102:{n:"BrtSlicerCacheNativeItem"},1103:{n:"BrtRangeProtection14"},1104:{n:"BrtRangeProtectionIso14"},1105:{n:"BrtCellIgnoreEC14"},1111:{n:"BrtList14"},1112:{n:"BrtCFIcon"},1113:{n:"BrtBeginSlicerCachesPivotCacheIDs"},1114:{n:"BrtEndSlicerCachesPivotCacheIDs"},1115:{n:"BrtBeginSlicers"},1116:{n:"BrtEndSlicers"},1117:{n:"BrtWbProp14"},1118:{n:"BrtBeginSXEdit"},1119:{n:"BrtEndSXEdit"},1120:{n:"BrtBeginSXEdits"},1121:{n:"BrtEndSXEdits"},1122:{n:"BrtBeginSXChange"},1123:{n:"BrtEndSXChange"},1124:{n:"BrtBeginSXChanges"},1125:{n:"BrtEndSXChanges"},1126:{n:"BrtSXTupleItems"},1128:{n:"BrtBeginSlicerStyle"},1129:{n:"BrtEndSlicerStyle"},1130:{n:"BrtSlicerStyleElement"},1131:{n:"BrtBeginStyleSheetExt14"},1132:{n:"BrtEndStyleSheetExt14"},1133:{n:"BrtBeginSlicerCachesPivotCacheID"},1134:{n:"BrtEndSlicerCachesPivotCacheID"},1135:{n:"BrtBeginConditionalFormattings"},1136:{n:"BrtEndConditionalFormattings"},1137:{n:"BrtBeginPCDCalcMemExt"},1138:{n:"BrtEndPCDCalcMemExt"},1139:{n:"BrtBeginPCDCalcMemsExt"},1140:{n:"BrtEndPCDCalcMemsExt"},1141:{n:"BrtPCDField14"},1142:{n:"BrtBeginSlicerStyles"},1143:{n:"BrtEndSlicerStyles"},1144:{n:"BrtBeginSlicerStyleElements"},1145:{n:"BrtEndSlicerStyleElements"},1146:{n:"BrtCFRuleExt"},1147:{n:"BrtBeginSXCondFmt14"},1148:{n:"BrtEndSXCondFmt14"},1149:{n:"BrtBeginSXCondFmts14"},1150:{n:"BrtEndSXCondFmts14"},1152:{n:"BrtBeginSortCond14"},1153:{n:"BrtEndSortCond14"},1154:{n:"BrtEndDVals14"},1155:{n:"BrtEndIconSet14"},1156:{n:"BrtEndDatabar14"},1157:{n:"BrtBeginColorScale14"},1158:{n:"BrtEndColorScale14"},1159:{n:"BrtBeginSxrules14"},1160:{n:"BrtEndSxrules14"},1161:{n:"BrtBeginPRule14"},1162:{n:"BrtEndPRule14"},1163:{n:"BrtBeginPRFilters14"},1164:{n:"BrtEndPRFilters14"},1165:{n:"BrtBeginPRFilter14"},1166:{n:"BrtEndPRFilter14"},1167:{n:"BrtBeginPRFItem14"},1168:{n:"BrtEndPRFItem14"},1169:{n:"BrtBeginCellIgnoreECs14"},1170:{n:"BrtEndCellIgnoreECs14"},1171:{n:"BrtDxf14"},1172:{n:"BrtBeginDxF14s"},1173:{n:"BrtEndDxf14s"},1177:{n:"BrtFilter14"},1178:{n:"BrtBeginCustomFilters14"},1180:{n:"BrtCustomFilter14"},1181:{n:"BrtIconFilter14"},1182:{n:"BrtPivotCacheConnectionName"},2048:{n:"BrtBeginDecoupledPivotCacheIDs"},2049:{n:"BrtEndDecoupledPivotCacheIDs"},2050:{n:"BrtDecoupledPivotCacheID"},2051:{n:"BrtBeginPivotTableRefs"},2052:{n:"BrtEndPivotTableRefs"},2053:{n:"BrtPivotTableRef"},2054:{n:"BrtSlicerCacheBookPivotTables"},2055:{n:"BrtBeginSxvcells"},2056:{n:"BrtEndSxvcells"},2057:{n:"BrtBeginSxRow"},2058:{n:"BrtEndSxRow"},2060:{n:"BrtPcdCalcMem15"},2067:{n:"BrtQsi15"},2068:{n:"BrtBeginWebExtensions"},2069:{n:"BrtEndWebExtensions"},2070:{n:"BrtWebExtension"},2071:{n:"BrtAbsPath15"},2072:{n:"BrtBeginPivotTableUISettings"},2073:{n:"BrtEndPivotTableUISettings"},2075:{n:"BrtTableSlicerCacheIDs"},2076:{n:"BrtTableSlicerCacheID"},2077:{n:"BrtBeginTableSlicerCache"},2078:{n:"BrtEndTableSlicerCache"},2079:{n:"BrtSxFilter15"},2080:{n:"BrtBeginTimelineCachePivotCacheIDs"},2081:{n:"BrtEndTimelineCachePivotCacheIDs"},2082:{n:"BrtTimelineCachePivotCacheID"},2083:{n:"BrtBeginTimelineCacheIDs"},2084:{n:"BrtEndTimelineCacheIDs"},2085:{n:"BrtBeginTimelineCacheID"},2086:{n:"BrtEndTimelineCacheID"},2087:{n:"BrtBeginTimelinesEx"},2088:{n:"BrtEndTimelinesEx"},2089:{n:"BrtBeginTimelineEx"},2090:{n:"BrtEndTimelineEx"},2091:{n:"BrtWorkBookPr15"},2092:{n:"BrtPCDH15"},2093:{n:"BrtBeginTimelineStyle"},2094:{n:"BrtEndTimelineStyle"},2095:{n:"BrtTimelineStyleElement"},2096:{n:"BrtBeginTimelineStylesheetExt15"},2097:{n:"BrtEndTimelineStylesheetExt15"},2098:{n:"BrtBeginTimelineStyles"},2099:{n:"BrtEndTimelineStyles"},2100:{n:"BrtBeginTimelineStyleElements"},2101:{n:"BrtEndTimelineStyleElements"},2102:{n:"BrtDxf15"},2103:{n:"BrtBeginDxfs15"},2104:{n:"brtEndDxfs15"},2105:{n:"BrtSlicerCacheHideItemsWithNoData"},2106:{n:"BrtBeginItemUniqueNames"},2107:{n:"BrtEndItemUniqueNames"},2108:{n:"BrtItemUniqueName"},2109:{n:"BrtBeginExtConn15"},2110:{n:"BrtEndExtConn15"},2111:{n:"BrtBeginOledbPr15"},2112:{n:"BrtEndOledbPr15"},2113:{n:"BrtBeginDataFeedPr15"},2114:{n:"BrtEndDataFeedPr15"},2115:{n:"BrtTextPr15"},2116:{n:"BrtRangePr15"},2117:{n:"BrtDbCommand15"},2118:{n:"BrtBeginDbTables15"},2119:{n:"BrtEndDbTables15"},2120:{n:"BrtDbTable15"},2121:{n:"BrtBeginDataModel"},2122:{n:"BrtEndDataModel"},2123:{n:"BrtBeginModelTables"},2124:{n:"BrtEndModelTables"},2125:{n:"BrtModelTable"},2126:{n:"BrtBeginModelRelationships"},2127:{n:"BrtEndModelRelationships"},2128:{n:"BrtModelRelationship"},2129:{n:"BrtBeginECTxtWiz15"},2130:{n:"BrtEndECTxtWiz15"},2131:{n:"BrtBeginECTWFldInfoLst15"},2132:{n:"BrtEndECTWFldInfoLst15"},2133:{n:"BrtBeginECTWFldInfo15"},2134:{n:"BrtFieldListActiveItem"},2135:{n:"BrtPivotCacheIdVersion"},2136:{n:"BrtSXDI15"},2137:{n:"BrtBeginModelTimeGroupings"},2138:{n:"BrtEndModelTimeGroupings"},2139:{n:"BrtBeginModelTimeGrouping"},2140:{n:"BrtEndModelTimeGrouping"},2141:{n:"BrtModelTimeGroupingCalcCol"},3072:{n:"BrtUid"},3073:{n:"BrtRevisionPtr"},5095:{n:"BrtBeginCalcFeatures"},5096:{n:"BrtEndCalcFeatures"},5097:{n:"BrtCalcFeature"},65535:{n:""}};var Fp=Y(Dp,"n");var Pp={3:{n:"BIFF2NUM",f:nf},4:{n:"BIFF2STR",f:af},6:{n:"Formula",f:Ku},9:{n:"BOF",f:Oi},10:{n:"EOF",f:Vn},12:{n:"CalcCount",f:$n},13:{n:"CalcMode",f:$n},14:{n:"CalcPrecision",f:jn},15:{n:"CalcRefMode",f:jn},16:{n:"CalcDelta",f:Zt},17:{n:"CalcIter",f:jn},18:{n:"Protect",f:jn},19:{n:"Password",f:$n},20:{n:"Header",f:Es},21:{n:"Footer",f:Es},23:{n:"ExternSheet",f:Ts},24:{n:"Lbl",f:Bs},25:{n:"WinProtect",f:jn},26:{n:"VerticalPageBreaks"},27:{n:"HorizontalPageBreaks"},28:{n:"Note",f:Ds},29:{n:"Selection"},34:{n:"Date1904",f:jn},35:{n:"ExternName",f:_s},36:{n:"COLWIDTH"},38:{n:"LeftMargin",f:Zt},39:{n:"RightMargin",f:Zt},40:{n:"TopMargin",f:Zt},41:{n:"BottomMargin",f:Zt},42:{n:"PrintRowCol",f:jn},43:{n:"PrintGrid",f:jn},47:{n:"FilePass",f:io},49:{n:"Font",f:Qi},51:{n:"PrintSize",f:$n},60:{n:"Continue"},61:{n:"Window1",f:Ki},64:{n:"Backup",f:jn},65:{n:"Pane",f:Ji},66:{n:"CodePage",f:$n},77:{n:"Pls"},80:{n:"DCon"},81:{n:"DConRef"},82:{n:"DConName"},85:{n:"DefColWidth",f:$n},89:{n:"XCT"},90:{n:"CRN"},91:{n:"FileSharing"},92:{n:"WriteAccess",f:Pi},93:{n:"Obj",f:Ns},94:{n:"Uncalced"},95:{n:"CalcSaveRecalc",f:jn},96:{n:"Template"},97:{n:"Intl"},99:{n:"ObjProtect",f:jn},125:{n:"ColInfo",f:Ys},128:{n:"Guts",f:ps},129:{n:"WsBool",f:Li},130:{n:"GridSet",f:$n},131:{n:"HCenter",f:jn},132:{n:"VCenter",f:jn},133:{n:"BoundSheet8",f:Mi},134:{n:"WriteProtect"},140:{n:"Country",f:Xs},141:{n:"HideObj",f:$n},144:{n:"Sort"},146:{n:"Palette",f:Ks},151:{n:"Sync"},152:{n:"LPr"},153:{n:"DxGCol"},154:{n:"FnGroupName"},155:{n:"FilterMode"},156:{n:"BuiltInFnGroupCount",f:$n},157:{n:"AutoFilterInfo"},158:{n:"AutoFilter"},160:{n:"Scl",f:ef},161:{n:"Setup",f:Zs},174:{n:"ScenMan"},175:{n:"SCENARIO"},176:{n:"SxView"},177:{n:"Sxvd"},178:{n:"SXVI"},180:{n:"SxIvd"},181:{n:"SXLI"},182:{n:"SXPI"},184:{n:"DocRoute"},185:{n:"RecipName"},189:{n:"MulRk",f:cs},190:{n:"MulBlank",f:us},193:{n:"Mms",f:Vn},197:{n:"SXDI"},198:{n:"SXDB"},199:{n:"SXFDB"},200:{n:"SXDBB"},201:{n:"SXNum"},202:{n:"SxBool",f:jn},203:{n:"SxErr"},204:{n:"SXInt"},205:{n:"SXString"},206:{n:"SXDtr"},207:{n:"SxNil"},208:{n:"SXTbl"},209:{n:"SXTBRGIITM"},210:{n:"SxTbpg"},211:{n:"ObProj"},213:{n:"SXStreamID"},215:{n:"DBCell"},216:{n:"SXRng"},217:{n:"SxIsxoper"},218:{n:"BookBool",f:$n},220:{n:"DbOrParamQry"},221:{n:"ScenarioProtect",f:jn},222:{n:"OleObjectSize"},224:{n:"XF",f:ds},225:{n:"InterfaceHdr",f:Fi},226:{n:"InterfaceEnd",f:Vn},227:{n:"SXVS"},229:{n:"MergeCells",f:Fs},233:{n:"BkHim"},235:{n:"MsoDrawingGroup"},236:{n:"MsoDrawing"},237:{n:"MsoDrawingSelection"},239:{n:"PhoneticInfo"},240:{n:"SxRule"},241:{n:"SXEx"},242:{n:"SxFilt"},244:{n:"SxDXF"},245:{n:"SxItm"},246:{n:"SxName"},247:{n:"SxSelect"},248:{n:"SXPair"},249:{n:"SxFmla"},251:{n:"SxFormat"},252:{n:"SST",f:zi},253:{n:"LabelSst",f:es},255:{n:"ExtSST",f:Wi},256:{n:"SXVDEx"},259:{n:"SXFormula"},290:{n:"SXDBEx"},311:{n:"RRDInsDel"},312:{n:"RRDHead"},315:{n:"RRDChgCell"},317:{n:"RRTabId",f:Zn},318:{n:"RRDRenSheet"},319:{n:"RRSort"},320:{n:"RRDMove"},330:{n:"RRFormat"},331:{n:"RRAutoFmt"},333:{n:"RRInsertSh"},334:{n:"RRDMoveBegin"},335:{n:"RRDMoveEnd"},336:{n:"RRDInsDelBegin"},337:{n:"RRDInsDelEnd"},338:{n:"RRDConflict"},339:{n:"RRDDefName"},340:{n:"RRDRstEtxp"},351:{n:"LRng"},352:{n:"UsesELFs",f:jn},353:{n:"DSF",f:Vn},401:{n:"CUsr"},402:{n:"CbUsr"},403:{n:"UsrInfo"},404:{n:"UsrExcl"},405:{n:"FileLock"},406:{n:"RRDInfo"},407:{n:"BCUsrs"},408:{n:"UsrChk"},425:{n:"UserBView"},426:{n:"UserSViewBegin"},427:{n:"UserSViewEnd"},428:{n:"RRDUserView"},429:{n:"Qsi"},430:{n:"SupBook",f:Ss},431:{n:"Prot4Rev",f:jn},432:{n:"CondFmt"},433:{n:"CF"},434:{n:"DVal"},437:{n:"DConBin"},438:{n:"TxO",f:Us},439:{n:"RefreshAll",f:jn},440:{n:"HLink",f:zs},441:{n:"Lel"},442:{n:"CodeName",f:ai},443:{n:"SXFDBType"},444:{n:"Prot4RevPass",f:$n},445:{n:"ObNoMacros"},446:{n:"Dv"},448:{n:"Excel9File",f:Vn},449:{n:"RecalcId",f:Gi,r:2},450:{n:"EntExU2",f:Vn},512:{n:"Dimensions",f:fs},513:{n:"Blank",f:qs},515:{n:"Number",f:ws},516:{n:"Label",f:ts},517:{n:"BoolErr",f:bs},518:{n:"Formula",f:Ku},519:{n:"String",f:rf},520:{n:"Row",f:Vi},523:{n:"Index"},545:{n:"Array",f:Is},549:{n:"DefaultRowHeight",f:ji},566:{n:"Table"},574:{n:"Window2",f:Yi},638:{n:"RK",f:ls},659:{n:"Style"},1030:{n:"Formula",f:Ku},1048:{n:"BigName"},1054:{n:"Format",f:ns},1084:{n:"ContinueBigName"},1212:{n:"ShrFmla",f:As},2048:{n:"HLinkTooltip",f:Ws},2049:{n:"WebPub"},2050:{n:"QsiSXTag"},2051:{n:"DBQueryExt"},2052:{n:"ExtString"},2053:{n:"TxtQry"},2054:{n:"Qsir"},2055:{n:"Qsif"},2056:{n:"RRDTQSIF"},2057:{n:"BOF",f:Oi},2058:{n:"OleDbConn"},2059:{n:"WOpt"},2060:{n:"SXViewEx"},2061:{n:"SXTH"},2062:{n:"SXPIEx"},2063:{n:"SXVDTEx"},2064:{n:"SXViewEx9"},2066:{n:"ContinueFrt"},2067:{n:"RealTimeData"},2128:{n:"ChartFrtInfo"},2129:{n:"FrtWrapper"},2130:{n:"StartBlock"},2131:{n:"EndBlock"},2132:{n:"StartObject"},2133:{n:"EndObject"},2134:{n:"CatLab"},2135:{n:"YMult"},2136:{n:"SXViewLink"},2137:{n:"PivotChartBits"},2138:{n:"FrtFontList"},2146:{n:"SheetExt"},2147:{n:"BookExt",r:12},2148:{n:"SXAddl"},2149:{n:"CrErr"},2150:{n:"HFPicture"},2151:{n:"FeatHdr",f:Vn},2152:{n:"Feat"},2154:{n:"DataLabExt"},2155:{n:"DataLabExtContents"},2156:{n:"CellWatch"},2161:{n:"FeatHdr11"},2162:{n:"Feature11"},2164:{n:"DropDownObjIds"},2165:{n:"ContinueFrt11"},2166:{n:"DConn"},2167:{n:"List12"},2168:{n:"Feature12"},2169:{n:"CondFmt12"},2170:{n:"CF12"},2171:{n:"CFEx"},2172:{n:"XFCRC",f:$s,r:12},2173:{n:"XFExt",f:Il,r:12},2174:{n:"AutoFilter12"},2175:{n:"ContinueFrt12"},2180:{n:"MDTInfo"},2181:{n:"MDXStr"},2182:{n:"MDXTuple"},2183:{n:"MDXSet"},2184:{n:"MDXProp"},2185:{n:"MDXKPI"},2186:{n:"MDB"},2187:{n:"PLV"},2188:{n:"Compat12",f:jn,r:12},2189:{n:"DXF"},2190:{n:"TableStyles",r:12},2191:{n:"TableStyle"},2192:{n:"TableStyleElement"},2194:{n:"StyleExt"},2195:{n:"NamePublish"},2196:{n:"NameCmt",f:xs,r:12},2197:{n:"SortData"},2198:{n:"Theme",f:Cl,r:12},2199:{n:"GUIDTypeLib"},2200:{n:"FnGrp12"},2201:{n:"NameFnGrp12"},2202:{n:"MTRSettings",f:Rs,r:12},2203:{n:"CompressPictures",f:Vn},2204:{n:"HeaderFooter"},2205:{n:"CrtLayout12"},2206:{n:"CrtMlFrt"},2207:{n:"CrtMlFrtContinue"},2211:{n:"ForceFullCalculation",f:Xi},2212:{n:"ShapePropsStream"},2213:{n:"TextPropsStream"},2214:{n:"RichTextStream"},2215:{n:"CrtLayout12A"},4097:{n:"Units"},4098:{n:"Chart"},4099:{n:"Series"},4102:{n:"DataFormat"},4103:{n:"LineFormat"},4105:{n:"MarkerFormat"},4106:{n:"AreaFormat"},4107:{n:"PieFormat"},4108:{n:"AttachedLabel"},4109:{n:"SeriesText"},4116:{n:"ChartFormat"},4117:{n:"Legend"},4118:{n:"SeriesList"},4119:{n:"Bar"},4120:{n:"Line"},4121:{n:"Pie"},4122:{n:"Area"},4123:{n:"Scatter"},4124:{n:"CrtLine"},4125:{n:"Axis"},4126:{n:"Tick"},4127:{n:"ValueRange"},4128:{n:"CatSerRange"},4129:{n:"AxisLine"},4130:{n:"CrtLink"},4132:{n:"DefaultText"},4133:{n:"Text"},4134:{n:"FontX",f:$n},4135:{n:"ObjectLink"},4146:{n:"Frame"},4147:{n:"Begin"},4148:{n:"End"},4149:{n:"PlotArea"},4154:{n:"Chart3d"},4156:{n:"PicF"},4157:{n:"DropBar"},4158:{n:"Radar"},4159:{n:"Surf"},4160:{n:"RadarArea"},4161:{n:"AxisParent"},4163:{n:"LegendException"},4164:{n:"ShtProps",f:Js},4165:{n:"SerToCrt"},4166:{n:"AxesUsed"},4168:{n:"SBaseRef"},4170:{n:"SerParent"},4171:{n:"SerAuxTrend"},4174:{n:"IFmtRecord"},4175:{n:"Pos"},4176:{n:"AlRuns"},4177:{n:"BRAI"},4187:{n:"SerAuxErrBar"},4188:{n:"ClrtClient",f:js},4189:{n:"SerFmt"},4191:{n:"Chart3DBarShape"},4192:{n:"Fbi"},4193:{n:"BopPop"},4194:{n:"AxcExt"},4195:{n:"Dat"},4196:{n:"PlotGrowth"},4197:{n:"SIIndex"},4198:{n:"GelFrame"},4199:{n:"BopPopCustom"},4200:{n:"Fbi2"},0:{n:"Dimensions",f:fs},2:{n:"BIFF2INT",f:ff},5:{n:"BoolErr",f:bs},7:{n:"String",f:lf},8:{n:"BIFF2ROW"},11:{n:"Index"},22:{n:"ExternCount",f:$n},30:{n:"BIFF2FORMAT",f:ss},31:{n:"BIFF2FMTCNT"},32:{n:"BIFF2COLINFO"},33:{n:"Array",f:Is},37:{n:"DefaultRowHeight",f:ji},50:{n:"BIFF2FONTXTRA",f:cf},52:{n:"DDEObjName"},62:{n:"BIFF2WINDOW2"},67:{n:"BIFF2XF"},69:{n:"BIFF2FONTCLR"},86:{n:"BIFF4FMTCNT"},126:{n:"RK"},127:{n:"ImData",f:tf},135:{n:"Addin"},136:{n:"Edg"},137:{n:"Pub"},145:{n:"Sub"},148:{n:"LHRecord"},149:{n:"LHNGraph"},150:{n:"Sound"},169:{n:"CoordList"},171:{n:"GCW"},188:{n:"ShrFmla"},191:{n:"ToolbarHdr"},192:{n:"ToolbarEnd"},194:{n:"AddMenu"},195:{n:"DelMenu"},214:{n:"RString",f:uf},223:{n:"UDDesc"},234:{n:"TabIdConf"},354:{n:"XL5Modify"},421:{n:"FileSharing2"},521:{n:"BOF",f:Oi},536:{n:"Lbl",f:Bs},547:{n:"ExternName",f:_s},561:{n:"Font"},579:{n:"BIFF3XF"},1033:{n:"BOF",f:Oi},1091:{n:"BIFF4XF"},2157:{n:"FeatInfo"},2163:{n:"FeatInfo11"},2177:{n:"SXAddl12"},2240:{n:"AutoWebPub"},2241:{n:"ListObj"},2242:{n:"ListField"},2243:{n:"ListDV"},2244:{n:"ListCondFmt"},2245:{n:"ListCF"},2246:{n:"FMQry"},2247:{n:"FMSQry"},2248:{n:"PLV"},2249:{n:"LnExt"},2250:{n:"MkrExt"},2251:{n:"CrtCoopt"},2262:{n:"FRTArchId$",r:12},29282:{}};var Np=Y(Pp,"n");function Lp(e,r,t,a){var n=+r||+Np[r];if(isNaN(n))return;var i=a||(t||[]).length||0;var s=e.next(4);s._W(2,n);s._W(2,i);if(i>0&&Nr(t))e.push(t)}function Mp(e,r,t,a){var n=a||(t||[]).length||0;if(n<=8224)return Lp(e,r,t,n);var i=+r||+Np[r];if(isNaN(i))return;var s=t.parts||[],f=0;var o=0,l=0;while(l+(s[f]||8224)<=8224){l+=s[f]||8224;f++}var c=e.next(4);c._W(2,i);c._W(2,l);e.push(t.slice(o,o+l));o+=l;while(o=0&&n<65536)Lp(e,2,of(t,a,n));else Lp(e,3,sf(t,a,n));return;case"b":;case"e":Lp(e,5,zp(t,a,r.v,r.t));return;case"s":;case"str":Lp(e,4,Hp(t,a,r.v));return;}Lp(e,1,Up(null,t,a))}function Vp(e,r,t,a){var n=Array.isArray(r);var i=kt(r["!ref"]||"A1"),s,f="",o=[];if(i.e.c>255||i.e.r>16383){if(a.WTF)throw new Error("Range "+(r["!ref"]||"A1")+" exceeds format limit A1:IV16384");i.e.c=Math.min(i.e.c,255);i.e.r=Math.min(i.e.c,16383);s=wt(i)}for(var l=i.s.r;l<=i.e.r;++l){f=ot(l);for(var c=i.s.c;c<=i.e.c;++c){if(l===i.s.r)o[c]=ht(c);s=o[c]+f;var u=n?(r[l]||[])[c]:r[s];if(!u)continue;Wp(e,u,l,c,a)}}}function Xp(e,r){var t=r||{};if(m!=null&&t.dense==null)t.dense=m;var a=qr();var n=0;for(var i=0;i255||d.e.r>=v){if(r.WTF)throw new Error("Range "+(i["!ref"]||"A1")+" exceeds format limit A1:IV16384");d.e.c=Math.min(d.e.c,255);d.e.r=Math.min(d.e.c,v-1)}Lp(a,2057,Di(t,16,r));Lp(a,"CalcMode",Yn(1));Lp(a,"CalcCount",Yn(100));Lp(a,"CalcRefMode",Kn(true));Lp(a,"CalcIter",Kn(false));Lp(a,"CalcDelta",Jt(.001));Lp(a,"CalcSaveRecalc",Kn(true));Lp(a,"PrintRowCol",Kn(false));Lp(a,"PrintGrid",Kn(false));Lp(a,"GridSet",Yn(1));Lp(a,"Guts",ms([0,0]));Lp(a,"HCenter",Kn(false));Lp(a,"VCenter",Kn(false));Lp(a,512,os(d,r));if(l)i["!links"]=[];for(var p=d.s.r;p<=d.e.r;++p){u=ot(p);for(var m=d.s.c;m<=d.e.c;++m){if(p===d.s.r)h[m]=ht(m);c=h[m]+u;var b=o?(i[p]||[])[m]:i[c];if(!b)continue;Zp(a,b,p,m,r); -if(l&&b.l)i["!links"].push([c,b.l])}}var g=f.CodeName||f.name||n;if(l)Lp(a,"Window2",Zi((s.Views||[])[0]));if(l&&(i["!merges"]||[]).length)Lp(a,"MergeCells",Ps(i["!merges"]));if(l)Yp(a,i);Lp(a,"CodeName",ii(g,r));if(l)Kp(a,i);Lp(a,"EOF");return a.end()}function Qp(e,r,t){var a=qr();var n=(e||{}).Workbook||{};var i=n.Sheets||[];var s=n.WBProps||{};var f=t.biff==8,o=t.biff==5;Lp(a,2057,Di(e,5,t));if(t.bookType=="xla")Lp(a,"Addin");Lp(a,"InterfaceHdr",f?Yn(1200):null);Lp(a,"Mms",Xn(2));if(o)Lp(a,"ToolbarHdr");if(o)Lp(a,"ToolbarEnd");Lp(a,"InterfaceEnd");Lp(a,"WriteAccess",Ni("SheetJS",t));Lp(a,"CodePage",Yn(f?1200:1252));if(f)Lp(a,"DSF",Yn(0));if(f)Lp(a,"Excel9File");Lp(a,"RRTabId",Qs(e.SheetNames.length));if(f&&e.vbaraw)Lp(a,"ObProj");if(f&&e.vbaraw){var l=s.CodeName||"ThisWorkbook";Lp(a,"CodeName",ii(l,t))}Lp(a,"BuiltInFnGroupCount",Yn(17));Lp(a,"WinProtect",Kn(false));Lp(a,"Protect",Kn(false));Lp(a,"Password",Yn(0));if(f)Lp(a,"Prot4Rev",Kn(false));if(f)Lp(a,"Prot4RevPass",Yn(0));Lp(a,"Window1",$i(t));Lp(a,"Backup",Kn(false));Lp(a,"HideObj",Yn(0));Lp(a,"Date1904",Kn(hv(e)=="true"));Lp(a,"CalcPrecision",Kn(true));if(f)Lp(a,"RefreshAll",Kn(false));Lp(a,"BookBool",Yn(0));Gp(a,e,t);jp(a,e.SSF,t);$p(a,t);if(f)Lp(a,"UsesELFs",Kn(false));var c=a.end();var u=qr();if(f)Lp(u,"Country",Gs());if(f&&t.Strings)Mp(u,"SST",Hi(t.Strings,t));Lp(u,"EOF");var h=u.end();var d=qr();var v=0,p=0;for(p=0;p/g,"");var n=e.match(/");var i=e.match(/<\/table/i);var s=n.index,f=i&&i.index||e.length;var o=pe(e.slice(s,f),/(:?]*>)/i,"");var l=-1,c=0,u=0,h=0;var d={s:{r:1e7,c:1e7},e:{r:0,c:0}};var v=[];for(s=0;s/i);for(f=0;f"))>-1)k=k.slice(E+1);for(var S=0;S")));h=C.colspan?+C.colspan:1;if((u=+C.rowspan)>1||h>1)v.push({s:{r:l,c:c},e:{r:l+(u||1)-1,c:c+h-1}});var B=C.t||"";if(!k.length){c+=h;continue}k=rr(k);if(d.s.r>l)d.s.r=l;if(d.e.rc)d.s.c=c;if(d.e.ct||n[l].s.c>s)continue;if(n[l].e.r1)d.rowspan=f;if(o>1)d.colspan=o;d.t=u&&u.t||"z";if(a.editable)h=''+h+"";d.id=(a.id||"sjs")+"-"+c;if(d.t!="z"){d.v=u.v;if(u.z!=null)d.z=u.z}i.push(lr("td",h,d))}var v="";return v+i.join("")+""}function a(e,r,t){var a=[];return a.join("")+""}var n='SheetJS Table Export';var i="";function s(e,r){var s=r||{};var f=s.header!=null?s.header:n;var o=s.footer!=null?s.footer:i;var l=[f];var c=gt(e["!ref"]);s.dense=Array.isArray(e);l.push(a(e,c,s));for(var u=c.s.r;u<=c.e.r;++u)l.push(t(e,c,u,s));l.push("
"+o);return l.join("")}return{to_workbook:r,to_sheet:e,_row:t,BEGIN:n,END:i,_preamble:a,from_sheet:s}}();function tm(e,r,t){var a=t||{};if(m!=null)a.dense=m;var n=0,i=0;if(a.origin!=null){if(typeof a.origin=="number")n=a.origin;else{var s=typeof a.origin=="string"?mt(a.origin):a.origin;n=s.r;i=s.c}}var f=r.getElementsByTagName("tr");var o=Math.min(a.sheetRows||1e7,f.length);var l={s:{r:0,c:0},e:{r:n,c:i}};if(e["!ref"]){var c=gt(e["!ref"]);l.s.r=Math.min(l.s.r,c.s.r);l.s.c=Math.min(l.s.c,c.s.c);l.e.r=Math.max(l.e.r,c.e.r);l.e.c=Math.max(l.e.c,c.e.c);if(n==-1)l.e.r=n=c.e.r+1}var u=[],h=0;var d=e["!rows"]||(e["!rows"]=[]);var v=0,p=0,b=0,g=0,w=0,k=0;if(!e["!cols"])e["!cols"]=[];for(;v1||k>1)u.push({s:{r:p+n,c:g+i},e:{r:p+n+(w||1)-1,c:g+i+(k||1)-1}});var y={t:"s",v:C};var x=_.getAttribute("t")||"";if(C!=null){if(C.length==0)y.t=x||"z";else if(a.raw||C.trim().length==0||x=="s"){}else if(C==="TRUE")y={t:"b",v:true};else if(C==="FALSE")y={t:"b",v:false};else if(!isNaN(he(C)))y={t:"n",v:he(C)};else if(!isNaN(de(C).getDate())){y={t:"d",v:oe(C)};if(!a.cellDates)y={t:"n",v:ee(y.v)};y.z=a.dateNF||D._table[14]}}if(y.z===undefined&&B!=null)y.z=B;if(a.dense){if(!e[p+n])e[p+n]=[];e[p+n][g+i]=y}else e[bt({c:g+i,r:p+n})]=y;if(l.e.c=o)e["!fullref"]=wt((l.e.r=f.length-v+p-1+n,l));return e}function am(e,r){var t=r||{};var a=t.dense?[]:{};return tm(a,e,r)}function nm(e,r){return _t(am(e,r),r)}function im(e){var r="";var t=sm(e);if(t)r=t(e).getPropertyValue("display");if(!r)r=e.style.display;return r==="none"}function sm(e){if(e.ownerDocument.defaultView&&typeof e.ownerDocument.defaultView.getComputedStyle==="function")return e.ownerDocument.defaultView.getComputedStyle;if(typeof getComputedStyle==="function")return getComputedStyle;return null}var fm=function(){var e=function(e){var r=e.replace(/[\t\r\n]/g," ").trim().replace(/ +/g," ").replace(//g," ").replace(//g,function(e,r){return Array(parseInt(r,10)+1).join(" ")}).replace(/]*\/>/g,"\t").replace(//g,"\n");var t=Me(r.replace(/<[^>]*>/g,""));return[t]};var r={day:["d","dd"],month:["m","mm"],year:["y","yy"],hours:["h","hh"],minutes:["m","mm"],seconds:["s","ss"],"am-pm":["A/P","AM/PM"],"day-of-week":["ddd","dddd"],era:["e","ee"],quarter:["\\Qm",'m\\"th quarter"']};return function t(a,n){var i=n||{};if(m!=null&&i.dense==null)i.dense=m;var s=sp(a);var f=[],o;var l;var c={name:""},u="",h=0;var d;var v;var p={},b=[];var g=i.dense?[]:{};var w,k;var E={value:""};var S="",_=0,C;var B=[];var T=-1,y=-1,x={s:{r:1e6,c:1e7},e:{r:0,c:0}};var A=0;var I={};var R=[],O={},D=0,F=0;var P=[],N=1,L=1;var M=[];var U={Names:[]};var z={};var H=["",""];var W=[],V={};var X="",G=0;var j=false,K=false;var $=0;fp.lastIndex=0;s=s.replace(//gm,"").replace(//gm,"");while(w=fp.exec(s))switch(w[3]=w[3].replace(/_.*$/,"")){case"table":;case"工作表":if(w[1]==="/"){if(x.e.c>=x.s.c&&x.e.r>=x.s.r)g["!ref"]=wt(x);else g["!ref"]="A1:A1";if(i.sheetRows>0&&i.sheetRows<=x.e.r){g["!fullref"]=g["!ref"];x.e.r=i.sheetRows-1;g["!ref"]=wt(x)}if(R.length)g["!merges"]=R;if(P.length)g["!rows"]=P;d.name=d["名称"]||d.name;if(typeof JSON!=="undefined")JSON.stringify(d);b.push(d.name);p[d.name]=g;K=false}else if(w[0].charAt(w[0].length-2)!=="/"){d=Fe(w[0],false);T=y=-1;x.s.r=x.s.c=1e7;x.e.r=x.e.c=0;g=i.dense?[]:{};R=[];P=[];K=true}break;case"table-row-group":if(w[1]==="/")--A;else++A;break;case"table-row":;case"行":if(w[1]==="/"){T+=N;N=1;break}v=Fe(w[0],false);if(v["行号"])T=v["行号"]-1;else if(T==-1)T=0;N=+v["number-rows-repeated"]||1;if(N<10)for($=0;$0)P[T+$]={level:A};y=-1;break;case"covered-table-cell":if(w[1]!=="/")++y;if(i.sheetStubs){if(i.dense){if(!g[T])g[T]=[];g[T][y]={t:"z"}}else g[bt({r:T,c:y})]={t:"z"}}S="";B=[];break;case"table-cell":;case"数据":if(w[0].charAt(w[0].length-2)==="/"){++y;E=Fe(w[0],false);L=parseInt(E["number-columns-repeated"]||"1",10);k={t:"z",v:null};if(E.formula&&i.cellFormula!=false)k.f=nh(Me(E.formula));if((E["数据类型"]||E["value-type"])=="string"){k.t="s";k.v=Me(E["string-value"]||"");if(i.dense){if(!g[T])g[T]=[];g[T][y]=k}else{g[bt({r:T,c:y})]=k}}y+=L-1}else if(w[1]!=="/"){++y;L=1;var Y=N?T+N-1:T;if(y>x.e.c)x.e.c=y;if(yx.e.r)x.e.r=Y;E=Fe(w[0],false);W=[];V={};k={t:E["数据类型"]||E["value-type"],v:null};if(i.cellFormula){if(E.formula)E.formula=Me(E.formula);if(E["number-matrix-columns-spanned"]&&E["number-matrix-rows-spanned"]){D=parseInt(E["number-matrix-rows-spanned"],10)||0;F=parseInt(E["number-matrix-columns-spanned"],10)||0;O={s:{r:T,c:y},e:{r:T+D-1,c:y+F-1}};k.F=wt(O);M.push([O,k.F])}if(E.formula)k.f=nh(E.formula);else for($=0;$=M[$][0].s.r&&T<=M[$][0].e.r)if(y>=M[$][0].s.c&&y<=M[$][0].e.c)k.F=M[$][1]}if(E["number-columns-spanned"]||E["number-rows-spanned"]){D=parseInt(E["number-rows-spanned"],10)||0;F=parseInt(E["number-columns-spanned"],10)||0;O={s:{r:T,c:y},e:{r:T+D-1,c:y+F-1}};R.push(O)}if(E["number-columns-repeated"])L=parseInt(E["number-columns-repeated"],10);switch(k.t){case"boolean":k.t="b";k.v=$e(E["boolean-value"]);break;case"float":k.t="n";k.v=parseFloat(E.value);break;case"percentage":k.t="n";k.v=parseFloat(E.value);break;case"currency":k.t="n";k.v=parseFloat(E.value);break;case"date":k.t="d";k.v=oe(E["date-value"]);if(!i.cellDates){k.t="n";k.v=ee(k.v)}k.z="m/d/yy";break;case"time":k.t="n";k.v=ie(E["time-value"])/86400;break;case"number":k.t="n";k.v=parseFloat(E["数据数值"]);break;default:if(k.t==="string"||k.t==="text"||!k.t){k.t="s";if(E["string-value"]!=null){S=Me(E["string-value"]);B=[]}}else throw new Error("Unsupported value type "+k.t);}}else{j=false;if(k.t==="s"){k.v=S||"";if(B.length)k.R=B;j=_==0}if(z.Target)k.l=z;if(W.length>0){k.c=W;W=[]}if(S&&i.cellText!==false)k.w=S;if(j){k.t="z";delete k.v}if(!j||i.sheetStubs){if(!(i.sheetRows&&i.sheetRows<=T)){for(var Z=0;Z0)g[T+Z][y+L]=ce(k)}else{g[bt({r:T+Z,c:y})]=k;while(--L>0)g[bt({r:T+Z,c:y+L})]=ce(k)}if(x.e.c<=y)x.e.c=y}}}L=parseInt(E["number-columns-repeated"]||"1",10);y+=L-1;L=0;k={};S="";B=[]}z={};break;case"document":;case"document-content":;case"电子表格文档":;case"spreadsheet":;case"主体":;case"scripts":;case"styles":;case"font-face-decls":if(w[1]==="/"){if((o=f.pop())[0]!==w[3])throw"Bad state: "+o}else if(w[0].charAt(w[0].length-2)!=="/")f.push([w[3],true]);break;case"annotation":if(w[1]==="/"){if((o=f.pop())[0]!==w[3])throw"Bad state: "+o;V.t=S;if(B.length)V.R=B;V.a=X;W.push(V)}else if(w[0].charAt(w[0].length-2)!=="/"){f.push([w[3],false])}X="";G=0;S="";_=0;B=[];break;case"creator":if(w[1]==="/"){X=s.slice(G,w.index)}else G=w.index+w[0].length;break;case"meta":;case"元数据":;case"settings":;case"config-item-set":;case"config-item-map-indexed":;case"config-item-map-entry":;case"config-item-map-named":;case"shapes":;case"frame":;case"text-box":;case"image":;case"data-pilot-tables":;case"list-style":;case"form":;case"dde-links":;case"event-listeners":;case"chart":if(w[1]==="/"){if((o=f.pop())[0]!==w[3])throw"Bad state: "+o}else if(w[0].charAt(w[0].length-2)!=="/")f.push([w[3],false]);S="";_=0;B=[];break;case"scientific-number":break;case"currency-symbol":break;case"currency-style":break;case"number-style":;case"percentage-style":;case"date-style":;case"time-style":if(w[1]==="/"){I[c.name]=u;if((o=f.pop())[0]!==w[3])throw"Bad state: "+o}else if(w[0].charAt(w[0].length-2)!=="/"){u="";c=Fe(w[0],false);f.push([w[3],true])}break;case"script":break;case"libraries":break;case"automatic-styles":break;case"master-styles":break;case"default-style":;case"page-layout":break;case"style":break;case"map":break;case"font-face":break;case"paragraph-properties":break;case"table-properties":break;case"table-column-properties":break;case"table-row-properties":break;case"table-cell-properties":break;case"number":switch(f[f.length-1][0]){case"time-style":;case"date-style":l=Fe(w[0],false);u+=r[w[3]][l.style==="long"?1:0];break;}break;case"fraction":break;case"day":;case"month":;case"year":;case"era":;case"day-of-week":;case"week-of-year":;case"quarter":;case"hours":;case"minutes":;case"seconds":;case"am-pm":switch(f[f.length-1][0]){case"time-style":;case"date-style":l=Fe(w[0],false);u+=r[w[3]][l.style==="long"?1:0];break;}break;case"boolean-style":break;case"boolean":break;case"text-style":break;case"text":if(w[0].slice(-2)==="/>")break;else if(w[1]==="/")switch(f[f.length-1][0]){case"number-style":;case"date-style":;case"time-style":u+=s.slice(h,w.index);break;}else h=w.index+w[0].length;break;case"named-range":l=Fe(w[0],false);H=sh(l["cell-range-address"]);var J={Name:l.name,Ref:H[0]+"!"+H[1]};if(K)J.Sheet=b.length;U.Names.push(J);break;case"text-content":break;case"text-properties":break;case"embedded-text":break;case"body":;case"电子表格":break;case"forms":break;case"table-column":break;case"table-header-rows":break;case"table-rows":break;case"table-column-group":break;case"table-header-columns":break;case"table-columns":break;case"null-date":break;case"graphic-properties":break;case"calculation-settings":break;case"named-expressions":break;case"label-range":break;case"label-ranges":break;case"named-expression":break;case"sort":break;case"sort-by":break;case"sort-groups":break;case"tab":break;case"line-break":break;case"span":break;case"p":;case"文本串":if(w[1]==="/"&&(!E||!E["string-value"])){var Q=e(s.slice(_,w.index),C);S=(S.length>0?S+"\n":"")+Q[0]}else{C=Fe(w[0],false);_=w.index+w[0].length}break;case"s":break;case"database-range":if(w[1]==="/")break;try{H=sh(Fe(w[0])["target-range-address"]);p[H[0]]["!autofilter"]={ref:H[1]}}catch(q){}break;case"date":break;case"object":break;case"title":;case"标题":break;case"desc":break;case"binary-data":break;case"table-source":break;case"scenario":break;case"iteration":break;case"content-validations":break;case"content-validation":break;case"help-message":break;case"error-message":break;case"database-ranges":break;case"filter":break;case"filter-and":break;case"filter-or":break;case"filter-condition":break;case"list-level-style-bullet":break;case"list-level-style-number":break;case"list-level-properties":break;case"sender-firstname":;case"sender-lastname":;case"sender-initials":;case"sender-title":;case"sender-position":;case"sender-email":;case"sender-phone-private":;case"sender-fax":;case"sender-company":;case"sender-phone-work":;case"sender-street":;case"sender-city":;case"sender-postal-code":;case"sender-country":;case"sender-state-or-province":;case"author-name":;case"author-initials":;case"chapter":;case"file-name":;case"template-name":;case"sheet-name":break;case"event-listener":break;case"initial-creator":;case"creation-date":;case"print-date":;case"generator":;case"document-statistic":;case"user-defined":;case"editing-duration":;case"editing-cycles":break;case"config-item":break;case"page-number":break;case"page-count":break;case"time":break;case"cell-range-source":break;case"detective":break;case"operation":break;case"highlighted-range":break;case"data-pilot-table":;case"source-cell-range":;case"source-service":;case"data-pilot-field":;case"data-pilot-level":;case"data-pilot-subtotals":;case"data-pilot-subtotal":;case"data-pilot-members":;case"data-pilot-member":;case"data-pilot-display-info":;case"data-pilot-sort-info":;case"data-pilot-layout-info":;case"data-pilot-field-reference":;case"data-pilot-groups":;case"data-pilot-group":;case"data-pilot-group-member":break;case"rect":break;case"dde-connection-decls":;case"dde-connection-decl":;case"dde-link":;case"dde-source":break;case"properties":break;case"property":break;case"a":if(w[1]!=="/"){z=Fe(w[0],false);if(!z.href)break;z.Target=z.href;delete z.href;if(z.Target.charAt(0)=="#"&&z.Target.indexOf(".")>-1){H=sh(z.Target.slice(1));z.Target="#"+H[0]+"!"+H[1]}}break;case"table-protection":break;case"data-pilot-grand-total":break;case"office-document-common-attrs":break;default:switch(w[2]){case"dc:":;case"calcext:":;case"loext:":;case"ooo:":;case"chartooo:":;case"draw:":;case"style:":;case"chart:":;case"form:":;case"uof:":;case"表:":;case"字:":break;default:if(i.WTF)throw new Error(w);};}var re={Sheets:p,SheetNames:b,Workbook:U};if(i.bookSheets)delete re.Sheets;return re}}();function om(e,r){r=r||{};var t=!!we(e,"objectdata");if(t)ja(Ee(e,"META-INF/manifest.xml"),r);var a=Se(e,"content.xml");if(!a)throw new Error("Missing content.xml in "+(t?"ODS":"UOF")+" file");var n=fm(t?a:Ye(a),r);if(we(e,"meta.xml"))n.Props=en(Ee(e,"meta.xml"));return n}function lm(e,r){return fm(e,r)}var cm=function(){var e="";return function r(){return Ae+e}}();var um=function(){var e=function(e){return He(e).replace(/ +/g,function(e){return''}).replace(/\t/g,"").replace(/\n/g,"").replace(/^ /,"").replace(/ $/,"")};var r=" \n";var t=" \n";var a=function(a,n,i){var s=[];s.push(' \n');var f=0,o=0,l=gt(a["!ref"]);var c=a["!merges"]||[],u=0;var h=Array.isArray(a);for(f=0;f\n");for(;f<=l.e.r;++f){s.push(" \n");for(o=0;oo)continue;if(c[u].s.r>f)continue;if(c[u].e.c\n")}s.push(" \n");return s.join("")};var n=function(e){e.push(" \n");e.push(' \n');e.push(' \n');e.push(" /\n");e.push(' \n');e.push(" /\n");e.push(" \n");e.push(" \n");e.push(' \n');e.push(' \n');e.push(" \n");e.push(' \n');e.push(" \n")};return function i(e,r){var t=[Ae];var i=or({"xmlns:office":"urn:oasis:names:tc:opendocument:xmlns:office:1.0","xmlns:table":"urn:oasis:names:tc:opendocument:xmlns:table:1.0","xmlns:style":"urn:oasis:names:tc:opendocument:xmlns:style:1.0","xmlns:text":"urn:oasis:names:tc:opendocument:xmlns:text:1.0","xmlns:draw":"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","xmlns:fo":"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","xmlns:xlink":"http://www.w3.org/1999/xlink","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:meta":"urn:oasis:names:tc:opendocument:xmlns:meta:1.0","xmlns:number":"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0","xmlns:presentation":"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0","xmlns:svg":"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0","xmlns:chart":"urn:oasis:names:tc:opendocument:xmlns:chart:1.0","xmlns:dr3d":"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0","xmlns:math":"http://www.w3.org/1998/Math/MathML","xmlns:form":"urn:oasis:names:tc:opendocument:xmlns:form:1.0","xmlns:script":"urn:oasis:names:tc:opendocument:xmlns:script:1.0","xmlns:ooo":"http://openoffice.org/2004/office","xmlns:ooow":"http://openoffice.org/2004/writer","xmlns:oooc":"http://openoffice.org/2004/calc","xmlns:dom":"http://www.w3.org/2001/xml-events","xmlns:xforms":"http://www.w3.org/2002/xforms","xmlns:xsd":"http://www.w3.org/2001/XMLSchema","xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance","xmlns:sheet":"urn:oasis:names:tc:opendocument:sh33tjs:1.0","xmlns:rpt":"http://openoffice.org/2005/report","xmlns:of":"urn:oasis:names:tc:opendocument:xmlns:of:1.2","xmlns:xhtml":"http://www.w3.org/1999/xhtml","xmlns:grddl":"http://www.w3.org/2003/g/data-view#","xmlns:tableooo":"http://openoffice.org/2009/table","xmlns:drawooo":"http://openoffice.org/2010/draw","xmlns:calcext":"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0","xmlns:loext":"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0","xmlns:field":"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0","xmlns:formx":"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0","xmlns:css3t":"http://www.w3.org/TR/css3-text/","office:version":"1.2"});var s=or({"xmlns:config":"urn:oasis:names:tc:opendocument:xmlns:config:1.0","office:mimetype":"application/vnd.oasis.opendocument.spreadsheet"});if(r.bookType=="fods")t.push("\n");else t.push("\n");n(t);t.push(" \n");t.push(" \n");for(var f=0;f!=e.SheetNames.length;++f)t.push(a(e.Sheets[e.SheetNames[f]],e,f,r));t.push(" \n");t.push(" \n");if(r.bookType=="fods")t.push("");else t.push("");return t.join("")}}();function hm(e,r){if(r.bookType=="fods")return um(e,r);var t=Te();var a="";var n=[];var i=[];a="mimetype";Ce(t,a,"application/vnd.oasis.opendocument.spreadsheet");a="content.xml";Ce(t,a,um(e,r));n.push([a,"text/xml"]);i.push([a,"ContentFile"]);a="styles.xml";Ce(t,a,cm(e,r));n.push([a,"text/xml"]);i.push([a,"StylesFile"]);a="meta.xml";Ce(t,a,Ja());n.push([a,"text/xml"]);i.push([a,"MetadataFile"]);a="manifest.rdf";Ce(t,a,Za(i));n.push([a,"application/rdf+xml"]);a="META-INF/manifest.xml";Ce(t,a,Ka(n));return t}function dm(e,r){if(!r)return 0;var t=e.SheetNames.indexOf(r);if(t==-1)throw new Error("Sheet not found: "+r);return t}function vm(e){return function r(t,a){var n=dm(t,a.sheet);return e.from_sheet(t.Sheets[t.SheetNames[n]],a,t)}}var pm=vm(rm);var mm=vm({from_sheet:nb});var bm=vm(typeof df!=="undefined"?df:{});var gm=vm(typeof vf!=="undefined"?vf:{});var wm=vm(typeof mf!=="undefined"?mf:{});var km=vm(typeof so!=="undefined"?so:{});var Em=vm({from_sheet:ib});var Sm=vm(typeof hf!=="undefined"?hf:{});var _m=vm(typeof pf!=="undefined"?pf:{});function Cm(e){return function r(t){for(var a=0;a!=e.length;++a){var n=e[a];if(t[n[0]]===undefined)t[n[0]]=n[1];if(n[2]==="n")t[n[0]]=Number(t[n[0]])}}}var Bm=function(e){Cm([["cellNF",false],["cellHTML",true],["cellFormula",true],["cellStyles",false],["cellText",true],["cellDates",false],["sheetStubs",false],["sheetRows",0,"n"],["bookDeps",false],["bookSheets",false],["bookProps",false],["bookFiles",false],["bookVBA",false],["password",""],["WTF",false]])(e)};var Tm=Cm([["cellDates",false],["bookSST",false],["bookType","xlsx"],["compression",false],["WTF",false]]);function ym(e){if(Ma.WS.indexOf(e)>-1)return"sheet";if(Ma.CS&&e==Ma.CS)return"chart";if(Ma.DS&&e==Ma.DS)return"dialog";if(Ma.MS&&e==Ma.MS)return"macro";return e&&e.length?e:"sheet"}function xm(e,r){if(!e)return 0;try{e=r.map(function a(r){if(!r.id)r.id=r.strRelID;return[r.name,e["!id"][r.id].Target,ym(e["!id"][r.id].Type)]})}catch(t){return null}return!e||e.length===0?null:e}function Am(e,r,t,a,n,i,s,f,o,l,c,u){try{i[a]=za(Se(e,t,true),r);var h=Ee(e,r);var d;switch(f){case"sheet":d=Fv(h,r,n,o,i[a],l,c,u);break;case"chart":d=Pv(h,r,n,o,i[a],l,c,u);if(!d||!d["!drawel"])break;var v=xe(d["!drawel"].Target,r);var p=Ua(v);var m=Ll(Se(e,v,true),za(Se(e,p,true),v));var b=xe(m,v);var g=Ua(b);d=Qd(Se(e,b,true),b,o,za(Se(e,g,true),b),l,d);break;case"macro":d=Nv(h,r,n,o,i[a],l,c,u);break;case"dialog":d=Lv(h,r,n,o,i[a],l,c,u);break;default:throw new Error("Unrecognized sheet type "+f);}s[a]=d;var w=[];if(i&&i[a])K(i[a]).forEach(function(t){if(i[a][t].Type==Ma.CMNT){var n=xe(i[a][t].Target,r);w=Hv(Ee(e,n,true),n,o);if(!w||!w.length)return;zl(d,w)}})}catch(k){if(o.WTF)throw k}}function Im(e){return e.charAt(0)=="/"?e.slice(1):e}function Rm(e,r){F(D);r=r||{};Bm(r);if(we(e,"META-INF/manifest.xml"))return om(e,r);if(we(e,"objectdata.xml"))return om(e,r);if(we(e,"Index/Document.iwa"))throw new Error("Unsupported NUMBERS file");var t=_e(e);var a=Fa(Se(e,"[Content_Types].xml"));var n=false;var i,s;if(a.workbooks.length===0){s="xl/workbook.xml";if(Ee(e,s,true))a.workbooks.push(s)}if(a.workbooks.length===0){s="xl/workbook.bin";if(!Ee(e,s,true))throw new Error("Could not find workbook");a.workbooks.push(s);n=true}if(a.workbooks[0].slice(-3)=="bin")n=true;var f={};var o={};if(!r.bookSheets&&!r.bookProps){oh=[];if(a.sst)try{oh=zv(Ee(e,Im(a.sst)),a.sst,r)}catch(l){if(r.WTF)throw l}if(r.cellStyles&&a.themes.length)f=Uv(Se(e,a.themes[0].replace(/^\//,""),true)||"",a.themes[0],r);if(a.style)o=Mv(Ee(e,Im(a.style)),a.style,f,r)}a.links.map(function(t){try{var a=za(Se(e,Ua(Im(t))),t);return Vv(Ee(e,Im(t)),a,t,r)}catch(n){}});var c=Dv(Ee(e,Im(a.workbooks[0])),a.workbooks[0],r);var u={},h="";if(a.coreprops.length){h=Ee(e,Im(a.coreprops[0]),true);if(h)u=en(h);if(a.extprops.length!==0){h=Ee(e,Im(a.extprops[0]),true);if(h)on(h,u,r)}}var d={};if(!r.bookSheets||r.bookProps){if(a.custprops.length!==0){h=Se(e,Im(a.custprops[0]),true);if(h)d=hn(h,r)}}var v={};if(r.bookSheets||r.bookProps){if(c.Sheets)i=c.Sheets.map(function I(e){return e.name});else if(u.Worksheets&&u.SheetNames.length>0)i=u.SheetNames;if(r.bookProps){v.Props=u;v.Custprops=d}if(r.bookSheets&&typeof i!=="undefined")v.SheetNames=i;if(r.bookSheets?v.SheetNames:r.bookProps)return v}i={};var p={};if(r.bookDeps&&a.calcchain)p=Wv(Ee(e,Im(a.calcchain)),a.calcchain,r);var m=0;var b={};var g,w;{var k=c.Sheets;u.Worksheets=k.length;u.SheetNames=[];for(var E=0;E!=k.length;++E){u.SheetNames[E]=k[E].name}}var S=n?"bin":"xml";var _=a.workbooks[0].lastIndexOf("/");var C=(a.workbooks[0].slice(0,_+1)+"_rels/"+a.workbooks[0].slice(_+1)+".rels").replace(/^\//,"");if(!we(e,C))C="xl/_rels/workbook."+S+".rels";var B=za(Se(e,C,true),C);if(B)B=xm(B,c.Sheets);var T=Ee(e,"xl/worksheets/sheet.xml",true)?1:0;e:for(m=0;m!=u.Worksheets;++m){var y="sheet";if(B&&B[m]){g="xl/"+B[m][1].replace(/[\/]?xl\//,"");if(!we(e,g))g=B[m][1];if(!we(e,g))g=C.replace(/_rels\/.*$/,"")+B[m][1];y=B[m][2]}else{g="xl/worksheets/sheet"+(m+1-T)+"."+S;g=g.replace(/sheet0\./,"sheet.")}w=g.replace(/^(.*)(\/)([^\/]*)$/,"$1/_rels/$3.rels");if(r&&r.sheets!=null)switch(typeof r.sheets){case"number":if(m!=r.sheets)continue e;break;case"string":if(u.SheetNames[m].toLowerCase()!=r.sheets.toLowerCase())continue e;break;default:if(Array.isArray&&Array.isArray(r.sheets)){var x=false;for(var A=0;A!=r.sheets.length;++A){if(typeof r.sheets[A]=="number"&&r.sheets[A]==m)x=1;if(typeof r.sheets[A]=="string"&&r.sheets[A].toLowerCase()==u.SheetNames[m].toLowerCase())x=1}if(!x)continue e};}Am(e,g,w,u.SheetNames[m],m,b,i,y,r,c,f,o)}v={Directory:a,Workbook:c,Props:u,Custprops:d,Deps:p,Sheets:i,SheetNames:u.SheetNames,Strings:oh,Styles:o,Themes:f,SSF:D.get_table()};if(r&&r.bookFiles){v.keys=t;v.files=e.files}if(r&&r.bookVBA){if(a.vba.length>0)v.vbaraw=Ee(e,Im(a.vba[0]),true);else if(a.defaults&&a.defaults.bin===Zl)v.vbaraw=Ee(e,"xl/vbaProject.bin",true)}return v}function Om(e,r){var t=r||{};var a="Workbook",n=W.find(e,a);try{a="/!DataSpaces/Version";n=W.find(e,a);if(!n||!n.content)throw new Error("ECMA-376 Encrypted file missing "+a);Uf(n.content);a="/!DataSpaces/DataSpaceMap";n=W.find(e,a);if(!n||!n.content)throw new Error("ECMA-376 Encrypted file missing "+a);var i=Hf(n.content);if(i.length!==1||i[0].comps.length!==1||i[0].comps[0].t!==0||i[0].name!=="StrongEncryptionDataSpace"||i[0].comps[0].v!=="EncryptedPackage")throw new Error("ECMA-376 Encrypted file bad "+a);a="/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace";n=W.find(e,a);if(!n||!n.content)throw new Error("ECMA-376 Encrypted file missing "+a);var s=Wf(n.content);if(s.length!=1||s[0]!="StrongEncryptionTransform")throw new Error("ECMA-376 Encrypted file bad "+a);a="/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary";n=W.find(e,a);if(!n||!n.content)throw new Error("ECMA-376 Encrypted file missing "+a);Xf(n.content)}catch(f){}a="/EncryptionInfo";n=W.find(e,a);if(!n||!n.content)throw new Error("ECMA-376 Encrypted file missing "+a);var o=Kf(n.content);a="/EncryptedPackage";n=W.find(e,a);if(!n||!n.content)throw new Error("ECMA-376 Encrypted file missing "+a);if(o[0]==4&&typeof decrypt_agile!=="undefined")return decrypt_agile(o[1],n.content,t.password||"",t);if(o[0]==2&&typeof decrypt_std76!=="undefined")return decrypt_std76(o[1],n.content,t.password||"",t);throw new Error("File is password-protected")}function Dm(e,r){Ml=1024;if(r.bookType=="ods")return hm(e,r);if(e&&!e.SSF){e.SSF=D.get_table()}if(e&&e.SSF){F(D);D.load_table(e.SSF);r.revssf=J(e.SSF); -r.revssf[e.SSF[65535]]=0;r.ssf=e.SSF}r.rels={};r.wbrels={};r.Strings=[];r.Strings.Count=0;r.Strings.Unique=0;if(ch)r.revStrings=new Map;else{r.revStrings={};r.revStrings.foo=[];delete r.revStrings.foo}var t=r.bookType=="xlsb"?"bin":"xml";var a=ql.indexOf(r.bookType)>-1;var n=Da();Tm(r=r||{});var i=Te();var s="",f=0;r.cellXfs=[];vh(r.cellXfs,{},{revssf:{General:0}});if(!e.Props)e.Props={};s="docProps/core.xml";Ce(i,s,an(e.Props,r));n.coreprops.push(s);Xa(r.rels,2,s,Ma.CORE_PROPS);s="docProps/app.xml";if(e.Props&&e.Props.SheetNames){}else if(!e.Workbook||!e.Workbook.Sheets)e.Props.SheetNames=e.SheetNames;else{var o=[];for(var l=0;l0){s="docProps/custom.xml";Ce(i,s,vn(e.Custprops,r));n.custprops.push(s);Xa(r.rels,4,s,Ma.CUST_PROPS)}for(f=1;f<=e.SheetNames.length;++f){var c={"!id":{}};var u=e.Sheets[e.SheetNames[f-1]];var h=(u||{})["!type"]||"sheet";switch(h){case"chart":;default:s="xl/worksheets/sheet"+f+"."+t;Ce(i,s,Gv(f-1,s,r,e,c));n.sheets.push(s);Xa(r.wbrels,-1,"worksheets/sheet"+f+"."+t,Ma.WS[0]);}if(u){var d=u["!comments"];var v=false;if(d&&d.length>0){var p="xl/comments"+f+"."+t;Ce(i,p,Yv(d,p,r));n.comments.push(p);Xa(c,-1,"../comments"+f+"."+t,Ma.CMNT);v=true}if(u["!legacy"]){if(v)Ce(i,"xl/drawings/vmlDrawing"+f+".vml",Ul(f,u["!comments"]))}delete u["!comments"];delete u["!legacy"]}if(c["!id"].rId1)Ce(i,Ua(s),Wa(c))}if(r.Strings!=null&&r.Strings.length>0){s="xl/sharedStrings."+t;Ce(i,s,$v(r.Strings,s,r));n.strs.push(s);Xa(r.wbrels,-1,"sharedStrings."+t,Ma.SST)}s="xl/workbook."+t;Ce(i,s,Xv(e,s,r));n.workbooks.push(s);Xa(r.rels,1,s,Ma.WB);s="xl/theme/theme1.xml";Ce(i,s,_l(e.Themes,r));n.themes.push(s);Xa(r.wbrels,-1,"theme/theme1.xml",Ma.THEME);s="xl/styles."+t;Ce(i,s,Kv(e,s,r));n.styles.push(s);Xa(r.wbrels,-1,"styles."+t,Ma.STY);if(e.vbaraw&&a){s="xl/vbaProject.bin";Ce(i,s,e.vbaraw);n.vba.push(s);Xa(r.wbrels,-1,"vbaProject.bin",Ma.VBA)}Ce(i,"[Content_Types].xml",La(n,r));Ce(i,"_rels/.rels",Wa(r.rels));Ce(i,"xl/_rels/workbook."+t+".rels",Wa(r.wbrels));delete r.revssf;delete r.ssf;return i}function Fm(e,r){var t="";switch((r||{}).type||"base64"){case"buffer":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];case"base64":t=g.decode(e.slice(0,12));break;case"binary":t=e;break;case"array":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];default:throw new Error("Unrecognized type "+(r&&r.type||"undefined"));}return[t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2),t.charCodeAt(3),t.charCodeAt(4),t.charCodeAt(5),t.charCodeAt(6),t.charCodeAt(7)]}function Pm(e,r){if(W.find(e,"EncryptedPackage"))return Om(e,r);return Rp(e,r)}function Nm(e,r){var t,a=e;var n=r||{};if(!n.type)n.type=w&&Buffer.isBuffer(e)?"buffer":"base64";t=ye(a,n);return Rm(t,n)}function Lm(e,r){var t=0;e:while(t=2&&a[3]===0)return gf.to_workbook(t,i);break;case 3:;case 131:;case 139:;case 140:return hf.to_workbook(t,i);case 123:if(a[1]===92&&a[2]===114&&a[3]===116)return so.to_workbook(t,i);break;case 10:;case 13:;case 32:return Mm(t,i);}if(hf.versions.indexOf(a[0])>-1&&a[2]<=12&&a[3]<=31)return hf.to_workbook(t,i);return Hm(e,t,i,n)}function Vm(e,r){var t=r||{};t.type="file";return Wm(e,t)}function Xm(e,r){switch(r.type){case"base64":;case"binary":break;case"buffer":;case"array":r.type="";break;case"file":return G(r.file,W.write(e,{type:w?"buffer":""}));case"string":throw new Error("'string' output type invalid for '"+r.bookType+"' files");default:throw new Error("Unrecognized type "+r.type);}return W.write(e,r)}function Gm(e,r){var t=r||{};var a=Dm(e,t);var n={};if(t.compression)n.compression="DEFLATE";if(t.password)n.type=w?"nodebuffer":"string";else switch(t.type){case"base64":n.type="base64";break;case"binary":n.type="string";break;case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");case"buffer":;case"file":n.type=w?"nodebuffer":"string";break;default:throw new Error("Unrecognized type "+t.type);}var i=a.FullPaths?W.write(a,{fileType:"zip",type:{nodebuffer:"buffer",string:"binary"}[n.type]||n.type}):a.generate(n);if(t.password&&typeof encrypt_agile!=="undefined")return Xm(encrypt_agile(i,t.password),t);if(t.type==="file")return G(t.file,i);return t.type=="string"?Ye(i):i}function jm(e,r){var t=r||{};var a=Op(e,t);return Xm(a,t)}function Km(e,r,t){if(!t)t="";var a=t+e;switch(r.type){case"base64":return g.encode(Ze(a));case"binary":return Ze(a);case"string":return e;case"file":return G(r.file,a,"utf8");case"buffer":{if(w)return k(a,"utf8");else return Km(a,{type:"binary"}).split("").map(function(e){return e.charCodeAt(0)})};}throw new Error("Unrecognized type "+r.type)}function $m(e,r){switch(r.type){case"base64":return g.encode(e);case"binary":return e;case"string":return e;case"file":return G(r.file,e,"binary");case"buffer":{if(w)return k(e,"binary");else return e.split("").map(function(e){return e.charCodeAt(0)})};}throw new Error("Unrecognized type "+r.type)}function Ym(e,r){switch(r.type){case"string":;case"base64":;case"binary":var t="";for(var a=0;a0)n=0;var u=ot(o.s.r);var h=[];var d=[];var v=0,p=0;var m=Array.isArray(e);var b=o.s.r,g=0,w=0;if(m&&!e[b])e[b]=[];for(g=o.s.c;g<=o.e.c;++g){h[g]=ht(g);t=m?e[b][g]:e[h[g]+u];switch(a){case 1:i[g]=g-o.s.c;break;case 2:i[g]=h[g];break;case 3:i[g]=l.header[g-o.s.c];break;default:if(t==null)t={w:"__EMPTY",t:"s"};f=s=St(t,null,l);p=0;for(w=0;w=0)c='"'+c.replace(tb,'""')+'"'}else c="";l.push(c)}if(f.blankrows===false&&o)return null;return l.join(s)}function nb(e,r){var t=[];var a=r==null?{}:r;if(e==null||e["!ref"]==null)return"";var n=kt(e["!ref"]);var i=a.FS!==undefined?a.FS:",",s=i.charCodeAt(0);var f=a.RS!==undefined?a.RS:"\n",o=f.charCodeAt(0);var l=new RegExp((i=="|"?"\\|":i)+"+$");var c="",u=[];a.dense=Array.isArray(e);var h=a.skipHidden&&e["!cols"]||[];var d=a.skipHidden&&e["!rows"]||[];for(var v=n.s.c;v<=n.e.c;++v)if(!(h[v]||{}).hidden)u[v]=ht(v);for(var p=n.s.r;p<=n.e.r;++p){if((d[p]||{}).hidden)continue;c=ab(e,n,p,u,s,o,i,a);if(c==null){continue}if(a.strip)c=c.replace(l,"");t.push(c+f)}delete a.dense;return t.join("")}function ib(e,r){if(!r)r={};r.FS="\t";r.RS="\n";var t=nb(e,r);if(typeof cptable=="undefined"||r.type=="string")return t;var a=cptable.utils.encode(1200,t,"str");return String.fromCharCode(255)+String.fromCharCode(254)+a}function sb(e){var r="",t,a="";if(e==null||e["!ref"]==null)return[];var n=kt(e["!ref"]),i="",s=[],f;var o=[];var l=Array.isArray(e);for(f=n.s.c;f<=n.e.c;++f)s[f]=ht(f);for(var c=n.s.r;c<=n.e.r;++c){i=ot(c);for(f=n.s.c;f<=n.e.c;++f){r=s[f]+i;t=l?(e[c]||[])[f]:e[r];a="";if(t===undefined)continue;else if(t.F!=null){r=t.F;if(!t.f)continue;a=t.f;if(r.indexOf(":")==-1)r=r+":"+r}if(t.f!=null)a=t.f;else if(t.t=="z")continue;else if(t.t=="n"&&t.v!=null)a=""+t.v;else if(t.t=="b")a=t.v?"TRUE":"FALSE";else if(t.w!==undefined)a="'"+t.w;else if(t.v===undefined)continue;else if(t.t=="s")a="'"+t.v;else a=""+t.v;o[o.length]=r+"="+a}}return o}function fb(e,r,t){var a=t||{};var n=+!a.skipHeader;var i=e||{};var s=0,f=0;if(i&&a.origin!=null){if(typeof a.origin=="number")s=a.origin;else{var o=typeof a.origin=="string"?mt(a.origin):a.origin;s=o.r;f=o.c}}var l;var c={s:{c:0,r:0},e:{c:f,r:s+r.length-1+n}};if(i["!ref"]){var u=kt(i["!ref"]);c.e.c=Math.max(c.e.c,u.e.c);c.e.r=Math.max(c.e.r,u.e.r);if(s==-1){s=u.e.r+1;c.e.r=s+r.length-1+n}}else{if(s==-1){s=0;c.e.r=r.length-1+n}}var h=a.header||[],d=0;r.forEach(function(e,r){K(e).forEach(function(t){if((d=h.indexOf(t))==-1)h[d=h.length]=t;var o=e[t];var c="z";var u="";var v=bt({c:f+d,r:s+r+n});l=lb.sheet_get_cell(i,v);if(o&&typeof o==="object"&&!(o instanceof Date)){i[v]=o}else{if(typeof o=="number")c="n";else if(typeof o=="boolean")c="b";else if(typeof o=="string")c="s";else if(o instanceof Date){c="d";if(!a.cellDates){c="n";o=ee(o)}u=a.dateNF||D._table[14]}if(!l)i[v]=l={t:c,v:o};else{l.t=c;l.v=o;delete l.w;delete l.R;if(u)l.z=u}if(u)l.z=u}})});c.e.c=Math.max(c.e.c,f+h.length-1);var v=ot(s);if(n)for(d=0;d=0&&e.SheetNames.length>r)return r;throw new Error("Cannot find sheet # "+r)}else if(typeof r=="string"){var t=e.SheetNames.indexOf(r);if(t>-1)return t;throw new Error("Cannot find sheet name |"+r+"|")}else throw new Error("Cannot find sheet |"+r+"|")}e.book_new=function(){return{SheetNames:[],Sheets:{}}};e.book_append_sheet=function(e,r,t){if(!t)for(var a=1;a<=65535;++a,t=undefined)if(e.SheetNames.indexOf(t="Sheet"+a)==-1)break;if(!t||e.SheetNames.length>=65535)throw new Error("Too many worksheets");vv(t);if(e.SheetNames.indexOf(t)>=0)throw new Error("Worksheet with name |"+t+"| already exists!");e.SheetNames.push(t);e.Sheets[t]=r};e.book_set_sheet_visibility=function(e,r,a){t(e,"Workbook",{});t(e.Workbook,"Sheets",[]);var i=n(e,r);t(e.Workbook.Sheets,i,{});switch(a){case 0:;case 1:;case 2:break;default:throw new Error("Bad sheet visibility setting "+a);}e.Workbook.Sheets[i].Hidden=a};r([["SHEET_VISIBLE",0],["SHEET_HIDDEN",1],["SHEET_VERY_HIDDEN",2]]);e.cell_set_number_format=function(e,r){e.z=r;return e};e.cell_set_hyperlink=function(e,r,t){if(!r){delete e.l}else{e.l={Target:r};if(t)e.l.Tooltip=t}return e};e.cell_set_internal_link=function(r,t,a){return e.cell_set_hyperlink(r,"#"+t,a)};e.cell_add_comment=function(e,r,t){if(!e.c)e.c=[];e.c.push({t:r,a:t||"SheetJS"})};e.sheet_set_array_formula=function(e,r,t){var n=typeof r!="string"?r:kt(r);var i=typeof r=="string"?r:wt(r);for(var s=n.s.r;s<=n.e.r;++s)for(var f=n.s.c;f<=n.e.c;++f){var o=a(e,s,f);o.t="n";o.F=i;delete o.v;if(s==n.s.r&&f==n.s.c)o.f=t}return e};return e})(lb);if(w&&typeof require!="undefined")(function(){var r={}.Readable;var t=function(e,t){var a=r();var n=t==null?{}:t;if(e==null||e["!ref"]==null){a.push(null);return a}var i=kt(e["!ref"]);var s=n.FS!==undefined?n.FS:",",f=s.charCodeAt(0);var o=n.RS!==undefined?n.RS:"\n",l=o.charCodeAt(0);var c=new RegExp((s=="|"?"\\|":s)+"+$");var u="",h=[];n.dense=Array.isArray(e);var d=n.skipHidden&&e["!cols"]||[];var v=n.skipHidden&&e["!rows"]||[];for(var p=i.s.c;p<=i.e.c;++p)if(!(d[p]||{}).hidden)h[p]=ht(p);var m=i.s.r;var b=false;a._read=function(){if(!b){b=true;return a.push("\ufeff")}while(m<=i.e.r){++m;if((v[m-1]||{}).hidden)continue;u=ab(e,i,m-1,h,f,l,s,n);if(u!=null){if(n.strip)u=u.replace(c,"");a.push(u+o);break}}if(m>i.e.r)return a.push(null)};return a};var a=function(e,t){var a=r();var n=t||{};var i=n.header!=null?n.header:rm.BEGIN;var s=n.footer!=null?n.footer:rm.END;a.push(i);var f=gt(e["!ref"]);n.dense=Array.isArray(e);a.push(rm._preamble(e,f,n));var o=f.s.r;var l=false;a._read=function(){if(o>f.e.r){if(!l){l=true;a.push(""+s)}return a.push(null)}while(o<=f.e.r){a.push(rm._row(e,f,o,n));++o;break}};return a};var n=function(e,t){var a=r({objectMode:true});if(e==null||e["!ref"]==null){a.push(null);return a}var n={t:"n",v:0},i=0,s=1,f=[],o=0,l="";var c={s:{r:0,c:0},e:{r:0,c:0}};var u=t||{};var h=u.range!=null?u.range:e["!ref"];if(u.header===1)i=1;else if(u.header==="A")i=2;else if(Array.isArray(u.header))i=3;switch(typeof h){case"string":c=kt(h);break;case"number":c=kt(e["!ref"]);c.s.r=h;break;default:c=h;}if(i>0)s=0;var d=ot(c.s.r);var v=[];var p=0;var m=Array.isArray(e);var b=c.s.r,g=0,w=0;if(m&&!e[b])e[b]=[];for(g=c.s.c;g<=c.e.c;++g){v[g]=ht(g);n=m?e[b][g]:e[v[g]+d];switch(i){case 1:f[g]=g-c.s.c;break;case 2:f[g]=v[g];break;case 3:f[g]=u.header[g-c.s.c];break;default:if(n==null)n={w:"__EMPTY",t:"s"};l=o=St(n,null,u);p=0;for(w=0;wc.e.r)return a.push(null);while(b<=c.e.r){var r=eb(e,c,b,v,i,f,m,u);++b;if(r.isempty===false||(i===1?u.blankrows!==false:!!u.blankrows)){a.push(r.row);break}}};return a};e.stream={to_json:n,to_html:a,to_csv:t}})();if(typeof Rp!=="undefined")e.parse_xlscfb=Rp;e.parse_zip=Rm;e.read=Wm;e.readFile=Vm;e.readFileSync=Vm;e.write=Zm;e.writeFile=Qm;e.writeFileSync=Qm;e.writeFileAsync=qm;e.utils=lb;e.SSF=D;if(typeof W!=="undefined")e.CFB=W}if(typeof exports!=="undefined")make_xlsx_lib(exports);else if(typeof module!=="undefined"&&module.exports)make_xlsx_lib(module.exports);else if(typeof define==="function"&&define.amd)define(function(){if(!XLSX.version)make_xlsx_lib(XLSX);return XLSX});else make_xlsx_lib(XLSX);var XLS=XLSX,ODS=XLSX; diff --git a/public/static/plugs/layui/css/layui.css b/public/static/plugs/layui/css/layui.css deleted file mode 100644 index 176ff6d51..000000000 --- a/public/static/plugs/layui/css/layui.css +++ /dev/null @@ -1 +0,0 @@ -blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none;vertical-align:middle}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3{font-weight:400}h4,h5,h6{font-size:100%;font-weight:400}button,input,select,textarea{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:#333;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:0;line-height:0;margin:10px 0;padding:0;border:none!important;border-bottom:1px solid #eee!important;clear:both;overflow:hidden;background:0 0}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.layui-edge{position:relative;display:inline-block;vertical-align:middle;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-eye:before{content:"\e695"}.layui-icon-eye-invisible:before{content:"\e696"}.layui-icon-backspace:before{content:"\e694"}.layui-icon-help-circle:before{content:"\e77c"}.layui-icon-tips-fill:before{content:"\eb2e"}.layui-icon-test:before{content:"\e692"}.layui-icon-clear:before{content:"\e788"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-light:before{content:"\e748"}.layui-icon-music:before{content:"\e690"}.layui-icon-time:before{content:"\e68d"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-at:before{content:"\e687"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-key:before{content:"\e683"}.layui-icon-android:before{content:"\e684"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-mute:before{content:"\e685"}.layui-icon-gift:before{content:"\e627"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-ios:before{content:"\e680"}.layui-icon-logout:before{content:"\e682"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-rss:before{content:"\e808"}.layui-icon-email:before{content:"\e618"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-service:before{content:"\e626"}.layui-icon-addition:before{content:"\e624"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-slider:before{content:"\e714"}.layui-icon-print:before{content:"\e66d"}.layui-icon-export:before{content:"\e67d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-username:before{content:"\e66f"}.layui-icon-password:before{content:"\e673"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-auz:before{content:"\e672"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-tips:before{content:"\e702"}.layui-icon-note:before{content:"\e66e"}.layui-icon-senior:before{content:"\e674"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-notice:before{content:"\e667"}.layui-icon-console:before{content:"\e665"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-set:before{content:"\e716"}.layui-icon-template:before{content:"\e663"}.layui-icon-app:before{content:"\e653"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-home:before{content:"\e68e"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-more:before{content:"\e65f"}.layui-icon-camera:before{content:"\e660"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-read:before{content:"\e705"}.layui-icon-location:before{content:"\e715"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-return:before{content:"\e65c"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-fire:before{content:"\e756"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-cart:before{content:"\e657"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-next:before{content:"\e65b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-user:before{content:"\e770"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-component:before{content:"\e857"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-pause:before{content:"\e651"}.layui-icon-play:before{content:"\e652"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-voice:before{content:"\e688"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-link:before{content:"\e64c"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-share:before{content:"\e641"}.layui-icon-edit:before{content:"\e642"}.layui-icon-delete:before{content:"\e640"}.layui-icon-engine:before{content:"\e628"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-table:before{content:"\e62d"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-date:before{content:"\e637"}.layui-icon-layer:before{content:"\e638"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-file:before{content:"\e621"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-404:before{content:"\e61c"}.layui-icon-about:before{content:"\e60b"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-down:before{content:"\e61a"}.layui-icon-up:before{content:"\e619"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-search:before{content:"\e615"}.layui-icon-friends:before{content:"\e612"}.layui-icon-group:before{content:"\e613"}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-log:before{content:"\e60e"}.layui-icon-list:before{content:"\e60a"}.layui-icon-release:before{content:"\e609"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-ok:before{content:"\e605"}.layui-icon-help:before{content:"\e607"}.layui-icon-chat:before{content:"\e606"}.layui-icon-top:before{content:"\e604"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-star:before{content:"\e600"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-ok-circle:before{content:"\1005"}.layui-main{position:relative;width:1160px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;z-index:900;width:auto;box-sizing:border-box}.layui-layout-body{overflow-x:hidden}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23262e}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#fafafa}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:767.98px){.layui-container{padding:0 15px}.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:720px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:960px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1150px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}@media screen and (min-width:1400px){.layui-container{width:1330px}.layui-hide-xl{display:none!important}.layui-show-xl-block{display:block!important}.layui-show-xl-inline{display:inline!important}.layui-show-xl-inline-block{display:inline-block!important}.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9{float:left}.layui-col-xl1{width:8.33333333%}.layui-col-xl2{width:16.66666667%}.layui-col-xl3{width:25%}.layui-col-xl4{width:33.33333333%}.layui-col-xl5{width:41.66666667%}.layui-col-xl6{width:50%}.layui-col-xl7{width:58.33333333%}.layui-col-xl8{width:66.66666667%}.layui-col-xl9{width:75%}.layui-col-xl10{width:83.33333333%}.layui-col-xl11{width:91.66666667%}.layui-col-xl12{width:100%}.layui-col-xl-offset1{margin-left:8.33333333%}.layui-col-xl-offset2{margin-left:16.66666667%}.layui-col-xl-offset3{margin-left:25%}.layui-col-xl-offset4{margin-left:33.33333333%}.layui-col-xl-offset5{margin-left:41.66666667%}.layui-col-xl-offset6{margin-left:50%}.layui-col-xl-offset7{margin-left:58.33333333%}.layui-col-xl-offset8{margin-left:66.66666667%}.layui-col-xl-offset9{margin-left:75%}.layui-col-xl-offset10{margin-left:83.33333333%}.layui-col-xl-offset11{margin-left:91.66666667%}.layui-col-xl-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.6;border-left:5px solid #5fb878;border-radius:0 2px 2px 0;background-color:#fafafa}.layui-quote-nm{border-style:solid;border-width:1px;border-left-width:5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:0;border-top-width:1px}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5fb878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#5f5f5f}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#fafafa;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#5f5f5f}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{position:relative;border-width:1px;border-style:solid;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);background-color:#fff;color:#5f5f5f}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-bg-red{background-color:#ff5722!important;color:#fff!important}.layui-bg-orange{background-color:#ffb800!important;color:#fff!important}.layui-bg-green{background-color:#009688!important;color:#fff!important}.layui-bg-cyan{background-color:#2f4056!important;color:#fff!important}.layui-bg-blue{background-color:#1e9fff!important;color:#fff!important}.layui-bg-black{background-color:#393d49!important;color:#fff!important}.layui-bg-gray{background-color:#fafafa!important;color:#5f5f5f!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-input-split,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{border-width:1px;border-style:solid;color:#5f5f5f!important}.layui-border-red{border-width:1px;border-style:solid;border-color:#ff5722!important;color:#ff5722!important}.layui-border-orange{border-width:1px;border-style:solid;border-color:#ffb800!important;color:#ffb800!important}.layui-border-green{border-width:1px;border-style:solid;border-color:#009688!important;color:#009688!important}.layui-border-cyan{border-width:1px;border-style:solid;border-color:#2f4056!important;color:#2f4056!important}.layui-border-blue{border-width:1px;border-style:solid;border-color:#1e9fff!important;color:#1e9fff!important}.layui-border-black{border-width:1px;border-style:solid;border-color:#393d49!important;color:#393d49!important}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.6;font-size:14px;color:#5f5f5f}.layui-text h1,.layui-text h2,.layui-text h3,.layui-text h4,.layui-text h5,.layui-text h6{font-weight:500;color:#333}.layui-text h1{font-size:32px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text h4{font-size:16px}.layui-text h5{font-size:14px}.layui-text h6{font-size:13px}.layui-text a:not(.layui-btn){color:#01aaed}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ol,.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text ol li{margin-top:5px;list-style-type:decimal}.layui-text em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:15px 0}.layui-text p:first-child{margin-top:0}.layui-text p:last-child{margin-bottom:0}.layui-text blockquote:not(.layui-elem-quote){padding:5px 15px;border-left:5px solid #eee}.layui-text pre:not(.layui-code){padding:15px;font-family:Lucida Console,Consolas,Courier New;background-color:#fafafa}.layui-font-12{font-size:12px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-red{color:#ff5722!important}.layui-font-orange{color:#ffb800!important}.layui-font-green{color:#009688!important}.layui-font-cyan{color:#2f4056!important}.layui-font-blue{color:#01aaed!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{display:inline-block;vertical-align:middle;height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\0;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#5f5f5f}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1e9fff}.layui-btn-warm{background-color:#ffb800}.layui-btn-danger{background-color:#ff5722}.layui-btn-checked{background-color:#5fb878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#eee!important}.layui-input:focus,.layui-textarea:focus{border-color:#d2d2d2!important}.layui-textarea{position:relative;min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{position:relative;float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{position:relative;float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#ff5722!important}.layui-input-wrap{position:relative;height:38px;line-height:38px}.layui-input-wrap .layui-input{padding-right:35px}.layui-input-wrap .layui-input::-ms-clear,.layui-input-wrap .layui-input::-ms-reveal{display:none}.layui-input-wrap-prefix .layui-input{padding-left:35px}.layui-input-prefix,.layui-input-split,.layui-input-suffix{position:absolute;right:0;top:0;padding:0 10px;width:35px;height:100%;text-align:center;transition:all .3s;cursor:pointer;pointer-events:none;box-sizing:border-box}.layui-input-prefix{left:0;border-radius:2px 0 0 2px}.layui-input-suffix{right:0;border-radius:0 2px 2px 0}.layui-input-wrap .layui-input:focus+.layui-input-split{border-color:#d2d2d2}.layui-input-prefix .layui-icon,.layui-input-split .layui-icon,.layui-input-suffix .layui-icon{position:relative;font-size:16px;color:#5f5f5f;transition:all .3s}.layui-input-wrap .layui-input-prefix.layui-input-split{border-width:0;border-right-width:1px}.layui-input-wrap-prefix .layui-form-select{position:static}.layui-input-affix-event .layui-icon{color:rgba(0,0,0,.8)}.layui-input-affix-event .layui-icon-clear{color:rgba(0,0,0,.3)}.layui-input-affix-event .layui-icon:hover{color:rgba(0,0,0,.6)}.layui-input-split{border-width:1px;border-style:solid}.layui-input-affix-event{pointer-events:auto}.layui-input-group{position:relative;display:inline-table}.layui-input-group>*{display:table-cell;vertical-align:middle;position:relative}.layui-input-group .layui-input{padding-right:15px}.layui-input-group .layui-input-prefix{width:auto;border-right:0}.layui-input-group .layui-input-suffix{width:auto;border-left:0}.layui-form-select{position:relative;color:#5f5f5f}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f6f6f6;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#f7f7f7;color:#5fb878;font-weight:700}.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.layui-form-selected .layui-edge{margin-top:-3px\0}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox *{display:inline-block;vertical-align:middle}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5fb878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5fb878}.layui-form-checked i,.layui-form-checked:hover i{color:#5fb878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#5f5f5f}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5fb878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5fb878!important;background-color:#5fb878;color:#fff}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2!important}.layui-form-checked.layui-checkbox-disabled[lay-skin=primary] i{background:#eee!important;border-color:#eee!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;display:inline-block;vertical-align:middle;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5fb878;background-color:#5fb878}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disabled{border-color:#eee!important}.layui-checkbox-disabled span{background-color:#eee!important}.layui-checkbox-disabled i{border-color:#eee!important}.layui-checkbox-disabled em{color:#d2d2d2!important}.layui-checkbox-disabled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio{display:inline-block;vertical-align:middle;line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{display:inline-block;vertical-align:middle;font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover *,.layui-form-radioed,.layui-form-radioed>i{color:#5fb878}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled *{color:#c2c2c2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#fafafa;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0;border-right-width:1px}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px;clear:both}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;margin:10px 0;background-color:#fff;color:#5f5f5f}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr{background-color:#fafafa}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0;border-bottom-width:1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0;border-right-width:1px}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding-top:15px;padding-right:30px;padding-bottom:15px;padding-left:30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:50px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;font-size:12px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:30px;line-height:20px;padding-top:5px;padding-left:11px;padding-right:11px}.layui-table[lay-data],.layui-table[lay-options]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view{margin:10px 0}.layui-table-view .layui-table{position:relative;width:auto;margin:0;border:0;border-collapse:separate}.layui-table-view .layui-table[lay-skin=line]{border-width:0;border-right-width:1px}.layui-table-view .layui-table[lay-skin=row]{border-width:0;border-bottom-width:1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:199}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0;border-bottom-width:1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-column{position:relative;width:100%;min-height:41px;padding:8px 16px;border-width:0;border-bottom-width:1px}.layui-table-column .layui-btn-container{margin-bottom:-8px}.layui-table-column .layui-btn-container .layui-btn{margin-right:8px;margin-bottom:8px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;z-index:399;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-tool-panel li{padding:0 10px;line-height:30px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%}.layui-table-tool-panel li:hover{background-color:#f6f6f6}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{padding-left:28px}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0;border-left-width:1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#5f5f5f}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#5f5f5f}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:38px;line-height:28px;padding:6px 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01aaed}.layui-table-cell .layui-btn{vertical-align:inherit}.layui-table-cell[align=center]{-webkit-box-pack:center}.layui-table-cell[align=right]{-webkit-box-pack:end}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{text-align:center;-webkit-box-pack:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-body .layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0;border-left-width:1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0;border-bottom-width:1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-total{margin-bottom:-1px;border-width:0;border-top-width:1px;overflow:hidden}.layui-table-page{border-width:0;border-top-width:1px;margin-bottom:-1px;white-space:nowrap;overflow:hidden}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-11px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-pagebar{float:right;line-height:23px}.layui-table-pagebar .layui-btn-sm{margin-top:-1px}.layui-table-pagebar .layui-btn-xs{margin-top:2px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;z-index:189;min-width:100%;min-height:100%;padding:5px 14px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15);background-color:#fff}.layui-table-edit:focus{border-color:#5fb878!important}input.layui-input.layui-table-edit{height:100%}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0;border-left-width:1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-49px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#5f5f5f}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#5f5f5f;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-list{margin:10px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;display:inline-block;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-form{display:inline-block}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;display:inline-block;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff;box-sizing:border-box}.layui-menu *{box-sizing:border-box}.layui-menu li,.layui-menu-body-title a{padding:5px 15px}.layui-menu li{position:relative;margin:1px 0;width:calc(100% + 1px);line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer;transition:all .3s}.layui-menu li:hover{background-color:#f6f6f6}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group .layui-menu-body-title,.layui-menu-item-parent .layui-menu-body-title{padding-right:25px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default}.layui-menu .layui-menu-item-none{text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:#000}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#f6f6f6!important;color:#5fb878}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#5fb878}.layui-menu .layui-menu-item-checked:after{position:absolute;right:0;top:0;bottom:0;border-right:3px solid #5fb878;content:""}.layui-menu-body-title{position:relative;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title a:hover{transition:all .3s}.layui-menu-body-title>.layui-icon{position:absolute;right:0;top:0;font-size:14px}.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-menu-body-title>.layui-icon-right{right:-1px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px 0}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#5fb878}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px 0}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:77777777;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-dropdown-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px");position:fixed;_position:absolute;pointer-events:auto}.layui-nav{position:relative;padding:0 20px;background-color:#393d49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:5px;background-color:#5fb878;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap;box-sizing:border-box}.layui-nav .layui-nav-child a{color:#5f5f5f;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#f6f6f6;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#f6f6f6;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-bar{background-color:#009688}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child{display:block;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-nav-tree.layui-bg-gray a,.layui-nav.layui-bg-gray .layui-nav-item a{color:rgba(0,0,0,.8)}.layui-nav-tree.layui-bg-gray{padding:6px 0}.layui-nav-tree.layui-bg-gray .layui-nav-itemed>a{color:#000!important}.layui-nav.layui-bg-gray .layui-this a{color:#5fb878}.layui-nav-tree.layui-bg-gray .layui-nav-itemed>.layui-nav-child{padding-left:11px;background:0 0!important}.layui-nav-tree.layui-bg-gray .layui-nav-item>a{padding-top:0;padding-bottom:0}.layui-nav-tree.layui-bg-gray .layui-nav-item>a .layui-nav-more{padding:0}.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this,.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this a,.layui-nav-tree.layui-bg-gray .layui-this,.layui-nav-tree.layui-bg-gray .layui-this>a{background:0 0!important;color:#5fb878!important;font-weight:700}.layui-nav-tree.layui-bg-gray .layui-nav-bar{background-color:#5fb878}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5fb878!important}.layui-breadcrumb a cite{color:#5f5f5f;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#ff5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5fb878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#fafafa}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5fb878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5fb878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#ff5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#ff5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#5f5f5f}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\0;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:none 0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\0;opacity:1;left:20px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9f9f9f;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#5f5f5f;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #d9d9d9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#fafafa;color:#333;font-family:Courier New;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;display:inline-block;vertical-align:middle;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#5f5f5f}.layui-transfer-active{margin:0 15px;display:inline-block;vertical-align:middle}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5fb878;border-color:#5fb878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#fbfbfb;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#f6f6f6;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#ffb800}.layui-rate li i.layui-icon{margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:38px;height:38px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:44px;height:44px;line-height:30px}.layui-colorpicker.layui-colorpicker-sm{width:30px;height:30px;line-height:20px;padding:3px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:16px;padding:1px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#fff;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:77777777;width:280px;margin:5px 0;padding:7px;background:#fff;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #fff;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#5f5f5f}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#fff;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:77777777;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#fff;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{display:inline-block;vertical-align:middle;cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{display:inline-block;vertical-align:middle;position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#5f5f5f}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-spread>.layui-tree-entry .layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#5f5f5f}.layui-tree-btnGroup{visibility:hidden;display:inline-block;vertical-align:middle;position:relative}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{position:relative;display:inline-block;vertical-align:middle;height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-view{display:block;position:relative;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#fafafa;color:#333;font-family:Courier New;font-size:13px}.layui-code-title{position:relative;padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee;font-size:12px}.layui-code-title>.layui-code-about{position:absolute;right:10px;top:0;color:#b7b7b7}.layui-code-about>a{padding-left:10px}.layui-code-view>.layui-code-ol,.layui-code-view>.layui-code-ul{position:relative;overflow:auto}.layui-code-view>.layui-code-ol>li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view>.layui-code-ol>li:first-child,.layui-code-view>.layui-code-ul>li:first-child{padding-top:10px}.layui-code-view>.layui-code-ol>li:last-child,.layui-code-view>.layui-code-ul>li:last-child{padding-bottom:10px}.layui-code-view>.layui-code-ul>li{position:relative;line-height:20px;padding:0 10px;list-style-type:none;*list-style-type:none;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-dark{border:1px solid #0c0c0c;border-left-color:#3f3f3f;background-color:#0c0c0c;color:#c2be9e}.layui-code-dark>.layui-code-title{border-bottom:none}.layui-code-dark>.layui-code-ol>li,.layui-code-dark>.layui-code-ul>li{background-color:#3f3f3f;border-left:none}.layui-code-dark>.layui-code-ul>li{margin-left:6px}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}.layui-laydate-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px");position:fixed;_position:absolute;pointer-events:auto}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:0;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=work]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#5fb878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-shortcut{width:80px;display:inline-block;vertical-align:top;overflow:auto;max-height:276px}.layui-laydate-shortcut+.layui-laydate-main{display:inline-block;border-left:1px solid #e2e2e2}.layui-laydate-shortcut>li{padding:6px;cursor:pointer;line-height:18px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle;width:50%}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5fb878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#b5fff8}.laydate-selected:hover{background-color:#00f7de!important}.layui-laydate-content td>div:hover,.layui-laydate-list li:hover,.layui-laydate-shortcut>li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#5fb878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5fb878}.layui-laydate .layui-this,.layui-laydate .layui-this>div{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content td>div{padding:7px 0;height:100%}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}.laydate-theme-grid .layui-laydate-content td>div{height:29px;margin-top:-1px}.laydate-theme-circle .layui-laydate-content td.layui-this>div,.laydate-theme-circle .layui-laydate-content td>div{width:28px;height:28px;line-height:28px;border-radius:14px;margin:0 4px;padding:0}.layui-laydate.laydate-theme-circle .layui-laydate-content table td.layui-this{background-color:transparent!important}.laydate-theme-grid.laydate-theme-circle .layui-laydate-content td>div{margin:0 3.5px}.laydate-theme-fullpanel .layui-laydate-main{width:526px}.laydate-theme-fullpanel .layui-laydate-list{width:252px;left:272px}.laydate-theme-fullpanel .laydate-set-ym span{display:none}.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-theme-fullpanel .laydate-time-show .layui-laydate-header .layui-icon{display:inline-block!important}.laydate-theme-fullpanel .laydate-btns-time{display:none}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-btn a,.layui-layer-setwin span{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:16px;font-size:0;line-height:initial}.layui-layer-setwin span{position:relative;width:16px;height:16px;line-height:18px;margin-left:10px;text-align:center;font-size:16px;cursor:pointer;color:#000;_overflow:hidden}.layui-layer-setwin .layui-layer-min:before{content:'';position:absolute;width:12px;height:1px;left:50%;top:50%;margin:-.5px 0 0 -6px;background-color:#2e2d3c;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max:after,.layui-layer-setwin .layui-layer-max:before{content:'';position:absolute;left:50%;top:50%;z-index:1;width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid #2e2d3c}.layui-layer-setwin .layui-layer-max:hover:after,.layui-layer-setwin .layui-layer-max:hover:before{border-color:#2d93ca}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-maxmin:after,.layui-layer-setwin .layui-layer-maxmin:before{width:7px;height:7px;margin:-3px 0 0 -3px;background-color:#fff}.layui-layer-setwin .layui-layer-maxmin:after{z-index:0;margin:-5px 0 0 -1px}.layui-layer-setwin .layui-layer-close{cursor:pointer}.layui-layer-setwin .layui-layer-close:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;color:#fff;background-color:#787878;padding:3px;border:3px solid;width:18px;height:18px;font-size:18px;font-weight:bolder;border-radius:50%;margin-left:0;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{opacity:unset;background-color:#3888f6}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1e9fff;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-face{position:absolute;top:18px;left:16px;color:#959595;font-size:24px;_left:-40px}.layui-layer-dialog .layui-layer-content .layui-icon-tips{color:#f39b12}.layui-layer-dialog .layui-layer-content .layui-icon-ok{color:#5fb878}.layui-layer-dialog .layui-layer-content .layui-icon-close-fill{color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-password{color:#787878}.layui-layer-dialog .layui-layer-content .layui-icon-face-cry{color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-face-smile{color:#5fb878}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-close{color:#fff}.layui-layer-hui .layui-layer-content{padding:11px 24px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:18px 24px 18px 52px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:76px;height:38px;line-height:38px;text-align:center}.layui-layer-loading-icon{font-size:38px;color:#959595}.layui-layer-loading2{text-align:center}.layui-layer-loading-2{position:relative;height:38px}.layui-layer-loading-2:after,.layui-layer-loading-2:before{content:'';position:absolute;left:50%;top:50%;width:38px;height:38px;margin:-19px 0 0 -19px;border-radius:50%;border:3px solid #d2d2d2;box-sizing:border-box}.layui-layer-loading-2:after{border-color:transparent;border-left-color:#1e9fff}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:52px;height:52px;line-height:52px;margin-top:-26px;cursor:pointer;font-size:52px;color:#717171}.layui-layer-imgprev{left:32px}.layui-layer-imgnext{right:32px}.layui-layer-imgnext:hover,.layui-layer-imgprev:hover{color:#959595}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;padding:0 5px;font-size:12px;color:#fff}.layui-layer-imgtit h3{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-weight:300}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/public/static/plugs/layui/font/iconfont.eot b/public/static/plugs/layui/font/iconfont.eot deleted file mode 100644 index 0859a67a5a60042fe49a8e7e65f7ed35e6098fc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51676 zcmd?Sd3+;BnLk|Bt?rguQcJDYeOb3`%a(1)l6+epUvqd)kLNx-nKQ}cn#nmNnMugW z5pn<_2??`6IFb+uIS3G75{~5xn`N`GSs;XL&}26Ygk{-fVche6tJ|J~gwOu=-S_?D z{k$VT)z#Hi)!kK3J$Lo|^gD#K0Vv@J`^OQ1H!>)>owD52D)anwY82!2jYq$NmVf@w zOZJl;fcz5;?3VTqxcI9+OX-{+oYS8!Ke0JvrJ1)NauH7;rmhThd7~8x5 zsy*7^KW7N>+(5`9-`KZ%$F9^9H#~y6uK=q1P+)TjKS%xszVhfB+g$^{Cw7Z*@#m$Z z>sf{!(e_%Q%)b+-*7<3}BjD_5{$(=7Y8j<6!JCtl#<_W2#^4SSZfs&|Em8LGxb#92 zCT92M^)vHy|G9g2pnvlUMLl+vqJ$E0zSLsj>Fq?o?QZ2T!sLDCk-kAn6fIBV60V)~ zZ`GdhUF4Wsc%x{H2jPE8u15v-4yXTd?1ukiKp+33HUs~|`u~$>O8;;BK6&!(-{quk zA%E%G|Ms5q?QL(@|Nm*(d>?O_i<5Jfv&!DCzyHPapVc?|$+L0#U-b89ZG}(&Ki3y~ zF8ssV0VM+o2B3&PYOVq9UXO{*pa*WD zK^pI$Z~a)~n`gE5{&%hM6#w`BQ9ON}?xOqVf9KKtXZ3IMLtbFL2~3l@-gyp@>k@eBugBZyGxej#a9pn=7PI3dek=#UXCby7V$-BtA$$Q9q$!+9)ZG3xlM2RUh*ZfS$&g;Kzg=V#=_V!82S(TdYTX7F z+DZy!JIRt136c<*1&fVHFn0gD0fmo%{E832<>1M8jvaGEsG zKLcPlX`pWgz;n_-{|tcfqyf�Ju*YHWRQ4NCR|&0oDU)*iFF7APu|)1FR9!aGHSC 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 - - - Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/static/plugs/layui/font/iconfont.ttf b/public/static/plugs/layui/font/iconfont.ttf deleted file mode 100644 index 35cfa0bad40a3c581aff22f324b2e60d3f1bd0d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51500 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 diff --git a/public/static/plugs/layui/font/iconfont.woff2 b/public/static/plugs/layui/font/iconfont.woff2 deleted file mode 100644 index 8265e3ae258b8f5493ec1daf0965350fd8bf7501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28500 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 z 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.timeout/4?g(u+" is not a valid module","error"):void(m.status[u]?c():setTimeout(n,4))}())}function c(){e.push(layui[u]),11e3*m.timeout/4?g(u+" is not a valid module","error"):void("string"==typeof m.modules[u]&&m.status[u]?c():setTimeout(f,4))}():((p=h.createElement("script"))["async"]=!0,p.charset="utf-8",p.src=y+((i=!0===m.version?m.v||(new Date).getTime():m.version||"")?"?v="+i:""),a.appendChild(p),!p.attachEvent||p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code")<0||b?p.addEventListener("load",function(t){s(t,y)},!1):p.attachEvent("onreadystatechange",function(t){s(t,y)}),m.modules[u]=y),o},n.prototype.disuse=function(t){var r=this;return t=r.isArray(t)?t:[t],r.each(t,function(t,e){m.status[e],delete r[e],delete N[e],delete r.modules[e],delete m.status[e],delete m.modules[e]}),r},n.prototype.getStyle=function(t,e){t=t.currentStyle||d.getComputedStyle(t,null);return t[t.getPropertyValue?"getPropertyValue":"getAttribute"](e)},n.prototype.link=function(r,n,t){var o=this,e=h.getElementsByTagName("head")[0],i=h.createElement("link"),t=((t="string"==typeof n?n:t)||r).replace(/\.|\//g,""),a=i.id="layuicss-"+t,u="creating",l=0;return i.rel="stylesheet",i.href=r+(m.debug?"?v="+(new Date).getTime():""),i.media="all",h.getElementById(a)||e.appendChild(i),"function"!=typeof n||function s(t){var e=h.getElementById(a);return++l>1e3*m.timeout/100?g(r+" timeout"):void(1989===parseInt(o.getStyle(e,"width"))?(t===u&&e.removeAttribute("lay-status"),e.getAttribute("lay-status")===u?setTimeout(s,100):n()):(e.setAttribute("lay-status",u),setTimeout(function(){s(u)},100)))}(),o},n.prototype.addcss=function(t,e,r){return layui.link(m.dir+"css/"+t,e,r)},m.callback={},n.prototype.factory=function(t){if(layui[t])return"function"==typeof m.callback[t]?m.callback[t]:null},n.prototype.img=function(t,e,r){var n=new Image;if(n.src=t,n.complete)return e(n);n.onload=function(){n.onload=null,"function"==typeof e&&e(n)},n.onerror=function(t){n.onerror=null,"function"==typeof r&&r(t)}},n.prototype.config=function(t){for(var e in t=t||{})m[e]=t[e];return this},n.prototype.modules=function(){var t,e={};for(t in N)e[t]=N[t];return e}(),n.prototype.extend=function(t){for(var e in t=t||{})this[e]||this.modules[e]?g(e+" Module already exists","error"):this.modules[e]=t[e];return this},n.prototype.router=n.prototype.hash=function(t){var r={path:[],search:{},hash:((t=t||location.hash).match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(t)&&(t=t.replace(/^#\//,""),r.href="/"+t,t=t.replace(/([^#])(#.*$)/,"$1").split("/")||[],this.each(t,function(t,e){/^\w+=/.test(e)?(e=e.split("="),r.search[e[0]]=e[1]):r.path.push(e)})),r},n.prototype.url=function(t){var o,e,r=this;return{pathname:(t?((t.match(/\.[^.]+?\/.+/)||[])[0]||"").replace(/^[^\/]+/,"").replace(/\?.+/,""):location.pathname).replace(/^\//,"").split("/"),search:(o={},e=(t?((t.match(/\?.+/)||[])[0]||"").replace(/\#.+/,""):location.search).replace(/^\?+/,"").split("&"),r.each(e,function(t,e){var r=e.indexOf("="),n=r<0?e.substr(0,e.length):0!==r&&e.substr(0,r);n&&(o[n]=0(l.innerHeight||f.documentElement.clientHeight)},h.position=function(t,e,n){var o,r,i,c,u,a,s;e&&(n=n||{},t!==f&&t!==h("body")[0]||(n.clickType="right"),u="right"===n.clickType?{left:(u=n.e||l.event||{}).clientX,top:u.clientY,right:u.clientX,bottom:u.clientY}:t.getBoundingClientRect(),a=e.offsetWidth,s=e.offsetHeight,o=function(t){return f.body[t=t?"scrollLeft":"scrollTop"]|f.documentElement[t]},i=u.left,c=u.bottom,"center"===n.align?i-=(a-t.offsetWidth)/2:"right"===n.align&&(i=i-a+t.offsetWidth),(i=i+a+5>(r=function(t){return f.documentElement[t?"clientWidth":"clientHeight"]})("width")?r("width")-a-5:i)<5&&(i=5),c+s+5>r()&&(u.top>s+5?c=u.top-s-10:"right"===n.clickType?(c=r()-s-10)<0&&(c=0):c=5),(a=n.position)&&(e.style.position=a),e.style.left=i+("fixed"===a?0:o(1))+"px",e.style.top=c+("fixed"===a?0:o())+"px",h.hasScrollbar()||(s=e.getBoundingClientRect(),!n.SYSTEM_RELOAD&&s.bottom+5>r()&&(n.SYSTEM_RELOAD=!0,setTimeout(function(){h.position(t,e,n)},50))))},h.options=function(t,e){e="object"==typeof e?e:{attr:e};var t=h(t),n=e.attr||"lay-options",t=t.attr(n);try{return new Function("return "+(t||"{}"))()}catch(o){return layui.hint().error(e.errorText||[n+'="'+t+'"',"\n parseerror: "+o].join("\n"),"error"),{}}},h.isTopElem=function(n){var t=[f,h("body")[0]],o=!1;return h.each(t,function(t,e){if(e===n)return o=!0}),o},r.addStr=function(n,t){return n=n.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),h.each(t,function(t,e){new RegExp("\\b"+e+"\\b").test(n)||(n=n+" "+e)}),n.replace(/^\s|\s$/,"")},r.removeStr=function(n,t){return n=n.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),h.each(t,function(t,e){e=new RegExp("\\b"+e+"\\b");e.test(n)&&(n=n.replace(e,""))}),n.replace(/\s+/," ").replace(/^\s|\s$/,"")},r.prototype.find=function(o){var r=this,i=0,c=[],u="object"==typeof o;return this.each(function(t,e){for(var n=u?e.contains(o):e.querySelectorAll(o||null);i]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e},error:function(e,r){var n="Laytpl Error: ";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},l=a.exp,r=function(e){this.tpl=e},n=(r.pt=r.prototype,window.errors=0,r.pt.parse=function(e,r){var n=e,c=l("^"+p.open+"#",""),t=l(p.close+"$","");e='"use strict";var view = "'+(e=e.replace(/\s+|\r|\t|\n/g," ").replace(l(p.open+"#"),p.open+"# ").replace(l(p.close+"}"),"} "+p.close).replace(/\\/g,"\\\\").replace(l(p.open+"!(.+?)!"+p.close),function(e){return e=e.replace(l("^"+p.open+"!"),"").replace(l("!"+p.close),"").replace(l(p.open+"|"+p.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(a.query(),function(e){return'";'+(e=e.replace(c,"").replace(t,"")).replace(/\\(.)/g,"$1")+';view+="'}).replace(a.query(1),function(e){var r='"+laytpl.escape(';return e.replace(/\s/g,"")===p.open+p.close?"":(e=e.replace(l(p.open+"|"+p.close),""),/^=/.test(e)?e=e.replace(/^=/,""):/^-/.test(e)&&(e=e.replace(/^-/,""),r='"+('),r+e.replace(/\\(.)/g,"$1")+')+"')}))+'";return view;';try{return this.cache=e=new Function("d, laytpl",e),e(r,a)}catch(o){return delete this.cache,a.error(o,n)}},r.pt.render=function(e,r){var n=this;return e?(e=n.cache?n.cache(e,a):n.parse(n.tpl,e),r?void r(e):e):a.error("no data")},function(e){return"string"!=typeof e?a.error("Template not found"):new r(e)});n.config=function(e){for(var r in e=e||{})p[r]=e[r]},n.v="1.2.0",e("laytpl",n)});layui.define(function(e){"use strict";var n=document,u="getElementById",c="getElementsByTagName",a="layui-disabled",t=function(e){var a=this;a.config=e||{},a.config.index=++o.index,a.render(!0)},o=(t.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return e.elem.length===undefined?2:3},t.prototype.view=function(){var t,i,r=this.config,n=r.groups="groups"in r?Number(r.groups)||0:5,u=(r.layout="object"==typeof r.layout?r.layout:["prev","page","next"],r.count=Number(r.count)||0,r.curr=Number(r.curr)||1,r.limits="object"==typeof r.limits?r.limits:[10,20,30,40,50],r.limit=Number(r.limit)||10,r.pages=Math.ceil(r.count/r.limit)||1,r.curr>r.pages?r.curr=r.pages:r.curr<1&&(r.curr=1),n<0?n=1:n>r.pages&&(n=r.pages),r.prev="prev"in r?r.prev:"上一页",r.next="next"in r?r.next:"下一页",r.pages>n?Math.ceil((r.curr+(1'+r.prev+"":"",page:function(){var e=[];if(r.count<1)return"";1'+(r.first||1)+"");var a=Math.floor((n-1)/2),t=1r.pages?r.pages:a:n;for(i-t…');t<=i;t++)t===r.curr?e.push('"+t+""):e.push(''+t+"");return r.pages>n&&r.pages>i&&!1!==r.last&&(i+1…'),0!==n&&e.push(''+(r.last||r.pages)+"")),e.join("")}(),next:r.next?''+r.next+"":"",count:'\u5171 '+r.count+" \u6761",limit:(t=['"),refresh:['','',""].join(""),skip:['到第','','页',""].join("")};return['
',(i=[],layui.each(r.layout,function(e,a){s[a]&&i.push(s[a])}),i.join("")),"
"].join("")},t.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,n=e[c]("button")[0],u=e[c]("input")[0],e=e[c]("select")[0],s=function(){var e=Number(u.value.replace(/\s|\D/g,""));e&&(i.curr=e,t.render())};if(a)return s();for(var l=0,p=r.length;li.pages||(i.curr=e,t.render())});e&&o.on(e,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),n&&o.on(n,"click",function(){s()})}},t.prototype.skip=function(t){var i,e;t&&(i=this,(e=t[c]("input")[0])&&o.on(e,"keyup",function(e){var a=this.value,e=e.keyCode;/^(37|38|39|40)$/.test(e)||(/\D/.test(a)&&(this.value=a.replace(/\D/,"")),13===e&&i.jump(t,!0))}))},t.prototype.render=function(e){var a=this,t=a.config,i=a.type(),r=a.view(),i=(2===i?t.elem&&(t.elem.innerHTML=r):3===i?t.elem.html(r):n[u](t.elem)&&(n[u](t.elem).innerHTML=r),t.jump&&t.jump(t,e),n[u]("layui-laypage-"+t.index));a.jump(i),t.hash&&!e&&(location.hash="!"+t.hash+"="+t.curr),a.skip(i)},{render:function(e){return new t(e).index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(a,e,t){return a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1),this}});e("laypage",o)});!function(i,g){"use strict";var n=i.layui&&layui.define,l={getPath:i.lay&&lay.getPath?lay.getPath:"",link:function(e,t,a){v.path&&i.lay&&lay.layui&&lay.layui.link(v.path+e,t,a)}},e=i.LAYUI_GLOBAL||{},v={v:"5.4.0",config:{weekStart:0},index:i.laydate&&i.laydate.v?1e5:0,path:e.laydate_dir||l.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",a=(n?"modules/":"css/")+"laydate.css?v="+v.v;return n?layui["layui.all"]?"function"==typeof e&&e():layui.addcss(a,e,t):l.link(a,e,t),this}},s=function(){var t=this,e=t.config.id;return(s.that[e]=t).inst={hint:function(e){t.hint.call(t,e)},config:t.config}},a="laydate",x="layui-this",w="laydate-disabled",h=[100,2e5],T="layui-laydate-static",C="layui-laydate-list",r="layui-laydate-hint",M=".laydate-btns-confirm",E="laydate-time-text",k="laydate-btns-time",D="layui-laydate-preview",I="layui-laydate-main",b="layui-laydate-shade",S=function(e){var t=this,a=(t.index=++v.index,t.config=lay.extend({},t.config,v.config,e),lay(e.elem||t.config.elem));if(1\u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5
\u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a
","
\u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time
Please re-select",invalidDate:"Invalid date",formatError:["The date format error
Must be followed\uff1a
","
It has been reset"],preview:"The selected result"}};return e[this.config.lang]||e.cn},S.prototype.init=function(){var e,r=this,o=r.config,t="static"===o.position,a={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};o.elem=lay(o.elem),o.eventElem=lay(o.eventElem),o.elem[0]&&((e=s.that[o.elem.attr("lay-key")])&&e.destroy&&e.destroy(),"array"!==layui.type(o.theme)&&(o.theme=[o.theme]),o.fullPanel&&("datetime"!==o.type||o.range)&&delete o.fullPanel,r.rangeStr=o.range?"string"==typeof o.range?o.range:"-":"","array"===layui.type(o.range)&&(r.rangeElem=[lay(o.range[0]),lay(o.range[1])]),a[o.type]||(i.console&&console.error&&console.error("laydate type error:'"+o.type+"' is not supported"),o.type="date"),o.format===a.date&&(o.format=a[o.type]||a.date),r.format=s.formatArr(o.format),o.weekStart&&!/^[0-6]$/.test(o.weekStart)&&(e=r.lang(),o.weekStart=e.weeks.indexOf(o.weekStart),-1===o.weekStart&&(o.weekStart=0)),r.EXP_IF="",r.EXP_SPLIT="",lay.each(r.format,function(e,t){e=new RegExp(d).test(t)?"\\d{"+(new RegExp(d).test(r.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(t)?4:t.length:/^yyyy$/.test(t)?"1,4":/^y$/.test(t)?"1,308":"1,2")+"}":"\\"+t;r.EXP_IF=r.EXP_IF+e,r.EXP_SPLIT=r.EXP_SPLIT+"("+e+")"}),r.EXP_IF_ONE=new RegExp("^"+r.EXP_IF+"$"),r.EXP_IF=new RegExp("^"+(o.range?r.EXP_IF+"\\s\\"+r.rangeStr+"\\s"+r.EXP_IF:r.EXP_IF)+"$"),r.EXP_SPLIT=new RegExp("^"+r.EXP_SPLIT+"$",""),r.isInput(o.elem[0])||"focus"===o.trigger&&(o.trigger="click"),o.elem.attr("lay-key",r.index),o.eventElem.attr("lay-key",r.index),o.mark=lay.extend({},o.calendar&&"cn"===o.lang?{"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"}:{},o.mark),lay.each(["min","max"],function(e,t){var a,n,i=[],l=[];l="number"==typeof o[t]?(a=o[t],n=new Date,n=r.newDate({year:n.getFullYear(),month:n.getMonth(),date:n.getDate(),hours:e?23:0,minutes:e?59:0,seconds:e?59:0}).getTime(),i=[(e=new Date(a?a<864e5?n+864e5*a:a:n)).getFullYear(),e.getMonth()+1,e.getDate()],[e.getHours(),e.getMinutes(),e.getSeconds()]):(i=(o[t].match(/\d+-\d+-\d+/)||[""])[0].split("-"),(o[t].match(/\d+:\d+:\d+/)||[""])[0].split(":")),o[t]={year:0|i[0]||(new Date).getFullYear(),month:i[1]?(0|i[1])-1:(new Date).getMonth(),date:0|i[2]||(new Date).getDate(),hours:0|l[0],minutes:0|l[1],seconds:0|l[2]}}),r.elemID="layui-laydate"+o.elem.attr("lay-key"),(o.show||t)&&r.render(),t||r.events(),o.value&&o.isInitValue&&("date"===layui.type(o.value)?r.setValue(r.parse(0,r.systemDate(o.value))):r.setValue(o.value)))},S.prototype.render=function(){var a,n,i,l,r=this,o=r.config,s=r.lang(),d="static"===o.position,y=r.elem=lay.elem("div",{id:r.elemID,"class":["layui-laydate",o.range?" layui-laydate-range":"",d?" "+T:"",o.fullPanel?" laydate-theme-fullpanel":"",(a="",lay.each(o.theme,function(e,t){"default"===t||/^#/.test(t)||(a+=" laydate-theme-"+t)}),a)].join("")}),m=r.elemMain=[],c=r.elemHeader=[],u=r.elemCont=[],h=r.table=[],e=r.footer=lay.elem("div",{"class":"layui-laydate-footer"}),t=r.shortcut=lay.elem("ul",{"class":"layui-laydate-shortcut"}),f=(o.zIndex&&(y.style.zIndex=o.zIndex),lay.each(new Array(2),function(e){if(!o.range&&0'+s.timeTips+""),(o.range||"datetime"!==o.type||o.fullPanel)&&f.push(''),lay.each(o.btns,function(e,t){var a=s.tools[t]||"btn";o.range&&"now"===t||(d&&"clear"===t&&(a="cn"===o.lang?"\u91cd\u7f6e":"Reset"),n.push(''+a+""))}),f.push('"),f.join(""))),o.shortcuts&&(y.appendChild(t),lay(t).html((i=[],lay.each(o.shortcuts,function(e,t){i.push('
  • '+t.text+"
  • ")}),i.join(""))).find("li").on("click",function(e){var t=(o.shortcuts[this.dataset.index]||{}).value||[],n=(layui.isArray(t)||(t=[t]),o.type),t=(lay.each(t,function(e,t){var a=[o.dateTime,r.endDate][e];"time"===n&&"date"!==layui.type(t)?r.EXP_IF.test(t)&&(t=(t.match(r.EXP_SPLIT)||[]).slice(1),lay.extend(a,{hours:0|t[0],minutes:0|t[2],seconds:0|t[4]})):lay.extend(a,r.systemDate("date"===layui.type(t)?t:new Date(t))),"time"===n&&(r[["startTime","endTime"][e]]={hours:a.hours,minutes:a.minutes,seconds:a.seconds}),"year"===n||"month"===n||"time"===n?(r.listYM[e]=[a.year,a.month+1],r.checkDate("limit").calendar(null,e),r.list(n,e)):(r.checkDate("limit").calendar(null,e),r.closeList())}),lay(r.footer).find("."+k).removeClass(w));t&&"date"===t.attr("lay-type")&&t[0].click(),r.done(null,"change"),lay(this).addClass(x),"static"!==o.position&&!o.range&&o.autoConfirm&&("date"===n?r.choose(lay(y).find("td.layui-this")):"year"!==n&&"month"!==n||lay(m[0]).find("."+I+" li."+x+":not(.laydate-disabled)")[0]&&r.setValue(r.parse()).remove().done())})),lay.each(m,function(e,t){y.appendChild(t)}),o.showBottom&&y.appendChild(e),lay.elem("style")),p=[],t=(lay.each(o.theme,function(e,t){/^#/.test(t)&&(l=!0,p.push(["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} li.layui-this,#{{id}} td.layui-this>div{background-color:{{theme}} !important;}",-1!==o.theme.indexOf("circle")?"":"#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,r.elemID).replace(/{{theme}}/g,t)))}),o.shortcuts&&o.range&&p.push("#{{id}}.layui-laydate-range{width: 628px;}".replace(/{{id}}/g,r.elemID)),p.length&&(p=p.join(""),"styleSheet"in f?(f.setAttribute("type","text/css"),f.styleSheet.cssText=p):f.innerHTML=p,l&&lay(y).addClass("laydate-theme-molv"),y.appendChild(f)),r.remove(S.thisElemDate),v.thisId=o.id,d?o.elem.append(y):(g.body.appendChild(y),r.position()),o.shade?'
    ':"");y.insertAdjacentHTML("beforebegin",t),r.checkDate().calendar(null,0,"init"),r.changeEvent(),S.thisElemDate=r.elemID,r.renderAdditional(),"function"==typeof o.ready&&o.ready(lay.extend({},o.dateTime,{month:o.dateTime.month+1})),r.preview()},S.prototype.remove=function(e){var t=this,a=t.config,n=lay("#"+(e||t.elemID));return n[0]&&(n.hasClass(T)||t.checkDate(function(){n.remove(),delete v.thisId,"function"==typeof a.close&&a.close(t)}),lay("."+b).remove()),t},S.prototype.position=function(){var e=this.config;return lay.position(this.bindElem||e.elem[0],this.elem,{position:e.position}),this},S.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":r}));t.elem&&(a.innerHTML=e||"",lay(t.elem).find("."+r).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+r).remove()},3e3))},S.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),11h[1]&&(e.year=h[1],o=!0),11t&&(e.date=t,o=!0)},r=function(n,i,l){var r=["startTime","endTime"];i=(i.match(s.EXP_SPLIT)||[]).slice(1),l=l||0,d.range&&(s[r[l]]=s[r[l]]||{}),lay.each(s.format,function(e,t){var a=parseFloat(i[e]);i[e].lengths.getDateTime(d.max)?(n=d.dateTime=lay.extend({},d.max),c=!0):s.getDateTime(n)s.getDateTime(d.max))&&(s.endDate=lay.extend({},d.max),c=!0),s.startTime={hours:d.dateTime.hours,minutes:d.dateTime.minutes,seconds:d.dateTime.seconds},s.endTime={hours:s.endDate.hours,minutes:s.endDate.minutes,seconds:s.endDate.seconds}),c&&l&&(s.setValue(s.parse()),s.hint("value "+a.invalidDate+a.formatError[1])),e&&e(),s},S.prototype.mark=function(e,a){var n,t=this.config;return lay.each(t.mark,function(e,t){e=e.split("-");e[0]!=a[0]&&0!=e[0]||e[1]!=a[1]&&0!=e[1]||e[2]!=a[2]||(n=t||a[2])}),n&&e.find("div").html(''+n+""),this},S.prototype.holidays=function(n,i){var e=this.config,l=["","work"];return"array"!==layui.type(e.holidays)||lay.each(e.holidays,function(a,e){lay.each(e,function(e,t){t===n.attr("lay-ymd")&&n.find("div").html('"+i[2]+"")})}),this},S.prototype.limit=function(t){t=t||{};var i=this,e=i.config,l={},a=t.index>(t.time?0:41)?i.endDate:e.dateTime,a=lay.extend({},a,t.date||{});return lay.each({now:a,min:e.min,max:e.max},function(e,a){var n;l[e]=i.newDate(lay.extend({year:a.year,month:"year"===t.type?0:a.month,date:"year"===t.type||"month"===t.type?1:a.date},(n={},lay.each(t.time,function(e,t){n[t]=a[t]}),n))).getTime()}),a=l.nowl.max,t.elem&&t.elem[a?"addClass":"removeClass"](w),a},S.prototype.thisDateTime=function(e){var t=this.config;return e?this.endDate:t.dateTime},S.prototype.calendar=function(e,t,a){var i,l,r,o=this,n=o.config,t=t?1:0,s=e||o.thisDateTime(t),d=new Date,y=o.lang(),m="date"!==n.type&&"datetime"!==n.type,c=lay(o.table[t]).find("td"),t=lay(o.elemHeader[t][2]).find("span");return s.yearh[1]&&(s.year=h[1],o.hint(y.invalidDate)),o.firstDate||(o.firstDate=lay.extend({},s)),d.setFullYear(s.year,s.month,1),i=(d.getDay()+(7-n.weekStart))%7,l=v.getEndDate(s.month||12,s.year),r=v.getEndDate(s.month+1,s.year),lay.each(c,function(e,t){var a=[s.year,s.month],n=0;(t=lay(t)).removeAttr("class"),e"+a[2]+""),o.mark(t,a).holidays(t,a).limit({elem:t,date:{year:a[0],month:a[1]-1,date:a[2]},index:e})}),lay(t[0]).attr("lay-ym",s.year+"-"+(s.month+1)),lay(t[1]).attr("lay-ym",s.year+"-"+(s.month+1)),"cn"===n.lang?(lay(t[0]).attr("lay-type","year").html(s.year+" \u5e74"),lay(t[1]).attr("lay-type","month").html(s.month+1+" \u6708")):(lay(t[0]).attr("lay-type","month").html(y.month[s.month]),lay(t[1]).attr("lay-type","year").html(s.year)),m&&(n.range?e&&(o.listYM=[[n.dateTime.year,n.dateTime.month+1],[o.endDate.year,o.endDate.month+1]],o.list(n.type,0).list(n.type,1),"time"===n.type?o.setBtnStatus("\u65f6\u95f4",lay.extend({},o.systemDate(),o.startTime),lay.extend({},o.systemDate(),o.endTime)):o.setBtnStatus(!0)):(o.listYM=[[s.year,s.month+1]],o.list(n.type,0))),n.range&&"init"===a&&!e&&o.calendar(o.endDate,1),n.range||(d=["hours","minutes","seconds"],o.limit({elem:lay(o.footer).find(".laydate-btns-now"),date:o.systemDate(),index:0,time:d}),o.limit({elem:lay(o.footer).find(M),index:0,time:d})),o.setBtnStatus(),lay(o.shortcut).find("li."+x).removeClass(x),o},S.prototype.list=function(n,i){var l,r,e,o,s=this,d=s.config,y=d.dateTime,m=s.lang(),t=d.range&&"date"!==d.type&&"datetime"!==d.type,c=lay.elem("ul",{"class":C+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[n]}),a=s.elemHeader[i],u=lay(a[2]).find("span"),h=s.elemCont[i||0],f=lay(h).find("."+C)[0],p="cn"===d.lang,g=p?"\u5e74":"",v=s.listYM[i]||{},T=["hours","minutes","seconds"],D=["startTime","endTime"][i];return v[0]<1&&(v[0]=1),"year"===n?(e=l=v[0]-7,l<1&&(e=l=1),lay.each(new Array(15),function(e){var t=lay.elem("li",{"lay-ym":l}),a={year:l,month:0,date:1};l==v[0]&&lay(t).addClass(x),t.innerHTML=l+g,c.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n}),l++}),lay(u[p?0:1]).attr("lay-ym",l-8+"-"+v[1]).html(e+g+" - "+(l-1)+g)):"month"===n?(lay.each(new Array(12),function(e){var t=lay.elem("li",{"lay-ym":e}),a={year:v[0],month:e,date:1};e+1==v[1]&&lay(t).addClass(x),t.innerHTML=m.month[e]+(p?"\u6708":""),c.appendChild(t),s.limit({elem:lay(t),date:a,index:i,type:n})}),lay(u[p?0:1]).attr("lay-ym",v[0]+"-"+v[1]).html(v[0]+g)):"time"===n&&(r=function(){lay(c).find("ol").each(function(a,e){lay(e).find("li").each(function(e,t){s.limit({elem:lay(t),date:[{hours:e},{hours:s[D].hours,minutes:e},{hours:s[D].hours,minutes:s[D].minutes,seconds:e}][a],index:i,time:[["hours"],["hours","minutes"],["hours","minutes","seconds"]][a]})})}),d.range||s.limit({elem:lay(s.footer).find(M),date:s[D],inedx:0,time:["hours","minutes","seconds"]})},d.range?s[D]||(s[D]="startTime"===D?y:s.endDate):s[D]=y,lay.each([24,60,60],function(t,e){var a=lay.elem("li"),n=["

    "+m.time[t]+"

      "];lay.each(new Array(e),function(e){n.push(""+lay.digit(e,2)+"")}),a.innerHTML=n.join("")+"
    ",c.appendChild(a)}),r()),f&&h.removeChild(f),h.appendChild(c),"year"===n||"month"===n?(lay(s.elemMain[i]).addClass("laydate-ym-show"),lay(c).find("li").on("click",function(){var e=0|lay(this).attr("lay-ym");lay(this).hasClass(w)||(0===i?(y[n]=e,s.limit({elem:lay(s.footer).find(M),index:0})):s.endDate[n]=e,"year"===d.type||"month"===d.type?(lay(c).find("."+x).removeClass(x),lay(this).addClass(x),"month"===d.type&&"year"===n&&(s.listYM[i][0]=e,t&&((i?s.endDate:y).year=e),s.list("month",i))):(s.checkDate("limit").calendar(null,i),s.closeList()),s.setBtnStatus(),!d.range&&d.autoConfirm&&("month"===d.type&&"month"===n||"year"===d.type&&"year"===n)&&s.setValue(s.parse()).remove().done(),s.done(null,"change"),lay(s.footer).find("."+k).removeClass(w))})):(e=lay.elem("span",{"class":E}),o=function(){lay(c).find("ol").each(function(e){var a=this,t=lay(a).find("li");a.scrollTop=30*(s[D][T[e]]-2),a.scrollTop<=0&&t.each(function(e,t){if(!lay(this).hasClass(w))return a.scrollTop=30*(e-2),!0})})},u=lay(a[2]).find("."+E),o(),e.innerHTML=d.range?[m.startTime,m.endTime][i]:m.timeTips,lay(s.elemMain[i]).addClass("laydate-time-show"),u[0]&&u.remove(),a[2].appendChild(e),lay(c).find("ol").each(function(t){var a=this;lay(a).find("li").on("click",function(){var e=0|this.innerHTML;lay(this).hasClass(w)||(d.range?s[D][T[t]]=e:y[T[t]]=e,lay(a).find("."+x).removeClass(x),lay(this).addClass(x),r(),o(),(s.endDate||"time"===d.type||"datetime"===d.type&&d.fullPanel)&&s.done(null,"change"),s.setBtnStatus())})})),s},S.prototype.listYM=[],S.prototype.closeList=function(){var a=this;a.config;lay.each(a.elemCont,function(e,t){lay(this).find("."+C).remove(),lay(a.elemMain[e]).removeClass("laydate-ym-show laydate-time-show")}),lay(a.elem).find("."+E).remove()},S.prototype.setBtnStatus=function(e,t,a){var n=this,i=n.config,l=n.lang(),r=lay(n.footer).find(M);i.range&&"time"!==i.type&&(t=t||i.dateTime,a=a||n.endDate,i=n.newDate(t).getTime()>n.newDate(a).getTime(),n.limit({date:t})||n.limit({date:a})?r.addClass(w):r[i?"addClass":"removeClass"](w),e&&i&&n.hint("string"==typeof e?l.timeout.replace(/\u65e5\u671f/g,e):l.timeout))},S.prototype.parse=function(e,t){var a=this,n=a.config,t=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},n.dateTime,a.startTime):n.dateTime),t=v.parse(t,a.format,1);return n.range&&e===undefined?t+" "+a.rangeStr+" "+a.parse("end"):t},S.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},S.prototype.getDateTime=function(e){return this.newDate(e).getTime()},S.prototype.setValue=function(e){var t=this,a=t.config,n=t.bindElem||a.elem[0];return"static"===a.position||(e=e||"",t.isInput(n)?lay(n).val(e):(a=t.rangeElem)?("array"!==layui.type(e)&&(e=e.split(" "+t.rangeStr+" ")),a[0].val(e[0]||""),a[1].val(e[1]||"")):(0===lay(n).find("*").length&&lay(n).html(e),lay(n).attr("lay-date",e))),t},S.prototype.preview=function(){var e,t=this,a=t.config;a.isPreview&&(e=lay(t.elem).find("."+D),a=!a.range||t.endDate?t.parse():"",e.html(a).css({color:"#5FB878"}),setTimeout(function(){e.css({color:"#666"})},300))},S.prototype.renderAdditional=function(){this.config.fullPanel&&this.list("time",0)},S.prototype.done=function(e,t){var a=this,n=a.config,i=lay.extend({},lay.extend(n.dateTime,a.startTime)),l=lay.extend({},lay.extend(a.endDate,a.endTime));return lay.each([i,l],function(e,t){"month"in t&&lay.extend(t,{month:t.month+1})}),a.preview(),e=e||[a.parse(),i,l],"change"===t&&a.renderAdditional(),"function"==typeof n[t||"done"]&&n[t||"done"].apply(n,e),a},S.prototype.choose=function(e,a){var n=this,i=n.config,l=n.thisDateTime(a),t=(lay(n.elem).find("td"),{year:0|(t=e.attr("lay-ymd").split("-"))[0],month:(0|t[1])-1,date:0|t[2]});e.hasClass(w)||(lay.extend(l,t),i.range?(lay.each(["startTime","endTime"],function(e,t){n[t]=n[t]||{hours:e?23:0,minutes:e?59:0,seconds:e?59:0},a===e&&(n.getDateTime(lay.extend({},l,n[t]))n.getDateTime(i.max)&&(n[t]={hours:i.max.hours,minutes:i.max.minutes,seconds:i.max.seconds},lay.extend(l,n[t])))}),n.calendar(null,a).done(null,"change")):"static"===i.position?n.calendar().done().done(null,"change"):"date"===i.type?i.autoConfirm?n.setValue(n.parse()).remove().done():n.calendar().done(null,"change"):"datetime"===i.type&&n.calendar().done(null,"change"))},S.prototype.tool=function(t,e){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(t).hasClass(w)||(a.list("time",0),n.range&&a.list("time",1),lay(t).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(t).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue("").remove(),a.done(["",{},{}])},now:function(){var e=new Date;if(lay(t).hasClass(w))return a.hint(i.tools.now+", "+i.invalidDate);lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()).remove(),r&&a.calendar(),a.done()},confirm:function(){if(n.range){if(lay(t).hasClass(w))return a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout)}else if(lay(t).hasClass(w))return a.hint(i.invalidDate);a.setValue(a.parse()).remove(),a.done()}};o[e]&&o[e]()},S.prototype.change=function(n){var i=this,l=i.config,r=i.thisDateTime(n),o=l.range&&("year"===l.type||"month"===l.type),s=i.elemCont[n||0],d=i.listYM[n],e=function(e){var t=lay(s).find(".laydate-year-list")[0],a=lay(s).find(".laydate-month-list")[0];return t&&(d[0]=e?d[0]-15:d[0]+15,i.list("year",n)),a&&(e?d[0]--:d[0]++,i.list("month",n)),(t||a)&&(lay.extend(r,{year:d[0]}),o&&(r.year=d[0]),l.range||i.done(null,"change"),l.range||i.limit({elem:lay(i.footer).find(M),date:{year:d[0]}})),i.setBtnStatus(),t||a};return{prevYear:function(){e("sub")||(r.year--,i.checkDate("limit").calendar(null,n),i.done(null,"change"))},prevMonth:function(){var e=i.getAsYM(r.year,r.month,"sub");lay.extend(r,{year:e[0],month:e[1]}),i.checkDate("limit").calendar(null,n),i.done(null,"change")},nextMonth:function(){var e=i.getAsYM(r.year,r.month);lay.extend(r,{year:e[0],month:e[1]}),i.checkDate("limit").calendar(null,n),i.done(null,"change")},nextYear:function(){e()||(r.year++,i.checkDate("limit").calendar(null,n),i.done(null,"change"))}}},S.prototype.changeEvent=function(){var i=this;i.config;lay(i.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(i.elemHeader,function(n,e){lay(e[0]).on("click",function(e){i.change(n).prevYear()}),lay(e[1]).on("click",function(e){i.change(n).prevMonth()}),lay(e[2]).find("span").on("click",function(e){var t=lay(this),a=t.attr("lay-ym"),t=t.attr("lay-type");a&&(a=a.split("-"),i.listYM[n]=[0|a[0],0|a[1]],i.list(t,n),lay(i.footer).find("."+k).addClass(w))}),lay(e[3]).on("click",function(e){i.change(n).nextMonth()}),lay(e[4]).on("click",function(e){i.change(n).nextYear()})}),lay.each(i.table,function(e,t){lay(t).find("td").on("click",function(){i.choose(lay(this),e)})}),lay(i.footer).find("span").on("click",function(){var e=lay(this).attr("lay-type");i.tool(this,e)})},S.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())||/INPUT|TEXTAREA/.test(e.tagName)},S.prototype.events=function(){var e,t=this,a=t.config;a.elem[0]&&!a.elem[0].eventHandler&&(a.elem.on(a.trigger,e=function(){v.thisId!==a.id&&(t.bindElem=this,t.render())}),a.elem[0].eventHandler=!0,a.eventElem.on(a.trigger,e),t.destroy=function(){t.remove(),a.elem.off(a.trigger,e),a.elem.removeAttr("lay-key"),a.elem[0].eventHandler=!1,a.eventElem.off(a.trigger,e),a.eventElem.removeAttr("lay-key"),delete s.that[a.id]})},s.that={},s.getThis=function(e){var t=s.that[e];return!t&&n&&layui.hint().error(e?a+" instance with ID '"+e+"' not found":"ID argument required"),t},l.run=function(n){n(g).on("mousedown",function(e){var t,a;!v.thisId||(t=s.getThis(v.thisId))&&(a=t.config,e.target!==a.elem[0]&&e.target!==a.eventElem[0]&&e.target!==n(a.closeStop)[0]&&t.remove())}).on("keydown",function(e){var t;!v.thisId||(t=s.getThis(v.thisId))&&"static"!==t.config.position&&13===e.keyCode&&n("#"+t.elemID)[0]&&t.elemID===S.thisElemDate&&(e.preventDefault(),n(t.footer).find(M)[0].click())}),n(i).on("resize",function(){if(v.thisId){var e=s.getThis(v.thisId);if(e)return!(!e.elem||!n(".layui-laydate")[0])&&void e.position()}})},v.render=function(e){e=new S(e);return s.call(e)},v.getInst=function(e){e=s.getThis(e);if(e)return e.inst},v.parse=function(a,n,i){return a=a||{},n=((n="string"==typeof n?s.formatArr(n):n)||[]).concat(),lay.each(n,function(e,t){/yyyy|y/.test(t)?n[e]=lay.digit(a.year,t.length):/MM|M/.test(t)?n[e]=lay.digit(a.month+(i||0),t.length):/dd|d/.test(t)?n[e]=lay.digit(a.date,t.length):/HH|H/.test(t)?n[e]=lay.digit(a.hours,t.length):/mm|m/.test(t)?n[e]=lay.digit(a.minutes,t.length):/ss|s/.test(t)&&(n[e]=lay.digit(a.seconds,t.length))}),n.join("")},v.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},v.close=function(e){e=s.getThis(e||v.thisId);if(e)return e.remove()},v.destroy=function(e){e=s.getThis(e||v.thisId);if(e)return e.destroy()},n?(v.ready(),layui.define("lay",function(e){v.path=layui.cache.dir,l.run(lay),e(a,v)})):"function"==typeof define&&define.amd?define(function(){return l.run(lay),v}):(v.ready(),l.run(i.lay),i.laydate=v)}(window,window.document);!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(T,M){var f=[],g=T.document,c=f.slice,O=f.concat,R=f.push,P=f.indexOf,B={},W=B.toString,m=B.hasOwnProperty,y={},e="1.12.4",C=function(e,t){return new C.fn.init(e,t)},I=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,$=/^-ms-/,z=/-([\da-z])/gi,X=function(e,t){return t.toUpperCase()};function U(e){var t=!!e&&"length"in e&&e.length,n=C.type(e);return"function"!==n&&!C.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+a+")"+a+"*"),ee=new RegExp("="+a+"*([^\\]'\"]*?)"+a+"*\\]","g"),te=new RegExp(G),ne=new RegExp("^"+s+"$"),f={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),TAG:new RegExp("^("+s+"|[*])"),ATTR:new RegExp("^"+J),PSEUDO:new RegExp("^"+G),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+a+"*(even|odd|(([+-]|)(\\d*)n|)"+a+"*(?:([+-]|)"+a+"*(\\d+)|))"+a+"*\\)|)","i"),bool:new RegExp("^(?:"+Y+")$","i"),needsContext:new RegExp("^"+a+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+a+"*((?:-\\d)?\\d*)"+a+"*\\)|)(?=[^-]|$)","i")},re=/^(?:input|select|textarea|button)$/i,ie=/^h\d$/i,c=/^[^{]+\{\s*\[native \w/,oe=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ae=/[+~]/,se=/'|\\/g,d=new RegExp("\\\\([\\da-f]{1,6}"+a+"?|("+a+")|.)","ig"),p=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(65536+r):String.fromCharCode(r>>10|55296,1023&r|56320)},ue=function(){C()};try{D.apply(n=V.call(v.childNodes),v.childNodes),n[v.childNodes.length].nodeType}catch(F){D={apply:n.length?function(e,t){U.apply(e,V.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function H(e,t,n,r){var i,o,a,s,u,l,c,f,d=t&&t.ownerDocument,p=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==p&&9!==p&&11!==p)return n;if(!r&&((t?t.ownerDocument||t:v)!==E&&C(t),t=t||E,N)){if(11!==p&&(l=oe.exec(e)))if(i=l[1]){if(9===p){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(d&&(a=d.getElementById(i))&&y(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return D.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&g.getElementsByClassName&&t.getElementsByClassName)return D.apply(n,t.getElementsByClassName(i)),n}if(g.qsa&&!A[e+" "]&&(!m||!m.test(e))){if(1!==p)d=t,f=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(se,"\\$&"):t.setAttribute("id",s=k),o=(c=w(e)).length,u=ne.test(s)?"#"+s:"[id='"+s+"']";o--;)c[o]=u+" "+_(c[o]);f=c.join(","),d=ae.test(e)&&de(t.parentNode)||t}if(f)try{return D.apply(n,d.querySelectorAll(f)),n}catch(h){}finally{s===k&&t.removeAttribute("id")}}}return P(e.replace(L,"$1"),t,n,r)}function le(){var n=[];function r(e,t){return n.push(e+" ")>b.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function q(e){return e[k]=!0,e}function h(e){var t=E.createElement("div");try{return!!e(t)}catch(F){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function ce(e,t){for(var n=e.split("|"),r=n.length;r--;)b.attrHandle[n[r]]=t}function fe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function x(a){return q(function(o){return o=+o,q(function(e,t){for(var n,r=a([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function de(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in g=H.support={},O=H.isXML=function(e){e=e&&(e.ownerDocument||e).documentElement;return!!e&&"HTML"!==e.nodeName},C=H.setDocument=function(e){var e=e?e.ownerDocument||e:v;return e!==E&&9===e.nodeType&&e.documentElement&&(t=(E=e).documentElement,N=!O(E),(e=E.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",ue,!1):e.attachEvent&&e.attachEvent("onunload",ue)),g.attributes=h(function(e){return e.className="i",!e.getAttribute("className")}),g.getElementsByTagName=h(function(e){return e.appendChild(E.createComment("")),!e.getElementsByTagName("*").length}),g.getElementsByClassName=c.test(E.getElementsByClassName),g.getById=h(function(e){return t.appendChild(e).id=k,!E.getElementsByName||!E.getElementsByName(k).length}),g.getById?(b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&N)return(e=t.getElementById(e))?[e]:[]},b.filter.ID=function(e){var t=e.replace(d,p);return function(e){return e.getAttribute("id")===t}}):(delete b.find.ID,b.filter.ID=function(e){var t=e.replace(d,p);return function(e){e="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}}),b.find.TAG=g.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):g.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[i++];)1===n.nodeType&&r.push(n);return r},b.find.CLASS=g.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&N)return t.getElementsByClassName(e)},r=[],m=[],(g.qsa=c.test(E.querySelectorAll))&&(h(function(e){t.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+a+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+a+"*(?:value|"+Y+")"),e.querySelectorAll("[id~="+k+"-]").length||m.push("~="),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||m.push(".#.+[+~]")}),h(function(e){var t=E.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+a+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(g.matchesSelector=c.test(i=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.msMatchesSelector))&&h(function(e){g.disconnectedMatch=i.call(e,"div"),i.call(e,"[s!='']:x"),r.push("!=",G)}),m=m.length&&new RegExp(m.join("|")),r=r.length&&new RegExp(r.join("|")),e=c.test(t.compareDocumentPosition),y=e||c.test(t.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,t=t&&t.parentNode;return e===t||!(!t||1!==t.nodeType||!(n.contains?n.contains(t):e.compareDocumentPosition&&16&e.compareDocumentPosition(t)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},$=e?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument===v&&y(v,e)?-1:t===E||t.ownerDocument===v&&y(v,t)?1:u?j(u,e)-j(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===E?-1:t===E?1:i?-1:o?1:u?j(u,e)-j(u,t):0;if(i===o)return fe(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?fe(a[r],s[r]):a[r]===v?-1:s[r]===v?1:0}),E},H.matches=function(e,t){return H(e,null,null,t)},H.matchesSelector=function(e,t){if((e.ownerDocument||e)!==E&&C(e),t=t.replace(ee,"='$1']"),g.matchesSelector&&N&&!A[t+" "]&&(!r||!r.test(t))&&(!m||!m.test(t)))try{var n=i.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(F){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(d,p),e[3]=(e[3]||e[4]||e[5]||"").replace(d,p),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||H.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&H.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return f.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&te.test(n)&&(t=w(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(d,p).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=W[e+" "];return t||(t=new RegExp("(^|"+a+")"+e+"("+a+"|$)"))&&W(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=H.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1(?:<\/\1>|)$/,G=/^.[^:#\[\.,]*$/;function K(e,n,r){if(C.isFunction(n))return C.grep(e,function(e,t){return!!n.call(e,t,e)!==r});if(n.nodeType)return C.grep(e,function(e){return e===n!==r});if("string"==typeof n){if(G.test(n))return C.filter(n,e,r);n=C.filter(n,e)}return C.grep(e,function(e){return-1)[^>]*|#([\w-]*))$/,ee=((C.fn.init=function(e,t,n){if(!e)return this;if(n=n||Q,"string"!=typeof e)return e.nodeType?(this.context=this[0]=e,this.length=1,this):C.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(C):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),C.makeArray(e,this));if(!(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&3<=e.length?[null,e,null]:Z.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:g,!0)),J.test(r[1])&&C.isPlainObject(t))for(var r in t)C.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if((n=g.getElementById(r[2]))&&n.parentNode){if(n.id!==r[2])return Q.find(e);this.length=1,this[0]=n}return this.context=g,this.selector=e,this}).prototype=C.fn,Q=C(g),/^(?:parents|prev(?:Until|All))/),te={children:!0,contents:!0,next:!0,prev:!0};function ne(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t,n=C(e,this),r=n.length;return this.filter(function(){for(t=0;t
    a",y.leadingWhitespace=3===S.firstChild.nodeType,y.tbody=!S.getElementsByTagName("tbody").length,y.htmlSerialize=!!S.getElementsByTagName("link").length,y.html5Clone="<:nav>"!==g.createElement("nav").cloneNode(!0).outerHTML,q.type="checkbox",q.checked=!0,k.appendChild(q),y.appendChecked=q.checked,S.innerHTML="",y.noCloneChecked=!!S.cloneNode(!0).lastChild.defaultValue,k.appendChild(S),(q=g.createElement("input")).setAttribute("type","radio"),q.setAttribute("checked","checked"),q.setAttribute("name","t"),S.appendChild(q),y.checkClone=S.cloneNode(!0).cloneNode(!0).lastChild.checked,y.noCloneEvent=!!S.addEventListener,S[C.expando]=1,y.attributes=!S.getAttribute(C.expando);var x={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:y.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]};function b(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):undefined;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||C.nodeName(r,t)?o.push(r):C.merge(o,b(r,t));return t===undefined||t&&C.nodeName(e,t)?C.merge([e],o):o}function we(e,t){for(var n,r=0;null!=(n=e[r]);r++)C._data(n,"globalEval",!t||C._data(t[r],"globalEval"))}x.optgroup=x.option,x.tbody=x.tfoot=x.colgroup=x.caption=x.thead,x.th=x.td;var Te=/<|&#?\w+;/,Ce=/"!==f[1]||Ce.test(a)?0:u:u.firstChild)&&a.childNodes.length;o--;)C.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(C.merge(h,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=p.lastChild}else h.push(t.createTextNode(a));for(u&&p.removeChild(u),y.appendChecked||C.grep(b(h,"input"),Ee),g=0;a=h[g++];)if(r&&-1]","i"),Pe=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,Be=/\s*$/g,ze=be(g).appendChild(g.createElement("div"));function Xe(e,t){return C.nodeName(e,"table")&&C.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ue(e){return e.type=(null!==C.find.attr(e,"type"))+"/"+e.type,e}function Ve(e){var t=Ie.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Ye(e,t){if(1===t.nodeType&&C.hasData(e)){var n,r,i,e=C._data(e),o=C._data(t,e),a=e.events;if(a)for(n in delete o.handle,o.events={},a)for(r=0,i=a[n].length;r")},clone:function(e,t,n){var r,i,o,a,s,u=C.contains(e.ownerDocument,e);if(y.html5Clone||C.isXMLDoc(e)||!Re.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(ze.innerHTML=e.outerHTML,ze.removeChild(o=ze.firstChild)),!(y.noCloneEvent&&y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||C.isXMLDoc(e)))for(r=b(o),s=b(e),a=0;null!=(i=s[a]);++a)if(r[a]){f=c=l=p=d=void 0;var l,c,f,d=i,p=r[a];if(1===p.nodeType){if(l=p.nodeName.toLowerCase(),!y.noCloneEvent&&p[C.expando]){for(c in(f=C._data(p)).events)C.removeEvent(p,c,f.handle);p.removeAttribute(C.expando)}"script"===l&&p.text!==d.text?(Ue(p).text=d.text,Ve(p)):"object"===l?(p.parentNode&&(p.outerHTML=d.outerHTML),y.html5Clone&&d.innerHTML&&!C.trim(p.innerHTML)&&(p.innerHTML=d.innerHTML)):"input"===l&&ge.test(d.type)?(p.defaultChecked=p.checked=d.checked,p.value!==d.value&&(p.value=d.value)):"option"===l?p.defaultSelected=p.selected=d.defaultSelected:"input"!==l&&"textarea"!==l||(p.defaultValue=d.defaultValue)}}if(t)if(n)for(s=s||b(e),r=r||b(o),a=0;null!=(i=s[a]);a++)Ye(i,r[a]);else Ye(e,o);return 0<(r=b(o,"script")).length&&we(r,!u&&b(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=C.expando,u=C.cache,l=y.attributes,c=C.event.special;null!=(n=e[a]);a++)if((t||v(n))&&(o=(i=n[s])&&u[i])){if(o.events)for(r in o.events)c[r]?C.event.remove(n,r):C.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=undefined:n.removeAttribute(s),f.push(i))}}}),C.fn.extend({domManip:w,detach:function(e){return Je(this,e,!0)},remove:function(e){return Je(this,e)},text:function(e){return d(this,function(e){return e===undefined?C.text(this):this.empty().append((this[0]&&this[0].ownerDocument||g).createTextNode(e))},null,e,arguments.length)},append:function(){return w(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Xe(this,e).appendChild(e)})},prepend:function(){return w(this,arguments,function(e){var t;1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(t=Xe(this,e)).insertBefore(e,t.firstChild)})},before:function(){return w(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return w(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&C.cleanData(b(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&C.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return C.clone(this,e,t)})},html:function(e){return d(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined)return 1===t.nodeType?t.innerHTML.replace(Oe,""):undefined;if("string"==typeof e&&!Be.test(e)&&(y.htmlSerialize||!Re.test(e))&&(y.leadingWhitespace||!ve.test(e))&&!x[(me.exec(e)||["",""])[1].toLowerCase()]){e=C.htmlPrefilter(e);try{for(;n")).appendTo(t.documentElement))[0].contentWindow||Ge[0].contentDocument).document).write(),t.close(),n=Qe(e,t),Ge.detach()),Ke[e]=n),n}var n,et,tt,nt,rt,it,ot,a,at=/^margin/,st=new RegExp("^("+e+")(?!px)[a-z%]+$","i"),ut=function(e,t,n,r){var i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.apply(e,r||[]),t)e.style[i]=o[i];return r},lt=g.documentElement;function t(){var e,t=g.documentElement;t.appendChild(ot),a.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=tt=it=!1,et=rt=!0,T.getComputedStyle&&(e=T.getComputedStyle(a),n="1%"!==(e||{}).top,it="2px"===(e||{}).marginLeft,tt="4px"===(e||{width:"4px"}).width,a.style.marginRight="50%",et="4px"===(e||{marginRight:"4px"}).marginRight,(e=a.appendChild(g.createElement("div"))).style.cssText=a.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",e.style.marginRight=e.style.width="0",a.style.width="1px",rt=!parseFloat((T.getComputedStyle(e)||{}).marginRight),a.removeChild(e)),a.style.display="none",(nt=0===a.getClientRects().length)&&(a.style.display="",a.innerHTML="
    t
    ",a.childNodes[0].style.borderCollapse="separate",(e=a.getElementsByTagName("td"))[0].style.cssText="margin:0;border:0;padding:0;display:none",(nt=0===e[0].offsetHeight)&&(e[0].style.display="",e[1].style.display="none",nt=0===e[0].offsetHeight)),t.removeChild(ot)}ot=g.createElement("div"),(a=g.createElement("div")).style&&(a.style.cssText="float:left;opacity:.5",y.opacity="0.5"===a.style.opacity,y.cssFloat=!!a.style.cssFloat,a.style.backgroundClip="content-box",a.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===a.style.backgroundClip,(ot=g.createElement("div")).style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",a.innerHTML="",ot.appendChild(a),y.boxSizing=""===a.style.boxSizing||""===a.style.MozBoxSizing||""===a.style.WebkitBoxSizing,C.extend(y,{reliableHiddenOffsets:function(){return null==n&&t(),nt},boxSizingReliable:function(){return null==n&&t(),tt},pixelMarginRight:function(){return null==n&&t(),et},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),rt},reliableMarginLeft:function(){return null==n&&t(),it}}));var l,p,ct=/^(top|right|bottom|left)$/;function ft(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}T.getComputedStyle?(l=function(e){var t=e.ownerDocument.defaultView;return(t=t&&t.opener?t:T).getComputedStyle(e)},p=function(e,t,n){var r,i,o=e.style;return""!==(i=(n=n||l(e))?n.getPropertyValue(t)||n[t]:undefined)&&i!==undefined||C.contains(e.ownerDocument,e)||(i=C.style(e,t)),n&&!y.pixelMarginRight()&&st.test(i)&&at.test(t)&&(e=o.width,t=o.minWidth,r=o.maxWidth,o.minWidth=o.maxWidth=o.width=i,i=n.width,o.width=e,o.minWidth=t,o.maxWidth=r),i===undefined?i:i+""}):lt.currentStyle&&(l=function(e){return e.currentStyle},p=function(e,t,n){var r,i,o,a=e.style;return null==(n=(n=n||l(e))?n[t]:undefined)&&a&&a[t]&&(n=a[t]),st.test(n)&&!ct.test(t)&&(r=a.left,(o=(i=e.runtimeStyle)&&i.left)&&(i.left=e.currentStyle.left),a.left="fontSize"===t?"1em":n,n=a.pixelLeft+"px",a.left=r,o&&(i.left=o)),n===undefined?n:n+""||"auto"});var dt=/alpha\([^)]*\)/i,pt=/opacity\s*=\s*([^)]*)/i,ht=/^(none|table(?!-c[ea]).+)/,gt=new RegExp("^("+e+")(.*)$","i"),mt={position:"absolute",visibility:"hidden",display:"block"},yt={letterSpacing:"0",fontWeight:"400"},vt=["Webkit","O","Moz","ms"],xt=g.createElement("div").style;function bt(e){if(e in xt)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=vt.length;n--;)if((e=vt[n]+t)in xt)return e}function wt(e,t){for(var n,r,i,o=[],a=0,s=e.length;a
    a",F=q.getElementsByTagName("a")[0],k.setAttribute("type","checkbox"),q.appendChild(k),(F=q.getElementsByTagName("a")[0]).style.cssText="top:1px",y.getSetAttribute="t"!==q.className,y.style=/top/.test(F.getAttribute("style")),y.hrefNormalized="/a"===F.getAttribute("href"),y.checkOn=!!k.value,y.optSelected=e.selected,y.enctype=!!g.createElement("form").enctype,S.disabled=!0,y.optDisabled=!e.disabled,(k=g.createElement("input")).setAttribute("value",""),y.input=""===k.getAttribute("value"),k.value="t",k.setAttribute("type","radio"),y.radioValue="t"===k.value;var Lt=/\r/g,Ht=/[\x20\t\r\n\f]+/g;C.fn.extend({val:function(t){var n,e,r,i=this[0];return arguments.length?(r=C.isFunction(t),this.each(function(e){1===this.nodeType&&(null==(e=r?t.call(this,e,C(this).val()):t)?e="":"number"==typeof e?e+="":C.isArray(e)&&(e=C.map(e,function(e){return null==e?"":e+""})),(n=C.valHooks[this.type]||C.valHooks[this.nodeName.toLowerCase()])&&"set"in n&&n.set(this,e,"value")!==undefined||(this.value=e))})):i?(n=C.valHooks[i.type]||C.valHooks[i.nodeName.toLowerCase()])&&"get"in n&&(e=n.get(i,"value"))!==undefined?e:"string"==typeof(e=i.value)?e.replace(Lt,""):null==e?"":e:void 0}}),C.extend({valHooks:{option:{get:function(e){var t=C.find.attr(e,"value");return null!=t?t:C.trim(C.text(e)).replace(Ht," ")}},select:{get:function(e){for(var t,n=e.options,r=e.selectedIndex,i="select-one"===e.type||r<0,o=i?null:[],a=i?r+1:n.length,s=r<0?a:i?r:0;s").append(C.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},C.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){C.fn[t]=function(e){return this.on(t,e)}}),C.expr.filters.animated=function(t){return C.grep(C.timers,function(e){return t===e.elem}).length},C.offset={setOffset:function(e,t,n){var r,i,o,a,s=C.css(e,"position"),u=C(e),l={};"static"===s&&(e.style.position="relative"),o=u.offset(),r=C.css(e,"top"),a=C.css(e,"left"),s=("absolute"===s||"fixed"===s)&&-1'+(s?a.title[0]:a.title)+"":"";return a.zIndex=o,t([a.shade?'
    ':"",'
    '+(e&&2!=a.type?"":s)+"'+(n=["layui-icon-tips","layui-icon-ok","layui-icon-close-fill","layui-icon-help","layui-icon-password","layui-icon-face-cry","layui-icon-face-smile"],o="layui-anim layui-anim-rotate layui-anim-loop",0==a.type&&-1!==a.icon?'':3==a.type?(i=["layui-icon-loading","layui-icon-loading-1"],2==a.icon?'
    ':''):"")+((1!=a.type||!e)&&a.content||"")+'
    '+(n=[],l&&(n.push(''),n.push('')),a.closeBtn&&n.push(''),n.join(""))+"
    "+(a.btn?function(){var e="";"string"==typeof a.btn&&(a.btn=[a.btn]);for(var t=0,i=a.btn.length;t'+a.btn[t]+"";return'
    '+e+"
    "}():"")+(a.resize?'':"")+""],s,m('
    ')),this},t.pt.creat=function(){var e,n=this,a=n.config,o=n.index,s="object"==typeof(r=a.content),l=m("body");if(!a.id||!m("."+d[0]).find("#"+a.id)[0]){switch(a.removeFocus&&document.activeElement.blur(),"string"==typeof a.area&&(a.area="auto"===a.area?["",""]:[a.area,""]),a.shift&&(a.anim=a.shift),6==h.ie&&(a.fixed=!1),a.type){case 0:a.btn="btn"in a?a.btn:f.btn[0],h.closeAll("dialog");break;case 2:var r=a.content=s?a.content:[a.content||"","auto"];a.content='';break;case 3:delete a.title,delete a.closeBtn,-1===a.icon&&a.icon,h.closeAll("loading");break;case 4:s||(a.content=[a.content,"body"]),a.follow=a.content[1],a.content=a.content[0]+'',delete a.title,a.tips="object"==typeof a.tips?a.tips:[a.tips,!0],a.tipsMore||h.closeAll("tips")}n.vessel(s,function(e,t,i){l.append(e[0]),s?2==a.type||4==a.type?m("body").append(e[1]):r.parents("."+d[0])[0]||(r.data("display",r.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),m("#"+d[0]+o).find("."+d[5]).before(t)):l.append(e[1]),m("#"+d.MOVE)[0]||l.append(f.moveElem=i),n.layero=m("#"+d[0]+o),n.shadeo=m("#"+d.SHADE+o),a.scrollbar||d.html.css("overflow","hidden").attr("layer-full",o)}).auto(o),n.shadeo.css({"background-color":a.shade[1]||"#000",opacity:a.shade[0]||a.shade}),2==a.type&&6==h.ie&&n.layero.find("iframe").attr("src",r[0]),4==a.type?n.tips():(n.offset(),parseInt(f.getStyle(document.getElementById(d.MOVE),"z-index"))||(n.layero.css("visibility","hidden"),h.ready(function(){n.offset(),n.layero.css("visibility","visible")}))),!a.fixed||f.events.resize[n.index]||(f.events.resize[n.index]=function(){n.resize()},c.on("resize",f.events.resize[n.index])),a.time<=0||setTimeout(function(){h.close(n.index)},a.time),n.move().callback(),d.anim[a.anim]&&(e="layer-anim "+d.anim[a.anim],n.layero.addClass(e).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){m(this).removeClass(e)})),a.isOutAnim&&n.layero.data("isOutAnim",!0)}},t.pt.resize=function(){var e=this,t=e.config;e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(e.index),4==t.type&&e.tips()},t.pt.auto=function(e){var t=this.config,i=m("#"+d[0]+e),n=(""===t.area[0]&&0t.maxWidth&&i.width(t.maxWidth)),[i.innerWidth(),i.innerHeight()]),a=i.find(d[1]).outerHeight()||0,o=i.find("."+d[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]?0t.maxHeight?(n[1]=t.maxHeight,e("."+d[5])):t.fixed&&n[1]>=c.height()&&(n[1]=c.height(),e("."+d[5])):e("."+d[5]),this},t.pt.offset=function(){var e=this,t=e.config,i=e.layero,n=[i.outerWidth(),i.outerHeight()],a="object"==typeof t.offset;e.offsetTop=(c.height()-n[1])/2,e.offsetLeft=(c.width()-n[0])/2,a?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=c.width()-n[0]:"b"===t.offset?e.offsetTop=c.height()-n[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=c.height()-n[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=c.width()-n[0]):"rb"===t.offset?(e.offsetTop=c.height()-n[1],e.offsetLeft=c.width()-n[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?c.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?c.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=c.scrollTop(),e.offsetLeft+=c.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=c.height()-(i.find(d[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},t.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=m(e.follow),a={width:(n=n[0]?n:m("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0":'",s=i.success;return delete i.success,h.open(m.extend({type:1,btn:["确定","取消"],content:o,skin:"layui-layer-prompt"+g("prompt"),maxWidth:c.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof s&&s(e)},resize:!1,yes:function(e){var t=a.val();t.length>(i.maxlength||500)?h.tips("最多输入"+(i.maxlength||500)+"个字数",a,{tips:1}):n&&n(t,e,a)}},i))},h.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,h.open(m.extend({type:1,skin:"layui-layer-tab"+g("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0'+a[0].title+"";t"+a[t].title+"";return i}(),content:'
      '+function(){var e=a.length,t=1,i="";if(0'+(a[0].content||"no content")+"";t'+(a[t].content||"no content")+"";return i}()+"
    ",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=m(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},h.photos=function(n,e,a){var o={};if((n=n||{}).photos){var t=!("string"==typeof n.photos||n.photos instanceof m),i=t?n.photos:{},s=i.data||[],l=i.start||0,r=(o.imgIndex=1+(0|l),n.img=n.img||"img",n.success);if(delete n.success,t){if(0===s.length)return h.msg("没有图片")}else{var c=m(n.photos),f=function(){s=[],c.find(n.img).each(function(e){var t=m(this);t.attr("layer-index",e),s.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(f(),0===s.length)return;if(e||c.on("click",n.img,function(){f();var e=m(this).attr("layer-index");h.photos(m.extend(n,{photos:{start:e,data:s,tab:n.tab},full:n.full}),!0)}),!e)return}o.imgprev=function(e){o.imgIndex--,o.imgIndex<1&&(o.imgIndex=s.length),o.tabimg(e)},o.imgnext=function(e,t){o.imgIndex++,o.imgIndex>s.length&&(o.imgIndex=1,t)||o.tabimg(e)},o.keyup=function(e){var t;o.end||(t=e.keyCode,e.preventDefault(),37===t?o.imgprev(!0):39===t?o.imgnext(!0):27===t&&h.close(o.index))},o.tabimg=function(e){if(!(s.length<=1))return i.start=o.imgIndex-1,h.close(o.index),h.photos(n,!0,e)},o.event=function(){o.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),o.imgprev(!0)}),o.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),o.imgnext(!0)}),m(document).on("keyup",o.keyup)},o.loadi=h.load(1,{shade:!("shade"in n)&&.9,scrollbar:!1});var t=s[l].src,d=function(e){h.close(o.loadi);var t,i=s[l].alt||"";a&&(n.anim=-1),o.index=h.open(m.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[m(p).width()-100,m(p).height()-100],!n.full&&(e[0]>t[0]||e[1]>t[1])&&((t=[e[0]/t[0],e[1]/t[1]])[1]'+i+''+(t=['
    '],1','','',"
    "].join("")),n.hideFooter||t.push(['
    ','
    ',"

    "+i+"

    ",""+o.imgIndex+" / "+s.length+"",'\u67e5\u770b\u539f\u56fe',"
    ","
    "].join("")),t.push(""),t.join(""))+"",success:function(e,t){o.bigimg=e.find(".layui-layer-phimg"),o.imgsee=e.find(".layui-layer-imgbar"),o.event(e),n.tab&&n.tab(s[l],e),"function"==typeof r&&r(e)},end:function(){o.end=!0,m(document).off("keyup",o.keyup)}},n))},u=function(){h.close(o.loadi),h.msg("当前图片地址异常
    是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){1").addClass(o));layui.each(i.bars,function(e,t){var n=s('
  • ');n.addClass(t.icon).attr({"lay-type":t.type,style:t.style||"background-color: "+i.bgcolor}).html(t.content),n.on("click",function(){var e=s(this).attr("lay-type");"top"===e&&("body"===i.target?s("html,body"):c).animate({scrollTop:0},i.duration),"function"==typeof i.click&&i.click.call(this,e)}),"object"===layui.type(i.on)&&layui.each(i.on,function(e,t){n.on(e,function(){var e=s(this).attr("lay-type");"function"==typeof t&&t.call(this,e)})}),"top"===t.type&&(n.addClass("layui-fixbar-top"),a=n),u.append(n)}),l.find("."+o).remove(),"object"==typeof i.css&&u.css(i.css),l.append(u),a&&(t=function t(){return c.scrollTop()>=i.showHeight?e||(a.show(),e=1):e&&(a.hide(),e=0),t}()),c.on("scroll",function(){t&&(clearTimeout(n),n=setTimeout(function(){t()},100))})},countdown:function(e,t,n){var i=this,a="function"==typeof t,o=new Date(e).getTime(),r=new Date(!t||a?(new Date).getTime():t).getTime(),o=o-r,l=[Math.floor(o/864e5),Math.floor(o/36e5)%24,Math.floor(o/6e4)%60,Math.floor(o/1e3)%60],a=(a&&(n=t),setTimeout(function(){i.countdown(e,r+1e3,n)},1e3));return n&&n(0]|&(?=#[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e},unescape:function(e){return e!==undefined&&null!==e||(e=""),(e+="").replace(/\&/g,"&").replace(/\</g,"<").replace(/\>/g,">").replace(/\'/g,"'").replace(/\"/g,'"')},toVisibleArea:function(e){var t,n,i,a,o,r,l,c;(e=s.extend({margin:160,duration:200,type:"y"},e)).scrollElem[0]&&e.thisElem[0]&&(t=e.scrollElem,l=e.thisElem,i=(o="y"===e.type)?"top":"left",a=t[n=o?"scrollTop":"scrollLeft"](),o=t[o?"height":"width"](),r=t.offset()[i],c={},((l=l.offset()[i]-r)>o-e.margin||l."+f,x=function(e){var i=this;i.index=++p.index,i.config=s.extend({},i.config,p.config,e),i.init()};x.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:300,shade:0},x.prototype.reload=function(e){var i=this;i.config=s.extend({},i.config,e),i.init(!0)},x.prototype.init=function(e){var i=this,n=i.config,t=n.elem=s(n.elem);return 1",(n="href"in i?''+l+"":l,t?'
    '+n+("parent"===o?'':"group"===o&&d.isAllowSpread?'':"")+"
    ":'
    '+n+"
    "),"
  • "].join(""))).data("item",i),t&&(a=s('
    '),n=s("
      "),"parent"===o?(a.append(u(n,i.child)),l.append(a)):l.append(u(n,i.child))),r.append(l))}),r},n=['
      ',"
      "].join("");!(e="contextmenu"!==d.trigger&&!lay.isTopElem(d.elem[0])?e:!0)&&d.elem.data(c+"_opened")||(l.elemView=s(n),l.elemView.append(d.content||(e=s('
        '),0no menu'),e)),d.className&&l.elemView.addClass(d.className),d.style&&l.elemView.attr("style",d.style),p.thisId=d.id,l.remove(),i.append(l.elemView),d.elem.data(c+"_opened",!0),n=d.shade?'
        ':"",l.elemView.before(n),l.position(),(y.prevElem=l.elemView).data("prevElem",d.elem),l.elemView.find(".layui-menu").on(o,function(e){layui.stope(e)}),l.elemView.find(".layui-menu li").on("click",function(e){var i=s(this),n=i.data("item")||{},t=n.child&&0t.width()&&(n.addClass(C),(i=n[0].getBoundingClientRect()).left<0&&n.removeClass(C)),i.bottom>t.height()&&n.eq(0).css("margin-top",-(i.bottom-t.height()+5)))}).on("mouseleave",n,function(e){var i=s(this).children("."+w);i.removeClass(C),i.css("margin-top",0)}),p.reload=function(e,i){e=y.getThis(e);return e?(e.reload(i),y.call(e)):this},p.render=function(e){e=new x(e);return y.call(e)},e(r,p)});layui.define("jquery",function(e){"use strict";var g=layui.$,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var i=this;return i.config=g.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,a,e,i)}},a="slider",c="layui-disabled",b="layui-slider-bar",x="layui-slider-wrap",T="layui-slider-wrap-btn",w="layui-slider-tips",M="layui-slider-input-txt",L="layui-slider-hover",i=function(e){var i=this;i.index=++t.index,i.config=g.extend({},i.config,t.config,e),i.render()};i.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},i.prototype.render=function(){var a,n=this,l=n.config,e=(l.step<1&&(l.step=1),l.maxl.min?i:l.min,l.value[1]=s>l.min?s:l.min,l.value[0]=l.value[0]>l.max?l.max:l.value[0],l.value[1]=l.value[1]>l.max?l.max:l.value[1],i=Math.floor((l.value[0]-l.min)/(l.max-l.min)*100),t=(s=Math.floor((l.value[1]-l.min)/(l.max-l.min)*100))-i+"%",i+="%",s+="%"):("object"==typeof l.value&&(l.value=Math.min.apply(null,l.value)),l.valuel.max&&(l.value=l.max),t=Math.floor((l.value-l.min)/(l.max-l.min)*100)+"%"),l.disabled?"#c2c2c2":l.theme),i='
        '+(l.tips?'
        ':"")+'
        '+(l.range?'
        ':"")+"
        ",t=g(l.elem),s=t.next(".layui-slider");if(s[0]&&s.remove(),n.elemTemp=g(i),l.range?(n.elemTemp.find("."+x).eq(0).data("value",l.value[0]),n.elemTemp.find("."+x).eq(1).data("value",l.value[1])):n.elemTemp.find("."+x).data("value",l.value),t.html(n.elemTemp),"vertical"===l.type&&n.elemTemp.height(l.height+"px"),l.showstep){for(var o=(l.max-l.min)/l.step,r="",u=1;u<1+o;u++){var d=100*u/o;d<100&&(r+='
        ')}n.elemTemp.append(r)}l.input&&!l.range&&(e=g('
        '),t.css("position","relative"),t.append(e),t.find("."+M).children("input").val(l.value),"vertical"===l.type?e.css({left:0,top:-48}):n.elemTemp.css("margin-right",e.outerWidth()+15)),l.disabled?(n.elemTemp.addClass(c),n.elemTemp.find("."+T).addClass(c)):n.slide(),n.elemTemp.find("."+T).on("mouseover",function(){var e="vertical"===l.type?l.height:n.elemTemp[0].offsetWidth,i=n.elemTemp.find("."+x),t=("vertical"===l.type?e-g(this).parent()[0].offsetTop-i.height():g(this).parent()[0].offsetLeft)/e*100,i=g(this).parent().data("value"),e=l.setTips?l.setTips(i):i;n.elemTemp.find("."+w).html(e),clearTimeout(a),a=setTimeout(function(){"vertical"===l.type?n.elemTemp.find("."+w).css({bottom:t+"%","margin-bottom":"20px",display:"inline-block"}):n.elemTemp.find("."+w).css({left:t+"%",display:"inline-block"})},300)}).on("mouseout",function(){clearTimeout(a),n.elemTemp.find("."+w).css("display","none")})},i.prototype.slide=function(e,i,t){var o=this,r=o.config,u=o.elemTemp,d=function(){return"vertical"===r.type?r.height:u[0].offsetWidth},c=u.find("."+x),v=u.next(".layui-slider-input"),m=v.children("."+M).children("input").val(),p=100/((r.max-r.min)/Math.ceil(r.step)),f=function(e,i,t){e=100<(e=100a[1]&&a.reverse(),o.value=r.range?a:l,r.change&&r.change(o.value),"done"===t&&r.done&&r.done(o.value)},h=function(e){var i=e/d()*100/p,t=Math.round(i)*p;return t=e==d()?Math.ceil(i)*p:t},y=g(['
        d()?d():i)/d()*100/p;f(i,l),s.addClass(L),u.find("."+w).show(),e.preventDefault()},i=function(){s.removeClass(L),u.find("."+w).hide()},t=function(){i&&i(),y.remove(),r.done&&r.done(o.value)},g("#LAY-slider-moving")[0]||g("body").append(y),y.on("mousemove",e),y.on("mouseup",t).on("mouseleave",t)})}),u.on("click",function(e){var i=g("."+T),t=g(this);!i.is(event.target)&&0===i.has(event.target).length&&i.length&&(t=(i=(i=(i="vertical"===r.type?d()-e.clientY+t.offset().top-g(window).scrollTop():e.clientX-t.offset().left-g(window).scrollLeft())<0?0:i)>d()?d():i)/d()*100/p,i=r.range?"vertical"===r.type?Math.abs(i-parseInt(g(c[0]).css("bottom")))>Math.abs(i-parseInt(g(c[1]).css("bottom")))?1:0:Math.abs(i-c[0].offsetLeft)>Math.abs(i-c[1].offsetLeft)?1:0:0,f(t,i,"done"),e.preventDefault())}),v.children(".layui-slider-input-btn").children("i").each(function(i){g(this).on("click",function(){m=v.children("."+M).children("input").val();var e=((m=1==i?m-r.stepr.max?r.max:Number(m)+r.step)-r.min)/(r.max-r.min)*100/p;f(e,0,"done")})});var a=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)r.max?r.max:e,((this.value=e)-r.min)/(r.max-r.min)*100/p);f(e,0,"done")};v.children("."+M).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),a.call(this))}).on("change",a)},i.prototype.events=function(){this.config},t.render=function(e){e=new i(e);return function(){var t=this,a=t.config;return{setValue:function(e,i){return a.value=e,t.slide("set",e,i||0)},config:a}}.call(e)},e(a,t)});layui.define(["jquery","lay"],function(e){"use strict";var m=layui.$,t=layui.lay,o=layui.hint(),i=layui.device().mobile?"click":"mousedown",n={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var i=this;return i.config=m.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},l=function(){var e=this.config,i=e.id;return l.that[i]=this,{config:e}},r="colorpicker",c="layui-colorpicker",a=".layui-colorpicker-main",x="layui-icon-down",P="layui-icon-close",C="layui-colorpicker-trigger-span",B="layui-colorpicker-trigger-i",w="layui-colorpicker-side-slider",I="layui-colorpicker-basis",D="layui-colorpicker-alpha-bgcolor",E="layui-colorpicker-alpha-slider",F="layui-colorpicker-basis-cursor",M="layui-colorpicker-main-input",T=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},Y=function(e){var i,o={},r=e.h,t=255*e.s/100,e=255*e.b/100;return 0==t?o.r=o.g=o.b=e:(e=r%60*((i=e)-(t=(255-t)*e/255))/60,(r=360==r?0:r)<60?(o.r=i,o.b=t,o.g=t+e):r<120?(o.g=i,o.b=t,o.r=i-e):r<180?(o.g=i,o.r=t,o.b=t+e):r<240?(o.b=i,o.r=t,o.g=i-e):r<300?(o.b=i,o.g=t,o.r=t+e):r<360?(o.r=i,o.g=t,o.b=i-e):(o.r=0,o.g=0,o.b=0)),{r:Math.round(o.r),g:Math.round(o.g),b:Math.round(o.b)}},j=function(e){var e=Y(e),o=[e.r.toString(16),e.g.toString(16),e.b.toString(16)];return m.each(o,function(e,i){1==i.length&&(o[e]="0"+i)}),o.join("")},L=function(e){e=e.match(/[0-9]{1,3}/g)||[];return{r:e[0],g:e[1],b:e[2]}},H=m(window),s=m(document),d=function(e){this.index=++n.index,this.config=m.extend({},this.config,n.config,e),this.render()};d.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},d.prototype.render=function(){var e=this,i=e.config,o=m(i.elem);if(1',"",'','',"","","
        "].join("")),r=i.elem=m(i.elem);i.size&&o.addClass("layui-colorpicker-"+i.size),r.addClass("layui-inline").html(e.elemColorBox=o),i.id="id"in i?i.id:e.index,e.color=e.elemColorBox.find("."+C)[0].style.background,e.events()},d.prototype.renderPicker=function(){var o,e=this,i=e.config,r=e.elemColorBox[0],t=e.elemPicker=m(['
        ','
        ','
        ','
        ','
        ','
        ',"
        ",'
        ','
        ',"
        ","
        ",'
        ','
        ','
        ',"
        ","
        ",i.predefine?(o=['
        '],layui.each(i.colors,function(e,i){o.push(['
        ','
        ',"
        "].join(""))}),o.push("
        "),o.join("")):"",'
        ','
        ','',"
        ",'
        ','','',"","
        "].join(""));e.elemColorBox.find("."+C)[0];m(a)[0]&&m(a).data("index")==e.index?e.removePicker(d.thisElemInd):(e.removePicker(d.thisElemInd),m("body").append(t)),n.thisId=i.id,d.thisElemInd=e.index,d.thisColor=r.style.background,e.position(),e.pickerEvents()},d.prototype.removePicker=function(e){var i=this.config,e=m("#layui-colorpicker"+(e||this.index));return e[0]&&(e.remove(),delete n.thisId,"function"==typeof i.close&&i.close(this.color)),this},d.prototype.position=function(){var e=this,i=e.config;return t.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},d.prototype.val=function(){var e,i=this,o=(i.config,i.elemColorBox.find("."+C)),r=i.elemPicker.find("."+M),t=o[0].style.backgroundColor;t?(e=T(L(t)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o&&r.find("input").val(t),"rgba"===o&&(e=L(t),3==(t.match(/[0-9]{1,3}/g)||[]).length?(r.find("input").val("rgba("+e.r+", "+e.g+", "+e.b+", 1)"),i.elemPicker.find("."+E).css("left",280)):(r.find("input").val(t),o=280*t.slice(t.lastIndexOf(",")+1,t.length-1),i.elemPicker.find("."+E).css("left",o)),i.elemPicker.find("."+D)[0].style.background="linear-gradient(to right, rgba("+e.r+", "+e.g+", "+e.b+", 0), rgb("+e.r+", "+e.g+", "+e.b+"))")):(i.select(0,100,100),r.find("input").val(""),i.elemPicker.find("."+D)[0].style.background="",i.elemPicker.find("."+E).css("left",280))},d.prototype.side=function(){var n=this,l=n.config,c=n.elemColorBox.find("."+C),a=c.attr("lay-type"),s=n.elemPicker.find(".layui-colorpicker-side"),e=n.elemPicker.find("."+w),d=n.elemPicker.find("."+I),r=n.elemPicker.find("."+F),f=n.elemPicker.find("."+D),u=n.elemPicker.find("."+E),g=e[0].offsetTop/180*360,h=100-(r[0].offsetTop+3)/180*100,p=(r[0].offsetLeft+3)/260*100,v=Math.round(u[0].offsetLeft/280*100)/100,b=n.elemColorBox.find("."+B),i=n.elemPicker.find(".layui-colorpicker-pre").children("div"),y=function(e,i,o,r){n.select(e,i,o);var t=Y({h:e,s:i,b:o}),e=j({h:e,s:i,b:o}),i=n.elemPicker.find("."+M).find("input");b.addClass(x).removeClass(P),c[0].style.background="rgb("+t.r+", "+t.g+", "+t.b+")","torgb"===a?i.val("rgb("+t.r+", "+t.g+", "+t.b+")"):"rgba"===a?(u.css("left",280*r),i.val("rgba("+t.r+", "+t.g+", "+t.b+", "+r+")"),c[0].style.background="rgba("+t.r+", "+t.g+", "+t.b+", "+r+")",f[0].style.background="linear-gradient(to right, rgba("+t.r+", "+t.g+", "+t.b+", 0), rgb("+t.r+", "+t.g+", "+t.b+"))"):i.val("#"+e),l.change&&l.change(n.elemPicker.find("."+M).find("input").val())},o=m(['
        '].join("")),k=function(e){m("#LAY-colorpicker-moving")[0]||m("body").append(o),o.on("mousemove",e),o.on("mouseup",function(){o.remove()}).on("mouseleave",function(){o.remove()})};e.on("mousedown",function(e){var r=this.offsetTop,t=e.clientY;k(function(e){var i=r+(e.clientY-t),o=s[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;y(g=o,p,h,v),e.preventDefault()}),e.preventDefault()}),s.on("click",function(e){var i=e.clientY-m(this).offset().top,i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;y(g=i,p,h,v),e.preventDefault()}),r.on("mousedown",function(e){var n=this.offsetTop,l=this.offsetLeft,c=e.clientY,a=e.clientX;layui.stope(e),k(function(e){var i=n+(e.clientY-c),o=l+(e.clientX-a),r=d[0].offsetHeight-3,t=d[0].offsetWidth-3,t=((o=t<(o=o<-3?-3:o)?t:o)+3)/260*100,o=100-((i=r<(i=i<-3?-3:i)?r:i)+3)/180*100;y(g,p=t,h=o,v),e.preventDefault()}),e.preventDefault()}),d.on("mousedown",function(e){var i=e.clientY-m(this).offset().top-3+H.scrollTop(),o=e.clientX-m(this).offset().left-3+H.scrollLeft(),o=((i=i<-3?-3:i)>this.offsetHeight-3&&(i=this.offsetHeight-3),((o=(o=o<-3?-3:o)>this.offsetWidth-3?this.offsetWidth-3:o)+3)/260*100),i=100-(i+3)/180*100;y(g,p=o,h=i,v),layui.stope(e),e.preventDefault(),r.trigger(e,"mousedown")}),u.on("mousedown",function(e){var r=this.offsetLeft,t=e.clientX;k(function(e){var i=r+(e.clientX-t),o=f[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);y(g,p,h,v=o),e.preventDefault()}),e.preventDefault()}),f.on("click",function(e){var i=e.clientX-m(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);y(g,p,h,v=i),e.preventDefault()}),i.each(function(){m(this).on("click",function(){m(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=T(L(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);g=i.h,p=i.s,h=i.b,3==(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),v=o,y(i.h,i.s,i.b,o)})})},d.prototype.select=function(e,i,o,r){this.config;var t=j({h:e,s:100,b:100}),e=(j({h:e,s:i,b:o}),e/360*180),o=180-o/100*180-3,i=i/100*260-3;this.elemPicker.find("."+w).css("top",e),this.elemPicker.find("."+I)[0].style.background="#"+t,this.elemPicker.find("."+F).css({top:o,left:i})},d.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+C),d=c.elemPicker.find("."+M+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+B).removeClass(x).addClass(P),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,r,t=d.val(),n=t,l={};if(-1>16,g:(65280&o)>>8,b:255&o},l=T(r),s[0].style.background=n="#"+j(l),c.elemColorBox.find("."+B).removeClass(P).addClass(x)),"change"===i)return c.select(l.h,l.s,l.b,i),void(a.change&&a.change(n));c.color=t,a.done&&a.done(t),c.removePicker()}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=m(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),d.on("keyup",function(e){var i=m(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},d.prototype.events=function(){var e=this;e.config;e.elemColorBox.on("click",function(){e.renderPicker(),m(a)[0]&&(e.val(),e.side())})},s.on(i,function(e){var i,o,r;!n.thisId||(i=l.getThis(n.thisId))&&(o=i.config,r=i.elemColorBox.find("."+C),m(e.target).hasClass(c)||m(e.target).parents("."+c)[0]||m(e.target).hasClass(a.replace(/\./g,""))||m(e.target).parents(a)[0]||i.elemPicker&&(i.color?(e=T(L(i.color)),i.select(e.h,e.s,e.b)):i.elemColorBox.find("."+B).removeClass(x).addClass(P),r[0].style.background=i.color||"","function"==typeof o.cancel&&o.cancel(i.color),i.removePicker()))}),H.on("resize",function(){if(n.thisId){var e=l.getThis(n.thisId);if(e)return!(!e.elemPicker||!m(a)[0])&&void e.position()}}),l.that={},l.getThis=function(e){var i=l.that[e];return i||o.error(e?r+" instance with ID '"+e+"' not found":"ID argument required"),i},n.render=function(e){e=new d(e);return l.call(e)},e(r,n)});layui.define("jquery",function(t){"use strict";var u=layui.$,d=(layui.hint(),layui.device()),c="element",r="layui-this",y="layui-show",i=function(){this.config={}},h=(i.prototype.set=function(t){return u.extend(!0,this.config,t),this},i.prototype.on=function(t,i){return layui.onevent.call(this,c,t,i)},i.prototype.tabAdd=function(t,i){var a,t=u(".layui-tab[lay-filter="+t+"]"),e=t.children(".layui-tab-title"),l=e.children(".layui-tab-bar"),t=t.children(".layui-tab-content"),n=""+(i.title||"unnaming")+"";return l[0]?l.before(n):e.append(n),t.append('
        '+(i.content||"")+"
        "),C.hideTabMore(!0),C.tabAuto(),this},i.prototype.tabDelete=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(".layui-tab-title").find('>li[lay-id="'+i+'"]');return C.tabDelete(null,t),this},i.prototype.tabChange=function(t,i){t=u(".layui-tab[lay-filter="+t+"]").children(".layui-tab-title").find('>li[lay-id="'+i+'"]');return C.tabClick.call(t[0],null,null,t),this},i.prototype.tab=function(a){a=a||{},e.on("click",a.headerElem,function(t){var i=u(this).index();C.tabClick.call(this,t,i,null,a)})},i.prototype.progress=function(t,i){var a="layui-progress",t=u("."+a+"[lay-filter="+t+"]").find("."+a+"-bar"),a=t.find("."+a+"-text");return t.css("width",function(){return/^.+\/.+$/.test(i)?100*new Function("return "+i)()+"%":i}).attr("lay-percent",i),a.text(i),this},".layui-nav"),f="layui-nav-item",l="layui-nav-bar",p="layui-nav-tree",b="layui-nav-child",v="layui-nav-more",m="layui-anim layui-anim-upbit",C={tabClick:function(t,i,a,e){e=e||{};var a=a||u(this),i=i||a.parent().children("li").index(a),l=e.headerElem?a.parent():a.parents(".layui-tab").eq(0),e=e.bodyElem?u(e.bodyElem):l.children(".layui-tab-content").children(".layui-tab-item"),n=a.find("a"),n="javascript:;"!==n.attr("href")&&"_blank"===n.attr("target"),s="string"==typeof a.attr("lay-unselect"),o=l.attr("lay-filter");n||s||(a.addClass(r).siblings().removeClass(r),e.eq(i).addClass(y).siblings().removeClass(y)),layui.event.call(this,c,"tab("+o+")",{elem:l,index:i})},tabDelete:function(t,i){var i=i||u(this).parent(),a=i.index(),e=i.parents(".layui-tab").eq(0),l=e.children(".layui-tab-content").children(".layui-tab-item"),n=e.attr("lay-filter");i.hasClass(r)&&(i.next()[0]&&i.next().is("li")?C.tabClick.call(i.next()[0],null,a+1):i.prev()[0]&&i.prev().is("li")&&C.tabClick.call(i.prev()[0],null,a-1)),i.remove(),l.eq(a).remove(),setTimeout(function(){C.tabAuto()},50),layui.event.call(this,c,"tabDelete("+n+")",{elem:e,index:a})},tabAuto:function(){var e="layui-tab-bar",l="layui-tab-close",n=this;u(".layui-tab").each(function(){var t=u(this),i=t.children(".layui-tab-title"),a=(t.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),a=u('');n===window&&8!=d.ie&&C.hideTabMore(!0),t.attr("lay-allowClose")&&i.find("li").each(function(){var t,i=u(this);i.find("."+l)[0]||((t=u('')).on("click",C.tabDelete),i.append(t))}),"string"!=typeof t.attr("lay-unauto")&&(i.prop("scrollWidth")>i.outerWidth()+1?i.find("."+e)[0]||(i.append(a),t.attr("overflow",""),a.on("click",function(t){i[this.title?"removeClass":"addClass"]("layui-tab-more"),this.title=this.title?"":"\u6536\u7f29"})):(i.find("."+e).remove(),t.removeAttr("overflow")))})},hideTabMore:function(t){var i=u(".layui-tab-title");!0!==t&&"tabmore"===u(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=u(this),i=t.parents(h),a=i.attr("lay-filter"),e=t.parent(),l=t.siblings("."+b),n="string"==typeof e.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||n||l[0]||(i.find("."+r).removeClass(r),e.addClass(r)),i.hasClass(p)&&(l.removeClass(m),l[0]&&(e["none"===l.css("display")?"addClass":"removeClass"](f+"ed"),"all"===i.attr("lay-shrink")&&e.siblings().removeClass(f+"ed"))),layui.event.call(this,c,"nav("+a+")",t)},collapse:function(){var t=u(this),i=t.find(".layui-colla-icon"),a=t.siblings(".layui-colla-content"),e=t.parents(".layui-collapse").eq(0),l=e.attr("lay-filter"),n="none"===a.css("display");"string"==typeof e.attr("lay-accordion")&&((e=e.children(".layui-colla-item").children("."+y)).siblings(".layui-colla-title").children(".layui-colla-icon").html(""),e.removeClass(y)),a[n?"addClass":"removeClass"](y),i.html(n?"":""),layui.event.call(this,c,"collapse("+l+")",{title:t,content:a,show:n})}},a=(i.prototype.render=i.prototype.init=function(t,i){var a=i?'[lay-filter="'+i+'"]':"",i={tab:function(){C.tabAuto.call({})},nav:function(){var s={},o={},c={},r="layui-nav-title";u(h+a).each(function(t){var i=u(this),a=u(''),e=i.find("."+f);i.find("."+l)[0]||(i.append(a),(i.hasClass(p)?e.find("dd,>."+r):e).on("mouseenter",function(){!function(t,i,a){var e,l=u(this),n=l.find("."+b);i.hasClass(p)?n[0]||(e=l.children("."+r),t.css({top:l.offset().top-i.offset().top,height:(e[0]?e:l).outerHeight(),opacity:1})):(n.addClass(m),n.hasClass("layui-nav-child-c")&&n.css({left:-(n.outerWidth()-l.width())/2}),n[0]?t.css({left:t.position().left+t.width()/2,width:0,opacity:0}):t.css({left:l.position().left+parseFloat(l.css("marginLeft")),top:l.position().top+l.height()-t.height()}),s[a]=setTimeout(function(){t.css({width:n[0]?0:l.width(),opacity:n[0]?0:1})},d.ie&&d.ie<10?0:200),clearTimeout(c[a]),"block"===n.css("display")&&clearTimeout(o[a]),o[a]=setTimeout(function(){n.addClass(y),l.find("."+v).addClass(v+"d")},300))}.call(this,a,i,t)}).on("mouseleave",function(){i.hasClass(p)?a.css({height:0,opacity:0}):(clearTimeout(o[t]),o[t]=setTimeout(function(){i.find("."+b).removeClass(y),i.find("."+v).removeClass(v+"d")},300))}),i.on("mouseleave",function(){clearTimeout(s[t]),c[t]=setTimeout(function(){i.hasClass(p)||a.css({width:0,left:a.position().left+a.width()/2,opacity:0})},200)})),e.find("a").each(function(){var t=u(this);t.parent();t.siblings("."+b)[0]&&!t.children("."+v)[0]&&t.append(''),t.off("click",C.clickThis).on("click",C.clickThis)})})},breadcrumb:function(){u(".layui-breadcrumb"+a).each(function(){var t=u(this),i="lay-separator",a=t.attr(i)||"/",e=t.find("a");e.next("span["+i+"]")[0]||(e.each(function(t){t!==e.length-1&&u(this).after(""+a+"")}),t.css("visibility","visible"))})},progress:function(){var e="layui-progress";u("."+e+a).each(function(){var t=u(this),i=t.find(".layui-progress-bar"),a=i.attr("lay-percent");i.css("width",function(){return/^.+\/.+$/.test(a)?100*new Function("return "+a)()+"%":a}),t.attr("lay-showPercent")&&setTimeout(function(){i.html(''+a+"")},350)})},collapse:function(){u(".layui-collapse"+a).each(function(){u(this).find(".layui-colla-item").each(function(){var t=u(this),i=t.find(".layui-colla-title"),t="none"===t.find(".layui-colla-content").css("display");i.find(".layui-colla-icon").remove(),i.append(''+(t?"":"")+""),i.off("click",C.collapse).on("click",C.collapse)})})}};return i[t]?i[t]():layui.each(i,function(t,i){i()})},new i),e=u(document);u(function(){a.render()});e.on("click",".layui-tab-title li",C.tabClick),e.on("click",C.hideTabMore),u(window).on("resize",C.tabAuto),t(c,a)});layui.define(["lay","layer"],function(e){"use strict";var v=layui.$,t=layui.layer,y=layui.device(),i={config:{},set:function(e){var t=this;return t.config=v.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,n,e,t)}},n="upload",a="layui-upload-file",o="layui-upload-form",F="layui-upload-iframe",b="layui-upload-choose",x=function(e){var t=this;t.config=v.extend({},t.config,i.config,e),t.render()};x.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},x.prototype.render=function(e){var t=this;(e=t.config).elem=v(e.elem),e.bindAction=v(e.bindAction),t.file(),t.events()},x.prototype.file=function(){var e=this,t=e.config,i=e.elemFile=v(['"].join("")),n=t.elem.next();(n.hasClass(a)||n.hasClass(o))&&n.remove(),y.ie&&y.ie<10&&t.elem.wrap('
        '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(i),y.ie&&y.ie<10&&e.initIE()},x.prototype.initIE=function(){var i,e=this.config,t=v(''),n=v(['
        ',"
        "].join(""));v("#"+F)[0]||v("body").append(t),e.elem.next().hasClass(o)||(this.elemFile.wrap(n),e.elem.next("."+o).append((i=[],layui.each(e.data,function(e,t){t="function"==typeof t?t():t,i.push('')}),i.join(""))))},x.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},x.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},x.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,t){var i=new FileReader;i.readAsDataURL(t),i.onload=function(){n&&n(e,t,this.result)}})},x.prototype.upload=function(i,e){var n,a,t,o,l=this,r=l.config,c=l.elemFile[0],u=function(){var t=0,a=0,e=i||l.files||l.chooseFiles||c.files,o=function(){r.multiple&&t+a===l.fileLength&&"function"==typeof r.allDone&&r.allDone({total:l.fileLength,successful:t,failed:a})};layui.each(e,function(i,e){var n=new FormData,e=(layui.each(r.data,function(e,t){t="function"==typeof t?t():t,n.append(e,t)}),n.append(r.field,e),{url:r.url,type:"post",data:n,contentType:!1,processData:!1,dataType:"json",headers:r.headers||{},success:function(e){t++,f(i,e),o()},error:function(e){a++,l.msg("Request URL is abnormal: "+(e.statusText||"error")),p(i),o()}});"function"==typeof r.progress&&(e.xhr=function(){var e=v.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var t;e.lengthComputable&&(t=Math.floor(e.loaded/e.total*100),r.progress(t,(r.item||r.elem)[0],e,i))}),e}),v.ajax(e)})},s=function(){var n=v("#"+F);l.elemFile.parent().submit(),clearInterval(x.timer),x.timer=setInterval(function(){var e,t=n.contents().find("body");try{e=t.text()}catch(i){l.msg("Cross-domain requests are not supported"),clearInterval(x.timer),p()}e&&(clearInterval(x.timer),t.html(""),f(0,e))},30)},f=function(e,t){if(l.elemFile.next("."+b).remove(),c.value="","json"===r.force&&"object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},l.msg("Please return JSON data format")}"function"==typeof r.done&&r.done(t,e||0,function(e){l.upload(e)})},p=function(e){r.auto&&(c.value=""),"function"==typeof r.error&&r.error(e||0,function(e){l.upload(e)})},d=r.exts,m=(a=[],layui.each(i||l.chooseFiles,function(e,t){a.push(t.name)}),a),h={preview:function(e){l.preview(e)},upload:function(e,t){var i={};i[e]=t,l.upload(i)},pushFile:function(){return l.files=l.files||{},layui.each(l.chooseFiles,function(e,t){l.files[e]=t}),l.files},resetFile:function(e,t,i){t=new File([t],i);l.files=l.files||{},l.files[e]=t}},g={file:"\u6587\u4ef6",images:"\u56fe\u7247",video:"\u89c6\u9891",audio:"\u97f3\u9891"}[r.accept]||"\u6587\u4ef6",m=0===m.length?c.value.match(/[^\/\\]+\..+/g)||[]||"":m;if(0!==m.length){switch(r.accept){case"file":layui.each(m,function(e,t){if(d&&!RegExp(".\\.("+d+")$","i").test(escape(t)))return n=!0});break;case"video":layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(t)))return n=!0});break;case"audio":layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"mp3|wav|mid")+")$","i").test(escape(t)))return n=!0});break;default:layui.each(m,function(e,t){if(!RegExp(".\\.("+(d||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(t)))return n=!0})}if(n)return l.msg("\u9009\u62e9\u7684"+g+"\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),c.value="";if("choose"!==e&&!r.auto||(r.choose&&r.choose(h),"choose"!==e)){if(l.fileLength=(t=0,g=i||l.files||l.chooseFiles||c.files,layui.each(g,function(){t++}),t),r.number&&l.fileLength>r.number)return l.msg("\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20: "+r.number+" \u4e2a\u6587\u4ef6
        \u60a8\u5f53\u524d\u5df2\u7ecf\u9009\u62e9\u4e86: "+l.fileLength+" \u4e2a\u6587\u4ef6");if(01024*r.size&&(t=1<=(t=r.size/1024)?t.toFixed(2)+"MB":r.size+"KB",c.value="",o=t)}),o)return l.msg("\u6587\u4ef6\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc7 "+o);if(!r.before||!1!==r.before(h))y.ie?(9'+e+"")},r=function(){var e=v(this);(e.attr("lay-data")||e.attr("lay-options"))&&(n.config=v.extend({},a,lay.options(this,{attr:e.attr("lay-data")?"lay-data":null})))};a.elem.off("upload.start").on("upload.start",function(){var e=v(this);r.call(this),n.config.item=e,n.elemFile[0].click()}),y.ie&&y.ie<10||a.elem.off("upload.over").on("upload.over",function(){v(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){v(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,t){var i=v(this),t=t.originalEvent.dataTransfer.files||[];i.removeAttr("lay-over"),r.call(this),o(t),a.auto?n.upload():l(t)}),n.elemFile.off("upload.change").on("upload.change",function(){var e=this.files||[];r.call(this),o(e),a.auto?n.upload():l(e)}),a.bindAction.off("upload.action").on("upload.action",function(){n.upload()}),a.elem.data("haveEvents")||(n.elemFile.on("change",function(){v(this).trigger("upload.change")}),a.elem.on("click",function(){n.isFile()||v(this).trigger("upload.start")}),a.drag&&a.elem.on("dragover",function(e){e.preventDefault(),v(this).trigger("upload.over")}).on("dragleave",function(e){v(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),v(this).trigger("upload.drop",e)}),a.bindAction.on("click",function(){v(this).trigger("upload.action")}),a.elem.data("haveEvents",!0))},i.render=function(e){e=new x(e);return function(){var t=this;return{upload:function(e){t.upload.call(t,e)},reload:function(e){t.reload.call(t,e)},config:t.config}}.call(e)},e(n,i)});layui.define(["layer","util"],function(e){"use strict";var C=layui.$,h=layui.layer,d=layui.util,l=layui.hint(),w=(layui.device(),"form"),o=".layui-form",T="layui-this",$="layui-hide",F="layui-disabled",t=function(){this.config={verify:{required:[/[\S]+/,"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"],phone:[/^1\d{10}$/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"],url:[/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/,"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"],number:function(e){if(!e||isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u8eab\u4efd\u8bc1\u53f7"]},autocomplete:null}},i=(t.prototype.set=function(e){return C.extend(!0,this.config,e),this},t.prototype.verify=function(e){return C.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return C(o+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,w,e,t)},t.prototype.val=function(e,i){return this.getFormElem(e).each(function(e,t){var a=C(this);layui.each(i,function(e,t){var i,e=a.find('[name="'+e+'"]');e[0]&&("checkbox"===(i=e[0].type)?e[0].checked=t:"radio"===i?e.each(function(){this.value==t&&(this.checked=!0)}):e.val(t))})}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var a={},n={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i;C(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],a[i]=0|a[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]+++"]")),/^checkbox|radio$/.test(t.type)&&!t.checked||(n[i||t.name]=t.value))}),n},t.prototype.render=function(e,t){var i=this.config,a=C(o+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){e=e||a.find("input,textarea");i.autocomplete&&e.attr("autocomplete",i.autocomplete),a.find("input[lay-affix],textarea[lay-affix]").each(function(){var i=C(this),t=i.attr("lay-affix"),a=i.next(".layui-input-suffix"),n=function(e,t){e&&e[C.trim(t)?"removeClass":"addClass"]($)},l=function(e){a.remove(),a=C(['
        ','',"
        "].join("")),i.after(a),n(a,i.val()),i.on("input propertychange",function(){var e=this.value;n(a,e)}),a.on("click",function(){var e=i.attr("lay-filter");r[t]&&r[t][1].call(this),layui.event.call(this,w,"input-affix("+e+")",{elem:i[0],affix:t})})},r={clear:[function(){l("clear")},function(){i.val("").focus(),n(a,null)}],eye:[function(){l("eye-invisible")},function(){var e="LAY_FORM_INPUT_AFFIX_SHOW",t=i.data(e);i.attr("type",t?"password":"text").data(e,!t),l(t?"eye-invisible":"eye")}]};r[t]&&r[t][0]()})},select:function(e){var p,c="\u8bf7\u9009\u62e9",m="layui-form-select",g="layui-select-title",x="layui-select-none",k="",e=e||a.find("select"),b=function(e,t){C(e.target).parent().hasClass(g)&&!t||(C("."+m).removeClass(m+"ed "+m+"up"),p&&k&&p.val(k)),p=null},u=function(a,e,t){var s,r,i,n,o,l,c=C(this),u=a.find("."+g),d=u.find("input"),f=a.find("dl"),h=f.children("dd"),y=f.children("dt"),v=this.selectedIndex;e||(r=c.attr("lay-search"),i=function(){var e=a.offset().top+a.outerHeight()+5-E.scrollTop(),t=f.outerHeight();v=c[0].selectedIndex,a.addClass(m+"ed"),h.removeClass($),y.removeClass($),s=null,h.eq(v).addClass(T).siblings().removeClass(T),e+t>E.height()&&t<=e&&a.addClass(m+"up"),o()},n=function(e){a.removeClass(m+"ed "+m+"up"),d.blur(),s=null,e||l(d.val(),function(e){var t=c[0].selectedIndex;e&&(k=C(c[0].options[t]).html(),0===t&&k===d.attr("placeholder")&&(k=""),d.val(k||""))})},o=function(){var e,t,i=f.children("dd."+T);i[0]&&(e=i.position().top,t=f.height(),i=i.height(),t\u65e0\u5339\u914d\u9879

        '):f.find("."+x).remove()},"keyup"),""===t&&f.find("."+x).remove(),o()}).on("blur",function(e){var t=c[0].selectedIndex;p=d,k=C(c[0].options[t]).html(),0===t&&k===d.attr("placeholder")&&(k=""),setTimeout(function(){l(d.val(),function(e){k||d.val("")},"blur")},200)}),h.on("click",function(){var e=C(this),t=e.attr("lay-value"),i=c.attr("lay-filter");return e.hasClass(F)||(e.hasClass("layui-select-tips")?d.val(""):(d.val(e.text()),e.addClass(T)),e.siblings().removeClass(T),c.val(t).removeClass("layui-form-danger"),layui.event.call(this,w,"select("+i+")",{elem:c[0],value:t,othis:a}),n(!0)),!1}),a.find("dl>dt").on("click",function(e){return!1}),C(document).off("click",b).on("click",b))};e.each(function(e,t){var i=C(this),a=i.next("."+m),n=this.disabled,l=t.value,r=C(t.options[t.selectedIndex]),t=t.options[0];if("string"==typeof i.attr("lay-ignore"))return i.show();var s,o="string"==typeof i.attr("lay-search"),t=t&&!t.value&&t.innerHTML||c,r=C(['
        ','
        ','','
        ','
        ',(t=i.find("*"),s=[],layui.each(t,function(e,t){var i=t.tagName.toLowerCase();0!==e||t.value||"optgroup"===i?"optgroup"===i?s.push("
        "+t.label+"
        "):s.push('
        '+C.trim(t.innerHTML)+"
        "):s.push('
        '+C.trim(t.innerHTML||c)+"
        ")}),0===s.length&&s.push('
        \u6ca1\u6709\u9009\u9879
        '),s.join("")+"
        "),"
        "].join(""));a[0]&&a.remove(),i.after(r),u.call(this,r,n,o)})},checkbox:function(e){var o={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},e=e||a.find("input[type=checkbox]");e.each(function(e,t){var i=C(this),a=i.attr("lay-skin"),n=(i.attr("lay-text")||"").split("|"),l=this.disabled,r=o[a="switch"===a?"_"+a:a]||o.checkbox;if("string"==typeof i.attr("lay-ignore"))return i.show();var s=i.next("."+r[0]),t=C(['
        ",(l={checkbox:[t.title.replace(/\s/g,"")?""+d.escape(t.title)+"":"",''].join(""),_switch:""+((t.checked?n[0]:n[1])||"")+""})[a]||l.checkbox,"
        "].join(""));s[0]&&s.remove(),i.after(t),function(i,a){var n=C(this);i.on("click",function(){var e=n.attr("lay-filter"),t=(n.attr("lay-text")||"").split("|");n[0].disabled||(n[0].checked?(n[0].checked=!1,i.removeClass(a[1]).find("em").text(t[1])):(n[0].checked=!0,i.addClass(a[1]).find("em").text(t[0])),layui.event.call(n[0],w,a[2]+"("+e+")",{elem:n[0],value:n[0].value,othis:i}))})}.call(this,t,r)})},radio:function(e){var r="layui-form-radio",s=["",""],e=e||a.find("input[type=radio]");e.each(function(e,t){var i=C(this),a=i.next("."+r),n=this.disabled;if("string"==typeof i.attr("lay-ignore"))return i.show();a[0]&&a.remove();n=C(['
        ',''+s[t.checked?0:1]+"","
        "+(a=d.escape(t.title||""),a="string"==typeof i.next().attr("lay-radio")?i.next().html():a)+"
        ","
        "].join(""));i.after(n),function(a){var n=C(this),l="layui-anim-scaleSpring";a.on("click",function(){var e=n[0].name,t=n.parents(o),i=n.attr("lay-filter"),e=t.find("input[name="+e.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(e,function(){var e=C(this).next("."+r);this.checked=!1,e.removeClass(r+"ed"),e.find(".layui-icon").removeClass(l).html(s[1])}),n[0].checked=!0,a.addClass(r+"ed"),a.find(".layui-icon").addClass(l).html(s[0]),layui.event.call(n[0],w,"radio("+i+")",{elem:n[0],value:n[0].value,othis:a}))})}.call(this,n)})}};return"object"===layui.type(e)?e.each(function(e,t){var i=C(t);i.closest(o).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):layui.each(n,function(e,t){t()}),this},t.prototype.validate=function(e){var u=null,d=r.config.verify,f="layui-form-danger";return!(e=C(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var s=C(this),t=(s.attr("lay-verify")||"").split("|"),o=s.attr("lay-verType"),c=s.val();if(s.removeClass(f),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^checkbox|radio$/.test(r.type),i=i||a[1];if("required"===t&&(i=s.attr("lay-reqText")||i),n)return"tips"===o?h.tips(i,"string"!=typeof s.attr("lay-ignore")&&l?s.next():s,{tips:1}):"alert"===o?h.alert(i,{title:"\u63d0\u793a",shadeClose:!0}):/\bstring|number\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?s.next().find("input"):r).focus()},7),s.addClass(f),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i=C(this),e="string"==typeof e?e:i.attr("lay-filter"),a=this.getFormElem?this.getFormElem(e):i.parents(o).eq(0),n=a.find("*[lay-verify]");if(!r.validate(n))return!1;n=r.getValue(null,a),a={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?a:i.parents("form"))[0],field:n};return"function"==typeof t&&t(a),layui.event.call(this,w,"submit("+e+")",a)}),r=new t,t=C(document),E=C(window);C(function(){r.render()}),t.on("reset",o,function(){var e=C(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",o,i).on("click","*[lay-submit]",i),e(w,r)});layui.define(["lay","laytpl","laypage","form","util"],function(e){"use strict";var v=layui.$,r=layui.lay,g=layui.laytpl,F=layui.laypage,b=layui.layer,y=layui.form,x=layui.util,f=layui.hint(),p=layui.device(),k={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX",numbersName:"LAY_INDEX",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var t=this;return t.config=v.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,T,e,t)}},m=function(){var a=this,e=a.config,i=e.id||e.index;return i&&(m.that[i]=a,m.config[i]=e),{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){k.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},C=function(e){var t=m.that[e];return t||f.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},l=function(e){var t=m.config[e];return t||f.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},w=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content,t=(("escape"in a?a:t).escape&&(i=x.escape(i)),e.text&&a.exportTemplet||a.templet||a.toolbar);return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):g(v(t).html()||String(i)).render(v.extend({LAY_COL:a},e.tplData))),e.text?v("
        "+i+"
        ").text():i},T="table",t=".layui-table",L="layui-hide",o="layui-hide-v",d="layui-none",N="layui-table-view",c=".layui-table-header",D=".layui-table-body",s=".layui-table-pageview",W=".layui-table-sort",A="layui-table-edit",E="layui-table-hover",M="laytable-cell-group",_="layui-table-col-special",j="layui-table-tool-panel",R="LAY_TABLE_MOVE_DICT",a=function(e){return['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':"","{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
        ','
        ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{-item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
        ","
        "].join("")},i=['',"","
        "].join(""),h=[,"{{# if(d.data.toolbar){ }}",'
        ','
        ','
        ',"
        ","{{# } }}",'
        ',"{{# if(d.data.loading){ }}",'
        ','',"
        ","{{# } }}","{{# var left, right; }}",'
        ',a(),"
        ",'
        ',i,"
        ","{{# if(left){ }}",'
        ','
        ',a({fixed:!0}),"
        ",'
        ',i,"
        ","
        ","{{# }; }}","{{# if(right){ }}",'
        ','
        ',a({fixed:"right"}),'
        ',"
        ",'
        ',i,"
        ","
        ","{{# }; }}","
        ","{{# if(d.data.totalRow){ }}",'
        ','','',"
        ","
        ","{{# } }}",'
        ','
        ',"
        ",""].join(""),H=v(window),S=v(document),n=function(e){this.index=++k.index,this.config=v.extend({},this.config,k.config,e),this.render()},u=(n.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,cellMaxWidth:Number.MAX_VALUE,editTrigger:"click",defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"\u65e0\u6570\u636e"},cols:[]},n.prototype.render=function(e){var t=this,a=t.config;if(a.elem=v(a.elem),a.where=a.where||{},a.id="id"in a?a.id:a.elem.attr("id")||t.index,a.request=v.extend({pageName:"page",limitName:"limit"},a.request),a.response=v.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return t;if(a.elem.attr("lay-filter")||a.elem.attr("lay-filter",a.id),"reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.index=t.index,t.key=a.id||a.index,t.setInit(),a.height&&/^full-\d+$/.test(a.height)?(t.fullHeightGap=a.height.split("-")[1],a.height=H.height()-t.fullHeightGap):a.height&&/^#\w+\S*-\d+$/.test(a.height)&&(e=a.height.split("-"),t.parentHeightGap=e.pop(),t.parentDiv=e.join("-"),a.height=v(t.parentDiv).height()-t.parentHeightGap);var i,l,e=a.elem,n=e.next("."+N),o=t.elem=v("
        ");o.addClass((i=[N,N+"-"+t.index,"layui-form","layui-border-box"],a.className&&i.push(a.className),i.join(" "))).attr({"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,"lay-id":a.id,style:(i=[],a.width&&i.push("width:"+a.width+"px;"),a.height&&i.push("height:"+a.height+"px;"),i.join(""))}).html(g(h).render({data:a,index:t.index})),n[0]&&n.remove(),e.after(o),t.layTool=o.find(".layui-table-tool"),t.layBox=o.find(".layui-table-box"),t.layHeader=o.find(c),t.layMain=o.find(".layui-table-main"),t.layBody=o.find(D),t.layFixed=o.find(".layui-table-fixed"),t.layFixLeft=o.find(".layui-table-fixed-l"),t.layFixRight=o.find(".layui-table-fixed-r"),t.layTotal=o.find(".layui-table-total"),t.layPage=o.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),1
        ','
        ','
        '].join(""),a=this.layTool.find(".layui-table-tool-temp"),i=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=v(e.toolbar).html()||"")&&a.html(g(t).render(e)),{filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}}),l=[];"object"==typeof e.defaultToolbar&&layui.each(e.defaultToolbar,function(e,t){t="string"==typeof t?i[t]:t;t&&l.push('
        ')}),this.layTool.find(".layui-table-tool-self").html(l.join(""))},n.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=v('
        ');t.pagebar&&((e=v(t.pagebar).html()||"")&&a.append(g(e).render(t)),this.layPage.append(a))},n.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[1]][t[2]],e?l--:l++,i.attr("colspan",l),i[l<1?"addClass":"removeClass"](L),t.colspan=l,t.hide=l<1,(a=i.data("parentkey"))&&this.setParentCol(e,a))},n.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},n.prototype.setGroupWidth=function(i){var e,l=this;l.config.cols.length<=1||((e=l.layHeader.find((i?"th[data-key="+i.data("parentkey")+"]>":"")+"."+M)).css("width",0),layui.each(e.get().reverse(),function(){var e=v(this),t=e.parent().data("key"),a=0;l.layHeader.eq(0).find("th[data-parentkey="+t+"]").width(function(e,t){v(this).hasClass(L)||0'+(e||"Error")+"
        ");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(L),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(o),t.layPage.find(s).addClass(o),k.cache[t.key]=[],t.syncCheckAll()},n.prototype.page=1,n.prototype.pullData=function(t,a){var e,i=this,l=i.config,n=l.request,o=l.response,d=function(){"object"==typeof l.initSort&&i.sort(l.initSort.field,l.initSort.type)};a=a||{},"function"==typeof l.before&&l.before(l),i.startTime=(new Date).getTime(),l.url?((e={})[n.pageName]=t,e[n.limitName]=l.limit,n=v.extend(e,l.where),l.contentType&&0==l.contentType.indexOf("application/json")&&(n=JSON.stringify(n)),i.loading(),v.ajax({type:l.method||"get",url:l.url,contentType:l.contentType,data:n,dataType:l.dataType||"json",jsonpCallback:l.jsonpCallback,headers:l.headers||{},success:function(e){(e="function"==typeof l.parseData?l.parseData(e)||e:e)[o.statusName]!=o.statusCode?(i.renderForm(),i.errorView(e[o.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+o.statusName+'": '+o.statusCode)):(i.renderData({res:e,curr:t,count:e[o.countName],type:a.type}),d(),l.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof l.done&&l.done(e,t,e[o.countName])},error:function(e,t){i.errorView("\u8bf7\u6c42\u5f02\u5e38\uff0c\u9519\u8bef\u63d0\u793a\uff1a"+t),i.renderForm(),i.setColsWidth(),"function"==typeof l.error&&l.error(e,t)}})):"array"===layui.type(l.data)&&(e=t*l.limit-l.limit,(n={})[o.dataName]=l.data.concat().splice(e,l.limit),n[o.countName]=l.data.length,"object"==typeof l.totalRow&&(n[o.totalRowName]=v.extend({},l.totalRow)),i.renderData({res:n,curr:t,count:n[o.countName],type:a.type}),d(),i.setColsWidth(),"function"==typeof l.done&&l.done(n,t,n[o.countName]))},n.prototype.eachCols=function(e){return k.eachCols(null,e,this.config.cols),this},n.prototype.col=function(e){try{return e=e.split("-"),this.config.cols[e[1]][e[2]]||{}}catch(t){return f.error(t),{}}},n.prototype.renderData=function(e){var u=this,h=u.config,t=e.res,l=e.curr,a=e.count,n=e.sort,y=t[h.response.dataName]||[],t=t[h.response.totalRowName],f=[],p=[],m=[],i=function(){var s;if(h.HAS_SET_COLS_PATCH||u.setColsPatch(),h.HAS_SET_COLS_PATCH=!0,!n&&u.sortKey)return u.sort(u.sortKey.field,u.sortKey.sort,!0);layui.each(y,function(o,d){var a=[],i=[],r=[],c=o+h.limit*(l-1)+1;if("object"!=typeof d){y[o]=d={LAY_KEY:d};try{k.cache[u.key][o]=d}catch(e){}}"array"===layui.type(d)&&0===d.length||(d[k.config.numbersName]=c,n||(d[k.config.indexName]=o),u.eachCols(function(e,l){var e=l.field||e,t=l.key,n=d[e];n!==undefined&&null!==n||(n=""),l.colGroup||(t=['','
        "+function(){var e,t=v.extend(!0,{LAY_COL:l},d),a=k.config.checkName,i=k.config.disabledName;switch(l.type){case"checkbox":return'";case"radio":return t[a]&&(s=o),'';case"numbers":return c}return l.toolbar?g(v(l.toolbar).html()||"").render(t):w.call(u,{item3:l,content:n,tplData:t})}(),"
        "].join(""),a.push(t),l.fixed&&"right"!==l.fixed&&i.push(t),"right"===l.fixed&&r.push(t))}),f.push(''+a.join("")+""),p.push(''+i.join("")+""),m.push(''+r.join("")+""))}),"fixed"===h.scrollPos&&"reloadData"===e.type||u.layBody.scrollTop(0),"reset"===h.scrollPos&&u.layBody.scrollLeft(0),u.layMain.find("."+d).remove(),u.layMain.find("tbody").html(f.join("")),u.layFixLeft.find("tbody").html(p.join("")),u.layFixRight.find("tbody").html(m.join("")),u.renderForm(),"number"==typeof s&&u.setThisRowChecked(s),u.syncCheckAll(),u.fullSize(),u.haveInit?u.scrollPatch():setTimeout(function(){u.scrollPatch()},50),u.haveInit=!0,b.close(u.tipsIndex)};return k.cache[u.key]=y,u.layTotal[0==y.length?"addClass":"removeClass"](o),u.layPage[h.page||h.pagebar?"removeClass":"addClass"](L),u.layPage.find(s)[!h.page||0==a||0===y.length&&1==l?"addClass":"removeClass"](o),0===y.length?(u.renderForm(),u.errorView(h.text.none)):(u.layFixLeft.removeClass(L),n?i():(i(),u.renderTotal(y,t),u.layTotal&&u.layTotal.removeClass(L),void(h.page&&(h.page=v.extend({elem:"layui-table-page"+h.index,count:a,limit:h.limit,limits:h.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(u.page=e.curr,h.limit=e.limit,u.pullData(e.curr))}},h.page),h.page.count=a,F.render(h.page)))))},n.prototype.renderTotal=function(e,o){var d,r=this,c=r.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||r.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),r.dataTotal={},d=[],r.eachCols(function(e,t){var a,e=t.field||e,i=o&&o[t.field],l=(a=t.totalRowText||"",n="totalRowDecimals"in t?t.totalRowDecimals:2,n=parseFloat(s[e]).toFixed(n),(l={LAY_COL:t})[e]=n,n=t.totalRow&&w.call(r,{item3:t,content:n,tplData:l})||a,i||n),n=['','
        "+("string"==typeof(a=t.totalRow||c.totalRow)?g(a).render(v.extend({TOTAL_NUMS:i||s[e],LAY_COL:t},t)):l),"
        "].join("");t.field&&(r.dataTotal[e]=l),d.push(n)}),e=r.layTotal.find(".layui-table-patch"),r.layTotal.find("tbody").html(""+d.join("")+(e.length?e.get(0).outerHTML:"")+""))},n.prototype.getColElem=function(e,t){this.config;return e.eq(0).find(".laytable-cell-"+t+":eq(0)")},n.prototype.renderForm=function(e){this.config;var t=this.elem.attr("lay-filter");y.render(e,t)},n.prototype.setThisRowChecked=function(e){this.config;var t="layui-table-click";this.layBody.find('tr[data-index="'+e+'"]').addClass(t).siblings("tr").removeClass(t)},n.prototype.sort=function(l,e,t,a){var i,n=this,o={},d=n.config,r=d.elem.attr("lay-filter"),c=k.cache[n.key];"string"==typeof l&&(s=l,n.layHeader.find("th").each(function(e,t){var a=v(this),i=a.data("field");if(i===l)return l=a,s=i,!1}));try{var s=s||l.data("field"),u=l.data("key");if(n.sortKey&&!t&&s===n.sortKey.field&&e===n.sortKey.sort)return;var h=n.layHeader.find("th .laytable-cell-"+u).find(W);n.layHeader.find("th").find(W).removeAttr("lay-sort"),h.attr("lay-sort",e||null),n.layFixed.find("th")}catch(y){f.error("Table modules: sort field '"+s+"' not matched")}n.sortKey={field:s,sort:e},d.autoSort&&("asc"===e?i=layui.sort(c,s):"desc"===e?i=layui.sort(c,s,!0):(i=layui.sort(c,k.config.indexName),delete n.sortKey,delete d.initSort)),o[d.response.dataName]=i||c,n.renderData({res:o,curr:n.page,count:n.count,sort:!0}),a&&(d.initSort={field:s,type:e},layui.event.call(l,T,"sort("+r+")",v.extend({config:d},d.initSort)))},n.prototype.loading=function(e){var t=this;t.config.loading&&(e?(t.layInit&&t.layInit.remove(),delete t.layInit,t.layBox.find(".layui-table-init").remove()):(t.layInit=v(['
        ','',"
        "].join("")),t.layBox.append(t.layInit)))},n.prototype.setCheckData=function(e,t){var a=this.config,i=k.cache[this.key];i[e]&&"array"!==layui.type(i[e])&&(i[e][a.checkName]=t)},n.prototype.syncCheckAll=function(){var e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(a){return e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),a};t[0]&&(k.checkStatus(e.key).isAll?(t[0].checked||(t.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(t[0].checked&&(t.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},n.prototype.getCssRule=function(a,i){var e=this.elem.find("style")[0],e=e.sheet||e.styleSheet||{},e=e.cssRules||e.rules;layui.each(e,function(e,t){if(t.selectorText===".laytable-cell-"+a)return i(t),!0})},n.prototype.fullSize=function(){var e,a=this,t=a.config,i=t.height;a.fullHeightGap?(i=H.height()-a.fullHeightGap,a.elem.css("height",i=i<135?135:i)):a.parentDiv&&a.parentHeightGap&&(i=v(a.parentDiv).height()-a.parentHeightGap,a.elem.css("height",i=i<135?135:i)),i&&(e=parseFloat(i)-(a.layHeader.outerHeight()||38),t.toolbar&&(e-=a.layTool.outerHeight()||50),t.totalRow&&(e-=a.layTotal.outerHeight()||40),(t.page||t.pagebar)&&(e-=a.layPage.outerHeight()||43),t.maxHeight?layui.each({elem:i,layMain:e},function(e,t){a[e].css({height:"auto",maxHeight:t+"px"})}):a.layMain.outerHeight(e))},n.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:((e=document.createElement("div")).style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},n.prototype.scrollPatch=function(){var e=this,t=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),i=e.layMain.height()-e.layMain.prop("clientHeight"),l=(e.getScrollWidth(e.layMain[0]),t.outerWidth()-e.layMain.width()),n=function(e){var t;a&&i?(e=e.eq(0)).find(".layui-table-patch")[0]||((t=v('
        ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(D).css("height",t.height()>=n?n:"auto"),e.layFixRight[0');a.html(t),u.height&&a.css("max-height",u.height-(s.layTool.outerHeight()||50)),i.find("."+j)[0]||i.append(a),s.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};switch(layui.stope(e),S.trigger("table.tool.panel.remove"),b.close(s.tipsIndex),t){case"LAYTABLE_COLS":l({list:(a=[],s.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
      • "+(t.title||t.field)+"").text())+'" lay-filter="LAY_TABLE_TOOL_COLS">
      • ')}),a.join("")),done:function(){y.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=v(e.elem),t=this.checked,a=e.data("key"),i=s.col(a),l=i.hide,e=e.data("parentkey");i.key&&(i.hide=!t,s.elem.find('*[data-key="'+a+'"]')[t?"removeClass":"addClass"](L),l!=i.hide&&s.setParentCol(!t,e),s.resize(),layui.event.call(this,T,"colToggled("+r+")",{col:i,config:u}))})}});break;case"LAYTABLE_EXPORT":p.ie?b.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",this,{tips:3}):l({list:['
      • \u5bfc\u51fa csv \u683c\u5f0f\u6587\u4ef6
      • ','
      • \u5bfc\u51fa xls \u683c\u5f0f\u6587\u4ef6
      • '].join(""),done:function(e,t){t.on("click",function(){var e=v(this).data("type");k.exportFile.call(s,u.id,null,e)})}});break;case"LAYTABLE_PRINT":var n=window.open("about:blank","_blank"),o=[""].join(""),d=v(s.layHeader.html());d.append(s.layMain.find("table").html()),d.append(s.layTotal.find("table").html()),d.find("th.layui-table-patch").remove(),d.find("thead>tr>th."+_).filter(function(e,t){return!v(t).children("."+M).length}).remove(),d.find("tbody>tr>td."+_).remove(),n.document.write(o+d.prop("outerHTML")),n.document.close(),n.print(),n.close()}layui.event.call(this,T,"toolbar("+r+")",v.extend({event:t,config:u},{}))}),s.layPagebar.on("click","*[lay-event]",function(e){var t=v(this).attr("lay-event");layui.event.call(this,T,"pagebar("+r+")",v.extend({event:t,config:u},{}))}),e.on("mousemove",function(e){var t=v(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||m.eventMoveElem||(o.allowResize=t.width()-e<=10,n.css("cursor",o.allowResize?"col-resize":""))}).on("mouseleave",function(){v(this);m.eventMoveElem||n.css("cursor","")}).on("mousedown",function(e){var t,a=v(this);o.allowResize&&(t=a.data("key"),e.preventDefault(),o.offset=[e.clientX,e.clientY],s.getCssRule(t,function(e){var t=e.style.width||a.outerWidth();o.rule=e,o.ruleWidth=parseFloat(t),o.minWidth=a.data("minwidth")||u.cellMinWidth,o.maxWidth=a.data("maxwidth")||u.cellMaxWidth}),a.data(R,o),m.eventMoveElem=a)}),m.docEvent||S.on("mousemove",function(e){var t,a;m.eventMoveElem&&(t=m.eventMoveElem.data(R)||{},m.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule&&(e=t.ruleWidth+e.clientX-t.offset[0],a=m.eventMoveElem.closest("."+N).attr("lay-id"),(a=C(a))&&((e=et.maxWidth&&(e=t.maxWidth),t.rule.style.width=e+"px",a.setGroupWidth(m.eventMoveElem),b.close(s.tipsIndex))))}).on("mouseup",function(e){var t,a,i,l;m.eventMoveElem&&(i=(t=m.eventMoveElem).closest("."+N).attr("lay-id"),(a=C(i))&&(i=t.data("key"),l=a.col(i),o={},n.css("cursor",""),a.scrollPatch(),t.removeData(R),delete m.eventMoveElem,a.getCssRule(i,function(e){l.width=parseFloat(e.style.width),layui.event.call(t[0],T,"colResized("+r+")",{col:l,config:a.config})})))}),m.docEvent=!0,e.on("click",function(e){var t=v(this),a=t.find(W),i=a.attr("lay-sort");if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");s.sort(t,"asc"===i?"desc":"desc"===i?null:"asc",null,!0)}).find(W+" .layui-edge ").on("click",function(e){var t=v(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?s.sort(t,"asc",null,!0):s.sort(t,"desc",null,!0)}),s.commonMember=function(e){var t=v(this).parents("tr").eq(0).data("index"),r=s.layBody.find('tr[data-index="'+t+'"]'),c=(c=k.cache[s.key]||[])[t]||{};return v.extend({tr:r,config:u,data:k.clearCacheKey(c),del:function(){k.cache[s.key][t]=[],r.remove(),s.scrollPatch()},update:function(e,d){e=e||{},layui.each(e,function(i,l){var n=r.children('td[data-field="'+i+'"]'),o=n.children(h);i in c&&(c[i]=l),s.eachCols(function(e,t){var a;t.field==i?(o.html(w.call(s,{item3:t,content:l,tplData:v.extend({LAY_COL:t},c)})),n.data("content",l)):d&&(t.templet||t.toolbar)&&(e=r.children('td[data-field="'+(t.field||e)+'"]'),a=c[t.field],e.children(h).html(w.call(s,{item3:t,content:a,tplData:v.extend({LAY_COL:t},c)})),e.data("content",a))})}),s.renderForm()}},e)}),t=(s.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=v(this).prev(),t=s.layBody.find('input[name="layTableCheckbox"]'),a=e.parents("tr").eq(0).data("index"),i=e[0].checked,l="layTableAllChoose"===e.attr("lay-filter");e[0].disabled||(l?(t.each(function(e,t){t.checked=i,s.setCheckData(e,i)}),s.syncCheckAll(),s.renderForm("checkbox")):(s.setCheckData(a,i),s.syncCheckAll()),layui.event.call(e[0],T,"checkbox("+r+")",d.call(e[0],{checked:i,type:l?"all":"one"})))}),s.elem.on("click",'input[lay-type="layTableRadio"]+',function(){var e=v(this).prev(),t=e[0].checked,a=k.cache[s.key],i=e.parents("tr").eq(0).data("index");layui.each(a,function(e,t){i===e?t[u.checkName]=!0:delete t[u.checkName]}),s.setThisRowChecked(i),layui.event.call(this,T,"radio("+r+")",d.call(this,{checked:t}))}),s.layBody.on("mouseenter","tr",function(){var e=v(this),t=e.index();e.data("off")||s.layBody.find("tr:eq("+t+")").addClass(E)}).on("mouseleave","tr",function(){var e=v(this),t=e.index();e.data("off")||s.layBody.find("tr:eq("+t+")").removeClass(E)}).on("click","tr",function(){t.call(this,"row")}).on("dblclick","tr",function(){t.call(this,"rowDouble")}),function(e){var t=v(this);t.data("off")||layui.event.call(this,T,e+"("+r+")",d.call(t.children("td")[0]))}),c=function(e,t){var a,i,l,n;(e=v(e)).data("off")||(a=e.data("field"),n=e.data("key"),n=s.col(n),i=e.closest("tr").data("index"),i=k.cache[s.key][i],l=e.children(h),(n="function"==typeof n.edit?n.edit(i):n.edit)&&((n=v("textarea"===n?'':''))[0].value=e.data("content")||i[a]||l.text(),e.find("."+A)[0]||e.append(n),n.focus(),t&&layui.stope(t)))},i=(s.layBody.on("change","."+A,function(){var e=v(this),t=e.parent(),a=this.value,i=e.parent().data("field"),e=e.closest("tr").data("index"),e=k.cache[s.key][e],l=d.call(t[0],{value:a,field:i,oldValue:e[i],td:t,reedit:function(){setTimeout(function(){c(l.td);var e={};e[i]=l.oldValue,l.update(e)})}}),e={};e[i]=a,l.update(e),layui.event.call(t[0],T,"edit("+r+")",l)}).on("blur","."+A,function(){v(this).remove()}),s.layBody.on(u.editTrigger,"td",function(e){c(this,e)}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=v(this),a=t.children(h);t.data("off")||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.outerWidth()||0'))},l=(s.layBody.on("click","."+i,function(e){var t=v(this).parent().children(h);s.tipsIndex=b.tips(['
        ',t.html(),"
        ",''].join(""),t[0],{tips:[3,""],time:-1,anim:-1,maxWidth:p.ios||p.android?300:s.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){b.close(t)})}}),layui.stope(e)}),function(e){var t=v(this),a=t.parents("tr").eq(0).data("index");layui.event.call(this,T,(e||"tool")+"("+r+")",d.call(this,{event:t.attr("lay-event")})),s.setThisRowChecked(a)});s.layBody.on("click","*[lay-event]",function(e){l.call(this),layui.stope(e)}).on("dblclick","*[lay-event]",function(e){l.call(this,"toolDouble"),layui.stope(e)}),s.layMain.on("scroll",function(){var e=v(this),t=e.scrollLeft(),e=e.scrollTop();s.layHeader.scrollLeft(t),s.layTotal.scrollLeft(t),s.layFixed.find(D).scrollTop(e),b.close(s.tipsIndex)}),H.on("resize",function(){s.resize()})},S.on("click",function(){S.trigger("table.remove.tool.panel")}),S.on("table.remove.tool.panel",function(){v("."+j).remove()}),k.init=function(i,o){o=o||{};var e=v(i?'table[lay-filter="'+i+'"]':t+"[lay-data], "+t+"[lay-options]"),d="Table element property lay-data configuration item has a syntax error: ";return e.each(function(){var l,e=v(this),t=e.attr("lay-data"),t=r.options(this,{attr:t?"lay-data":null,errorText:d+(t||e.attr("lay-options"))}),n=v.extend({elem:this,cols:[],data:[],skin:e.attr("lay-skin"),size:e.attr("lay-size"),even:"string"==typeof e.attr("lay-even")},k.config,o,t),a=(i&&e.hide(),e.find("thead>tr").each(function(i){n.cols[i]=[],v(this).children().each(function(e){var t=v(this),a=t.attr("lay-data"),a=r.options(this,{attr:a?"lay-data":null,errorText:d+(a||t.attr("lay-options"))}),t=v.extend({title:t.text(),colspan:parseInt(t.attr("colspan"))||0,rowspan:parseInt(t.attr("rowspan"))||0},a);n.cols[i].push(t)})}),e.find("tbody>tr")),t=k.render(n);!a.length||o.data||t.config.url||(l=0,k.eachCols(t.config.id,function(e,i){a.each(function(e){n.data[e]=n.data[e]||{};var t=v(this),a=i.field;n.data[e][a]=t.children("td").eq(l).html()}),l++}),t.reloadData({data:n.data}))}),this},m.that={},m.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),u(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=t.hide?0:parseInt(1td'),a!==undefined&&null!==a||(a=""),0==l&&d.push(t.title||""),o.push('"'+w.call(c,{item3:t,content:a,tplData:n,text:"text",obj:c.commonMember.call(i.eq(0),{td:function(e){return i.filter('[data-field="'+e+'"]')}})})+'"')))}),i.push(o.join(","))}),c&&layui.each(c.dataTotal,function(e,t){r[e]||l.push(t)}),d.join(",")+"\r\n"+i.join("\r\n")+"\r\n"+l.join(","))),u.download=(a.title||o.title||"table_"+(o.index||""))+"."+n,document.body.appendChild(u),u.click(),document.body.removeChild(u)},k.resize=function(e){e?l(e)&&C(e).resize():layui.each(m.that,function(){this.resize()})},k.reload=function(e,t,a,i){if(l(e))return e=C(e),e.reload(t,a,i),m.call(e)},k.reloadData=function(){var a=v.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["data","url","method","contentType","dataType","jsonpCallback","headers","where","page","limit","request","response","parseData","scrollPos"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)||delete a[1][e]}),k.reload.apply(null,a)},k.render=function(e){e=new n(e);return m.call(e)},k.clearCacheKey=function(e){return delete(e=v.extend({},e))[k.config.checkName],delete e[k.config.indexName],delete e[k.config.numbersName],delete e[k.config.disabledName],e},k.getOptions=function(e){return v.extend(!0,{},l(e))},k.hideCol=function(e,l){var n=C(e);n&&("boolean"===layui.type(l)?n.eachCols(function(e,t){var a=t.key,i=n.col(a),t=t.parentKey;i.hide!=l&&(i=i.hide=l,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](L),n.setParentCol(i,t))}):layui.each(l,function(e,l){n.eachCols(function(e,t){var a,i;l.field===t.field&&(a=t.key,i=n.col(a),t=t.parentKey,"hide"in l&&i.hide!=l.hide&&(i=i.hide=!!l.hide,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](L),n.setParentCol(i,t)))})}),v("."+j).remove(),n.resize())},v(function(){k.init()}),e(T,k)});layui.define("form",function(e){"use strict";var u=layui.$,i=layui.form,p=layui.layer,n="tree",a={config:{},index:layui[n]?layui[n].index+1e4:0,set:function(e){var i=this;return i.config=u.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,n,e,i)}},t=function(){var i=this,e=i.config,n=e.id||i.index;return t.that[n]=i,{config:t.config[n]=e,reload:function(e){i.reload.call(i,e)},getChecked:function(){return i.getChecked.call(i)},setChecked:function(e){return i.setChecked.call(i,e)}}},y="layui-hide",d="layui-disabled",f="layui-tree-set",C="layui-tree-iconClick",k="layui-icon-addition",v="layui-icon-subtraction",m="layui-tree-entry",x="layui-tree-main",b="layui-tree-txt",g="layui-tree-pack",w="layui-tree-spread",N="layui-tree-setLineShort",T="layui-tree-showLine",L="layui-tree-lineExtend",l=function(e){var i=this;i.index=++a.index,i.config=u.extend({},i.config,a.config,e),i.render()};l.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"\u672a\u547d\u540d",none:"\u65e0\u6570\u636e"}},l.prototype.reload=function(e){var n=this;layui.each(e,function(e,i){"array"===layui.type(i)&&delete n.config[e]}),n.config=u.extend(!0,{},n.config,e),n.render()},l.prototype.render=function(){var e=this,i=e.config,n=(e.checkids=[],u('
        ')),a=(e.tree(n),i.elem=u(i.elem));if(a[0]){if(e.key=i.id||e.index,e.elem=n,e.elemNone=u('
        '+i.text.none+"
        "),a.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=u(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(N),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(N)}),e.events()}},l.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},l.prototype.tree=function(l,e){var r=this,c=r.config,e=e||c.data;layui.each(e,function(e,i){var n=i.children&&0"),t=u(['
        ','
        ','
        ',c.showLine?n?'':'':'',c.showCheckbox?'':"",c.isJump&&i.href?''+(i.title||i.label||c.text.defaultNodeName)+"":''+(i.title||i.label||c.text.defaultNodeName)+"","
        ",function(){if(!c.edit)return"";var n={add:'',update:'',del:''},a=['
        '];return!0===c.edit&&(c.edit=["update","del"]),"object"==typeof c.edit?(layui.each(c.edit,function(e,i){a.push(n[i]||"")}),a.join("")+"
        "):void 0}(),"
        "].join(""));n&&(t.append(a),r.tree(a,i.children)),l.append(t),t.prev("."+f)[0]&&t.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),n||t.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),r.spread(t,i),c.showCheckbox&&(i.checked&&r.checkids.push(i.id),r.checkClick(t,i)),c.edit&&r.operate(t,i)})},l.prototype.spread=function(a,e){var t=this.config,i=a.children("."+m),n=i.children("."+x),l=i.find("."+C),i=i.find("."+b),r=t.onlyIconControl?l:n,c="";r.on("click",function(e){var i=a.children("."+g),n=(r.children(".layui-icon")[0]?r:r.find(".layui-tree-icon")).children(".layui-icon");i[0]?a.hasClass(w)?(a.removeClass(w),i.slideUp(200),n.removeClass(v).addClass(k)):(a.addClass(w),i.slideDown(200),n.addClass(v).removeClass(k),t.accordion&&((i=a.siblings("."+f)).removeClass(w),i.children("."+g).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(v).addClass(k))):c="normal"}),i.on("click",function(){u(this).hasClass(d)||(c=a.hasClass(w)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:a,state:c,data:e}))})},l.prototype.setCheckbox=function(e,i,n){this.config;var t,l=n.prop("checked");n.prop("disabled")||("object"!=typeof i.children&&!e.find("."+g)[0]||e.find("."+g).find('input[same="layuiTreeCheck"]').each(function(){this.disabled||(this.checked=l)}),(t=function(e){var i,n,a;e.parents("."+f)[0]&&(n=(e=e.parent("."+g)).parent(),a=e.prev().find('input[same="layuiTreeCheck"]'),l?a.prop("checked",l):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||a.prop("checked",!1)),t(n))})(e),this.renderForm("checkbox"))},l.prototype.checkClick=function(n,a){var t=this,l=t.config;n.children("."+m).children("."+x).on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=u(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.setCheckbox(n,a,e),l.oncheck&&l.oncheck({elem:n,checked:i,data:a}))})},l.prototype.operate=function(c,d){var s=this,o=s.config,e=c.children("."+m),h=e.children("."+x);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var i,e=u(this).data("type"),a=c.children("."+g),t={data:d,type:e,elem:c};if("add"==e){a[0]||(o.showLine?(h.find("."+C).addClass("layui-tree-icon"),h.find("."+C).children(".layui-icon").addClass(k).removeClass("layui-icon-file")):h.find(".layui-tree-iconArrow").removeClass(y),c.append('
        '));var n,l=o.operate&&o.operate(t),r={};if(r.title=o.text.defaultNodeName,r.id=l,s.tree(c.children("."+g),[r]),o.showLine&&(a[0]?(a.hasClass(L)||a.addClass(L),c.find("."+g).each(function(){u(this).children("."+f).last().addClass(N)}),(a.children("."+f).last().prev().hasClass(N)?a.children("."+f).last().prev():a.children("."+f).last()).removeClass(N),!c.parent("."+g)[0]&&c.next()[0]&&a.children("."+f).last().removeClass(N)):(l=c.siblings("."+f),n=1,r=c.parent("."+g),layui.each(l,function(e,i){u(i).children("."+g)[0]||(n=0)}),1==n?(l.children("."+g).addClass(T),l.children("."+g).children("."+f).removeClass(N),c.children("."+g).addClass(T),r.removeClass(L),r.children("."+f).last().children("."+g).children("."+f).last().addClass(N)):c.children("."+g).children("."+f).addClass(N))),!o.showCheckbox)return;h.find('input[same="layuiTreeCheck"]')[0].checked&&(c.children("."+g).children("."+f).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),s.renderForm("checkbox")}else"update"==e?(l=h.children("."+b).html(),h.children("."+b).html(""),h.append(''),h.children(".layui-tree-editInput").val(l).focus(),i=function(e){var i=(i=e.val().trim())||o.text.defaultNodeName;e.remove(),h.children("."+b).html(i),t.data.title=i,o.operate&&o.operate(t)},h.children(".layui-tree-editInput").blur(function(){i(u(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),i(u(this)))})):p.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(d.title||"")+'" \u5417\uff1f',function(e){if(o.operate&&o.operate(t),t.status="remove",p.close(e),!c.prev("."+f)[0]&&!c.next("."+f)[0]&&!c.parent("."+g)[0])return c.remove(),void s.elem.append(s.elemNone);var l,n,i;c.siblings("."+f).children("."+m)[0]?(o.showCheckbox&&(l=function(e){var i,n,a,t;e.parents("."+f)[0]&&(i=e.siblings("."+f).children("."+m),n=(e=e.parent("."+g).prev()).find('input[same="layuiTreeCheck"]')[0],a=1,(t=0)==n.checked&&(i.each(function(e,i){i=u(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(a=0),i.disabled||(t=1)}),1==a&&1==t&&(n.checked=!0,s.renderForm("checkbox"),l(e.parent("."+f)))))})(c),o.showLine&&(e=c.siblings("."+f),n=1,i=c.parent("."+g),layui.each(e,function(e,i){u(i).children("."+g)[0]||(n=0)}),1==n?(a[0]||(i.removeClass(L),e.children("."+g).addClass(T),e.children("."+g).children("."+f).removeClass(N)),(c.next()[0]?i.children("."+f).last():c.prev()).children("."+g).children("."+f).last().addClass(N),c.next()[0]||c.parents("."+f)[1]||c.parents("."+f).eq(0).next()[0]||c.prev("."+f).addClass(N)):!c.next()[0]&&c.hasClass(N)&&c.prev().addClass(N))):(e=c.parent("."+g).prev(),o.showLine?(e.find("."+C).removeClass("layui-tree-icon"),e.find("."+C).children(".layui-icon").removeClass(v).addClass("layui-icon-file"),(i=e.parents("."+g).eq(0)).addClass(L),i.children("."+f).each(function(){u(this).children("."+g).children("."+f).last().addClass(N)})):e.find(".layui-tree-iconArrow").addClass(y),c.parents("."+f).eq(0).removeClass(w),c.parent("."+g).remove()),c.remove()})})},l.prototype.events=function(){var i=this,t=i.config;i.elem.find(".layui-tree-checkedFirst");i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=u(this),n=e.val(),e=e.nextAll(),a=[];e.find("."+b).each(function(){var i,e=u(this).parents("."+m);-1!=u(this).html().indexOf(n)&&(a.push(u(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+g)[0]&&i(e.parent("."+g).parent("."+f))})(e.parent("."+f)))}),e.find("."+m).each(function(){var e=u(this).parent("."+f);e.hasClass("layui-tree-searchShow")||e.addClass(y)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:a})}),i.elem.find(".layui-tree-search").on("keydown",function(){u(this).nextAll().find("."+m).each(function(){u(this).parent("."+f).removeClass("layui-tree-searchShow "+y)}),u(".layui-tree-emptyText")[0]&&u(".layui-tree-emptyText").remove()})},l.prototype.getChecked=function(){var e=this.config,i=[],n=[],t=(this.elem.find(".layui-form-checked").each(function(){i.push(u(this).prev()[0].value)}),function(e,a){layui.each(e,function(e,n){layui.each(i,function(e,i){if(n.id==i)return delete(i=u.extend({},n)).children,a.push(i),n.children&&(i.children=[],t(n.children,i.children)),!0})})});return t(u.extend({},e.data),n),n},l.prototype.setChecked=function(l){this.config;this.elem.find("."+f).each(function(e,i){var n=u(this).data("id"),a=u(i).children("."+m).find('input[same="layuiTreeCheck"]'),t=a.next();if("number"==typeof l){if(n.toString()==l.toString())return a[0].checked||t.click(),!1}else"object"==typeof l&&layui.each(l,function(e,i){if(i.toString()==n.toString()&&!a[0].checked)return t.click(),!0})})},t.that={},t.config={},a.reload=function(e,i){e=t.that[e];return e.reload(i),t.call(e)},a.getChecked=function(e){return t.that[e].getChecked()},a.setChecked=function(e,i){return t.that[e].setChecked(i)},a.render=function(e){e=new l(e);return t.call(e)},e(n,a)});layui.define(["laytpl","form"],function(e){"use strict";var s=layui.$,n=layui.laytpl,t=layui.form,a="transfer",i={config:{},index:layui[a]?layui[a].index+1e4:0,set:function(e){var t=this;return t.config=s.extend({},t.config,e),t},on:function(e,t){return layui.onevent.call(this,a,e,t)}},l=function(){var t=this,e=t.config,a=e.id||t.index;return l.that[a]=t,{config:l.config[a]=e,reload:function(e){t.reload.call(t,e)},getData:function(){return t.getData.call(t)}}},d="layui-hide",h="layui-btn-disabled",r="layui-none",c="layui-transfer-box",u="layui-transfer-header",o="layui-transfer-search",f="layui-transfer-data",y=function(e){return['
        ','
        ','","
        ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
          ',"
          "].join("")},p=['
          ',y({index:0,checkAllName:"layTransferLeftCheckAll"}),'
          ','",'","
          ",y({index:1,checkAllName:"layTransferRightCheckAll"}),"
          "].join(""),v=function(e){var t=this;t.index=++i.index,t.config=s.extend({},t.config,i.config,e),t.render()};v.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},v.prototype.reload=function(e){var t=this;t.config=s.extend({},t.config,e),t.render()},v.prototype.render=function(){var e=this,t=e.config,a=e.elem=s(n(p).render({data:t,index:e.index})),i=t.elem=s(t.elem);i[0]&&(t.data=t.data||[],t.value=t.value||[],e.key=t.id||e.index,i.html(e.elem),e.layBox=e.elem.find("."+c),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+o),e.layData=a.find("."+f),e.layBtn=a.find(".layui-transfer-active .layui-btn"),e.layBox.css({width:t.width,height:t.height}),e.layData.css({height:(i=t.height-e.layHeader.outerHeight(),t.showSearch&&(i-=e.laySearch.outerHeight()),i-2)}),e.renderData(),e.events())},v.prototype.renderData=function(){var e=this,i=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,a=["
        • ",'',"
        • "].join("");i[t].views.push(a),delete e.selected}),e.layData.eq(0).html(i[0].views.join("")),e.layData.eq(1).html(i[1].views.join("")),e.renderCheckBtn()},v.prototype.renderForm=function(e){t.render(e,"LAY-transfer-"+this.index)},v.prototype.renderCheckBtn=function(r){var c=this,o=c.config;r=r||{},c.layBox.each(function(e){var t=s(this),a=t.find("."+f),t=t.find("."+u).find('input[type="checkbox"]'),i=a.find('input[type="checkbox"]'),n=0,l=!1;i.each(function(){var e=s(this).data("hide");(this.checked||this.disabled||e)&&n++,this.checked&&!e&&(l=!0)}),t.prop("checked",l&&n===i.length),c.layBtn.eq(e)[l?"removeClass":"addClass"](h),r.stopNone||(i=a.children("li:not(."+d+")").length,c.noneView(a,i?"":o.text.none))}),c.renderForm("checkbox")},v.prototype.noneView=function(e,t){var a=s('

          '+(t||"")+"

          ");e.find("."+r)[0]&&e.find("."+r).remove(),t.replace(/\s/g,"")&&e.append(a)},v.prototype.setValue=function(){var e=this.config,t=[];return this.layBox.eq(1).find("."+f+' input[type="checkbox"]').each(function(){s(this).data("hide")||t.push(this.value)}),e.value=t,this},v.prototype.parseData=function(t){var i=this.config,n=[];return layui.each(i.data,function(e,a){a=("function"==typeof i.parseData?i.parseData(a):a)||a,n.push(a=s.extend({},a)),layui.each(i.value,function(e,t){t==a.value&&(a.selected=!0)}),t&&t(a)}),i.data=n,this},v.prototype.getData=function(e){var t=this.config,i=[];return this.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},v.prototype.transfer=function(e,t){var a,i=this,n=i.config,l=i.layBox.eq(e),r=[],t=(t?((a=(t=t).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+c).find("."+f).append(t.clone()),t.remove(),r.push(a[0].value),i.setValue()):l.each(function(e){s(this).find("."+f).children("li").each(function(){var e=s(this),t=e.find('input[type="checkbox"]'),a=t.data("hide");t[0].checked&&!a&&(t[0].checked=!1,l.siblings("."+c).find("."+f).append(e.clone()),e.remove(),r.push(t[0].value)),i.setValue()})}),i.renderCheckBtn(),l.siblings("."+c).find("."+o+" input"));""!==t.val()&&t.trigger("keyup"),n.onchange&&n.onchange(i.getData(r),e)},v.prototype.events=function(){var n=this,l=n.config;n.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=s(this).prev(),t=e[0].checked,a=e.parents("."+c).eq(0).find("."+f);e[0].disabled||("all"===e.attr("lay-type")&&a.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=t)}),setTimeout(function(){n.renderCheckBtn({stopNone:!0})},0))}),n.elem.on("dblclick","."+f+">li",function(e){var t=s(this),a=t.children('input[type="checkbox"]'),i=t.parent().parent();a[0].disabled||n.transfer(i.data("index"),t)}),n.layBtn.on("click",function(){var e=s(this),t=e.data("index");e.hasClass(h)||n.transfer(t)}),n.laySearch.find("input").on("keyup",function(){var i=this.value,e=s(this).parents("."+o).eq(0).siblings("."+f),t=e.children("li"),t=(t.each(function(){var e=s(this),t=e.find('input[type="checkbox"]'),a=t[0].title,a=("cs"!==l.showSearch&&(a=a.toLowerCase(),i=i.toLowerCase()),-1!==a.indexOf(i));e[a?"removeClass":"addClass"](d),t.data("hide",!a)}),n.renderCheckBtn(),t.length===e.children("li."+d).length);n.noneView(e,t?l.text.searchNone:"")})},l.that={},l.config={},i.reload=function(e,t){e=l.that[e];return e.reload(t),l.call(e)},i.getData=function(e){return l.that[e].getData()},i.render=function(e){e=new v(e);return l.call(e)},e(a,i)});layui.define("jquery",function(e){"use strict";var a=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,r,e,i)}}),r="carousel",d="layui-this",s="layui-carousel-left",u="layui-carousel-right",c="layui-carousel-prev",m="layui-carousel-next",t="layui-carousel-arrow",o="layui-carousel-ind",i=function(e){var i=this;i.config=a.extend({},i.config,n.config,e),i.render()};i.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},i.prototype.render=function(){var e=this,i=e.config;i.elem=a(i.elem),i.elem[0]&&(e.elemItem=i.elem.find(">*[carousel-item]>*"),i.index<0&&(i.index=0),i.index>=e.elemItem.length&&(i.index=e.elemItem.length-1),i.interval<800&&(i.interval=800),i.full?i.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):i.elem.css({width:i.width,height:i.height}),i.elem.attr("lay-anim",i.anim),e.elemItem.eq(i.index).addClass(d),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},i.prototype.reload=function(e){var i=this;clearInterval(i.timer),i.config=a.extend({},i.config,e),i.render()},i.prototype.prevIndex=function(){var e=this.config.index-1;return e=e<0?this.elemItem.length-1:e},i.prototype.nextIndex=function(){var e=this.config.index+1;return e=e>=this.elemItem.length?0:e},i.prototype.addIndex=function(e){var i=this.config;i.index=i.index+(e=e||1),i.index>=this.elemItem.length&&(i.index=0)},i.prototype.subIndex=function(e){var i=this.config;i.index=i.index-(e=e||1),i.index<0&&(i.index=this.elemItem.length-1)},i.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},i.prototype.arrow=function(){var i=this,e=i.config,n=a(['",'"].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+t)[0]&&e.elem.find("."+t).remove(),e.elem.append(n),n.on("click",function(){var e=a(this).attr("lay-type");i.slide(e)})},i.prototype.jump=function(e){var i=this,n=i.config;e>n.index?i.slide("add",e-n.index):e
            ',(i=[],layui.each(e.elemItem,function(e){i.push("")}),i.join("")),"
          "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+o)[0]&&n.elem.find("."+o).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-t.height()/2),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){e.jump(a(this).index())})},i.prototype.slide=function(e,i){var n=this,t=n.elemItem,a=n.config,o=a.index,l=a.elem.attr("lay-filter");n.haveSlide||("sub"===e?(n.subIndex(i),t.eq(a.index).addClass(c),setTimeout(function(){t.eq(o).addClass(u),t.eq(a.index).addClass(u)},50)):(n.addIndex(i),t.eq(a.index).addClass(m),setTimeout(function(){t.eq(o).addClass(s),t.eq(a.index).addClass(s)},50)),setTimeout(function(){t.removeClass(d+" "+c+" "+m+" "+s+" "+u),t.eq(a.index).addClass(d),n.haveSlide=!1},300),n.elemInd.find("li").eq(a.index).addClass(d).siblings().removeClass(d),n.haveSlide=!0,e={index:a.index,prevIndex:o,item:t.eq(a.index)},"function"==typeof a.change&&a.change(e),layui.event.call(this,r,"change("+l+")",e))},i.prototype.events=function(){var e=this,i=e.config;i.elem.data("haveEvents")||(i.elem.on("mouseenter",function(){"always"!==e.config.autoplay&&clearInterval(e.timer)}).on("mouseleave",function(){"always"!==e.config.autoplay&&e.autoplay()}),i.elem.data("haveEvents",!0))},n.render=function(e){return new i(e)},e(r,n)});layui.define("jquery",function(e){"use strict";var u=layui.jquery,l={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var a=this;return a.config=u.extend({},a.config,e),a},on:function(e,a){return layui.onevent.call(this,i,e,a)}},i="rate",c="layui-icon-rate",r="layui-icon-rate-solid",o="layui-icon-rate-half",s="layui-icon-rate-solid layui-icon-rate-half",f="layui-icon-rate layui-icon-rate-half",a=function(e){var a=this;a.index=++l.index,a.config=u.extend({},a.config,l.config,e),a.render()};a.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},a.prototype.render=function(){for(var e=this,a=e.config,l=a.theme?'style="color: '+a.theme+';"':"",i=(a.elem=u(a.elem),a.value>a.length&&(a.value=a.length),parseInt(a.value)===a.value||a.half||(a.value=Math.ceil(a.value)-a.value<.5?Math.ceil(a.value):Math.floor(a.value)),'
            "),n=1;n<=a.length;n++){var t='
          • ";a.half&&parseInt(a.value)!==a.value&&n==Math.ceil(a.value)?i=i+'
          • ":i+=t}i+="
          "+(a.text?''+a.value+"\u661f":"")+"";var o=a.elem,s=o.next(".layui-rate");s[0]&&s.remove(),e.elemTemp=u(i),a.span=e.elemTemp.next("span"),a.setText&&a.setText(a.value),o.html(e.elemTemp),o.addClass("layui-inline"),a.readonly||e.action()},a.prototype.setvalue=function(e){this.config.value=e,this.render()},a.prototype.action=function(){var i=this.config,n=this.elemTemp,t=n.find("i").width();n.children("li").each(function(e){var a=e+1,l=u(this);l.on("click",function(e){i.value=a,i.half&&e.pageX-u(this).offset().left<=t/2&&(i.value=i.value-.5),i.text&&n.next("span").text(i.value+"\u661f"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),l.on("mousemove",function(e){n.find("i").each(function(){u(this).addClass(c).removeClass(s)}),n.find("i:lt("+a+")").each(function(){u(this).addClass(r).removeClass(f)}),i.half&&e.pageX-u(this).offset().left<=t/2&&l.children("i").addClass(o).removeClass(r)}),l.on("mouseleave",function(){n.find("i").each(function(){u(this).addClass(c).removeClass(s)}),n.find("i:lt("+Math.floor(i.value)+")").each(function(){u(this).addClass(r).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&n.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(o).removeClass("layui-icon-rate-solid layui-icon-rate")})})},a.prototype.events=function(){this.config},l.render=function(e){e=new a(e);return function(){var a=this;return{setvalue:function(e){a.setvalue.call(a,e)},config:a.config}}.call(e)},e(i,l)});layui.define("jquery",function(l){"use strict";var g=layui.$,e=function(l){};e.prototype.load=function(l){var t,i,n,e,r,o,a,c,m,s,u,f,y,d=this,p=0,h=g((l=l||{}).elem);if(h[0])return e=g(l.scrollElem||document),r=l.mb||50,o=!("isAuto"in l)||l.isAuto,a=l.end||"\u6ca1\u6709\u66f4\u591a\u4e86",c=l.scrollElem&&l.scrollElem!==document,m="\u52a0\u8f7d\u66f4\u591a",s=g('"),h.find(".layui-flow-more")[0]||h.append(s),u=function(l,e){l=g(l),s.before(l),(e=0==e||null)?s.html(a):s.find("a").html(m),i=e,t=null,y&&y()},f=function(){t=!0,s.find("a").html(''),"function"==typeof l.done&&l.done(++p,u)},f(),s.find("a").on("click",function(){g(this);i||t||f()}),l.isLazyimg&&(y=d.lazyimg({elem:l.elem+" img",scrollElem:l.scrollElem})),o&&e.on("scroll",function(){var e=g(this),o=e.scrollTop();n&&clearTimeout(n),!i&&h.width()&&(n=setTimeout(function(){var l=(c?e:g(window)).height();(c?e.prop("scrollHeight"):document.documentElement.scrollHeight)-o-l<=r&&(t||f())},100))}),d},e.prototype.lazyimg=function(l){var e,c=this,m=0,s=g((l=l||{}).scrollElem||document),u=l.elem||"img",f=l.scrollElem&&l.scrollElem!==document,y=function(e,l){var o,t=s.scrollTop(),l=t+l,i=f?e.offset().top-s.offset().top+t:e.offset().top;t<=i&&i<=l&&e.attr("lay-src")&&(o=e.attr("lay-src"),layui.img(o,function(){var l=c.lazyimg.elem.eq(m);e.attr("src",o).removeAttr("lay-src"),l[0]&&n(l),m++},function(){c.lazyimg.elem.eq(m);e.removeAttr("lay-src")}))},n=function(l,e){var o=(f?e||s:g(window)).height(),t=s.scrollTop(),i=t+o;if(c.lazyimg.elem=g(u),l)y(l,o);else for(var n=0;n'),n=d('
          ');t.addClass("layui-code-view layui-box"),l.skin&&("notepad"===l.skin&&(l.skin="dark"),t.addClass("layui-code-"+l.skin)),i=(i=l.encode?o.escape(i):i).replace(/[\r\t\n]+/g,"
        • "),t.html(s.html("
        • "+i+"
        • ")),t.children("."+u)[0]||(n.html(l.title+(l.about?'
          '+l.about+"
          ":"")),t.prepend(n)),0<(i=Math.floor(s.find("li").length/100))&&s.css("margin-left",i+"px"),l.height&&s.css("max-height",l.height)})})}),layui["layui.all"]||layui.addcss("modules/code.css?v=3","skincodecss"); \ No newline at end of file diff --git a/public/static/plugs/layui_exts/excel.js b/public/static/plugs/layui_exts/excel.js deleted file mode 100644 index 34f91861e..000000000 --- a/public/static/plugs/layui_exts/excel.js +++ /dev/null @@ -1,10 +0,0 @@ -!function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=343)}([function(e,t,r){var n=r(2),a=r(22),i=r(13),s=r(12),o=r(21),c=function(e,t,r){var l,f,u,h,d=e&c.F,p=e&c.G,g=e&c.S,m=e&c.P,v=e&c.B,b=p?n:g?n[t]||(n[t]={}):(n[t]||{}).prototype,w=p?a:a[t]||(a[t]={}),E=w.prototype||(w.prototype={});for(l in p&&(r=t),r)u=((f=!d&&b&&void 0!==b[l])?b:r)[l],h=v&&f?o(u,n):m&&"function"==typeof u?o(Function.call,u):u,b&&s(b,l,u,e&c.U),w[l]!=u&&i(w,l,h),m&&E[l]!=u&&(E[l]=u)};n.core=a,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,t,r){var n=r(4);e.exports=function(e){if(!n(e))throw TypeError(e+" is not an object!");return e}},function(e,t){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,r){var n=r(52)("wks"),a=r(41),i=r(2).Symbol,s="function"==typeof i;(e.exports=function(e){return n[e]||(n[e]=s&&i[e]||(s?i:a)("Symbol."+e))}).store=n},function(e,t,r){var n=r(19),a=Math.min;e.exports=function(e){return e>0?a(n(e),9007199254740991):0}},function(e,t,r){e.exports=!r(3)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,r){var n=r(1),a=r(130),i=r(26),s=Object.defineProperty;t.f=r(7)?Object.defineProperty:function(e,t,r){if(n(e),t=i(t,!0),n(r),a)try{return s(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){var n=r(25);e.exports=function(e){return Object(n(e))}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,r){var n=r(0),a=r(3),i=r(25),s=/"/g,o=function(e,t,r,n){var a=String(i(e)),o="<"+t;return""!==r&&(o+=" "+r+'="'+String(n).replace(s,""")+'"'),o+">"+a+""};e.exports=function(e,t){var r={};r[e]=t(o),n(n.P+n.F*a(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",r)}},function(e,t,r){var n=r(2),a=r(13),i=r(17),s=r(41)("src"),o=r(339),c=(""+o).split("toString");r(22).inspectSource=function(e){return o.call(e)},(e.exports=function(e,t,r,o){var l="function"==typeof r;l&&(i(r,"name")||a(r,"name",t)),e[t]!==r&&(l&&(i(r,s)||a(r,s,e[t]?""+e[t]:c.join(String(t)))),e===n?e[t]=r:o?e[t]?e[t]=r:a(e,t,r):(delete e[t],a(e,t,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[s]||o.call(this)})},function(e,t,r){var n=r(8),a=r(42);e.exports=r(7)?function(e,t,r){return n.f(e,t,a(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){var n=r(17),a=r(9),i=r(91)("IE_PROTO"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=a(e),n(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,r){var n=r(50),a=r(42),i=r(16),s=r(26),o=r(17),c=r(130),l=Object.getOwnPropertyDescriptor;t.f=r(7)?l:function(e,t){if(e=i(e),t=s(t,!0),c)try{return l(e,t)}catch(e){}if(o(e,t))return a(!n.f.call(e,t),e[t])}},function(e,t,r){var n=r(51),a=r(25);e.exports=function(e){return n(a(e))}},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){"use strict";var n=r(3);e.exports=function(e,t){return!!e&&n(function(){t?e.call(null,function(){},1):e.call(null)})}},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,r){var n=r(10);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,a){return e.call(t,r,n,a)}}return function(){return e.apply(t,arguments)}}},function(e,t){var r=e.exports={version:"2.6.11"};"number"==typeof __e&&(__e=r)},function(e,t,r){var n=r(21),a=r(51),i=r(9),s=r(6),o=r(75);e.exports=function(e,t){var r=1==e,c=2==e,l=3==e,f=4==e,u=6==e,h=5==e||u,d=t||o;return function(t,o,p){for(var g,m,v=i(t),b=a(v),w=n(o,p,3),E=s(b.length),S=0,y=r?d(t,E):c?d(t,0):void 0;E>S;S++)if((h||S in b)&&(m=w(g=b[S],S,v),e))if(r)y[S]=m;else if(m)switch(e){case 3:return!0;case 5:return g;case 6:return S;case 2:y.push(g)}else if(f)return!1;return u?-1:l||f?f:y}}},function(e,t,r){var n=r(0),a=r(22),i=r(3);e.exports=function(e,t){var r=(a.Object||{})[e]||Object[e],s={};s[e]=t(r),n(n.S+n.F*i(function(){r(1)}),"Object",s)}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){var n=r(4);e.exports=function(e,t){if(!n(e))return e;var r,a;if(t&&"function"==typeof(r=e.toString)&&!n(a=r.call(e)))return a;if("function"==typeof(r=e.valueOf)&&!n(a=r.call(e)))return a;if(!t&&"function"==typeof(r=e.toString)&&!n(a=r.call(e)))return a;throw TypeError("Can't convert object to primitive value")}},function(e,t,r){var n=r(107),a=r(0),i=r(52)("metadata"),s=i.store||(i.store=new(r(104))),o=function(e,t,r){var a=s.get(e);if(!a){if(!r)return;s.set(e,a=new n)}var i=a.get(t);if(!i){if(!r)return;a.set(t,i=new n)}return i};e.exports={store:s,map:o,has:function(e,t,r){var n=o(t,r,!1);return void 0!==n&&n.has(e)},get:function(e,t,r){var n=o(t,r,!1);return void 0===n?void 0:n.get(e)},set:function(e,t,r,n){o(r,n,!0).set(e,t)},keys:function(e,t){var r=o(e,t,!1),n=[];return r&&r.forEach(function(e,t){n.push(t)}),n},key:function(e){return void 0===e||"symbol"==typeof e?e:String(e)},exp:function(e){a(a.S,"Reflect",e)}}},function(e,t,r){"use strict";if(r(7)){var n=r(31),a=r(2),i=r(3),s=r(0),o=r(56),c=r(67),l=r(21),f=r(35),u=r(42),h=r(13),d=r(33),p=r(19),g=r(6),m=r(102),v=r(39),b=r(26),w=r(17),E=r(45),S=r(4),y=r(9),_=r(78),C=r(38),x=r(14),T=r(37).f,B=r(76),k=r(41),A=r(5),I=r(23),R=r(66),O=r(48),F=r(73),P=r(43),D=r(61),N=r(36),M=r(74),L=r(113),U=r(8),W=r(15),V=U.f,H=W.f,z=a.RangeError,X=a.TypeError,G=a.Uint8Array,j=Array.prototype,Y=c.ArrayBuffer,$=c.DataView,K=I(0),Z=I(2),J=I(3),Q=I(4),q=I(5),ee=I(6),te=R(!0),re=R(!1),ne=F.values,ae=F.keys,ie=F.entries,se=j.lastIndexOf,oe=j.reduce,ce=j.reduceRight,le=j.join,fe=j.sort,ue=j.slice,he=j.toString,de=j.toLocaleString,pe=A("iterator"),ge=A("toStringTag"),me=k("typed_constructor"),ve=k("def_constructor"),be=o.CONSTR,we=o.TYPED,Ee=o.VIEW,Se=I(1,function(e,t){return Te(O(e,e[ve]),t)}),ye=i(function(){return 1===new G(new Uint16Array([1]).buffer)[0]}),_e=!!G&&!!G.prototype.set&&i(function(){new G(1).set({})}),Ce=function(e,t){var r=p(e);if(r<0||r%t)throw z("Wrong offset!");return r},xe=function(e){if(S(e)&&we in e)return e;throw X(e+" is not a typed array!")},Te=function(e,t){if(!(S(e)&&me in e))throw X("It is not a typed array constructor!");return new e(t)},Be=function(e,t){return ke(O(e,e[ve]),t)},ke=function(e,t){for(var r=0,n=t.length,a=Te(e,n);n>r;)a[r]=t[r++];return a},Ae=function(e,t,r){V(e,t,{get:function(){return this._d[r]}})},Ie=function(e){var t,r,n,a,i,s,o=y(e),c=arguments.length,f=c>1?arguments[1]:void 0,u=void 0!==f,h=B(o);if(void 0!=h&&!_(h)){for(s=h.call(o),n=[],t=0;!(i=s.next()).done;t++)n.push(i.value);o=n}for(u&&c>2&&(f=l(f,arguments[2],2)),t=0,r=g(o.length),a=Te(this,r);r>t;t++)a[t]=u?f(o[t],t):o[t];return a},Re=function(){for(var e=0,t=arguments.length,r=Te(this,t);t>e;)r[e]=arguments[e++];return r},Oe=!!G&&i(function(){de.call(new G(1))}),Fe=function(){return de.apply(Oe?ue.call(xe(this)):xe(this),arguments)},Pe={copyWithin:function(e,t){return L.call(xe(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Q(xe(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return M.apply(xe(this),arguments)},filter:function(e){return Be(this,Z(xe(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return q(xe(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return ee(xe(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){K(xe(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return re(xe(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return te(xe(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return le.apply(xe(this),arguments)},lastIndexOf:function(e){return se.apply(xe(this),arguments)},map:function(e){return Se(xe(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return oe.apply(xe(this),arguments)},reduceRight:function(e){return ce.apply(xe(this),arguments)},reverse:function(){for(var e,t=xe(this).length,r=Math.floor(t/2),n=0;n1?arguments[1]:void 0)},sort:function(e){return fe.call(xe(this),e)},subarray:function(e,t){var r=xe(this),n=r.length,a=v(e,n);return new(O(r,r[ve]))(r.buffer,r.byteOffset+a*r.BYTES_PER_ELEMENT,g((void 0===t?n:v(t,n))-a))}},De=function(e,t){return Be(this,ue.call(xe(this),e,t))},Ne=function(e){xe(this);var t=Ce(arguments[1],1),r=this.length,n=y(e),a=g(n.length),i=0;if(a+t>r)throw z("Wrong length!");for(;i255?255:255&n),a.v[d](r*t+a.o,n,ye)}(this,r,e)},enumerable:!0})};w?(p=r(function(e,r,n,a){f(e,p,l,"_d");var i,s,o,c,u=0,d=0;if(S(r)){if(!(r instanceof Y||"ArrayBuffer"==(c=E(r))||"SharedArrayBuffer"==c))return we in r?ke(p,r):Ie.call(p,r);i=r,d=Ce(n,t);var v=r.byteLength;if(void 0===a){if(v%t)throw z("Wrong length!");if((s=v-d)<0)throw z("Wrong length!")}else if((s=g(a)*t)+d>v)throw z("Wrong length!");o=s/t}else o=m(r),i=new Y(s=o*t);for(h(e,"_d",{b:i,o:d,l:s,e:o,v:new $(i)});uw;w++)if((m=t?b(s(p=e[w])[0],p[1]):b(e[w]))===l||m===f)return m}else for(g=v.call(e);!(p=g.next()).done;)if((m=a(g,b,p.value,t))===l||m===f)return m}).BREAK=l,t.RETURN=f},function(e,t){e.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},function(e,t,r){"use strict";var n=r(2),a=r(8),i=r(7),s=r(5)("species");e.exports=function(e){var t=n[e];i&&t&&!t[s]&&a.f(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,r){var n=r(128),a=r(90).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,a)}},function(e,t,r){var n=r(1),a=r(127),i=r(90),s=r(91)("IE_PROTO"),o=function(){},c=function(){var e,t=r(93)("iframe"),n=i.length;for(t.style.display="none",r(89).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("