From 5712b2b339dbdb9b3a0bdb9ecb3bdcfdd8120fee Mon Sep 17 00:00:00 2001 From: huangjiajun <582604932@qq.com> Date: Wed, 11 Sep 2024 09:18:05 +0800 Subject: [PATCH] 1 --- .gitignore | 2 + .idea/community_team.iml | 9 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + Dockerfile | 37 + Dockerfile-prd | 39 + Dockerfile-task | 38 + Makefile | 32 + README.md | 49 + app/cfg/cfg_app.go | 122 + app/cfg/cfg_cache_key.go | 3 + app/cfg/cfg_task.go | 4 + app/cfg/init_cache.go | 9 + app/cfg/init_cache_second.go | 9 + app/cfg/init_cfg.go | 81 + app/cfg/init_es.go | 12 + app/cfg/init_log.go | 20 + app/cfg/init_rabbitmq.go | 28 + app/cfg/init_task.go | 53 + app/db/db.go | 105 + app/db/db_cate.go | 15 + app/db/db_cloud_bundle.go | 111 + app/db/db_coupon.go | 1 + app/db/db_goods.go | 31 + app/db/db_goods_sku.go | 15 + app/db/db_order.go | 72 + app/db/db_store.go | 86 + app/db/db_sys_cfg.go | 120 + app/db/db_sys_mod.go | 688 +++ app/db/db_sys_mod_format_img.go | 194 + app/db/db_user.go | 395 ++ app/db/db_user_fin_flow.go | 103 + app/db/db_user_level.go | 226 + app/db/db_user_profile.go | 578 +++ app/db/db_user_relate.go | 249 + app/db/dbs.go | 104 + app/db/dbs_map.go | 232 + app/db/dbs_sys_cfg.go | 55 + app/db/model/cloud_bundle.go | 19 + app/db/model/community_team_cate.go | 10 + app/db/model/community_team_coupon.go | 27 + app/db/model/community_team_coupon_user.go | 25 + app/db/model/community_team_goods.go | 29 + app/db/model/community_team_order.go | 37 + app/db/model/community_team_order_info.go | 13 + app/db/model/community_team_sku.go | 20 + app/db/model/community_team_store.go | 24 + app/db/model/community_team_store_like.go | 12 + app/db/model/db_mapping.go | 18 + app/db/model/fin_user_flow.go | 30 + app/db/model/sys_cfg.go | 7 + app/db/model/sys_module.go | 35 + app/db/model/sys_popup.go | 28 + app/db/model/sys_push_app.go | 22 + app/db/model/sys_push_sms.go | 19 + app/db/model/sys_push_template.go | 17 + app/db/model/sys_push_user.go | 18 + app/db/model/sys_template.go | 20 + app/db/model/user.go | 37 + app/db/model/user_app_domain.go | 8 + app/db/model/user_app_list.go | 8 + app/db/model/user_level.go | 23 + app/db/model/user_profile.go | 102 + app/db/model/user_relate.go | 13 + app/db/model/virtual_coin.go | 17 + app/db/model/virtual_coin_relate.go | 17 + app/db/model/wx_applet_list.go | 44 + app/db/offical/db_sys_cfg.go | 23 + app/db/offical/db_user_app_list.go | 15 + app/db/offical/model/master_list_cfg.go | 9 + app/db/offical/model/sys_cfg.go | 7 + app/db/offical/model/user_app_list.go | 33 + app/db/wechat_applet_info.go | 166 + app/db/zhimeng_db.go | 42 + app/e/code.go | 244 + app/e/error.go | 72 + app/e/msg.go | 212 + app/e/set_cache.go | 8 + app/enum/enum_merchant_coupon_scheme.go | 190 + app/hdl/hdl_cate.go | 10 + app/hdl/hdl_goods.go | 16 + app/hdl/hdl_order.go | 28 + app/hdl/hdl_pay.go | 37 + app/hdl/hdl_store.go | 29 + app/hdl/hdl_store_order.go | 19 + app/lib/alipay/api.go | 334 ++ app/lib/arkid/api.go | 148 + app/lib/arkid/base.go | 6 + app/lib/arkid/init.go | 24 + app/lib/arkid/model.go | 62 + app/lib/arkid/sdk.go | 165 + app/lib/auth/base.go | 25 + app/lib/mob/api.go | 297 ++ app/lib/mob/main.go | 15 + app/lib/qiniu/bucket_create.go | 16 + app/lib/qiniu/bucket_delete.go | 18 + app/lib/qiniu/bucket_get_domain.go | 18 + app/lib/qiniu/init.go | 22 + app/lib/qiniu/req_img_upload.go | 55 + app/lib/sms/sms.go | 122 + app/lib/weapp/LICENSE | 201 + app/lib/weapp/Readme.md | 2992 ++++++++++++ app/lib/weapp/analysis.go | 211 + app/lib/weapp/analysis_retain.go | 67 + app/lib/weapp/analysis_retain_test.go | 208 + app/lib/weapp/analysis_test.go | 466 ++ app/lib/weapp/analysis_visit_trend.go | 71 + app/lib/weapp/analysis_visit_trend_test.go | 194 + app/lib/weapp/auth.go | 218 + app/lib/weapp/auth_test.go | 181 + app/lib/weapp/common_error.go | 34 + app/lib/weapp/crypto.go | 114 + app/lib/weapp/customer_service_message.go | 268 ++ .../weapp/customer_service_message_test.go | 343 ++ app/lib/weapp/decrypt.go | 154 + app/lib/weapp/express.go | 66 + app/lib/weapp/express_business.go | 432 ++ app/lib/weapp/express_business_test.go | 954 ++++ app/lib/weapp/express_provider.go | 154 + app/lib/weapp/express_provider_test.go | 1332 ++++++ app/lib/weapp/face_identify.go | 46 + app/lib/weapp/img.go | 188 + app/lib/weapp/img_test.go | 474 ++ app/lib/weapp/immediate_delivery.go | 479 ++ app/lib/weapp/immediate_delivery_test.go | 2041 ++++++++ app/lib/weapp/nearby_poi.go | 231 + app/lib/weapp/nearby_poi_test.go | 348 ++ app/lib/weapp/ocr.go | 386 ++ app/lib/weapp/ocr_test.go | 894 ++++ app/lib/weapp/plugin.go | 189 + app/lib/weapp/plugin_test.go | 300 ++ app/lib/weapp/qr_code.go | 118 + app/lib/weapp/qr_code_test.go | 212 + app/lib/weapp/search_submit_pages.go | 35 + app/lib/weapp/search_submit_pages_test.go | 69 + app/lib/weapp/sec_check.go | 105 + app/lib/weapp/sec_check_test.go | 240 + app/lib/weapp/server.go | 677 +++ app/lib/weapp/server_types.go | 660 +++ app/lib/weapp/soter.go | 41 + app/lib/weapp/soter_test.go | 67 + app/lib/weapp/subscribe_message.go | 277 ++ app/lib/weapp/subscribe_message_test.go | 75 + app/lib/weapp/title.png | Bin 0 -> 33037 bytes app/lib/weapp/uniform_message.go | 73 + app/lib/weapp/uniform_message_test.go | 102 + app/lib/weapp/updatable_message.go | 99 + app/lib/weapp/updatable_message_test.go | 129 + app/lib/weapp/util.go | 149 + app/lib/weapp/weapp.go | 12 + app/lib/wechat/.gitignore | 2 + app/lib/wxpay/.gitignore | 0 app/lib/wxpay/api.go | 303 ++ app/md/alipay.go | 69 + app/md/app_redis_key.go | 23 + app/md/cfg_key.go | 282 ++ app/md/md_order.go | 47 + app/md/pay.go | 60 + app/md/platform.go | 40 + app/md/user_info.go | 43 + app/md/wxpay.go | 30 + app/mw/mw_access_log.go | 31 + app/mw/mw_auth.go | 72 + app/mw/mw_auth_jwt.go | 122 + app/mw/mw_breaker.go | 30 + app/mw/mw_change_header.go | 18 + app/mw/mw_check_sign.go | 37 + app/mw/mw_checker.go | 22 + app/mw/mw_cors.go | 29 + app/mw/mw_csrf.go | 136 + app/mw/mw_db.go | 149 + app/mw/mw_limiter.go | 77 + app/mw/mw_limiter_newcomers.go | 77 + app/mw/mw_recovery.go | 57 + app/router/router.go | 72 + app/svc/svc_alipay.go | 106 + app/svc/svc_auth.go | 69 + app/svc/svc_balance.go | 74 + app/svc/svc_cate.go | 24 + app/svc/svc_comm.go | 25 + app/svc/svc_db.go | 11 + app/svc/svc_default_user.go | 50 + app/svc/svc_domain_info.go | 206 + app/svc/svc_file_img_format.go | 81 + app/svc/svc_goods.go | 75 + app/svc/svc_order.go | 656 +++ app/svc/svc_pay.go | 21 + app/svc/svc_pay_community_team.go | 142 + app/svc/svc_redis_mutex_lock.go | 100 + app/svc/svc_store.go | 135 + app/svc/svc_store_order.go | 277 ++ app/svc/svc_sys_cfg_get.go | 218 + app/svc/svc_wx.go | 103 + app/task/init.go | 300 ++ app/utils/aes.go | 172 + app/utils/auth.go | 46 + app/utils/base64.go | 117 + app/utils/boolean.go | 26 + app/utils/cache/base.go | 421 ++ app/utils/cache/cache/cache.go | 107 + app/utils/cache/cache/conv.go | 86 + app/utils/cache/cache/file.go | 241 + app/utils/cache/cache/memory.go | 239 + app/utils/cache/redis.go | 403 ++ app/utils/cache/redis_cluster.go | 622 +++ app/utils/cache/redis_pool.go | 324 ++ app/utils/cache/redis_pool_cluster.go | 617 +++ app/utils/cachesecond/base.go | 421 ++ app/utils/cachesecond/cache/cache.go | 107 + app/utils/cachesecond/cache/conv.go | 86 + app/utils/cachesecond/cache/file.go | 241 + app/utils/cachesecond/cache/memory.go | 239 + app/utils/cachesecond/redis.go | 406 ++ app/utils/cachesecond/redis_cluster.go | 622 +++ app/utils/cachesecond/redis_pool.go | 324 ++ app/utils/cachesecond/redis_pool_cluster.go | 617 +++ app/utils/convert.go | 434 ++ app/utils/crypto.go | 19 + app/utils/curl.go | 209 + app/utils/debug.go | 25 + app/utils/distance.go | 16 + app/utils/duplicate.go | 37 + app/utils/file.go | 22 + app/utils/file_and_dir.go | 29 + app/utils/format.go | 197 + app/utils/json.go | 37 + app/utils/logx/log.go | 245 + app/utils/logx/output.go | 105 + app/utils/logx/sugar.go | 192 + app/utils/map_and_struct.go | 341 ++ app/utils/map_to_map.go | 112 + app/utils/md5.go | 12 + app/utils/open_platform.go | 135 + app/utils/qrcode/decodeFile.go | 33 + app/utils/qrcode/getBase64.go | 55 + app/utils/qrcode/saveFile.go | 85 + app/utils/qrcode/writeWeb.go | 39 + app/utils/rand.go | 77 + app/utils/redis.go | 32 + app/utils/rpc_client.go | 60 + app/utils/rsa.go | 231 + app/utils/serialize.go | 23 + app/utils/shuffle.go | 48 + app/utils/sign_check.go | 216 + app/utils/slice.go | 13 + app/utils/slice_and_string.go | 47 + app/utils/string.go | 223 + app/utils/struct2UrlParams.go | 43 + app/utils/time.go | 239 + app/utils/translate.go | 110 + app/utils/trim_html.go | 38 + app/utils/uuid.go | 61 + applet.sql | 133 + bin/.gitignore | 2 + build.sh | 18 + cmd/task/main.go | 44 + cmd_db.bat | 25 + cmd_db.sh | 21 + cmd_run.bat | 12 + cmd_run.sh | 8 + cmd_task.bat | 13 + cmd_task.sh | 9 + docs/docs.go | 1708 +++++++ docs/swagger.json | 1646 +++++++ docs/swagger.yaml | 1084 +++++ etc/cfg.yml | 97 + etc/db_tpl/config | 7 + etc/db_tpl/struct.go.tpl | 17 + etc/nginx.conf | 28 + etc/task.yml | 60 + flags/flag.go | 41 + go.mod | 79 + go.sum | 1544 +++++++ main.go | 98 + pkg/pb/im.business.ext.pb.go | 1853 ++++++++ pkg/pb/im.business.int.pb.go | 595 +++ pkg/pb/im.common.ext.pb.go | 131 + pkg/pb/im.connect.ext.pb.go | 2461 ++++++++++ pkg/pb/im.connect.int.pb.go | 395 ++ pkg/pb/im.logic.ext.pb.go | 3587 ++++++++++++++ pkg/pb/im.logic.int.pb.go | 1547 +++++++ pkg/pb/im.push.ext.pb.go | 623 +++ pkg/proto/im.business.ext.proto | 128 + pkg/proto/im.business.int.proto | 34 + pkg/proto/im.common.ext.proto | 5 + pkg/proto/im.connect.ext.proto | 232 + pkg/proto/im.connect.int.proto | 28 + pkg/proto/im.logic.ext.proto | 238 + pkg/proto/im.logic.int.proto | 102 + pkg/proto/im.push.ext.proto | 58 + static/bat/phone.dat | Bin 0 -> 4098913 bytes static/bat/sat.txt | 2 + test/aces_test.go | 52 + test/toke_test.go | 35 + test/zhimeng_api.go | 156 + tmp/%s.log | 0 tmp/debug.log | 117 + tmp/fnuoos_test1.log | 143 + tmp/init_es.log | 16 + tmp/init_rabbit_mq.log | 16 + tmp/zyos_website.log | 4114 +++++++++++++++++ wap.conf | 35 + 302 files changed, 62725 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/community_team.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 Dockerfile create mode 100644 Dockerfile-prd create mode 100644 Dockerfile-task create mode 100644 Makefile create mode 100644 README.md create mode 100644 app/cfg/cfg_app.go create mode 100644 app/cfg/cfg_cache_key.go create mode 100644 app/cfg/cfg_task.go create mode 100644 app/cfg/init_cache.go create mode 100644 app/cfg/init_cache_second.go create mode 100644 app/cfg/init_cfg.go create mode 100644 app/cfg/init_es.go create mode 100644 app/cfg/init_log.go create mode 100644 app/cfg/init_rabbitmq.go create mode 100644 app/cfg/init_task.go create mode 100644 app/db/db.go create mode 100644 app/db/db_cate.go create mode 100644 app/db/db_cloud_bundle.go create mode 100644 app/db/db_coupon.go create mode 100644 app/db/db_goods.go create mode 100644 app/db/db_goods_sku.go create mode 100644 app/db/db_order.go create mode 100644 app/db/db_store.go create mode 100644 app/db/db_sys_cfg.go create mode 100644 app/db/db_sys_mod.go create mode 100644 app/db/db_sys_mod_format_img.go create mode 100644 app/db/db_user.go create mode 100644 app/db/db_user_fin_flow.go create mode 100644 app/db/db_user_level.go create mode 100644 app/db/db_user_profile.go create mode 100644 app/db/db_user_relate.go create mode 100644 app/db/dbs.go create mode 100644 app/db/dbs_map.go create mode 100644 app/db/dbs_sys_cfg.go create mode 100644 app/db/model/cloud_bundle.go create mode 100644 app/db/model/community_team_cate.go create mode 100644 app/db/model/community_team_coupon.go create mode 100644 app/db/model/community_team_coupon_user.go create mode 100644 app/db/model/community_team_goods.go create mode 100644 app/db/model/community_team_order.go create mode 100644 app/db/model/community_team_order_info.go create mode 100644 app/db/model/community_team_sku.go create mode 100644 app/db/model/community_team_store.go create mode 100644 app/db/model/community_team_store_like.go create mode 100644 app/db/model/db_mapping.go create mode 100644 app/db/model/fin_user_flow.go create mode 100644 app/db/model/sys_cfg.go create mode 100644 app/db/model/sys_module.go create mode 100644 app/db/model/sys_popup.go create mode 100644 app/db/model/sys_push_app.go create mode 100644 app/db/model/sys_push_sms.go create mode 100644 app/db/model/sys_push_template.go create mode 100644 app/db/model/sys_push_user.go create mode 100644 app/db/model/sys_template.go create mode 100644 app/db/model/user.go create mode 100644 app/db/model/user_app_domain.go create mode 100644 app/db/model/user_app_list.go create mode 100644 app/db/model/user_level.go create mode 100644 app/db/model/user_profile.go create mode 100644 app/db/model/user_relate.go create mode 100644 app/db/model/virtual_coin.go create mode 100644 app/db/model/virtual_coin_relate.go create mode 100644 app/db/model/wx_applet_list.go create mode 100644 app/db/offical/db_sys_cfg.go create mode 100644 app/db/offical/db_user_app_list.go create mode 100644 app/db/offical/model/master_list_cfg.go create mode 100644 app/db/offical/model/sys_cfg.go create mode 100644 app/db/offical/model/user_app_list.go create mode 100644 app/db/wechat_applet_info.go create mode 100644 app/db/zhimeng_db.go create mode 100644 app/e/code.go create mode 100644 app/e/error.go create mode 100644 app/e/msg.go create mode 100644 app/e/set_cache.go create mode 100644 app/enum/enum_merchant_coupon_scheme.go create mode 100644 app/hdl/hdl_cate.go create mode 100644 app/hdl/hdl_goods.go create mode 100644 app/hdl/hdl_order.go create mode 100644 app/hdl/hdl_pay.go create mode 100644 app/hdl/hdl_store.go create mode 100644 app/hdl/hdl_store_order.go create mode 100644 app/lib/alipay/api.go create mode 100644 app/lib/arkid/api.go create mode 100644 app/lib/arkid/base.go create mode 100644 app/lib/arkid/init.go create mode 100644 app/lib/arkid/model.go create mode 100644 app/lib/arkid/sdk.go create mode 100644 app/lib/auth/base.go create mode 100644 app/lib/mob/api.go create mode 100644 app/lib/mob/main.go create mode 100644 app/lib/qiniu/bucket_create.go create mode 100644 app/lib/qiniu/bucket_delete.go create mode 100644 app/lib/qiniu/bucket_get_domain.go create mode 100644 app/lib/qiniu/init.go create mode 100644 app/lib/qiniu/req_img_upload.go create mode 100644 app/lib/sms/sms.go create mode 100644 app/lib/weapp/LICENSE create mode 100644 app/lib/weapp/Readme.md create mode 100644 app/lib/weapp/analysis.go create mode 100644 app/lib/weapp/analysis_retain.go create mode 100644 app/lib/weapp/analysis_retain_test.go create mode 100644 app/lib/weapp/analysis_test.go create mode 100644 app/lib/weapp/analysis_visit_trend.go create mode 100644 app/lib/weapp/analysis_visit_trend_test.go create mode 100644 app/lib/weapp/auth.go create mode 100644 app/lib/weapp/auth_test.go create mode 100644 app/lib/weapp/common_error.go create mode 100644 app/lib/weapp/crypto.go create mode 100644 app/lib/weapp/customer_service_message.go create mode 100644 app/lib/weapp/customer_service_message_test.go create mode 100644 app/lib/weapp/decrypt.go create mode 100644 app/lib/weapp/express.go create mode 100644 app/lib/weapp/express_business.go create mode 100644 app/lib/weapp/express_business_test.go create mode 100644 app/lib/weapp/express_provider.go create mode 100644 app/lib/weapp/express_provider_test.go create mode 100644 app/lib/weapp/face_identify.go create mode 100644 app/lib/weapp/img.go create mode 100644 app/lib/weapp/img_test.go create mode 100644 app/lib/weapp/immediate_delivery.go create mode 100644 app/lib/weapp/immediate_delivery_test.go create mode 100644 app/lib/weapp/nearby_poi.go create mode 100644 app/lib/weapp/nearby_poi_test.go create mode 100644 app/lib/weapp/ocr.go create mode 100644 app/lib/weapp/ocr_test.go create mode 100644 app/lib/weapp/plugin.go create mode 100644 app/lib/weapp/plugin_test.go create mode 100644 app/lib/weapp/qr_code.go create mode 100644 app/lib/weapp/qr_code_test.go create mode 100644 app/lib/weapp/search_submit_pages.go create mode 100644 app/lib/weapp/search_submit_pages_test.go create mode 100644 app/lib/weapp/sec_check.go create mode 100644 app/lib/weapp/sec_check_test.go create mode 100644 app/lib/weapp/server.go create mode 100644 app/lib/weapp/server_types.go create mode 100644 app/lib/weapp/soter.go create mode 100644 app/lib/weapp/soter_test.go create mode 100644 app/lib/weapp/subscribe_message.go create mode 100644 app/lib/weapp/subscribe_message_test.go create mode 100644 app/lib/weapp/title.png create mode 100644 app/lib/weapp/uniform_message.go create mode 100644 app/lib/weapp/uniform_message_test.go create mode 100644 app/lib/weapp/updatable_message.go create mode 100644 app/lib/weapp/updatable_message_test.go create mode 100644 app/lib/weapp/util.go create mode 100644 app/lib/weapp/weapp.go create mode 100644 app/lib/wechat/.gitignore create mode 100644 app/lib/wxpay/.gitignore create mode 100644 app/lib/wxpay/api.go create mode 100644 app/md/alipay.go create mode 100644 app/md/app_redis_key.go create mode 100644 app/md/cfg_key.go create mode 100644 app/md/md_order.go create mode 100644 app/md/pay.go create mode 100644 app/md/platform.go create mode 100644 app/md/user_info.go create mode 100644 app/md/wxpay.go create mode 100644 app/mw/mw_access_log.go create mode 100644 app/mw/mw_auth.go create mode 100644 app/mw/mw_auth_jwt.go create mode 100644 app/mw/mw_breaker.go create mode 100644 app/mw/mw_change_header.go create mode 100644 app/mw/mw_check_sign.go create mode 100644 app/mw/mw_checker.go create mode 100644 app/mw/mw_cors.go create mode 100644 app/mw/mw_csrf.go create mode 100644 app/mw/mw_db.go create mode 100644 app/mw/mw_limiter.go create mode 100644 app/mw/mw_limiter_newcomers.go create mode 100644 app/mw/mw_recovery.go create mode 100644 app/router/router.go create mode 100644 app/svc/svc_alipay.go create mode 100644 app/svc/svc_auth.go create mode 100644 app/svc/svc_balance.go create mode 100644 app/svc/svc_cate.go create mode 100644 app/svc/svc_comm.go create mode 100644 app/svc/svc_db.go create mode 100644 app/svc/svc_default_user.go create mode 100644 app/svc/svc_domain_info.go create mode 100644 app/svc/svc_file_img_format.go create mode 100644 app/svc/svc_goods.go create mode 100644 app/svc/svc_order.go create mode 100644 app/svc/svc_pay.go create mode 100644 app/svc/svc_pay_community_team.go create mode 100644 app/svc/svc_redis_mutex_lock.go create mode 100644 app/svc/svc_store.go create mode 100644 app/svc/svc_store_order.go create mode 100644 app/svc/svc_sys_cfg_get.go create mode 100644 app/svc/svc_wx.go create mode 100644 app/task/init.go create mode 100644 app/utils/aes.go create mode 100644 app/utils/auth.go create mode 100644 app/utils/base64.go create mode 100644 app/utils/boolean.go create mode 100644 app/utils/cache/base.go create mode 100644 app/utils/cache/cache/cache.go create mode 100644 app/utils/cache/cache/conv.go create mode 100644 app/utils/cache/cache/file.go create mode 100644 app/utils/cache/cache/memory.go create mode 100644 app/utils/cache/redis.go create mode 100644 app/utils/cache/redis_cluster.go create mode 100644 app/utils/cache/redis_pool.go create mode 100644 app/utils/cache/redis_pool_cluster.go create mode 100644 app/utils/cachesecond/base.go create mode 100644 app/utils/cachesecond/cache/cache.go create mode 100644 app/utils/cachesecond/cache/conv.go create mode 100644 app/utils/cachesecond/cache/file.go create mode 100644 app/utils/cachesecond/cache/memory.go create mode 100644 app/utils/cachesecond/redis.go create mode 100644 app/utils/cachesecond/redis_cluster.go create mode 100644 app/utils/cachesecond/redis_pool.go create mode 100644 app/utils/cachesecond/redis_pool_cluster.go create mode 100644 app/utils/convert.go create mode 100644 app/utils/crypto.go create mode 100644 app/utils/curl.go create mode 100644 app/utils/debug.go create mode 100644 app/utils/distance.go create mode 100644 app/utils/duplicate.go create mode 100644 app/utils/file.go create mode 100644 app/utils/file_and_dir.go create mode 100644 app/utils/format.go create mode 100644 app/utils/json.go create mode 100644 app/utils/logx/log.go create mode 100644 app/utils/logx/output.go create mode 100644 app/utils/logx/sugar.go create mode 100644 app/utils/map_and_struct.go create mode 100644 app/utils/map_to_map.go create mode 100644 app/utils/md5.go create mode 100644 app/utils/open_platform.go create mode 100644 app/utils/qrcode/decodeFile.go create mode 100644 app/utils/qrcode/getBase64.go create mode 100644 app/utils/qrcode/saveFile.go create mode 100644 app/utils/qrcode/writeWeb.go create mode 100644 app/utils/rand.go create mode 100644 app/utils/redis.go create mode 100644 app/utils/rpc_client.go create mode 100644 app/utils/rsa.go create mode 100644 app/utils/serialize.go create mode 100644 app/utils/shuffle.go create mode 100644 app/utils/sign_check.go create mode 100644 app/utils/slice.go create mode 100644 app/utils/slice_and_string.go create mode 100644 app/utils/string.go create mode 100644 app/utils/struct2UrlParams.go create mode 100644 app/utils/time.go create mode 100644 app/utils/translate.go create mode 100644 app/utils/trim_html.go create mode 100644 app/utils/uuid.go create mode 100644 applet.sql create mode 100644 bin/.gitignore create mode 100644 build.sh create mode 100644 cmd/task/main.go create mode 100644 cmd_db.bat create mode 100644 cmd_db.sh create mode 100644 cmd_run.bat create mode 100644 cmd_run.sh create mode 100644 cmd_task.bat create mode 100644 cmd_task.sh create mode 100644 docs/docs.go create mode 100644 docs/swagger.json create mode 100644 docs/swagger.yaml create mode 100644 etc/cfg.yml create mode 100644 etc/db_tpl/config create mode 100644 etc/db_tpl/struct.go.tpl create mode 100644 etc/nginx.conf create mode 100644 etc/task.yml create mode 100644 flags/flag.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 pkg/pb/im.business.ext.pb.go create mode 100644 pkg/pb/im.business.int.pb.go create mode 100644 pkg/pb/im.common.ext.pb.go create mode 100644 pkg/pb/im.connect.ext.pb.go create mode 100644 pkg/pb/im.connect.int.pb.go create mode 100644 pkg/pb/im.logic.ext.pb.go create mode 100644 pkg/pb/im.logic.int.pb.go create mode 100644 pkg/pb/im.push.ext.pb.go create mode 100644 pkg/proto/im.business.ext.proto create mode 100644 pkg/proto/im.business.int.proto create mode 100644 pkg/proto/im.common.ext.proto create mode 100644 pkg/proto/im.connect.ext.proto create mode 100644 pkg/proto/im.connect.int.proto create mode 100644 pkg/proto/im.logic.ext.proto create mode 100644 pkg/proto/im.logic.int.proto create mode 100644 pkg/proto/im.push.ext.proto create mode 100644 static/bat/phone.dat create mode 100644 static/bat/sat.txt create mode 100644 test/aces_test.go create mode 100644 test/toke_test.go create mode 100644 test/zhimeng_api.go create mode 100644 tmp/%s.log create mode 100644 tmp/debug.log create mode 100644 tmp/fnuoos_test1.log create mode 100644 tmp/init_es.log create mode 100644 tmp/init_rabbit_mq.log create mode 100644 tmp/zyos_website.log create mode 100644 wap.conf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f86fdb4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Binaries for programs and plugins + diff --git a/.idea/community_team.iml b/.idea/community_team.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/community_team.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..de50cfd --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..28977ea --- /dev/null +++ b/Dockerfile @@ -0,0 +1,37 @@ +# 多重构建,减少镜像大小 +# 构建:使用golang:1.13版本 +FROM registry.cn-shenzhen.aliyuncs.com/fnuoos-prd/golang:1.18.4 as build + +# 容器环境变量添加,会覆盖默认的变量值 +ENV GO111MODULE=on +ENV GOPROXY=https://goproxy.cn,direct +ENV TZ="Asia/Shanghai" +ENV PHONE_DATA_DIR="./static/bat" +# 设置工作区 +WORKDIR /go/release + +# 把全部文件添加到/go/release目录 +ADD . . + +# 编译:把main.go编译成可执行的二进制文件,命名为zyos +RUN GOOS=linux CGO_ENABLED=0 GOARCH=amd64 go build -tags netgo -ldflags="-s -w" -installsuffix cgo -o zyos main.go + +FROM ubuntu:xenial as prod +LABEL maintainer="zengzhengrong" +ENV TZ="Asia/Shanghai" +ENV PHONE_DATA_DIR="./static/bat" + +COPY static/html static/html +COPY static/bat static/bat +# 时区纠正 +RUN rm -f /etc/localtime \ + && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone +# 在build阶段复制可执行的go二进制文件app +COPY --from=build /go/release/zyos ./zyos + +COPY --from=build /go/release/etc/cfg.yml /var/zyos/cfg.yml + +# 启动服务 +CMD ["./zyos","-c","/var/zyos/cfg.yml"] + diff --git a/Dockerfile-prd b/Dockerfile-prd new file mode 100644 index 0000000..beb5959 --- /dev/null +++ b/Dockerfile-prd @@ -0,0 +1,39 @@ +# 多重构建,减少镜像大小 +# 构建:使用golang:1.18版本(直接使用自己从香港下载回来的镜像版本,提高打包速度) +FROM registry.cn-shenzhen.aliyuncs.com/fnuoos-prd/golang:1.18.4 as build + +# 容器环境变量添加,会覆盖默认的变量值 +ENV GO111MODULE=on +ENV GOPROXY=https://goproxy.cn,direct +ENV TZ="Asia/Shanghai" +ENV PHONE_DATA_DIR="./static/bat" +# 设置工作区 +WORKDIR /go/release + +# 把全部文件添加到/go/release目录 +ADD . . + +# 编译:把main.go编译成可执行的二进制文件,命名为zyos +RUN GOOS=linux CGO_ENABLED=0 GOARCH=amd64 go build -tags netgo -ldflags="-s -w" -installsuffix cgo -o zyos main.go + +FROM ubuntu:xenial as prod +LABEL maintainer="zengzhengrong" +ENV TZ="Asia/Shanghai" +ENV PHONE_DATA_DIR="./static/bat" + +COPY static/html static/html +COPY static/bat static/bat +# 时区纠正 +RUN rm -f /etc/localtime \ + && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone +# 在build阶段复制可执行的go二进制文件app +COPY --from=build /go/release/zyos ./zyos + +COPY --from=build /go/release/etc/cfg.yml /var/zyos/cfg.yml + +# 启动服务 +# CMD ["./zyos","-c","/var/zyos/cfg.yml"] +CMD ["bash","-c","sysctl -w net.ipv4.tcp_tw_reuse=1 && sysctl -w net.ipv4.tcp_fin_timeout=10 && sysctl -w net.ipv4.ip_local_port_range='1024 65535' && sysctl -p && ./zyos -c /var/zyos/cfg.yml"] + + diff --git a/Dockerfile-task b/Dockerfile-task new file mode 100644 index 0000000..6e86a95 --- /dev/null +++ b/Dockerfile-task @@ -0,0 +1,38 @@ +# 多重构建,减少镜像大小 +# 构建:使用golang:1.15版本 +FROM registry.cn-shenzhen.aliyuncs.com/fnuoos-prd/golang:1.18.4 as build + +# 容器环境变量添加,会覆盖默认的变量值 +ENV GO111MODULE=on +ENV GOPROXY=https://goproxy.cn,direct +ENV TZ="Asia/Shanghai" +ENV PHONE_DATA_DIR="./static/bat" +# 设置工作区 +WORKDIR /go/release + +# 把全部文件添加到/go/release目录 +ADD . . + +# 编译:把main.go编译成可执行的二进制文件,命名为zyos +RUN GOOS=linux CGO_ENABLED=0 GOARCH=amd64 go build -tags netgo -ldflags="-s -w" -installsuffix cgo -o zyos_order_task cmd/task/main.go + +FROM ubuntu:xenial as prod +LABEL maintainer="zengzhengrong" +ENV TZ="Asia/Shanghai" +ENV PHONE_DATA_DIR="./static/bat" + +COPY static/html static/html +COPY static/bat static/bat + +# 时区纠正 +RUN rm -f /etc/localtime \ + && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone +# 在build阶段复制可执行的go二进制文件app +COPY --from=build /go/release/zyos_order_task ./zyos_order_task + +COPY --from=build /go/release/etc/task.yml /var/zyos/task.yml + +# 启动服务 +CMD ["./zyos_order_task","-c","/var/zyos/task.yml"] + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e7e30c2 --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +.PHONY: build clean tool lint help + +APP=applet + +all: build + +build: + go build -o ./bin/$(APP) ./cmd/main.go + +lite: + go build -ldflags "-s -w" -o ./bin/$(APP) ./cmd/main.go + +install: + #@go build -v . + go install ./cmd/... + +tool: + go vet ./...; true + gofmt -w . + +lint: + golint ./... + +clean: + rm -rf go-gin-example + go clean -i . + +help: + @echo "make: compile packages and dependencies" + @echo "make tool: run specified go tool" + @echo "make lint: golint ./..." + @echo "make clean: remove object files and cached files" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..de4d11e --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# applet + +## 要看 nginx.conf 和 wap conf + +## 层级介绍 + +- hdl 做接收数据的报错, 数据校验 +- svc 做数据处理的报错, 数据转换 +- lib 只抛出错误给hdl或者svc进行处理, 不做数据校验 +- db 可以处理db错误,其它错误返回给svc进行处理 +- mw 中间件 +- md 结构体 + +#### 介绍 + +基于gin的接口小程序 + +#### 软件架构 + +软件架构说明 + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + +## swagger + +``` +// 参考:https://segmentfault.com/a/1190000013808421 +// 安装命令行 +go get -u github.com/swaggo/swag/cmd/swag +// 生成 +swag init +``` \ No newline at end of file diff --git a/app/cfg/cfg_app.go b/app/cfg/cfg_app.go new file mode 100644 index 0000000..3caf9f6 --- /dev/null +++ b/app/cfg/cfg_app.go @@ -0,0 +1,122 @@ +package cfg + +import ( + "time" +) + +type Config struct { + Debug bool `yaml:"debug"` + Prd bool `yaml:"prd"` + CurlDebug bool `yaml:"curldebug"` + SrvAddr string `yaml:"srv_addr"` + RedisAddr string `yaml:"redis_addr"` + RedisAddrSecond RedisAddrSeconds `yaml:"redis_addr_second"` + DB DBCfg `yaml:"db"` + MQ MQCfg `yaml:"mq"` + ES ESCfg `yaml:"es"` + Log LogCfg `yaml:"log"` + ArkID ArkIDCfg `yaml:"arkid"` + Admin AdminCfg `yaml:"admin"` + Official OfficialCfg `yaml:"official"` + WebsiteBackend WebsiteBackendCfg `yaml:"website_backend"` + WxappletFilepath WxappletFilepathCfg `yaml:"wxapplet_filepath"` + H5Filepath H5FilepathCfg `yaml:"h5_filepath"` + ImBusinessRpc ImBusinessRpcCfg `yaml:"im_business_rpc"` + Local bool + AppComm AppCommCfg `yaml:"app_comm"` + Zhimeng ZhimengCfg `yaml:"zm"` + Supply SupplyCfg `yaml:"supply"` + ZhiosOpen ZhiosOpenCfg `yaml:"zhios_open"` + ZhimengDB DBCfg `yaml:"zhimeng_db"` +} +type RedisAddrSeconds struct { + Addr string `json:"addr"` + Pwd string `json:"pwd"` +} +type ZhiosOpenCfg struct { + URL string `yaml:"url"` +} +type ImBusinessRpcCfg struct { + URL string `yaml:"url"` + PORT string `yaml:"port"` +} + +// 公共模块 +type AppCommCfg struct { + URL string `yaml:"url"` +} +type SupplyCfg struct { + URL string `yaml:"url"` +} +type ZhimengCfg struct { + URL string `yaml:"url"` +} + +// OfficialCfg is 官网 + +type OfficialCfg struct { + URL string `yaml:"url"` +} +type WxappletFilepathCfg struct { + URL string `yaml:"url"` +} +type H5FilepathCfg struct { + URL string `yaml:"url"` +} +type WebsiteBackendCfg struct { + URL string `yaml:"url"` +} + +// AdminCfg is 后台接口调用需要 +type AdminCfg struct { + URL string `yaml:"url"` + IURL string `yaml:"iurl"` + AesKey string `yaml:"api_aes_key"` + AesIV string `yaml:"api_aes_iv"` +} + +type ArkIDCfg struct { + Admin string `yaml:"admin"` + AdminPassword string `yaml:"admin_password"` + Url string `yaml:"url` +} + +//数据库配置结构体 +type DBCfg struct { + Host string `yaml:"host"` //ip及端口 + Name string `yaml:"name"` //库名 + User string `yaml:"user"` //用户 + Psw string `yaml:"psw"` //密码 + ShowLog bool `yaml:"show_log"` //是否显示SQL语句 + MaxLifetime time.Duration `yaml:"max_lifetime"` + MaxOpenConns int `yaml:"max_open_conns"` + MaxIdleConns int `yaml:"max_idle_conns"` + Path string `yaml:"path"` //日志文件存放路径 +} + +type MQCfg struct { + Host string `yaml:"host"` + Port string `yaml:"port"` + User string `yaml:"user"` + Pwd string `yaml:"pwd"` +} +type ESCfg struct { + Url string `yaml:"url"` + User string `yaml:"user"` + Pwd string `yaml:"pwd"` +} + +//日志配置结构体 +type LogCfg struct { + AppName string `yaml:"app_name" ` + Level string `yaml:"level"` + IsStdOut bool `yaml:"is_stdout"` + TimeFormat string `yaml:"time_format"` // second, milli, nano, standard, iso, + Encoding string `yaml:"encoding"` // console, json + + IsFileOut bool `yaml:"is_file_out"` + FileDir string `yaml:"file_dir"` + FileName string `yaml:"file_name"` + FileMaxSize int `yaml:"file_max_size"` + FileMaxAge int `yaml:"file_max_age"` +} diff --git a/app/cfg/cfg_cache_key.go b/app/cfg/cfg_cache_key.go new file mode 100644 index 0000000..c091909 --- /dev/null +++ b/app/cfg/cfg_cache_key.go @@ -0,0 +1,3 @@ +package cfg + +// 统一管理缓存 diff --git a/app/cfg/cfg_task.go b/app/cfg/cfg_task.go new file mode 100644 index 0000000..cbaa432 --- /dev/null +++ b/app/cfg/cfg_task.go @@ -0,0 +1,4 @@ +package cfg + +type TaskConfig struct { +} diff --git a/app/cfg/init_cache.go b/app/cfg/init_cache.go new file mode 100644 index 0000000..873657f --- /dev/null +++ b/app/cfg/init_cache.go @@ -0,0 +1,9 @@ +package cfg + +import ( + "applet/app/utils/cache" +) + +func InitCache() { + cache.NewRedis(RedisAddr) +} diff --git a/app/cfg/init_cache_second.go b/app/cfg/init_cache_second.go new file mode 100644 index 0000000..6b3e6a2 --- /dev/null +++ b/app/cfg/init_cache_second.go @@ -0,0 +1,9 @@ +package cfg + +import ( + "applet/app/utils/cachesecond" +) + +func InitCacheSecond() { + cachesecond.NewRedis(RedisAddrSecond.Addr, RedisAddrSecond.Pwd) +} diff --git a/app/cfg/init_cfg.go b/app/cfg/init_cfg.go new file mode 100644 index 0000000..7ffae1d --- /dev/null +++ b/app/cfg/init_cfg.go @@ -0,0 +1,81 @@ +package cfg + +import ( + "flag" + "io/ioutil" + + "gopkg.in/yaml.v2" +) + +//配置文件数据,全局变量 +var ( + Debug bool + Prd bool + CurlDebug bool + SrvAddr string + RedisAddr string + RedisAddrSecond *RedisAddrSeconds + DB *DBCfg + MQ *MQCfg + ES *ESCfg + Log *LogCfg + ArkID *ArkIDCfg + Admin *AdminCfg + Official *OfficialCfg + WxappletFilepath *WxappletFilepathCfg + H5Filepath *H5FilepathCfg + Local bool + AppComm *AppCommCfg + Zhimeng *ZhimengCfg + WebsiteBackend *WebsiteBackendCfg + Supply *SupplyCfg + ImBusinessRpc *ImBusinessRpcCfg + ZhiosOpen *ZhiosOpenCfg + ZhimengDB *DBCfg +) + +//初始化配置文件,将cfg.yml读入到内存 +func InitCfg() { + //用指定的名称、默认值、使用信息注册一个string类型flag。 + path := flag.String("c", "etc/cfg.yml", "config file") + //解析命令行参数写入注册的flag里。 + //解析之后,flag的值可以直接使用。 + flag.Parse() + var ( + c []byte + err error + conf *Config + ) + if c, err = ioutil.ReadFile(*path); err != nil { + panic(err) + } + //yaml.Unmarshal反序列化映射到Config + if err = yaml.Unmarshal(c, &conf); err != nil { + panic(err) + } + //数据读入内存 + Prd = conf.Prd + Debug = conf.Debug + Local = conf.Local + CurlDebug = conf.CurlDebug + DB = &conf.DB + MQ = &conf.MQ + Log = &conf.Log + ArkID = &conf.ArkID + RedisAddr = conf.RedisAddr + RedisAddrSecond = &conf.RedisAddrSecond + SrvAddr = conf.SrvAddr + Admin = &conf.Admin + Official = &conf.Official + WxappletFilepath = &conf.WxappletFilepath + AppComm = &conf.AppComm + Zhimeng = &conf.Zhimeng + Supply = &conf.Supply + H5Filepath = &conf.H5Filepath + WebsiteBackend = &conf.WebsiteBackend + ImBusinessRpc = &conf.ImBusinessRpc + ES = &conf.ES + ZhiosOpen = &conf.ZhiosOpen + ZhimengDB = &conf.ZhimengDB + +} diff --git a/app/cfg/init_es.go b/app/cfg/init_es.go new file mode 100644 index 0000000..ab5595b --- /dev/null +++ b/app/cfg/init_es.go @@ -0,0 +1,12 @@ +package cfg + +import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es" + "encoding/json" +) + +func InitEs() { + data, _ := json.Marshal(ES) + filePutContents("init_es", string(data)) + es.Init(ES.Url, ES.User, ES.Pwd) +} diff --git a/app/cfg/init_log.go b/app/cfg/init_log.go new file mode 100644 index 0000000..0f31eb5 --- /dev/null +++ b/app/cfg/init_log.go @@ -0,0 +1,20 @@ +package cfg + +import "applet/app/utils/logx" + +func InitLog() { + logx.InitDefaultLogger(&logx.LogConfig{ + AppName: Log.AppName, + Level: Log.Level, + StacktraceLevel: "error", + IsStdOut: Log.IsStdOut, + TimeFormat: Log.TimeFormat, + Encoding: Log.Encoding, + IsFileOut: Log.IsFileOut, + FileDir: Log.FileDir, + FileName: Log.FileName, + FileMaxSize: Log.FileMaxSize, + FileMaxAge: Log.FileMaxAge, + Skip: 2, + }) +} diff --git a/app/cfg/init_rabbitmq.go b/app/cfg/init_rabbitmq.go new file mode 100644 index 0000000..f04cd5e --- /dev/null +++ b/app/cfg/init_rabbitmq.go @@ -0,0 +1,28 @@ +package cfg + +import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" + "encoding/json" + "os" + "strings" + "time" +) + +func InitMq() { + data, _ := json.Marshal(MQ) + filePutContents("init_rabbit_mq", string(data)) + err := rabbit.Init(MQ.Host, MQ.Port, MQ.User, MQ.Pwd) + if err != nil { + filePutContents("init_rabbit_mq", err.Error()) + return + } +} + +func filePutContents(fileName string, content string) { + fd, _ := os.OpenFile("./tmp/"+fileName+".log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) + fd_time := time.Now().Format("2006-01-02 15:04:05") + fd_content := strings.Join([]string{"[", fd_time, "] ", content, "\n"}, "") + buf := []byte(fd_content) + fd.Write(buf) + fd.Close() +} diff --git a/app/cfg/init_task.go b/app/cfg/init_task.go new file mode 100644 index 0000000..e2f4a22 --- /dev/null +++ b/app/cfg/init_task.go @@ -0,0 +1,53 @@ +package cfg + +import ( + "flag" + "io/ioutil" + + "gopkg.in/yaml.v2" + + mc "applet/app/utils/cache/cache" + "applet/app/utils/logx" +) + +func InitTaskCfg() { + path := flag.String("c", "etc/task.yml", "config file") + flag.Parse() + var ( + c []byte + err error + conf *Config + ) + if c, err = ioutil.ReadFile(*path); err != nil { + panic(err) + } + if err = yaml.Unmarshal(c, &conf); err != nil { + panic(err) + } + Prd = conf.Prd + Debug = conf.Debug + DB = &conf.DB + MQ = &conf.MQ + ES = &conf.ES + Log = &conf.Log + Admin = &conf.Admin + RedisAddr = conf.RedisAddr + RedisAddrSecond = &conf.RedisAddrSecond + Local = conf.Local + AppComm = &conf.AppComm + Zhimeng = &conf.Zhimeng + Supply = &conf.Supply + ZhiosOpen = &conf.ZhiosOpen + ZhimengDB = &conf.ZhimengDB + +} + +var MemCache mc.Cache + +func InitMemCache() { + var err error + MemCache, err = mc.NewCache("memory", `{"interval":60}`) + if err != nil { + logx.Fatal(err.Error()) + } +} diff --git a/app/db/db.go b/app/db/db.go new file mode 100644 index 0000000..d2aa2f6 --- /dev/null +++ b/app/db/db.go @@ -0,0 +1,105 @@ +package db + +import ( + "fmt" + "os" + "time" + + _ "github.com/go-sql-driver/mysql" //必须导入mysql驱动,否则会panic + "xorm.io/xorm" + "xorm.io/xorm/log" + + "applet/app/cfg" + "applet/app/utils/logx" +) + +var Db *xorm.Engine + +// 根据DB配置文件初始化数据库 +func InitDB(c *cfg.DBCfg) error { + var ( + err error + f *os.File + ) + //创建Orm引擎 + if Db, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", c.User, c.Psw, c.Host, c.Name)); err != nil { + return err + } + Db.SetConnMaxLifetime(c.MaxLifetime * time.Second) //设置最长连接时间 + Db.SetMaxOpenConns(c.MaxOpenConns) //设置最大打开连接数 + Db.SetMaxIdleConns(c.MaxIdleConns) //设置连接池的空闲数大小 + if err = Db.Ping(); err != nil { //尝试ping数据库 + return err + } + if c.ShowLog { //根据配置文件设置日志 + Db.ShowSQL(true) //设置是否打印sql + Db.Logger().SetLevel(0) //设置日志等级 + //修改日志文件存放路径文件名是%s.log + path := fmt.Sprintf(c.Path, c.Name) + f, err = os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777) + if err != nil { + os.RemoveAll(c.Path) + if f, err = os.OpenFile(c.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777); err != nil { + return err + } + } + logger := log.NewSimpleLogger(f) + logger.ShowSQL(true) + Db.SetLogger(logger) + } + return nil +} + +/********************************************* 公用方法 *********************************************/ + +// 数据批量插入 +func DbInsertBatch(Db *xorm.Engine, m ...interface{}) error { + if len(m) == 0 { + return nil + } + id, err := Db.Insert(m...) + if id == 0 || err != nil { + return logx.Warn("cannot insert data :", err) + } + return nil +} + +// QueryNativeString 查询原生sql +func QueryNativeString(Db *xorm.Engine, sql string, args ...interface{}) ([]map[string]string, error) { + results, err := Db.SQL(sql, args...).QueryString() + return results, err +} +func QueryNativeStringWithSess(sess *xorm.Session, sql string, args ...interface{}) ([]map[string]string, error) { + results, err := sess.SQL(sql, args...).QueryString() + return results, err +} + +// UpdateComm common update +func UpdateComm(Db *xorm.Engine, id interface{}, model interface{}) (int64, error) { + row, err := Db.ID(id).Update(model) + return row, err +} + +// InsertComm common insert +func InsertComm(Db *xorm.Engine, model interface{}) (int64, error) { + row, err := Db.InsertOne(model) + return row, err +} + +// InsertCommWithSession common insert +func InsertCommWithSession(session *xorm.Session, model interface{}) (int64, error) { + row, err := session.InsertOne(model) + return row, err +} + +// GetComm +// payload *model +// return *model,has,err +func GetComm(Db *xorm.Engine, model interface{}) (interface{}, bool, error) { + has, err := Db.Get(model) + if err != nil { + _ = logx.Warn(err) + return nil, false, err + } + return model, has, nil +} diff --git a/app/db/db_cate.go b/app/db/db_cate.go new file mode 100644 index 0000000..f355a86 --- /dev/null +++ b/app/db/db_cate.go @@ -0,0 +1,15 @@ +package db + +import ( + "applet/app/db/model" + "xorm.io/xorm" +) + +func GetCate(eg *xorm.Engine, storeId string) *[]model.CommunityTeamCate { + var data []model.CommunityTeamCate + err := eg.Where("is_show=1 and uid=?", storeId).OrderBy("sort desc,id desc").Find(&data) + if err != nil { + return nil + } + return &data +} diff --git a/app/db/db_cloud_bundle.go b/app/db/db_cloud_bundle.go new file mode 100644 index 0000000..27a3f60 --- /dev/null +++ b/app/db/db_cloud_bundle.go @@ -0,0 +1,111 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/md" + "errors" + "fmt" + "github.com/gin-gonic/gin" + + "xorm.io/xorm" +) + +// GetCloudBundleByVersion is 根据版本 获取打包记录 +func GetCloudBundleByVersion(Db *xorm.Engine, appverison string, os, ep int) (*model.CloudBundle, error) { + m := new(model.CloudBundle) + has, err := Db.Where("version = ? and os = ? and template_during_audit<>'' and ep=?", appverison, os, ep).Get(m) + if err != nil { + return nil, err + } + if !has { + return nil, errors.New("not Found") + } + return m, nil +} + +// GetCloudBundleByVersionPlatform is 根据版本\os 获取打包记录 +func GetCloudBundleByVersionPlatform(Db *xorm.Engine, appverison string, platform string, appType string) (*model.CloudBundle, error) { + m := new(model.CloudBundle) + var tag int + var ep = 0 + if platform == "ios" { + tag = 2 + } else { + tag = 1 + } + if appType == "daogou" || appType == "" { + ep = 0 + } else { + ep = 1 + } + has, err := Db.Where("version = ? and os=? and ep=?", appverison, tag, ep).Desc("build_number").Get(m) + if err != nil { + return nil, err + } + if !has { + return nil, errors.New("not Found") + } + return m, nil +} + +// GetCloudBundleByVersionPlatformWithAudit is 根据版本\os 获取打包记录 +func GetCloudBundleByVersionPlatformWithAudit(Db *xorm.Engine, appverison string, platform string, appType string) (*model.CloudBundle, error) { + m := new(model.CloudBundle) + var tag int + var ep = 0 + if platform == "ios" { + tag = 2 + } else { + tag = 1 + } + if appType == "daogou" || appType == "" { + ep = 0 + } else { + ep = 1 + } + has, err := Db.Where("version = ? and os=? and ep=? and template_during_audit<>''", appverison, tag, ep).Desc("build_number").Get(m) + if err != nil { + return nil, err + } + if !has { + return nil, errors.New("not Found") + } + return m, nil +} +func GetCloudBuild(c *gin.Context, platform string) string { + appVersion := c.GetHeader("app_version_name") + ep := 0 + if c.GetString("app_type") != "" && c.GetString("app_type") != "daogou" { + ep = 1 + } + if platform == "" { + platform = c.GetHeader("platform") + } + + version := "" + os := 0 + switch platform { + case md.PLATFORM_ANDROID: + if ep == 1 { + version = SysCfgGet(c, "biz_android_audit_version") + } else { + version = SysCfgGet(c, "android_audit_version") + } + os = 1 + case md.PLATFORM_IOS: + if ep == 1 { + version = SysCfgGet(c, "biz_ios_audit_version") + } else { + version = SysCfgGet(c, "ios_audit_version") + } + os = 2 + } + var data model.CloudBundle + get, err := DBs[c.GetString("mid")].Where("is_auditing=1 and os=? and ep=? and version=?", os, ep, appVersion).Get(&data) + fmt.Println(get) + fmt.Println(err) + if data.Version != "" { + version = data.Version + } + return version +} diff --git a/app/db/db_coupon.go b/app/db/db_coupon.go new file mode 100644 index 0000000..3a49c63 --- /dev/null +++ b/app/db/db_coupon.go @@ -0,0 +1 @@ +package db diff --git a/app/db/db_goods.go b/app/db/db_goods.go new file mode 100644 index 0000000..42e151f --- /dev/null +++ b/app/db/db_goods.go @@ -0,0 +1,31 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils" + "xorm.io/xorm" +) + +func GetGoods(eg *xorm.Engine, arg map[string]string) *[]model.CommunityTeamGoods { + var data []model.CommunityTeamGoods + sess := eg.Where("store_type=0 and state=0") + if arg["cid"] != "" { + sess.And("cid=?", arg["cid"]) + } + limit := utils.StrToInt(arg["size"]) + start := (utils.StrToInt(arg["p"]) - 1) * limit + err := sess.OrderBy("sale_count desc,id desc").Limit(limit, start).Find(&data) + if err != nil { + return nil + } + return &data +} + +func GetGoodsSess(sess *xorm.Session, id int) *model.CommunityTeamGoods { + var data model.CommunityTeamGoods + get, err := sess.Where("id=?", id).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} diff --git a/app/db/db_goods_sku.go b/app/db/db_goods_sku.go new file mode 100644 index 0000000..f386b19 --- /dev/null +++ b/app/db/db_goods_sku.go @@ -0,0 +1,15 @@ +package db + +import ( + "applet/app/db/model" + "xorm.io/xorm" +) + +func GetGoodsSku(eg *xorm.Engine, goodsId string) *[]model.CommunityTeamSku { + var data []model.CommunityTeamSku + err := eg.Where("goods_id=?", goodsId).Find(&data) + if err != nil { + return nil + } + return &data +} diff --git a/app/db/db_order.go b/app/db/db_order.go new file mode 100644 index 0000000..29d4879 --- /dev/null +++ b/app/db/db_order.go @@ -0,0 +1,72 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils" + "xorm.io/xorm" +) + +func GetOrderEg(eg *xorm.Engine, oid string) *model.CommunityTeamOrder { + var data model.CommunityTeamOrder + get, err := eg.Where("oid=?", oid).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} +func GetOrder(sess *xorm.Session, oid string) *model.CommunityTeamOrder { + var data model.CommunityTeamOrder + get, err := sess.Where("oid=?", oid).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} +func GetOrderInfo(sess *xorm.Session, oid string) *[]model.CommunityTeamOrderInfo { + var data []model.CommunityTeamOrderInfo + err := sess.Where("oid=?", oid).Find(&data) + if err != nil { + return nil + } + return &data +} +func GetOrderInfoAllEg(eg *xorm.Engine, oid string) *[]model.CommunityTeamOrderInfo { + var data []model.CommunityTeamOrderInfo + err := eg.Where("oid=?", oid).Find(&data) + if err != nil { + return nil + } + return &data +} +func GetOrderInfoEg(eg *xorm.Engine, oid string) *model.CommunityTeamOrderInfo { + var data model.CommunityTeamOrderInfo + get, err := eg.Where("oid=?", oid).Asc("id").Get(&data) + if get == false || err != nil { + return nil + } + return &data +} + +func GetOrderList(eg *xorm.Engine, arg map[string]string) *[]model.CommunityTeamOrder { + var data []model.CommunityTeamOrder + sess := eg.Where("1=1") + if arg["uid"] != "" { + sess.And("uid=?", arg["uid"]) + } + if arg["state"] != "" { + sess.And("state=?", arg["state"]) + } + if arg["store_uid"] != "" { + sess.And("store_uid=?", arg["store_uid"]) + } + if arg["code"] != "" { + sess.And("code=?", arg["code"]) + } + limit := utils.StrToInt(arg["size"]) + start := (utils.StrToInt(arg["p"]) - 1) * limit + err := sess.OrderBy("id desc").Limit(limit, start).Find(&data) + if err != nil { + return nil + } + return &data +} diff --git a/app/db/db_store.go b/app/db/db_store.go new file mode 100644 index 0000000..7600c85 --- /dev/null +++ b/app/db/db_store.go @@ -0,0 +1,86 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils" + "fmt" + "xorm.io/xorm" +) + +func GetStore(eg *xorm.Engine, arg map[string]string) []map[string]string { + lng := utils.StrToFloat64(arg["lng"]) + lat := utils.StrToFloat64(arg["lat"]) + sel := ` *,sqrt( ( (( %f - lng)*PI()*12656*cos((( %f +lat)/2)*PI()/180)/180) * (( %f - lng)*PI()*12656*cos (((%f+lat)/2)*PI()/180)/180) ) + ( ((%f-lat)*PI()*12656/180) * ((%f-lat)*PI()*12656/180) ) ) AS km` + sel = fmt.Sprintf(sel, lng, lat, lng, lat, lat, lat) + sql := `select %s from community_team_store where %s %s` + where := "1=1" + if arg["parent_uid"] != "" { + where += " and store_type=2 and parent_uid=" + arg["parent_uid"] + } else if arg["uid"] != "" { + where += " and store_type=1 and uid=" + arg["parent_uid"] + } else { + where += " and store_type=" + arg["store_type"] + } + if arg["city"] != "" { + where += " and city='" + arg["city"] + "'" + } + if arg["name"] != "" { + where += " and name like '%" + arg["name"] + "'" + } + start := (utils.StrToInt(arg["p"]) - 1) * utils.StrToInt(arg["size"]) + group := " order by %s limit " + utils.IntToStr(start) + "," + arg["size"] + groupStr := "fan desc,km asc,id asc" + if arg["cid"] == "1" { + groupStr = "km asc,id asc" + } + group = fmt.Sprintf(group, groupStr) + sql = fmt.Sprintf(sql, sel, where, group) + fmt.Println(sql) + nativeString, _ := QueryNativeString(eg, sql) + return nativeString +} +func GetStoreLike(eg *xorm.Engine, arg map[string]string) []map[string]string { + lng := utils.StrToFloat64(arg["lng"]) + lat := utils.StrToFloat64(arg["lat"]) + sel := ` cts.*,sqrt( ( (( %f - cts.lng)*PI()*12656*cos((( %f +cts.lat)/2)*PI()/180)/180) * (( %f - cts.lng)*PI()*12656*cos (((%f+cts.lat)/2)*PI()/180)/180) ) + ( ((%f-cts.lat)*PI()*12656/180) * ((%f-cts.lat)*PI()*12656/180) ) ) AS km` + sel = fmt.Sprintf(sel, lng, lat, lng, lat, lat, lat) + sql := `select %s from community_team_store_like ctsl + left join community_team_store cts on ctsl.store_id=cts.id +where %s %s` + where := "cts.state=1" + if arg["parent_uid"] != "" { + where += " and cts.store_type=2 and cts.parent_uid=" + arg["parent_uid"] + } else if arg["uid"] != "" { + where += " and cts.store_type=1 and cts.uid=" + arg["parent_uid"] + } else { + where += " and cts.store_type=" + arg["store_type"] + } + if arg["city"] != "" { + where += " and cts.city='" + arg["city"] + "'" + } + if arg["name"] != "" { + where += " and cts.name like '%" + arg["name"] + "'" + } + start := (utils.StrToInt(arg["p"]) - 1) * utils.StrToInt(arg["size"]) + group := " order by km asc,cts.id asc limit " + utils.IntToStr(start) + "," + arg["size"] + sql = fmt.Sprintf(sql, sel, where, group) + fmt.Println(sql) + nativeString, _ := QueryNativeString(eg, sql) + return nativeString +} +func GetStoreId(sess *xorm.Session, id string) *model.CommunityTeamStore { + var data model.CommunityTeamStore + get, err := sess.Where("id=?", id).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} +func GetStoreIdEg(eg *xorm.Engine, id string) *model.CommunityTeamStore { + var data model.CommunityTeamStore + get, err := eg.Where("id=?", id).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} diff --git a/app/db/db_sys_cfg.go b/app/db/db_sys_cfg.go new file mode 100644 index 0000000..8eeb247 --- /dev/null +++ b/app/db/db_sys_cfg.go @@ -0,0 +1,120 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/md" + "applet/app/utils/cache" + "applet/app/utils/logx" + "fmt" + "xorm.io/xorm" +) + +// 系统配置get +func SysCfgGetAll(Db *xorm.Engine) (*[]model.SysCfg, error) { + var cfgList []model.SysCfg + if err := Db.Cols("key,val,memo").Find(&cfgList); err != nil { + return nil, logx.Error(err) + } + return &cfgList, nil +} + +// 获取一条记录 +func SysCfgGetOne(Db *xorm.Engine, key string) (*model.SysCfg, error) { + var cfgList model.SysCfg + if has, err := Db.Where("`key`=?", key).Get(&cfgList); err != nil || has == false { + return nil, logx.Error(err) + } + return &cfgList, nil +} +func SysCfgGetOneData(Db *xorm.Engine, key string) string { + var cfgList model.SysCfg + if has, err := Db.Where("`key`=?", key).Get(&cfgList); err != nil || has == false { + return "" + } + return cfgList.Val +} + +// 返回最后插入id +func SysCfgInsert(Db *xorm.Engine, key, val, memo string) bool { + cfg := model.SysCfg{Key: key, Val: val, Memo: memo} + _, err := Db.InsertOne(&cfg) + if err != nil { + logx.Error(err) + return false + } + return true +} + +func SysCfgUpdate(Db *xorm.Engine, key, val, memo string) bool { + cfg := model.SysCfg{Key: key, Val: val, Memo: memo} + _, err := Db.Where("`key`=?", key).Cols("val,memo").Update(&cfg) + if err != nil { + logx.Error(err) + return false + } + return true +} + +// 单条记录获取DB +func SysCfgGetWithDb(eg *xorm.Engine, masterId string, HKey string) string { + cacheKey := fmt.Sprintf(md.AppCfgCacheKey, masterId) + HKey + get, err := cache.GetString(cacheKey) + if err != nil || get == "" { + cfg, err := SysCfgGetOne(eg, HKey) + if err != nil || cfg == nil { + _ = logx.Error(err) + return "" + } + + // key是否存在 + cacheKeyExist := false + if cache.Exists(cacheKey) { + cacheKeyExist = true + } + + // 设置缓存 + _, err = cache.SetEx(cacheKey, cfg.Val, 30) + if err != nil { + _ = logx.Error(err) + return "" + } + if !cacheKeyExist { // 如果是首次设置 设置过期时间 + _, err := cache.Expire(cacheKey, md.CfgCacheTime) + if err != nil { + _ = logx.Error(err) + return "" + } + } + return cfg.Val + } + return get +} +func SysCfgGetWithStr(eg *xorm.Engine, masterId string, HKey string) string { + + cfg, err := SysCfgGetOne(eg, HKey) + if err != nil || cfg == nil { + _ = logx.Error(err) + return "" + } + return cfg.Val +} + +// 多条记录获取DB +func SysCfgFindWithDb(eg *xorm.Engine, masterId string, keys ...string) map[string]string { + res := map[string]string{} + //TODO::判断keys长度(大于10个直接查数据库) + if len(keys) > 10 { + cfgList, _ := SysCfgGetAll(eg) + if cfgList == nil { + return nil + } + for _, v := range *cfgList { + res[v.Key] = v.Val + } + } else { + for _, key := range keys { + res[key] = SysCfgGetWithDb(eg, masterId, key) + } + } + return res +} diff --git a/app/db/db_sys_mod.go b/app/db/db_sys_mod.go new file mode 100644 index 0000000..da57360 --- /dev/null +++ b/app/db/db_sys_mod.go @@ -0,0 +1,688 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/e" + "applet/app/utils" + "applet/app/utils/logx" + "errors" + "fmt" + "strconv" + "strings" + + "github.com/gin-gonic/gin" + "github.com/tidwall/gjson" + "xorm.io/xorm" +) + +// 返回所有, 不管是否显示 +func SysModFindAll(Db *xorm.Engine) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.Find(&m); err != nil { + return nil, err + } + return &m, nil +} + +// 查找主模块数据 +func SysModFindMain(Db *xorm.Engine) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.Where("mod_pid = 0 AND state = 1 AND position = 'base'"). + Asc("sort"). + Find(&m); err != nil { + return nil, err + } + return &m, nil +} + +// 用父ID查找子模块数据 +func SysModFindByPId(c *gin.Context, Db *xorm.Engine, id int) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.Where("state = 1").Where("mod_pid = ?", id). + Asc("sort"). + Find(&m); err != nil { + return nil, err + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + var ms []model.SysModule + modname_list := []string{"product", "search_result_taobao_item", "hot_rank_tab_view"} + for _, item := range *mm.(*[]model.SysModule) { + if item.ModName == "product_detail_title" { + if strings.Contains(item.Data, "tmall") == false { + item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"天猫\",\"type\":\"tmall\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1) + } + if strings.Contains(item.Data, "kuaishou") == false { + item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"快手\",\"type\":\"kuaishou\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1) + } + if strings.Contains(item.Data, "tikTok") == false { + item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"抖音\",\"type\":\"tikTok\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1) + } + } + + if strings.Contains(item.Data, "tmall") == false && utils.InArr(item.ModName, modname_list) { + item.Data = strings.Replace(item.Data, "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"index\":\"7\",\"type\":\"tmall\",\"platform_name\":\"天猫\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1) + item.Data = strings.Replace(item.Data, "{\"type\":\"kaola\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"type\":\"kaola\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"type\":\"tmall\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1) + } + if strings.Contains(item.Data, "优惠卷") { + item.Data = strings.Replace(item.Data, "优惠卷", "优惠券", -1) + } + item.Data = strings.ReplaceAll(item.Data, "\\/", "/") + item.Data = strings.ReplaceAll(item.Data, "\\u0026", "&") + + ms = append(ms, item) + } + return &ms, nil +} + +// 用父ID查找子模块数据 +func SysModFindByPIds(c *gin.Context, Db *xorm.Engine, ids ...int) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.In("mod_pid", ids).Where("state = 1"). + Asc("sort"). + Find(&m); err != nil { + return nil, err + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + var ms []model.SysModule + for _, item := range *mm.(*[]model.SysModule) { + //数据里面 + if strings.Contains(item.Data, "tmall") == false && item.ModName == "product" { + item.Data = strings.Replace(item.Data, "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"index\":\"7\",\"type\":\"tmall\",\"platform_name\":\"天猫\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1) + } + item = SysModDataByReplace(c, item) + ms = append(ms, item) + } + + return &ms, nil +} + +// 用IDS找对应模块数据 +func SysModFindByIds(Db *xorm.Engine, ids ...int) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.In("mod_id", ids).Where("state = 1"). + Cols("mod_id,mod_pid,mod_name,position,skip_identifier,title,subtitle,url,margin,aspect_ratio,icon,img,font_color,bg_img,bg_color,bg_color_t,badge,path,data,sort"). + Asc("sort").Find(&m); err != nil { + return nil, err + } + + return &m, nil +} + +// ID查找对应模块 +func SysModFindById(c *gin.Context, Db *xorm.Engine, id string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND mod_id = ?", id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + + return mm.(*model.SysModule), nil +} + +// SysModFindByTmpId is 根据模板 +func SysModFindByTmpId(c *gin.Context, Db *xorm.Engine, id string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND template_id = ?", id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil +} + +// Name查找对应模块 +func SysModFindByName(c *gin.Context, Db *xorm.Engine, name string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND mod_name = ?", name). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil +} + +// SysModFindByName is Name查找对应模块 +func SysModFindByNames(names ...string) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.In("mod_name", names).Where("state = 1"). + Cols("mod_id,mod_pid,mod_name,position,skip_identifier,title,subtitle,url,margin,aspect_ratio,icon,img,font_color,bg_img,bg_color,bg_color_t,badge,path,data,sort"). + Find(&m); err != nil { + return nil, err + } + return &m, nil +} + +// SysModFindByPosition is 根据位置查找对应模块 +func SysModFindByPosition(Db *xorm.Engine, positions ...string) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.In("position", positions).Where("state = 1").Find(&m); err != nil { + return nil, err + } + return &m, nil +} + +// 根据跳转标识 查找对应模块 +func SysModFindBySkipIdentifier(c *gin.Context, Db *xorm.Engine, name string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND skip_identifier = ?", name). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil +} + +func SysModFindBySkipIdentifierWithUid(c *gin.Context, Db *xorm.Engine, name string, uid int) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND skip_identifier = ? and uid=?", name, uid). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil +} + +// 根据跳转标识和位置 查找对应模块list +func SysModFindBySkipIdentifierAndPosition(c *gin.Context, Db *xorm.Engine, name string, position string) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.Where("state = 1 AND skip_identifier = ? AND position = ?", name, position). + Cols("mod_id,mod_pid,mod_name,position,skip_identifier,title,subtitle,url,margin,aspect_ratio,icon,img,font_color,bg_img,bg_color,bg_color_t,badge,path,data,sort"). + Asc("sort").Find(&m); err != nil { + return nil, err + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*[]model.SysModule), nil +} +func SysModFindByTempId(Db *xorm.Engine, ids []int) (*[]model.SysModule, error) { + var m []model.SysModule + if err := Db.Where("state = 1 ").In("template_id", ids).Asc("sort").Find(&m); err != nil { + return nil, err + } + return &m, nil +} + +// SysModFindByTemplateIDAndSkip is 根据模板id 查找对应模块 +func SysModFindByTemplateIDAndSkip(Db *xorm.Engine, id interface{}, skip string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND template_id = ? AND skip_identifier = ?", id, skip). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// SysModFindByTemplateIDAndPID is 根据模板id 和pid =0 查找父模块 +func SysModFindByTemplateIDAndPID(Db *xorm.Engine, id interface{}, pid interface{}) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND template_id = ? AND mod_pid = ?", id, pid). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + + return &m, nil +} + +// SysModFindByTemplateIDAndModName is 根据模板id 和mod name 查找模块 +func SysModFindByTemplateIDAndModName(Db *xorm.Engine, id interface{}, modName string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = ?", id, modName). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +func SysModFindByTemplateIDAndModNameWithIds(Db *xorm.Engine, ids []int, modName string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.In("template_id", ids).And(" mod_name = ?", modName). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// SysModFindNavIsUsed 查找正在使用的底部导航栏模板 +func SysModFindNavIsUsedByPlatform(c *gin.Context, Db *xorm.Engine, platform string) (*model.SysModule, error) { + var ( + tm model.SysTemplate + m model.SysModule + ) + + mid := c.GetString("mid") + fmt.Println("===================================app_type", c.GetString("app_type")) + if c.GetString("app_type") != "" && c.GetString("app_type") != "daogou" { + var ( + tempType string + ) + switch c.GetString("app_type") { + case "o2o": + tempType = "o2o_store_bottomNav" + + } + + switch platform { + case "ios": + if has, err := Db.Where("is_use = 1 AND type = ? AND platform = 2 ", tempType). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + appVersion := GetCloudBuild(c, platform) + if c.GetHeader("app_version_name") == appVersion && c.GetHeader("app_version_name") != "" { + m, err := GetCloudBundleByVersion(Db, appVersion, 2, 1) + if err != nil { + return nil, logx.Warn(err) + } + tm.Id = int(gjson.Get(m.TemplateDuringAudit, "bottom").Int()) + } + case "android": + has, err := Db.Where("is_use = 1 AND type = ? AND platform = 2 ", tempType).Cols("id,uid,name,is_use,is_system").Get(&tm) + if err != nil || has == false { + return nil, logx.Warn(err) + } + fmt.Println("===================================app_type", tm) + + appVersion := GetCloudBuild(c, platform) + fmt.Println("===================================app_type", appVersion) + + if appVersion != "" && c.GetHeader("app_version_name") == appVersion { + m, err := GetCloudBundleByVersion(Db, appVersion, 1, 1) + if err != nil { + return nil, logx.Warn(err) + } + fmt.Println("===================================app_type", m) + + tm.Id = int(gjson.Get(m.TemplateDuringAudit, "bottom").Int()) + } + case "wx_applet", "wap": + if has, err := Db.Where("is_use = 1 AND type = ? AND platform = 4 ", tempType). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + case "baidu_applet": + if has, err := Db.Where("is_use = 1 AND type = ? AND platform = 4 ", tempType). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + case "toutiao_applet": + if has, err := Db.Where("is_use = 1 AND type = ? AND platform = 4 ", tempType). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + case "alipay_applet": + if has, err := Db.Where("is_use = 1 AND type = ? AND platform = 4 ", tempType). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + default: + return &m, errors.New("Platform not support") + } + if has, err := Db.Where("state = 1 AND template_id = ?", tm.Id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + + fmt.Println("===================================app_type", m) + if tempType == "o2o_store_bottomNav" { + bottomMap := make(map[string]interface{}) + utils.Unserialize([]byte(m.Data), &bottomMap) + list, ok := bottomMap["list"] + if ok { + m.Data = string(utils.MarshalJSONCamelCase2JsonSnakeCase(utils.SerializeStr(list))) + } + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil + } + switch platform { + case "ios": + if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 2 "). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + appVersion := GetCloudBuild(c, platform) + if c.GetHeader("app_version_name") == appVersion && c.GetHeader("app_version_name") != "" { + m, err := GetCloudBundleByVersion(Db, appVersion, 2, 0) + if err != nil { + return nil, logx.Warn(err) + } + tm.Id = int(gjson.Get(m.TemplateDuringAudit, "bottom").Int()) + } + + if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil + case "android": + has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 2 ").Cols("id,uid,name,is_use,is_system").Get(&tm) + if err != nil || has == false { + return nil, logx.Warn(err) + } + appVersion := GetCloudBuild(c, platform) + if appVersion != "" && c.GetHeader("app_version_name") == appVersion { + m, err := GetCloudBundleByVersion(Db, appVersion, 1, 0) + if err != nil { + return nil, logx.Warn(err) + } + tm.Id = int(gjson.Get(m.TemplateDuringAudit, "bottom").Int()) + } + if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil + case "wx_applet", "wap": + wxAppletCfg := GetAppletKey(c, Db) + id := utils.StrToInt(wxAppletCfg["bottom_nav_css_id"]) + if id == 0 { + return nil, e.NewErr(400, "找不到模板配置") + } + if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil + case "baidu_applet": + if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 4 "). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + appVersion := SysCfgGetWithDb(Db, mid, "baidu_audit_version") + + if appVersion != "" && c.GetHeader("app_version_name") == appVersion { + m := SysCfgGetWithDb(Db, mid, "baidu_audit_template") + if m == "" { + return nil, e.NewErr(400, "找不到模板配置") + } + tm.Id = int(gjson.Get(m, "bottom").Int()) + } + if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil + case "toutiao_applet": + if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 4 "). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + appVersion := SysCfgGetWithDb(Db, mid, "tt_audit_version") + if appVersion != "" && c.GetHeader("app_version_name") == appVersion { + m := SysCfgGetWithDb(Db, mid, "tt_audit_template") + if m == "" { + return nil, errors.New("找不到模板配置") + } + tm.Id = int(gjson.Get(m, "bottom").Int()) + } + if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil + case "alipay_applet": + if has, err := Db.Where("is_use = 1 AND type = 'bottom' AND platform = 4 "). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + return nil, logx.Warn(err) + } + appVersion := SysCfgGetWithDb(Db, mid, "zfb_audit_version") + if appVersion != "" && c.GetHeader("app_version_name") == appVersion { + m := SysCfgGetWithDb(Db, mid, "zfb_audit_template") + if m == "" { + return nil, errors.New("找不到模板配置") + } + tm.Id = int(gjson.Get(m, "bottom").Int()) + } + if has, err := Db.Where("state = 1 AND template_id = ? AND mod_name = 'bottom_nav'", tm.Id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil + default: + return &m, errors.New("Platform not support") + } + +} + +// SysModFindBySkipIdentifierAndModName is 根据mod_name和位置 查找对应模块 +func SysModFindBySkipIdentifierAndModName(c *gin.Context, Db *xorm.Engine, name string, modName string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND skip_identifier = ? AND mod_name = ?", name, modName).Get(&m); err != nil || !has { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil +} + +// SysModFindByModName is 根据mod_name和位置 查找对应模块 +func SysModFindByModName(c *gin.Context, Db *xorm.Engine, modName string) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND mod_name = ?", modName).Get(&m); err != nil || !has { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil +} + +// 根据跳转标识和平台类型查找 +func SysModFindBySkipIdentifierAndPlatform(c *gin.Context, Db *xorm.Engine, name string, platform int) (*model.SysModule, error) { + var m model.SysModule + if has, err := Db.Where("state = 1 AND skip_identifier = ? AND platform = ?", name, platform).Get(&m); err != nil || !has { + return nil, logx.Warn(err) + } + mm, err := sysModFormat(c, &m) + if err != nil { + return nil, err + } + return mm.(*model.SysModule), nil +} + +// 公共处理modData的链接 +func SysModDataByReplace(c *gin.Context, mod model.SysModule) model.SysModule { + //替换链接的一些参数 + if strings.Contains(mod.Data, "[replace_APP_URL]") { + mod.Data = strings.Replace(mod.Data, "[replace_APP_URL]", c.GetString("domain_wap_base"), -1) + } + if strings.Contains(mod.Data, "[replace_masterId]") { + mod.Data = strings.Replace(mod.Data, "[replace_masterId]", c.GetString("mid"), -1) + } + if strings.Contains(mod.Data, "[replace_platform]") { + mod.Data = strings.Replace(mod.Data, "[replace_platform]", c.GetHeader("Platform"), -1) + } + if strings.Contains(mod.Data, "优惠卷") { + mod.Data = strings.Replace(mod.Data, "优惠卷", "优惠券", -1) + } + if strings.Contains(mod.Data, "[replace_uid]") { + token := c.GetHeader("Authorization") + // 按空格分割 + parts := strings.SplitN(token, " ", 2) + if len(parts) == 2 && parts[0] == "Bearer" { + // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它 + mc, _ := utils.ParseToken(parts[1]) + mod.Data = strings.Replace(mod.Data, "[replace_uid]", strconv.Itoa(mc.UID), -1) + } + } + //if strings.Contains(mod.Data, "\"child_category_id") && strings.Contains(mod.Data, "\"category_id") { + // //如果存在这两个字段,要换一下 + // mod.Data = strings.ReplaceAll(mod.Data, "\"category_id", "\"null_category_id") + // mod.Data = strings.ReplaceAll(mod.Data, "\"child_category_id", "\"category_id") + //} + return mod +} + +// 公共处理modData的链接 +func StringByReplace(c *gin.Context, skip string) string { + //替换链接的一些参数 + if strings.Contains(skip, "[replace_APP_URL]") { + skip = strings.Replace(skip, "[replace_APP_URL]", c.GetString("domain_wap_base"), -1) + } + if strings.Contains(skip, "[replace_masterId]") { + skip = strings.Replace(skip, "[replace_masterId]", c.GetString("mid"), -1) + } + if strings.Contains(skip, "[replace_platform]") { + skip = strings.Replace(skip, "[replace_platform]", c.GetHeader("Platform"), -1) + } + if strings.Contains(skip, "优惠卷") { + skip = strings.Replace(skip, "优惠卷", "优惠券", -1) + } + if strings.Contains(skip, "[replace_uid]") { + token := c.GetHeader("Authorization") + // 按空格分割 + parts := strings.SplitN(token, " ", 2) + if len(parts) == 2 && parts[0] == "Bearer" { + // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它 + mc, _ := utils.ParseToken(parts[1]) + skip = strings.Replace(skip, "[replace_uid]", strconv.Itoa(mc.UID), -1) + } + } + + //if strings.Contains(mod.Data, "\"child_category_id") && strings.Contains(mod.Data, "\"category_id") { + // //如果存在这两个字段,要换一下 + // mod.Data = strings.ReplaceAll(mod.Data, "\"category_id", "\"null_category_id") + // mod.Data = strings.ReplaceAll(mod.Data, "\"child_category_id", "\"category_id") + //} + return skip +} + +// 公共处理modSkip的链接 首页弹窗 +func SysModSkipByReplace(c *gin.Context, mod *model.SysPopup) *model.SysPopup { + //替换链接的一些参数 + if strings.Contains(mod.Skip, "[replace_APP_URL]") { + mod.Skip = strings.Replace(mod.Skip, "[replace_APP_URL]", c.GetString("domain_wap_base"), -1) + } + if strings.Contains(mod.Skip, "[replace_masterId]") { + mod.Skip = strings.Replace(mod.Skip, "[replace_masterId]", c.GetString("mid"), -1) + } + if strings.Contains(mod.Skip, "[replace_platform]") { + mod.Skip = strings.Replace(mod.Skip, "[replace_platform]", c.GetHeader("Platform"), -1) + } + if strings.Contains(mod.Skip, "优惠卷") { + mod.Skip = strings.Replace(mod.Skip, "优惠卷", "优惠券", -1) + } + if strings.Contains(mod.Skip, "[replace_uid]") { + token := c.GetHeader("Authorization") + // 按空格分割 + parts := strings.SplitN(token, " ", 2) + if len(parts) == 2 && parts[0] == "Bearer" { + // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它 + mc, _ := utils.ParseToken(parts[1]) + mod.Skip = strings.Replace(mod.Skip, "[replace_uid]", strconv.Itoa(mc.UID), -1) + } + } + + //if strings.Contains(mod.Data, "\"child_category_id") && strings.Contains(mod.Data, "\"category_id") { + // //如果存在这两个字段,要换一下 + // mod.Data = strings.ReplaceAll(mod.Data, "\"category_id", "\"null_category_id") + // mod.Data = strings.ReplaceAll(mod.Data, "\"child_category_id", "\"category_id") + //} + return mod +} + +// 公共处理modData的链接 +func SysModDataByReplaceSecond(c *gin.Context, mod *model.SysModule) *model.SysModule { + //替换链接的一些参数 + if strings.Contains(mod.Data, "[replace_APP_URL]") { + mod.Data = strings.Replace(mod.Data, "[replace_APP_URL]", c.GetString("domain_wap_base"), -1) + } + if strings.Contains(mod.Data, "[replace_masterId]") { + mod.Data = strings.Replace(mod.Data, "[replace_masterId]", c.GetString("mid"), -1) + } + if strings.Contains(mod.Data, "优惠卷") { + mod.Data = strings.Replace(mod.Data, "优惠卷", "优惠券", -1) + } + if strings.Contains(mod.Data, "[replace_uid]") { + token := c.GetHeader("Authorization") + // 按空格分割 + parts := strings.SplitN(token, " ", 2) + if len(parts) == 2 && parts[0] == "Bearer" { + // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它 + mc, _ := utils.ParseToken(parts[1]) + if mc == nil { + mod.Data = strings.Replace(mod.Data, "[replace_uid]", "0", -1) + } else { + mod.Data = strings.Replace(mod.Data, "[replace_uid]", strconv.Itoa(mc.UID), -1) + } + } + } + + if mod.ModName == "product" && strings.Contains(mod.Data, "product_3") { + if strings.Contains(mod.Data, "second_kill_style") == false { + mod.Data = strings.ReplaceAll(mod.Data, "\"coupon_commission\"", "\"second_kill_style\":{\"btn_bg_img\":\"http://ossn.izhim.net/gift.png\",\"left_stock_text_color\":\"#D59E21\",\"buy_now_text_color\":\"#D59E21\",\"is_show\":\"0\"},\"coupon_commission\"") + } + } + mod.Data = strings.ReplaceAll(mod.Data, "\\/", "/") + mod.Data = strings.ReplaceAll(mod.Data, "\\u0026", "&") + + //if strings.Contains(mod.Data, "\"child_category_id") && strings.Contains(mod.Data, "\"category_id") { + // //如果存在这两个字段,要换一下 + // mod.Data = strings.ReplaceAll(mod.Data, "\"category_id", "\"null_category_id") + // mod.Data = strings.ReplaceAll(mod.Data, "\"child_category_id", "\"category_id") + //} + return mod +} diff --git a/app/db/db_sys_mod_format_img.go b/app/db/db_sys_mod_format_img.go new file mode 100644 index 0000000..bfeceb3 --- /dev/null +++ b/app/db/db_sys_mod_format_img.go @@ -0,0 +1,194 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils" + "errors" + "fmt" + "github.com/gin-gonic/gin" + "github.com/syyongx/php2go" + "regexp" + "strings" +) + +func sysModFormat(c *gin.Context, m interface{}) (interface{}, error) { + var mods []model.SysModule + protocol := SysCfgGet(c, "file_bucket_scheme") + domain := SysCfgGet(c, "file_bucket_host") + //fmt.Println(protocol, domain) + if protocol == "" || domain == "" { + return nil, errors.New("System configuration error, object storage protocol and domain name not found") + } + modname_list := []string{"product", "search_result_taobao_item", "hot_rank_tab_view"} + switch m.(type) { + case *[]model.SysModule: + ms := m.(*[]model.SysModule) + for _, item := range *ms { + item.Data = ReformatStr(protocol, domain, item.Data, c) + if item.ModName == "product_detail_title" { + if strings.Contains(item.Data, "tmall") == false { + item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"天猫\",\"type\":\"tmall\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1) + } + if strings.Contains(item.Data, "kuaishou") == false { + item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"快手\",\"type\":\"kuaishou\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1) + } + if strings.Contains(item.Data, "tikTok") == false { + item.Data = strings.Replace(item.Data, "\"platform_css\":[", "\"platform_css\":[{\"name\":\"抖音\",\"type\":\"tikTok\",\"text_color\":\"#FFFFFF\",\"bg_color\":\"#FF4242\"},", 1) + } + } + + if strings.Contains(item.Data, "tmall") == false && utils.InArr(item.ModName, modname_list) { + item.Data = strings.Replace(item.Data, "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"index\":\"6\",\"type\":\"kaola\",\"platform_name\":\"考拉\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"index\":\"7\",\"type\":\"tmall\",\"platform_name\":\"天猫\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1) + item.Data = strings.Replace(item.Data, "{\"type\":\"kaola\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", "{\"type\":\"kaola\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"},{\"type\":\"tmall\",\"provider_name_color\":\"#FFFFFF\",\"provider_bg_color\":\"#FF4242\"}", 1) + } + if strings.Contains(item.Data, "\"virtual_coin_pre_fix_name\":") == false && item.ModName == "product" { + item.Data = strings.ReplaceAll(item.Data, "\"virtual_coin_name\":", "\"virtual_coin_pre_fix_name\":\"返\",\"virtual_coin_name\":") + } + item = SysModDataByReplace(c, item) + + mods = append(mods, item) + } + return &mods, nil + case *model.SysModule: + m := m.(*model.SysModule) + m.Data = ReformatStr(protocol, domain, m.Data, c) + m = SysModDataByReplaceSecond(c, m) + return m, nil + case []*model.UserLevel: + ms := m.([]*model.UserLevel) + for _, item := range ms { + item.CssSet = ReformatStr(protocol, domain, item.CssSet, c) + } + return ms, nil + case []*model.SysPushUser: + ms := m.([]*model.SysPushUser) + for _, item := range ms { + item.SendData = ReformatStr(protocol, domain, item.SendData, c) + } + return ms, nil + case *model.SysPushUser: + m := m.(*model.SysPushUser) + m.SendData = ReformatStr(protocol, domain, m.SendData, c) + return m, nil + default: + return nil, nil + } +} + +func ReformatComm(str, protocol, domain string) string { + // PNG + replaceList := reformatImg(str) + l := removeDuplicateElement(replaceList) + for _, s := range l { + if strings.Contains(s, "http") { + continue + } + ss := s + s = strings.ReplaceAll(s, `\`, "") + s = strings.ReplaceAll(s, `"`, "") + s = php2go.Rawurlencode(s) + new := fmt.Sprintf("%s://%s/%s", protocol, domain, s) + //if skipHTTPPng(new) { + // continue + //} + str = strings.Replace(str, ss, `"`+new+`"`, -1) + } + return str +} +func ReformatStr(protocol, domain, str string, c *gin.Context) string { + //protocol := SysCfgGet(c, "file_bucket_scheme") + //domain := SysCfgGet(c, "file_bucket_host") + + // PNG + str = ReformatComm(str, protocol, domain) + return str +} + +// 正则匹配 +func reformatPng(data string) []string { + re, _ := regexp.Compile(`"([^\"]*.png")`) + list := re.FindAllString(data, -1) + return list +} +func reformatJpeg(data string) []string { + re, _ := regexp.Compile(`"([^\"]*.jpeg")`) + list := re.FindAllString(data, -1) + return list +} +func reformatMp4(data string) []string { + re, _ := regexp.Compile(`"([^\"]*.mp4")`) + list := re.FindAllString(data, -1) + return list +} + +func skipHTTPPng(data string) bool { + re, _ := regexp.Compile(`(http|https):\/\/([^\"]*.png)`) + return re.MatchString(data) +} + +// 正则匹配 +func reformatJPG(data string) []string { + re, _ := regexp.Compile(`"([^\"]*.jpg")`) + list := re.FindAllString(data, -1) + return list +} + +// 正则匹配 +func reformatGIF(data string) []string { + re, _ := regexp.Compile(`"([^\"]*.gif")`) + list := re.FindAllString(data, -1) + return list +} +func reformatImg(data string) []string { + re, _ := regexp.Compile(`"([^\"]*.(png|jpg|jpeg|gif|mp4)")`) + list := re.FindAllString(data, -1) + return list +} + +func removeDuplicateElement(addrs []string) []string { + result := make([]string, 0, len(addrs)) + temp := map[string]int{} + i := 1 + for _, item := range addrs { + if _, ok := temp[item]; !ok { + temp[item] = i + result = append(result, item) + continue + } + temp[item] = temp[item] + 1 + } + // fmt.Println(temp) + return result +} + +// 单条记录获取DB +func SysCfgGet(c *gin.Context, key string) string { + res := SysCfgFind(c, key) + //fmt.Println(res) + if _, ok := res[key]; !ok { + return "" + } + return res[key] +} + +// 多条记录获取 +func SysCfgFind(c *gin.Context, keys ...string) map[string]string { + eg := DBs[c.GetString("mid")] + masterId := c.GetString("mid") + res := map[string]string{} + //TODO::判断keys长度(大于10个直接查数据库) + if len(keys) > 10 { + cfgList, _ := SysCfgGetAll(eg) + if cfgList == nil { + return nil + } + for _, v := range *cfgList { + res[v.Key] = v.Val + } + } else { + for _, key := range keys { + res[key] = SysCfgGetWithDb(eg, masterId, key) + } + } + return res +} diff --git a/app/db/db_user.go b/app/db/db_user.go new file mode 100644 index 0000000..00dcf05 --- /dev/null +++ b/app/db/db_user.go @@ -0,0 +1,395 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils/logx" + "fmt" + "strings" + "xorm.io/xorm" +) + +// UserisExistByUsernameAndPassword is usernameAndPassword exist +func UserisExistByUsernameAndPassword(Db *xorm.Engine, username, password, zone string) (*model.User, error) { + var user model.User + sess := Db.Where("(username = ? or phone=?) ", username, username) + if zone != "" && zone != "86" { + sess = sess.And("zone=?", zone) + } + has, err := sess.Get(&user) + if err != nil || has == false { + return nil, err + } + return &user, nil +} + +// UserisExistByMobile is exist +func UserisExistByMobile(Db *xorm.Engine, n string) (bool, error) { + has, err := Db.Where("phone = ? and phone<>''", n).Exist(&model.User{}) + + if err != nil { + return false, err + } + return has, nil +} +func UserisFindByMobile(sess *xorm.Session, n string) *model.User { + var data model.User + has, err := sess.Where("phone = ? and phone<>''", n).Get(&data) + + if err != nil || has == false { + return nil + } + return &data +} + +// UserInByUIDByLevel is In查询 以及是否是有效用户 +func UserInByUIDByLevel(Db *xorm.Engine, ids []int, levelID interface{}) (*[]model.User, error) { + var m []model.User + if err := Db.In("uid", ids).Where("level = ?", levelID). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserFindByMobile search user by mobile +func UserFindByMobile(Db *xorm.Engine, mobile string) (*model.User, error) { + var m model.User + if has, err := Db.Where("(phone = ? OR uid = ?) AND delete_at = 0", mobile, mobile). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserFindExistByMobile search user by mobile +func UserFindExistByMobile(Db *xorm.Engine, mobile string) (*model.User, bool, error) { + var m model.User + has, err := Db.Where("(phone = ? OR uid = ?) AND delete_at = 0", mobile, mobile).Get(&m) + if err != nil { + logx.Infof("UserFindExistByMobile err") + return nil, false, logx.Warn(err) + } + return &m, has, nil +} + +// UserFindByMobile search user by mobile +func UserFindByMobileAll(Db *xorm.Engine, mobile string) (*model.User, error) { + var m model.User + if has, err := Db.Where("(phone = ? OR uid = ?)", mobile, mobile). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserGetByMobileIgnoreDelete search user by mobile ignore delete +func UserGetByMobileIgnoreDelete(Db *xorm.Engine, mobile, zone string) (*model.User, bool, error) { + m := new(model.User) + sess := Db.Where("phone = ?", mobile) + if zone != "" && zone != "86" { + sess = sess.And("zone=?", zone) + } + has, err := sess.Get(m) + if err != nil { + return nil, false, logx.Warn(err) + } + return m, has, nil +} + +// UsersFindByMobileLike search users by mobile +func UsersFindByMobileLike(Db *xorm.Engine, mobile string) (*[]model.User, error) { + var m []model.User + if err := Db.Where("phone like ?", "%"+mobile+"%"). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersFindByNickNameLike search users by nickname +func UsersFindByNickNameLike(Db *xorm.Engine, nickname string) (*[]model.User, error) { + var m []model.User + if err := Db.Where("nickname like ?", "%"+nickname+"%"). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UsersFindByInviteCode(Db *xorm.Engine, nickname string) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.Where("invite_code like ? or custom_invite_code like ?", "%"+strings.ToLower(nickname)+"%", "%"+strings.ToLower(nickname)+"%"). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UsersFindByInviteCodeMust(Db *xorm.Engine, nickname string) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.Where("invite_code = ? or custom_invite_code = ?", strings.ToLower(nickname), strings.ToLower(nickname)). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersInByIds is 根据ids 查找users +func UsersInByIds(Db *xorm.Engine, ids []int, limit, start int) (*[]model.User, error) { + var m []model.User + if limit == 0 && start == 0 { + if err := Db.In("uid", ids). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.In("uid", ids).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersInByIdsWhereLv is 根据ids和 lv会员等级 查找users +func UsersInByIdsWhereLv(Db *xorm.Engine, ids []int, lv interface{}, limit, start int) (*[]model.User, error) { + var m []model.User + if limit == 0 && start == 0 { + if err := Db.Where("level = ?", lv).In("uid", ids). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.Where("level = ?", lv).In("uid", ids).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersInByIdsByAscWhereLv is 根据ids和 lv会员等级 查找users 升排序 +func UsersInByIdsByAscWhereLv(Db *xorm.Engine, ids []int, lv interface{}, limit, start int, c string) (*[]model.User, error) { + var m []model.User + if limit == 0 && start == 0 { + if err := Db.Where("level = ?", lv).In("uid", ids).Asc(c). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.Where("level = ?", lv).In("uid", ids).Asc(c).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersInByIdsByDescWhereLv is 根据ids和 lv会员等级 查找users 降排序 +func UsersInByIdsByDescWhereLv(Db *xorm.Engine, ids []int, lv interface{}, limit, start int, c string) (*[]model.User, error) { + var m []model.User + if limit == 0 && start == 0 { + if err := Db.Where("level = ?", lv).In("uid", ids).Desc(c). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.Where("level = ?", lv).In("uid", ids).Desc(c).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserFindByPhoneOrUsername(Db *xorm.Engine, mobile string) (*model.User, error) { + var m model.User + if has, err := Db.Where("(phone = ? or username=?) AND delete_at = 0", mobile, mobile). + Get(&m); err != nil || has == false { + return nil, err + } + return &m, nil +} + +// UserFindByArkidUserName search user by mobile +func UserFindByArkidUserName(Db *xorm.Engine, name string) (*model.User, error) { + var m model.User + if has, err := Db.Where("username = ?", name). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserFindByID is find user byid +func UserFindByID(Db *xorm.Engine, id interface{}) (*model.User, error) { + var m model.User + if has, err := Db.Where("uid = ?", id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserFindByIDWithSession(sess *xorm.Session, id interface{}) (*model.User, error) { + var m model.User + if has, err := sess.Where("uid = ?", id). + Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +func UserFindByIDs(Db *xorm.Engine, uids []int) (*[]model.User, error) { + var m []model.User + if err := Db.In("uid", uids).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +func UserFindByall(Db *xorm.Engine) (*[]model.User, error) { + var m []model.User + if err := Db.Where("uid>0").Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserFindByIDsToStr(Db *xorm.Engine, uids []string) (*[]model.User, error) { + var m []model.User + if err := Db.In("uid", uids).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserFindByIsSet(Db *xorm.Engine, limit, start int) ([]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.Where("is_set=? and parent_uid=0 and uid>0", 0).Limit(limit, start).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return m, nil +} +func UserFindByParentUid(Db *xorm.Engine, parentUid int) ([]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.Where("parent_uid=?", parentUid).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return m, nil +} + +// UsersInByIdsByDesc is 根据某列 降序 +func UsersInByIdsByDesc(Db *xorm.Engine, ids []int, limit, start int, c string) (*[]model.User, error) { + var m []model.User + if limit == 0 && start == 0 { + if err := Db.In("uid", ids).Desc(c). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.In("uid", ids).Desc(c).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersInByIdsByAsc is 根据某列 升序 +func UsersInByIdsByAsc(Db *xorm.Engine, ids []int, limit, start int, c string) (*[]model.User, error) { + var m []model.User + if limit == 0 && start == 0 { + if err := Db.In("uid", ids).Asc(c). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.In("uid", ids).Asc(c).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserInsert is insert user +func UserInsert(Db *xorm.Engine, user *model.User) (int64, error) { + affected, err := Db.Insert(user) + if err != nil { + return 0, err + } + return affected, nil +} + +// UserIsExistByMobile is mobile exist +func UserIsExistByMobile(Db *xorm.Engine, mobile string) (bool, error) { + //fmt.Println(mobile) + has, err := Db.Where("phone = ? OR uid = ?", mobile, mobile).Exist(&model.User{}) + fmt.Println(has, mobile) + if err != nil { + return false, err + } + return has, nil +} + +// UserIsExistByID is mobile exist by id +func UserIsExistByID(Db *xorm.Engine, id string) (bool, error) { + has, err := Db.Where("uid = ?", id).Exist(&model.User{}) + if err != nil { + return false, err + } + return has, nil +} + +// UserUpdate is update user +func UserUpdate(Db *xorm.Engine, uid interface{}, user *model.User, forceColums ...string) (int64, error) { + var ( + affected int64 + err error + ) + if forceColums != nil { + affected, err = Db.Where("uid=?", uid).Cols(forceColums...).Update(user) + } else { + affected, err = Db.Where("uid=?", uid).Update(user) + } + if err != nil { + return 0, err + } + return affected, nil +} + +func UserUpdateWithSession(Db *xorm.Session, uid interface{}, user *model.User, forceColums ...string) (int64, error) { + var ( + affected int64 + err error + ) + if forceColums != nil { + affected, err = Db.Where("uid=?", uid).Cols(forceColums...).Update(user) + } else { + affected, err = Db.Where("uid=?", uid).Update(user) + } + if err != nil { + return 0, err + } + return affected, nil +} + +func UpdateUserFinValid() { + +} + +// UserDelete is delete user +func UserDelete(Db *xorm.Engine, uid interface{}) (int64, error) { + return Db.Where("uid = ?", uid).Delete(model.User{}) +} + +func UserDeleteWithSess(sess *xorm.Session, uid interface{}) (int64, error) { + return sess.Where("uid = ?", uid).Delete(model.User{}) +} + +func UserProfileCheckInviteCode(eg *xorm.Engine, uid int, inviteCode string) bool { + var data model.UserProfile + get, err := eg.Where("invite_code=? or custom_invite_code=?", inviteCode, inviteCode).Get(&data) + if get == false || err != nil { + return false + } + if uid == data.Uid { + return false + } + return true +} diff --git a/app/db/db_user_fin_flow.go b/app/db/db_user_fin_flow.go new file mode 100644 index 0000000..253b061 --- /dev/null +++ b/app/db/db_user_fin_flow.go @@ -0,0 +1,103 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils/logx" + + "xorm.io/xorm" +) + +// GetFinUserFlowByID is 用户流水记录 +func GetFinUserFlowByID(Db *xorm.Engine, id interface{}) (*model.FinUserFlow, error) { + var m model.FinUserFlow + if has, err := Db.Where("id = ?", id).Get(&m); err != nil || !has { + return nil, logx.Warn(err) + } + return &m, nil +} + +// GetFinUserFlowByID is 用户流水记录 +func GetFinUserFlowByUIDANDOID(Db *xorm.Engine, types, uid, ordId string) (*model.FinUserFlow, error) { + var m model.FinUserFlow + if has, err := Db.Where("uid = ? and ord_id = ? and type = ?", uid, ordId, types).Get(&m); err != nil || !has { + return nil, logx.Warn(err) + } + return &m, nil +} +func GetFinUserFlowByUIDANDOIDTOORDTYPE(Db *xorm.Engine, types, uid, ordId string) (*model.FinUserFlow, error) { + var m model.FinUserFlow + if has, err := Db.Where("uid = ? and ord_id = ? and ord_type = ?", uid, ordId, types).Get(&m); err != nil || !has { + return nil, logx.Warn(err) + } + return &m, nil +} + +// GetFinUserFlowByID is 用户流水记录 +func GetFinUserFlowByOIDANDORDTYPE(Db *xorm.Engine, types, ordId, ordType string) (*model.FinUserFlow, error) { + var m model.FinUserFlow + if has, err := Db.Where("ord_id = ? and ord_action = ? and ord_type= ?", ordId, types, ordType).Get(&m); err != nil || !has { + return nil, logx.Warn(err) + } + return &m, nil +} + +//FinUserFlowInsertOne is 插入一条流水记录 +func FinUserFlowInsertOne(Db *xorm.Engine, m *model.FinUserFlow) error { + _, err := Db.InsertOne(m) + if err != nil { + return err + } + return nil +} + +//FinUserFlowInsertOne is 插入一条流水记录 +func FinUserFlowWithSessionInsertOne(session *xorm.Session, m *model.FinUserFlow) error { + _, err := session.InsertOne(m) + if err != nil { + return err + } + return nil +} + +// FinUserFlowByUID is 用户流水 +func FinUserFlowInputByUID(Db *xorm.Engine, uid interface{}, time string, limit, start int) ([]*model.FinUserFlow, error) { + var m []*model.FinUserFlow + if err := Db.Where("uid = ? AND create_at like ? and (amount> ? or ord_type=?)", uid, time+"%", "0", "fast_return").In("type", "0").Desc("create_at").Limit(limit, start).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return m, nil +} +func FinUserFlowInputByUIDWithAmount(Db *xorm.Engine, uid interface{}, types, before_amount, after_amount string) (*model.FinUserFlow, error) { + var m model.FinUserFlow + if has, err := Db.Where("uid = ? and ord_type='withdraw' and ord_action = ? and before_amount= ? and after_amount = ?", uid, types, before_amount, after_amount).Get(&m); err != nil || !has { + return nil, logx.Warn(err) + } + return &m, nil +} + +// FinUserFlowByUIDByOrderAction is 用户流水 by OrderAction +func FinUserFlowInputByUIDByOrderActionByTime(Db *xorm.Engine, uid, oa interface{}, time string, limit, start int) ([]*model.FinUserFlow, error) { + var m []*model.FinUserFlow + if err := Db.Where("uid = ? AND create_at like ? and amount>0", uid, time+"%").In("ord_action", oa).Desc("create_at").Limit(limit, start).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return m, nil +} + +// FinUserFlowByUIDByOrderAction is 用户流水 by OrderAction +func FinUserFlowInputByUIDByTypeByTime(Db *xorm.Engine, uid int, time string, limit, start int) ([]*model.FinUserFlow, error) { + var m []*model.FinUserFlow + if err := Db.Where("uid = ? AND type = 1 AND create_at like ? and (amount>0 or ord_type=? or ord_action=?)", uid, time+"%", "fast_return", 101).Desc("create_at").Limit(limit, start).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return m, nil +} + +// 在事务中使用,插入一条流水记录 +func FinUserFlowInsertOneWithSession(session *xorm.Session, m *model.FinUserFlow) error { + _, err := session.InsertOne(m) + if err != nil { + return err + } + return nil +} diff --git a/app/db/db_user_level.go b/app/db/db_user_level.go new file mode 100644 index 0000000..5169251 --- /dev/null +++ b/app/db/db_user_level.go @@ -0,0 +1,226 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/e" + "applet/app/utils/logx" + "github.com/gin-gonic/gin" + "xorm.io/xorm" +) + +//UserLevelByID is 根据用户id 获取对应的等级信息 +func UserLevelByID(Db *xorm.Engine, id interface{}) (*model.UserLevel, error) { + m := new(model.UserLevel) + has, err := Db.Where("id = ?", id).Get(m) + if err != nil { + return nil, logx.Warn(err) + } + if !has { + return nil, logx.Error("Not found") + } + + return m, nil +} +func UserLevelByIDWithSession(sess *xorm.Session, id interface{}) (*model.UserLevel, error) { + m := new(model.UserLevel) + has, err := sess.Where("id = ?", id).Get(m) + if err != nil { + return nil, logx.Warn(err) + } + if !has { + return nil, logx.Error("Not found") + } + + return m, nil +} + +//UserLevelTop is 查询最高的等级 +func UserLevelTop(Db *xorm.Engine) (*model.UserLevel, error) { + m := new(model.UserLevel) + has, err := Db.OrderBy("level_weight DESC").Get(m) + if err != nil { + return nil, logx.Warn(err) + } + if !has { + return nil, logx.Error("Not found") + } + + return m, nil +} + +//UserLevelNext is 查询下一等级 +func UserLevelNext(Db *xorm.Engine, curLevelWeight int) (*model.UserLevel, error) { + m := new(model.UserLevel) + has, err := Db.Where("level_weight > ? and before_hide=?", curLevelWeight, 0).OrderBy("level_weight ASC").Get(m) + if err != nil { + return nil, logx.Warn(err) + } + if !has { + return nil, logx.Error("Not found") + } + + return m, nil +} + +// UserLevelByWeight is 根据权重获取对应的等级 +func UserLevelByWeight(Db *xorm.Engine, w interface{}) (*model.UserLevel, error) { + m := new(model.UserLevel) + has, err := Db.Where("level_weight = ?", w).Get(m) + if err != nil { + return nil, logx.Warn(err) + } + if !has { + return nil, logx.Warn("Not found") + } + return m, nil +} + +//UserLevelInIDescByWeight is In 查询获取 权重最低 对应等级 +func UserLevelInIDescByWeightLow(Db *xorm.Engine) ([]*model.UserLevel, error) { + var ms []*model.UserLevel + if err := Db.Asc("level_weight").Limit(1).Find(&ms); err != nil { + return nil, err + } + return ms, nil + +} +func UserLevelInIDescByWeightLowWithOne(Db *xorm.Engine) (*model.UserLevel, error) { + var ms model.UserLevel + has, err := Db.Asc("level_weight").Get(&ms) + if err != nil { + return nil, err + } + if has == false { + return nil, e.NewErr(400, "等级不存在") + } + return &ms, nil + +} +func UserLevelInIDescByWeightDescWithOne(Db *xorm.Engine) (*model.UserLevel, error) { + var ms model.UserLevel + has, err := Db.Desc("level_weight").Get(&ms) + if err != nil { + return nil, err + } + if has == false { + return nil, e.NewErr(400, "等级不存在") + } + return &ms, nil + +} +func UserLevelByWeightNext(Db *xorm.Engine, levelWeight int) (*model.UserLevel, error) { + var ms model.UserLevel + if has, err := Db.Where("level_weight>? and is_use=? and before_hide=?", levelWeight, 1, 0).Asc("level_weight").Get(&ms); err != nil || has == false { + return nil, err + } + return &ms, nil + +} +func UserLevelByWeightMax(Db *xorm.Engine) (*model.UserLevel, error) { + var ms model.UserLevel + if has, err := Db.Where("is_use=? and before_hide=?", 1, 0).Desc("level_weight").Get(&ms); err != nil || has == false { + return nil, err + } + return &ms, nil + +} + +//UserLevelInIDescByWeight is In 查询获取对应等级 根据权重排序 +func UserLevelInIDescByWeight(Db *xorm.Engine, ids []int) ([]*model.UserLevel, error) { + var ms []*model.UserLevel + if err := Db.In("id", ids).Desc("level_weight").Find(&ms); err != nil { + return nil, err + } + return ms, nil + +} +func UserLevelIDescByWeight(Db *xorm.Engine, id int) (*model.UserLevel, error) { + var ms model.UserLevel + if has, err := Db.Where("id=?", id).Get(&ms); err != nil || has == false { + return nil, err + } + return &ms, nil + +} + +// UserLevlAll is 获取所有开启等级并且升序返回 +func UserLevlAll(c *gin.Context, Db *xorm.Engine) ([]*model.UserLevel, error) { + var m []*model.UserLevel + err := Db.Where("is_use = ?", 1).Asc("level_weight").Find(&m) + if err != nil { + return nil, logx.Warn(err) + } + + mm, err := sysModFormat(c, m) + if err != nil { + return nil, err + } + return mm.([]*model.UserLevel), nil +} +func UserLevlAllNew(c *gin.Context, Db *xorm.Engine) ([]*model.UserLevel, error) { + var m []*model.UserLevel + err := Db.Where("is_use = ? and before_hide=?", 1, 0).Asc("level_weight").Find(&m) + if err != nil { + return nil, logx.Warn(err) + } + + mm, err := sysModFormat(c, m) + if err != nil { + return nil, err + } + return mm.([]*model.UserLevel), nil +} + +// UserLevlEgAll is 获取所有开启等级并且升序返回 +func UserLevlEgAll(Db *xorm.Engine) ([]*model.UserLevel, error) { + var m []*model.UserLevel + err := Db.Where("is_use = ?", 1).Asc("level_weight").Find(&m) + if err != nil { + return nil, logx.Warn(err) + } + return m, nil +} +func UserFindByLevel(eg *xorm.Engine, level int) []model.User { + var data []model.User + eg.Where("level=?", level).Find(&data) + return data +} + +// UserLevlAllByWeight is 获取所有等级并且权重升序返回 +func UserLevlAllByWeight(c *gin.Context, Db *xorm.Engine) ([]*model.UserLevel, error) { + var m []*model.UserLevel + err := Db.Asc("level_weight").Find(&m) + if err != nil { + return nil, logx.Warn(err) + } + + mm, err := sysModFormat(c, m) + if err != nil { + return nil, err + } + return mm.([]*model.UserLevel), nil +} +func UserLevelByAllMap(Db *xorm.Engine) map[int]*model.UserLevel { + var maps = make(map[int]*model.UserLevel, 0) + var m []*model.UserLevel + err := Db.Where("is_use = ?", 1).Asc("level_weight").Find(&m) + if err != nil { + return maps + } + for _, v := range m { + maps[v.Id] = v + } + return maps +} +func UserLevelByNotHideAllMap(Db *xorm.Engine) map[int]*model.UserLevel { + var maps = make(map[int]*model.UserLevel, 0) + var m []*model.UserLevel + err := Db.Where("is_use = ? and before_hide=?", 1, 0).Asc("level_weight").Find(&m) + if err != nil { + return maps + } + for _, v := range m { + maps[v.Id] = v + } + return maps +} diff --git a/app/db/db_user_profile.go b/app/db/db_user_profile.go new file mode 100644 index 0000000..7f1c3c5 --- /dev/null +++ b/app/db/db_user_profile.go @@ -0,0 +1,578 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/logx" + "errors" + "xorm.io/xorm" +) + +// UserProfileFindByArkID is get userprofile by arkid +func UserProfileFindByArkID(Db *xorm.Engine, id interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("arkid_uid = ?", id).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileFindByArkToken(Db *xorm.Engine, id interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("arkid_token<>'' and arkid_token = ?", id).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByInviteCode is get userprofile by InviteCode +func UserProfileFindByInviteCode(Db *xorm.Engine, code string) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("invite_code = ?", code).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByInviteCode is get userprofile by InviteCode +func UserProfileFindByCustomInviteCode(Db *xorm.Engine, code string) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("custom_invite_code = ?", code).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByInviteCodes is get userprofile by InviteCode +func UserProfileFindByInviteCodes(Db *xorm.Engine, codes ...string) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.In("invite_code", codes).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileFindByAll(Db *xorm.Engine) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByCustomInviteCodes is get userprofile by CustomInviteCode +func UserProfileFindByCustomInviteCodes(Db *xorm.Engine, codes ...string) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.In("custom_invite_code", codes).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByID search user_profile by userid +func UserProfileFindByID(Db *xorm.Engine, id interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("uid = ?", id).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileFindAll(Db *xorm.Engine) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.Where("invite_code='' and uid>=0").Asc("uid").Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileFindByIDsToStr(Db *xorm.Engine, uids []string) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.In("uid", uids).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileFindByIDSess(sess *xorm.Session, id interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := sess.Where("uid = ?", id).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileFindByPID(Db *xorm.Engine, id interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("parent_uid = ?", id).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileOrderByNew 找最新的记录 +func UserProfileOrderByNew(Db *xorm.Engine) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("invite_code != ''").OrderBy("uid desc").Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByTaobaoOpenID search user_profile ByTaobaoOpenID +func UserProfileFindByTaobaoOpenID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("third_party_taobao_oid = ?", openid).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByQQOpenID search user_profile ByTaobaoOpenID +func UserProfileFindByQQOpenID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("third_party_qq_openid = ?", openid).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByAppleToken search user_profile AppleToken +func UserProfileFindByAppleToken(Db *xorm.Engine, token interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("third_party_apple_token = ?", token).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByWeChatOpenID search user_profile By 微信openid +func UserProfileFindByWeChatOpenID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("third_party_wechat_openid = ?", openid).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByWeChatMiniOpenID search user_profile By 小程序openid +func UserProfileFindByWeChatMiniOpenID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := Db.Where("third_party_wechat_mini_openid = ?", openid).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileFindByWeChatUnionID search user_profile By 微信唯一id +func UserProfileFindByWeChatUnionID(Db *xorm.Engine, openid interface{}) (*model.UserProfile, error) { + if openid == "" { + return nil, errors.New("不存在") + } + var m model.UserProfile + if has, err := Db.Where("third_party_wechat_unionid = ? ", openid).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileFindByAccAlipay(Db *xorm.Engine, accAlipay string, uid int) (bool, error) { + if has, err := Db.Where("acc_alipay = ? and uid <>?", accAlipay, uid).Exist(&model.UserProfile{}); err != nil || has == false { + return false, logx.Warn(err) + } + return true, nil +} + +// UserProfileisExistByTaobaoOpenID is exist by Taobao +func UserProfileisExistByTaobaoOpenID(Db *xorm.Engine, openid string) (bool, error) { + has, err := Db.Where("third_party_taobao_oid = ?", openid).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} +func UserProfileisThirdPartyWechatH5Openid(Db *xorm.Engine, openid string) (*model.UserProfile, error) { + var user model.UserProfile + has, err := Db.Where("third_party_wechat_h5_openid = ? and third_party_wechat_h5_openid<>''", openid).Get(&user) + + if err != nil || has == false { + return nil, err + } + return &user, nil +} + +// UserProfileisExistByQQOpenID is exist by QQ openid +func UserProfileisExistByQQOpenID(Db *xorm.Engine, openid string) (bool, error) { + has, err := Db.Where("third_party_qq_openid = ?", openid).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileisExistByAppleToken is exist by apple token +func UserProfileisExistByAppleToken(Db *xorm.Engine, token string) (bool, error) { + has, err := Db.Where("third_party_apple_token = ?", token).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileisExistByWeChatOpenID is exist by Wecaht openid +func UserProfileisExistByWeChatOpenID(Db *xorm.Engine, openid string) (bool, error) { + has, err := Db.Where("third_party_wechat_openid = ?", openid).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileisExistByWeChatMiniOpenID is exist by Wecaht openid +func UserProfileisExistByWeChatMiniOpenID(Db *xorm.Engine, openid string) (bool, error) { + has, err := Db.Where("third_party_wechat_mini_openid = ?", openid).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileisExistByWeChatUnionID is exist by Wecaht openid +func UserProfileisExistByWeChatUnionID(Db *xorm.Engine, openid string) (bool, error) { + if openid == "" { + return false, errors.New("不存在") + } + has, err := Db.Where("third_party_wechat_unionid = ? ", openid).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileisExistByRelationIDAndSpecialID is exist by RelationIdAndSpecialId +func UserProfileisExistByRelationIDAndSpecialID(Db *xorm.Engine, SpecialID, RelationID int64) (bool, error) { + has, err := Db.Where("acc_taobao_self_id = ? AND acc_taobao_share_id = ?", SpecialID, RelationID).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileisExistBySpecialID is exist by SpecialId +func UserProfileisExistBySpecialID(Db *xorm.Engine, SpecialID string) (bool, error) { + has, err := Db.Where("acc_taobao_self_id = ? ", SpecialID).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileCountByRelationID 统计relationID数量 +func UserProfileCountByRelationID(Db *xorm.Engine) (total int64, err error) { + relate := new(model.UserProfile) + total, err = Db.Where("acc_taobao_share_id > 0").Count(relate) + return +} + +// UserProfileCountByPUID 统计直推下级数量 +func UserProfileCountByPUID(Db *xorm.Engine, puid int) (total int64, err error) { + relate := new(model.UserProfile) + total, err = Db.Where("parent_uid = ?", puid).Count(relate) + return +} + +// UserProfileisExistByRelationID is exist by RelationID +func UserProfileisExistByRelationID(Db *xorm.Engine, RelationID string) (bool, error) { + has, err := Db.Where("acc_taobao_share_id = ? ", RelationID).Exist(&model.UserProfile{}) + + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileFindByIDs is in sql by ids +func UserProfileFindByIDs(Db *xorm.Engine, uids ...int) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.In("uid", uids).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileFindByIDsStr(Db *xorm.Engine, uids []string) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.In("uid", uids).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileByPuid search user_profile by parent_uid +func UserProfileByPuid(Db *xorm.Engine, puid interface{}) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.Where("parent_uid = ?", puid).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserProfileByPuidWithSess(sess *xorm.Session, puid interface{}) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := sess.Where("parent_uid = ?", puid).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersProfileInByIds is profiles by ids +func UsersProfileInByIds(Db *xorm.Engine, ids []int, limit, start int) (*[]model.UserProfile, error) { + var m []model.UserProfile + if limit == 0 && start == 0 { + if err := Db.In("uid", ids).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.In("uid", ids).Limit(limit, start).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersProfileInByUIDByisVerify is In查询 以及是否是有效用户 +func UsersProfileInByUIDByisVerify(Db *xorm.Engine, ids []int, isVerify interface{}) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.In("uid", ids).Where("is_verify = ?", isVerify). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersProfileInByIdsByDesc is 根据某列 降序 +func UsersProfileInByIdsByDesc(Db *xorm.Engine, ids []int, limit, start int, c string) (*[]model.UserProfile, error) { + var m []model.UserProfile + if limit == 0 && start == 0 { + if err := Db.In("uid", ids).Desc(c).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.In("uid", ids).Desc(c).Limit(limit, start).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersProfileInByIdsByAsc is 根据某列 升序 +func UsersProfileInByIdsByAsc(Db *xorm.Engine, ids []int, limit, start int, c string) (*[]model.UserProfile, error) { + var m []model.UserProfile + if limit == 0 && start == 0 { + if err := Db.In("uid", ids).Asc(c).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.In("uid", ids).Asc(c).Limit(limit, start).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UsersProfileByAll is 查询所有分享id大于0的数据 +func UsersProfileByTaobaoShateIdNotNull(Db *xorm.Engine, limit, start int) (*[]model.UserProfile, error) { + var m []model.UserProfile + if err := Db.Where("acc_taobao_share_id > 0").Limit(limit, start).Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserProfileIsExistByUserID is mobile exist +func UserProfileIsExistByUserID(Db *xorm.Engine, id int) (bool, error) { + has, err := Db.Where("uid = ?", id).Exist(&model.UserProfile{}) + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileIsExistByInviteCode is exist ? +func UserProfileIsExistByInviteCode(Db *xorm.Engine, code string) (bool, error) { + has, err := Db.Where("invite_code = ?", code).Exist(&model.UserProfile{}) + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileIsExistByCustomInviteCode is exist ? +func UserProfileIsExistByCustomInviteCode(Db *xorm.Engine, code string) (bool, error) { + has, err := Db.Where("custom_invite_code = ?", code).Exist(&model.UserProfile{}) + if err != nil { + return false, err + } + return has, nil +} + +// UserProfileInsert is insert user +func UserProfileInsert(Db *xorm.Engine, userProfile *model.UserProfile) (int64, error) { + affected, err := Db.Insert(userProfile) + if err != nil { + return 0, err + } + return affected, nil +} + +// UserProfileUpdate is update userprofile +func UserProfileUpdate(Db *xorm.Engine, uid interface{}, userProfile *model.UserProfile, forceCols ...string) (int64, error) { + var ( + affected int64 + err error + ) + if forceCols != nil { + affected, err = Db.Where("uid=?", uid).Cols(forceCols...).Update(userProfile) + } else { + affected, err = Db.Where("uid=?", uid).AllCols().Omit("fin_valid,parent_uid").Update(userProfile) + } + + if err != nil { + return 0, logx.Warn(err) + } + return affected, nil +} +func UserProfileUpdateWithSess(sess *xorm.Session, uid interface{}, userProfile *model.UserProfile, forceCols ...string) (int64, error) { + var ( + affected int64 + err error + ) + if forceCols != nil { + affected, err = sess.Where("uid=?", uid).Cols(forceCols...).Update(userProfile) + } else { + affected, err = sess.Where("uid=?", uid).AllCols().Omit("fin_valid").Update(userProfile) + } + + if err != nil { + return 0, logx.Warn(err) + } + return affected, nil +} + +// UserProfileUpdateByArkID is update userprofile +func UserProfileUpdateByArkID(Db *xorm.Engine, arkid interface{}, userProfile *model.UserProfile, forceCols ...string) (int64, error) { + var ( + affected int64 + err error + ) + if forceCols != nil { + affected, err = Db.Where("arkid_uid=?", arkid).Cols(forceCols...).Update(userProfile) + } else { + affected, err = Db.Where("arkid_uid=?", arkid).Update(userProfile) + } + if err != nil { + return 0, logx.Warn(err) + } + return affected, nil +} + +// UserProfileDelete is delete user profile +func UserProfileDelete(Db *xorm.Engine, uid interface{}) (int64, error) { + return Db.Where("uid = ?", uid).Delete(model.UserProfile{}) +} +func UserProfileDeleteWithSess(sess *xorm.Session, uid interface{}) (int64, error) { + return sess.Where("uid = ?", uid).Delete(model.UserProfile{}) +} +func UserProfileFindByIdWithSession(session *xorm.Session, uid int) (*model.UserProfile, error) { + var m model.UserProfile + if has, err := session.Where("uid = ?", uid).Get(&m); err != nil || has == false { + return nil, logx.Warn(err) + } + return &m, nil +} + +// 在事务中更新用户信息 +func UserProfileUpdateWithSession(session *xorm.Session, uid interface{}, userProfile *model.UserProfile, forceCols ...string) (int64, error) { + var ( + affected int64 + err error + ) + if forceCols != nil { + affected, err = session.Where("uid=?", uid).Cols(forceCols...).Update(userProfile) + } else { + affected, err = session.Where("uid=?", uid).Omit("fin_valid").Update(userProfile) + } + if err != nil { + return 0, logx.Warn(err) + } + return affected, nil +} + +// 根据uid获取md.user +func UserAllInfoByUid(Db *xorm.Engine, uid interface{}) (*md.User, error) { + u, err := UserFindByID(Db, uid) + if err != nil { + return nil, err + } + if u == nil { + return nil, errors.New("user is nil") + } + up, err := UserProfileFindByID(Db, uid) + if err != nil { + return nil, err + } + if utils.AnyToInt64(uid) == 0 { + userLevel, err := UserLevelInIDescByWeightLowWithOne(Db) + if err != nil { + return nil, err + } + if userLevel != nil { + u.Level = userLevel.Id + } + } + // 获取user 等级 + ul, err := UserLevelByID(Db, u.Level) + if u.Uid == 0 { + one, err := UserLevelInIDescByWeightLowWithOne(Db) + if err != nil { + return nil, err + } + ul = one + } + if err != nil { + return nil, err + } + + user := &md.User{ + Info: u, + Profile: up, + Level: ul, + } + return user, nil +} + +// UpdateUserProfileFinValid 更新用户余额 +func UpdateUserProfileFinValid(Db *xorm.Engine, uid interface{}, newAmount string) error { + update, err := Db.Where("uid=?", uid).Update(&model.UserProfile{FinValid: newAmount}) + if err != nil { + return err + } + if update != 1 { + return errors.New("更新失败") + } + + return nil +} + +// UpdateUserProfileFinValidWithSess 事务更新用户余额 +func UpdateUserProfileFinValidWithSess(sess *xorm.Session, uid interface{}, newAmount string) error { + update, err := sess.Where("uid=?", uid).Update(&model.UserProfile{FinValid: newAmount}) + if err != nil { + return err + } + if update != 1 { + return errors.New("更新失败") + } + + return nil +} diff --git a/app/db/db_user_relate.go b/app/db/db_user_relate.go new file mode 100644 index 0000000..380b80d --- /dev/null +++ b/app/db/db_user_relate.go @@ -0,0 +1,249 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils/logx" + + "xorm.io/xorm" +) + +// UserRelateInsert is 插入一条数据到用户关系表 +func UserRelateInsert(Db *xorm.Engine, userRelate *model.UserRelate) (int64, error) { + affected, err := Db.Insert(userRelate) + if err != nil { + return 0, err + } + return affected, nil +} +func UserRelateInsertWithSess(sess *xorm.Session, userRelate *model.UserRelate) (int64, error) { + affected, err := sess.Insert(userRelate) + if err != nil { + return 0, err + } + return affected, nil +} +func UserRelateUpdate(Db *xorm.Engine, userRelate *model.UserRelate) (int64, error) { + affected, err := Db.Where("parent_uid=? and uid=?", userRelate.ParentUid, userRelate.Uid).Cols("level,invite_time").Update(userRelate) + if err != nil { + return 0, err + } + return affected, nil +} + +//UserRelateByPuid is 获取用户关系列表 by puid +func UserRelatesByPuid(Db *xorm.Engine, puid interface{}, limit, start int) (*[]model.UserRelate, error) { + var m []model.UserRelate + if limit == 0 && start == 0 { + if err := Db.Where("parent_uid = ?", puid). + Cols(`id,parent_uid,uid,level,invite_time`). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.Where("parent_uid = ?", puid). + Cols(`id,parent_uid,uid,level,invite_time`).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + + return &m, nil +} + +//UserRelatesByPuidByLv is 获取用户关系列表 by puid 和lv +func UserRelatesByPuidByLv(Db *xorm.Engine, puid, lv interface{}, limit, start int) (*[]model.UserRelate, error) { + var m []model.UserRelate + if limit == 0 && start == 0 { + if err := Db.Where("parent_uid = ? AND level = ?", puid, lv). + Cols(`id,parent_uid,uid,level,invite_time`). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.Where("parent_uid = ? AND level = ?", puid, lv). + Cols(`id,parent_uid,uid,level,invite_time`).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + + return &m, nil +} + +//UserRelatesByPuidByLvByTime is 获取直属 level =1用户关系列表 by puid 和lv by time +func UserRelatesByPuidByLvByTime(Db *xorm.Engine, puid, lv, stime, etime interface{}, limit, start int) (*[]model.UserRelate, error) { + var m []model.UserRelate + if limit == 0 && start == 0 { + if err := Db.Where("parent_uid = ? AND level = ? AND invite_time > ? AND invite_time < ?", puid, lv, stime, etime). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.Where("parent_uid = ? AND level = ? AND invite_time > ? AND invite_time < ?", puid, lv, stime, etime). + Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + + return &m, nil +} + +//UserRelatesByPuidByTime is 获取户关系列表 by puid 和lv by time +func UserRelatesByPuidByTime(Db *xorm.Engine, puid, stime, etime interface{}, limit, start int) (*[]model.UserRelate, error) { + var m []model.UserRelate + if limit == 0 && start == 0 { + if err := Db.Where("parent_uid = ? AND invite_time > ? AND invite_time < ?", puid, stime, etime). + Cols(`id,parent_uid,uid,level,invite_time`). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.Where("parent_uid = ? AND invite_time > ? AND invite_time < ?", puid, stime, etime). + Cols(`id,parent_uid,uid,level,invite_time`).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + + return &m, nil +} + +//UserRelatesByPuidExceptLv is 获取用户关系列表 by puid 和非 lv +func UserRelatesByPuidExceptLv(Db *xorm.Engine, puid, lv interface{}, limit, start int) (*[]model.UserRelate, error) { + var m []model.UserRelate + if limit == 0 && start == 0 { + if err := Db.Where("parent_uid = ? AND level != ?", puid, lv). + Cols(`id,parent_uid,uid,level,invite_time`). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil + } + if err := Db.Where("parent_uid = ? AND level != ?", puid, lv). + Cols(`id,parent_uid,uid,level,invite_time`).Limit(limit, start). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + + return &m, nil +} + +//UserRelateByUID is 获取用户关系表 by uid +func UserRelateByUID(Db *xorm.Engine, uid interface{}) (*model.UserRelate, bool, error) { + r := new(model.UserRelate) + has, err := Db.Where("uid=?", uid).Get(r) + if err != nil { + return nil, false, err + } + return r, has, nil +} + +//UserRelateByUIDByLv is 获取用户关系表 by uid +func UserRelateByUIDByLv(Db *xorm.Engine, uid, lv interface{}) (*model.UserRelate, bool, error) { + r := new(model.UserRelate) + has, err := Db.Where("uid=? AND level=?", uid, lv).Get(r) + if err != nil { + return nil, false, err + } + return r, has, nil +} + +//UserRelateByUIDAndPUID 根据 Puid 和uid 查找 ,用于确认关联 +func UserRelateByUIDAndPUID(Db *xorm.Engine, uid, puid interface{}) (*model.UserRelate, bool, error) { + r := new(model.UserRelate) + has, err := Db.Where("uid=? AND parent_uid=?", uid, puid).Get(r) + if err != nil { + return nil, false, err + } + return r, has, nil +} + +//UserRelatesByPuIDAndLv is 查询用户关系表 获取指定等级和puid的关系 +func UserRelatesByPuIDAndLv(Db *xorm.Engine, puid, lv interface{}) (*[]model.UserRelate, error) { + var m []model.UserRelate + if err := Db.Where("parent_uid = ? AND level = ?", puid, lv). + Cols(`id,parent_uid,uid,level,invite_time`). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserRelateInByUID is In查询 +func UserRelateInByUID(Db *xorm.Engine, ids []int) (*[]model.UserRelate, error) { + var m []model.UserRelate + if err := Db.In("uid", ids). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +// UserRelatesByUIDDescLv is Where 查询 根据level 降序 +func UserRelatesByUIDDescLv(Db *xorm.Engine, id interface{}) (*[]model.UserRelate, error) { + var m []model.UserRelate + if err := Db.Where("uid = ?", id).Desc("level"). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} +func UserRelatesByInvite(Db *xorm.Engine, times interface{}) (*[]model.UserRelate, error) { + var m []model.UserRelate + if err := Db.Where("invite_time >= ?", times). + Find(&m); err != nil { + return nil, logx.Warn(err) + } + return &m, nil +} + +//UserRelateCountByPUID is 根据puid 计数 +func UserRelateCountByPUID(Db *xorm.Engine, pid interface{}) (int64, error) { + + count, err := Db.Where("parent_uid = ?", pid).Count(model.UserRelate{}) + if err != nil { + return 0, nil + } + return count, nil +} + +//UserRelateDelete is 删除关联他上级的关系记录,以及删除他下级的关联记录 +func UserRelateDelete(Db *xorm.Engine, uid interface{}) (int64, error) { + // 删除与之上级的记录 + _, err := Db.Where("uid = ?", uid).Delete(model.UserRelate{}) + if err != nil { + return 0, err + } + // 删除与之下级的记录 + _, err = Db.Where("parent_uid = ?", uid).Delete(model.UserRelate{}) + if err != nil { + return 0, err + } + + return 1, nil +} +func UserRelateDeleteWithSession(sess *xorm.Session, uid interface{}) (int64, error) { + // 删除与之上级的记录 + _, err := sess.Where("uid = ?", uid).Delete(model.UserRelate{}) + if err != nil { + return 0, err + } + // 删除与之下级的记录 + _, err = sess.Where("parent_uid = ?", uid).Delete(model.UserRelate{}) + if err != nil { + return 0, err + } + + return 1, nil +} + +//UserRelateDelete is 删除关联他上级的关系记录 +func UserRelateExtendDelete(Db *xorm.Engine, uid interface{}) (int64, error) { + // 删除与之上级的记录 + _, err := Db.Where("uid = ?", uid).Delete(model.UserRelate{}) + if err != nil { + return 0, err + } + return 1, nil +} diff --git a/app/db/dbs.go b/app/db/dbs.go new file mode 100644 index 0000000..9f02c9f --- /dev/null +++ b/app/db/dbs.go @@ -0,0 +1,104 @@ +package db + +import ( + "fmt" + "os" + "time" + + "xorm.io/xorm" + "xorm.io/xorm/log" + + "applet/app/cfg" + "applet/app/db/model" + "applet/app/utils/logx" +) + +var DBs map[string]*xorm.Engine + +// 每个站长都要有自己的syscfg 缓存, 键是站长id,值是缓存名 +// var SysCfgMapKey map[string]string + +func NewDB(c *cfg.DBCfg) (*xorm.Engine, error) { + db, err := xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", c.User, c.Psw, c.Host, c.Name)) + if err != nil { + return nil, err + } + db.SetConnMaxLifetime(c.MaxLifetime * time.Second) + db.SetMaxOpenConns(c.MaxOpenConns) + db.SetMaxIdleConns(c.MaxIdleConns) + err = db.Ping() + if err != nil { + return nil, err + } + if c.ShowLog { + db.ShowSQL(true) + db.Logger().SetLevel(log.LOG_DEBUG) + f, err := os.OpenFile(c.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777) + if err != nil { + os.RemoveAll(c.Path) + if f, err = os.OpenFile(c.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777); err != nil { + return nil, err + } + } + logger := log.NewSimpleLogger(f) + logger.ShowSQL(true) + db.SetLogger(logger) + } + return db, nil +} + +// InitDBs is 初始化多数据库 +func InitDBs(ch chan int) { + // 初始化多数据库 + var tables *[]model.DbMapping + InitMapDbs(cfg.DB, cfg.Prd) + ch <- 1 + // 每10s 查询一次模板数据库的db mapping 表,如果有新增数据库记录,则添加到 DBs中 + ticker := time.NewTicker(time.Duration(time.Second * 120)) + for range ticker.C { + if cfg.Prd { + tables = GetAllDatabasePrd() //默认获取全部 + } else { + tables = GetAllDatabaseDev() //默认获取全部 + } + if tables == nil { + logx.Warn("no database tables data") + continue + } + for _, item := range *tables { + _, ok := DBs[item.DbMasterId] + if !ok { + // 不在db.DBs 则添加进去 + dbCfg := cfg.DBCfg{ + Name: item.DbName, + ShowLog: cfg.DB.ShowLog, + MaxLifetime: cfg.DB.MaxLifetime, + MaxOpenConns: cfg.DB.MaxOpenConns, + MaxIdleConns: cfg.DB.MaxIdleConns, + Path: fmt.Sprintf(cfg.DB.Path, item.DbName), + } + if item.DbHost != "" && item.DbUsername != "" && item.DbPassword != "" { + dbCfg.Host = item.DbHost + dbCfg.User = item.DbUsername + dbCfg.Psw = item.DbPassword + } else { + dbCfg.Host = cfg.DB.Host + dbCfg.User = cfg.DB.User + dbCfg.Psw = cfg.DB.Psw + } + e, err := NewDB(&dbCfg) + if err != nil || e == nil { + logx.Warnf("db engine can't create, please check config, params[host:%s, user:%s, psw: %s, name: %s], err: %v", dbCfg.Host, dbCfg.User, dbCfg.Psw, dbCfg.Name, err) + } else { + DBs[item.DbMasterId] = e + } + } + // 如果 被禁用则删除 + if item.DeletedAt == 1 { + logx.Infof("%s have been removed", item.DbMasterId) + delete(DBs, item.DbMasterId) + } + } + } + +} diff --git a/app/db/dbs_map.go b/app/db/dbs_map.go new file mode 100644 index 0000000..9043ca0 --- /dev/null +++ b/app/db/dbs_map.go @@ -0,0 +1,232 @@ +package db + +import ( + model2 "applet/app/db/offical/model" + "errors" + "fmt" + + "xorm.io/xorm" + + "applet/app/cfg" + "applet/app/db/model" + "applet/app/utils/logx" +) + +func MapBaseExists() (bool, error) { + return Db.IsTableExist("db_mapping") +} + +func InitMapDbs(c *cfg.DBCfg, prd bool) { + var tables *[]model.DbMapping + exists, err := MapBaseExists() + if !exists || err != nil { + logx.Fatalf("db_mapping not exists : %v", err) + } + // tables := MapAllDatabases(debug) + if prd { + tables = GetAllDatabasePrd() //debug 获取生产 + } else { + tables = GetAllDatabaseDev() //debug 获取开发 + } + + if tables == nil { + logx.Fatal("no database tables data") + } + var e *xorm.Engine + DBs = map[string]*xorm.Engine{} + for _, v := range *tables { + if v.DbName != "" && v.DeletedAt == 0 && v.DbName != c.Name { + dbCfg := cfg.DBCfg{ + Name: v.DbName, + ShowLog: c.ShowLog, + MaxLifetime: c.MaxLifetime, + MaxOpenConns: c.MaxOpenConns, + MaxIdleConns: c.MaxIdleConns, + Path: fmt.Sprintf(c.Path, v.DbName), + } + if v.DbHost != "" && v.DbUsername != "" && v.DbPassword != "" { + dbCfg.Host = v.DbHost + dbCfg.User = v.DbUsername + dbCfg.Psw = v.DbPassword + } else { + dbCfg.Host = c.Host + dbCfg.User = c.User + dbCfg.Psw = c.Psw + } + e, err = NewDB(&dbCfg) + if err != nil || e == nil { + logx.Warnf("db engine can't create, please check config, params[host:%s, user:%s, psw: %s, name: %s], err: %v", dbCfg.Host, dbCfg.User, dbCfg.Psw, dbCfg.Name, err) + } else { + DBs[v.DbMasterId] = e + } + } + } +} + +func MapAllDatabases(debug bool) *[]model.DbMapping { + sql := "`db_name` != ?" + if debug { + sql = "`db_name` = ?" + } + var m []model.DbMapping + if err := Db.Where(sql, cfg.DB.Name).Find(&m); err != nil || len(m) == 0 { + logx.Warn(err) + return nil + } + return &m +} + +// GetAllDatabasePrd is 获取生成库 所有db 除了 deleted_at = 1 的 +func GetAllDatabasePrd() *[]model.DbMapping { + var m []model.DbMapping + if err := Db.Where("deleted_at != ? AND is_dev = '0' ", 1).Find(&m); err != nil || len(m) == 0 { + logx.Warn(err) + return nil + } + return &m +} + +// GetAllDatabaseDev is 获取开发库 所有db 除了 deleted_at = 1 的 +func GetAllDatabaseDev() *[]model.DbMapping { + var m []model.DbMapping + var err error + if cfg.Local { // 本地调试 加快速度 + //fmt.Println("notice:LOCAL TEST, only masterId:** 123456 ** available!") + err = Db.Where("deleted_at != ? AND is_dev = '1' AND db_master_id=?", 1, 123456).Find(&m) + //err = Db.Where(" db_master_id=?", 36274003).Find(&m) + } else { + err = Db.Where("deleted_at != ? AND is_dev = '1' ", 1).Find(&m) + } + + //err := Db.Where("deleted_at != ? AND is_dev = '1' and db_master_id='123456'", 1).Find(&m) + if err != nil || len(m) == 0 { + logx.Warn(err) + return nil + } + return &m +} + +// GetDatabaseByMasterID is 根据站长id 获取对应的的数据库信息 +func GetDatabaseByMasterID(Db *xorm.Engine, id string) (*model.DbMapping, error) { + var m model.DbMapping + has, err := Db.Where("db_master_id=?", id).Get(&m) + if !has { + return nil, errors.New("Not Found DB data by " + id) + } + if err != nil { + return nil, err + } + if m.DbHost == "" { + m.DbHost = cfg.DB.Host + m.DbUsername = cfg.DB.User + m.DbPassword = cfg.DB.Psw + } + return &m, nil +} + +// SessionGetDatabaseByMasterID is 根据站长id 获取对应的的数据库信息 +func SessionGetDatabaseByMasterID(Db *xorm.Session, id string) (*model.DbMapping, error) { + var m model.DbMapping + has, err := Db.Where("db_master_id=?", id).Get(&m) + if !has { + return nil, errors.New("Not Found DB data by " + id) + } + if err != nil { + return nil, err + } + if m.DbHost == "" { + m.DbHost = cfg.DB.Host + m.DbName = cfg.DB.Name + m.DbUsername = cfg.DB.User + m.DbPassword = cfg.DB.Psw + } + return &m, nil +} + +// 获取自动任务队列 +func MapCrontabCfg(eg *xorm.Engine) *[]model.SysCfg { + var c []model.SysCfg + // 数据库查询如果有下划线会认为是一个任意字符 + if err := eg.Where("`key` LIKE 'cron\\_%' AND val != ''").Cols("`key`,`val`").Find(&c); err != nil || len(c) == 0 { + logx.Warn(err) + return nil + } + return &c +} + +// 获取官方域名 +func GetOfficialDomainInfoByType(Db *xorm.Engine, masterId, key string) (string, error) { + type SysCfg struct { + K string + V string + Memo string + } + var domainBase SysCfg + + has, err := Db.Where("k=?", "domain_wap_base").Get(&domainBase) + if err != nil { + return "", err + } + if has == false { + return "", errors.New("can not find key by : domain_base") + } + + if key == "wap" { + return masterId + "." + domainBase.V, nil + } + + if key == "api" { + var apiDomain SysCfg + has, err = Db.Where("k=?", "domain_api_base").Get(&apiDomain) + if err != nil { + return "", err + } + if has == false { + return "", errors.New("can not find key by : domain_api_base") + } + return apiDomain.V, nil + } + + if key == "admin" { + return "admin." + masterId + "." + domainBase.V, nil + } + // 默认返回H5的 + return masterId + "." + domainBase.V, nil +} +func GetOfficialDomainInfoByTypeToAgent(Db *xorm.Engine, masterId, uuid, key string) (string, error) { + type SysCfg struct { + K string + V string + Memo string + } + var domainBase model2.MasterListCfg + has, err := Db.Where("uid=? and k=?", uuid, "domain_base").Get(&domainBase) + if err != nil { + return "", err + } + if has == false { + return "", errors.New("can not find key by : domain_base") + } + + if key == "wap" { + return masterId + ".h5." + domainBase.V, nil + } + + if key == "api" { + var apiDomain SysCfg + has, err = Db.Where("k=?", "domain_api_base").Get(&apiDomain) + if err != nil { + return "", err + } + if has == false { + return "", errors.New("can not find key by : domain_api_base") + } + return apiDomain.V, nil + } + + if key == "admin" { + return "admin." + masterId + "." + domainBase.V, nil + } + // 默认返回H5的 + return masterId + "." + domainBase.V, nil +} diff --git a/app/db/dbs_sys_cfg.go b/app/db/dbs_sys_cfg.go new file mode 100644 index 0000000..0225144 --- /dev/null +++ b/app/db/dbs_sys_cfg.go @@ -0,0 +1,55 @@ +package db + +import ( + "xorm.io/xorm" + + "applet/app/db/model" + "applet/app/utils/logx" +) + +// 系统配置get +func DbsSysCfgGetAll(eg *xorm.Engine) (*[]model.SysCfg, error) { + var cfgList []model.SysCfg + if err := eg.Cols("`key`,`val`").Find(&cfgList); cfgList == nil || err != nil { + return nil, logx.Error(err) + } + return &cfgList, nil +} + +// 获取一条记录 +func DbsSysCfgGet(eg *xorm.Engine, key string) (*model.SysCfg, error) { + var cfgList model.SysCfg + if has, err := eg.Where("`key`=?", key).Get(&cfgList); err != nil || has == false { + return nil, logx.Error(err) + } + return &cfgList, nil +} + +func DbsSysCfgInsert(eg *xorm.Engine, key, val string) bool { + cfg := model.SysCfg{Key: key, Val: val} + _, err := eg.Where("`key`=?", key).Cols("val,memo").Update(&cfg) + if err != nil { + logx.Error(err) + return false + } + return true +} +func DbsSysCfgInserts(eg *xorm.Engine, key, val string) bool { + cfg := model.SysCfg{Key: key, Val: val} + _, err := eg.InsertOne(&cfg) + if err != nil { + logx.Error(err) + return false + } + return true +} + +func DbsSysCfgUpdate(eg *xorm.Engine, key, val string) bool { + cfg := model.SysCfg{Key: key, Val: val} + _, err := eg.Where("`key`=?", key).Cols("val").Update(&cfg) + if err != nil { + logx.Error(err) + return false + } + return true +} diff --git a/app/db/model/cloud_bundle.go b/app/db/model/cloud_bundle.go new file mode 100644 index 0000000..31c7524 --- /dev/null +++ b/app/db/model/cloud_bundle.go @@ -0,0 +1,19 @@ +package model + +type CloudBundle struct { + Id int `json:"id" xorm:"not null pk autoincr INT(10)"` + Os int `json:"os" xorm:"not null default 1 comment('系统类型:1.Android; 2.IOS') TINYINT(1)"` + Ep int `json:"ep" xorm:" default 0 comment('') TINYINT(1)"` + Version string `json:"version" xorm:"not null default '' comment('版本号') VARCHAR(255)"` + Modules string `json:"modules" xorm:"not null default '' comment('包含的模块') VARCHAR(255)"` + ApplyAt int `json:"apply_at" xorm:"comment('申请时间') INT(11)"` + FinishAt int `json:"finish_at" xorm:"comment('完成时间') INT(11)"` + IsAuditing int `json:"is_auditing" xorm:"comment('完成时间') INT(11)"` + State int `json:"state" xorm:"not null default 1 comment('状态:正在排队0,正在同步代码1,正在更新配置2,正在混淆3,正在打包4,正在上传5,打包成功999,异常-1') SMALLINT(5)"` + Memo string `json:"memo" xorm:"comment('备注') TEXT"` + ErrorMsg string `json:"error_msg" xorm:"comment('错误信息') TEXT"` + Src string `json:"src" xorm:"comment('包源地址') VARCHAR(255)"` + BuildId string `json:"build_id" xorm:"comment('build版本ID') VARCHAR(255)"` + BuildNumber string `json:"build_number" xorm:"default '' VARCHAR(255)"` + TemplateDuringAudit string `json:"template_during_audit" xorm:"not null default '' VARCHAR(255)"` +} diff --git a/app/db/model/community_team_cate.go b/app/db/model/community_team_cate.go new file mode 100644 index 0000000..462304c --- /dev/null +++ b/app/db/model/community_team_cate.go @@ -0,0 +1,10 @@ +package model + +type CommunityTeamCate struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 comment('0是官方') INT(11)"` + StoreType int `json:"store_type" xorm:"default 0 comment('0官方自营店 1加盟店 2连锁店') INT(11)"` + Title string `json:"title" xorm:"VARCHAR(255)"` + Sort int `json:"sort" xorm:"default 0 INT(11)"` + IsShow int `json:"is_show" xorm:"default 0 INT(1)"` +} diff --git a/app/db/model/community_team_coupon.go b/app/db/model/community_team_coupon.go new file mode 100644 index 0000000..aeb2775 --- /dev/null +++ b/app/db/model/community_team_coupon.go @@ -0,0 +1,27 @@ +package model + +import ( + "time" +) + +type CommunityTeamCoupon struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Name string `json:"name" xorm:"comment('方案名称') VARCHAR(255)"` + Comment string `json:"comment" xorm:"comment('备注') VARCHAR(2048)"` + PublishTime time.Time `json:"publish_time" xorm:"comment('立即发布时间') DATETIME"` + Kind int `json:"kind" xorm:"not null comment('优惠券类型,1:立减,2:满减,3折扣') TINYINT(1)"` + IsReach int `json:"is_reach" xorm:"comment('是否有门槛,1:有,2:否;优惠券类型为3折扣时') TINYINT(1)"` + Cal string `json:"cal" xorm:"comment('满减及折扣有门槛时算法,{"reach": "20.12", "reduce": "2.2"}, reach:满X元,减/折reduce') VARCHAR(255)"` + State int `json:"state" xorm:"not null default 1 comment('状态,是否使用(1:使用;2:不使用)') TINYINT(1)"` + ActivityTimeStart time.Time `json:"activity_time_start" xorm:"not null comment('活动起止时间,开始时间') DATETIME"` + ActivityTimeEnd time.Time `json:"activity_time_end" xorm:"not null comment('活动起止时间,结束时间') DATETIME"` + ActivityStatement string `json:"activity_statement" xorm:"not null default '0' comment('活动规则说明') VARCHAR(5000)"` + Sort int `json:"sort" xorm:"comment('排序') INT(11)"` + Ext string `json:"ext" xorm:"comment('拓展字段') TEXT"` + IsPublishNow int `json:"is_publish_now" xorm:"not null default 0 comment('是否立即发布,0:否,1:是') TINYINT(1)"` + CreatedTime time.Time `json:"created_time" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') DATETIME"` + UpdatedTime time.Time `json:"updated_time" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') DATETIME"` + DeletedTime time.Time `json:"deleted_time" xorm:"comment('删除时间') DATETIME"` + StoreId int `json:"store_id" xorm:"default 0 INT(11)"` + StoreType int `json:"store_type" xorm:"default 0 comment('0官方自营店 1加盟店 2连锁店') INT(11)"` +} diff --git a/app/db/model/community_team_coupon_user.go b/app/db/model/community_team_coupon_user.go new file mode 100644 index 0000000..a98b4d4 --- /dev/null +++ b/app/db/model/community_team_coupon_user.go @@ -0,0 +1,25 @@ +package model + +import ( + "time" +) + +type CommunityTeamCouponUser struct { + Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"` + Uid int `json:"uid" xorm:"comment('用户id') index INT(11)"` + MerchantSchemeId int `json:"merchant_scheme_id" xorm:"comment('优惠券方案的id') INT(11)"` + IsUse int `json:"is_use" xorm:"comment('是否已使用:0否1是2失效') TINYINT(1)"` + Kind int `json:"kind" xorm:"comment('优惠券类型:1立减2满减3折扣') TINYINT(1)"` + Cal string `json:"cal" xorm:"not null default '0.00' comment('折扣算法json:形式:{"reach":"10.00", "reduce":"1.00"},无门槛reach为0') VARCHAR(255)"` + ValidTimeStart time.Time `json:"valid_time_start" xorm:"comment('有效日期开始') DATETIME"` + ValidTimeEnd time.Time `json:"valid_time_end" xorm:"comment('有效日期结束') DATETIME"` + UseRule int `json:"use_rule" xorm:"comment('1全部商品可用2指定商品3指定活动类型') TINYINT(1)"` + UseActivityType int `json:"use_activity_type" xorm:"comment('可用的活动类型: 1拼团活动 2秒杀活动 3砍价活动') TINYINT(1)"` + CreateTime time.Time `json:"create_time" xorm:"default CURRENT_TIMESTAMP comment('创建时间') DATETIME"` + UpdateTime time.Time `json:"update_time" xorm:"default CURRENT_TIMESTAMP comment('更新时间') DATETIME"` + StoreId int `json:"store_id" xorm:"default 0 comment('0是官方') INT(11)"` + StoreType int `json:"store_type" xorm:"default 0 comment('0官方自营店 1加盟店 2连锁店') INT(11)"` + Name string `json:"name" xorm:"comment('方案名称') VARCHAR(255)"` + ActivityStatement string `json:"activity_statement" xorm:"not null default '0' comment('活动规则说明') VARCHAR(5000)"` + Img string `json:"img" xorm:"VARCHAR(255)"` +} diff --git a/app/db/model/community_team_goods.go b/app/db/model/community_team_goods.go new file mode 100644 index 0000000..36f5338 --- /dev/null +++ b/app/db/model/community_team_goods.go @@ -0,0 +1,29 @@ +package model + +import ( + "time" +) + +type CommunityTeamGoods struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 comment('0是官方') INT(11)"` + StoreType int `json:"store_type" xorm:"default 0 comment('0官方自营店 1加盟店 2连锁店') INT(11)"` + Title string `json:"title" xorm:"VARCHAR(255)"` + Img string `json:"img" xorm:"VARCHAR(255)"` + Info string `json:"info" xorm:"comment('描述') VARCHAR(255)"` + Cid int `json:"cid" xorm:"default 0 INT(11)"` + State int `json:"state" xorm:"default 0 comment('0上架 1下架') INT(11)"` + CreateAt time.Time `json:"create_at" xorm:"DATETIME"` + UpdateAt time.Time `json:"update_at" xorm:"DATETIME"` + Price string `json:"price" xorm:"DECIMAL(10,2)"` + Stock int `json:"stock" xorm:"default 0 INT(11)"` + Spe string `json:"spe" xorm:"not null default '' comment('所有规格属性json') VARCHAR(5012)"` + LinePrice string `json:"line_price" xorm:"not null default 0.00 comment('划线价') DECIMAL(12,2)"` + SpeImages string `json:"spe_images" xorm:"not null comment('第一组规格值对应的图片json') TEXT"` + IsSingleSku int `json:"is_single_sku" xorm:"not null default 1 comment('是否单规格,0:否,1是') TINYINT(1)"` + Sort int `json:"sort" xorm:"default 0 INT(11)"` + IsSpeImageOn int `json:"is_spe_image_on" xorm:"not null default 0 comment('是否开启规格图片:0否 1是') TINYINT(1)"` + Commission string `json:"commission" xorm:"default 0.00 DECIMAL(20,2)"` + ImageList string `json:"image_list" xorm:"comment('商品图json') TEXT"` + SaleCount int `json:"sale_count" xorm:"default 0 INT(11)"` +} diff --git a/app/db/model/community_team_order.go b/app/db/model/community_team_order.go new file mode 100644 index 0000000..24e0df3 --- /dev/null +++ b/app/db/model/community_team_order.go @@ -0,0 +1,37 @@ +package model + +import ( + "time" +) + +type CommunityTeamOrder struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + StoreType int `json:"store_type" xorm:"default 0 comment('0官方自营店 1加盟店 2连锁店') INT(11)"` + StoreUid int `json:"store_uid" xorm:"default 0 comment('门店用户id') INT(11)"` + ParentUid int `json:"parent_uid" xorm:"default 0 comment('上级代理') INT(11)"` + Num int `json:"num" xorm:"default 0 comment('') INT(11)"` + CouponId int `json:"coupon_id" xorm:"default 0 comment('') INT(11)"` + Address string `json:"address" xorm:"comment('详细地址') VARCHAR(255)"` + Commission string `json:"commission" xorm:"default 0.00 comment('分佣(元)') DECIMAL(20,2)"` + CreateAt time.Time `json:"create_at" xorm:"DATETIME"` + UpdateAt time.Time `json:"update_at" xorm:"DATETIME"` + BuyPhone string `json:"buy_phone" xorm:"VARCHAR(255)"` + Phone string `json:"phone" xorm:"VARCHAR(255)"` + BuyName string `json:"buy_name" xorm:"VARCHAR(255)"` + State int `json:"state" xorm:"default 0 comment('0待付款 1已支付 2已提货') INT(11)"` + PayAt time.Time `json:"pay_at" xorm:"comment('付款时间') DATETIME"` + ConfirmAt time.Time `json:"confirm_at" xorm:"comment('提货时间') DATETIME"` + Oid int64 `json:"oid" xorm:"default 0 comment('主单号') BIGINT(20)"` + Code string `json:"code" xorm:"comment('提货码') VARCHAR(255)"` + Type int `json:"type" xorm:"default 0 comment('0自提 1外卖') INT(1)"` + PayMethod int `json:"pay_method" xorm:"default 0 comment('1余额 2支付宝 3微信') INT(11)"` + PayId string `json:"pay_id" xorm:"comment('第三方的支付id') VARCHAR(255)"` + Amount string `json:"amount" xorm:"default 0.00 comment('总金额') DECIMAL(20,2)"` + Memo string `json:"memo" xorm:"comment('备注') VARCHAR(255)"` + TakeTime time.Time `json:"take_time" xorm:"comment('预计提货时间') DATETIME"` + MealNum int `json:"meal_num" xorm:"default 0 comment('餐具数量') INT(11)"` + Coupon string `json:"coupon" xorm:"default 0.00 DECIMAL(10,2)"` + Timer string `json:"timer" xorm:"comment('预计提货时间') VARCHAR(255)"` + IsNow int `json:"is_now" xorm:"default 0 comment('是否立即提货') INT(1)"` +} diff --git a/app/db/model/community_team_order_info.go b/app/db/model/community_team_order_info.go new file mode 100644 index 0000000..20eddb5 --- /dev/null +++ b/app/db/model/community_team_order_info.go @@ -0,0 +1,13 @@ +package model + +type CommunityTeamOrderInfo struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Oid int64 `json:"oid" xorm:"BIGINT(20)"` + Title string `json:"title" xorm:"comment('标题') VARCHAR(255)"` + Img string `json:"img" xorm:"comment('图片') VARCHAR(255)"` + Price string `json:"price" xorm:"default 0.00 comment('单价') DECIMAL(10,2)"` + Num int `json:"num" xorm:"default 0 comment('数量') INT(11)"` + SkuInfo string `json:"sku_info" xorm:"comment('sku信息') VARCHAR(255)"` + GoodsId int `json:"goods_id" xorm:"default 0 INT(11)"` + SkuId int `json:"sku_id" xorm:"default 0 INT(11)"` +} diff --git a/app/db/model/community_team_sku.go b/app/db/model/community_team_sku.go new file mode 100644 index 0000000..3342e7f --- /dev/null +++ b/app/db/model/community_team_sku.go @@ -0,0 +1,20 @@ +package model + +import ( + "time" +) + +type CommunityTeamSku struct { + SkuId int64 `json:"sku_id" xorm:"not null pk autoincr BIGINT(20)"` + GoodsId int `json:"goods_id" xorm:"not null comment('商品id') INT(11)"` + Price string `json:"price" xorm:"not null default 0.00 comment('价格') DECIMAL(12,2)"` + CreateTime time.Time `json:"create_time" xorm:"default CURRENT_TIMESTAMP comment('创建时间') DATETIME"` + UpdateTime time.Time `json:"update_time" xorm:"default CURRENT_TIMESTAMP comment('更新时间') DATETIME"` + Stock int `json:"stock" xorm:"not null default 0 comment('库存') INT(11)"` + Indexes string `json:"indexes" xorm:"not null default '' comment('规格值组合的下标') VARCHAR(100)"` + Sku string `json:"sku" xorm:"not null comment('规格组合json') VARCHAR(2048)"` + SaleCount int `json:"sale_count" xorm:"not null default 0 comment('销量') INT(11)"` + Sort int `json:"sort" xorm:"not null default 0 comment('排序') INT(11)"` + Discount string `json:"discount" xorm:"default 10.00 comment('折扣,为10无折扣') DECIMAL(6,2)"` + SkuCode string `json:"sku_code" xorm:"default '' comment('sku编码') VARCHAR(255)"` +} diff --git a/app/db/model/community_team_store.go b/app/db/model/community_team_store.go new file mode 100644 index 0000000..60cc0f0 --- /dev/null +++ b/app/db/model/community_team_store.go @@ -0,0 +1,24 @@ +package model + +import ( + "time" +) + +type CommunityTeamStore struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + StoreType int `json:"store_type" xorm:"default 0 comment('0官方自营店 1加盟店 2连锁店') INT(11)"` + ParentUid int `json:"parent_uid" xorm:"default 0 comment('上级代理') INT(11)"` + Lat string `json:"lat" xorm:"default 0.000000 comment('纬度') DECIMAL(30,6)"` + Lng string `json:"lng" xorm:"default 0.000000 comment('经度') DECIMAL(30,6)"` + Address string `json:"address" xorm:"comment('详细地址') VARCHAR(255)"` + Commission string `json:"commission" xorm:"default 0.00 comment('分佣比例%') DECIMAL(20,2)"` + CreateAt time.Time `json:"create_at" xorm:"DATETIME"` + UpdateAt time.Time `json:"update_at" xorm:"DATETIME"` + State int `json:"state" xorm:"default 0 comment('0非店长 1店长') INT(1)"` + WorkState int `json:"work_state" xorm:"default 0 comment('0营业中 1休息中') INT(1)"` + Name string `json:"name" xorm:"VARCHAR(255)"` + Province string `json:"province" xorm:"comment('省级的名称') VARCHAR(255)"` + City string `json:"city" xorm:"comment('市级的名称') VARCHAR(255)"` + District string `json:"district" xorm:"comment('县,区名称') VARCHAR(255)"` +} diff --git a/app/db/model/community_team_store_like.go b/app/db/model/community_team_store_like.go new file mode 100644 index 0000000..586346f --- /dev/null +++ b/app/db/model/community_team_store_like.go @@ -0,0 +1,12 @@ +package model + +import ( + "time" +) + +type CommunityTeamStoreLike struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"default 0 INT(11)"` + StoreId int `json:"store_id" xorm:"default 0 INT(11)"` + Time time.Time `json:"time" xorm:"DATETIME"` +} diff --git a/app/db/model/db_mapping.go b/app/db/model/db_mapping.go new file mode 100644 index 0000000..f2f5d06 --- /dev/null +++ b/app/db/model/db_mapping.go @@ -0,0 +1,18 @@ +package model + +import ( + "time" +) + +type DbMapping struct { + DbMasterId string `json:"db_master_id" xorm:"not pk null comment('站长id') VARCHAR(32)"` + DbHost string `json:"db_host" xorm:"not null default '' comment('数据库连接(带port)') VARCHAR(255)"` + DbUsername string `json:"db_username" xorm:"not null default '' comment('数据库用户名') VARCHAR(255)"` + DbPassword string `json:"db_password" xorm:"not null default '' comment('数据库用户名密码') VARCHAR(255)"` + DbName string `json:"db_name" xorm:"not null comment('数据库名') VARCHAR(255)"` + ExternalMysql string `json:"external_mysql" xorm:"not null default '0' comment('是否外部mysql(0是内部,1是外部)') VARCHAR(255)"` + IsDev int `json:"is_dev" xorm:"not null default 0 comment('开发库是1,0是生产库') TINYINT(1)"` + CreatedAt time.Time `json:"created_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"` + UpdatedAt time.Time `json:"updated_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"` + DeletedAt int `json:"deleted_at" xorm:"not null default 0 comment('是否已删除') TINYINT(1)"` +} diff --git a/app/db/model/fin_user_flow.go b/app/db/model/fin_user_flow.go new file mode 100644 index 0000000..785da48 --- /dev/null +++ b/app/db/model/fin_user_flow.go @@ -0,0 +1,30 @@ +package model + +import ( + "time" +) + +type FinUserFlow struct { + Id int64 `json:"id" xorm:"pk autoincr comment('流水编号') BIGINT(20)"` + Uid int `json:"uid" xorm:"not null default 0 comment('用户id') INT(11)"` + Type int `json:"type" xorm:"not null default 0 comment('0收入,1支出') TINYINT(1)"` + Amount string `json:"amount" xorm:"not null default 0.0000 comment('变动金额') DECIMAL(11,4)"` + BeforeAmount string `json:"before_amount" xorm:"not null default 0.0000 comment('变动前金额') DECIMAL(11,4)"` + AfterAmount string `json:"after_amount" xorm:"not null default 0.0000 comment('变动后金额') DECIMAL(11,4)"` + SysFee string `json:"sys_fee" xorm:"not null default 0.0000 comment('手续费') DECIMAL(11,4)"` + PaymentType int `json:"payment_type" xorm:"not null default 1 comment('1支付宝,2微信.3手动转账') TINYINT(1)"` + OrdType string `json:"ord_type" xorm:"not null default '' comment('订单类型taobao,jd,pdd,vip,suning,kaola,own自营,withdraw提现') VARCHAR(20)"` + OrdId string `json:"ord_id" xorm:"not null default '' comment('对应订单编号') VARCHAR(50)"` + OrdTitle string `json:"ord_title" xorm:"not null default '' comment('订单标题') VARCHAR(50)"` + OrdAction int `json:"ord_action" xorm:"not null default 0 comment('10自购,11推广,12团队,20提现,21消费') TINYINT(2)"` + OrdTime int `json:"ord_time" xorm:"not null default 0 comment('下单时间or提现时间') INT(11)"` + OrdDetail string `json:"ord_detail" xorm:"not null default '' comment('记录商品ID或提现账号') VARCHAR(50)"` + ExpectedTime string `json:"expected_time" xorm:"not null default '0' comment('预期到账时间,字符串用于直接显示,结算后清除内容') VARCHAR(30)"` + State int `json:"state" xorm:"not null default 1 comment('1未到账,2已到账') TINYINT(1)"` + Memo string `json:"memo" xorm:"not null default '' comment('备注') VARCHAR(2000)"` + OtherId int64 `json:"other_id" xorm:"not null default 0 comment('其他关联订单,具体根据订单类型判断') BIGINT(20)"` + AliOrdId string `json:"ali_ord_id" xorm:"default '' comment('支付宝订单号') VARCHAR(128)"` + ExtendType int `json:"extend_type" xorm:"not null default 1 comment('') TINYINT(1)"` + CreateAt time.Time `json:"create_at" xorm:"created not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"updated not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"` +} diff --git a/app/db/model/sys_cfg.go b/app/db/model/sys_cfg.go new file mode 100644 index 0000000..22d906b --- /dev/null +++ b/app/db/model/sys_cfg.go @@ -0,0 +1,7 @@ +package model + +type SysCfg struct { + Key string `json:"key" xorm:"not null pk comment('键') VARCHAR(127)"` + Val string `json:"val" xorm:"comment('值') TEXT"` + Memo string `json:"memo" xorm:"not null default '' comment('备注') VARCHAR(255)"` +} diff --git a/app/db/model/sys_module.go b/app/db/model/sys_module.go new file mode 100644 index 0000000..9a1b1d8 --- /dev/null +++ b/app/db/model/sys_module.go @@ -0,0 +1,35 @@ +package model + +import ( + "time" +) + +type SysModule struct { + ModId int `json:"mod_id" xorm:"not null pk autoincr INT(10)"` + ModPid int `json:"mod_pid" xorm:"not null default 0 comment('父级模块ID') INT(10)"` + TemplateId int `json:"template_id" xorm:"not null default 0 comment('模板ID') INT(11)"` + ModName string `json:"mod_name" xorm:"not null default '' comment('模块名称') VARCHAR(250)"` + Position string `json:"position" xorm:"not null default '' comment('位置') VARCHAR(250)"` + SkipIdentifier string `json:"skip_identifier" xorm:"not null default '' comment('跳转标识') VARCHAR(250)"` + Title string `json:"title" xorm:"not null default '' comment('标题') VARCHAR(128)"` + Subtitle string `json:"subtitle" xorm:"not null default '' comment('副标题') VARCHAR(255)"` + Url string `json:"url" xorm:"not null default '' comment('跳转链接') VARCHAR(512)"` + Margin string `json:"margin" xorm:"not null default '0,0,0,0' comment('边距,上右下左') VARCHAR(64)"` + AspectRatio string `json:"aspect_ratio" xorm:"not null default 0.00 comment('宽高比,宽/高保留两位小数') DECIMAL(4,2)"` + Icon string `json:"icon" xorm:"not null default '' comment('图标') VARCHAR(512)"` + Img string `json:"img" xorm:"not null default '' comment('图片') VARCHAR(512)"` + FontColor string `json:"font_color" xorm:"not null default '' comment('文字颜色') VARCHAR(128)"` + BgImg string `json:"bg_img" xorm:"not null default '' comment('背景图片') VARCHAR(512)"` + BgColor string `json:"bg_color" xorm:"not null default '' comment('背景颜色') VARCHAR(512)"` + BgColorT string `json:"bg_color_t" xorm:"not null default '' comment('背景颜色过度') VARCHAR(255)"` + Badge string `json:"badge" xorm:"not null default '' comment('badge图片') VARCHAR(512)"` + Path string `json:"path" xorm:"not null default '' comment('跳转路径') VARCHAR(255)"` + Data string `json:"data" xorm:"comment('内容') TEXT"` + Sort int `json:"sort" xorm:"not null default 0 comment('排序') INT(11)"` + Uid int `json:"uid" xorm:"not null default 0 comment('排序') INT(11)"` + State int `json:"state" xorm:"not null default 1 comment('0不显示,1显示') TINYINT(1)"` + IsGlobal int `json:"is_global" xorm:"not null default 0 comment('是否全局显示') TINYINT(1)"` + Platform int `json:"platform" xorm:"not null default 1 comment('平台;1:全平台;2:App应用(ios和android);3:H5(wap);4:微信小程序;5:抖音小程序;6:百度小程序') TINYINT(1)"` + CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"` +} diff --git a/app/db/model/sys_popup.go b/app/db/model/sys_popup.go new file mode 100644 index 0000000..6ff4e5d --- /dev/null +++ b/app/db/model/sys_popup.go @@ -0,0 +1,28 @@ +package model + +import ( + "time" +) + +type SysPopup struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"not null default 0 INT(11)"` + Name string `json:"name" xorm:"not null default '' VARCHAR(32)"` + ConditionType string `json:"condition_type" xorm:"not null default 'all' comment('展示人群类型;all:所有人;new_user:新用户;level:指定等级;tag:指定标签;no_order_user:未出单用户') VARCHAR(32)"` + Condition string `json:"condition" xorm:"not null comment('弹窗条件,json') TEXT"` + Position string `json:"position" xorm:"not null default 'index' comment('展示位置;index:首页') VARCHAR(64)"` + Image string `json:"image" xorm:"not null default '' comment('弹窗图片') VARCHAR(128)"` + Platform string `json:"platform" xorm:"not null default '' comment('弹窗图片') VARCHAR(255)"` + Interval int `json:"interval" xorm:"not null default 0 comment('弹窗时间间隔;单位:分钟') INT(11)"` + Skip string `json:"skip" xorm:"not null default '' comment('跳转标识') VARCHAR(255)"` + Type int `json:"type" xorm:"not null default 1 comment('弹窗时间类型;1:固定时间;2:每天定时') TINYINT(1)"` + PopupTime string `json:"popup_time" xorm:"comment('弹窗时间,json') TEXT"` + State int `json:"state" xorm:"not null default 0 comment('状态;0:不启用;1:启用') TINYINT(1)"` + Sort int `json:"sort" xorm:"not null default 0 comment('排序') INT(11)"` + PopupType int `json:"popup_type" xorm:"not null default 0 comment('弹窗类型 0活动弹窗 1任务弹窗') INT(11)"` + TaskType int `json:"task_type" xorm:"not null default 0 comment('任务类型') INT(11)"` + TaskFinishType int `json:"task_finish_type" xorm:"not null default 0 comment('任务完成状态') INT(11)"` + CreateAt time.Time `json:"create_at" xorm:"default 'CURRENT_TIMESTAMP' TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"default 'CURRENT_TIMESTAMP' TIMESTAMP"` + IsNotClose int `json:"is_not_close" xorm:"not null default 0 comment('不能关闭 0能关 1不能关') INT(1)"` +} diff --git a/app/db/model/sys_push_app.go b/app/db/model/sys_push_app.go new file mode 100644 index 0000000..5d0ee70 --- /dev/null +++ b/app/db/model/sys_push_app.go @@ -0,0 +1,22 @@ +package model + +import ( + "time" +) + +type SysPushApp struct { + Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"` + Title string `json:"title" xorm:"not null default '' comment('标题') VARCHAR(32)"` + Content string `json:"content" xorm:"not null comment('内容') TEXT"` + Image string `json:"image" xorm:"not null default '' comment('图片(只有官方才有图片)') VARCHAR(255)"` + Provider string `json:"provider" xorm:"not null default 'mob' comment('平台供应商,如:mob,official:官方推送') VARCHAR(16)"` + Type string `json:"type" xorm:"not null default '' comment('模板类型 | 推送类型;public;:普通推送;activity:活动通知;order_self:新订单提醒(导购自购新订单),order_team:新订单提醒(团队新订单),order_share:新订单提醒(导购分享新订单),member_register:团队成员注册成功,level_upgrade:团队成员等级升级成功,withdraw_fail:提现失败提醒,withdraw_success:提现成功提醒,comission_settle_success:佣金结算提醒(平台结算)') VARCHAR(50)"` + SendAt int `json:"send_at" xorm:"not null default 0 comment('指定发送时间0为马上执行') INT(11)"` + State int `json:"state" xorm:"not null default 1 comment('1发送中,2成功,3失败,4部分成功') TINYINT(1)"` + DeviceProvider int `json:"device_provider" xorm:"default 1 comment('推送设备平台。1:全平台;2:安卓;3:ios') TINYINT(1)"` + Target int `json:"target" xorm:"not null default 1 comment('推送目标;1:全部会员;2:指定会员;3:指定等级;4:指定标签') TINYINT(1)"` + TargetCondition string `json:"target_condition" xorm:"comment('推送目标条件。json格式;') TEXT"` + Skip string `json:"skip" xorm:"not null default '' comment('跳转功能') VARCHAR(255)"` + CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"` +} diff --git a/app/db/model/sys_push_sms.go b/app/db/model/sys_push_sms.go new file mode 100644 index 0000000..ef63a2b --- /dev/null +++ b/app/db/model/sys_push_sms.go @@ -0,0 +1,19 @@ +package model + +import ( + "time" +) + +type SysPushSms struct { + Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"` + Content string `json:"content" xorm:"not null comment('内容') TEXT"` + Provider string `json:"provider" xorm:"not null default '' comment('短信供应平台,暂时没有') VARCHAR(20)"` + SendAt int `json:"send_at" xorm:"not null default 0 comment('指定发送时间0为马上执行') INT(10)"` + State int `json:"state" xorm:"not null default 0 comment('0发送中,1成功,2失败,3部分成功') TINYINT(1)"` + Target int `json:"target" xorm:"not null default 1 comment('推送目标;1:全部会员;2:指定会员;3:指定等级;4:指定标签') TINYINT(1)"` + TargetCondition string `json:"target_condition" xorm:"comment('推送目标条件。json格式;') TEXT"` + Skip string `json:"skip" xorm:"not null default '' comment('跳转功能') VARCHAR(255)"` + CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP comment('创建时间') TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"` + Type string `json:"type" xorm:"not null default '' comment('模板类型 | 推送类型;public;:普通推送;activity:活动通知;order_self:新订单提醒(导购自购新订单),order_team:新订单提醒(团队新订单),order_share:新订单提醒(导购分享新订单),member_register:团队成员注册成功,level_upgrade:团队成员等级升级成功,withdraw_fail:提现失败提醒,withdraw_success:提现成功提醒,comission_settle_success:佣金结算提醒(平台结算)') VARCHAR(50)"` +} diff --git a/app/db/model/sys_push_template.go b/app/db/model/sys_push_template.go new file mode 100644 index 0000000..ec82030 --- /dev/null +++ b/app/db/model/sys_push_template.go @@ -0,0 +1,17 @@ +package model + +import ( + "time" +) + +type SysPushTemplate struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + IsAppPush int `json:"is_app_push" xorm:"not null default 1 comment('是否app推送') TINYINT(1)"` + IsSmsPush int `json:"is_sms_push" xorm:"not null default 0 comment('是否短信推送') TINYINT(1)"` + Type string `json:"type" xorm:"not null default '' comment('模板类型') VARCHAR(50)"` + Title string `json:"title" xorm:"not null default '' comment('标题') VARCHAR(128)"` + Content string `json:"content" xorm:"not null comment('内容') TEXT"` + Skip string `json:"skip" xorm:"not null default '' comment('跳转功能') VARCHAR(255)"` + CreateAt time.Time `json:"create_at" xorm:"default CURRENT_TIMESTAMP TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"default CURRENT_TIMESTAMP TIMESTAMP"` +} diff --git a/app/db/model/sys_push_user.go b/app/db/model/sys_push_user.go new file mode 100644 index 0000000..d4a2157 --- /dev/null +++ b/app/db/model/sys_push_user.go @@ -0,0 +1,18 @@ +package model + +import ( + "time" +) + +type SysPushUser struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + PushId int `json:"push_id" xorm:"not null default 0 comment('sys_push_app表ID') index INT(11)"` + Uid int `json:"uid" xorm:"not null default 0 INT(11)"` + State int `json:"state" xorm:"not null default 0 comment('发送状态;0:失败;1:成功') TINYINT(1)"` + Time time.Time `json:"time" xorm:"default CURRENT_TIMESTAMP comment('发送时间') TIMESTAMP"` + SendData string `json:"send_data" xorm:"comment('发送内容,json格式') TEXT"` + Provider string `json:"provider" xorm:"not null default 'mob' comment('平台供应商,如:mob,official:官方推送') VARCHAR(16)"` + Type string `json:"type" xorm:"not null default '' comment('模板类型 | 推送类型;public;:普通推送;activity:活动通知;order_self:新订单提醒(导购自购新订单),order_team:新订单提醒(团队新订单),order_share:新订单提醒(导购分享新订单),member_register:团队成员注册成功,level_upgrade:团队成员等级升级成功,withdraw_fail:提现失败提醒,withdraw_success:提现成功提醒,comission_settle_success:佣金结算提醒(平台结算)') VARCHAR(50)"` + SendAt int `json:"send_at" xorm:"not null default 0 comment('官方活动显示时间(大于当前时间戳才显示);0为即可显示') INT(11)"` + IsRead int `json:"is_read" xorm:"not null default 0 comment('是否已读;0:未读;1:已读') TINYINT(1)"` +} diff --git a/app/db/model/sys_template.go b/app/db/model/sys_template.go new file mode 100644 index 0000000..c9814ad --- /dev/null +++ b/app/db/model/sys_template.go @@ -0,0 +1,20 @@ +package model + +import ( + "time" +) + +type SysTemplate struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uid int `json:"uid" xorm:"not null default 0 INT(11)"` + Name string `json:"name" xorm:"not null default '' comment('模板名称') VARCHAR(32)"` + Title string `json:"title" xorm:"not null default '' comment('页面title字段') VARCHAR(32)"` + Type string `json:"type" xorm:"not null default 'index' comment('模板类型;index:首页;bottom:底部导航栏;member:会员中心;custom:自定义模板;share_goods_image:商品图文分享;share_goods_link:商品链接分享;share_goods_platform_xx:商品分享平台(xx对应平台类型)') VARCHAR(64)"` + Image string `json:"image" xorm:"not null default '' VARCHAR(128)"` + IsUse int `json:"is_use" xorm:"default 0 comment('是否使用;1:使用;0未使用') TINYINT(1)"` + Remark string `json:"remark" xorm:"not null default '' comment('备注') VARCHAR(128)"` + LimitData string `json:"limit_data" xorm:"not null comment('') TEXT"` + IsSystem int `json:"is_system" xorm:"not null default 0 comment('是否系统模板;0:否;1:是') TINYINT(1)"` + CreateAt time.Time `json:"create_at" xorm:"default CURRENT_TIMESTAMP TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"default CURRENT_TIMESTAMP TIMESTAMP"` +} diff --git a/app/db/model/user.go b/app/db/model/user.go new file mode 100644 index 0000000..0c5c5dc --- /dev/null +++ b/app/db/model/user.go @@ -0,0 +1,37 @@ +package model + +import ( + "time" +) + +type User struct { + Uid int `json:"uid" xorm:"not null pk autoincr comment('主键ID') INT(10)"` + Username string `json:"username" xorm:"not null default '' comment('用户名') index VARCHAR(50)"` + Password string `json:"password" xorm:"not null default '' comment('密码') CHAR(32)"` + Passcode string `json:"passcode" xorm:"not null default '' comment('支付密码') CHAR(32)"` + Email string `json:"email" xorm:"not null default '' comment('邮箱') VARCHAR(128)"` + Phone string `json:"phone" xorm:"not null default '' comment('联系电话') index VARCHAR(20)"` + Nickname string `json:"nickname" xorm:"not null default '' comment('昵称') VARCHAR(20)"` + Level int `json:"level" xorm:"not null default 0 comment('用户等级id') INT(11)"` + IsStore int `json:"is_store" xorm:"not null default 0 comment('') INT(11)"` + InviteTotal int `json:"invite_total" xorm:"not null default 0 comment('直推邀请总人数') INT(11)"` + LevelArriveAt time.Time `json:"level_arrive_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('到达该等级的时间') TIMESTAMP"` + LevelExpireAt time.Time `json:"level_expire_at" xorm:"not null default '0000-00-00 00:00:00' comment('该等级过期时间') TIMESTAMP"` + CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"default 'CURRENT_TIMESTAMP' comment('最后修改资料时间') TIMESTAMP"` + LastLoginAt time.Time `json:"last_login_at" xorm:"default 'CURRENT_TIMESTAMP' comment('最近登录时间') TIMESTAMP"` + DeleteAt int `json:"delete_at" xorm:"not null default 0 comment('是否删除;0未删除;1已删除') TINYINT(1)"` + State int `json:"state" xorm:"not null default 1 comment('0未激活,1正常,2冻结') TINYINT(1)"` + LastLoginIp string `json:"last_login_ip" xorm:"not null default '' comment('最后登录IP') VARCHAR(64)"` + RegisterIp string `json:"register_ip" xorm:"not null default '' comment('注册IP') VARCHAR(64)"` + IsFake int `json:"is_fake" xorm:"not null default 0 comment('0真实 1虚拟') TINYINT(1)"` + IsMarketer int `json:"is_marketer" xorm:"not null default 0 comment('是否市商 0否 1是') TINYINT(1)"` + CanChangeLv int `json:"can_change_lv" xorm:"not null default 0 comment('是否市商 0否 1是') TINYINT(1)"` + IsPop int `json:"is_pop" xorm:"not null default 0 comment('是否市商 0否 1是') TINYINT(1)"` + IsNotAddMoments int `json:"is_not_add_moments" xorm:"not null default 0 comment('是否市商 0否 1是') TINYINT(1)"` + Zone string `json:"zone" xorm:"not null default '86' comment('区号') VARCHAR(100)"` + SalePhone string `json:"sale_phone" xorm:"not null default '' comment('') VARCHAR(100)"` + Platform string `json:"platform" xorm:"not null default '' comment('') VARCHAR(100)"` + ImportFinTotal string `json:"import_fin_total" xorm:"not null default 0.000000 comment('累计总收益') DECIMAL(30,4)"` + FinTotal string `json:"fin_total" xorm:"not null default 0.000000 comment('累计总收益') DECIMAL(30,4)"` +} diff --git a/app/db/model/user_app_domain.go b/app/db/model/user_app_domain.go new file mode 100644 index 0000000..4522cef --- /dev/null +++ b/app/db/model/user_app_domain.go @@ -0,0 +1,8 @@ +package model + +type UserAppDomain struct { + Domain string `json:"domain" xorm:"not null pk comment('绑定域名') VARCHAR(100)"` + Uuid int `json:"uuid" xorm:"not null comment('对应APP ID编号') index unique(IDX_UUID_TYPE) INT(10)"` + Type string `json:"type" xorm:"not null comment('api接口域名,wap.h5域名,admin管理后台') unique(IDX_UUID_TYPE) ENUM('admin','api','wap')"` + IsSsl int `json:"is_ssl" xorm:"not null default 0 comment('是否开启ssl:0否;1是') TINYINT(255)"` +} diff --git a/app/db/model/user_app_list.go b/app/db/model/user_app_list.go new file mode 100644 index 0000000..58b6cb5 --- /dev/null +++ b/app/db/model/user_app_list.go @@ -0,0 +1,8 @@ +package model + +type UserAppList struct { + Id int `json:"id" xorm:"int(11) NOT NULL "` + Uuid int64 `json:"uuid" xorm:"int(10) NOT NULL "` + AppId int64 `json:"app_id" xorm:"int(10) NOT NULL "` + SmsPlatform string `json:"sms_platform" xorm:"varchar(255) DEFAULT 'mob' "` +} diff --git a/app/db/model/user_level.go b/app/db/model/user_level.go new file mode 100644 index 0000000..94726aa --- /dev/null +++ b/app/db/model/user_level.go @@ -0,0 +1,23 @@ +package model + +import ( + "time" +) + +type UserLevel struct { + Id int `json:"id" xorm:"not null pk autoincr comment('等级id') INT(11)"` + BenefitIds string `json:"benefit_ids" xorm:"comment('该等级拥有的权益id【json】') TEXT"` + LevelName string `json:"level_name" xorm:"not null default '' comment('等级名称') VARCHAR(255)"` + LevelWeight int `json:"level_weight" xorm:"not null default 0 comment('等级权重') INT(11)"` + LevelUpdateCondition int `json:"level_update_condition" xorm:"not null default 2 comment('2是条件升级,1是无条件升级') TINYINT(1)"` + AutoAudit int `json:"auto_audit" xorm:"not null default 0 comment('(自动审核)0关闭,1开启') TINYINT(1)"` + AutoUpdate int `json:"auto_update" xorm:"not null default 0 comment('(自动升级)0关闭,1开启') TINYINT(1)"` + LevelDate int `json:"level_date" xorm:"default 0 comment('会员有效期(0永久有效,单位月)') INT(11)"` + IsUse int `json:"is_use" xorm:"not null default 1 comment('是否开启(0否,1是)') TINYINT(1)"` + ChoosableNum int `json:"choosable_num" xorm:"default 0 comment('可选任务数量(当is_must_task为0时生效)') INT(6)"` + BeforeHide int `json:"before_hide" xorm:"default 0 comment('可选任务数量(当is_must_task为0时生效)') INT(6)"` + Label int `json:"label" xorm:"default 0 comment('') INT(6)"` + Memo string `json:"memo" xorm:"default '' comment('备注') VARCHAR(255)"` + CssSet string `json:"css_set" xorm:"TEXT"` + CreateAt time.Time `json:"create_at" xorm:"not null default CURRENT_TIMESTAMP TIMESTAMP"` +} diff --git a/app/db/model/user_profile.go b/app/db/model/user_profile.go new file mode 100644 index 0000000..ca6f3b6 --- /dev/null +++ b/app/db/model/user_profile.go @@ -0,0 +1,102 @@ +package model + +import ( + "time" +) + +type UserProfile struct { + Uid int `json:"uid" xorm:"not null pk comment('关联userID') INT(20)"` + ArkidUid int `json:"arkid_uid" xorm:"not null default 0 comment('Arkid 用户ID') INT(20)"` + ParentUid int `json:"parent_uid" xorm:"not null default 0 comment('上级ID') INT(20)"` + ArkidToken string `json:"arkid_token" xorm:"not null default '' comment('token') VARCHAR(2000)"` + AvatarUrl string `json:"avatar_url" xorm:"not null default '' comment('头像URL') VARCHAR(2000)"` + CustomInviteCode string `json:"custom_invite_code" xorm:"not null default '' comment('邀请码(自定义)') VARCHAR(16)"` + InviteCode string `json:"invite_code" xorm:"not null default '' comment('邀请码(系统)') VARCHAR(16)"` + Gender int `json:"gender" xorm:"not null default 2 comment('性别0女,1男,2未知') TINYINT(1)"` + Birthday int `json:"birthday" xorm:"not null default 0 comment('出生日期') INT(10)"` + AccWxId string `json:"acc_wx_id" xorm:"not null default '' comment('账户_微信id') VARCHAR(50)"` + AccWxOpenid string `json:"acc_wx_openid" xorm:"not null default '' comment('账户_微信openid') VARCHAR(80)"` + AccTaobaoNickname string `json:"acc_taobao_nickname" xorm:"not null default '' comment('淘宝昵称') VARCHAR(50)"` + AccTaobaoAuthTime int64 `json:"acc_taobao_auth_time" xorm:"not null default 0 comment('淘宝授权备案时间') BIGINT(11)"` + AccTaobaoShareId int64 `json:"acc_taobao_share_id" xorm:"not null default 0 comment('淘宝分享relationId,') index BIGINT(12)"` + AccTaobaoSelfId int64 `json:"acc_taobao_self_id" xorm:"not null default 0 comment('淘宝自购specialId') index BIGINT(12)"` + AccJdSelfId string `json:"acc_jd_self_id" xorm:"not null default '' comment('京东自购ID') index VARCHAR(50)"` + AccJdShareId string `json:"acc_jd_share_id" xorm:"not null default '' comment('京东分享ID') index VARCHAR(50)"` + AccJdFreeId string `json:"acc_jd_free_id" xorm:"not null default '' comment('京东新人免单ID') VARCHAR(50)"` + AccJdCloudId string `json:"acc_jd_cloud_id" xorm:"not null default '' comment('京东新人免单ID') VARCHAR(50)"` + AccSuningSelfId string `json:"acc_suning_self_id" xorm:"not null default '' comment('苏宁自购ID') index VARCHAR(50)"` + AccSuningShareId string `json:"acc_suning_share_id" xorm:"not null default '' comment('苏宁分享ID') index VARCHAR(50)"` + AccSuningFreeId string `json:"acc_suning_free_id" xorm:"not null default '' comment('苏宁新人免单ID') VARCHAR(50)"` + AccPddSelfId string `json:"acc_pdd_self_id" xorm:"not null default '' comment('拼多多自购ID') index VARCHAR(50)"` + AccPddCloudId string `json:"acc_pdd_cloud_id" xorm:"not null default '' comment('拼多多自购ID') index VARCHAR(50)"` + AccPddShareId string `json:"acc_pdd_share_id" xorm:"not null default '' comment('拼多多分享ID') index VARCHAR(50)"` + AccPddFreeId string `json:"acc_pdd_free_id" xorm:"not null default '' comment('拼多多新人免单ID') VARCHAR(50)"` + AccPddBind int `json:"acc_pdd_bind" xorm:"not null default 0 comment('拼多多是否授权绑定') TINYINT(1)"` + AccVipSelfId string `json:"acc_vip_self_id" xorm:"not null default '' comment('唯品会自购ID') index VARCHAR(50)"` + AccVipShareId string `json:"acc_vip_share_id" xorm:"not null default '' comment('唯品会分享ID') index VARCHAR(50)"` + AccVipFreeId string `json:"acc_vip_free_id" xorm:"not null default '' comment('唯品会新人免单ID') VARCHAR(50)"` + AccKaolaSelfId string `json:"acc_kaola_self_id" xorm:"not null default '' comment('考拉自购ID') index VARCHAR(50)"` + AccKaolaShareId string `json:"acc_kaola_share_id" xorm:"not null default '' comment('考拉分享ID') index VARCHAR(50)"` + AccKaolaFreeId string `json:"acc_kaola_free_id" xorm:"not null default '' comment('考拉新人免单ID') VARCHAR(50)"` + AccDuomaiShareId int64 `json:"acc_duomai_share_id" xorm:"not null pk default 0 comment('多麦联盟分享ID') BIGINT(12)"` + AccAlipay string `json:"acc_alipay" xorm:"not null default '' comment('支付宝账号') VARCHAR(50)"` + AccAlipayRealName string `json:"acc_alipay_real_name" xorm:"not null default '' comment('支付宝账号真实姓名') VARCHAR(50)"` + CertTime int `json:"cert_time" xorm:"not null default 0 comment('认证时间') INT(10)"` + CertName string `json:"cert_name" xorm:"not null default '' comment('证件上名字,也是真实姓名') VARCHAR(50)"` + CertNum string `json:"cert_num" xorm:"not null default '' comment('证件号码') VARCHAR(50)"` + CertState int `json:"cert_state" xorm:"not null default 0 comment('认证状态(0为未认证,1为认证中,2为已认证,3为认证失败)') TINYINT(1)"` + FinCommission string `json:"fin_commission" xorm:"not null default 0.0000 comment('累计佣金') DECIMAL(10,4)"` + FinValid string `json:"fin_valid" xorm:"not null default 0.0000 comment('可用余额,fin=>finance财务') DECIMAL(10,4)"` + FinInvalid string `json:"fin_invalid" xorm:"not null default 0.0000 comment('不可用余额,冻结余额') DECIMAL(10,4)"` + FinSelfOrderCount int `json:"fin_self_order_count" xorm:"not null default 0 comment('自购订单数,包括未完成') INT(11)"` + FinSelfOrderCountDone int `json:"fin_self_order_count_done" xorm:"not null default 0 comment('自购已完成订单') INT(11)"` + FinSelfRebate float32 `json:"fin_self_rebate" xorm:"not null default 0.000000 comment('累积自购获得返利金额') FLOAT(14,6)"` + FinTotal float32 `json:"fin_total" xorm:"not null default 0.000000 comment('累计总收益') FLOAT(14,6)"` + Lat float32 `json:"lat" xorm:"not null default 0.000000 comment('纬度') FLOAT(15,6)"` + Lng float32 `json:"lng" xorm:"not null default 0.000000 comment('经度') FLOAT(15,6)"` + Memo string `json:"memo" xorm:"not null default '' comment('用户简述备注') VARCHAR(2048)"` + Qq string `json:"qq" xorm:"not null default '' comment('') VARCHAR(255)"` + IsNew int `json:"is_new" xorm:"not null default 1 comment('是否是新用户') TINYINT(1)"` + IsVerify int `json:"is_verify" xorm:"not null default 0 comment('是否有效会员') TINYINT(1)"` + IsOrdered int `json:"is_ordered" xorm:"not null default 0 comment('是否已完成首单(0否,1是)') TINYINT(1)"` + FromWay string `json:"from_way" xorm:"not null default '' comment('注册来源: +no_captcha_phone:免验证码手机号注册; +manual_phone:手动手机验证码注册; +wx:微信授权; +wx_mp:小程序授权; +wx_pub:公众号授权; +wx_bind_phone:微信注册绑定手机号; +admin:管理员添加;taobao_bind_phone:淘宝注册绑定手机号,apple_bind_phone:苹果注册绑定手机号') VARCHAR(16)"` + HidOrder int `json:"hid_order" xorm:"not null default 0 comment('隐藏订单') TINYINT(3)"` + HidContact int `json:"hid_contact" xorm:"not null default 0 comment('隐藏联系方式') TINYINT(4)"` + NewMsgNotice int `json:"new_msg_notice" xorm:"not null default 1 comment('新消息通知') TINYINT(1)"` + WxAccount string `json:"wx_account" xorm:"not null default '' comment('微信号') VARCHAR(100)"` + WxQrcode string `json:"wx_qrcode" xorm:"not null default '' comment('微信二维码') VARCHAR(100)"` + ThirdPartyTaobaoOid string `json:"third_party_taobao_oid" xorm:"not null default '' comment('淘宝第三方登录openID') VARCHAR(100)"` + ThirdPartyTaobaoSid string `json:"third_party_taobao_sid" xorm:"not null default '' comment('淘宝第三方登录sID') VARCHAR(255)"` + ThirdPartyTaobaoAcctoken string `json:"third_party_taobao_acctoken" xorm:"not null default '' comment('淘宝第三方登录topaccesstoken') VARCHAR(100)"` + ThirdPartyTaobaoAuthcode string `json:"third_party_taobao_authcode" xorm:"not null default '' comment('淘宝第三方登录topAuthCode') VARCHAR(100)"` + ThirdPartyAppleToken string `json:"third_party_apple_token" xorm:"not null default '' comment('苹果第三方登录token') VARCHAR(1024)"` + ThirdPartyQqAccessToken string `json:"third_party_qq_access_token" xorm:"not null default '' comment('QQ第三方登录access_token') VARCHAR(255)"` + ThirdPartyQqExpiresIn string `json:"third_party_qq_expires_in" xorm:"not null default '' comment('QQ第三方登录expires_in(剩余时长)') VARCHAR(255)"` + ThirdPartyQqOpenid string `json:"third_party_qq_openid" xorm:"not null default '' comment('QQ第三方登陆openid(不变,用于认证)') VARCHAR(255)"` + ThirdPartyQqUnionid string `json:"third_party_qq_unionid" xorm:"not null default '' comment('QQ第三方登陆unionid') VARCHAR(255)"` + ThirdPartyWechatExpiresIn string `json:"third_party_wechat_expires_in" xorm:"not null default '' comment('微信第三方登录expires_in(剩余时长)') VARCHAR(255)"` + ThirdPartyWechatOpenid string `json:"third_party_wechat_openid" xorm:"not null default '' comment('微信第三方登陆openid(不变,用于认证)') VARCHAR(255)"` + ThirdPartyWechatUnionid string `json:"third_party_wechat_unionid" xorm:"not null default '' comment('微信第三方登陆unionid') VARCHAR(255)"` + ThirdPartyWechatMiniOpenid string `json:"third_party_wechat_mini_openid" xorm:"not null default '' comment('微信小程序登录open_id') VARCHAR(255)"` + ThirdPartyWechatH5Openid string `json:"third_party_wechat_h5_openid" xorm:"not null default '' comment('微信H5登录open_id') VARCHAR(255)"` + FreeRemainTime int `json:"free_remain_time" xorm:"not null default 0 comment('免单剩余次数') INT(11)"` + FreeCumulativeTime int `json:"free_cumulative_time" xorm:"not null default 0 comment('免单累计次数') INT(11)"` + SecondFreeRemainTime int `json:"second_free_remain_time" xorm:"not null default 0 comment('免单剩余次数') INT(11)"` + SecondFreeCumulativeTime int `json:"second_free_cumulative_time" xorm:"not null default 0 comment('免单累计次数') INT(11)"` + ThirdFreeRemainTime int `json:"third_free_remain_time" xorm:"not null default 0 comment('免单剩余次数') INT(11)"` + ThirdFreeCumulativeTime int `json:"third_free_cumulative_time" xorm:"not null default 0 comment('免单累计次数') INT(11)"` + IsDelete int `json:"is_delete" xorm:"not null default 0 comment('是否已删除') TINYINT(1)"` + UpdateAt time.Time `json:"update_at" xorm:"updated not null default CURRENT_TIMESTAMP comment('更新时间') TIMESTAMP"` + IsSet int `json:"is_set" xorm:"not null default 0 comment('用于一个客户生成关系链匹配的') INT(1)"` + IsOld int `json:"is_old" xorm:"not null default 0 comment('') INT(1)"` + RunVerifyTime int `json:"run_verify_time" xorm:"not null default 0 comment('') INT(1)"` + TaskId int `json:"task_id" xorm:"not null default 0 comment('') INT(1)"` + TaskType string `json:"task_type" xorm:"not null default '' comment('') VARCHAR(255)"` +} diff --git a/app/db/model/user_relate.go b/app/db/model/user_relate.go new file mode 100644 index 0000000..375562f --- /dev/null +++ b/app/db/model/user_relate.go @@ -0,0 +1,13 @@ +package model + +import ( + "time" +) + +type UserRelate struct { + Id int64 `json:"id" xorm:"pk autoincr comment('主键') BIGINT(10)"` + ParentUid int `json:"parent_uid" xorm:"not null default 0 comment('上级会员ID') unique(idx_union_u_p_id) INT(20)"` + Uid int `json:"uid" xorm:"not null default 0 comment('关联UserID') unique(idx_union_u_p_id) INT(20)"` + Level int `json:"level" xorm:"not null default 1 comment('推广等级(1直属,大于1非直属)') INT(10)"` + InviteTime time.Time `json:"invite_time" xorm:"not null default CURRENT_TIMESTAMP comment('邀请时间') TIMESTAMP"` +} diff --git a/app/db/model/virtual_coin.go b/app/db/model/virtual_coin.go new file mode 100644 index 0000000..3baaa55 --- /dev/null +++ b/app/db/model/virtual_coin.go @@ -0,0 +1,17 @@ +package model + +type VirtualCoin struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Name string `json:"name" xorm:"not null default '' comment('名称') VARCHAR(255)"` + ExchangeRatio string `json:"exchange_ratio" xorm:"not null comment('兑换比例(与金额)') DECIMAL(5,2)"` + IsUse int `json:"is_use" xorm:"comment('是否开启:0否 1是') TINYINT(1)"` + CanExchange string `json:"can_exchange" xorm:"comment('能兑换的虚拟币id和手续费列表json') VARCHAR(255)"` + CanExchangeMoney int `json:"can_exchange_money" xorm:"not null default 0 comment('现金能否兑换:0否 1是') TINYINT(1)"` + IsBlock int `json:"is_block" xorm:"not null default 0 comment('是否区块币:0否 1是') TINYINT(1)"` + FunctionType string `json:"function_type" xorm:"comment('功能类型') VARCHAR(255)"` + CanCny int `json:"can_cny" xorm:"not null default 0 comment('是否能兑换余额:0否 1是') TINYINT(1)"` + CanTransfer int `json:"can_transfer" xorm:"not null default 0 comment('是否能支持转账:0否 1是') TINYINT(1)"` + CanBackout int `json:"can_backout" xorm:"not null default 0 comment('是否能支持转账撤回:0否 1是') TINYINT(1)"` + LimitLevelTransfer string `json:"limit_level_transfer" xorm:"default '' comment('能支持转账的用户等级') VARCHAR(600)"` + LimitLevelBackout string `json:"limit_level_backout" xorm:"comment('能支持撤回的用户等级') VARCHAR(600)"` +} diff --git a/app/db/model/virtual_coin_relate.go b/app/db/model/virtual_coin_relate.go new file mode 100644 index 0000000..7987b99 --- /dev/null +++ b/app/db/model/virtual_coin_relate.go @@ -0,0 +1,17 @@ +package model + +type VirtualCoinRelate struct { + Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"` + Oid int64 `json:"oid" xorm:"not null default 0 comment('订单号') index unique(IDX_ORD) BIGINT(20)"` + Uid int `json:"uid" xorm:"not null default 0 comment('用户ID') unique(IDX_ORD) index INT(10)"` + CoinId int `json:"coin_id" xorm:"comment('虚拟币id') unique(IDX_ORD) INT(11)"` + Amount string `json:"amount" xorm:"not null default 0.000000 comment('数量') DECIMAL(16,6)"` + Pvd string `json:"pvd" xorm:"not null default '' comment('供应商taobao,jd,pdd,vip,suning,kaola,mall_goods,group_buy') index VARCHAR(255)"` + CreateAt int `json:"create_at" xorm:"not null default 0 comment('订单创建时间') index INT(10)"` + Level int `json:"level" xorm:"not null default 0 comment('0自购 1直推 大于1:间推') INT(10)"` + Mode string `json:"mode" xorm:"default '' comment('分佣方案类型') VARCHAR(255)"` + AdditionalSubsidy string `json:"additional_subsidy" xorm:"default 0.000000 comment('额外补贴 酒庄模式才有效') DECIMAL(16,6)"` + AdditionalSubsidyBili string `json:"additional_subsidy_bili" xorm:"default 0.000000 comment('额外补贴比例 酒庄模式才有效') DECIMAL(16,6)"` + TeamFreeze int `json:"team_freeze" xorm:"comment('定制') INT(1)"` + ExtendType int `json:"extend_type" xorm:"default 0 comment('0普通 1超级推荐人 2团长 3团长上级超级推荐人 4团长担保用户') unique(IDX_ORD) INT(11)"` +} diff --git a/app/db/model/wx_applet_list.go b/app/db/model/wx_applet_list.go new file mode 100644 index 0000000..5632d75 --- /dev/null +++ b/app/db/model/wx_applet_list.go @@ -0,0 +1,44 @@ +package model + +import ( + "time" +) + +type WxAppletList struct { + Id int `json:"id" xorm:"not null pk autoincr INT(10)"` + Memo string `json:"memo" xorm:"not null default '' comment('备注') unique VARCHAR(255)"` + CompanyName string `json:"company_name" xorm:"not null default '' comment('企业名(需与工商部门登记信息一致);如果是“无主体名称个体工商户”则填“个体户+法人姓名”,例如“个体户张三”') VARCHAR(255)"` + Code string `json:"code" xorm:"not null default '' comment('企业代码') VARCHAR(255)"` + CodeType int `json:"code_type" xorm:"not null default 3 comment('企业代码类型 1:统一社会信用代码(18 位) 2:组织机构代码(9 位 xxxxxxxx-x) 3:营业执照注册号(15 位)') TINYINT(3)"` + LegalPersonaWechat string `json:"legal_persona_wechat" xorm:"not null default '' comment('法人微信号') VARCHAR(255)"` + LegalPersonaName string `json:"legal_persona_name" xorm:"not null default '' comment('法人姓名(绑定银行卡)') VARCHAR(255)"` + State int `json:"state" xorm:"not null default 0 comment('创建状态(0:创建中 1:创建成功 2:创建失败)') TINYINT(3)"` + Ext string `json:"ext" xorm:"comment('拓展字段') TEXT"` + UniqueIdentifier string `json:"unique_identifier" xorm:"not null default '' comment('唯一标识符(企业名称、企业代码、法人微信、法人姓名四个字段作为每次任务的唯一标示,来区别每次任务。)') VARCHAR(255)"` + AppId string `json:"app_id" xorm:"default '' comment('小程序appId') VARCHAR(255)"` + OriginalAppId string `json:"original_app_id" xorm:"default '' comment('原始ID') VARCHAR(255)"` + AuthorizerToken string `json:"authorizer_token" xorm:"default '' comment('授权token') VARCHAR(255)"` + AuthorizerRefreshToken string `json:"authorizer_refresh_token" xorm:"default '' comment('授权更新token') VARCHAR(255)"` + AuditVersionState int `json:"audit_version_state" xorm:"not null default 0 comment('线上版本号') TINYINT(3)"` + PublishVersionNum string `json:"publish_version_num" xorm:"comment('审核状态(0:暂无审核;1:审核中;2:审核通过;3:审核驳回)') VARCHAR(255)"` + AppletName string `json:"applet_name" xorm:"default '' comment('小程序名字') VARCHAR(255)"` + AppletSignature string `json:"applet_signature" xorm:"default '' comment('小程序简介') VARCHAR(255)"` + AppletLogo string `json:"applet_logo" xorm:"default '' comment('小程序logo') VARCHAR(255)"` + SetAppletNameInfo string `json:"set_applet_name_info" xorm:"default '' comment('小程序改名证件url') VARCHAR(255)"` + SetAppletNameInfoType int `json:"set_applet_name_info_type" xorm:"default 1 comment('小程序改名证件类型(1:个人号 2:组织号)') TINYINT(3)"` + SetAppletNameState int `json:"set_applet_name_state" xorm:"default 0 comment('小程序改名状态(0:未进行 1:进行中 2:改名成功 3:改名失败)') TINYINT(3)"` + SetAppletNameAuditId string `json:"set_applet_name_audit_id" xorm:"default '' comment('小程序改名的审核单id') VARCHAR(255)"` + CreateAt time.Time `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' TIMESTAMP"` + UpdateAt time.Time `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' TIMESTAMP"` + IsFilterTaobao int `json:"is_filter_taobao" xorm:"default 0 comment('是否过滤淘宝商品 0否 1是') INT(1)"` + CateId string `json:"cate_id" xorm:"default '' comment('主营类目id') VARCHAR(50)"` + BottomNavCssId int `json:"bottom_nav_css_id" xorm:"default 0 comment('底部导航样式id') INT(11)"` + AuthType string `json:"auth_type" xorm:"default 'reg' comment('授权方式 直接授权old_auth 注册授权reg') VARCHAR(100)"` + MpAuditVersion string `json:"mp_audit_version" xorm:"default '' comment('审核版本') VARCHAR(100)"` + MpAuditCssId int `json:"mp_audit_css_id" xorm:"default 0 comment('审核版本底部样式ID') INT(11)"` + MpAuditGoodsDetailCssId int `json:"mp_audit_goods_detail_css_id" xorm:"default 0 comment('审核版本底部样式ID') INT(11)"` + AppletBgColor string `json:"applet_bg_color" xorm:"default '' comment('导航栏/状态栏背景色') VARCHAR(100)"` + AppletNavColor string `json:"applet_nav_color" xorm:"default '' comment('导航栏/状态栏字体色') VARCHAR(100)"` + ShareUse int `json:"share_use" xorm:"default 0 comment('分享使用') INT(11)"` + OrderCssId int `json:"order_css_id" xorm:"default 0 comment('') INT(11)"` +} diff --git a/app/db/offical/db_sys_cfg.go b/app/db/offical/db_sys_cfg.go new file mode 100644 index 0000000..50fc038 --- /dev/null +++ b/app/db/offical/db_sys_cfg.go @@ -0,0 +1,23 @@ +package offical + +import ( + "applet/app/db" + officialModel "applet/app/db/offical/model" +) + +func SysCfgByKey(key string) *officialModel.SysCfg { + var data officialModel.SysCfg + get, err := db.Db.Where("k=?", key).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} +func SysCfgByKeyStr(key string) string { + var data officialModel.SysCfg + get, err := db.Db.Where("k=?", key).Get(&data) + if get == false || err != nil { + return "" + } + return data.V +} diff --git a/app/db/offical/db_user_app_list.go b/app/db/offical/db_user_app_list.go new file mode 100644 index 0000000..d85b936 --- /dev/null +++ b/app/db/offical/db_user_app_list.go @@ -0,0 +1,15 @@ +package offical + +import ( + "applet/app/db" + "applet/app/db/offical/model" +) + +func GetUserAppList(uid string) *model.UserAppList { + var data model.UserAppList + get, err := db.Db.Where("uuid=?", uid).Get(&data) + if get == false || err != nil { + return nil + } + return &data +} diff --git a/app/db/offical/model/master_list_cfg.go b/app/db/offical/model/master_list_cfg.go new file mode 100644 index 0000000..3963c50 --- /dev/null +++ b/app/db/offical/model/master_list_cfg.go @@ -0,0 +1,9 @@ +package model + +type MasterListCfg struct { + K string `json:"k" xorm:"not null VARCHAR(255)"` + V string `json:"v" xorm:"TEXT"` + Memo string `json:"memo" xorm:"VARCHAR(255)"` + Uid string `json:"uid" xorm:"comment('0是官方') VARCHAR(255)"` + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` +} diff --git a/app/db/offical/model/sys_cfg.go b/app/db/offical/model/sys_cfg.go new file mode 100644 index 0000000..5508c9a --- /dev/null +++ b/app/db/offical/model/sys_cfg.go @@ -0,0 +1,7 @@ +package model + +type SysCfg struct { + K string `json:"k" xorm:"not null pk comment('键') VARCHAR(127)"` + V string `json:"v" xorm:"comment('值') TEXT"` + Memo string `json:"memo" xorm:"not null default '' comment('备注') VARCHAR(255)"` +} diff --git a/app/db/offical/model/user_app_list.go b/app/db/offical/model/user_app_list.go new file mode 100644 index 0000000..9720400 --- /dev/null +++ b/app/db/offical/model/user_app_list.go @@ -0,0 +1,33 @@ +package model + +type UserAppList struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Uuid int `json:"uuid" xorm:"not null comment('masterId') INT(10)"` + Uid int `json:"uid" xorm:"not null comment('用户ID') INT(10)"` + AppId int `json:"app_id" xorm:"not null comment('应用ID') INT(10)"` + PlanId string `json:"plan_id" xorm:"not null default '' comment('套餐ID') VARCHAR(100)"` + Expire int `json:"expire" xorm:"not null default 0 comment('过期时间') INT(10)"` + Name string `json:"name" xorm:"not null default '' comment('应用主名称') VARCHAR(32)"` + Icon string `json:"icon" xorm:"not null default '' comment('应用主图标') VARCHAR(250)"` + CreateTime int `json:"create_time" xorm:"not null default 0 comment('初次激活时间') INT(10)"` + RenewTime int `json:"renew_time" xorm:"not null default 0 comment('上次续费时间') INT(10)"` + Domain string `json:"domain" xorm:"not null default '' comment('域名') index VARCHAR(110)"` + DomainAlias string `json:"domain_alias" xorm:"not null default '' comment('域名别名') index VARCHAR(110)"` + Platform string `json:"platform" xorm:"not null default '' comment('平台信息 ios,android,applet') VARCHAR(100)"` + Info string `json:"info" xorm:"comment('平台名称如ios.name.#ddd;') TEXT"` + PayMode int `json:"pay_mode" xorm:"not null default 1 comment('付费模式,0授信,1付款') TINYINT(1)"` + Price float32 `json:"price" xorm:"not null default 0.00 comment('应用价格') FLOAT(10,2)"` + PricePay float32 `json:"price_pay" xorm:"not null default 0.00 comment('实际付款价格') FLOAT(10,2)"` + OfficialPrice float32 `json:"official_price" xorm:"not null default 0.00 comment('应用价格') FLOAT(10,2)"` + OfficialPricePay float32 `json:"official_price_pay" xorm:"not null default 0.00 comment('实际付款价格') FLOAT(10,2)"` + State int `json:"state" xorm:"not null default 0 comment('0未创建,1正常,2停用,3过期') TINYINT(1)"` + DeleteAt int `json:"delete_at" xorm:"not null default 0 TINYINT(1)"` + CustomAndroidCount int `json:"custom_android_count" xorm:"default 0 comment('客户端安卓包名重置次数') INT(11)"` + CustomIosCount int `json:"custom_ios_count" xorm:"default 0 comment('客户端ios包名重置次数') INT(11)"` + StoreAndroidCount int `json:"store_android_count" xorm:"default 0 comment('商家端安卓包名重置次数') INT(11)"` + StoreIosCount int `json:"store_ios_count" xorm:"default 0 comment('商家端ios包名重置次数') INT(11)"` + SmsPlatform string `json:"sms_platform" xorm:"default 'mob' comment('mob ljioe联江') VARCHAR(255)"` + IsClose int `json:"is_close" xorm:"default 0 comment('是否关闭') INT(1)"` + Puid int `json:"puid" xorm:"default 0 comment('') INT(11)"` + StoreRateInfo string `json:"store_rate_info" xorm:"comment('付呗商品进件费率') TEXT"` +} diff --git a/app/db/wechat_applet_info.go b/app/db/wechat_applet_info.go new file mode 100644 index 0000000..61c972e --- /dev/null +++ b/app/db/wechat_applet_info.go @@ -0,0 +1,166 @@ +package db + +import ( + "applet/app/cfg" + "applet/app/db/model" + "applet/app/utils" + "applet/app/utils/cache" + "crypto/tls" + "encoding/json" + "fmt" + "github.com/gin-gonic/gin" + "github.com/tidwall/gjson" + "io" + "io/ioutil" + "net/http" + "strings" + "time" + "xorm.io/xorm" +) + +func GetAppletKey(c *gin.Context, eg *xorm.Engine) map[string]string { + appId := c.GetHeader("appid") + isFilterTaobao := "0" + appletName := "" + appletLogo := "" + originalAppId := "" + bottomNavCssId := "" + mpAuditVersion := "" + MpAuditGoodsDetailCssId := "" + orderCssId := "" + if appId == "" { + wxAppletCfg := SysCfgGetWithDb(eg, c.GetString("mid"), "wx_applet_key") + isFilterTaobao = gjson.Get(wxAppletCfg, "taobaoGoodsOnOff").String() + appletName = gjson.Get(wxAppletCfg, "appletName").String() + originalAppId = gjson.Get(wxAppletCfg, "originalAppId").String() + appletLogo = gjson.Get(wxAppletCfg, "appletIcon").String() + mpAuditVersion = SysCfgGetWithDb(eg, c.GetString("mid"), "mp_audit_version") + var tm model.SysTemplate + if has, err := eg.Where("is_use = 1 AND type = 'bottom' AND platform = 4 "). + Cols("id,uid,name,is_use,is_system"). + Get(&tm); err != nil || has == false { + bottomNavCssId = "" + } else { + bottomNavCssId = utils.IntToStr(tm.Id) + } + if c.GetHeader("AppVersionName") == mpAuditVersion && c.GetHeader("AppVersionName") != "" { + m := SysCfgGetWithDb(eg, c.GetString("mid"), "mp_audit_template") + if m != "" { + bottomNavCssId = utils.Int64ToStr(gjson.Get(m, "bottom").Int()) + } + m1 := SysCfgGet(c, "mp_audit_template") + if m1 != "" { + MpAuditGoodsDetailCssId = utils.Int64ToStr(gjson.Get(m1, "product_detail").Int()) + } + } + appId = gjson.Get(wxAppletCfg, "appId").String() + } else { + var wxApplet model.WxAppletList + has, err2 := eg.Where("app_id=?", appId).Get(&wxApplet) + if has && err2 == nil { + isFilterTaobao = utils.IntToStr(wxApplet.IsFilterTaobao) + appletName = wxApplet.AppletName + appletLogo = wxApplet.AppletLogo + originalAppId = wxApplet.OriginalAppId + orderCssId = utils.IntToStr(wxApplet.OrderCssId) + mpAuditVersion = wxApplet.MpAuditVersion + bottomNavCssId = utils.IntToStr(wxApplet.BottomNavCssId) + MpAuditGoodsDetailCssId = "" + if c.GetHeader("AppVersionName") == mpAuditVersion && c.GetHeader("AppVersionName") != "" { + bottomNavCssId = utils.IntToStr(wxApplet.MpAuditCssId) + MpAuditGoodsDetailCssId = utils.IntToStr(wxApplet.MpAuditGoodsDetailCssId) + } + } + } + r := map[string]string{ + "order_css_id": orderCssId, + "app_id": appId, + "is_filter_taobao": isFilterTaobao, + "applet_name": appletName, + "applet_logo": appletLogo, + "original_app_id": originalAppId, + "bottom_nav_css_id": bottomNavCssId, + "mp_audit_version": mpAuditVersion, + "mp_audit_goods_detail_css_id": MpAuditGoodsDetailCssId, + } + return r + +} +func GetShareUse(c *gin.Context, eg *xorm.Engine) map[string]string { + var wxApplet model.WxAppletList + has, err2 := eg.Where("share_use=?", 1).Asc("id").Get(&wxApplet) + wxAppletCfg := SysCfgGetWithDb(eg, c.GetString("mid"), "wx_applet_key") + originalAppId := gjson.Get(wxAppletCfg, "originalAppId").String() + appId := gjson.Get(wxAppletCfg, "appId").String() + if has && err2 == nil { + originalAppId = wxApplet.OriginalAppId + appId = wxApplet.AppId + } + r := map[string]string{ + "app_id": appId, + "original_app_id": originalAppId, + } + return r +} +func GetAppletToken(c *gin.Context, appId string, isMore, isReset string) (accessToken string) { + key := fmt.Sprintf("%s:%s:%s", c.GetString("mid"), "wx_applet_access_token2", appId) + token, err := cache.GetString(key) + if err == nil && token != "" && strings.Contains(token, "{") == false && isReset == "0" { + // 有缓存 + accessToken = token + } else { + ExpiresIn := 1800 + accessTokenStr := ApiToSuperAdminWx(c, appId, isMore) + if accessTokenStr == "" { + return "" + } + ExpiresIn = int(gjson.Get(accessTokenStr, "expires_in").Int()) - 60*60*1 //TODO::暂时只用1个小时 + accessToken = gjson.Get(accessTokenStr, "authorizer_access_token").String() + if ExpiresIn > 0 { + //fmt.Printf("返回结果: %#v", res) + _, err = cache.SetEx(key, accessToken, ExpiresIn) + if err != nil { + fmt.Println("微信授权错误", err) + return "" + } + } + + } + return accessToken +} + +// 总后台微信token isMore多小程序登录总后台要判断读另一个表 +func ApiToSuperAdminWx(c *gin.Context, appid string, isMore string) string { + var req = make(map[string]string, 0) + var host string + host = cfg.WebsiteBackend.URL + "/Wx/getAuthorizerResult?appid=" + appid + "&is_more=" + isMore + fmt.Println(host) + tr := &http.Transport{ + MaxIdleConnsPerHost: 200, + MaxIdleConns: 200, + MaxConnsPerHost: 200, + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + client := &http.Client{ + Timeout: 5 * time.Second, + Transport: tr, + } + byte1, _ := json.Marshal(req) + req1, _ := http.NewRequest("POST", host, strings.NewReader(string(byte1))) + req1.Header.Set("Content-Type", "application/json") + resp, err := (client).Do(req1) + if err != nil || resp == nil { + if resp != nil { + _, _ = io.Copy(ioutil.Discard, resp.Body) + } + return "" + } + defer resp.Body.Close() + respByte, _ := ioutil.ReadAll(resp.Body) + + if len(respByte) == 0 { + return "" + } + return string(respByte) + +} diff --git a/app/db/zhimeng_db.go b/app/db/zhimeng_db.go new file mode 100644 index 0000000..b173da1 --- /dev/null +++ b/app/db/zhimeng_db.go @@ -0,0 +1,42 @@ +package db + +import ( + "fmt" + "os" + + _ "github.com/go-sql-driver/mysql" + "xorm.io/xorm" + "xorm.io/xorm/log" + + "applet/app/cfg" +) + +var ZhimengDb *xorm.Engine + +func InitZhimengDB(c *cfg.DBCfg) error { + var err error + if ZhimengDb, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", c.User, c.Psw, c.Host, c.Name)); err != nil { + return err + } + ZhimengDb.SetConnMaxLifetime(c.MaxLifetime) + ZhimengDb.SetMaxOpenConns(c.MaxOpenConns) + ZhimengDb.SetMaxIdleConns(c.MaxIdleConns) + if err = Db.Ping(); err != nil { + return err + } + if c.ShowLog { + ZhimengDb.ShowSQL(true) + ZhimengDb.Logger().SetLevel(0) + f, err := os.OpenFile(c.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777) + if err != nil { + os.RemoveAll(c.Path) + if f, err = os.OpenFile(c.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777); err != nil { + return err + } + } + logger := log.NewSimpleLogger(f) + logger.ShowSQL(true) + ZhimengDb.SetLogger(logger) + } + return nil +} diff --git a/app/e/code.go b/app/e/code.go new file mode 100644 index 0000000..6bebf2b --- /dev/null +++ b/app/e/code.go @@ -0,0 +1,244 @@ +package e + +const ( + // 200 因为部分第三方接口不能返回错误头,因此在此定义部分错误 + ERR_FILE_SAVE = 200001 + // 400 系列 + ERR_BAD_REQUEST = 400000 + ERR_INVALID_ARGS = 400001 + ERR_API_RESPONSE = 400002 + ERR_NO_DATA = 400003 + ERR_MOBILE_NIL = 400004 + ERR_MOBILE_MATH = 400005 + ERR_FILE_EXT = 400006 + ERR_FILE_MAX_SIZE = 400007 + ERR_SIGN = 400008 + ERR_PASSWORD_MATH = 400009 + ERR_PROVIDER_RESPONSE = 400010 + ERR_AES_ENCODE = 400011 + ERR_ADMIN_API = 400012 + ERR_QINIUAPI_RESPONSE = 400013 + ERR_URL_TURNCHAIN = 400014 + + // 401 未授权 + ERR_UNAUTHORIZED = 401000 + ERR_NOT_AUTH = 401001 + ERR_SMS_AUTH = 401002 + ERR_TOKEN_AUTH = 401003 + ERR_TOKEN_FORMAT = 401004 + ERR_TOKEN_GEN = 401005 + // 403 禁止 + ERR_FORBIDEN = 403000 + ERR_PLATFORM = 403001 + ERR_MOBILE_EXIST = 403002 + ERR_USER_NO_EXIST = 403003 + ERR_MOBILE_NO_EXIST = 403004 + ERR_FORBIDEN_VALID = 403005 + ERR_RELATE_ERR = 403006 + ERR_REPEAT_RELATE = 403007 + ERR_MOB_FORBIDEN = 403008 + ERR_MOB_SMS_NO_AVA = 403009 + ERR_USER_IS_REG = 403010 + ERR_MASTER_ID = 403011 + ERR_CASH_OUT_TIME = 403012 + ERR_CASH_OUT_FEE = 403013 + ERR_CASH_OUT_USER_NOT_FOUND = 403014 + ERR_CASH_OUT_FAIL = 403015 + ERR_CASH_OUT_TIMES = 403016 + ERR_CASH_OUT_MINI = 403017 + ERR_CASH_OUT_MUT = 403018 + ERR_CASH_OUT_NOT_DECIMAL = 403019 + ERR_CASH_OUT_NOT_DAY_AVA = 403020 + ERR_USER_LEVEL_PAY_CHECK_TASK_NO_DONE = 403021 + ERR_USER_LEVEL_PAY_CHECK_NO_CROSS = 403022 + ERR_USER_LEVEL_ORD_EXP = 403023 + ERR_IS_BIND_THIRDPARTY = 403024 + ERR_USER_LEVEL_UPDATE_CHECK_TASK_NO_DONE = 403025 + ERR_USER_LEVEL_UPDATE_CHECK_NOT_FOUND_ORDER = 403026 + ERR_USER_LEVEL_UPDATE_REPEAT = 403027 + ERR_USER_NO_ACTIVE = 403028 + ERR_USER_IS_BAN = 403029 + ERR_ALIPAY_SETTING = 403030 + ERR_ALIPAY_ORDERTYPE = 403031 + ERR_CLIPBOARD_UNSUP = 403032 + ERR_SYSUNION_CONFIG = 403033 + ERR_WECAHT_MINI = 403034 + ERR_WECAHT_MINI_CACHE = 403035 + ERR_WECAHT_MINI_DECODE = 403036 + ERR_WECHAT_MINI_ACCESSTOKEN = 403037 + ERR_CURRENT_VIP_LEVEL_AUDITING = 403038 + ERR_LEVEL_RENEW_SHOULD_KEEP_CURRENT = 403039 + ERR_LEVEL_UPGRADE_APPLY_AUDITTING = 403040 + ERR_LEVEL_TASK_PAY_TYPE = 403041 + ERR_BALANCE_NOT_ENOUGH = 403042 + ERR_ADMIN_PUSH = 403043 + ERR_PLAN = 403044 + ERR_MOB_CONFIG = 403045 + ERR_BAlANCE_PAY_ORDERTYPE = 403046 + ERR_PHONE_EXISTED = 403047 + ERR_NOT_RESULT = 403048 + ERR_REVIEW = 403049 + ERR_USER_LEVEL_HAS_PAID = 403050 + ERR_USER_BIND_OWN = 403051 + ERR_PARENTUID_ERR = 403052 + ERR_USER_DEL = 403053 + ERR_SEARCH_ERR = 403054 + ERR_LEVEL_REACH_TOP = 403055 + ERR_USER_CHECK_ERR = 403056 + ERR_PASSWORD_ERR = 403057 + ERR_IS_BIND_PDD_ERR = 403058 + ERR_MOB_SMS_NO_SAME = 403059 + ERR_MOB_SMS_NO_EXISTS = 403060 + // 404 + ERR_USER_NOTFOUND = 404001 + ERR_SUP_NOTFOUND = 404002 + ERR_LEVEL_MAP = 404003 + ERR_MOD_NOTFOUND = 404004 + ERR_CLIPBOARD_PARSE = 404005 + ERR_NOT_FAN = 404006 + ERR_USER_LEVEL = 404007 + ERR_LACK_PAY_CFG = 404008 + ERR_NOT_LEVEL_TASK = 404009 + ERR_ITEM_NOT_FOUND = 404012 + ERR_WX_CHECKFILE_NOTFOUND = 404011 + + // 429 请求频繁 + ERR_TOO_MANY_REQUESTS = 429000 + // 500 系列 + ERR = 500000 + ERR_UNMARSHAL = 500001 + ERR_UNKNOWN = 500002 + ERR_SMS = 500003 + ERR_ARKID_REGISTER = 500004 + ERR_ARKID_WHITELIST = 500005 + ERR_ARKID_LOGIN = 500006 + ERR_CFG = 500007 + ERR_DB_ORM = 500008 + ERR_CFG_CACHE = 500009 + ERR_ZHIMENG_CONVERT_ERR = 500010 + ERR_ALIPAY_ERR = 500011 + ERR_ALIPAY_ORDER_ERR = 500012 + ERR_PAY_ERR = 500013 + ERR_IS_BIND_THIRDOTHER = 500014 + ERR_IS_BIND_THIRDOTHERWECHAT = 500015 + ERR_INIT_RABBITMQ = 500016 +) + +var MsgFlags = map[int]string{ + // 200 + ERR_FILE_SAVE: "文件保存失败", + // 400 + ERR_BAD_REQUEST: "请求失败..", + ERR_INVALID_ARGS: "请求参数错误", + ERR_API_RESPONSE: "API错误", + ERR_QINIUAPI_RESPONSE: "七牛请求API错误", + ERR_URL_TURNCHAIN: "转链失败", + ERR_NO_DATA: "暂无数据", + ERR_MOBILE_NIL: "电话号码不能为空", + ERR_MOBILE_MATH: "电话号码输入有误", + ERR_FILE_MAX_SIZE: "文件上传大小超限", + ERR_FILE_EXT: "文件类型不支持", + ERR_SIGN: "签名校验失败", + ERR_PROVIDER_RESPONSE: "提供商接口错误", + ERR_AES_ENCODE: "加解密错误", + ERR_ADMIN_API: "后台接口请求失败", + // 401 + ERR_NOT_AUTH: "请登录后操作", + ERR_SMS_AUTH: "验证码过期或无效", + ERR_UNAUTHORIZED: "验证用户失败", + ERR_TOKEN_FORMAT: "Token格式不对", + ERR_TOKEN_GEN: "生成Token失败", + // 403 + ERR_FORBIDEN: "禁止访问", + ERR_PLATFORM: "平台不支持", + ERR_MOBILE_EXIST: "该号码已注册过", + ERR_USER_NO_EXIST: "用户没有注册或账号密码不正确", + ERR_PASSWORD_ERR: "输入两次密码不一致", + ERR_RELATE_ERR: "推荐人不能是自己的粉丝", + ERR_PARENTUID_ERR: "推荐人不存在", + ERR_TOKEN_AUTH: "登录信息失效,请重新登录", + ERR_MOB_SMS_NO_AVA: "短信余额不足", + ERR_MOB_SMS_NO_SAME: "验证码不一致", + ERR_MOB_SMS_NO_EXISTS: "验证码已失效", + ERR_USER_IS_REG: "用户已注册", + ERR_MASTER_ID: "找不到对应站长的数据库", + ERR_CASH_OUT_TIME: "非可提现时间段", + ERR_CASH_OUT_USER_NOT_FOUND: "收款账号不存在", + ERR_CASH_OUT_FAIL: "提现失败", + ERR_CASH_OUT_FEE: "提现金额必须大于手续费", + ERR_CASH_OUT_TIMES: "当日提现次数已达上线", + ERR_CASH_OUT_MINI: "申请提现金额未达到最低金额要求", + ERR_CASH_OUT_MUT: "申请提现金额未达到整数倍要求", + ERR_CASH_OUT_NOT_DECIMAL: "提现申请金额只能是整数", + ERR_CASH_OUT_NOT_DAY_AVA: "不在可提现日期范围内", + ERR_USER_LEVEL_PAY_CHECK_TASK_NO_DONE: "请先完成其他任务", + ERR_USER_LEVEL_PAY_CHECK_NO_CROSS: "无法跨越升级", + ERR_USER_LEVEL_ORD_EXP: "付费订单已失效", + ERR_IS_BIND_THIRDPARTY: "该用户已经绑定了", + ERR_IS_BIND_THIRDOTHER: "该账号已经被绑定了", + ERR_IS_BIND_THIRDOTHERWECHAT: "该账号已经绑定了其他微信账号", + ERR_USER_LEVEL_UPDATE_CHECK_TASK_NO_DONE: "请完成指定任务", + ERR_USER_LEVEL_UPDATE_CHECK_NOT_FOUND_ORDER: "没有找到对应的订单", + ERR_USER_LEVEL_UPDATE_REPEAT: "不允许重复升级", + ERR_USER_NO_ACTIVE: "账户没激活", + ERR_USER_IS_BAN: "账户已被冻结", + ERR_SYSUNION_CONFIG: "联盟设置错误,请检查配置", + ERR_WECAHT_MINI: "小程序响应错误,请检查小程序配置", + ERR_WECAHT_MINI_CACHE: "获取小程序缓存失败", + ERR_WECAHT_MINI_DECODE: "小程序解密失败", + ERR_WECHAT_MINI_ACCESSTOKEN: "无法获取accesstoekn", + ERR_CURRENT_VIP_LEVEL_AUDITING: "当前等级正在审核中", + ERR_LEVEL_RENEW_SHOULD_KEEP_CURRENT: "续费只能在当前等级续费", + ERR_LEVEL_UPGRADE_APPLY_AUDITTING: "已有申请正在审核中,暂时不能申请", + ERR_LEVEL_TASK_PAY_TYPE: "任务付费类型错误", + ERR_BALANCE_NOT_ENOUGH: "余额不足", + ERR_ADMIN_PUSH: "后台MOB推送错误", + ERR_PLAN: "分拥方案出错", + ERR_MOB_CONFIG: "Mob 配置错误", + ERR_BAlANCE_PAY_ORDERTYPE: "无效余额支付订单类型", + ERR_PHONE_EXISTED: "手机号码已存在", + ERR_NOT_RESULT: "已加载完毕", + ERR_REVIEW: "审核模板错误", + ERR_USER_LEVEL_HAS_PAID: "该等级已经付过款", + ERR_IS_BIND_PDD_ERR: "获取PDD绑定信息失败", + // 404 + ERR_USER_NOTFOUND: "用户不存在", + ERR_USER_DEL: "账号被删除,如有疑问请联系客服", + ERR_SUP_NOTFOUND: "上级用户不存在", + ERR_LEVEL_MAP: "无等级映射关系", + ERR_MOD_NOTFOUND: "没有找到对应模块", + ERR_CLIPBOARD_PARSE: "无法解析剪切板内容", + ERR_NOT_FAN: "没有粉丝", + ERR_CLIPBOARD_UNSUP: "不支持该平台", + ERR_USER_LEVEL: "该等级已不存在", + ERR_LACK_PAY_CFG: "支付配置不完整", + ERR_NOT_LEVEL_TASK: "等级任务查找错误", + ERR_ITEM_NOT_FOUND: "找不到对应商品", + ERR_WX_CHECKFILE_NOTFOUND: "找不到微信校验文件", + ERR_USER_BIND_OWN: "不能填写自己的邀请码", + // 429 + ERR_TOO_MANY_REQUESTS: "请求频繁,请稍后重试", + // 500 内部错误 + ERR: "接口错误", + ERR_SMS: "短信发送出错", + ERR_CFG: "服务器配置错误", + ERR_UNMARSHAL: "JSON解码错误", + ERR_UNKNOWN: "未知错误", + ERR_ARKID_LOGIN: "登录失败", + ERR_MOBILE_NO_EXIST: "该用户未设定手机号", + ERR_FORBIDEN_VALID: "验证码错误", + ERR_CFG_CACHE: "获取配置缓存失败", + ERR_DB_ORM: "数据操作失败", + ERR_REPEAT_RELATE: "重复关联", + ERR_ZHIMENG_CONVERT_ERR: "智盟转链失败", + ERR_MOB_FORBIDEN: "Mob调用失败", + ERR_ALIPAY_ERR: "支付宝参数错误", + ERR_ALIPAY_SETTING: "请在后台正确配置支付宝", + ERR_ALIPAY_ORDERTYPE: "无效支付宝订单类型", + ERR_ALIPAY_ORDER_ERR: "订单创建错误", + ERR_PAY_ERR: "未找到支付方式", + ERR_SEARCH_ERR: "暂无该分类商品", + ERR_LEVEL_REACH_TOP: "已经是最高等级", + ERR_USER_CHECK_ERR: "校验失败", + ERR_INIT_RABBITMQ: "连接mq失败", +} diff --git a/app/e/error.go b/app/e/error.go new file mode 100644 index 0000000..2564174 --- /dev/null +++ b/app/e/error.go @@ -0,0 +1,72 @@ +package e + +import ( + "fmt" + "path" + "runtime" +) + +type E struct { + Code int // 错误码 + msg string // 报错代码 + st string // 堆栈信息 +} + +func NewErrCode(code int) error { + if msg, ok := MsgFlags[code]; ok { + return E{code, msg, stack(3)} + } + return E{ERR_UNKNOWN, "unknown", stack(3)} +} + +func NewErr(code int, msg string) error { + return E{code, msg, stack(3)} +} + +func NewErrf(code int, msg string, args ...interface{}) error { + return E{code, fmt.Sprintf(msg, args), stack(3)} +} + +func (e E) Error() string { + return e.msg +} + +func stack(skip int) string { + stk := make([]uintptr, 32) + str := "" + l := runtime.Callers(skip, stk[:]) + for i := 0; i < l; i++ { + f := runtime.FuncForPC(stk[i]) + name := f.Name() + file, line := f.FileLine(stk[i]) + str += fmt.Sprintf("\n%-30s[%s:%d]", name, path.Base(file), line) + } + return str +} + +// ErrorIsAccountBan is 检查这个账号是否被禁用的错误 +func ErrorIsAccountBan(e error) bool { + err, ok := e.(E) + if ok && err.Code == 403029 { + return true + } + return false +} + +// ErrorIsAccountNoActive is 检查这个账号是否被禁用的错误 +func ErrorIsAccountNoActive(e error) bool { + err, ok := e.(E) + if ok && err.Code == 403028 { + return true + } + return false +} + +// ErrorIsUserDel is 检查这个账号是否被删除 +func ErrorIsUserDel(e error) bool { + err, ok := e.(E) + if ok && err.Code == 403053 { + return true + } + return false +} diff --git a/app/e/msg.go b/app/e/msg.go new file mode 100644 index 0000000..f8450a5 --- /dev/null +++ b/app/e/msg.go @@ -0,0 +1,212 @@ +package e + +import ( + "applet/app/utils" + "encoding/json" + "net/http" + + "github.com/gin-gonic/gin" + + "applet/app/utils/logx" +) + +// GetMsg get error information based on Code +// 因为这里code是自己控制的, 因此没考虑报错信息 +func GetMsg(code int) (int, string) { + if msg, ok := MsgFlags[code]; ok { + return code / 1000, msg + } + if http.StatusText(code) == "" { + code = 200 + } + return code, MsgFlags[ERR_BAD_REQUEST] +} + +// 成功输出, fields 是额外字段, 与code, msg同级 +func OutSuc(c *gin.Context, data interface{}, fields map[string]interface{}) { + res := gin.H{ + "code": 1, + "msg": "ok", + "data": data, + } + if fields != nil { + for k, v := range fields { + res[k] = v + } + } + jsonData, _ := json.Marshal(res) + strs := string(jsonData) + if c.GetString("translate_open") != "" { + strs = utils.ReadReverse(c, string(jsonData)) + } + if utils.GetApiVersion(c) > 0 && utils.CheckUri(c) > 0 { //加了签名校验只返回加密的字符串 + strs = utils.ResultAes(c, []byte(strs)) + } + c.Writer.WriteString(strs) +} + +func OutSucByLianlian(c *gin.Context, code string, msg string, data interface{}) { + res := gin.H{ + "code": code, + "msg": msg, + "data": data, + } + jsonData, _ := json.Marshal(res) + strs := string(jsonData) + c.Writer.WriteString(strs) + +} +func OutSucPure(c *gin.Context, data interface{}, fields map[string]interface{}) { + res := gin.H{ + "code": 1, + "msg": "ok", + "data": data, + } + if fields != nil { + for k, v := range fields { + res[k] = v + } + } + jsonData, _ := json.Marshal(res) + strs := string(jsonData) + if c.GetString("translate_open") != "" { + strs = utils.ReadReverse(c, string(jsonData)) + } + if utils.GetApiVersion(c) > 0 && utils.CheckUri(c) > 0 { //加了签名校验只返回加密的字符串 + strs = utils.ResultAes(c, []byte(strs)) + } + c.Writer.WriteString(strs) + +} + +// 错误输出 +func OutErr(c *gin.Context, code int, err ...interface{}) { + statusCode, msg := GetMsg(code) + if len(err) > 0 && err[0] != nil { + e := err[0] + switch v := e.(type) { + case E: + statusCode = v.Code / 1000 + msg = v.Error() + logx.Error(v.msg + ": " + v.st) // 记录堆栈信息 + case error: + logx.Error(v) + break + case string: + msg = v + case int: + if _, ok := MsgFlags[v]; ok { + msg = MsgFlags[v] + } + } + } + if c.GetString("translate_open") != "" { + msg = utils.ReadReverse(c, msg) + } + if utils.GetApiVersion(c) > 0 && utils.CheckUri(c) > 0 { //加了签名校验只返回加密的字符串 + jsonData, _ := json.Marshal(gin.H{ + "code": code, + "msg": msg, + "data": []struct{}{}, + }) + str := utils.ResultAes(c, jsonData) + if code > 100000 { + code = int(utils.FloatFormat(float64(code/1000), 0)) + } + c.Status(500) + c.Writer.WriteString(str) + } else { + c.AbortWithStatusJSON(statusCode, gin.H{ + "code": code, + "msg": msg, + "data": []struct{}{}, + }) + } + +} +func OutErrSecond(c *gin.Context, code int, err ...interface{}) { + statusCode, msg := GetMsg(code) + if len(err) > 0 && err[0] != nil { + e := err[0] + switch v := e.(type) { + case E: + statusCode = v.Code / 1000 + msg = v.Error() + logx.Error(v.msg + ": " + v.st) // 记录堆栈信息 + case error: + logx.Error(v) + break + case string: + msg = v + case int: + if _, ok := MsgFlags[v]; ok { + msg = MsgFlags[v] + } + } + } + if c.GetString("translate_open") != "" { + msg = utils.ReadReverse(c, msg) + } + if utils.GetApiVersion(c) > 0 && utils.CheckUri(c) > 0 { //加了签名校验只返回加密的字符串 + jsonData, _ := json.Marshal(gin.H{ + "code": code, + "msg": msg, + "data": "", + }) + str := utils.ResultAes(c, jsonData) + if code > 100000 { + code = int(utils.FloatFormat(float64(code/1000), 0)) + } + c.Status(500) + c.Writer.WriteString(str) + } else { + c.AbortWithStatusJSON(statusCode, gin.H{ + "code": code, + "msg": msg, + "data": "", + }) + } + +} + +// 重定向 +func OutRedirect(c *gin.Context, code int, loc string) { + if code < 301 || code > 308 { + code = 303 + } + c.Redirect(code, loc) + c.Abort() +} +func DouYouReturnMsg(c *gin.Context, statusCode, msg string) { + res := gin.H{ + "status_code": statusCode, + } + if msg != "" { + res["message"] = msg + } + jsonData, _ := json.Marshal(res) + strs := string(jsonData) + c.Writer.WriteString(strs) +} +func MeituanLmReturnMsg(c *gin.Context, statusCode, msg string) { + res := gin.H{ + "errcode": statusCode, + } + if msg != "" { + res["errmsg"] = msg + } + jsonData, _ := json.Marshal(res) + strs := string(jsonData) + c.Writer.WriteString(strs) +} +func TaskBoxReturnMsg(c *gin.Context, statusCode int, msg string) { + res := gin.H{ + "code": statusCode, + } + if msg != "" { + res["message"] = msg + } + jsonData, _ := json.Marshal(res) + strs := string(jsonData) + c.Writer.WriteString(strs) +} diff --git a/app/e/set_cache.go b/app/e/set_cache.go new file mode 100644 index 0000000..45337a1 --- /dev/null +++ b/app/e/set_cache.go @@ -0,0 +1,8 @@ +package e + +func SetCache(cacheTime int64) map[string]interface{} { + if cacheTime == 0 { + return map[string]interface{}{"cache_time": cacheTime} + } + return map[string]interface{}{"cache_time": cacheTime} +} diff --git a/app/enum/enum_merchant_coupon_scheme.go b/app/enum/enum_merchant_coupon_scheme.go new file mode 100644 index 0000000..4d8e986 --- /dev/null +++ b/app/enum/enum_merchant_coupon_scheme.go @@ -0,0 +1,190 @@ +package enum + +// ActCouponType 优惠券类型 +type ActCouponType int + +const ( + ActCouponTypeImmediate ActCouponType = iota + 1 // 立减 + ActCouponTypeReachReduce // 满减 + ActCouponTypeReachDiscount // 满折 +) + +func (em ActCouponType) String() string { + switch em { + case ActCouponTypeImmediate: + return "立减券" + case ActCouponTypeReachReduce: + return "满减券" + case ActCouponTypeReachDiscount: + return "折扣券" + default: + return "未知类型" + } +} + +// ActCouponSendWay 发放形式 +type ActCouponSendWay int + +const ( + ActCouponSendWayPositive ActCouponSendWay = iota + 1 + ActCouponSendWayManual +) + +func (em ActCouponSendWay) String() string { + switch em { + case ActCouponSendWayPositive: + return "主动发放" + case ActCouponSendWayManual: + return "手动领取" + default: + return "未知类型" + } +} + +// ActCouponSendTimeType 发放时间类型 +type ActCouponSendTimeType int + +const ( + ActCouponSendTimeTypeImmediate ActCouponSendTimeType = iota + 1 + ActCouponSendTimeTypeTiming +) + +func (em ActCouponSendTimeType) String() string { + switch em { + case ActCouponSendTimeTypeImmediate: + return "立即发放" + case ActCouponSendTimeTypeTiming: + return "定时" + default: + return "未知类型" + } +} + +// ActCouponSendUserType 发放用户 +type ActCouponSendUserType int + +const ( + ActCouponSendUserTypeLevel ActCouponSendUserType = iota + 1 + ActCouponSendUserTypeAll + ActCouponSendUserTypeSpecify +) + +func (em ActCouponSendUserType) String() string { + switch em { + case ActCouponSendUserTypeLevel: + return "指定会员等级" + case ActCouponSendUserTypeAll: + return "所有人可领" + case ActCouponSendUserTypeSpecify: + return "指定用户" + default: + return "未知类型" + } +} + +// ActCouponValidTimeType 有效时间 +type ActCouponValidTimeType int + +const ( + ActCouponValidTimeTypeFix ActCouponValidTimeType = iota + 1 // 固定日期 + ActCouponValidTimeTypeXDay // 领取当日开始计算有效期 + ActCouponValidTimeTypeXNextDay // 领取次日开始计算有效期 +) + +func (em ActCouponValidTimeType) String() string { + switch em { + case ActCouponValidTimeTypeFix: + return "固定日期" + case ActCouponValidTimeTypeXDay: + return "自领取当日起,%d天内有效" + case ActCouponValidTimeTypeXNextDay: + return "自领取次日起,%d天内有效" + default: + return "未知类型" + } +} + +// ActCouponUseRule 使用规则 +type ActCouponUseRule int + +const ( + ActCouponUseRuleAll ActCouponUseRule = iota + 1 // 全部商品可用 + ActCouponUseRuleSpecifyGoods // 仅可用于指定商品 + ActCouponUseRuleSpecifyActivity // 可用于活动类型 +) + +func (em ActCouponUseRule) String() string { + switch em { + case ActCouponUseRuleAll: + return "全部商品可用" + case ActCouponUseRuleSpecifyGoods: + return "仅可用于指定商品" + case ActCouponUseRuleSpecifyActivity: + return "可用于活动类型" + default: + return "未知类型" + } +} + +type ActCouponUseActivityType int + +const ( + ActCouponUseActivityTypeForGroup ActCouponUseActivityType = iota + 1 + ActCouponUseActivityTypeForSecondKill + ActCouponUseActivityTypeForBargain +) + +func (em ActCouponUseActivityType) String() string { + switch em { + case ActCouponUseActivityTypeForGroup: + return "拼团活动" + case ActCouponUseActivityTypeForSecondKill: + return "秒杀活动" + case ActCouponUseActivityTypeForBargain: + return "砍价活动" + default: + return "未知类型" + } +} + +type ActCouponSendState int + +const ( + ActCouponSendStateUnProvide ActCouponSendState = iota + 1 // 未发放 + ActCouponSendStateProvide // 已发放 + ActCouponSendStateProviding // 发放中 +) + +func (em ActCouponSendState) String() string { + switch em { + case ActCouponSendStateUnProvide: + return "未发放" + case ActCouponSendStateProvide: + return "已发放" + case ActCouponSendStateProviding: + return "发放中" + default: + return "未知类型" + } +} + +type ActUserCouponUseState int + +const ( + ActUserCouponUseStateUnUse ActUserCouponUseState = iota // 未使用 + ActUserCouponUseStateUsed // 已使用 + ActUserCouponUseStateUnValid // 失效 +) + +func (em ActUserCouponUseState) String() string { + switch em { + case ActUserCouponUseStateUnUse: + return "未使用" + case ActUserCouponUseStateUsed: + return "已使用" + case ActUserCouponUseStateUnValid: + return "失效" + default: + return "未知类型" + } +} diff --git a/app/hdl/hdl_cate.go b/app/hdl/hdl_cate.go new file mode 100644 index 0000000..084cd69 --- /dev/null +++ b/app/hdl/hdl_cate.go @@ -0,0 +1,10 @@ +package hdl + +import ( + "applet/app/svc" + "github.com/gin-gonic/gin" +) + +func Cate(c *gin.Context) { + svc.Cate(c) +} diff --git a/app/hdl/hdl_goods.go b/app/hdl/hdl_goods.go new file mode 100644 index 0000000..346a4be --- /dev/null +++ b/app/hdl/hdl_goods.go @@ -0,0 +1,16 @@ +package hdl + +import ( + "applet/app/svc" + "github.com/gin-gonic/gin" +) + +func Goods(c *gin.Context) { + svc.Goods(c) +} +func GoodsSku(c *gin.Context) { + svc.GoodsSku(c) +} +func GoodsCoupon(c *gin.Context) { + svc.GoodsCoupon(c) +} diff --git a/app/hdl/hdl_order.go b/app/hdl/hdl_order.go new file mode 100644 index 0000000..6f6f98f --- /dev/null +++ b/app/hdl/hdl_order.go @@ -0,0 +1,28 @@ +package hdl + +import ( + "applet/app/svc" + "github.com/gin-gonic/gin" +) + +func OrderTotal(c *gin.Context) { + svc.OrderTotal(c) +} +func OrderCreate(c *gin.Context) { + svc.OrderCreate(c) +} +func OrderCoupon(c *gin.Context) { + svc.OrderCoupon(c) +} +func OrderCancel(c *gin.Context) { + svc.OrderCancel(c) +} +func OrderList(c *gin.Context) { + svc.OrderList(c) +} +func OrderCate(c *gin.Context) { + svc.OrderCate(c) +} +func OrderDetail(c *gin.Context) { + svc.OrderDetail(c) +} diff --git a/app/hdl/hdl_pay.go b/app/hdl/hdl_pay.go new file mode 100644 index 0000000..5977a5a --- /dev/null +++ b/app/hdl/hdl_pay.go @@ -0,0 +1,37 @@ +package hdl + +import ( + "applet/app/e" + "applet/app/svc" + "github.com/gin-gonic/gin" +) + +func Pay(c *gin.Context) { + orderType := c.Param("orderType") + payMethod := c.Param("payMethod") + if orderType == "" || payMethod == "" { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + payFunc, ok := svc.PayFuncList[orderType][payMethod] + if !ok || payFunc == nil { + e.OutErr(c, e.ERR, e.NewErr(500, "不存在该支付方式")) + return + } + r, err := payFunc(c) + if err != nil { + switch err.(type) { + case e.E: + err1 := err.(e.E) + e.OutErr(c, err1.Code, err1.Error()) + return + default: + e.OutErr(c, e.ERR_PAY_ERR, e.NewErr(e.ERR_PAY_ERR, err.Error())) + return + } + } + e.OutSuc(c, r, nil) + return + + return +} diff --git a/app/hdl/hdl_store.go b/app/hdl/hdl_store.go new file mode 100644 index 0000000..cb73d25 --- /dev/null +++ b/app/hdl/hdl_store.go @@ -0,0 +1,29 @@ +package hdl + +import ( + "applet/app/e" + "applet/app/svc" + "github.com/gin-gonic/gin" +) + +func BankStoreCate(c *gin.Context) { + var res = []map[string]string{ + {"name": "全部网点", "value": ""}, + {"name": "附近网点", "value": "1"}, + {"name": "关注网点", "value": "2"}, + } + e.OutSuc(c, res, nil) + return +} +func BankStore(c *gin.Context) { + svc.BankStore(c) +} +func Store(c *gin.Context) { + svc.Store(c) +} +func StoreAddLike(c *gin.Context) { + svc.StoreAddLike(c) +} +func StoreCancelLike(c *gin.Context) { + svc.StoreCancelLike(c) +} diff --git a/app/hdl/hdl_store_order.go b/app/hdl/hdl_store_order.go new file mode 100644 index 0000000..5dd3f41 --- /dev/null +++ b/app/hdl/hdl_store_order.go @@ -0,0 +1,19 @@ +package hdl + +import ( + "applet/app/svc" + "github.com/gin-gonic/gin" +) + +func StoreOrderList(c *gin.Context) { + svc.StoreOrderList(c) +} +func StoreOrderCate(c *gin.Context) { + svc.StoreOrderCate(c) +} +func StoreOrderDetail(c *gin.Context) { + svc.StoreOrderDetail(c) +} +func StoreOrderConfirm(c *gin.Context) { + svc.StoreOrderConfirm(c) +} diff --git a/app/lib/alipay/api.go b/app/lib/alipay/api.go new file mode 100644 index 0000000..6c5da5f --- /dev/null +++ b/app/lib/alipay/api.go @@ -0,0 +1,334 @@ +package alipay + +import ( + "applet/app/cfg" + "applet/app/md" + "applet/app/utils/logx" + "fmt" + + "github.com/iGoogle-ink/gopay" + "github.com/iGoogle-ink/gopay/alipay" +) + +func commClient(appID, priKey, RSA, PKCS string, paySet *md.PayData) (*alipay.Client, error) { + client := alipay.NewClient(appID, priKey, true) + client.DebugSwitch = gopay.DebugOn + //判断密钥的类型 + rsaType := alipay.RSA2 + pkcsType := alipay.PKCS1 + if RSA == "1" { + rsaType = alipay.RSA + } + if PKCS == "1" { + pkcsType = alipay.PKCS8 + } + if paySet.PayAliUseType == "1" { + rsaType = alipay.RSA2 + pkcsType = alipay.PKCS8 + } + //配置公共参数 + client.SetCharset("utf-8"). + SetSignType(rsaType). + SetPrivateKeyType(pkcsType) + //新支付宝支付 + if paySet.PayAliUseType == "1" { + appCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAppCertSn) + if err != nil { + return nil, err + } + if appCertSN == "" { + return nil, err + } + client.SetAppCertSN(appCertSN) + aliPayRootCertSN := "687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6" + client.SetAliPayRootCertSN(aliPayRootCertSN) + aliPayPublicCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAlipayrsaPublicKey) + if err != nil { + return nil, err + } + if aliPayPublicCertSN == "" { + return nil, err + } + client.SetAliPayPublicCertSN(aliPayPublicCertSN) + } + return client, nil +} + +//(实名证件信息比对验证预咨询) +//https://opendocs.alipay.com/apis/api_2/alipay.user.certdoc.certverify.preconsult +func UserCertverifyPreconsult(appID, priKey, userName, certNo, RSA, PKCS string, paySet *md.PayData) (*md.AlipayUserCertdocCertverifyPreconsult, error) { + client, _ := commClient(appID, priKey, RSA, PKCS, paySet) + //请求参数 + body := make(gopay.BodyMap) + body.Set("user_name", userName) + body.Set("cert_type", "IDENTITY_CARD") + body.Set("cert_no", certNo) + var aliPsp md.AlipayUserCertdocCertverifyPreconsult + err := client.PostAliPayAPISelfV2(body, "alipay.user.certdoc.certverify.preconsult", aliPsp) + if err != nil { + return nil, err + } + return &aliPsp, err +} + +//(实名证件信息比对验证咨询) +//https://opendocs.alipay.com/apis/api_2/alipay.user.certdoc.certverify.consult +func UserCertverifyConsult(appID, priKey, verifyId, RSA, PKCS string, paySet *md.PayData) (*md.AlipayUserCertdocCertverifyConsult, error) { + client, _ := commClient(appID, priKey, RSA, PKCS, paySet) + //请求参数 + body := make(gopay.BodyMap) + body.Set("verify_id", verifyId) + var aliPsp md.AlipayUserCertdocCertverifyConsult + err := client.PostAliPayAPISelfV2(body, "alipay.user.certdoc.certverify.consult", aliPsp) + if err != nil { + return nil, err + } + return &aliPsp, err +} + +// TradeAppPay is 支付宝APP支付 +// 抖音头条小程序使用APP调起 +func TradeAppPay(appID, priKey, subject, orderID, amount, notiURL, RSA, PKCS string, paySet *md.PayData) (string, error) { + //初始化支付宝客户端 + // appID 是在支付宝申请的APPID + // priKey 是支付宝私钥 + // subject 是支付订单的主题 + // orderID 是智莺这边生成的订单id + // amount 是付费金额 + // notiURL 通知地址url + // passback_params 回调通知参数 + + client := alipay.NewClient(appID, priKey, true) + client.DebugSwitch = gopay.DebugOn + //判断密钥的类型 + rsa_type := alipay.RSA2 + pkcs_type := alipay.PKCS1 + if RSA == "1" { + rsa_type = alipay.RSA + } + if PKCS == "1" { + pkcs_type = alipay.PKCS8 + } + if paySet.PayAliUseType == "1" { + rsa_type = alipay.RSA2 + pkcs_type = alipay.PKCS8 + } + //配置公共参数 + client.SetCharset("utf-8"). + SetSignType(rsa_type). + SetPrivateKeyType(pkcs_type) + if notiURL != "" { + client.SetNotifyUrl(notiURL) + } + //新支付宝支付 + if paySet.PayAliUseType == "1" { + appCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAppCertSn) + fmt.Println("-应用-") + fmt.Println(appCertSN) + if err != nil { + fmt.Println(err) + return "", err + } + if appCertSN == "" { + fmt.Println(err) + return "", err + } + client.SetAppCertSN(appCertSN) + //aliPayRootCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAlipayRootCertSn) + aliPayRootCertSN := "687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6" + client.SetAliPayRootCertSN(aliPayRootCertSN) + aliPayPublicCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAlipayrsaPublicKey) + fmt.Println("-公钥-") + fmt.Println(aliPayPublicCertSN) + + if err != nil { + fmt.Println(err) + return "", err + } + if aliPayPublicCertSN == "" { + fmt.Println(err) + return "", err + } + client.SetAliPayPublicCertSN(aliPayPublicCertSN) + } + fmt.Println(client) + //请求参数 + body := make(gopay.BodyMap) + body.Set("subject", subject) + body.Set("body", subject) + body.Set("out_trade_no", orderID) + body.Set("total_amount", amount) + body.Set("timeout_express", "30m") + + // body.Set("passback_params", orderID) + //手机APP支付参数请求 + payParam, err := client.TradeAppPay(body) + if err != nil { + return "", logx.Warn(err) + } + return payParam, nil +} + +// TradeAppPay is 支付宝H5支付 +func TradeWapPay(appID, priKey, subject, orderID, amount, notiURL, RSA, PKCS, page_url string, paySet *md.PayData) (string, error) { + //aliPayPublicKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wn1sU/8Q0rYLlZ6sq3enrPZw2ptp6FecHR2bBFLjJ+sKzepROd0bKddgj+Mr1ffr3Ej78mLdWV8IzLfpXUi945DkrQcOUWLY0MHhYVG2jSs/qzFfpzmtut2Cl2TozYpE84zom9ei06u2AXLMBkU6VpznZl+R4qIgnUfByt3Ix5b3h4Cl6gzXMAB1hJrrrCkq+WvWb3Fy0vmk/DUbJEz8i8mQPff2gsHBE1nMPvHVAMw1GMk9ImB4PxucVek4ZbUzVqxZXphaAgUXFK2FSFU+Q+q1SPvHbUsjtIyL+cLA6H/6ybFF9Ffp27Y14AHPw29+243/SpMisbGcj2KD+evBwIDAQAB" + privateKey := priKey + //判断密钥的类型 + rsa_type := alipay.RSA2 + pkcs_type := alipay.PKCS1 + if RSA == "1" { + rsa_type = alipay.RSA + } + if PKCS == "1" { + pkcs_type = alipay.PKCS8 + } + if paySet.PayAliUseType == "1" { + rsa_type = alipay.RSA2 + pkcs_type = alipay.PKCS8 + } + //初始化支付宝客户端 + // appId:应用ID + // privateKey:应用秘钥 + // isProd:是否是正式环境 + client := alipay.NewClient(appID, privateKey, true) + //配置公共参数 + client.SetCharset("utf-8"). + SetSignType(rsa_type). + SetPrivateKeyType(pkcs_type). + SetReturnUrl(page_url). + SetNotifyUrl(notiURL) + //新支付宝支付 + if paySet.PayAliUseType == "1" { + appCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAppCertSn) + if err != nil { + fmt.Println(err) + return "", err + } + if appCertSN == "" { + fmt.Println(err) + return "", err + } + client.SetAppCertSN(appCertSN) + //aliPayRootCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAlipayRootCertSn) + //if err != nil { + // fmt.Println(err) + // return "", err + //} + //if aliPayRootCertSN == "" { + // fmt.Println(err) + // return "", err + //} + aliPayRootCertSN := "687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6" + client.SetAliPayRootCertSN(aliPayRootCertSN) + aliPayPublicCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAlipayrsaPublicKey) + if err != nil { + fmt.Println(err) + return "", err + } + if aliPayPublicCertSN == "" { + fmt.Println(err) + return "", err + } + client.SetAliPayPublicCertSN(aliPayPublicCertSN) + } + //请求参数 + body := make(gopay.BodyMap) + body.Set("subject", subject) + body.Set("out_trade_no", orderID) + // quit_url is 用户付款中途退出返回商户网站的地址 + body.Set("quit_url", notiURL) + body.Set("total_amount", amount) + // product_code is 销售产品码,商家和支付宝签约的产品码 + body.Set("product_code", "QUICK_WAP_WAY") + //手机网站支付请求 + payUrl, err := client.TradeWapPay(body) + if err != nil { + return "", logx.Warn(err) + + } + return payUrl, nil +} + +// TradeAppPay is 支付宝小程序本身支付 +func TradeCreate(appID, priKey, subject, orderID, amount, notiURL, RSA, PKCS string, paySet *md.PayData) (*alipay.TradeCreateResponse, error) { + //aliPayPublicKey := "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wn1sU/8Q0rYLlZ6sq3enrPZw2ptp6FecHR2bBFLjJ+sKzepROd0bKddgj+Mr1ffr3Ej78mLdWV8IzLfpXUi945DkrQcOUWLY0MHhYVG2jSs/qzFfpzmtut2Cl2TozYpE84zom9ei06u2AXLMBkU6VpznZl+R4qIgnUfByt3Ix5b3h4Cl6gzXMAB1hJrrrCkq+WvWb3Fy0vmk/DUbJEz8i8mQPff2gsHBE1nMPvHVAMw1GMk9ImB4PxucVek4ZbUzVqxZXphaAgUXFK2FSFU+Q+q1SPvHbUsjtIyL+cLA6H/6ybFF9Ffp27Y14AHPw29+243/SpMisbGcj2KD+evBwIDAQAB" + privateKey := priKey + rsa_type := alipay.RSA2 + pkcs_type := alipay.PKCS1 + if RSA == "1" { + rsa_type = alipay.RSA + } + if PKCS == "1" { + pkcs_type = alipay.PKCS8 + } + if paySet.PayAliUseType == "1" { + rsa_type = alipay.RSA2 + pkcs_type = alipay.PKCS8 + } + //初始化支付宝客户端 + // appId:应用ID + // privateKey:应用私钥,支持PKCS1和PKCS8 + // isProd:是否是正式环境 + client := alipay.NewClient(appID, privateKey, true) + //配置公共参数 + client.SetCharset("utf-8"). + SetSignType(rsa_type). + SetPrivateKeyType(pkcs_type). + SetNotifyUrl(notiURL) + if paySet.PayAliUseType == "1" { + appCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAppCertSn) + if err != nil { + fmt.Println(err) + return nil, err + } + if appCertSN == "" { + fmt.Println(err) + return nil, err + } + client.SetAppCertSN(appCertSN) + //aliPayRootCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAlipayRootCertSn) + //if err != nil { + // fmt.Println(err) + // return nil, err + //} + //if aliPayRootCertSN == "" { + // fmt.Println(err) + // return nil, err + //} + aliPayRootCertSN := "687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6" + client.SetAliPayRootCertSN(aliPayRootCertSN) + aliPayPublicCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + paySet.PayAlipayrsaPublicKey) + if err != nil { + fmt.Println(err) + return nil, err + } + if aliPayPublicCertSN == "" { + fmt.Println(err) + return nil, err + } + client.SetAliPayPublicCertSN(aliPayPublicCertSN) + } + //请求参数 + body := make(gopay.BodyMap) + body.Set("subject", subject) + // 支付宝小程序支付时 buyer_id 为必传参数,需要提前获取,获取方法如下两种 + // 1、alipay.SystemOauthToken() 返回取值:rsp.SystemOauthTokenResponse.UserId + // 2、client.SystemOauthToken() 返回取值:aliRsp.SystemOauthTokenResponse.UserId + buyer_id, err := client.SystemOauthToken(body) + if err != nil { + return nil, logx.Warn(err) + } + body.Set("buyer_id", buyer_id) + body.Set("out_trade_no", orderID) + body.Set("total_amount", amount) + //创建订单 + aliRsp, err := client.TradeCreate(body) + + if err != nil { + return nil, logx.Warn(err) + } + logx.Warn("aliRsp:", *aliRsp) + logx.Warn("aliRsp.TradeNo:", aliRsp.Response.TradeNo) + return aliRsp, nil + +} diff --git a/app/lib/arkid/api.go b/app/lib/arkid/api.go new file mode 100644 index 0000000..685a0bc --- /dev/null +++ b/app/lib/arkid/api.go @@ -0,0 +1,148 @@ +package arkid + +import ( + "encoding/json" + "errors" + "fmt" + + "applet/app/cfg" + "applet/app/utils" + "applet/app/utils/cache" + "applet/app/utils/logx" +) + +func arkidLogin(args map[string]interface{}) ([]byte, error) { + url := cfg.ArkID.Url + "/siteapi/v1/ucenter/login/" + b, err := json.Marshal(args) + if err != nil { + return nil, logx.Error(err) + } + var d []byte + d, err = utils.CurlPost(url, b, nil) + if err != nil { + return nil, logx.Error(err) + } + return d, nil +} + +func arkidLogout(token string) ([]byte, error) { + // fmt.Println(cfg.ArkID.Url) + url := cfg.ArkID.Url + "/siteapi/v1/revoke/token/" + h := map[string]string{"authorization": fmt.Sprintf("token %s", token)} + d, err := utils.CurlPost(url, "", h) + if err != nil { + return nil, logx.Error(err) + } + return d, nil +} + +func arkidUserInfo(token string) ([]byte, error) { + url := cfg.ArkID.Url + "/siteapi/v1/auth/token/" + h := map[string]string{"authorization": fmt.Sprintf("token %s", token)} + d, err := utils.CurlGet(url, h) + if err != nil { + return nil, logx.Error(err) + } + return d, nil +} + +func arkidRegister(args map[string]interface{}) ([]byte, error) { + url := cfg.ArkID.Url + "/siteapi/oneid/user/" + b, err := json.Marshal(args) + if err != nil { + return nil, logx.Error(err) + } + admin, err := getArkIDAdmin() + if err != nil { + return nil, logx.Error(err) + } + h := map[string]string{"authorization": fmt.Sprintf("token %s", admin.Token)} + var d []byte + d, err = utils.CurlPost(url, b, h) + if err != nil { + return nil, logx.Error(err) + } + return d, nil +} + +func arkidAppAccessWhiteList(args map[string]interface{}, permName string) ([]byte, error) { + if permName == "" { + return nil, errors.New("The perm_name arg must required") + } + path := fmt.Sprintf("/siteapi/oneid/perm/%s/owner/", permName) + url := cfg.ArkID.Url + path + b, err := json.Marshal(args) + if err != nil { + return nil, logx.Error(err) + } + admin, err := getArkIDAdmin() + if err != nil { + return nil, logx.Error(err) + } + // fmt.Println(admin.Token) + h := map[string]string{"authorization": fmt.Sprintf("token %s", admin.Token)} + var d []byte + d, err = utils.CurlPatch(url, b, h) + if err != nil { + return nil, logx.Error(err) + } + return d, nil +} + +func arkidUserDelete(username string) ([]byte, error) { + if username == "" { + return nil, errors.New("The username arg must required") + } + path := fmt.Sprintf("/siteapi/oneid/user/%s/", username) + url := cfg.ArkID.Url + path + admin, err := getArkIDAdmin() + if err != nil { + return nil, logx.Error(err) + } + // fmt.Println(admin.Token) + h := map[string]string{"authorization": fmt.Sprintf("token %s", admin.Token)} + var d []byte + d, err = utils.CurlDelete(url, nil, h) + if err != nil { + return nil, logx.Error(err) + } + return d, nil +} + +func arkidUserUpdate(username string, args map[string]interface{}) ([]byte, error) { + if username == "" { + return nil, errors.New("The username arg must required") + } + b, err := json.Marshal(args) + if err != nil { + return nil, logx.Error(err) + } + path := fmt.Sprintf("/siteapi/oneid/user/%s/", username) + url := cfg.ArkID.Url + path + var admin *ArkIDUser + admin, err = getArkIDAdmin() + if err != nil { + return nil, logx.Error(err) + } + h := map[string]string{"authorization": fmt.Sprintf("token %s", admin.Token)} + d, err := utils.CurlPatch(url, b, h) + if err != nil { + return nil, logx.Error(err) + } + return d, nil +} + +func getArkIDAdmin() (*ArkIDUser, error) { + c, err := cache.Bytes(cache.Get(ARKID_ADMIN_TOKEN)) + if err != nil { + logx.Error(err) + } + if c != nil && err == nil { + admin := new(ArkIDUser) + if err = json.Unmarshal(c, admin); err != nil { + return admin, err + } + return admin, nil + } + return Init() +} diff --git a/app/lib/arkid/base.go b/app/lib/arkid/base.go new file mode 100644 index 0000000..fff9511 --- /dev/null +++ b/app/lib/arkid/base.go @@ -0,0 +1,6 @@ +package arkid + +const ( + BASE_URL = "http://k8s.arkid.izhim.cn" + ARKID_ADMIN_TOKEN = "arkid_admin_token" +) diff --git a/app/lib/arkid/init.go b/app/lib/arkid/init.go new file mode 100644 index 0000000..060537c --- /dev/null +++ b/app/lib/arkid/init.go @@ -0,0 +1,24 @@ +package arkid + +import ( + "applet/app/cfg" + "applet/app/utils" + "applet/app/utils/cache" +) + +// Init is cache token to redis +func Init() (*ArkIDUser, error) { + arkidsdk := NewArkID() + arkadmin := new(ArkIDUser) + err := arkidsdk.SelectFunction("arkid_login").WithArgs(RequestBody{ + Username: cfg.ArkID.Admin, + Password: cfg.ArkID.AdminPassword, + }).Result(arkadmin) + if err != nil { + panic(err) + } + + // token 默认30天过期 + cache.SetEx(ARKID_ADMIN_TOKEN, utils.Serialize(arkadmin), 2592000) + return arkadmin, err +} diff --git a/app/lib/arkid/model.go b/app/lib/arkid/model.go new file mode 100644 index 0000000..82882ab --- /dev/null +++ b/app/lib/arkid/model.go @@ -0,0 +1,62 @@ +package arkid + +type ArkIDUser struct { + Token string `json:"token"` + UserID int `json:"user_id"` + Username string `json:"username"` + Name string `json:"name"` + Email string `json:"email"` + Mobile string `json:"mobile"` + EmployeeNumber string `json:"employee_number"` + Gender int `json:"gender"` + Perms []string `json:"perms"` + Avatar string `json:"avatar"` + Roles []string `json:"roles"` + PrivateEmail string `json:"private_email"` + Position string `json:"position"` + IsSettled bool `json:"is_settled"` + IsManager bool `json:"is_manager"` + IsAdmin bool `json:"is_admin"` + IsExternUser bool `json:"is_extern_user"` + OriginVerbose string `json:"origin_verbose"` + RequireResetPassword bool `json:"require_reset_password"` + HasPassword bool `json:"has_password"` +} + +type RequestBody struct { + Token string `json:"token,omitempty"` + Username string `json:"username,omitempty"` + Password string `json:"password,omitempty"` + User struct { + Avatar string `json:"avatar,omitempty"` + Email string `json:"email,omitempty"` + EmployeeNumber string `json:"employee_number,omitempty"` + Gender int `json:"gende,omitemptyr"` + Mobile string `json:"mobile,omitempty"` + Name string `json:"name,omitempty"` + Position string `json:"position,omitempty"` + PrivateEmail string `json:"private_email,omitempty"` + Username string `json:"username,omitempty"` + Depts interface{} `json:"depts,omitempty"` + Roles interface{} `json:"roles,omitempty"` + Nodes []interface{} `json:"nodes,omitempty"` + IsSettled bool `json:"is_settled,omitempty"` + Password string `json:"password,omitempty"` + RequireResetPassword bool `json:"require_reset_password,omitempty"` + HasPassword bool `json:"has_password,omitempty"` + } `json:"user,omitempty"` + NodeUids []string `json:"node_uids,omitempty"` + PermName string `json:"perm_name,omitempty"` + UserPermStatus []struct { + UID string `json:"uid,omitempty"` + Status int `json:"status,omitempty"` + } `json:"user_perm_status,omitempty"` +} + +type AppAccessWhiteListResult struct { + UserPermStatus []struct { + UID string `json:"uid"` + Status int `json:"status"` + } `json:"user_perm_status"` + NodePermStatus []interface{} `json:"node_perm_status"` +} diff --git a/app/lib/arkid/sdk.go b/app/lib/arkid/sdk.go new file mode 100644 index 0000000..59b45c2 --- /dev/null +++ b/app/lib/arkid/sdk.go @@ -0,0 +1,165 @@ +package arkid + +import ( + "applet/app/utils/cache" + "applet/app/utils/logx" + "encoding/json" + "errors" + "fmt" +) + +type SDK struct { + response []byte + fmap map[string]func(RequestBody) + fname string + err error +} + +//Init is init sdk +func (s *SDK) Init() { + s.fmap = make(map[string]func(RequestBody)) +} + +//SelectFunction is choose func +func (s *SDK) SelectFunction(fname string) *SDK { + s.fname = fname + return s +} + +//WithArgs is request args +func (s *SDK) WithArgs(r RequestBody) *SDK { + f := s.fmap[s.fname] + f(r) + return s +} + +//Result is result to p +func (s *SDK) Result(p interface{}) error { + if s.err != nil { + return s.err + } + if string(s.response) == "" { + return nil + } + if err := json.Unmarshal(s.response, p); err != nil { + return logx.Error(string(s.response), err) + } + return nil +} + +// Register is register func +func (s *SDK) Register(name string, f func(RequestBody)) { + s.fmap[name] = f +} + +//getAdmin arkid 用户的信息 ,主要是token +func (s *SDK) arkidLogin(r RequestBody) { + postData := map[string]interface{}{ + "username": r.Username, + "password": r.Password, + } + s.response, s.err = arkidLogin(postData) +} + +func (s *SDK) arkidRegister(r RequestBody) { + postData := map[string]interface{}{} + b, err := json.Marshal(r) + if err != nil { + s.err = err + } + if err := json.Unmarshal(b, &postData); err != nil { + s.err = err + } + s.response, s.err = arkidRegister(postData) +} + +func (s *SDK) arkidAppAccessWhiteList(r RequestBody) { + postData := map[string]interface{}{} + b, err := json.Marshal(r) + if err != nil { + s.err = err + } + if err := json.Unmarshal(b, &postData); err != nil { + s.err = err + } + s.response, s.err = arkidAppAccessWhiteList(postData, r.PermName) +} + +func (s *SDK) arkidUserInfo(r RequestBody) { + s.response, s.err = arkidUserInfo(r.Token) +} + +func (s *SDK) arkidUserDelete(r RequestBody) { + s.response, s.err = arkidUserDelete(r.Username) +} + +func (s *SDK) arkidUserUpdate(r RequestBody) { + postData := map[string]interface{}{} + b, err := json.Marshal(r.User) + if err != nil { + s.err = err + } + if err := json.Unmarshal(b, &postData); err != nil { + s.err = err + } + s.response, s.err = arkidUserUpdate(r.Username, postData) +} + +func (s *SDK) arkidLogout(r RequestBody) { + s.response, s.err = arkidLogout(r.Token) +} + +// NewArkID is con +func NewArkID() *SDK { + sdk := new(SDK) + sdk.Init() + sdk.Register("arkid_login", sdk.arkidLogin) + sdk.Register("arkid_register", sdk.arkidRegister) + sdk.Register("arkid_app_access_white_list", sdk.arkidAppAccessWhiteList) + sdk.Register("arkid_delete_user", sdk.arkidUserDelete) + sdk.Register("arkid_user_info", sdk.arkidUserInfo) + sdk.Register("arkid_user_update", sdk.arkidUserUpdate) + sdk.Register("arkid_logout", sdk.arkidLogout) + return sdk +} + +// GetArkIDUser is get arkid token if redis is existed unless send request to arkid +func GetArkIDUser(username string, MD5passowrd string) (*ArkIDUser, error) { + key := fmt.Sprintf("arkid_user_%s", username) + arkidUser := new(ArkIDUser) + c, err := cache.GetBytes(key) + if c != nil && err == nil { + if err := json.Unmarshal(c, arkidUser); err != nil { + return arkidUser, err + } + if arkidUser.Token == "" { + + return arkidUser, errors.New("Get Arkid User error, Token missing") + } + + return arkidUser, err + } + arkidSdk := NewArkID() + err = arkidSdk.SelectFunction("arkid_login").WithArgs(RequestBody{ + Username: username, + Password: MD5passowrd, + }).Result(arkidUser) + if arkidUser.Token == "" { + return arkidUser, errors.New("Get Arkid User error, Token missing") + } + // 缓存30天 + // cache.SetEx(key, utils.Serialize(arkidUser), 2592000) + return arkidUser, err +} + +// RegisterRollback is 注册时的错误回滚 +func RegisterRollback(username string) error { + sdk := NewArkID() + err := sdk.SelectFunction("arkid_delete_user").WithArgs(RequestBody{ + Username: username, + }).Result(nil) + if err != nil { + return err + } + return nil +} diff --git a/app/lib/auth/base.go b/app/lib/auth/base.go new file mode 100644 index 0000000..a886c2e --- /dev/null +++ b/app/lib/auth/base.go @@ -0,0 +1,25 @@ +package auth + +import ( + "time" + + "github.com/dgrijalva/jwt-go" +) + +// TokenExpireDuration is jwt 过期时间 +const TokenExpireDuration = time.Hour * 4380 + +const RefreshTokenExpireDuration = time.Hour * 4380 + +var Secret = []byte("zyos") + +// JWTUser 如果想要保存更多信息,都可以添加到这个结构体中 +type JWTUser struct { + UID int `json:"uid"` + Username string `json:"username"` + Phone string `json:"phone"` + AppName string `json:"app_name"` + MiniOpenID string `json:"mini_open_id"` // 小程序的open_id + MiniSK string `json:"mini_session_key"` // 小程序的session_key + jwt.StandardClaims +} diff --git a/app/lib/mob/api.go b/app/lib/mob/api.go new file mode 100644 index 0000000..fb6887b --- /dev/null +++ b/app/lib/mob/api.go @@ -0,0 +1,297 @@ +package mob + +import ( + "applet/app/db" + "applet/app/e" + "applet/app/lib/sms" + "applet/app/lib/zhimeng" + "applet/app/utils" + "applet/app/utils/logx" + "bytes" + "crypto/cipher" + "crypto/des" + "crypto/md5" + "encoding/base64" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + "sort" + "time" + + "github.com/gin-gonic/gin" + "github.com/tidwall/gjson" +) + +const base string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + +// Mob is mob sdk +var Mob *SDK + +// MobMap is 每个站长都要有自己的mob 对象 +var MobMap map[string]*SDK + +//Init 初始化 +func Init() { + // 后续可能要传请求的上下文来获取对应的配置 + // mob 目前都是我们来管理每个站长的app 所以使用template 库 + //fmt.Println("Mob SDK init ....") + ch := make(chan struct{}) // 只是做信号标志的话 空struct 更省点资源 + MobMap = make(map[string]*SDK) + // 初始化 + for k, e := range db.DBs { + m := db.SysCfgGetWithDb(e, k, "third_app_push_set") + if m == "" { + fmt.Printf("masterid:%s 找不到推送配置", k) + continue + } + key := gjson.Get(m, "mobAppKey").String() + secret := gjson.Get(m, "mobAppSecret").String() + if key == "" || secret == "" { + fmt.Println(k + ":mob no config") + continue + } + // fmt.Println(k, key, secret) + mob := new(SDK) + mob.AppKey = key + mob.AppSecret = secret + MobMap[k] = mob + fmt.Println(k + ":mob config success") + } + go func() { + ch <- struct{}{} + }() + + // 定时任务 + go func(MobMap map[string]*SDK, ch chan struct{}) { + <-ch + ticker := time.NewTicker(time.Duration(time.Second * 15)) + //每 15s 一次更新一次mob 配置 + for range ticker.C { + for k, e := range db.DBs { + if err := e.Ping(); err != nil { + logx.Info(err) + continue + } + m := db.SysCfgGetWithDb(e, k, "third_app_push_set") + if m == "" { + fmt.Printf("masterid:%s 找不到推送配置", k) + continue + } + key := gjson.Get(m, "mobAppKey").String() + secret := gjson.Get(m, "mobAppSecret").String() + if key == "" || secret == "" { + fmt.Println(k + ":mob no config") + continue + } + // fmt.Println(k, key, secret) + mob := new(SDK) + mob.AppKey = key + mob.AppSecret = secret + MobMap[k] = mob + // fmt.Println(k + ":mob config success") + } + } + }(MobMap, ch) +} + +// GetMobSDK is 获取mob 的sdk +func GetMobSDK(mid string) (*SDK, error) { + selectDB := db.DBs[mid] + m := db.SysCfgGetWithDb(selectDB, mid, "third_app_push_set") + if m == "" { + return nil, errors.New("获取不到推送配置") + } + key := gjson.Get(m, "mobAppKey").String() + secret := gjson.Get(m, "mobAppSecret").String() + if key == "" || secret == "" { + return nil, fmt.Errorf("%s mob not config", mid) + } + + return &SDK{AppKey: key, AppSecret: secret}, nil +} + +// SDK is mob_push 的sdk +type SDK struct { + AppKey string + AppSecret string +} + +//MobFreeLogin is 秒验 +func (s *SDK) MobFreeLogin(args map[string]interface{}) (string, error) { + var url string = "http://identify.verify.mob.com/auth/auth/sdkClientFreeLogin" + // https://www.mob.com/wiki/detailed/?wiki=miaoyan_for_fuwuduan_mianmifuwuduanjieru&id=78 + //加appkey + args["appkey"] = s.AppKey + //加签名 + args["sign"] = generateSign(args, s.AppSecret) + b, err := json.Marshal(args) + if err != nil { + return "", logx.Warn(err) + } + // 发送请求 + respBody, err := httpPostBody(url, b) + if err != nil { + return "", logx.Warn(err) + } + // 反序列化 + ret := struct { + Status int `json:"status"` + Error string `json:"error"` + Res interface{} `json:"res"` + }{} + // 要拿 ret 里面 Res 再解密 + if err := json.Unmarshal(respBody, &ret); err != nil { + return "", logx.Warn(err) + } + //fmt.Println(ret) + // ret里面的Res 反序列化为结构体 + res := struct { + IsValid int `json:"isValid"` + Phone string `json:"phone"` + }{} + // 判断是否返回正确 状态码 + if ret.Status == 200 { + decode, _ := base64Decode([]byte(ret.Res.(string))) + decr, _ := desDecrypt(decode, []byte(s.AppSecret)[0:8]) + if err := json.Unmarshal(decr, &res); err != nil { + return "", logx.Warn(err) + } + } + // 有效则拿出res 里的电话号码 + if res.IsValid == 1 { + return res.Phone, nil + } + // Status 不等于200 则返回空 + return "", fmt.Errorf("Mob error , status code %v ", ret.Status) +} + +// MobSMS is mob 的短信验证 +func (s *SDK) MobSMS(c *gin.Context, args map[string]interface{}) (bool, error) { + // mob 的短信验证 + // https://www.mob.com/wiki/detailed/?wiki=SMSSDK_for_yanzhengmafuwuduanxiaoyanjiekou&id=23 + url := "https://webapi.sms.mob.com/sms/verify" + //加appkey + args["appkey"] = s.AppKey + fmt.Println(args) + //fmt.Println(args) + // 发送请求 + respBody, err := utils.CurlPost(url, args, nil) + if err != nil { + fmt.Println(err) + return false, logx.Warn(err) + } + fmt.Println("=======================mob") + fmt.Println("mob", string(respBody)) + code := gjson.GetBytes(respBody, "status").Int() + if code == 468 { + return false, errors.New("验证码错误") + } + if code != 200 { + utils.FilePutContents("sms", string(respBody)) + return false, errors.New("验证码错误~") + } + + if c.GetString("not_deduction_doing") == "1" { //这是前面扣过了 + return true, nil + } + // TODO 成功后扣费暂时先接旧智盟 + sdk, err := sms.NewZhimengSMS(c).SelectFunction("deduction_doing").WithSMSArgs(map[string]interface{}{ + "mobile": args["phone"], + "getmsg": "1", + }).Result() + if err != nil { + return false, logx.Warn(err) + } + zr := sdk.ToInterface().(string) + if zr == "1" { + logx.Infof("旧智盟扣费成功 appkey %s", zhimeng.SMS_APP_KEY) + } + return true, nil +} + +func pkcs5UnPadding(origData []byte) []byte { + length := len(origData) + // 去掉最后一个字节 unpadding 次 + unpadding := int(origData[length-1]) + return origData[:(length - unpadding)] +} + +func desDecrypt(crypted, key []byte) ([]byte, error) { + block, err := des.NewCipher(key) + if err != nil { + return nil, err + } + blockMode := cipher.NewCBCDecrypter(block, []byte("00000000")) + origData := make([]byte, len(crypted)) + // origData := crypted + blockMode.CryptBlocks(origData, crypted) + origData = pkcs5UnPadding(origData) + // origData = ZeroUnPadding(origData) + return origData, nil +} + +func base64Decode(src []byte) ([]byte, error) { + var coder *base64.Encoding + coder = base64.NewEncoding(base) + return coder.DecodeString(string(src)) +} + +func httpPostBody(url string, msg []byte) ([]byte, error) { + resp, err := http.Post(url, "application/json;charset=utf-8", bytes.NewBuffer(msg)) + if err != nil { + return []byte(""), err + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + return body, err +} + +func generateSign(request map[string]interface{}, secret string) string { + ret := "" + var keys []string + for k := range request { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + ret = ret + fmt.Sprintf("%v=%v&", k, request[k]) + } + ret = ret[:len(ret)-1] + secret + + md5Ctx := md5.New() + md5Ctx.Write([]byte(ret)) + cipherStr := md5Ctx.Sum(nil) + return hex.EncodeToString(cipherStr) +} + +func Check(c *gin.Context, phone, zone, validCode string, ok1 bool) (bool, error) { + smsPlatform := sms.GetSmsPlatform(c) + + if smsPlatform == "mob" { + mob1, errr := GetMobSDK(c.GetString("mid")) + if errr != nil { + return false, e.NewErr(400, "mob配置错误") + } + send := map[string]interface{}{ + "phone": phone, + "zone": zone, + "code": validCode, + } + if zone == "" { + send["zone"] = "86" + } + c.Set("not_deduction_doing", "1") + ok, err := mob1.MobSMS(c, send) + fmt.Println(ok) + if err != nil { + fmt.Println(err) + return false, e.NewErr(400, "验证码校验错误") + } + + return ok, nil + } + return ok1, nil +} diff --git a/app/lib/mob/main.go b/app/lib/mob/main.go new file mode 100644 index 0000000..e76b515 --- /dev/null +++ b/app/lib/mob/main.go @@ -0,0 +1,15 @@ +package mob + +import "applet/app/svc" + +//NewMobSDK 构建一个Mobsdk对象 +func NewMobSDK() *SDK { + // 后续可能要传请求的上下文来获取对应的配置 + // mob 目前都是我们来管理每个站长的app 所以使用template 库 + key := svc.SysCfgGet(nil, "third_mob_app_key") + secret := svc.SysCfgGet(nil, "third_mob_app_secret") + mob := new(SDK) + mob.AppKey = key + mob.AppSecret = secret + return mob +} diff --git a/app/lib/qiniu/bucket_create.go b/app/lib/qiniu/bucket_create.go new file mode 100644 index 0000000..28d8106 --- /dev/null +++ b/app/lib/qiniu/bucket_create.go @@ -0,0 +1,16 @@ +package qiniu + +import ( + "github.com/qiniu/api.v7/v7/auth" + "github.com/qiniu/api.v7/v7/storage" +) + +func BucketCreate() error { + mac := auth.New(AK, SK) + cfg := storage.Config{ + // 是否使用https域名进行资源管理 + UseHTTPS: false, + } + bucketManager := storage.NewBucketManager(mac, &cfg) + return bucketManager.CreateBucket("", storage.RIDHuanan) +} diff --git a/app/lib/qiniu/bucket_delete.go b/app/lib/qiniu/bucket_delete.go new file mode 100644 index 0000000..6d41521 --- /dev/null +++ b/app/lib/qiniu/bucket_delete.go @@ -0,0 +1,18 @@ +package qiniu + +import ( + "github.com/qiniu/api.v7/v7/auth" + "github.com/qiniu/api.v7/v7/storage" +) + +func BucketDelete(bucketName string) error { + mac := auth.New(AK, SK) + + cfg := storage.Config{ + // 是否使用https域名进行资源管理 + UseHTTPS: false, + } + + bucketManager := storage.NewBucketManager(mac, &cfg) + return bucketManager.DropBucket(bucketName) +} diff --git a/app/lib/qiniu/bucket_get_domain.go b/app/lib/qiniu/bucket_get_domain.go new file mode 100644 index 0000000..f4cee3a --- /dev/null +++ b/app/lib/qiniu/bucket_get_domain.go @@ -0,0 +1,18 @@ +package qiniu + +import ( + "github.com/qiniu/api.v7/v7/auth" + "github.com/qiniu/api.v7/v7/storage" +) + +func BucketGetDomain(bucketName string) (string, error) { + mac := auth.New(AK, SK) + + cfg := storage.Config{UseHTTPS: false} + bucketManager := storage.NewBucketManager(mac, &cfg) + b, err := bucketManager.ListBucketDomains(bucketName) + if err != nil { + return "", err + } + return b[0].Domain, nil +} diff --git a/app/lib/qiniu/init.go b/app/lib/qiniu/init.go new file mode 100644 index 0000000..1d4346a --- /dev/null +++ b/app/lib/qiniu/init.go @@ -0,0 +1,22 @@ +package qiniu + +import ( + "applet/app/utils" +) + +var ( + AK = "MmxNdai23egjNUHjdzEVaTPdPCIbWzENz9BQuak3" + SK = "mElaFlM9O16rXp-ihoQdJ9KOH56naKm3MoyQBA59" + BUCKET = "dev-fnuoos" // 桶子名称 + BUCKET_SCHEME = "http" + BUCKET_REGION = "up-z2.qiniup.com" + Expires uint64 = 3600 +) + +func Init(ak, sk, bucket, region, scheme string) { + AK, SK, BUCKET, BUCKET_REGION, BUCKET_SCHEME = ak, sk, bucket, region, scheme +} + +func Sign(t string) string { + return utils.Md5(AK + SK + t) +} diff --git a/app/lib/qiniu/req_img_upload.go b/app/lib/qiniu/req_img_upload.go new file mode 100644 index 0000000..36c27ae --- /dev/null +++ b/app/lib/qiniu/req_img_upload.go @@ -0,0 +1,55 @@ +package qiniu + +import ( + "time" + + "github.com/qiniu/api.v7/v7/auth/qbox" + _ "github.com/qiniu/api.v7/v7/conf" + "github.com/qiniu/api.v7/v7/storage" + + "applet/app/md" + "applet/app/utils" +) + +// 请求图片上传地址信息 +func ReqImgUpload(f *md.FileCallback, callbackUrl string) interface{} { + if ext := utils.FileExt(f.FileName); ext == "png" || ext == "jpg" || ext == "jpeg" || ext == "gif" || ext == "bmp" || ext == "webp" { + f.Width = "$(imageInfo.width)" + f.Height = "$(imageInfo.height)" + } + f.Provider = "qiniu" + f.FileSize = "$(fsize)" + f.Hash = "$(etag)" + f.Bucket = "$(bucket)" + f.Mime = "$(mimeType)" + f.Time = utils.Int64ToStr(time.Now().Unix()) + f.Sign = Sign(f.Time) + putPolicy := storage.PutPolicy{ + Scope: BUCKET + ":" + f.FileName, // 使用覆盖方式时候必须请求里面有key,否则报错 + Expires: Expires, + ForceSaveKey: true, + SaveKey: f.FileName, + //MimeLimit: "image/*", // 只允许上传图片 + CallbackURL: callbackUrl, + CallbackBody: utils.SerializeStr(f), + CallbackBodyType: "application/json", + } + return &struct { + Method string `json:"method"` + Key string `json:"key"` + Host string `json:"host"` + Token string `json:"token"` + }{Key: f.FileName, Method: "POST", Host: BUCKET_SCHEME + "://" + BUCKET_REGION, Token: putPolicy.UploadToken(qbox.NewMac(AK, SK))} +} + +/* +form表单上传 +地址 : http://upload-z2.qiniup.com +header + - Content-Type : multipart/form-data + +body : + - key : 文件名 + - token : 生成token + - file : 待上传文件 +*/ diff --git a/app/lib/sms/sms.go b/app/lib/sms/sms.go new file mode 100644 index 0000000..f10dafd --- /dev/null +++ b/app/lib/sms/sms.go @@ -0,0 +1,122 @@ +package sms + +import ( + "applet/app/db" + "applet/app/lib/zhimeng" + "applet/app/svc" + "applet/app/utils/cache" + "applet/app/utils/logx" + "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/sms" + "errors" + "fmt" + "github.com/tidwall/gjson" + + "github.com/gin-gonic/gin" +) + +// NewZhimengSMS is 智盟的短信服务 +func NewZhimengSMS(c *gin.Context) *zhimeng.SDK { + sms := new(zhimeng.SDK) + key := svc.SysCfgGet(c, "third_zm_sms_key") + secret := svc.SysCfgGet(c, "third_zm_sms_secret") + if key == "" || secret == "" { + _ = logx.Warn("短信服务配置错误") + } + sms.Init("send_msg", key, secret) + return sms +} +func GetSmsPlatform(c *gin.Context) string { + var smsPlatform = "ljioe" + key := fmt.Sprintf("%s:sms_platform", c.GetString("mid")) + smsPlatformTmp, _ := cache.GetString(key) + if smsPlatformTmp == "" { + smsPlatformTmp = svc.GetWebSiteAppSmsPlatform(c.GetString("mid")) + if smsPlatformTmp != "" { + cache.SetEx(key, smsPlatformTmp, 300) + } + } + if smsPlatformTmp != "" { + smsPlatform = smsPlatformTmp + } + return smsPlatform +} +func GetTplId(c *gin.Context, zone, types string) string { + // 校验短信验证码 + tplId := "" + if zone != "86" { + tplId = svc.SysCfgGet(c, "mob_sms_sdk_international_template_id") + } else { + tplId = svc.SysCfgGet(c, "mob_sms_sdk_template_id") + } + if c.GetString("app_type") == "o2o" { + tplId = db.SysCfgGet(c, "biz_mob_sms_sdk_template_id") + } + normal := gjson.Get(tplId, types).String() + if normal == "" { + normal = gjson.Get(tplId, "normal").String() + } + return normal +} +func GetSmsConfig(c *gin.Context, zone string, postData map[string]interface{}) error { + m := db.SysCfgGet(c, "third_app_push_set") + if c.GetString("app_type") == "o2o" { + m = db.SysCfgGet(c, "biz_third_app_push_set") + } + key := gjson.Get(m, "mobAppKey").String() + postData["is_mob"] = "1" + postData["type"] = "mob" + postData["sms_type"] = "putong" + smsPlatform := GetSmsPlatform(c) + if smsPlatform == "ljioe" { + postData["is_mob"] = "0" + postData["type"] = "" + } + token := c.GetHeader("Authorization") + if zone == "" && token != "" { + arkToken, _ := db.UserProfileFindByArkToken(svc.MasterDb(c), token) + if arkToken != nil && arkToken.Uid > 0 { + user, _ := db.UserFindByID(svc.MasterDb(c), arkToken.Uid) + if user != nil && user.Uid > 0 { + zone = user.Zone + } + } + } + if zone == "" { + zone = "86" + } + if zone != "86" { //国际短信 + postData["is_sales"] = "2" + postData["sms_type"] = "international" + } + postData["templateCode"] = GetTplId(c, zone, postData["templateCode"].(string)) + postData["zone"] = zone + if key != "" { + postData["smsmsg_key"] = key + } + if c.GetString("sms_type") == "1" { //新的 + postData["uid"] = c.GetString("mid") + err := sms.SmsSend(db.Db, postData) + if err != nil { + return err + } + return nil + } + fmt.Println("===短信", postData, c.ClientIP()) + sdk, err := NewZhimengSMS(c).SelectFunction("msg_doing").WithSMSArgs(postData).Result() + if err != nil { + msg := gjson.Get(err.Error(), "msg").String() + if msg == "" { + msg = err.Error() + } + fmt.Println("===短信", err) + errs := errors.New(msg) + return errs + } + rmap := sdk.ToInterface().(map[string]interface{}) + fmt.Println("===短信", rmap) + + if rmap["status"] == "" { + return err + } + return nil +} diff --git a/app/lib/weapp/LICENSE b/app/lib/weapp/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/app/lib/weapp/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/app/lib/weapp/Readme.md b/app/lib/weapp/Readme.md new file mode 100644 index 0000000..c0dfa9b --- /dev/null +++ b/app/lib/weapp/Readme.md @@ -0,0 +1,2992 @@ +# ![title](title.png) + +## `注意` ⚠️ + +- [v1 版本入口](https://github.com/medivhzhan/weapp/tree/v1) +- 新版本暂时不包含支付相关内容, 已有很多优秀的支付相关模块; +- 为了保证大家及时用上新功能,已发布 v2 版本,请大家使用经过`线上测试` ✅ 的接口。 +- 未完成的接口将在经过线上测试后在新版本中提供给大家。 +- 大部分接口需要去线上测试。最近一直比较忙,有条件的朋友可以帮忙一起测试,我代表所有使用者谢谢你: ) +- 欢迎大家一起完善 :) + +## 获取代码 + +```sh + +go get -u github.com/medivhzhan/weapp/v2 + +``` + +## `目录` + +> 文档按照[小程序服务端官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/)排版,方便您一一对照查找相关内容。 + +✅: 代表已经通过线上测试 +⚠️: 代表还没有或者未完成 + +- [登录](#登录) + - [code2Session](#code2Session) ✅ +- [用户信息](#用户信息) + - [getPaidUnionId](#getPaidUnionId) ✅ +- [接口调用凭证](#接口调用凭证) + - [getAccessToken](#getAccessToken) ✅ +- [数据分析](#数据分析) + - [访问留存](#访问留存) + - [getDailyRetain](#getDailyRetain) ✅ + - [getWeeklyRetain](#getWeeklyRetain) ✅ + - [getMonthlyRetain](#getMonthlyRetain) ✅ + - [getDailySummary](#getDailySummary) ✅ + - [访问趋势](#访问趋势) + - [getDailyVisitTrend](#getDailyVisitTrend) ✅ + - [getWeeklyVisitTrend](#getWeeklyVisitTrend) ✅ + - [getMonthlyVisitTrend](#getMonthlyVisitTrend) ✅ + - [getUserPortrait](#getUserPortrait) ✅ + - [getVisitDistribution](#getVisitDistribution) ✅ + - [getVisitPage](#getVisitPage) ✅ +- [客服消息](#客服消息) + - [getTempMedia](#getTempMedia) ✅ + - [sendCustomerServiceMessage](#sendCustomerServiceMessage) ✅ + - [setTyping](#setTyping) ✅ + - [uploadTempMedia](#uploadTempMedia) ✅ +- [统一服务消息](#统一服务消息) + - [sendUniformMessage](#sendUniformMessage) ✅ +- [动态消息](#动态消息) + - [createActivityId](#createActivityId) + - [setUpdatableMsg](#setUpdatableMsg) +- [插件管理](#插件管理) + - [applyPlugin](#applyPlugin) + - [getPluginDevApplyList](#getPluginDevApplyList) + - [getPluginList](#getPluginList) + - [setDevPluginApplyStatus](#setDevPluginApplyStatus) + - [unbindPlugin](#unbindPlugin) +- [附近的小程序](#附近的小程序) + - [addNearbyPoi](#addNearbyPoi) + - [deleteNearbyPoi](#deleteNearbyPoi) + - [getNearbyPoiList](#getNearbyPoiList) + - [setNearbyPoiShowStatus](#setNearbyPoiShowStatus) +- [小程序码](#小程序码) ✅ + - [createQRCode](#createQRCode) ✅ + - [get](#get) ✅ + - [getUnlimited](#getUnlimited) ✅ +- [内容安全](#内容安全) + - [imgSecCheck](#imgSecCheck) ✅ + - [mediaCheckAsync](#mediaCheckAsync)✅ + - [msgSecCheck](#msgSecCheck) ✅ +- [图像处理](#图像处理) + - [aiCrop](#aiCrop) ✅ + - [scanQRCode](#scanQRCode) ✅ + - [superResolution](#superResolution) +- [及时配送](#及时配送) ⚠️ + - [小程序使用](#小程序使用) + - [abnormalConfirm](#abnormalConfirm) + - [addDeliveryOrder](#addDeliveryOrder) + - [addDeliveryTip](#addDeliveryTip) + - [cancelDeliveryOrder](#cancelDeliveryOrder) + - [getAllImmediateDelivery](#getAllImmediateDelivery) + - [getBindAccount](#getBindAccount) + - [getDeliveryOrder](#getDeliveryOrder) + - [mockUpdateDeliveryOrder](#mockUpdateDeliveryOrder) + - [onDeliveryOrderStatus](#onDeliveryOrderStatus) + - [preAddDeliveryOrder](#preAddDeliveryOrder) + - [preCancelDeliveryOrder](#preCancelDeliveryOrder) + - [reDeliveryOrder](#reDeliveryOrder) + - [服务提供方使用](#服务提供方使用) + - [updateDeliveryOrder](#updateDeliveryOrder) + - [onAgentPosQuery](#onAgentPosQuery) + - [onAuthInfoGet](#onAuthInfoGet) + - [onCancelAuth](#onCancelAuth) + - [onDeliveryOrderAdd](#onDeliveryOrderAdd) + - [onDeliveryOrderAddTips](#onDeliveryOrderAddTips) + - [onDeliveryOrderCancel](#onDeliveryOrderCancel) + - [onDeliveryOrderConfirmReturn](#onDeliveryOrderConfirmReturn) + - [onDeliveryOrderPreAdd](#onDeliveryOrderPreAdd) + - [onDeliveryOrderPreCancel](#onDeliveryOrderPreCancel) + - [onDeliveryOrderQuery](#onDeliveryOrderQuery) + - [onDeliveryOrderReAdd](#onDeliveryOrderReAdd) + - [onPreAuthCodeGet](#onPreAuthCodeGet) + - [onRiderScoreSet](#onRiderScoreSet) +- [物流助手](#物流助手) ⚠️ + - [小程序使用](#小程序使用) + - [addExpressOrder](#addExpressOrder) + - [cancelExpressOrder](#cancelExpressOrder) + - [getAllDelivery](#getAllDelivery) + - [getExpressOrder](#getExpressOrder) + - [getExpressPath](#getExpressPath) + - [getExpressPrinter](#getExpressPrinter) + - [getExpressQuota](#getExpressQuota) + - [onExpressPathUpdate](#onExpressPathUpdate) + - [testUpdateExpressOrder](#testUpdateExpressOrder) + - [updateExpressPrinter](#updateExpressPrinter) + - [服务提供方使用](#服务提供方使用) + - [getExpressContact](#getExpressContact) + - [onAddExpressOrder](#onAddExpressOrder) + - [onCancelExpressOrder](#onCancelExpressOrder) + - [onCheckExpressBusiness](#onCheckExpressBusiness) + - [onGetExpressQuota](#onGetExpressQuota) + - [previewExpressTemplate](#previewExpressTemplate) + - [updateExpressBusiness](#updateExpressBusiness) + - [updateExpressPath](#updateExpressPath) +- [OCR](#OCR) + - [bankcard](#bankcard) ✅ + - [businessLicense](#businessLicense) ✅ + - [driverLicense](#driverLicense) ✅ + - [idcard](#idcard) ✅ + - [printedText](#printedText) ✅ + - [vehicleLicense](#vehicleLicense) ✅ +- [运维中心](#运维中心) ⚠️ + - [realTimeLogSearch](#realTimeLogSearch) +- [小程序搜索](#小程序搜索) ⚠️ + - [siteSearch](#siteSearch) + - [submitPages](#submitPages) +- [生物认证](#生物认证) + - [verifySignature](#verifySignature) +- [订阅消息](#订阅消息) ✅ + - [addTemplate](#addTemplate) ✅ + - [deleteTemplate](#deleteTemplate) ✅ + - [getCategory](#getCategory) ✅ + - [getPubTemplateKeyWordsById](#getPubTemplateKeyWordsById)✅ + - [getPubTemplateTitleList](#getPubTemplateTitleList) ✅ + - [getTemplateList](#getTemplateList) ✅ + - [sendSubscribeMessage](#sendSubscribeMessage) ✅ +- [解密](#解密) + - [解密手机号码](#解密手机号码) ✅ + - [解密分享内容](#解密分享内容) + - [解密用户信息](#解密用户信息) ✅ + - [解密微信运动](#解密微信运动) +- [人脸识别](#人脸识别) + +--- + +## 登录 + +### code2Session + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.Login("appid", "secret", "code") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 用户信息 + +### getPaidUnionId + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/user-info/auth.getPaidUnionId.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetPaidUnionID("access-token", "open-id", "transaction-id") +// 或者 +res, err := weapp.GetPaidUnionIDWithMCH("access-token", "open-id", "out-trade-number", "mch-id") + +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 接口调用凭证 + +### getAccessToken + +> 调用次数有限制 请注意缓存 + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetAccessToken("appid", "secret") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 数据分析 + +### 访问留存 + +#### getDailyRetain + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/visit-retain/analysis.getDailyRetain.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetDailyRetain("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getWeeklyRetain + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/visit-retain/analysis.getWeeklyRetain.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetWeeklyRetain("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getMonthlyRetain + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/visit-retain/analysis.getMonthlyRetain.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetMonthlyRetain("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### getDailySummary + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/analysis.getDailySummary.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetDailySummary("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### 访问趋势 + +#### getDailyVisitTrend + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/visit-trend/analysis.getDailyVisitTrend.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetDailyVisitTrend("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getWeeklyVisitTrend + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/visit-trend/analysis.getWeeklyVisitTrend.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetWeeklyVisitTrend("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getMonthlyVisitTrend + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/visit-trend/analysis.getMonthlyVisitTrend.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetMonthlyVisitTrend("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### getUserPortrait + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/analysis.getUserPortrait.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetUserPortrait("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### getVisitDistribution + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/analysis.getVisitDistribution.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetVisitDistribution("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### getVisitPage + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/data-analysis/analysis.getVisitPage.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetVisitPage("access-token", "begin-date", "end-date") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 客服消息 + +### getTempMedia + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/customer-message/customerServiceMessage.getTempMedia.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +resp, res, err := weapp.GetTempMedia("access-token", "media-id") +if err != nil { + // 处理一般错误信息 + return +} +defer resp.Close() + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### sendCustomerServiceMessage + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/customer-message/customerServiceMessage.send.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +// 接收并处理异步结果 +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +// 文本消息 +srv.OnCustomerServiceTextMessage(func(msg *weapp.TextMessageResult) *weapp.TransferCustomerMessage { + + reply := weapp.CSMsgText{ + Content: "content", + } + + res, err := reply.SendTo("open-id", "access-token") + if err != nil { + // 处理一般错误信息 + return nil + } + + if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return nil + } + + return nil +}) + +// 图片消息 +srv.OnCustomerServiceImageMessage(func(msg *weapp.TextMessageResult) *weapp.TransferCustomerMessage { + + reply := weapp.CSMsgImage{ + MediaID: "media-id", + } + + res, err := reply.SendTo("open-id", "access-token") + if err != nil { + // 处理一般错误信息 + return nil + } + + if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return nil + } + + return nil +}) + +// 小程序卡片消息 +srv.OnCustomerServiceCardMessage(func(msg *weapp.TextMessageResult) *weapp.TransferCustomerMessage { + + reply := weapp.CSMsgMPCard{ + Title: "title", + PagePath: "page-path", + ThumbMediaID: "thumb-media-id", + } + res, err := reply.SendTo("open-id", "access-token") + if err != nil { + // 处理一般错误信息 + return nil + } + + if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return nil + } + + return nil +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +### setTyping + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/customer-message/customerServiceMessage.setTyping.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.SetTyping("access-token", "open-id", weapp.SetTypingCommandTyping) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### uploadTempMedia + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/customer-message/customerServiceMessage.uploadTempMedia.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.UploadTempMedia("access-token", weapp.TempMediaTypeImage, "media-filename") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 统一服务消息 + +### sendUniformMessage + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/uniform-message/uniformMessage.send.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +sender := weapp.UniformMsgSender{ + ToUser: "open-id", + UniformWeappTmpMsg: weapp.UniformWeappTmpMsg{ + TemplateID: "template-id", + Page: "page", + FormID: "form-id", + Data: weapp.UniformMsgData{ + "keyword": {Value: "value"}, + }, + EmphasisKeyword: "keyword.DATA", + }, + UniformMpTmpMsg: weapp.UniformMpTmpMsg{ + AppID: "app-id", + TemplateID: "template-id", + URL: "url", + Miniprogram: weapp.UniformMsgMiniprogram{"miniprogram-app-id", "page-path"}, + Data: weapp.UniformMsgData{ + "keyword": {"value", "color"}, + }, + }, +} + +res, err := sender.Send("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 动态消息 + +### createActivityId + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/updatable-message/updatableMessage.createActivityId.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.CreateActivityId("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### setUpdatableMsg + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/updatable-message/updatableMessage.setUpdatableMsg.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + + +setter := weapp.UpdatableMsgSetter{ + "activity-id", + UpdatableMsgJoining, + UpdatableMsgTempInfo{ + []UpdatableMsgParameter{ + {UpdatableMsgParamMemberCount, "parameter-value-number"}, + {UpdatableMsgParamRoomLimit, "parameter-value-number"}, + }, + }, +} + +res, err := setter.Set("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 插件管理 + +### applyPlugin + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/plugin-management/pluginManager.applyPlugin.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.ApplyPlugin("access-token", "plugin-app-id", "reason") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### getPluginDevApplyList + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/plugin-management/pluginManager.getPluginDevApplyList.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetPluginDevApplyList("access-token", 1, 2) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### getPluginList + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/plugin-management/pluginManager.getPluginList.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetPluginList("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### setDevPluginApplyStatus + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/plugin-management/pluginManager.setDevPluginApplyStatus.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.SetDevPluginApplyStatus("access-token", "plugin-app-id", "reason", weapp.DevAgree) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### unbindPlugin + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/plugin-management/pluginManager.unbindPlugin.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.UnbindPlugin("access-token", "plugin-app-id") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 附近的小程序 + +### addNearbyPoi + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/nearby-poi/nearbyPoi.add.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +poi := NearbyPoi{ + PicList: PicList{[]string{"first-picture-url", "second-picture-url", "third-picture-url"}}, + ServiceInfos: weapp.ServiceInfos{[]weapp.ServiceInfo{ + {1, 1, "name", "app-id", "path"}, + }}, + StoreName: "store-name", + Hour: "11:11-12:12", + Credential: "credential", + Address: "address", // 地址 必填 + CompanyName: "company-name", // 主体名字 必填 + QualificationList: "qualification-list", // 证明材料 必填 如果company_name和该小程序主体不一致,需要填qualification_list,详细规则见附近的小程序使用指南-如何证明门店的经营主体跟公众号或小程序帐号主体相关http://kf.qq.com/faq/170401MbUnim17040122m2qY.html + KFInfo: weapp.KFInfo{true, "kf-head-img", "kf-name"}, // 客服信息 选填,可自定义服务头像与昵称,具体填写字段见下方示例kf_info pic_list是字符串,内容是一个json! + PoiID: "poi-id", // 如果创建新的门店,poi_id字段为空 如果更新门店,poi_id参数则填对应门店的poi_id 选填 +} + +res, err := poi.Add("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnAddNearbyPoi(func(mix *weapp.AddNearbyPoiResult) { + // 处理返回结果 +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +### deleteNearbyPoi + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/nearby-poi/nearbyPoi.delete.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.DeleteNearbyPoi("access-token", "poi-id") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### getNearbyPoiList + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/nearby-poi/nearbyPoi.getList.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetNearbyPoiList("access-token", 1, 10) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### setNearbyPoiShowStatus + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/nearby-poi/nearbyPoi.setShowStatus.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.SetNearbyPoiShowStatus("access-token", "poi-id", weapp.ShowNearbyPoi) +// 或者 +res, err := weapp.SetNearbyPoiShowStatus("access-token", "poi-id", weapp.HideNearbyPoi) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 小程序码 + +### createQRCode + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.createQRCode.html) + +```go + +import ( + "ioutil" + "github.com/medivhzhan/weapp/v2" +) + + +creator := weapp.QRCodeCreator{ + Path: "mock/path", + Width: 430, +} + +resp, res, err := creator.Create("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +defer resp.Body.Close() + +content, err := ioutil.ReadAll(resp.Body) +// 处理图片内容 + +``` + +### get + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.get.html) + +```go + +import ( + "ioutil" + "github.com/medivhzhan/weapp/v2" +) + + +getter := weapp.QRCode{ + Path: "mock/path", + Width: 430, + AutoColor: true, + LineColor: weapp.Color{"r", "g", "b"}, + IsHyaline: true, +} + +resp, res, err := getter.Get("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +defer resp.Body.Close() + +content, err := ioutil.ReadAll(resp.Body) +// 处理图片内容 + +``` + +### getUnlimited + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html) + +```go + +import ( + "ioutil" + "github.com/medivhzhan/weapp/v2" +) + + +getter := weapp.UnlimitedQRCode{ + Scene: "scene-data", + Page: "mock/page", + Width: 430, + AutoColor: true, + LineColor: weapp.Color{"r", "g", "b"}, + IsHyaline: true, +} + +resp, res, err := getter.Get("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +defer resp.Body.Close() + +content, err := ioutil.ReadAll(resp.Body) +// 处理图片内容 + +``` + +--- + +## 内容安全 + +### imgSecCheck + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.imgSecCheck.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.IMGSecCheck("access-token", "local-filename") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### mediaCheckAsync + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.mediaCheckAsync.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.MediaCheckAsync("access-token", "image-url", weapp.MediaTypeImage) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +// 接收并处理异步结果 +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnMediaCheckAsync(func(mix *weapp.MediaCheckAsyncResult) { + // 处理返回结果 +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +### msgSecCheck + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.msgSecCheck.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.MSGSecCheck("access-token", "message-content") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 图像处理 + +### aiCrop + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/img/img.aiCrop.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.AICrop("access-token", "filename") +// 或者 +res, err := weapp.AICropByURL("access-token", "url") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### scanQRCode + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/img/img.scanQRCode.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.ScanQRCode("access-token", "file-path") +// 或者 +res, err := weapp.ScanQRCodeByURL("access-token", "qr-code-url") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### superResolution + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/img/img.superresolution.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.SuperResolution("access-token", "file-path") +// 或者 +res, err := weapp.SuperResolutionByURL("access-token", "img-url") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 及时配送 + +### 服务提供方使用 + +#### updateDeliveryOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.updateOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +mocker := weapp.DeliveryOrderUpdater{ + // ... +} + +res, err := mocker.Update("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### onAgentPosQuery + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onAgentPosQuery.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnAgentPosQuery(func(mix *weapp.AgentPosQueryResult) *weapp.AgentPosQueryReturn { + // 处理返回结果 + + return &weapp.AgentPosQueryReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onAuthInfoGet + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onAuthInfoGet.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnAuthInfoGet(func(mix *weapp.AuthInfoGetResult) *weapp.AuthInfoGetReturn { + // 处理返回结果 + + return &weapp.AuthInfoGetReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onCancelAuth + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onCancelAuth.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnCancelAuth(func(mix *weapp.CancelAuthResult) *weapp.CancelAuthReturn { + // 处理返回结果 + + return &weapp.CancelAuthReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onDeliveryOrderAdd + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onOrderAdd.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderAdd(func(mix *weapp.DeliveryOrderAddResult) *weapp.DeliveryOrderAddReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderAddReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onDeliveryOrderAddTips + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onOrderAddTips.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderAddTips(func(mix *weapp.DeliveryOrderAddTipsResult) *weapp.DeliveryOrderAddTipsReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderAddTipsReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onDeliveryOrderCancel + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onOrderCancel.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderCancel(func(mix *weapp.DeliveryOrderCancelResult) *weapp.DeliveryOrderCancelReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderCancelReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onDeliveryOrderConfirmReturn + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onOrderConfirmReturn.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderReturnConfirm(func(mix *weapp.DeliveryOrderReturnConfirmResult) *weapp.DeliveryOrderReturnConfirmReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderReturnConfirmReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onDeliveryOrderPreAdd + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onOrderPreAdd.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderPreAdd(func(mix *weapp.DeliveryOrderPreAddResult) *weapp.DeliveryOrderPreAddReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderPreAddReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onDeliveryOrderPreCancel + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onOrderPreCancel.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderPreCancel(func(mix *weapp.DeliveryOrderPreCancelResult) *weapp.DeliveryOrderPreCancelReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderPreCancelReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onDeliveryOrderQuery + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onOrderQuery.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderQuery(func(mix *weapp.DeliveryOrderQueryResult) *weapp.DeliveryOrderQueryReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderQueryReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onDeliveryOrderReAdd + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onOrderReAdd.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderReadd(func(mix *weapp.DeliveryOrderReaddResult) *weapp.DeliveryOrderReaddReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderReaddReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onPreAuthCodeGet + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onPreAuthCodeGet.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnPreAuthCodeGet(func(mix *weapp.PreAuthCodeGetResult) *weapp.PreAuthCodeGetReturn { + // 处理返回结果 + + return &weapp.PreAuthCodeGetReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onRiderScoreSet + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-provider/immediateDelivery.onRiderScoreSet.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnRiderScoreSet(func(mix *weapp.RiderScoreSetResult) *weapp.RiderScoreSetReturn { + // 处理返回结果 + + return &weapp.PreAuthCodeGetReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +### 小程序使用 + +#### abnormalConfirm + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.abnormalConfirm.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +confirmer := weapp.AbnormalConfirmer{ + ShopID: "123456", + ShopOrderID: "123456", + ShopNo: "shop_no_111", + WaybillID: "123456", + Remark: "remark", + DeliverySign: "123456", +} + +res, err := confirmer.Confirm("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### addDeliveryOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.addOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +creator := weapp.DeliveryOrderCreator{ + // ... +} + +res, err := creator.Create("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### addDeliveryTip + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.addTip.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +adder := weapp.DeliveryTipAdder{ + // ... +} + +res, err := adder.Add("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### cancelDeliveryOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.cancelOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +canceler := weapp.DeliveryOrderCanceler{ + // ... +} + +res, err := canceler.Cancel("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getAllImmediateDelivery + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.getAllImmeDelivery.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetAllImmediateDelivery("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getBindAccount + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.getBindAccount.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetBindAccount("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getDeliveryOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.getOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +getter := weapp.DeliveryOrderGetter{ + // ... +} + +res, err := getter.Get("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### mockUpdateDeliveryOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.mockUpdateOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +mocker := weapp.UpdateDeliveryOrderMocker{ + // ... +} + +res, err := mocker.Mock("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### onDeliveryOrderStatus + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.onOrderStatus.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnDeliveryOrderStatusUpdate(func(mix *weapp.DeliveryOrderStatusUpdateResult) *weapp.DeliveryOrderStatusUpdateReturn { + // 处理返回结果 + + return &weapp.DeliveryOrderStatusUpdateReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### preAddDeliveryOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.preAddOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +creator := weapp.DeliveryOrderCreator{ + // ... +} + +res, err := creator.Prepare("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### preCancelDeliveryOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.preCancelOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +canceler := weapp.DeliveryOrderCanceler{ + // ... +} + +res, err := canceler.Prepare("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### reDeliveryOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/immediate-delivery/by-business/immediateDelivery.reOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +creator := weapp.DeliveryOrderCreator{ + // ... +} + +res, err := creator.Recreate("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 物流助手 + +### 小程序使用 + +#### addExpressOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.addOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +creator := weapp.ExpressOrderCreator{ + // ... +} + +res, err := creator.Create("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### cancelExpressOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.cancelOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +canceler := weapp.ExpressOrderCanceler{ + // ... +} + +res, err := canceler.cancel("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getAllDelivery + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.getAllDelivery.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.getAllDelivery("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getExpressOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.getOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +getter := weapp.ExpressOrderGetter{ + // ... +} + +res, err := getter.Get("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getExpressPath + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.getPath.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +getter := weapp.ExpressPathGetter{ + // ... +} + +res, err := getter.Get("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getExpressPrinter + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.getPrinter.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetPrinter("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### getExpressQuota + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.getQuota.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +getter := weapp.QuotaGetter{ + // ... +} + +res, err := getter.Get("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### onExpressPathUpdate + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.onPathUpdate.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnExpressPathUpdate(func(mix *weapp.ExpressPathUpdateResult) { + // 处理返回结果 +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### testUpdateExpressOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.testUpdateOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +tester := weapp.UpdateExpressOrderTester{ + // ... +} + +res, err := tester.Test("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### updateExpressPrinter + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-business/logistics.updatePrinter.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +updater := weapp.PrinterUpdater{ + // ... +} + +res, err := updater.Update("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### 服务提供方使用 + +#### getExpressContact + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-provider/logistics.getContact.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.GetContact("access-token", "token", "wat-bill-id") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### onAddExpressOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-provider/logistics.onAddOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnAddExpressOrder(func(mix *weapp.AddExpressOrderResult) *weapp.AddExpressOrderReturn { + // 处理返回结果 + + return &weapp.AddExpressOrderReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onCancelExpressOrder + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-provider/logistics.onCancelOrder.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnCancelExpressOrder(func(mix *weapp.CancelExpressOrderResult) *weapp.CancelExpressOrderReturn { + // 处理返回结果 + + return &weapp.CancelExpressOrderReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onCheckExpressBusiness + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-provider/logistics.onCheckBusiness.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnCheckExpressBusiness(func(mix *weapp.CheckExpressBusinessResult) *weapp.CheckExpressBusinessReturn { + // 处理返回结果 + + return &weapp.CheckExpressBusinessReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### onGetExpressQuota + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-provider/logistics.onGetQuota.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +srv, err := weapp.NewServer("app-id", "token", "aes-key", "mch-id", "api-key", true) +if err != nil { + // 处理微信返回错误信息 + return +} + +srv.OnGetExpressQuota(func(mix *weapp.GetExpressQuotaResult) *weapp.GetExpressQuotaReturn { + // 处理返回结果 + + return &weapp.GetExpressQuotaReturn{ + // ... + } +}) + +if err := srv.Serve(http.ResponseWriter, *http.Request); err != nil { + // 处理微信返回错误信息 + return +} + +``` + +#### previewExpressTemplate + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-provider/logistics.previewTemplate.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +previewer := weapp.ExpressTemplatePreviewer{ + // ... +} + +res, err := previewer.Preview("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### updateExpressBusiness + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-provider/logistics.updateBusiness.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +updater := weapp.BusinessUpdater{ + // ... +} + +res, err := updater.Update("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +#### updateExpressPath + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/express/by-provider/logistics.updatePath.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +updater := weapp.ExpressPathUpdater{ + // ... +} + +res, err := updater.Update("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## OCR + +### bankcard + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/ocr/ocr.bankcard.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.BankCard("access-token", "file-path", weapp.RecognizeModeScan) +// 或者 +res, err := weapp.BankCardByURL("access-token", "card-url", weapp.RecognizeModePhoto) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### businessLicense + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/ocr/ocr.businessLicense.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.BusinessLicense("access-token", "file-path") +// 或者 +res, err := weapp.BusinessLicenseByURL("access-token", "card-url") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### driverLicense + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/ocr/ocr.driverLicense.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.DriverLicense("access-token", "file-path") +// 或者 +res, err := weapp.DriverLicenseByURL("access-token", "card-url") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### idcard + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/ocr/ocr.idcard.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.IDCardByURL("access-token", "card-url", weapp.RecognizeModePhoto) +// 或者 +res, err := weapp.IDCard("access-token", "file-path", weapp.RecognizeModeScan) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### printedText + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/ocr/ocr.printedText.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.PrintedText("access-token", "file-path") +// 或者 +res, err := weapp.PrintedTextByURL("access-token", "card-url") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +### vehicleLicense + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/ocr/ocr.vehicleLicense.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.VehicleLicense("access-token", "file-path", weapp.RecognizeModeScan) +// 或者 +res, err := weapp.VehicleLicenseByURL("access-token", "card-url", weapp.RecognizeModePhoto) +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 小程序搜索 + +### siteSearch + +### submitPages + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/search/search.submitPages.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +sender := weapp.SearchSubmitPages{ + []weapp.SearchSubmitPage{ + { + Path: "pages/index/index", + Query: "id=test", + }, + }, +} + +res, err := sender.Send("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 生物认证 + +### verifySignature + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/soter/soter.verifySignature.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.VerifySignature("access-token", "open-id", "data", "signature") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 订阅消息 + +### addTemplate + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html) + +```go +import "github.com/medivhzhan/weapp/v2" + +// AddTemplate 组合模板并添加至帐号下的个人模板库 +// +// token 微信 access_token +// tid 模板ID +// desc 服务场景描述,15个字以内 +// keywordIDList 关键词 ID 列表 +res, err := weapp.AddTemplate("access_token", "tid", "desc", []int32{1, 2, 3}) +if err != nil { + // 处理一般错误信息 + return +} +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +fmt.Printf("返回结果: %#v", res) +``` + +### deleteTemplate + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.deleteTemplate.html) + +```go +import "github.com/medivhzhan/weapp/v2" + +// DeleteTemplate 删除帐号下的某个模板 +// +// token 微信 access_token +// pid 模板ID +res, err := weapp.DeleteTemplate("access_token", "pid") +if err != nil { + // 处理一般错误信息 + return +} +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +fmt.Printf("返回结果: %#v", res) +``` + +### getCategory + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getCategory.html) + +```go +import "github.com/medivhzhan/weapp/v2" + +// GetTemplateCategory 删除帐号下的某个模板 +// +// token 微信 access_token +res, err := weapp.GetTemplateCategory("access_token") +if err != nil { + // 处理一般错误信息 + return +} +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +fmt.Printf("返回结果: %#v", res) +``` + +### getPubTemplateKeyWordsById + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getPubTemplateKeyWordsById.html) + +```go +import "github.com/medivhzhan/weapp/v2" + +// GetPubTemplateKeyWordsById 获取模板标题下的关键词列表 +// +// token 微信 access_token +// tid 模板ID +res, err := weapp.GetPubTemplateKeyWordsById("access_token", "tid") +if err != nil { + // 处理一般错误信息 + return +} +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +fmt.Printf("返回结果: %#v", res) +``` + +### getPubTemplateTitleList + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getPubTemplateTitleList.html) + +```go +import "github.com/medivhzhan/weapp/v2" + +// GetPubTemplateTitleList 获取帐号所属类目下的公共模板标题 +// +// token 微信 access_token +// ids 类目 id,多个用逗号隔开 +// start 用于分页,表示从 start 开始。从 0 开始计数。 +// limit 用于分页,表示拉取 limit 条记录。最大为 30 +res, err := weapp.GetPubTemplateTitleList("access_token", "1,2,3", 0, 10) +if err != nil { + // 处理一般错误信息 + return +} +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +fmt.Printf("返回结果: %#v", res) +``` + +### getTemplateList + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getTemplateList.html) + +```go +import "github.com/medivhzhan/weapp/v2" + +// GetTemplateList 获取帐号下已存在的模板列表 +// +// token 微信 access_token +res, err := weapp.GetTemplateList("access_token") +if err != nil { + // 处理一般错误信息 + return +} +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +fmt.Printf("返回结果: %#v", res) +``` + +### sendSubscribeMessage + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html) + +```go + +import "github.com/medivhzhan/weapp/v2" + +sender := weapp.SubscribeMessage{ + ToUser: mpOpenID, + TemplateID: "template-id", + Page: "mock/page/path", + MiniprogramState: weapp.MiniprogramStateDeveloper, // 或者: "developer" + Data: weapp.SubscribeMessageData{ + "first-key": { + Value: "value", + }, + "second-key": { + Value: "value", + }, + }, +} + +res, err := sender.Send("access-token") +if err != nil { + // 处理一般错误信息 + return +} + +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) + +``` + +--- + +## 解密 + +[官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html) + +> ⚠️ 前端应当先完成[登录](#登录)流程再调用获取加密数据的相关接口。 + +### 解密手机号码 + +```go +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.DecryptMobile("session-key", "encrypted-data", "iv" ) +if err != nil { + // 处理一般错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) +``` + +### 解密分享内容 + +```go +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.DecryptShareInfo("session-key", "encrypted-data", "iv" ) +if err != nil { + // 处理一般错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) +``` + +### 解密用户信息 + +```go +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.DecryptUserInfo( "session-key", "raw-data", "encrypted-data", "signature", "iv") +if err != nil { + // 处理一般错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) +``` + +### 解密微信运动 + +```go +import "github.com/medivhzhan/weapp/v2" + +res, err := weapp.DecryptRunData("session-key", "encrypted-data", "iv" ) +if err != nil { + // 处理一般错误信息 + return +} + +fmt.Printf("返回结果: %#v", res) +``` + +--- + +## 人脸识别 + +```go +import "github.com/medivhzhan/weapp/v2" + +// FaceIdentify 获取人脸识别结果 +// +// token 微信 access_token +// key 小程序 verify_result +res, err := weapp.FaceIdentify("access_token", "verify_result") +if err != nil { + // 处理一般错误信息 + return +} +if err := res.GetResponseError(); err !=nil { + // 处理微信返回错误信息 + return +} +fmt.Printf("返回结果: %#v", res) +``` + +--- diff --git a/app/lib/weapp/analysis.go b/app/lib/weapp/analysis.go new file mode 100644 index 0000000..9dca262 --- /dev/null +++ b/app/lib/weapp/analysis.go @@ -0,0 +1,211 @@ +package weapp + +type dateRange struct { + BeginDate string `json:"begin_date"` + EndDate string `json:"end_date"` +} + +const ( + apiGetUserPortrait = "/datacube/getweanalysisappiduserportrait" + apiGetVisitDistribution = "/datacube/getweanalysisappidvisitdistribution" + apiGetVisitPage = "/datacube/getweanalysisappidvisitpage" + apiGetDailySummary = "/datacube/getweanalysisappiddailysummarytrend" +) + +// UserPortrait response data of get user portrait +type UserPortrait struct { + CommonError + RefDate string `json:"ref_date"` + VisitUV Portrait `json:"visit_uv"` // 活跃用户画像 + VisitUVNew Portrait `json:"visit_uv_new"` // 新用户画像 +} + +// Portrait 肖像 +type Portrait struct { + Index uint `json:"index"` // 分布类型 + Province []Attribute `json:"province"` // 省份,如北京、广东等 + City []Attribute `json:"city"` // 城市,如北京、广州等 + Genders []Attribute `json:"genders"` // 性别,包括男、女、未知 + Platforms []Attribute `json:"platforms"` // 终端类型,包括 iPhone,android,其他 + Devices []Attribute `json:"devices"` // 机型,如苹果 iPhone 6,OPPO R9 等 + Ages []Attribute `json:"ages"` // 年龄,包括17岁以下、18-24岁等区间 +} + +// Attribute 描述内容 +type Attribute struct { + ID uint `json:"id"` // 属性值id + Name string `json:"name"` // 属性值名称,与id对应。如属性为 province 时,返回的属性值名称包括「广东」等。 + Value uint `json:"value"` + // TODO: 确认后删除该字段 + AccessSourceVisitUV uint `json:"access_source_visit_uv"` // 该场景访问uv +} + +// GetUserPortrait 获取小程序新增或活跃用户的画像分布数据。 +// 时间范围支持昨天、最近7天、最近30天。 +// 其中,新增用户数为时间范围内首次访问小程序的去重用户数,活跃用户数为时间范围内访问过小程序的去重用户数。 +// begin 开始日期。格式为 yyyymmdd +// end 结束日期,开始日期与结束日期相差的天数限定为0/6/29,分别表示查询最近1/7/30天数据,允许设置的最大值为昨日。格式为 yyyymmdd +func GetUserPortrait(accessToken, begin, end string) (*UserPortrait, error) { + api := baseURL + apiGetUserPortrait + return getUserPortrait(accessToken, begin, end, api) +} + +func getUserPortrait(accessToken, begin, end, api string) (*UserPortrait, error) { + api, err := tokenAPI(api, accessToken) + if err != nil { + return nil, err + } + + params := dateRange{ + BeginDate: begin, + EndDate: end, + } + + res := new(UserPortrait) + if err := postJSON(api, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// VisitDistribution 用户小程序访问分布数据 +type VisitDistribution struct { + CommonError + RefDate string `json:"ref_date"` + List []Distribution `json:"list"` +} + +// Distribution 分布数据 +type Distribution struct { + // 分布类型 + // index 的合法值 + // access_source_session_cnt 访问来源分布 + // access_staytime_info 访问时长分布 + // access_depth_info 访问深度的分布 + Index string `json:"index"` + ItemList []DistributionItem `json:"item_list"` // 分布数据列表 +} + +// DistributionItem 分布数据项 +type DistributionItem struct { + Key uint `json:"key"` // 场景 id,定义在各个 index 下不同,具体参见下方表格 + Value uint `json:"value"` // 该场景 id 访问 pv + // TODO: 确认后删除该字段 + AccessSourceVisitUV uint `json:"access_source_visit_uv"` // 该场景 id 访问 uv +} + +// GetVisitDistribution 获取用户小程序访问分布数据 +// begin 开始日期。格式为 yyyymmdd +// end 结束日期,限定查询 1 天数据,允许设置的最大值为昨日。格式为 yyyymmdd +func GetVisitDistribution(accessToken, begin, end string) (*VisitDistribution, error) { + api := baseURL + apiGetVisitDistribution + return getVisitDistribution(accessToken, begin, end, api) +} + +func getVisitDistribution(accessToken, begin, end, api string) (*VisitDistribution, error) { + url, err := tokenAPI(api, accessToken) + if err != nil { + return nil, err + } + + params := dateRange{ + BeginDate: begin, + EndDate: end, + } + + res := new(VisitDistribution) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// VisitPage 页面访问数据 +type VisitPage struct { + CommonError + RefDate string `json:"ref_date"` + List []Page `json:"list"` +} + +// Page 页面 +type Page struct { + PagePath string `json:"Page_path"` // 页面路径 + PageVisitPV uint `json:"Page_visit_pv"` // 访问次数 + PageVisitUV uint `json:"Page_visit_uv"` // 访问人数 + PageStaytimePV float64 `json:"page_staytime_pv"` // 次均停留时长 + EntrypagePV uint `json:"entrypage_pv"` // 进入页次数 + ExitpagePV uint `json:"exitpage_pv"` // 退出页次数 + PageSharePV uint `json:"page_share_pv"` // 转发次数 + PageShareUV uint `json:"page_share_uv"` // 转发人数 + +} + +// GetVisitPage 访问页面。 +// 目前只提供按 page_visit_pv 排序的 top200。 +// begin 开始日期。格式为 yyyymmdd +// end 结束日期,限定查询1天数据,允许设置的最大值为昨日。格式为 yyyymmdd +func GetVisitPage(accessToken, begin, end string) (*VisitPage, error) { + api := baseURL + apiGetVisitPage + return getVisitPage(accessToken, begin, end, api) +} + +func getVisitPage(accessToken, begin, end, api string) (*VisitPage, error) { + url, err := tokenAPI(api, accessToken) + if err != nil { + return nil, err + } + + params := dateRange{ + BeginDate: begin, + EndDate: end, + } + + res := new(VisitPage) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// DailySummary 用户访问小程序数据概况 +type DailySummary struct { + CommonError + List []Summary `json:"list"` +} + +// Summary 概况 +type Summary struct { + RefDate string `json:"ref_date"` // 日期,格式为 yyyymmdd + VisitTotal uint `json:"visit_total"` // 累计用户数 + SharePV uint `json:"share_pv"` // 转发次数 + ShareUV uint `json:"share_uv"` // 转发人数 +} + +// GetDailySummary 获取用户访问小程序数据概况 +// begin 开始日期。格式为 yyyymmdd +// end 结束日期,限定查询1天数据,允许设置的最大值为昨日。格式为 yyyymmdd +func GetDailySummary(accessToken, begin, end string) (*DailySummary, error) { + api := baseURL + apiGetDailySummary + return getDailySummary(accessToken, begin, end, api) +} +func getDailySummary(accessToken, begin, end, api string) (*DailySummary, error) { + url, err := tokenAPI(api, accessToken) + if err != nil { + return nil, err + } + + params := dateRange{ + BeginDate: begin, + EndDate: end, + } + + res := new(DailySummary) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/analysis_retain.go b/app/lib/weapp/analysis_retain.go new file mode 100644 index 0000000..d758487 --- /dev/null +++ b/app/lib/weapp/analysis_retain.go @@ -0,0 +1,67 @@ +package weapp + +const ( + apiGetMonthlyRetain = "/datacube/getweanalysisappidmonthlyretaininfo" + apiGetWeeklyRetain = "/datacube/getweanalysisappidweeklyretaininfo" + apiGetDailyRetain = "/datacube/getweanalysisappiddailyretaininfo" +) + +// Retain 用户留存 +type Retain struct { + Key uint8 `json:"key"` // 标识,0开始,表示当月,1表示1月后。key取值分别是:0,1 + Value uint `json:"value"` // key对应日期的新增用户数/活跃用户数(key=0时)或留存用户数(k>0时) +} + +// RetainResponse 生物认证秘钥签名验证请求返回数据 +type RetainResponse struct { + CommonError + RefDate string `json:"ref_date"` // 时间,月格式为 yyyymm | 周格式为 yyyymmdd-yyyymmdd | 天格式为 yyyymmdd + VisitUV []Retain `json:"visit_uv"` // 活跃用户留存 + VisitUVNew []Retain `json:"visit_uv_new"` // 新增用户留存 +} + +// GetMonthlyRetain 获取用户访问小程序月留存 +// accessToken 接口调用凭证 +// begin 开始日期,为自然月第一天。格式为 yyyymmdd +// end 结束日期,为自然月最后一天,限定查询一个月数据。格式为 yyyymmdd +func GetMonthlyRetain(accessToken, begin, end string) (*RetainResponse, error) { + api := baseURL + apiGetMonthlyRetain + return getRetain(accessToken, begin, end, api) +} + +// GetWeeklyRetain 获取用户访问小程序周留存 +// accessToken 接口调用凭证 +// begin 开始日期,为自然月第一天。格式为 yyyymmdd +// end 结束日期,为周日日期,限定查询一周数据。格式为 yyyymmdd +func GetWeeklyRetain(accessToken, begin, end string) (*RetainResponse, error) { + api := baseURL + apiGetWeeklyRetain + return getRetain(accessToken, begin, end, api) +} + +// GetDailyRetain 获取用户访问小程序日留存 +// accessToken 接口调用凭证 +// begin 开始日期,为自然月第一天。格式为 yyyymmdd +// end 结束日期,限定查询1天数据,允许设置的最大值为昨日。格式为 yyyymmdd +func GetDailyRetain(accessToken, begin, end string) (*RetainResponse, error) { + api := baseURL + apiGetDailyRetain + return getRetain(accessToken, begin, end, api) +} + +func getRetain(accessToken, begin, end, api string) (*RetainResponse, error) { + url, err := tokenAPI(api, accessToken) + if err != nil { + return nil, err + } + + params := dateRange{ + BeginDate: begin, + EndDate: end, + } + + res := new(RetainResponse) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/analysis_retain_test.go b/app/lib/weapp/analysis_retain_test.go new file mode 100644 index 0000000..f0fa02a --- /dev/null +++ b/app/lib/weapp/analysis_retain_test.go @@ -0,0 +1,208 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestGetMonthlyRetain(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetMonthlyRetain { + t.Fatalf("Except to path '%s',get '%s'", apiGetMonthlyRetain, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "ref_date": "201702", + "visit_uv_new": [ + { + "key": 0, + "value": 346249 + } + ], + "visit_uv": [ + { + "key": 0, + "value": 346249 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getRetain("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetMonthlyRetain) + if err != nil { + t.Fatal(err) + } +} + +func TestGetWeeklyRetain(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetWeeklyRetain { + t.Fatalf("Except to path '%s',get '%s'", apiGetWeeklyRetain, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "ref_date": "20170306-20170312", + "visit_uv_new": [ + { + "key": 0, + "value": 0 + }, + { + "key": 1, + "value": 16853 + } + ], + "visit_uv": [ + { + "key": 0, + "value": 0 + }, + { + "key": 1, + "value": 99310 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getRetain("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetWeeklyRetain) + if err != nil { + t.Fatal(err) + } +} + +func TestGetDailyRetain(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetDailyRetain { + t.Fatalf("Except to path '%s',get '%s'", apiGetDailyRetain, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "ref_date": "20170313", + "visit_uv_new": [ + { + "key": 0, + "value": 5464 + } + ], + "visit_uv": [ + { + "key": 0, + "value": 55500 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getRetain("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetDailyRetain) + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/analysis_test.go b/app/lib/weapp/analysis_test.go new file mode 100644 index 0000000..3447afa --- /dev/null +++ b/app/lib/weapp/analysis_test.go @@ -0,0 +1,466 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestGetUserPortrait(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetUserPortrait { + t.Fatalf("Except to path '%s',get '%s'", apiGetUserPortrait, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "ref_date": "20170611", + "visit_uv_new": { + "province": [ + { + "id": 31, + "name": "广东省", + "value": 215 + } + ], + "city": [ + { + "id": 3102, + "name": "广州", + "value": 78 + } + ], + "genders": [ + { + "id": 1, + "name": "男", + "value": 2146 + } + ], + "platforms": [ + { + "id": 1, + "name": "iPhone", + "value": 27642 + } + ], + "devices": [ + { + "name": "OPPO R9", + "value": 61 + } + ], + "ages": [ + { + "id": 1, + "name": "17岁以下", + "value": 151 + } + ] + }, + "visit_uv": { + "province": [ + { + "id": 31, + "name": "广东省", + "value": 1341 + } + ], + "city": [ + { + "id": 3102, + "name": "广州", + "value": 234 + } + ], + "genders": [ + { + "id": 1, + "name": "男", + "value": 14534 + } + ], + "platforms": [ + { + "id": 1, + "name": "iPhone", + "value": 21750 + } + ], + "devices": [ + { + "name": "OPPO R9", + "value": 617 + } + ], + "ages": [ + { + "id": 1, + "name": "17岁以下", + "value": 3156 + } + ] + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getUserPortrait("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetUserPortrait) + if err != nil { + t.Fatal(err) + } +} + +func TestGetVisitDistribution(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetVisitDistribution { + t.Fatalf("Except to path '%s',get '%s'", apiGetVisitDistribution, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "ref_date": "20170313", + "list": [ + { + "index": "access_source_session_cnt", + "item_list": [ + { + "key": 10, + "value": 5 + }, + { + "key": 8, + "value": 687 + }, + { + "key": 7, + "value": 10740 + }, + { + "key": 6, + "value": 1961 + }, + { + "key": 5, + "value": 677 + }, + { + "key": 4, + "value": 653 + }, + { + "key": 3, + "value": 1120 + }, + { + "key": 2, + "value": 10243 + }, + { + "key": 1, + "value": 116578 + } + ] + }, + { + "index": "access_staytime_info", + "item_list": [ + { + "key": 8, + "value": 16329 + }, + { + "key": 7, + "value": 19322 + }, + { + "key": 6, + "value": 21832 + }, + { + "key": 5, + "value": 19539 + }, + { + "key": 4, + "value": 29670 + }, + { + "key": 3, + "value": 19667 + }, + { + "key": 2, + "value": 11794 + }, + { + "key": 1, + "value": 4511 + } + ] + }, + { + "index": "access_depth_info", + "item_list": [ + { + "key": 5, + "value": 217 + }, + { + "key": 4, + "value": 3259 + }, + { + "key": 3, + "value": 32445 + }, + { + "key": 2, + "value": 63542 + }, + { + "key": 1, + "value": 43201 + } + ] + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getVisitDistribution("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetVisitDistribution) + if err != nil { + t.Fatal(err) + } +} + +func TestGetVisitPage(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetVisitPage { + t.Fatalf("Except to path '%s',get '%s'", apiGetVisitPage, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "ref_date": "20170313", + "list": [ + { + "page_path": "pages/main/main.html", + "page_visit_pv": 213429, + "page_visit_uv": 55423, + "page_staytime_pv": 8.139198, + "entrypage_pv": 117922, + "exitpage_pv": 61304, + "page_share_pv": 180, + "page_share_uv": 166 + }, + { + "page_path": "pages/linedetail/linedetail.html", + "page_visit_pv": 155030, + "page_visit_uv": 42195, + "page_staytime_pv": 35.462395, + "entrypage_pv": 21101, + "exitpage_pv": 47051, + "page_share_pv": 47, + "page_share_uv": 42 + }, + { + "page_path": "pages/search/search.html", + "page_visit_pv": 65011, + "page_visit_uv": 24716, + "page_staytime_pv": 6.889634, + "entrypage_pv": 1811, + "exitpage_pv": 3198, + "page_share_pv": 0, + "page_share_uv": 0 + }, + { + "page_path": "pages/stationdetail/stationdetail.html", + "page_visit_pv": 29953, + "page_visit_uv": 9695, + "page_staytime_pv": 7.558508, + "entrypage_pv": 1386, + "exitpage_pv": 2285, + "page_share_pv": 0, + "page_share_uv": 0 + }, + { + "page_path": "pages/switch-city/switch-city.html", + "page_visit_pv": 8928, + "page_visit_uv": 4017, + "page_staytime_pv": 9.22659, + "entrypage_pv": 748, + "exitpage_pv": 1613, + "page_share_pv": 0, + "page_share_uv": 0 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getVisitPage("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetVisitPage) + if err != nil { + t.Fatal(err) + } +} + +func TestGetDailySummary(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetDailySummary { + t.Fatalf("Except to path '%s',get '%s'", apiGetDailySummary, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "list": [ + { + "ref_date": "20170313", + "visit_total": 391, + "share_pv": 572, + "share_uv": 383 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getDailySummary("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetDailySummary) + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/analysis_visit_trend.go b/app/lib/weapp/analysis_visit_trend.go new file mode 100644 index 0000000..0207fe2 --- /dev/null +++ b/app/lib/weapp/analysis_visit_trend.go @@ -0,0 +1,71 @@ +package weapp + +const ( + apiGetMonthlyVisitTrend = "/datacube/getweanalysisappidmonthlyvisittrend" + apiGetWeeklyVisitTrend = "/datacube/getweanalysisappidweeklyvisittrend" + apiGetDailyVisitTrend = "/datacube/getweanalysisappiddailyvisittrend" +) + +// Trend 用户趋势 +type Trend struct { + RefDate string `json:"ref_date"` // 时间,月格式为 yyyymm | 周格式为 yyyymmdd-yyyymmdd | 天格式为 yyyymmdd + SessionCNT uint `json:"session_cnt"` // 打开次数(自然月内汇总) + VisitPV uint `json:"visit_pv"` // 访问次数(自然月内汇总) + VisitUV uint `json:"visit_uv"` // 访问人数(自然月内去重) + VisitUVNew uint `json:"visit_uv_new"` // 新用户数(自然月内去重) + StayTimeUV float64 `json:"stay_time_uv"` // 人均停留时长 (浮点型,单位:秒) + StayTimeSession float64 `json:"stay_time_session"` // 次均停留时长 (浮点型,单位:秒) + VisitDepth float64 `json:"visit_depth"` // 平均访问深度 (浮点型) +} + +// VisitTrend 生物认证秘钥签名验证请求返回数据 +type VisitTrend struct { + CommonError + List []Trend `json:"list"` +} + +// GetMonthlyVisitTrend 获取用户访问小程序数据月趋势 +// accessToken 接口调用凭证 +// begin 开始日期,为自然月第一天。格式为 yyyymmdd +// end 结束日期,为自然月最后一天,限定查询一个月数据。格式为 yyyymmdd +func GetMonthlyVisitTrend(accessToken, begin, end string) (*VisitTrend, error) { + api := baseURL + apiGetMonthlyVisitTrend + return getVisitTrend(accessToken, begin, end, api) +} + +// GetWeeklyVisitTrend 获取用户访问小程序数据周趋势 +// accessToken 接口调用凭证 +// begin 开始日期,为自然月第一天。格式为 yyyymmdd +// end 结束日期,为周日日期,限定查询一周数据。格式为 yyyymmdd +func GetWeeklyVisitTrend(accessToken, begin, end string) (*VisitTrend, error) { + api := baseURL + apiGetWeeklyVisitTrend + return getVisitTrend(accessToken, begin, end, api) +} + +// GetDailyVisitTrend 获取用户访问小程序数据日趋势 +// accessToken 接口调用凭证 +// begin 开始日期,为自然月第一天。格式为 yyyymmdd +// end 结束日期,限定查询1天数据,允许设置的最大值为昨日。格式为 yyyymmdd +func GetDailyVisitTrend(accessToken, begin, end string) (*VisitTrend, error) { + api := baseURL + apiGetDailyVisitTrend + return getVisitTrend(accessToken, begin, end, api) +} + +func getVisitTrend(accessToken, begin, end, api string) (*VisitTrend, error) { + url, err := tokenAPI(api, accessToken) + if err != nil { + return nil, err + } + + params := dateRange{ + BeginDate: begin, + EndDate: end, + } + + res := new(VisitTrend) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/analysis_visit_trend_test.go b/app/lib/weapp/analysis_visit_trend_test.go new file mode 100644 index 0000000..90e62ce --- /dev/null +++ b/app/lib/weapp/analysis_visit_trend_test.go @@ -0,0 +1,194 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestGetMonthlyVisitTrend(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetMonthlyVisitTrend { + t.Fatalf("Except to path '%s',get '%s'", apiGetMonthlyVisitTrend, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "list": [ + { + "ref_date": "201703", + "session_cnt": 126513, + "visit_pv": 426113, + "visit_uv": 48659, + "visit_uv_new": 6726, + "stay_time_session": 56.4112, + "visit_depth": 2.0189 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getVisitTrend("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetMonthlyVisitTrend) + if err != nil { + t.Fatal(err) + } +} + +func TestGetWeeklyVisitTrend(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetWeeklyVisitTrend { + t.Fatalf("Except to path '%s',get '%s'", apiGetWeeklyVisitTrend, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "list": [ + { + "ref_date": "20170306-20170312", + "session_cnt": 986780, + "visit_pv": 3251840, + "visit_uv": 189405, + "visit_uv_new": 45592, + "stay_time_session": 54.5346, + "visit_depth": 1.9735 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getVisitTrend("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetWeeklyVisitTrend) + if err != nil { + t.Fatal(err) + } +} + +func TestGetDailyVisitTrend(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetDailyVisitTrend { + t.Fatalf("Except to path '%s',get '%s'", apiGetDailyVisitTrend, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["begin_date"] + if !ok || param == "" { + t.Log("param begin_date can not be empty") + t.Fail() + } + param, ok = params["end_date"] + if !ok || param == "" { + t.Log("param end_date can not be empty") + t.Fail() + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "list": [ + { + "ref_date": "20170313", + "session_cnt": 142549, + "visit_pv": 472351, + "visit_uv": 55500, + "visit_uv_new": 5464, + "stay_time_session": 0, + "visit_depth": 1.9838 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getVisitTrend("mock-access-token", "mock-begin-date", "mock-end-date", ts.URL+apiGetDailyVisitTrend) + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/auth.go b/app/lib/weapp/auth.go new file mode 100644 index 0000000..e04e9fd --- /dev/null +++ b/app/lib/weapp/auth.go @@ -0,0 +1,218 @@ +package weapp + +import ( + "applet/app/cfg" + "applet/app/utils" + "encoding/json" + "errors" + "fmt" + "github.com/tidwall/gjson" +) + +const ( + apiLogin = "/sns/jscode2session" + apiGetAccessToken = "/cgi-bin/token" + apiGetPaidUnionID = "/wxa/getpaidunionid" + apiQetticket = "/cgi-bin/ticket/getticket" + apiLoginWebsiteBackend = "/Wx/getJsCode2session" +) + +// LoginResponse 返回给用户的数据 +type LoginResponse struct { + CommonError + OpenID string `json:"openid"` + SessionKey string `json:"session_key"` + // 用户在开放平台的唯一标识符 + // 只在满足一定条件的情况下返回 + UnionID string `json:"unionid"` +} + +// Login 登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。 +// +// appID 小程序 appID +// secret 小程序的 app secret +// code 小程序登录时获取的 code +func Login(appID, secret, code string) (*LoginResponse, error) { + api := baseURL + apiLogin + + return login(appID, secret, code, api) +} + +// 调用总站长后台的接口 +func LoginForWebsiteBackend(uid string, appID, code string) (*LoginResponse, error) { + utils.FilePutContents("o2o_wechat_mini", "appId :"+appID+", code: "+code) + api := cfg.WebsiteBackend.URL + apiLoginWebsiteBackend + "?appid=" + appID + "&js_code=" + code + "&uid=" + uid + //res := new(LoginResponse) + resByte, err := utils.CurlGet(api, nil) + if err != nil { + utils.FilePutContents("o2o_wechat_mini", "url:"+api) + return nil, err + } + fmt.Println(api, string(resByte), err) + var data struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data LoginResponse `json:"data"` + } + if gjson.Get(string(resByte), "code").Int() > 0 { + return nil, errors.New(gjson.Get(string(resByte), "msg").String()) + } + err = json.Unmarshal(resByte, &data) + if err != nil { + utils.FilePutContents("o2o_wechat_mini", "err:"+err.Error()+"res: "+string(resByte)) + return nil, err + } + if data.Code != 0 { + return nil, errors.New(data.Msg) + } + //if err := getJSON(api, res); err != nil { + // utils.FilePutContents("o2o_wechat_mini", "url:"+api) + // return nil, err + //} + + utils.FilePutContents("o2o_wechat_mini", string(resByte)) + return &data.Data, nil +} + +func login(appID, secret, code, api string) (*LoginResponse, error) { + queries := requestQueries{ + "appid": appID, + "secret": secret, + "js_code": code, + "grant_type": "authorization_code", + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(LoginResponse) + if err := getJSON(url, res); err != nil { + return nil, err + } + return res, nil +} + +// TokenResponse 获取 access_token 成功返回数据 +type TokenResponse struct { + CommonError + AccessToken string `json:"access_token"` // 获取到的凭证 + ExpiresIn uint `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值。 +} + +// GetAccessToken 获取小程序全局唯一后台接口调用凭据(access_token)。 +// 调调用绝大多数后台接口时都需使用 access_token,开发者需要进行妥善保存,注意缓存。 +func GetAccessToken(appID, secret string) (*TokenResponse, error) { + api := baseURL + apiGetAccessToken + return getAccessToken(appID, secret, api) +} + +func getAccessToken(appID, secret, api string) (*TokenResponse, error) { + + queries := requestQueries{ + "appid": appID, + "secret": secret, + "grant_type": "client_credential", + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(TokenResponse) + if err := getJSON(url, res); err != nil { + return nil, err + } + + return res, nil +} + +// TicketResponse 获取 Ticket 成功返回数据 +type TicketResponse struct { + CommonError + ExpiresIn uint `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值。 + Errcode int `json:"errcode"` + Ticket string `json:"ticket"` +} + +func Getticket(appID, access_token string) (*TicketResponse, error) { + api := baseURL + apiQetticket + return getticket(appID, access_token, api) +} + +func getticket(appID, access_token, api string) (*TicketResponse, error) { + queries := requestQueries{ + "access_token": access_token, + "type": "jsapi", + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(TicketResponse) + fmt.Println(res, "res") + fmt.Println(access_token, "access_token") + + if err := getJSON(url, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetPaidUnionIDResponse response data +type GetPaidUnionIDResponse struct { + CommonError + UnionID string `json:"unionid"` +} + +// GetPaidUnionID 用户支付完成后,通过微信支付订单号(transaction_id)获取该用户的 UnionId, +func GetPaidUnionID(accessToken, openID, transactionID string) (*GetPaidUnionIDResponse, error) { + api := baseURL + apiGetPaidUnionID + return getPaidUnionID(accessToken, openID, transactionID, api) +} + +func getPaidUnionID(accessToken, openID, transactionID, api string) (*GetPaidUnionIDResponse, error) { + queries := requestQueries{ + "openid": openID, + "access_token": accessToken, + "transaction_id": transactionID, + } + + return getPaidUnionIDRequest(api, queries) +} + +// GetPaidUnionIDWithMCH 用户支付完成后,通过微信支付商户订单号和微信支付商户号(out_trade_no 及 mch_id)获取该用户的 UnionId, +func GetPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID string) (*GetPaidUnionIDResponse, error) { + api := baseURL + apiGetPaidUnionID + return getPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID, api) +} + +func getPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID, api string) (*GetPaidUnionIDResponse, error) { + queries := requestQueries{ + "openid": openID, + "mch_id": mchID, + "out_trade_no": outTradeNo, + "access_token": accessToken, + } + + return getPaidUnionIDRequest(api, queries) +} + +func getPaidUnionIDRequest(api string, queries requestQueries) (*GetPaidUnionIDResponse, error) { + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(GetPaidUnionIDResponse) + if err := getJSON(url, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/auth_test.go b/app/lib/weapp/auth_test.go new file mode 100644 index 0000000..56eb362 --- /dev/null +++ b/app/lib/weapp/auth_test.go @@ -0,0 +1,181 @@ +package weapp + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestLogin(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "GET" { + t.Fatalf("Expect 'GET' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiLogin { + t.Fatalf("Except to path '%s',get '%s'", apiLogin, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"appid", "secret", "js_code", "grant_type"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "openid": "mock-openid", + "session_key": "mock-session_key", + "unionid": "mock-unionid", + "errcode": 0, + "errmsg": "mock-errmsg" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := login("mock-appid", "mock-secret", "mock-code", ts.URL+apiLogin) + if err != nil { + t.Fatal(err) + } +} + +func TestGetAccessToken(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "GET" { + t.Fatalf("Expect 'GET' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetAccessToken { + t.Fatalf("Except to path '%s',get '%s'", apiGetAccessToken, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("grant_type") != "client_credential" { + t.Fatal("invalid client_credential") + } + + queries := []string{"appid", "secret"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + + raw := `{"access_token":"ACCESS_TOKEN","expires_in":7200}` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getAccessToken("mock-appid", "mock-secret", ts.URL+apiGetAccessToken) + if err != nil { + t.Fatal(err) + } +} + +func TestGetPaidUnionID(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "GET" { + t.Fatalf("Expect 'GET' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetPaidUnionID { + t.Fatalf("Except to path '%s',get '%s'", apiGetPaidUnionID, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"openid", "access_token", "transaction_id"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "unionid": "oTmHYjg-tElZ68xxxxxxxxhy1Rgk", + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getPaidUnionID("mock-access-token", "mock-open-id", "mock-transaction-id", ts.URL+apiGetPaidUnionID) + if err != nil { + t.Fatal(err) + } +} + +func TestGetPaidUnionIDWithMCH(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "GET" { + t.Fatalf("Expect 'GET' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetPaidUnionID { + t.Fatalf("Except to path '%s',get '%s'", apiGetPaidUnionID, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"openid", "access_token", "mch_id", "out_trade_no"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "unionid": "oTmHYjg-tElZ68xxxxxxxxhy1Rgk", + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getPaidUnionIDWithMCH("mock-access-token", "mock-open-id", "mock-out-trade-number", "mock-mch-id", ts.URL+apiGetPaidUnionID) + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/common_error.go b/app/lib/weapp/common_error.go new file mode 100644 index 0000000..f6ee34d --- /dev/null +++ b/app/lib/weapp/common_error.go @@ -0,0 +1,34 @@ +package weapp + +import "errors" + +// CommonError 微信返回错误信息 +type CommonError struct { + ErrCode int `json:"errcode"` // 错误码 + ErrMSG string `json:"errmsg"` // 错误描述 +} + +// GetResponseError 获取微信服务器错返回误信息 +func (err *CommonError) GetResponseError() error { + if err.ErrCode != 0 { + return errors.New(err.ErrMSG) + } + + return nil +} + +// CommonResult 微信返回错误信息 +type CommonResult struct { + ResultCode int `json:"resultcode"` // 错误码 + ResultMsg string `json:"resultmsg"` // 错误描述 +} + +// GetResponseError 获取微信服务器错返回误信息 +func (err *CommonResult) GetResponseError() error { + + if err.ResultCode != 0 { + return errors.New(err.ResultMsg) + } + + return nil +} diff --git a/app/lib/weapp/crypto.go b/app/lib/weapp/crypto.go new file mode 100644 index 0000000..f463d48 --- /dev/null +++ b/app/lib/weapp/crypto.go @@ -0,0 +1,114 @@ +package weapp + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "crypto/sha1" + "encoding/hex" + "errors" + "io" + "sort" + "strings" +) + +const pkcs7blocksize = 32 + +// pkcs7encode 对需要加密的明文进行填充补位 +// plaintext 需要进行填充补位操作的明文 +// 返回补齐明文字符串 +func pkcs7encode(plaintext []byte) []byte { + //计算需要填充的位数 + pad := pkcs7blocksize - len(plaintext)%pkcs7blocksize + if pad == 0 { + pad = pkcs7blocksize + } + + //获得补位所用的字符 + text := bytes.Repeat([]byte{byte(pad)}, pad) + + return append(plaintext, text...) +} + +// pkcs7decode 对解密后的明文进行补位删除 +// plaintext 解密后的明文 +// 返回删除填充补位后的明文和 +func pkcs7decode(plaintext []byte) []byte { + ln := len(plaintext) + + // 获取最后一个字符的 ASCII + pad := int(plaintext[ln-1]) + if pad < 1 || pad > pkcs7blocksize { + pad = 0 + } + + return plaintext[:(ln - pad)] +} + +// 对加密数据包进行签名校验,确保数据的完整性。 +func validateSignature(signature string, parts ...string) bool { + return signature == createSignature(parts...) +} + +// 校验用户数据数据 +func validateUserInfo(signature, rawData, ssk string) bool { + raw := sha1.Sum([]byte(rawData + ssk)) + return signature == hex.EncodeToString(raw[:]) +} + +// 拼凑签名 +func createSignature(parts ...string) string { + sort.Strings(parts) + raw := sha1.Sum([]byte(strings.Join(parts, ""))) + + return hex.EncodeToString(raw[:]) +} + +// cbcEncrypt CBC 加密数据 +func cbcEncrypt(key, plaintext, iv []byte) ([]byte, error) { + if len(plaintext)%aes.BlockSize != 0 { + return nil, errors.New("plaintext is not a multiple of the block size") + } + + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + ciphertext := make([]byte, aes.BlockSize+len(plaintext)) + iv = iv[:aes.BlockSize] + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + return nil, err + } + + mode := cipher.NewCBCEncrypter(block, iv) + mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext) + + return ciphertext, nil +} + +// CBC解密数据 +func cbcDecrypt(key, ciphertext, iv []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + size := aes.BlockSize + iv = iv[:size] + // ciphertext = ciphertext[size:] TODO: really useless? + + if len(ciphertext) < size { + return nil, errors.New("ciphertext too short") + } + + if len(ciphertext)%size != 0 { + return nil, errors.New("ciphertext is not a multiple of the block size") + } + + mode := cipher.NewCBCDecrypter(block, iv) + mode.CryptBlocks(ciphertext, ciphertext) + + return pkcs7decode(ciphertext), nil +} diff --git a/app/lib/weapp/customer_service_message.go b/app/lib/weapp/customer_service_message.go new file mode 100644 index 0000000..c17e3b9 --- /dev/null +++ b/app/lib/weapp/customer_service_message.go @@ -0,0 +1,268 @@ +package weapp + +import ( + "encoding/json" + "errors" + "net/http" + "strings" +) + +const ( + apiSendMessage = "/cgi-bin/message/custom/send" + apiSetTyping = "/cgi-bin/message/custom/typing" + apiUploadTemplateMedia = "/cgi-bin/media/upload" + apiGetTemplateMedia = "/cgi-bin/media/get" +) + +// csMsgType 消息类型 +type csMsgType string + +// 所有消息类型 +const ( + csMsgTypeText csMsgType = "text" // 文本消息类型 + csMsgTypeLink = "link" // 图文链接消息类型 + csMsgTypeImage = "image" // 图片消息类型 + csMsgTypeMPCard = "miniprogrampage" // 小程序卡片消息类型 +) + +// csMessage 消息体 +type csMessage struct { + Receiver string `json:"touser"` // user openID + Type csMsgType `json:"msgtype"` // text | image | link | miniprogrampage + Text CSMsgText `json:"text,omitempty"` + Image CSMsgImage `json:"image,omitempty"` + Link CSMsgLink `json:"link,omitempty"` + MPCard CSMsgMPCard `json:"miniprogrampage,omitempty"` +} + +// CSMsgText 接收的文本消息 +type CSMsgText struct { + Content string `json:"content"` +} + +// SendTo 发送文本消息 +// +// openID 用户openID +// token 微信 access_token +func (msg CSMsgText) SendTo(openID, token string) (*CommonError, error) { + + params := csMessage{ + Receiver: openID, + Type: csMsgTypeText, + Text: msg, + } + + return sendMessage(token, params) +} + +// CSMsgImage 客服图片消息 +type CSMsgImage struct { + MediaID string `json:"media_id"` // 发送的图片的媒体ID,通过 新增素材接口 上传图片文件获得。 +} + +// SendTo 发送图片消息 +// +// openID 用户openID +// token 微信 access_token +func (msg CSMsgImage) SendTo(openID, token string) (*CommonError, error) { + + params := csMessage{ + Receiver: openID, + Type: csMsgTypeImage, + Image: msg, + } + + return sendMessage(token, params) +} + +// CSMsgLink 图文链接消息 +type CSMsgLink struct { + Title string `json:"title"` + Description string `json:"description"` + URL string `json:"url"` + ThumbURL string `json:"thumb_url"` +} + +// SendTo 发送图文链接消息 +// +// openID 用户openID +// token 微信 access_token +func (msg CSMsgLink) SendTo(openID, token string) (*CommonError, error) { + + params := csMessage{ + Receiver: openID, + Type: csMsgTypeLink, + Link: msg, + } + + return sendMessage(token, params) +} + +// CSMsgMPCard 接收的卡片消息 +type CSMsgMPCard struct { + Title string `json:"title"` // 标题 + PagePath string `json:"pagepath"` // 小程序页面路径 + ThumbMediaID string `json:"thumb_media_id"` // 小程序消息卡片的封面, image 类型的 media_id,通过 新增素材接口 上传图片文件获得,建议大小为 520*416 +} + +// SendTo 发送卡片消息 +// +// openID 用户openID +// token 微信 access_token +func (msg CSMsgMPCard) SendTo(openID, token string) (*CommonError, error) { + + params := csMessage{ + Receiver: openID, + Type: "miniprogrampage", + MPCard: msg, + } + + return sendMessage(token, params) +} + +// send 发送消息 +// +// token 微信 access_token +func sendMessage(token string, params interface{}) (*CommonError, error) { + api := baseURL + apiSendMessage + return doSendMessage(token, params, api) +} + +func doSendMessage(token string, params interface{}, api string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// SetTypingCommand 下发客服当前输入状态命令 +type SetTypingCommand = string + +// 所有下发客服当前输入状态命令 +const ( + SetTypingCommandTyping SetTypingCommand = "Typing" // 对用户下发"正在输入"状态 + SetTypingCommandCancelTyping = "CancelTyping" // 取消对用户的"正在输入"状态 +) + +// SetTyping 下发客服当前输入状态给用户。 +// +// token 接口调用凭证 +// openID 用户的 OpenID +// cmd 命令 +func SetTyping(token, openID string, cmd SetTypingCommand) (*CommonError, error) { + api := baseURL + apiSetTyping + return setTyping(token, openID, cmd, api) +} + +func setTyping(token, openID string, cmd SetTypingCommand, api string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "touser": openID, + "command": cmd, + } + + res := new(CommonError) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// TempMediaType 文件类型 +type TempMediaType = string + +// 所有文件类型 +const ( + TempMediaTypeImage TempMediaType = "image" // 图片 +) + +// UploadTempMediaResponse 上传媒体文件返回 +type UploadTempMediaResponse struct { + CommonError + Type string `json:"type"` // 文件类型 + MediaID string `json:"media_id"` // 媒体文件上传后,获取标识,3天内有效。 + CreatedAt uint `json:"created_at"` // 媒体文件上传时间戳 +} + +// UploadTempMedia 把媒体文件上传到微信服务器。目前仅支持图片。用于发送客服消息或被动回复用户消息。 +// +// token 接口调用凭证 +// mediaType 文件类型 +// medianame 媒体文件名 +func UploadTempMedia(token string, mediaType TempMediaType, medianame string) (*UploadTempMediaResponse, error) { + api := baseURL + apiUploadTemplateMedia + return uploadTempMedia(token, mediaType, medianame, api) +} + +func uploadTempMedia(token string, mediaType TempMediaType, medianame, api string) (*UploadTempMediaResponse, error) { + queries := requestQueries{ + "type": mediaType, + "access_token": token, + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(UploadTempMediaResponse) + if err := postFormByFile(url, "media", medianame, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetTempMedia 获取客服消息内的临时素材。即下载临时的多媒体文件。目前小程序仅支持下载图片文件。 +// +// token 接口调用凭证 +// mediaID 媒体文件 ID +func GetTempMedia(token, mediaID string) (*http.Response, *CommonError, error) { + api := baseURL + apiGetTemplateMedia + return getTempMedia(token, mediaID, api) +} + +func getTempMedia(token, mediaID, api string) (*http.Response, *CommonError, error) { + queries := requestQueries{ + "access_token": token, + "media_id": mediaID, + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, nil, err + } + res, err := http.Get(url) + if err != nil { + return nil, nil, err + } + + response := new(CommonError) + switch header := res.Header.Get("Content-Type"); { + case strings.HasPrefix(header, "application/json"): // 返回错误信息 + if err := json.NewDecoder(res.Body).Decode(response); err != nil { + res.Body.Close() + return nil, nil, err + } + return res, response, nil + + case strings.HasPrefix(header, "image"): // 返回文件 TODO: 应该确认一下 + return res, response, nil + + default: + res.Body.Close() + return nil, nil, errors.New("invalid response header: " + header) + } +} diff --git a/app/lib/weapp/customer_service_message_test.go b/app/lib/weapp/customer_service_message_test.go new file mode 100644 index 0000000..6e96743 --- /dev/null +++ b/app/lib/weapp/customer_service_message_test.go @@ -0,0 +1,343 @@ +package weapp + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "os" + "path" + "reflect" + "testing" +) + +func TestSetTyping(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiSetTyping { + t.Fatalf("Except to path '%s',get '%s'", apiSetTyping, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + param, ok := params["touser"] + if !ok || param == "" { + t.Error("param touser can not be empty") + } + param, ok = params["command"] + if !ok || param == "" { + t.Error("param command can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := setTyping("mock-access-token", "mock-open-id", "mock-command", ts.URL+apiSetTyping) + if err != nil { + t.Fatal(err) + } +} + +func TestUploadTempMedia(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiUploadTemplateMedia { + t.Fatalf("Except to path '%s',get '%s'", apiUploadTemplateMedia, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"access_token", "type"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + if _, _, err := r.FormFile("media"); err != nil { + t.Fatal(err) + + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "type": "image", + "media_id": "MEDIA_ID", + "created_at": 1234567890 + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := uploadTempMedia("mock-access-token", "mock-media-type", testIMGName, ts.URL+apiUploadTemplateMedia) + if err != nil { + t.Fatal(err) + } +} + +func TestGetTempMedia(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + t.Fatalf("Expect 'GET' get '%s'", r.Method) + } + + ePath := r.URL.EscapedPath() + if ePath != apiGetTemplateMedia { + t.Fatalf("Except to path '%s',get '%s'", apiGetTemplateMedia, ePath) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"access_token", "media_id"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + resp, _, err := getTempMedia("mock-access-token", "mock-media-id", ts.URL+apiGetTemplateMedia) + if err != nil { + t.Fatal(err) + } + resp.Body.Close() +} + +func TestSendCustomerServiceMessage(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiSendMessage { + t.Fatalf("Except to path '%s',get '%s'", apiSendMessage, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Error("access_token can not be empty") + } + + params := make(object) + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + param, ok := params["touser"] + if !ok || param == "" { + t.Error("param touser can not be empty") + } + param, ok = params["msgtype"] + if !ok || param == "" { + t.Error("param command can not be empty") + } + switch param { + + case "text": + param, ok := params["text"] + if !ok { + t.Error("param text can not be empty") + } + + obj, ok := param.(object) + if !ok { + t.Errorf("unexpected value type of tex: %s", reflect.TypeOf(param)) + } + + param, ok = obj["content"] + if !ok { + t.Error("param text.content can not be empty") + } + + case "image": + param, ok := params["image"] + if !ok { + t.Error("param command can not be empty") + } + + obj, ok := param.(object) + if !ok { + t.Error("unexpected value type of image") + } + + param, ok = obj["media_id"] + if !ok { + t.Error("param image.media_id can not be empty") + } + + case "link": + param, ok := params["link"] + if !ok { + t.Error("param link can not be empty") + } + + obj, ok := param.(object) + if !ok { + t.Error("unexpected value type of link") + } + + param, ok = obj["title"] + if !ok { + t.Error("param link.title can not be empty") + } + + param, ok = obj["description"] + if !ok { + t.Error("param link.description can not be empty") + } + + param, ok = obj["url"] + if !ok { + t.Error("param link.url can not be empty") + } + + param, ok = obj["thumb_url"] + if !ok { + t.Error("param link.thumb_url can not be empty") + } + + case "miniprogrampage": + param, ok := params["miniprogrampage"] + if !ok { + t.Error("param miniprogrampage can not be empty") + } + + obj, ok := param.(object) + if !ok { + t.Error("unexpected value type of miniprogrampage") + } + + param, ok = obj["title"] + if !ok { + t.Error("param miniprogrampage.title can not be empty") + } + + param, ok = obj["pagepath"] + if !ok { + t.Error("param miniprogrampage.pagepath can not be empty") + } + + param, ok = obj["thumb_media_id"] + if !ok { + t.Error("param miniprogrampage.thumb_media_id can not be empty") + } + + default: + t.Fatalf("unexpected msgtype: %s", param) + } + + w.WriteHeader(http.StatusOK) + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + messages := []csMessage{ + csMessage{ + Receiver: "mock-open-id", + Type: csMsgTypeText, + Image: CSMsgImage{ + MediaID: "mock-media-id", + }, + }, + csMessage{ + Receiver: "mock-open-id", + Type: csMsgTypeLink, + Link: CSMsgLink{ + Title: "mock-title", + Description: "mock-description", + URL: "mock-url", + ThumbURL: "mock-thumb-url", + }, + }, + csMessage{ + Receiver: "mock-open-id", + Type: csMsgTypeMPCard, + MPCard: CSMsgMPCard{ + Title: "mock-title", + PagePath: "mock-page-path", + ThumbMediaID: "mock-thumb-media-id", + }, + }, + csMessage{ + Receiver: "mock-open-id", + Type: csMsgTypeText, + Text: CSMsgText{ + Content: "mock-content", + }, + }, + } + for _, msg := range messages { + _, err := doSendMessage("mock-access-token", msg, ts.URL+apiSendMessage) + if err != nil { + t.Error(err) + } + } +} diff --git a/app/lib/weapp/decrypt.go b/app/lib/weapp/decrypt.go new file mode 100644 index 0000000..b21199e --- /dev/null +++ b/app/lib/weapp/decrypt.go @@ -0,0 +1,154 @@ +package weapp + +import ( + "encoding/base64" + "encoding/json" + "errors" +) + +// DecryptUserData 解密用户数据 +func DecryptUserData(ssk, ciphertext, iv string) ([]byte, error) { + key, err := base64.StdEncoding.DecodeString(ssk) + if err != nil { + return nil, err + } + cipher, err := base64.StdEncoding.DecodeString(ciphertext) + if err != nil { + return nil, err + } + + rawIV, err := base64.StdEncoding.DecodeString(iv) + if err != nil { + return nil, err + } + return cbcDecrypt(key, cipher, rawIV) +} + +type watermark struct { + AppID string `json:"appid"` + Timestamp int64 `json:"timestamp"` +} + +// Mobile 解密后的用户手机号码信息 +type Mobile struct { + PhoneNumber string `json:"phoneNumber"` + PurePhoneNumber string `json:"purePhoneNumber"` + CountryCode string `json:"countryCode"` + Watermark watermark `json:"watermark"` +} + +// DecryptMobile 解密手机号码 +// +// sessionKey 通过 Login 向微信服务端请求得到的 session_key +// encryptedData 小程序通过 api 得到的加密数据(encryptedData) +// iv 小程序通过 api 得到的初始向量(iv) +func DecryptMobile(sessionKey, encryptedData, iv string) (*Mobile, error) { + raw, err := DecryptUserData(sessionKey, encryptedData, iv) + if err != nil { + return nil, err + } + + mobile := new(Mobile) + if err := json.Unmarshal(raw, mobile); err != nil { + return nil, err + } + + return mobile, nil +} + +// ShareInfo 解密后的分享信息 +type ShareInfo struct { + GID string `json:"openGId"` +} + +// DecryptShareInfo 解密转发信息的加密数据 +// +// sessionKey 通过 Login 向微信服务端请求得到的 session_key +// encryptedData 小程序通过 api 得到的加密数据(encryptedData) +// iv 小程序通过 api 得到的初始向量(iv) +// +// gid 小程序唯一群号 +func DecryptShareInfo(sessionKey, encryptedData, iv string) (*ShareInfo, error) { + + raw, err := DecryptUserData(sessionKey, encryptedData, iv) + if err != nil { + return nil, err + } + + info := new(ShareInfo) + if err = json.Unmarshal(raw, info); err != nil { + return nil, err + } + + return info, nil +} + +// UserInfo 解密后的用户信息 +type UserInfo struct { + OpenID string `json:"openId"` + Nickname string `json:"nickName"` + Gender int `json:"gender"` + Province string `json:"province"` + Language string `json:"language"` + Country string `json:"country"` + City string `json:"city"` + Avatar string `json:"avatarUrl"` + UnionID string `json:"unionId"` + Watermark watermark `json:"watermark"` +} + +// DecryptUserInfo 解密用户信息 +// +// sessionKey 微信 session_key +// rawData 不包括敏感信息的原始数据字符串,用于计算签名。 +// encryptedData 包括敏感数据在内的完整用户信息的加密数据 +// signature 使用 sha1( rawData + session_key ) 得到字符串,用于校验用户信息 +// iv 加密算法的初始向量 +func DecryptUserInfo(sessionKey, rawData, encryptedData, signature, iv string) (*UserInfo, error) { + + if ok := validateUserInfo(signature, rawData, sessionKey); !ok { + return nil, errors.New("failed to validate signature") + } + + raw, err := DecryptUserData(sessionKey, encryptedData, iv) + if err != nil { + return nil, err + } + + info := new(UserInfo) + if err := json.Unmarshal(raw, info); err != nil { + return nil, err + } + + return info, nil +} + +// RunData 解密后的最近30天微信运动步数 +type RunData struct { + StepInfoList []SetpInfo `json:"stepInfoList"` +} + +// SetpInfo 运动步数 +type SetpInfo struct { + Step int `json:"step"` + Timestamp int64 `json:"timestamp"` +} + +// DecryptRunData 解密微信运动的加密数据 +// +// sessionKey 通过 Login 向微信服务端请求得到的 session_key +// encryptedData 小程序通过 api 得到的加密数据(encryptedData) +// iv 小程序通过 api 得到的初始向量(iv) +func DecryptRunData(sessionKey, encryptedData, iv string) (*RunData, error) { + raw, err := DecryptUserData(sessionKey, encryptedData, iv) + if err != nil { + return nil, err + } + + info := new(RunData) + if err := json.Unmarshal(raw, info); err != nil { + return nil, err + } + + return info, nil +} diff --git a/app/lib/weapp/express.go b/app/lib/weapp/express.go new file mode 100644 index 0000000..492a939 --- /dev/null +++ b/app/lib/weapp/express.go @@ -0,0 +1,66 @@ +package weapp + +// ExpressOrder 物流订单 +type ExpressOrder struct { + OrderID string `json:"order_id"` // 订单ID,须保证全局唯一,不超过512字节 + OpenID string `json:"openid,omitempty"` // 用户openid,当add_source=2时无需填写(不发送物流服务通知) + DeliveryID string `json:"delivery_id"` // 快递公司ID,参见getAllDelivery + BizID string `json:"biz_id"` // 快递客户编码或者现付编码 + CustomRemark string `json:"custom_remark,omitempty"` // 快递备注信息,比如"易碎物品",不超过1024字节 + Sender ExpreseeUserInfo `json:"sender"` // 发件人信息 + Receiver ExpreseeUserInfo `json:"receiver"` // 收件人信息 + Cargo ExpressCargo `json:"cargo"` // 包裹信息,将传递给快递公司 + Shop ExpressShop `json:"shop,omitempty"` // 商家信息,会展示到物流服务通知中,当add_source=2时无需填写(不发送物流服务通知) + Insured ExpressInsure `json:"insured"` // 保价信息 + Service ExpressService `json:"service"` // 服务类型 +} + +// ExpreseeUserInfo 收件人/发件人信息 +type ExpreseeUserInfo struct { + Name string `json:"name"` // 收件人/发件人姓名,不超过64字节 + Tel string `json:"tel,omitempty"` // 收件人/发件人座机号码,若不填写则必须填写 mobile,不超过32字节 + Mobile string `json:"mobile,omitempty"` // 收件人/发件人手机号码,若不填写则必须填写 tel,不超过32字节 + Company string `json:"company,omitempty"` // 收件人/发件人公司名称,不超过64字节 + PostCode string `json:"post_code,omitempty"` // 收件人/发件人邮编,不超过10字节 + Country string `json:"country,omitempty"` // 收件人/发件人国家,不超过64字节 + Province string `json:"province"` // 收件人/发件人省份,比如:"广东省",不超过64字节 + City string `json:"city"` // 收件人/发件人市/地区,比如:"广州市",不超过64字节 + Area string `json:"area"` // 收件人/发件人区/县,比如:"海珠区",不超过64字节 + Address string `json:"address"` // 收件人/发件人详细地址,比如:"XX路XX号XX大厦XX",不超过512字节 +} + +// ExpressCargo 包裹信息 +type ExpressCargo struct { + Count uint `json:"count"` // 包裹数量 + Weight float64 `json:"weight"` // 包裹总重量,单位是千克(kg) + SpaceX float64 `json:"space_x"` // 包裹长度,单位厘米(cm) + SpaceY float64 `json:"space_y"` // 包裹宽度,单位厘米(cm) + SpaceZ float64 `json:"space_z"` // 包裹高度,单位厘米(cm) + DetailList []CargoDetail `json:"detail_list"` // 包裹中商品详情列表 +} + +// CargoDetail 包裹详情 +type CargoDetail struct { + Name string `json:"name"` // 商品名,不超过128字节 + Count uint `json:"count"` // 商品数量 +} + +// ExpressShop 商家信息 +type ExpressShop struct { + WXAPath string `json:"wxa_path"` // 商家小程序的路径,建议为订单页面 + IMGUrl string `json:"img_url"` // 商品缩略图 url + GoodsName string `json:"goods_name"` // 商品名称 + GoodsCount uint `json:"goods_count"` // 商品数量 +} + +// ExpressInsure 订单保价 +type ExpressInsure struct { + Used InsureStatus `json:"use_insured"` // 是否保价,0 表示不保价,1 表示保价 + Value uint `json:"insured_value"` // 保价金额,单位是分,比如: 10000 表示 100 元 +} + +// ExpressService 服务类型 +type ExpressService struct { + Type uint8 `json:"service_type"` // 服务类型ID + Name string `json:"service_name"` // 服务名称 +} diff --git a/app/lib/weapp/express_business.go b/app/lib/weapp/express_business.go new file mode 100644 index 0000000..de49c2f --- /dev/null +++ b/app/lib/weapp/express_business.go @@ -0,0 +1,432 @@ +package weapp + +const ( + apiBindAccount = "/cgi-bin/express/business/account/bind" + apiGetAllAccount = "/cgi-bin/express/business/account/getall" + apiGetExpressPath = "/cgi-bin/express/business/path/get" + apiAddExpressOrder = "/cgi-bin/express/business/order/add" + apiCancelExpressOrder = "/cgi-bin/express/business/order/cancel" + apiGetAllDelivery = "/cgi-bin/express/business/delivery/getall" + apiGetExpressOrder = "/cgi-bin/express/business/order/get" + apiGetPrinter = "/cgi-bin/express/business/printer/getall" + apiGetQuota = "/cgi-bin/express/business/quota/get" + apiUpdatePrinter = "/cgi-bin/express/business/printer/update" + apiTestUpdateOrder = "/cgi-bin/express/business/test_update_order" +) + +// ExpressAccount 物流账号 +type ExpressAccount struct { + Type BindType `json:"type"` // bind表示绑定,unbind表示解除绑定 + BizID string `json:"biz_id"` // 快递公司客户编码 + DeliveryID string `json:"delivery_id"` // 快递公司 ID + Password string `json:"password"` // 快递公司客户密码 + RemarkContent string `json:"remark_content"` // 备注内容(提交EMS审核需要) +} + +// BindType 绑定动作类型 +type BindType = string + +// 所有绑定动作类型 +const ( + Bind = "bind" // 绑定 + Unbind = "unbind" // 解除绑定 +) + +// Bind 绑定、解绑物流账号 +// token 接口调用凭证 +func (ea *ExpressAccount) Bind(token string) (*CommonError, error) { + api := baseURL + apiBindAccount + return ea.bind(api, token) +} + +func (ea *ExpressAccount) bind(api, token string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(url, ea, res); err != nil { + return nil, err + } + + return res, nil +} + +// AccountList 所有绑定的物流账号 +type AccountList struct { + CommonError + Count uint `json:"count"` // 账号数量 + List []struct { + BizID string `json:"biz_id"` // 快递公司客户编码 + DeliveryID string `json:"delivery_id"` // 快递公司 ID + CreateTime uint `json:"create_time"` // 账号绑定时间 + UpdateTime uint `json:"update_time"` // 账号更新时间 + StatusCode BindStatus `json:"status_code"` // 绑定状态 + Alias string `json:"alias"` // 账号别名 + RemarkWrongMsg string `json:"remark_wrong_msg"` // 账号绑定失败的错误信息(EMS审核结果) + RemarkContent string `json:"remark_content"` // 账号绑定时的备注内容(提交EMS审核需要)) + QuotaNum uint `json:"quota_num"` // 电子面单余额 + QuotaUpdateTime uint `json:"quota_update_time"` // 电子面单余额更新时间 + } `json:"list"` // 账号列表 +} + +// BindStatus 账号绑定状态 +type BindStatus = int8 + +// 所有账号绑定状态 +const ( + BindSuccess = 0 // 成功 + BindFailed = -1 // 系统失败 +) + +// GetAllAccount 获取所有绑定的物流账号 +// token 接口调用凭证 +func GetAllAccount(token string) (*AccountList, error) { + api := baseURL + apiGetAllAccount + return getAllAccount(api, token) +} + +func getAllAccount(api, token string) (*AccountList, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(AccountList) + if err := postJSON(url, requestParams{}, res); err != nil { + return nil, err + } + + return res, nil +} + +// ExpressPathGetter 查询运单轨迹所需参数 +type ExpressPathGetter ExpressOrderGetter + +// GetExpressPathResponse 运单轨迹 +type GetExpressPathResponse struct { + CommonError + OpenID string `json:"openid"` // 用户openid + DeliveryID string `json:"delivery_id"` // 快递公司 ID + WaybillID string `json:"waybill_id"` // 运单 ID + PathItemNum uint `json:"path_item_num"` // 轨迹节点数量 + PathItemList []ExpressPathNode `json:"path_item_list"` // 轨迹节点列表 +} + +// ExpressPathNode 运单轨迹节点 +type ExpressPathNode struct { + ActionTime uint `json:"action_time"` // 轨迹节点 Unix 时间戳 + ActionType uint `json:"action_type"` // 轨迹节点类型 + ActionMsg string `json:"action_msg"` // 轨迹节点详情 +} + +// Get 查询运单轨迹 +// token 接口调用凭证 +func (ep *ExpressPathGetter) Get(token string) (*GetExpressPathResponse, error) { + api := baseURL + apiGetExpressPath + return ep.get(api, token) +} + +func (ep *ExpressPathGetter) get(api, token string) (*GetExpressPathResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(GetExpressPathResponse) + if err := postJSON(url, ep, res); err != nil { + return nil, err + } + + return res, nil +} + +// ExpressOrderSource 订单来源 +type ExpressOrderSource = uint8 + +// 所有订单来源 +const ( + FromWeapp ExpressOrderSource = 0 // 小程序订单 + FromAppOrH5 = 2 // APP或H5订单 +) + +// ExpressOrderCreator 订单创建器 +type ExpressOrderCreator struct { + ExpressOrder + AddSource ExpressOrderSource `json:"add_source"` // 订单来源,0为小程序订单,2为App或H5订单,填2则不发送物流服务通知 + WXAppID string `json:"wx_appid,omitempty"` // App或H5的appid,add_source=2时必填,需和开通了物流助手的小程序绑定同一open帐号 + ExpectTime uint `json:"expect_time,omitempty"` // 顺丰必须填写此字段。预期的上门揽件时间,0表示已事先约定取件时间;否则请传预期揽件时间戳,需大于当前时间,收件员会在预期时间附近上门。例如expect_time为“1557989929”,表示希望收件员将在2019年05月16日14:58:49-15:58:49内上门取货。 + TagID uint `json:"tagid,omitempty"` //订单标签id,用于平台型小程序区分平台上的入驻方,tagid须与入驻方账号一一对应,非平台型小程序无需填写该字段 +} + +// InsureStatus 保价状态 +type InsureStatus = uint8 + +// 所有保价状态 +const ( + Uninsured = 0 // 不保价 + Insured = 1 // 保价 +) + +// CreateExpressOrderResponse 创建订单返回数据 +type CreateExpressOrderResponse struct { + CommonError + OrderID string `json:"order_id"` // 订单ID,下单成功时返回 + WaybillID string `json:"waybill_id"` // 运单ID,下单成功时返回 + WaybillData []struct { + Key string `json:"key"` // 运单信息 key + Value string `json:"value"` // 运单信息 value + } `json:"waybill_data"` // 运单信息,下单成功时返回 + DeliveryResultcode int `json:"delivery_resultcode"` // 快递侧错误码,下单失败时返回 + DeliveryResultmsg string `json:"delivery_resultmsg"` // 快递侧错误信息,下单失败时返回 +} + +// Create 生成运单 +// token 接口调用凭证 +func (creator *ExpressOrderCreator) Create(token string) (*CreateExpressOrderResponse, error) { + api := baseURL + apiAddExpressOrder + return creator.create(api, token) +} + +func (creator *ExpressOrderCreator) create(api, token string) (*CreateExpressOrderResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CreateExpressOrderResponse) + if err := postJSON(url, creator, res); err != nil { + return nil, err + } + + return res, nil +} + +// CancelOrderResponse 取消订单返回数据 +type CancelOrderResponse struct { + CommonError + Count uint `json:"count"` //快递公司数量 + Data []struct { + DeliveryID string `json:"delivery_id"` // 快递公司 ID + DeliveryName string `json:"delivery_name"` // 快递公司名称 + + } `json:"data"` //快递公司信息列表 +} + +// DeliveryList 支持的快递公司列表 +type DeliveryList struct { + CommonError + Count uint `json:"count"` // 快递公司数量 + Data []struct { + ID string `json:"delivery_id"` // 快递公司 ID + Name string `json:"delivery_name"` // 快递公司名称 + } `json:"data"` // 快递公司信息列表 +} + +// GetAllDelivery 获取支持的快递公司列表 +// token 接口调用凭证 +func GetAllDelivery(token string) (*DeliveryList, error) { + api := baseURL + apiGetAllDelivery + return getAllDelivery(api, token) +} + +func getAllDelivery(api, token string) (*DeliveryList, error) { + queries := requestQueries{ + "access_token": token, + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(DeliveryList) + if err := getJSON(url, res); err != nil { + return nil, err + } + + return res, nil +} + +// ExpressOrderGetter 订单获取器 +type ExpressOrderGetter struct { + OrderID string `json:"order_id"` // 订单 ID,需保证全局唯一 + OpenID string `json:"openid,omitempty"` // 用户openid,当add_source=2时无需填写(不发送物流服务通知) + DeliveryID string `json:"delivery_id"` // 快递公司ID,参见getAllDelivery + WaybillID string `json:"waybill_id"` // 运单ID +} + +// GetExpressOrderResponse 获取运单返回数据 +type GetExpressOrderResponse struct { + CommonError + PrintHTML string `json:"print_html"` // 运单 html 的 BASE64 结果 + WaybillData []struct { + Key string `json:"key"` // 运单信息 key + Value string `json:"value"` // 运单信息 value + } `json:"waybill_data"` // 运单信息 +} + +// Get 获取运单数据 +// token 接口调用凭证 +func (getter *ExpressOrderGetter) Get(token string) (*GetExpressOrderResponse, error) { + api := baseURL + apiGetExpressOrder + return getter.get(api, token) +} + +func (getter *ExpressOrderGetter) get(api, token string) (*GetExpressOrderResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(GetExpressOrderResponse) + if err := postJSON(url, getter, res); err != nil { + return nil, err + } + + return res, nil +} + +// ExpressOrderCanceler 订单取消器 +type ExpressOrderCanceler ExpressOrderGetter + +// Cancel 取消运单 +// token 接 口调用凭证 +func (canceler *ExpressOrderCanceler) Cancel(token string) (*CommonError, error) { + api := baseURL + apiCancelExpressOrder + return canceler.cancel(api, token) +} + +func (canceler *ExpressOrderCanceler) cancel(api, token string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(url, canceler, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetPrinterResponse 获取打印员返回数据 +type GetPrinterResponse struct { + CommonError + Count uint `json:"count"` // 已经绑定的打印员数量 + OpenID []string `json:"openid"` // 打印员 openid 列表 + TagIDList []string `json:"tagid_list"` +} + +// GetPrinter 获取打印员。若需要使用微信打单 PC 软件,才需要调用。 +// token 接口调用凭证 +func GetPrinter(token string) (*GetPrinterResponse, error) { + api := baseURL + apiGetPrinter + return getPrinter(api, token) +} + +func getPrinter(api, token string) (*GetPrinterResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(GetPrinterResponse) + if err := getJSON(url, res); err != nil { + return nil, err + } + + return res, nil +} + +// QuotaGetter 电子面单余额获取器 +type QuotaGetter struct { + DeliveryID string `json:"delivery_id"` // 快递公司ID,参见getAllDelivery + BizID string `json:"biz_id"` // 快递公司客户编码 +} + +// QuotaGetResponse 电子面单余额 +type QuotaGetResponse struct { + CommonError + Number uint // 电子面单余额 +} + +// Get 获取电子面单余额。仅在使用加盟类快递公司时,才可以调用。 +func (getter *QuotaGetter) Get(token string) (*QuotaGetResponse, error) { + api := baseURL + apiGetQuota + return getter.get(api, token) +} + +func (getter *QuotaGetter) get(api, token string) (*QuotaGetResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(QuotaGetResponse) + if err := postJSON(url, getter, res); err != nil { + return nil, err + } + + return res, nil +} + +// UpdateExpressOrderTester 模拟的快递公司更新订单 +type UpdateExpressOrderTester struct { + BizID string `json:"biz_id"` // 商户id,需填test_biz_id + OrderID string `json:"order_id"` // 订单ID,下单成功时返回 + WaybillID string `json:"waybill_id"` // 运单 ID + DeliveryID string `json:"delivery_id"` // 快递公司 ID + ActionTime uint `json:"action_time"` // 轨迹变化 Unix 时间戳 + ActionType uint `json:"action_type"` // 轨迹变化类型 + ActionMsg string `json:"action_msg"` // 轨迹变化具体信息说明,展示在快递轨迹详情页中。若有手机号码,则直接写11位手机号码。使用UTF-8编码。 +} + +// Test 模拟快递公司更新订单状态, 该接口只能用户测试 +func (tester *UpdateExpressOrderTester) Test(token string) (*CommonError, error) { + api := baseURL + apiTestUpdateOrder + return tester.test(api, token) +} + +func (tester *UpdateExpressOrderTester) test(api, token string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(url, tester, res); err != nil { + return nil, err + } + + return res, nil +} + +// PrinterUpdater 打印员更新器 +type PrinterUpdater struct { + OpenID string `json:"openid"` // 打印员 openid + Type BindType `json:"update_type"` // 更新类型 + TagIDList string `json:"tagid_list"` // 用于平台型小程序设置入驻方的打印员面单打印权限,同一打印员最多支持10个tagid,使用逗号分隔,如填写123,456,表示该打印员可以拉取到tagid为123和456的下的单,非平台型小程序无需填写该字段 +} + +// Update 更新打印员。若需要使用微信打单 PC 软件,才需要调用。 +func (updater *PrinterUpdater) Update(token string) (*CommonError, error) { + api := baseURL + apiUpdatePrinter + return updater.update(api, token) +} + +func (updater *PrinterUpdater) update(api, token string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(url, updater, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/express_business_test.go b/app/lib/weapp/express_business_test.go new file mode 100644 index 0000000..3fc7717 --- /dev/null +++ b/app/lib/weapp/express_business_test.go @@ -0,0 +1,954 @@ +package weapp + +import ( + "encoding/base64" + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestAddExpressOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiAddExpressOrder { + t.Fatalf("Except to path '%s',get '%s'", apiAddExpressOrder, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + AddSource uint8 `json:"add_source"` + WXAppID string `json:"wx_appid"` + OrderID string `json:"order_id"` + OpenID string `json:"openid"` + DeliveryID string `json:"delivery_id"` + BizID string `json:"biz_id"` + CustomRemark string `json:"custom_remark"` + Sender struct { + Name string `json:"name"` + Tel string `json:"tel"` + Mobile string `json:"mobile"` + Company string `json:"company"` + PostCode string `json:"post_code"` + Country string `json:"country"` + Province string `json:"province"` + City string `json:"city"` + Area string `json:"area"` + Address string `json:"address"` + } `json:"sender"` + Receiver struct { + Name string `json:"name"` + Tel string `json:"tel"` + Mobile string `json:"mobile"` + Company string `json:"company"` + PostCode string `json:"post_code"` + Country string `json:"country"` + Province string `json:"province"` + City string `json:"city"` + Area string `json:"area"` + Address string `json:"address"` + } `json:"receiver"` + Cargo struct { + Count uint `json:"count"` + Weight float64 `json:"weight"` + SpaceX float64 `json:"space_x"` + SpaceY float64 `json:"space_y"` + SpaceZ float64 `json:"space_z"` + DetailList []struct { + Name string `json:"name"` + Count uint `json:"count"` + } `json:"detail_list"` + } `json:"cargo"` + Shop struct { + WXAPath string `json:"wxa_path"` + IMGUrl string `json:"img_url"` + GoodsName string `json:"goods_name"` + GoodsCount uint `json:"goods_count"` + } `json:"shop"` + Insured struct { + Used InsureStatus `json:"use_insured"` + Value uint `json:"insured_value"` + } `json:"insured"` + Service struct { + Type uint8 `json:"service_type"` + Name string `json:"service_name"` + } `json:"service"` + ExpectTime uint `json:"expect_time"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.AddSource == 2 && params.WXAppID == "" { + t.Error("param wx_appid can not be empty") + } + if params.AddSource != 2 && params.OpenID == "" { + t.Error("param openid can not be empty") + } + if params.OrderID == "" { + t.Error("param order_id can not be empty") + } + if params.DeliveryID == "" { + t.Error("param delivery_id can not be empty") + } + + if params.BizID == "" { + t.Error("param biz_id can not be empty") + } + + if params.Sender.Name == "" { + t.Error("param sender.name can not be empty") + } + if params.Sender.Province == "" { + t.Error("param sender.province can not be empty") + } + if params.Sender.City == "" { + t.Error("param sender.city can not be empty") + } + if params.Sender.Area == "" { + t.Error("param sender.area can not be empty") + } + if params.Sender.Address == "" { + t.Error("param sender.address can not be empty") + } + if params.Receiver.Name == "" { + t.Error("param receiver.name can not be empty") + } + if params.Receiver.Province == "" { + t.Error("param receiver.province can not be empty") + } + if params.Receiver.City == "" { + t.Error("param receiver.city can not be empty") + } + if params.Receiver.Area == "" { + t.Error("param receiver.area can not be empty") + } + if params.Receiver.Address == "" { + t.Error("param receiver.address can not be empty") + } + + if params.Cargo.Count == 0 { + t.Error("param cargo.count can not be zero") + } + if params.Cargo.Weight == 0 { + t.Error("param cargo.weight can not be zero") + } + if params.Cargo.SpaceX == 0 { + t.Error("param cargo.spaceX can not be zero") + } + if params.Cargo.SpaceY == 0 { + t.Error("param cargo.spaceY can not be zero") + } + if params.Cargo.SpaceZ == 0 { + t.Error("param cargo.spaceZ can not be zero") + } + if len(params.Cargo.DetailList) == 0 { + t.Error("param cargo.detailList can not be empty") + } else { + if (params.Cargo.DetailList[0].Name) == "" { + t.Error("param cargo.detailList.name can not be empty") + } + if (params.Cargo.DetailList[0].Count) == 0 { + t.Error("param cargo.detailList.count can not be zero") + } + } + if params.Shop.WXAPath == "" { + t.Error("param shop.wxa_path can not be empty") + } + if params.Shop.IMGUrl == "" { + t.Error("param shop.img_url can not be empty") + } + if params.Shop.GoodsName == "" { + t.Error("param shop.goods_name can not be empty") + } + if params.Shop.GoodsCount == 0 { + t.Error("param shop.goods_count can not be zero") + } + if params.Insured.Used == 0 { + t.Error("param insured.use_insured can not be zero") + } + if params.Service.Name == "" { + t.Error("param Service.service_name can not be empty") + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 9300501, + "errmsg": "delivery logic fail", + "delivery_resultcode": 10002, + "delivery_resultmsg": "客户密码不正确", + "order_id": "01234567890123456789", + "waybill_id": "123456789", + "waybill_data": [ + { + "key": "SF_bagAddr", + "value": "广州" + }, + { + "key": "SF_mark", + "value": "101- 07-03 509" + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + creator := ExpressOrderCreator{ + AddSource: 0, + ExpressOrder: ExpressOrder{ + OrderID: "01234567890123456789", + OpenID: "oABC123456", + DeliveryID: "SF", + BizID: "xyz", + CustomRemark: "易碎物品", + Sender: ExpreseeUserInfo{ + "张三", + "020-88888888", + "18666666666", + "公司名", + "123456", + "中国", + "广东省", + "广州市", + "海珠区", + "XX路XX号XX大厦XX栋XX", + }, + Receiver: ExpreseeUserInfo{ + "王小蒙", + "020-77777777", + "18610000000", + "公司名", + "654321", + "中国", + "广东省", + "广州市", + "天河区", + "XX路XX号XX大厦XX栋XX", + }, + Shop: ExpressShop{ + "/index/index?from=waybill&id=01234567890123456789", + "https://mmbiz.qpic.cn/mmbiz_png/OiaFLUqewuIDNQnTiaCInIG8ibdosYHhQHPbXJUrqYSNIcBL60vo4LIjlcoNG1QPkeH5GWWEB41Ny895CokeAah8A/640", + "一千零一夜钻石包&爱马仕铂金包", + 2, + }, + Cargo: ExpressCargo{ + 2, + 5.5, + 30.5, + 20, + 20, + []CargoDetail{ + { + "一千零一夜钻石包", + 1, + }, + { + "爱马仕铂金包", + 1, + }, + }, + }, + Insured: ExpressInsure{ + 1, + 10000, + }, + Service: ExpressService{ + 0, + "标准快递", + }, + }, + } + _, err := creator.create(ts.URL+apiAddExpressOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestCancelExpressOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiCancelExpressOrder { + t.Fatalf("Except to path '%s',get '%s'", apiCancelExpressOrder, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + OrderID string `json:"order_id"` + OpenID string `json:"openid"` + DeliveryID string `json:"delivery_id"` + WaybillID string `json:"waybill_id"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.OrderID == "" { + t.Error("param order_id can not be empty") + } + if params.DeliveryID == "" { + t.Error("param delivery_id can not be empty") + } + if params.WaybillID == "" { + t.Error("param waybill_id can not be empty") + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + canceler := ExpressOrderCanceler{ + OrderID: "01234567890123456789", + OpenID: "oABC123456", + DeliveryID: "SF", + WaybillID: "123456789", + } + _, err := canceler.cancel(ts.URL+apiCancelExpressOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestGetAllDelivery(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "GET" { + t.Fatalf("Expect 'GET' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetAllDelivery { + t.Fatalf("Except to path '%s',get '%s'", apiGetAllDelivery, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "count": 8, + "data": [ + { + "delivery_id": "BEST", + "delivery_name": "百世快递" + }, + { + "delivery_id": "EMS", + "delivery_name": "中国邮政速递物流" + }, + { + "delivery_id": "OTP", + "delivery_name": "承诺达特快" + }, + { + "delivery_id": "PJ", + "delivery_name": "品骏物流" + }, + { + "delivery_id": "SF", + "delivery_name": "顺丰速运" + }, + { + "delivery_id": "YTO", + "delivery_name": "圆通速递" + }, + { + "delivery_id": "YUNDA", + "delivery_name": "韵达快递" + }, + { + "delivery_id": "ZTO", + "delivery_name": "中通快递" + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getAllDelivery(ts.URL+apiGetAllDelivery, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestGetExpressOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetExpressOrder { + t.Fatalf("Except to path '%s',get '%s'", apiGetExpressOrder, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + OrderID string `json:"order_id"` + OpenID string `json:"openid"` + DeliveryID string `json:"delivery_id"` + WaybillID string `json:"waybill_id"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.OrderID == "" { + t.Error("param order_id can not be empty") + } + if params.DeliveryID == "" { + t.Error("param delivery_id can not be empty") + } + if params.WaybillID == "" { + t.Error("param waybill_id can not be empty") + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + canceler := ExpressOrderGetter{ + OrderID: "01234567890123456789", + OpenID: "oABC123456", + DeliveryID: "SF", + WaybillID: "123456789", + } + _, err := canceler.get(ts.URL+apiGetExpressOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestGetExpressPath(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + expectedPath := "/cgi-bin/express/business/path/get" + if path != expectedPath { + t.Fatalf("Except to path '%s',get '%s'", expectedPath, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + OrderID string `json:"order_id"` + OpenID string `json:"openid"` + DeliveryID string `json:"delivery_id"` + WaybillID string `json:"waybill_id"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.OrderID == "" { + t.Error("param order_id can not be empty") + } + if params.DeliveryID == "" { + t.Error("param delivery_id can not be empty") + } + if params.WaybillID == "" { + t.Error("param waybill_id can not be empty") + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "openid": "OPENID", + "delivery_id": "SF", + "waybill_id": "12345678901234567890", + "path_item_num": 3, + "path_item_list": [ + { + "action_time": 1533052800, + "action_type": 100001, + "action_msg": "快递员已成功取件" + }, + { + "action_time": 1533062800, + "action_type": 200001, + "action_msg": "快件已到达xxx集散中心,准备发往xxx" + }, + { + "action_time": 1533072800, + "action_type": 300001, + "action_msg": "快递员已出发,联系电话xxxxxx" + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + getter := ExpressPathGetter{ + OrderID: "01234567890123456789", + OpenID: "oABC123456", + DeliveryID: "SF", + WaybillID: "123456789", + } + _, err := getter.get(ts.URL+apiGetExpressPath, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestGetPrinter(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "GET" { + t.Fatalf("Expect 'GET' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + expectedPath := "/cgi-bin/express/business/printer/getall" + if path != expectedPath { + t.Fatalf("Except to path '%s',get '%s'", expectedPath, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "count": 2, + "openid": [ + "oABC", + "oXYZ" + ], + "tagid_list": [ + "123", + "456" + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getPrinter(ts.URL+apiGetPrinter, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestGetQuota(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + expectedPath := "/cgi-bin/express/business/quota/get" + if path != expectedPath { + t.Fatalf("Except to path '%s',get '%s'", expectedPath, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + DeliveryID string `json:"delivery_id"` + BizID string `json:"biz_id"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.DeliveryID == "" { + t.Error("param delivery_id can not be empty") + } + if params.BizID == "" { + t.Error("param biz_id can not be empty") + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "quota_num": 210 + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + getter := QuotaGetter{ + DeliveryID: "YTO", + BizID: "xyz", + } + + _, err := getter.get(ts.URL+apiGetQuota, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestOnPathUpdate(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + aesKey := base64.StdEncoding.EncodeToString([]byte("mock-aes-key")) + srv, err := NewServer("mock-app-id", "mock-access-token", aesKey, "mock-mch-id", "mock-api-key", false) + if err != nil { + t.Fatal(err) + } + + srv.OnExpressPathUpdate(func(mix *ExpressPathUpdateResult) { + if mix.ToUserName == "" { + t.Error("ToUserName can not be empty") + } + + if mix.FromUserName == "" { + t.Error("FromUserName can not be empty") + } + if mix.CreateTime == 0 { + t.Error("CreateTime can not be zero") + } + if mix.MsgType != "event" { + t.Error("Unexpected message type") + } + + if mix.Event != "add_express_path" { + t.Error("Unexpected message event") + } + + if mix.DeliveryID == "" { + t.Error("DeliveryID can not be empty") + } + if mix.WayBillID == "" { + t.Error("WayBillID can not be empty") + } + if mix.Version == 0 { + t.Error("Version can not be zero") + } + if mix.Count == 0 { + t.Error("Count can not be zero") + } + + if len(mix.Actions) > 0 { + if mix.Actions[0].ActionTime == 0 { + t.Error("Actions.ActionTime can not be zero") + } + if mix.Actions[0].ActionType == 0 { + t.Error("Actions.ActionType can not be zero") + } + if mix.Actions[0].ActionMsg == "" { + t.Error("Actions.ActionMsg can not be empty") + } + } + }) + + if err := srv.Serve(w, r); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + xmlData := ` + + + 1546924844 + + + + + 3 + 3 + + 1546924840 + 100001 + + + + 1546924841 + 200001 + + + + 1546924842 + 200001 + + + ` + res, err := http.Post(ts.URL, "text/xml", strings.NewReader(xmlData)) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + jsonData := `{ + "ToUserName": "toUser", + "FromUserName": "fromUser", + "CreateTime": 1546924844, + "MsgType": "event", + "Event": "add_express_path", + "DeliveryID": "SF", + "WayBillId": "123456789", + "Version": 2, + "Count": 3, + "Actions": [ + { + "ActionTime": 1546924840, + "ActionType": 100001, + "ActionMsg": "小哥A揽件成功" + }, + { + "ActionTime": 1546924841, + "ActionType": 200001, + "ActionMsg": "到达广州集包地" + }, + { + "ActionTime": 1546924842, + "ActionType": 200001, + "ActionMsg": "运往目的地" + } + ] + }` + res, err = http.Post(ts.URL, "application/json", strings.NewReader(jsonData)) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() +} + +func TestTestUpdateOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + expectedPath := "/cgi-bin/express/business/test_update_order" + if path != expectedPath { + t.Fatalf("Except to path '%s',get '%s'", expectedPath, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + BizID string `json:"biz_id"` // 商户id,需填test_biz_id + OrderID string `json:"order_id"` // 订单ID,下单成功时返回 + WaybillID string `json:"waybill_id"` // 运单 ID + DeliveryID string `json:"delivery_id"` // 快递公司 ID + ActionTime uint `json:"action_time"` // 轨迹变化 Unix 时间戳 + ActionType int `json:"action_type"` // 轨迹变化类型 + ActionMsg string `json:"action_msg"` // 轨迹变化具体信息说明,展示在快递轨迹详情页中。若有手机号码,则直接写11位手机号码。使用UTF-8编码。 + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.DeliveryID == "" { + t.Error("param delivery_id can not be empty") + } + if params.OrderID == "" { + t.Error("param order_id can not be empty") + } + if params.WaybillID == "" { + t.Error("param waybill_id can not be empty") + } + + if params.BizID == "" { + t.Error("param biz_id can not be empty") + } + if params.ActionMsg == "" { + t.Error("param action_msg can not be empty") + } + if params.ActionTime == 0 { + t.Error("param action_time can not be empty") + } + if params.ActionType == 0 { + t.Error("param action_type can not be empty") + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + params := `{ + "biz_id": "test_biz_id", + "order_id": "xxxxxxxxxxxx", + "delivery_id": "TEST", + "waybill_id": "xxxxxxxxxx", + "action_time": 123456789, + "action_type": 100001, + "action_msg": "揽件阶段" + }` + + tester := new(UpdateExpressOrderTester) + err := json.Unmarshal([]byte(params), tester) + if err != nil { + t.Error(err) + } + + _, err = tester.test(ts.URL+apiTestUpdateOrder, "mock-access-token") + if err != nil { + t.Error(err) + } +} + +func TestUpdatePrinter(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != "/cgi-bin/express/business/printer/update" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + OpenID string `json:"openid"` // 打印员 openid + Type BindType `json:"update_type"` // 更新类型 + TagIDList string `json:"tagid_list"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.OpenID == "" { + t.Error("param openid can not be empty") + } + if params.Type == "" { + t.Error("param update_type can not be empty") + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + params := `{ + "openid": "oJ4v0wRAfiXcnIbM3SgGEUkTw3Qw", + "update_type": "bind", + "tagid_list": "123,456" + }` + updater := new(PrinterUpdater) + err := json.Unmarshal([]byte(params), updater) + if err != nil { + t.Fatal(err) + } + + _, err = updater.update(ts.URL+apiUpdatePrinter, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/express_provider.go b/app/lib/weapp/express_provider.go new file mode 100644 index 0000000..0b7ef69 --- /dev/null +++ b/app/lib/weapp/express_provider.go @@ -0,0 +1,154 @@ +package weapp + +const ( + apiGetContact = "/cgi-bin/express/delivery/contact/get" + apiPreviewTemplate = "/cgi-bin/express/delivery/template/preview" + apiUpdateBusiness = "/cgi-bin/express/delivery/service/business/update" + apiUpdatePath = "/cgi-bin/express/delivery/path/update" +) + +// GetContactResponse 获取面单联系人信息返回数据 +type GetContactResponse struct { + CommonError + WaybillID string `json:"waybill_id"` // 运单 ID + Sender ContactUser `json:"sender"` // 发件人信息 + Receiver ContactUser `json:"receiver"` // 收件人信息 +} + +// ContactUser 联系人 +type ContactUser struct { + Address string `json:"address"` //地址,已经将省市区信息合并 + Name string `json:"name"` //用户姓名 + Tel string `json:"tel"` //座机号码 + Mobile string `json:"mobile"` //手机号码 +} + +// GetContact 获取面单联系人信息 +// accessToken, token, watBillID 接口调用凭证 +func GetContact(accessToken, token, watBillID string) (*GetContactResponse, error) { + api := baseURL + apiGetContact + return getContact(api, accessToken, token, watBillID) +} + +func getContact(api, accessToken, token, watBillID string) (*GetContactResponse, error) { + url, err := tokenAPI(api, accessToken) + if err != nil { + return nil, err + } + + params := requestParams{ + "token": token, + "waybill_id": watBillID, + } + + res := new(GetContactResponse) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// ExpressTemplatePreviewer 面单模板预览器 +type ExpressTemplatePreviewer struct { + WaybillID string `json:"waybill_id"` // 运单 ID + WaybillTemplate string `json:"waybill_template"` // 面单 HTML 模板内容(需经 Base64 编码) + WaybillData string `json:"waybill_data"` // 面单数据。详情参考下单事件返回值中的 WaybillData + Custom ExpressOrder `json:"custom"` // 商户下单数据,格式是商户侧下单 API 中的请求体 +} + +// PreviewTemplateResponse 预览面单模板返回数据 +type PreviewTemplateResponse struct { + CommonError + WaybillID string `json:"waybill_id"` // 运单 ID + RenderedWaybillTemplate string `json:"rendered_waybill_template"` // 渲染后的面单 HTML 文件(已经过 Base64 编码) +} + +// Preview 预览面单模板。用于调试面单模板使用。 +// token 接口调用凭证 +func (previewer *ExpressTemplatePreviewer) Preview(token string) (*PreviewTemplateResponse, error) { + api := baseURL + apiPreviewTemplate + return previewer.preview(api, token) +} + +func (previewer *ExpressTemplatePreviewer) preview(api, token string) (*PreviewTemplateResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(PreviewTemplateResponse) + if err := postJSON(url, previewer, res); err != nil { + return nil, err + } + + return res, nil +} + +// BusinessResultCode 商户审核结果状态码 +type BusinessResultCode = int8 + +// 所有商户审核结果状态码 +const ( + ResultSuccess BusinessResultCode = 0 // 审核通过 + ResultFailed = 1 // 审核失败 +) + +// BusinessUpdater 商户审核结果更新器 +type BusinessUpdater struct { + ShopAppID string `json:"shop_app_id"` // 商户的小程序AppID,即审核商户事件中的 ShopAppID + BizID string `json:"biz_id"` // 商户账户 + ResultCode BusinessResultCode `json:"result_code"` // 审核结果,0 表示审核通过,其他表示审核失败 + ResultMsg string `json:"result_msg,omitempty"` // 审核错误原因,仅 result_code 不等于 0 时需要设置 +} + +// Update 更新商户审核结果 +// token 接口调用凭证 +func (updater *BusinessUpdater) Update(token string) (*CommonError, error) { + api := baseURL + apiUpdateBusiness + return updater.update(api, token) +} + +func (updater *BusinessUpdater) update(api, token string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(url, updater, res); err != nil { + return nil, err + } + + return res, nil +} + +// ExpressPathUpdater 运单轨迹更新器 +type ExpressPathUpdater struct { + Token string `json:"token"` // 商户侧下单事件中推送的 Token 字段 + WaybillID string `json:"waybill_id"` // 运单 ID + ActionTime uint `json:"action_time"` // 轨迹变化 Unix 时间戳 + ActionType uint `json:"action_type"` // 轨迹变化类型 + ActionMsg string `json:"action_msg"` // 轨迹变化具体信息说明,展示在快递轨迹详情页中。若有手机号码,则直接写11位手机号码。使用UTF-8编码。 +} + +// Update 更新运单轨迹 +// token 接口调用凭证 +func (updater *ExpressPathUpdater) Update(token string) (*CommonError, error) { + api := baseURL + apiUpdatePath + return updater.update(api, token) +} + +func (updater *ExpressPathUpdater) update(api, token string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(url, updater, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/express_provider_test.go b/app/lib/weapp/express_provider_test.go new file mode 100644 index 0000000..0d6b7c9 --- /dev/null +++ b/app/lib/weapp/express_provider_test.go @@ -0,0 +1,1332 @@ +package weapp + +import ( + "encoding/base64" + "encoding/json" + "encoding/xml" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestGetContact(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != "/cgi-bin/express/delivery/contact/get" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Token string `json:"token"` + WaybillID string `json:"waybill_id"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Token == "" { + t.Error("param token can not be empty") + } + if params.WaybillID == "" { + t.Error("param waybill_id can not be empty") + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "waybill_id": "12345678901234567890", + "sender": { + "address": "广东省广州市海珠区XX路XX号XX大厦XX栋XX", + "name": "张三", + "tel": "020-88888888", + "mobile": "18666666666" + }, + "receiver": { + "address": "广东省广州市天河区XX路XX号XX大厦XX栋XX", + "name": "王小蒙", + "tel": "029-77777777", + "mobile": "18610000000" + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getContact(ts.URL+apiGetContact, "mock-access-token", "mock-token", "mock-wat-bill-id") + if err != nil { + t.Fatal(err) + } +} + +func TestOnAddExpressOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + aesKey := base64.StdEncoding.EncodeToString([]byte("mock-aes-key")) + srv, err := NewServer("mock-app-id", "mock-access-token", aesKey, "mock-mch-id", "mock-api-key", false) + if err != nil { + t.Fatal(err) + } + + srv.OnAddExpressOrder(func(result *AddExpressOrderResult) *AddExpressOrderReturn { + if result.ToUserName == "" { + t.Error("ToUserName can not be empty") + } + if result.FromUserName == "" { + t.Error("FromUserName can not be empty") + } + if result.CreateTime == 0 { + t.Error("CreateTime can not be zero") + } + if result.MsgType != "event" { + t.Error("Unexpected message type") + } + if result.Event != "add_waybill" { + t.Error("Unexpected message event") + } + if result.Token == "" { + t.Error("Result column 'Token' can not be empty") + } + if result.OrderID == "" { + t.Error("Result column 'OrderID' can not be empty") + } + if result.BizID == "" { + t.Error("Result column 'BizID' can not be empty") + } + if result.BizPwd == "" { + t.Error("Result column 'BizPwd' can not be empty") + } + if result.ShopAppID == "" { + t.Error("Result column 'ShopAppID' can not be empty") + } + if result.WayBillID == "" { + t.Error("Result column 'WayBillID' can not be empty") + } + if result.Remark == "" { + t.Error("Result column 'Remark' can not be empty") + } + + if result.Sender.Name == "" { + t.Error("Result column 'Sender.Name' can not be empty") + } + if result.Sender.Tel == "" { + t.Error("Result column 'Sender.Tel' can not be empty") + } + if result.Sender.Mobile == "" { + t.Error("Result column 'Sender.Mobile' can not be empty") + } + if result.Sender.Company == "" { + t.Error("Result column 'Sender.Company' can not be empty") + } + if result.Sender.PostCode == "" { + t.Error("Result column 'Sender.PostCode' can not be empty") + } + if result.Sender.Country == "" { + t.Error("Result column 'Sender.Country' can not be empty") + } + if result.Sender.Province == "" { + t.Error("Result column 'Sender.Province' can not be empty") + } + if result.Sender.City == "" { + t.Error("Result column 'Sender.City' can not be empty") + } + if result.Sender.Area == "" { + t.Error("Result column 'Sender.Area' can not be empty") + } + if result.Sender.Address == "" { + t.Error("Result column 'Sender.Address' can not be empty") + } + if result.Receiver.Name == "" { + t.Error("Result column 'Receiver.Name' can not be empty") + } + if result.Receiver.Tel == "" { + t.Error("Result column 'Receiver.Tel' can not be empty") + } + if result.Receiver.Mobile == "" { + t.Error("Result column 'Receiver.Mobile' can not be empty") + } + if result.Receiver.Company == "" { + t.Error("Result column 'Receiver.Company' can not be empty") + } + if result.Receiver.PostCode == "" { + t.Error("Result column 'Receiver.PostCode' can not be empty") + } + if result.Receiver.Country == "" { + t.Error("Result column 'Receiver.Country' can not be empty") + } + if result.Receiver.Province == "" { + t.Error("Result column 'Receiver.Province' can not be empty") + } + if result.Receiver.City == "" { + t.Error("Result column 'Receiver.City' can not be empty") + } + if result.Receiver.Area == "" { + t.Error("Result column 'Receiver.Area' can not be empty") + } + if result.Receiver.Address == "" { + t.Error("Result column 'Receiver.Address' can not be empty") + } + if result.Cargo.Weight == 0 { + t.Error("Result column 'Cargo.Weight' can not be zero") + } + if result.Cargo.SpaceX == 0 { + t.Error("Result column 'Cargo.SpaceX' can not be zero") + } + if result.Cargo.SpaceY == 0 { + t.Error("Result column 'Cargo.SpaceY' can not be zero") + } + if result.Cargo.SpaceZ == 0 { + t.Error("Result column 'Cargo.SpaceZ' can not be zero") + } + if result.Cargo.Count == 0 { + t.Error("Result column 'Cargo.Count' can not be zero") + } + if result.Insured.Used == 0 { + t.Error("Result column 'Insured.Used' can not be zero") + } + if result.Insured.Value == 0 { + t.Error("Result column 'Insured.Value' can not be zero") + } + if result.Service.Type == 0 { + t.Error("Result column 'Service.Type' can not be zero") + } + if result.Service.Name == "" { + t.Error("Result column 'Service.Name' can not be empty") + } + + res := AddExpressOrderReturn{ + CommonServerReturn: CommonServerReturn{ + "oABCD", "gh_abcdefg", 1533042556, "event", "add_waybill", 1, "success", + }, + Token: "1234ABC234523451", + OrderID: "012345678901234567890123456789", + BizID: "xyz", + WayBillID: "123456789", + WaybillData: "##ZTO_bagAddr##广州##ZTO_mark##888-666-666##", + } + + return &res + }) + + if err := srv.Serve(w, r); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + xmlData := ` + + + 1533042556 + + + 1234ABC234523451 + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + +
+
+ + 1.2 + 20.5 + 15.0 + 10.0 + 2 + + + 1 + + + + 1 + + + + 1 + 10000 + + + 123 + + +
` + xmlResp, err := http.Post(ts.URL, "text/xml", strings.NewReader(xmlData)) + if err != nil { + t.Error(err) + } + defer xmlResp.Body.Close() + res := new(AddExpressOrderReturn) + if err := xml.NewDecoder(xmlResp.Body).Decode(res); err != nil { + t.Error(err) + } + + if res.ToUserName == "" { + t.Error("Response column 'ToUserName' can not be empty") + } + if res.FromUserName == "" { + t.Error("Response column 'FromUserName' can not be empty") + } + if res.CreateTime == 0 { + t.Error("Response column 'CreateTime' can not be zero") + } + if res.MsgType == "" { + t.Error("Response column 'MsgType' can not be empty") + } + if res.Event == "" { + t.Error("Response column 'Event' can not be empty") + } + if res.Token == "" { + t.Error("Response column 'Token' can not be empty") + } + if res.OrderID == "" { + t.Error("Response column 'OrderID' can not be empty") + } + if res.BizID == "" { + t.Error("Response column 'BizID' can not be empty") + } + if res.WayBillID == "" { + t.Error("Response column 'WayBillID' can not be empty") + } + + if res.ResultMsg == "" { + t.Error("Response column 'ResultMsg' can not be empty") + } + if res.WaybillData == "" { + t.Error("Response column 'WaybillData' can not be empty") + } + + jsonData := `{ + "ToUserName": "gh_abcdefg", + "FromUserName": "oABCD", + "CreateTime": 1533042556, + "MsgType": "event", + "Event": "add_waybill", + "Token": "1234ABC234523451", + "OrderID": "012345678901234567890123456789", + "BizID": "xyz", + "BizPwd": "xyz123", + "ShopAppID": "wxABCD", + "WayBillID": "123456789", + "Remark": "易碎物品", + "Sender": { + "Name": "张三", + "Tel": "020-88888888", + "Mobile": "18666666666", + "Company": "公司名", + "PostCode": "123456", + "Country": "中国", + "Province": "广东省", + "City": "广州市", + "Area": "海珠区", + "Address": "XX路XX号XX大厦XX栋XX" + }, + "Receiver": { + "Name": "王小蒙", + "Tel": "029-77777777", + "Mobile": "18610000000", + "Company": "公司名", + "PostCode": "654321", + "Country": "中国", + "Province": "广东省", + "City": "广州市", + "Area": "天河区", + "Address": "XX路XX号XX大厦XX栋XX" + }, + "Cargo": { + "Weight": 1.2, + "Space_X": 20.5, + "Space_Y": 15, + "Space_Z": 10, + "Count": 2, + "DetailList": [ + { + "Name": "一千零一夜钻石包", + "Count": 1 + }, + { + "Name": "爱马仕柏金钻石包", + "Count": 1 + } + ] + }, + "Insured": { + "UseInsured": 1, + "InsuredValue": 10000 + }, + "Service": { + "ServiceType": 123, + "ServiceName": "标准快递" + } + }` + + jsonResp, err := http.Post(ts.URL, "application/json", strings.NewReader(jsonData)) + if err != nil { + t.Error(err) + } + defer jsonResp.Body.Close() + res = new(AddExpressOrderReturn) + if err := json.NewDecoder(jsonResp.Body).Decode(res); err != nil { + t.Error(err) + } + + if res.ToUserName == "" { + t.Error("Response column 'ToUserName' can not be empty") + } + if res.FromUserName == "" { + t.Error("Response column 'FromUserName' can not be empty") + } + if res.CreateTime == 0 { + t.Error("Response column 'CreateTime' can not be zero") + } + if res.MsgType == "" { + t.Error("Response column 'MsgType' can not be empty") + } + if res.Event == "" { + t.Error("Response column 'Event' can not be empty") + } + if res.Token == "" { + t.Error("Response column 'Token' can not be empty") + } + if res.OrderID == "" { + t.Error("Response column 'OrderID' can not be empty") + } + if res.BizID == "" { + t.Error("Response column 'BizID' can not be empty") + } + if res.WayBillID == "" { + t.Error("Response column 'WayBillID' can not be empty") + } + + if res.ResultMsg == "" { + t.Error("Response column 'ResultMsg' can not be empty") + } + if res.WaybillData == "" { + t.Error("Response column 'WaybillData' can not be empty") + } +} + +func TestOnCancelExpressOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + aesKey := base64.StdEncoding.EncodeToString([]byte("mock-aes-key")) + srv, err := NewServer("mock-app-id", "mock-access-token", aesKey, "mock-mch-id", "mock-api-key", false) + if err != nil { + t.Fatal(err) + } + + srv.OnCancelExpressOrder(func(result *CancelExpressOrderResult) *CancelExpressOrderReturn { + if result.ToUserName == "" { + t.Error("ToUserName can not be empty") + } + if result.FromUserName == "" { + t.Error("FromUserName can not be empty") + } + if result.CreateTime == 0 { + t.Error("CreateTime can not be zero") + } + if result.MsgType != "event" { + t.Error("Unexpected message type") + } + if result.Event != "cancel_waybill" { + t.Error("Unexpected message event") + } + + if result.OrderID == "" { + t.Error("Result column 'OrderID' can not be empty") + } + if result.BizID == "" { + t.Error("Result column 'BizID' can not be empty") + } + if result.BizPwd == "" { + t.Error("Result column 'BizPwd' can not be empty") + } + if result.ShopAppID == "" { + t.Error("Result column 'ShopAppID' can not be empty") + } + if result.WayBillID == "" { + t.Error("Result column 'WayBillID' can not be empty") + } + + res := CancelExpressOrderReturn{ + CommonServerReturn: CommonServerReturn{ + "oABCD", "gh_abcdefg", 1533042556, "event", "cancel_waybill", 1, "success", + }, + OrderID: "012345678901234567890123456789", + BizID: "xyz", + WayBillID: "123456789", + } + + return &res + }) + + if err := srv.Serve(w, r); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + xmlData := ` + + + 1533042556 + + + + + + + +` + xmlResp, err := http.Post(ts.URL, "text/xml", strings.NewReader(xmlData)) + if err != nil { + t.Error(err) + } + defer xmlResp.Body.Close() + res := new(CancelExpressOrderReturn) + if err := xml.NewDecoder(xmlResp.Body).Decode(res); err != nil { + t.Error(err) + } + + if res.ToUserName == "" { + t.Error("Response column 'ToUserName' can not be empty") + } + if res.FromUserName == "" { + t.Error("Response column 'FromUserName' can not be empty") + } + if res.CreateTime == 0 { + t.Error("Response column 'CreateTime' can not be zero") + } + if res.MsgType == "" { + t.Error("Response column 'MsgType' can not be empty") + } + if res.Event == "" { + t.Error("Response column 'Event' can not be empty") + } + if res.OrderID == "" { + t.Error("Response column 'OrderID' can not be empty") + } + if res.BizID == "" { + t.Error("Response column 'BizID' can not be empty") + } + if res.WayBillID == "" { + t.Error("Response column 'WayBillID' can not be empty") + } + + if res.ResultMsg == "" { + t.Error("Response column 'ResultMsg' can not be empty") + } + + jsonData := `{ + "ToUserName": "gh_abcdefg", + "FromUserName": "oABCD", + "CreateTime": 1533042556, + "MsgType": "event", + "Event": "cancel_waybill", + "BizID": "xyz", + "BizPwd": "xyz123", + "ShopAppID": "wxABCD", + "OrderID": "012345678901234567890123456789", + "WayBillID": "123456789" + }` + + jsonResp, err := http.Post(ts.URL, "application/json", strings.NewReader(jsonData)) + if err != nil { + t.Error(err) + } + defer jsonResp.Body.Close() + res = new(CancelExpressOrderReturn) + if err := json.NewDecoder(jsonResp.Body).Decode(res); err != nil { + t.Error(err) + } + + if res.ToUserName == "" { + t.Error("Response column 'ToUserName' can not be empty") + } + if res.FromUserName == "" { + t.Error("Response column 'FromUserName' can not be empty") + } + if res.CreateTime == 0 { + t.Error("Response column 'CreateTime' can not be zero") + } + if res.MsgType == "" { + t.Error("Response column 'MsgType' can not be empty") + } + if res.Event == "" { + t.Error("Response column 'Event' can not be empty") + } + if res.OrderID == "" { + t.Error("Response column 'OrderID' can not be empty") + } + if res.BizID == "" { + t.Error("Response column 'BizID' can not be empty") + } + if res.WayBillID == "" { + t.Error("Response column 'WayBillID' can not be empty") + } + + if res.ResultMsg == "" { + t.Error("Response column 'ResultMsg' can not be empty") + } +} + +func TestOnCheckBusiness(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + aesKey := base64.StdEncoding.EncodeToString([]byte("mock-aes-key")) + srv, err := NewServer("mock-app-id", "mock-access-token", aesKey, "mock-mch-id", "mock-api-key", false) + if err != nil { + t.Fatal(err) + } + + srv.OnCheckExpressBusiness(func(result *CheckExpressBusinessResult) *CheckExpressBusinessReturn { + if result.ToUserName == "" { + t.Error("ToUserName can not be empty") + } + if result.FromUserName == "" { + t.Error("FromUserName can not be empty") + } + if result.CreateTime == 0 { + t.Error("CreateTime can not be zero") + } + if result.MsgType != "event" { + t.Error("Unexpected message type") + } + if result.Event != "check_biz" { + t.Error("Unexpected message event") + } + + if result.BizID == "" { + t.Error("Result column 'BizID' can not be empty") + } + if result.BizPwd == "" { + t.Error("Result column 'BizPwd' can not be empty") + } + if result.ShopAppID == "" { + t.Error("Result column 'ShopAppID' can not be empty") + } + if result.ShopName == "" { + t.Error("Result column 'ShopName' can not be empty") + } + + if result.ShopTelphone == "" { + t.Error("Result column 'ShopTelphone' can not be empty") + } + if result.SenderAddress == "" { + t.Error("Result column 'SenderAddress' can not be empty") + } + if result.ShopContact == "" { + t.Error("Result column 'ShopContact' can not be empty") + } + if result.ServiceName == "" { + t.Error("Result column 'ServiceName' can not be empty") + } + + res := CheckExpressBusinessReturn{ + CommonServerReturn: CommonServerReturn{ + "oABCD", "gh_abcdefg", 1533042556, "event", "check_biz", 1, "success", + }, + BizID: "xyz", + Quota: 3.14159265358, + } + return &res + }) + + if err := srv.Serve(w, r); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + xmlData := ` + + + 1533042556 + + + + + + + + + + +` + xmlResp, err := http.Post(ts.URL, "text/xml", strings.NewReader(xmlData)) + if err != nil { + t.Error(err) + } + defer xmlResp.Body.Close() + res := new(CheckExpressBusinessReturn) + if err := xml.NewDecoder(xmlResp.Body).Decode(res); err != nil { + t.Error(err) + } + + if res.ToUserName == "" { + t.Error("Response column 'ToUserName' can not be empty") + } + if res.FromUserName == "" { + t.Error("Response column 'FromUserName' can not be empty") + } + if res.CreateTime == 0 { + t.Error("Response column 'CreateTime' can not be zero") + } + if res.MsgType == "" { + t.Error("Response column 'MsgType' can not be empty") + } + if res.Event == "" { + t.Error("Response column 'Event' can not be empty") + } + if res.Quota == 0 { + t.Error("Response column 'Quota' can not be zero") + } + if res.BizID == "" { + t.Error("Response column 'BizID' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response column 'ResultMsg' can not be empty") + } + + jsonData := `{ + "ToUserName": "gh_abcdefg", + "FromUserName": "oABCD", + "CreateTime": 1533042556, + "MsgType": "event", + "Event": "check_biz", + "BizID": "xyz", + "BizPwd": "xyz123", + "ShopAppID": "wxABCD", + "ShopName": "商户名称", + "ShopTelphone": "18677778888", + "ShopContact": "村正", + "ServiceName": "标准快递", + "SenderAddress": "广东省广州市海珠区新港中路397号" + }` + + jsonResp, err := http.Post(ts.URL, "application/json", strings.NewReader(jsonData)) + if err != nil { + t.Error(err) + } + defer jsonResp.Body.Close() + res = new(CheckExpressBusinessReturn) + if err := json.NewDecoder(jsonResp.Body).Decode(res); err != nil { + t.Error(err) + } + + if res.ToUserName == "" { + t.Error("Response column 'ToUserName' can not be empty") + } + if res.FromUserName == "" { + t.Error("Response column 'FromUserName' can not be empty") + } + if res.CreateTime == 0 { + t.Error("Response column 'CreateTime' can not be zero") + } + if res.MsgType == "" { + t.Error("Response column 'MsgType' can not be empty") + } + if res.Event == "" { + t.Error("Response column 'Event' can not be empty") + } + if res.Quota == 0 { + t.Error("Response column 'Quota' can not be zero") + } + if res.BizID == "" { + t.Error("Response column 'BizID' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response column 'ResultMsg' can not be empty") + } +} + +func TestOnGetExpressQuota(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + aesKey := base64.StdEncoding.EncodeToString([]byte("mock-aes-key")) + srv, err := NewServer("mock-app-id", "mock-access-token", aesKey, "mock-mch-id", "mock-api-key", false) + if err != nil { + t.Fatal(err) + } + + srv.OnGetExpressQuota(func(result *GetExpressQuotaResult) *GetExpressQuotaReturn { + if result.ToUserName == "" { + t.Error("ToUserName can not be empty") + } + if result.FromUserName == "" { + t.Error("FromUserName can not be empty") + } + if result.CreateTime == 0 { + t.Error("CreateTime can not be zero") + } + if result.MsgType != "event" { + t.Error("Unexpected message type") + } + if result.Event != "get_quota" { + t.Error("Unexpected message event") + } + + if result.BizID == "" { + t.Error("Result column 'BizID' can not be empty") + } + if result.BizPwd == "" { + t.Error("Result column 'BizPwd' can not be empty") + } + if result.ShopAppID == "" { + t.Error("Result column 'ShopAppID' can not be empty") + } + + res := GetExpressQuotaReturn{ + CommonServerReturn: CommonServerReturn{ + "oABCD", "gh_abcdefg", 1533042556, "event", "get_quota", 1, "success", + }, + BizID: "xyz", + Quota: 3.14159265358, + } + return &res + }) + + if err := srv.Serve(w, r); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + xmlData := ` + + + 1533042556 + + + + + +` + xmlResp, err := http.Post(ts.URL, "text/xml", strings.NewReader(xmlData)) + if err != nil { + t.Error(err) + } + defer xmlResp.Body.Close() + res := new(GetExpressQuotaReturn) + if err := xml.NewDecoder(xmlResp.Body).Decode(res); err != nil { + t.Error(err) + } + + if res.ToUserName == "" { + t.Error("Response column 'ToUserName' can not be empty") + } + if res.FromUserName == "" { + t.Error("Response column 'FromUserName' can not be empty") + } + if res.CreateTime == 0 { + t.Error("Response column 'CreateTime' can not be zero") + } + if res.MsgType == "" { + t.Error("Response column 'MsgType' can not be empty") + } + if res.Event != "get_quota" { + t.Error("Invalid event") + } + if res.Quota == 0 { + t.Error("Response column 'Quota' can not be zero") + } + if res.BizID == "" { + t.Error("Response column 'BizID' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response column 'ResultMsg' can not be empty") + } + + jsonData := `{ + "ToUserName": "gh_abcdefg", + "FromUserName": "oABCD", + "CreateTime": 1533042556, + "MsgType": "event", + "Event": "get_quota", + "BizID": "xyz", + "BizPwd": "xyz123", + "ShopAppID": "wxABCD" + }` + + jsonResp, err := http.Post(ts.URL, "application/json", strings.NewReader(jsonData)) + if err != nil { + t.Error(err) + } + defer jsonResp.Body.Close() + res = new(GetExpressQuotaReturn) + if err := json.NewDecoder(jsonResp.Body).Decode(res); err != nil { + t.Error(err) + } + if res.ToUserName == "" { + t.Error("Response column 'ToUserName' can not be empty") + } + if res.FromUserName == "" { + t.Error("Response column 'FromUserName' can not be empty") + } + if res.CreateTime == 0 { + t.Error("Response column 'CreateTime' can not be zero") + } + if res.MsgType == "" { + t.Error("Response column 'MsgType' can not be empty") + } + if res.Event != "get_quota" { + t.Error("Invalid event") + } + if res.Quota == 0 { + t.Error("Response column 'Quota' can not be zero") + } + if res.BizID == "" { + t.Error("Response column 'BizID' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response column 'ResultMsg' can not be empty") + } +} + +func TestPreviewTemplate(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/delivery/template/preview" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + WaybillTemplate string `json:"waybill_template"` + WaybillData string `json:"waybill_data"` + Custom struct { + OrderID string `json:"order_id"` + OpenID string `json:"openid"` + DeliveryID string `json:"delivery_id"` + BizID string `json:"biz_id"` + CustomRemark string `json:"custom_remark"` + Sender struct { + Name string `json:"name"` + Tel string `json:"tel"` + Mobile string `json:"mobile"` + Company string `json:"company"` + PostCode string `json:"post_code"` + Country string `json:"country"` + Province string `json:"province"` + City string `json:"city"` + Area string `json:"area"` + Address string `json:"address"` + } `json:"sender"` + Receiver struct { + Name string `json:"name"` + Tel string `json:"tel"` + Mobile string `json:"mobile"` + Company string `json:"company"` + PostCode string `json:"post_code"` + Country string `json:"country"` + Province string `json:"province"` + City string `json:"city"` + Area string `json:"area"` + Address string `json:"address"` + } `json:"receiver"` + Cargo struct { + Count uint `json:"count"` + Weight float64 `json:"weight"` + SpaceX float64 `json:"space_x"` + SpaceY float64 `json:"space_y"` + SpaceZ float64 `json:"space_z"` + DetailList []struct { + Name string `json:"name"` + Count uint `json:"count"` + } `json:"detail_list"` + } `json:"cargo"` + Shop struct { + WXAPath string `json:"wxa_path"` + IMGUrl string `json:"img_url"` + GoodsName string `json:"goods_name"` + GoodsCount uint `json:"goods_count"` + } `json:"shop"` + Insured struct { + Used InsureStatus `json:"use_insured"` + Value uint `json:"insured_value"` + } `json:"insured"` + Service struct { + Type uint8 `json:"service_type"` + Name string `json:"service_name"` + } `json:"service"` + } `json:"custom"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.WaybillTemplate == "" { + t.Error("Response column waybill_template can not be empty") + } + if params.WaybillData == "" { + t.Error("Response column waybill_data can not be empty") + } + if params.Custom.OrderID == "" { + t.Error("param custom.order_id can not be empty") + } + if params.Custom.DeliveryID == "" { + t.Error("param custom.delivery_id can not be empty") + } + + if params.Custom.BizID == "" { + t.Error("param custom.biz_id can not be empty") + } + + if params.Custom.Sender.Name == "" { + t.Error("param custom.sender.name can not be empty") + } + if params.Custom.Sender.Province == "" { + t.Error("param custom.sender.province can not be empty") + } + if params.Custom.Sender.City == "" { + t.Error("param custom.sender.city can not be empty") + } + if params.Custom.Sender.Area == "" { + t.Error("param custom.sender.area can not be empty") + } + if params.Custom.Sender.Address == "" { + t.Error("param custom.sender.address can not be empty") + } + if params.Custom.Receiver.Name == "" { + t.Error("param custom.receiver.name can not be empty") + } + if params.Custom.Receiver.Province == "" { + t.Error("param custom.receiver.province can not be empty") + } + if params.Custom.Receiver.City == "" { + t.Error("param custom.receiver.city can not be empty") + } + if params.Custom.Receiver.Area == "" { + t.Error("param custom.receiver.area can not be empty") + } + if params.Custom.Receiver.Address == "" { + t.Error("param custom.receiver.address can not be empty") + } + + if params.Custom.Cargo.Count == 0 { + t.Error("param custom.cargo.count can not be zero") + } + if params.Custom.Cargo.Weight == 0 { + t.Error("param custom.cargo.weight can not be zero") + } + if params.Custom.Cargo.SpaceX == 0 { + t.Error("param custom.cargo.spaceX can not be zero") + } + if params.Custom.Cargo.SpaceY == 0 { + t.Error("param custom.cargo.spaceY can not be zero") + } + if params.Custom.Cargo.SpaceZ == 0 { + t.Error("param custom.cargo.spaceZ can not be zero") + } + if len(params.Custom.Cargo.DetailList) == 0 { + t.Error("param cargo.custom.detailList can not be empty") + } else { + if (params.Custom.Cargo.DetailList[0].Name) == "" { + t.Error("param custom.cargo.detailList.name can not be empty") + } + if (params.Custom.Cargo.DetailList[0].Count) == 0 { + t.Error("param custom.cargo.detailList.count can not be zero") + } + } + if params.Custom.Shop.WXAPath == "" { + t.Error("param custom.shop.wxa_path can not be empty") + } + if params.Custom.Shop.IMGUrl == "" { + t.Error("param custom.shop.img_url can not be empty") + } + if params.Custom.Shop.GoodsName == "" { + t.Error("param custom.shop.goods_name can not be empty") + } + if params.Custom.Shop.GoodsCount == 0 { + t.Error("param custom.shop.goods_count can not be zero") + } + if params.Custom.Insured.Used == 0 { + t.Error("param custom.insured.use_insured can not be zero") + } + if params.Custom.Service.Name == "" { + t.Error("param custom.service.service_name can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "waybill_id": "1234567890123", + "rendered_waybill_template": "PGh0bWw+dGVzdDwvaHRtbD4=" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "waybill_id": "1234567890123", + "waybill_data": "##ZTO_mark##11-22-33##ZTO_bagAddr##广州##", + "waybill_template": "PGh0bWw+dGVzdDwvaHRtbD4=", + "custom": { + "order_id": "012345678901234567890123456789", + "openid": "oABC123456", + "delivery_id": "ZTO", + "biz_id": "xyz", + "custom_remark": "易碎物品", + "sender": { + "name": "张三", + "tel": "18666666666", + "mobile": "020-88888888", + "company": "公司名", + "post_code": "123456", + "country": "中国", + "province": "广东省", + "city": "广州市", + "area": "海珠区", + "address": "XX路XX号XX大厦XX栋XX" + }, + "receiver": { + "name": "王小蒙", + "tel": "18610000000", + "mobile": "020-77777777", + "company": "公司名", + "post_code": "654321", + "country": "中国", + "province": "广东省", + "city": "广州市", + "area": "天河区", + "address": "XX路XX号XX大厦XX栋XX" + }, + "shop": { + "wxa_path": "/index/index?from=waybill", + "img_url": "https://mmbiz.qpic.cn/mmbiz_png/KfrZwACMrmwbPGicysN6kibW0ibXwzmA3mtTwgSsdw4Uicabduu2pfbfwdKicQ8n0v91kRAUX6SDESQypl5tlRwHUPA/640", + "goods_name": "一千零一夜钻石包&爱马仕柏金钻石包", + "goods_count": 2 + }, + "cargo": { + "count": 2, + "weight": 5.5, + "space_x": 30.5, + "space_y": 20, + "space_z": 20, + "detail_list": [ + { + "name": "一千零一夜钻石包", + "count": 1 + }, + { + "name": "爱马仕柏金钻石包", + "count": 1 + } + ] + }, + "insured": { + "use_insured": 1, + "insured_value": 10000 + }, + "service": { + "service_type": 0, + "service_name": "标准快递" + } + } + }` + + previewer := new(ExpressTemplatePreviewer) + err := json.Unmarshal([]byte(raw), previewer) + if err != nil { + t.Fatal(err) + } + + _, err = previewer.preview(ts.URL+apiPreviewTemplate, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestUpdateBusiness(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/delivery/service/business/update" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + ShopAppID string `json:"shop_app_id"` // 商户的小程序AppID,即审核商户事件中的 ShopAppID + BizID string `json:"biz_id"` // 商户账户 + ResultCode int `json:"result_code"` // 审核结果,0 表示审核通过,其他表示审核失败 + ResultMsg string `json:"result_msg"` // 审核错误原因,仅 result_code 不等于 0 时需要设置 + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + if params.ShopAppID == "" { + t.Error("Response column shop_app_id can not be empty") + } + if params.BizID == "" { + t.Error("Response column biz_id can not be empty") + } + if params.ResultCode == 0 { + t.Error("Response column result_code can not be zero") + } + if params.ResultMsg == "" { + t.Error("Response column result_msg can not be empty") + } + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "shop_app_id": "wxABCD", + "biz_id": "xyz", + "result_code": 1, + "result_msg": "审核通过" + }` + + updater := new(BusinessUpdater) + err := json.Unmarshal([]byte(raw), updater) + if err != nil { + t.Fatal(err) + } + + _, err = updater.update(ts.URL+apiUpdateBusiness, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestUpdatePath(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/delivery/path/update" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Token string `json:"token"` // 商户侧下单事件中推送的 Token 字段 + WaybillID string `json:"waybill_id"` // 运单 ID + ActionTime uint `json:"action_time"` // 轨迹变化 Unix 时间戳 + ActionType int `json:"action_type"` // 轨迹变化类型 + ActionMsg string `json:"action_msg"` // 轨迹变化具体信息说明,展示在快递轨迹详情页中。若有手机号码,则直接写11位手机号码。使用UTF-8编码。 + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + if params.Token == "" { + t.Error("Response column token can not be empty") + } + if params.WaybillID == "" { + t.Error("Response column waybill_id can not be empty") + } + if params.ActionMsg == "" { + t.Error("Response column action_msg can not be empty") + } + if params.ActionTime == 0 { + t.Error("Response column action_time can not be zero") + } + if params.ActionType == 0 { + t.Error("Response column action_type can not be zero") + } + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "token": "TOKEN", + "waybill_id": "12345678901234567890", + "action_time": 1533052800, + "action_type": 300002, + "action_msg": "丽影邓丽君【18666666666】正在派件" + }` + + updater := new(ExpressPathUpdater) + err := json.Unmarshal([]byte(raw), updater) + if err != nil { + t.Fatal(err) + } + + _, err = updater.update(ts.URL+apiUpdatePath, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/face_identify.go b/app/lib/weapp/face_identify.go new file mode 100644 index 0000000..3f3aaef --- /dev/null +++ b/app/lib/weapp/face_identify.go @@ -0,0 +1,46 @@ +package weapp + +const ( + apiFaceIdentify = "/cityservice/face/identify/getinfo" +) + +// FaceIdentifyResponse 人脸识别结果返回 +type FaceIdentifyResponse struct { + CommonError + Result int `json:"identify_ret"` // 认证结果 + Time uint32 `json:"identify_time"` // 认证时间 + Data string `json:"validate_data"` // 用户读的数字(如是读数字) + OpenID string `json:"openid"` // 用户openid + UserIDKey string `json:"user_id_key"` // 用于后台交户表示用户姓名、身份证的凭证 + FinishTime uint32 `json:"finish_time"` // 认证结束时间 + IDCardNumberMD5 string `json:"id_card_number_md5"` // 身份证号的md5(最后一位X为大写) + NameUTF8MD5 string `json:"name_utf8_md5"` // 姓名MD5 +} + +// FaceIdentify 获取人脸识别结果 +// +// token 微信 access_token +// key 小程序 verify_result +func FaceIdentify(token, key string) (*FaceIdentifyResponse, error) { + api := baseURL + apiFaceIdentify + return faceIdentify(api, token, key) +} + +func faceIdentify(api, token, key string) (*FaceIdentifyResponse, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "verify_result": key, + } + + res := new(FaceIdentifyResponse) + err = postJSON(api, params, res) + if err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/img.go b/app/lib/weapp/img.go new file mode 100644 index 0000000..191b470 --- /dev/null +++ b/app/lib/weapp/img.go @@ -0,0 +1,188 @@ +package weapp + +const ( + apiAICrop = "/cv/img/aicrop" + apiScanQRCode = "/cv/img/qrcode" + apiSuperResolution = "/cv/img/superResolution" +) + +// AICropResponse 图片智能裁剪后的返回数据 +type AICropResponse struct { + CommonError + Results []struct { + CropLeft uint `json:"crop_left"` + CropTop uint `json:"crop_top"` + CropRight uint `json:"crop_right"` + CropBottom uint `json:"crop_bottom"` + } `json:"results"` + IMGSize struct { + Width uint `json:"w"` + Height uint `json:"h"` + } `json:"img_size"` +} + +// AICrop 本接口提供基于小程序的图片智能裁剪能力。 +func AICrop(token, filename string) (*AICropResponse, error) { + api := baseURL + apiAICrop + return aiCrop(api, token, filename) +} + +func aiCrop(api, token, filename string) (*AICropResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(AICropResponse) + if err := postFormByFile(url, "img", filename, res); err != nil { + return nil, err + } + + return res, nil +} + +// AICropByURL 本接口提供基于小程序的图片智能裁剪能力。 +func AICropByURL(token, url string) (*AICropResponse, error) { + api := baseURL + apiAICrop + return aiCropByURL(api, token, url) +} + +func aiCropByURL(api, token, imgURL string) (*AICropResponse, error) { + queries := requestQueries{ + "access_token": token, + "img_url": imgURL, + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(AICropResponse) + if err := postJSON(url, nil, res); err != nil { + return nil, err + } + + return res, nil +} + +// QRCodePoint 二维码角的位置 +type QRCodePoint struct { + X uint `json:"x"` + Y uint `json:"y"` +} + +// ScanQRCodeResponse 小程序的条码/二维码识别后的返回数据 +type ScanQRCodeResponse struct { + CommonError + CodeResults []struct { + TypeName string `json:"type_name"` + Data string `json:"data"` + Position struct { + LeftTop QRCodePoint `json:"left_top"` + RightTop QRCodePoint `json:"right_top"` + RightBottom QRCodePoint `json:"right_bottom"` + LeftBottom QRCodePoint `json:"left_bottom"` + } `json:"pos"` + } `json:"code_results"` + IMGSize struct { + Width uint `json:"w"` + Height uint `json:"h"` + } `json:"img_size"` +} + +// ScanQRCode 本接口提供基于小程序的条码/二维码识别的API。 +func ScanQRCode(token, filename string) (*ScanQRCodeResponse, error) { + api := baseURL + apiScanQRCode + return scanQRCode(api, token, filename) +} + +func scanQRCode(api, token, filename string) (*ScanQRCodeResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(ScanQRCodeResponse) + if err := postFormByFile(url, "img", filename, res); err != nil { + return nil, err + } + + return res, nil +} + +// ScanQRCodeByURL 把网络文件上传到微信服务器。目前仅支持图片。用于发送客服消息或被动回复用户消息。 +func ScanQRCodeByURL(token, imgURL string) (*ScanQRCodeResponse, error) { + api := baseURL + apiScanQRCode + return scanQRCodeByURL(api, token, imgURL) +} + +func scanQRCodeByURL(api, token, imgURL string) (*ScanQRCodeResponse, error) { + queries := requestQueries{ + "access_token": token, + "img_url": imgURL, + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(ScanQRCodeResponse) + if err := postJSON(url, nil, res); err != nil { + return nil, err + } + + return res, nil +} + +// SuperResolutionResponse 图片高清化后的返回数据 +type SuperResolutionResponse struct { + CommonError + MediaID string `json:"media_id"` +} + +// SuperResolution 本接口提供基于小程序的图片高清化能力。 +func SuperResolution(token, filename string) (*SuperResolutionResponse, error) { + api := baseURL + apiSuperResolution + return superResolution(api, token, filename) +} + +func superResolution(api, token, filename string) (*SuperResolutionResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(SuperResolutionResponse) + if err := postFormByFile(url, "img", filename, res); err != nil { + return nil, err + } + + return res, nil +} + +// SuperResolutionByURL 把网络文件上传到微信服务器。目前仅支持图片。用于发送客服消息或被动回复用户消息。 +func SuperResolutionByURL(token, imgURL string) (*SuperResolutionResponse, error) { + api := baseURL + apiSuperResolution + return superResolutionByURL(api, token, imgURL) +} + +func superResolutionByURL(api, token, imgURL string) (*SuperResolutionResponse, error) { + queries := requestQueries{ + "access_token": token, + "img_url": imgURL, + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(SuperResolutionResponse) + if err := postJSON(url, nil, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/img_test.go b/app/lib/weapp/img_test.go new file mode 100644 index 0000000..8c393f8 --- /dev/null +++ b/app/lib/weapp/img_test.go @@ -0,0 +1,474 @@ +package weapp + +import ( + "fmt" + "io" + "net/http" + "net/http/httptest" + "os" + "path" + "testing" +) + +func TestAICrop(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + if r.URL.EscapedPath() != "/cv/img/aicrop" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "results": [ + { + "crop_left": 112, + "crop_top": 0, + "crop_right": 839, + "crop_bottom": 727 + }, + { + "crop_left": 0, + "crop_top": 205, + "crop_right": 965, + "crop_bottom": 615 + } + ], + "img_size": { + "w": 966, + "h": 728 + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := aiCrop(ts.URL+apiAICrop, "mock-access-token", testIMGName) + if err != nil { + t.Fatal(err) + } +} + +func TestAICropByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc("/cv/img/aicrop", func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + if r.URL.EscapedPath() != "/cv/img/aicrop" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "results": [ + { + "crop_left": 112, + "crop_top": 0, + "crop_right": 839, + "crop_bottom": 727 + }, + { + "crop_left": 0, + "crop_top": 205, + "crop_right": 965, + "crop_bottom": 615 + } + ], + "img_size": { + "w": 966, + "h": 728 + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := aiCropByURL(ts.URL+apiAICrop, "mock-access-token", ts.URL+"/mediaurl") + if err != nil { + t.Fatal(err) + } +} +func TestScanQRCode(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiScanQRCode { + t.Fatalf("Except to path '%s',get '%s'", apiScanQRCode, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "code_results": [ + { + "type_name": "QR_CODE", + "data": "http://www.qq.com", + "pos": { + "left_top": { + "x": 585, + "y": 378 + }, + "right_top": { + "x": 828, + "y": 378 + }, + "right_bottom": { + "x": 828, + "y": 618 + }, + "left_bottom": { + "x": 585, + "y": 618 + } + } + }, + { + "type_name": "QR_CODE", + "data": "https://mp.weixin.qq.com", + "pos": { + "left_top": { + "x": 185, + "y": 142 + }, + "right_top": { + "x": 396, + "y": 142 + }, + "right_bottom": { + "x": 396, + "y": 353 + }, + "left_bottom": { + "x": 185, + "y": 353 + } + } + }, + { + "type_name": "EAN_13", + "data": "5906789678957" + }, + { + "type_name": "CODE_128", + "data": "50090500019191" + } + ], + "img_size": { + "w": 1000, + "h": 900 + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := scanQRCode(ts.URL+apiScanQRCode, "mock-access-token", testIMGName) + if err != nil { + t.Fatal(err) + } +} + +func TestScanQRCodeByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc(apiScanQRCode, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiScanQRCode { + t.Fatalf("Except to path '%s',get '%s'", apiScanQRCode, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "code_results": [ + { + "type_name": "QR_CODE", + "data": "http://www.qq.com", + "pos": { + "left_top": { + "x": 585, + "y": 378 + }, + "right_top": { + "x": 828, + "y": 378 + }, + "right_bottom": { + "x": 828, + "y": 618 + }, + "left_bottom": { + "x": 585, + "y": 618 + } + } + }, + { + "type_name": "QR_CODE", + "data": "https://mp.weixin.qq.com", + "pos": { + "left_top": { + "x": 185, + "y": 142 + }, + "right_top": { + "x": 396, + "y": 142 + }, + "right_bottom": { + "x": 396, + "y": 353 + }, + "left_bottom": { + "x": 185, + "y": 353 + } + } + }, + { + "type_name": "EAN_13", + "data": "5906789678957" + }, + { + "type_name": "CODE_128", + "data": "50090500019191" + } + ], + "img_size": { + "w": 1000, + "h": 900 + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := scanQRCodeByURL(ts.URL+apiScanQRCode, "mock-access-token", ts.URL+"/mediaurl") + if err != nil { + t.Fatal(err) + } +} + +func TestSuperResolution(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiSuperResolution { + t.Fatalf("Except to path '%s',get '%s'", apiSuperResolution, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "media_id": "6WXsIXkG7lXuDLspD9xfm5dsvHzb0EFl0li6ySxi92ap8Vl3zZoD9DpOyNudeJGB" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := superResolution(ts.URL+apiSuperResolution, "mock-access-token", testIMGName) + if err != nil { + t.Fatal(err) + } +} + +func TestSuperResolutionByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc(apiSuperResolution, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiSuperResolution { + t.Fatalf("Except to path '%s',get '%s'", apiSuperResolution, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("%v can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "media_id": "6WXsIXkG7lXuDLspD9xfm5dsvHzb0EFl0li6ySxi92ap8Vl3zZoD9DpOyNudeJGB" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := superResolutionByURL(ts.URL+apiSuperResolution, "mock-access-token", ts.URL+"/mediaurl") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/immediate_delivery.go b/app/lib/weapp/immediate_delivery.go new file mode 100644 index 0000000..4319d49 --- /dev/null +++ b/app/lib/weapp/immediate_delivery.go @@ -0,0 +1,479 @@ +package weapp + +const ( + apiAbnormalConfirm = "/cgi-bin/express/local/business/order/confirm_return" + apiAddDeliveryOrder = "/cgi-bin/express/local/business/order/add" + apiAddDeliveryTip = "/cgi-bin/express/local/business/order/addtips" + apiCancelDeliveryOrder = "/cgi-bin/express/local/business/order/cancel" + apiGetAllImmediateDelivery = "/cgi-bin/express/local/business/delivery/getall" + apiGetDeliveryBindAccount = "/cgi-bin/express/local/business/shop/get" + apiGetDeliveryOrder = "/cgi-bin/express/local/business/order/get" + apiPreAddDeliveryOrder = "/cgi-bin/express/local/business/order/pre_add" + apiPreCancelDeliveryOrder = "/cgi-bin/express/local/business/order/precancel" + apiReAddDeliveryOrder = "/cgi-bin/express/local/business/order/readd" + apiMockUpdateDeliveryOrder = "/cgi-bin/express/local/business/test_update_order" + apiUpdateDeliveryOrder = "/cgi-bin/express/local/delivery/update_order" +) + +// AbnormalConfirmer 异常件退回商家商家确认器 +type AbnormalConfirmer struct { + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + WaybillID string `json:"waybill_id"` // 配送单id + Remark string `json:"remark"` // 备注 +} + +// Confirm 异常件退回商家商家确认收货 +func (confirmer *AbnormalConfirmer) Confirm(token string) (*CommonResult, error) { + api := baseURL + apiAbnormalConfirm + return confirmer.confirm(api, token) +} + +func (confirmer *AbnormalConfirmer) confirm(api, token string) (*CommonResult, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonResult) + if err := postJSON(url, confirmer, res); err != nil { + return nil, err + } + + return res, nil +} + +// DeliveryOrderCreator 下配送单参数 +type DeliveryOrderCreator struct { + DeliveryToken string `json:"delivery_token,omitempty"` // 预下单接口返回的参数,配送公司可保证在一段时间内运费不变 + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + DeliveryID string `json:"delivery_id"` // 配送公司ID + OpenID string `json:"openid"` // 下单用户的openid + Sender DeliveryUser `json:"sender"` // 发件人信息,闪送、顺丰同城急送必须填写,美团配送、达达,若传了shop_no的值可不填该字段 + Receiver DeliveryUser `json:"receiver"` // 收件人信息 + Cargo DeliveryCargo `json:"cargo"` // 货物信息 + OrderInfo DeliveryOrderInfo `json:"order_info"` // 订单信息 + Shop DeliveryShop `json:"shop"` // 商品信息,会展示到物流通知消息中 + SubBizID string `json:"sub_biz_id"` // 子商户id,区分小程序内部多个子商户 +} + +// DeliveryUser 发件人信息,闪送、顺丰同城急送必须填写,美团配送、达达,若传了shop_no的值可不填该字段 +type DeliveryUser struct { + Name string `json:"name"` // 姓名,最长不超过256个字符 + City string `json:"city"` // 城市名称,如广州市 + Address string `json:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 +} + +// DeliveryCargo 货物信息 +type DeliveryCargo struct { + GoodsValue float64 `json:"goods_value"` // 货物价格,单位为元,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-5000] + GoodsHeight float64 `json:"goods_height"` // 货物高度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-45] + GoodsLength float64 `json:"goods_length"` // 货物长度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-65] + GoodsWidth float64 `json:"goods_width"` // 货物宽度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsWeight float64 `json:"goods_weight"` // 货物重量,单位为kg,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsDetail DeliveryGoodsDetail `json:"goods_detail"` // 货物详情,最长不超过10240个字符 + GoodsPickupInfo string `json:"goods_pickup_info"` // 货物取货信息,用于骑手到店取货,最长不超过100个字符 + GoodsDeliveryInfo string `json:"goods_delivery_info"` // 货物交付信息,最长不超过100个字符 + CargoFirstClass string `json:"cargo_first_class"` // 品类一级类目 + CargoSecondClass string `json:"cargo_second_class"` // 品类二级类目 +} + +// DeliveryGoodsDetail 货物详情 +type DeliveryGoodsDetail struct { + Goods []DeliveryGoods `json:"goods"` // 货物交付信息,最长不超过100个字符 +} + +// DeliveryGoods 货物 +type DeliveryGoods struct { + Count uint `json:"good_count"` // 货物数量 + Name string `json:"good_name"` // 货品名称 + Price float32 `json:"good_price"` // 货品单价,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数) + Unit string `json:"good_unit"` // 货品单位,最长不超过20个字符 +} + +// DeliveryOrderInfo 订单信息 +type DeliveryOrderInfo struct { + DeliveryServiceCode string `json:"delivery_service_code"` // 配送服务代码 不同配送公司自定义,微信侧不理解 + OrderType uint8 `json:"order_type"` // 订单类型, 0: 即时单 1 预约单,如预约单,需要设置expected_delivery_time或expected_finish_time或expected_pick_time + ExpectedDeliveryTime uint `json:"expected_delivery_time"` // 期望派单时间(顺丰同城急送、达达、支持),unix-timestamp + ExpectedFinishTime uint `json:"expected_finish_time"` // 期望送达时间(顺丰同城急送、美团配送支持),unix-timestamp + ExpectedPickTime uint `json:"expected_pick_time"` // 期望取件时间(闪送支持),unix-timestamp + PoiSeq string `json:"poi_seq"` // 门店订单流水号,建议提供,方便骑手门店取货,最长不超过32个字符 + Note string `json:"note"` // 备注,最长不超过200个字符 + OrderTime uint `json:"order_time"` // 用户下单付款时间 + IsInsured uint8 `json:"is_insured"` // 是否保价,0,非保价,1.保价 + DeclaredValue float64 `json:"declared_value"` // 保价金额,单位为元,精确到分 + Tips float64 `json:"tips"` // 小费,单位为元, 下单一般不加小费 + IsDirectDelivery uint `json:"is_direct_delivery"` // 是否选择直拿直送(0:不需要;1:需要。选择直拿直送后,同一时间骑手只能配送此订单至完成,配送费用也相应高一些,闪送必须选1,达达可选0或1,其余配送公司不支持直拿直送) + CashOnDelivery uint `json:"cash_on_delivery"` // 骑手应付金额,单位为元,精确到分 + CashOnPickup uint `json:"cash_on_pickup"` // 骑手应收金额,单位为元,精确到分 + RiderPickMethod uint8 `json:"rider_pick_method"` // 物流流向,1:从门店取件送至用户;2:从用户取件送至门店 + IsFinishCodeNeeded uint8 `json:"is_finish_code_needed"` // 收货码(0:不需要;1:需要。收货码的作用是:骑手必须输入收货码才能完成订单妥投) + IsPickupCodeNeeded uint8 `json:"is_pickup_code_needed"` // 取货码(0:不需要;1:需要。取货码的作用是:骑手必须输入取货码才能从商家取货) +} + +// DeliveryShop 商品信息,会展示到物流通知消息中 +type DeliveryShop struct { + WxaPath string `json:"wxa_path"` // 商家小程序的路径,建议为订单页面 + ImgURL string `json:"img_url"` // 商品缩略图 url + GoodsName string `json:"goods_name"` // 商品名称 + GoodsCount uint `json:"goods_count"` // 商品数量 +} + +// PreDeliveryOrderResponse 返回数据 +type PreDeliveryOrderResponse struct { + Fee float64 `json:"fee"` // 实际运费(单位:元),运费减去优惠券费用 + Deliverfee float64 `json:"deliverfee"` // 运费(单位:元) + Couponfee float64 `json:"couponfee"` // 优惠券费用(单位:元) + Tips float64 `json:"tips"` // 小费(单位:元) + Insurancefee float64 `json:"insurancefee"` // 保价费(单位:元) + Distance float64 `json:"distance"` // 配送距离(单位:米) + DispatchDuration uint `json:"dispatch_duration"` // 预计骑手接单时间,单位秒,比如5分钟,就填300, 无法预计填0 + DeliveryToken string `json:"delivery_token"` // 配送公司可以返回此字段,当用户下单时候带上这个字段,保证在一段时间内运费不变 +} + +// Prepare 预下配送单接口 +func (creator *DeliveryOrderCreator) Prepare(token string) (*PreDeliveryOrderResponse, error) { + api := baseURL + apiPreCancelDeliveryOrder + return creator.prepare(api, token) +} + +func (creator *DeliveryOrderCreator) prepare(api, token string) (*PreDeliveryOrderResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(PreDeliveryOrderResponse) + if err := postJSON(url, creator, res); err != nil { + return nil, err + } + + return res, nil +} + +// CreateDeliveryOrderResponse 返回数据 +type CreateDeliveryOrderResponse struct { + CommonResult + Fee uint `json:"fee"` //实际运费(单位:元),运费减去优惠券费用 + Deliverfee uint `json:"deliverfee"` //运费(单位:元) + Couponfee uint `json:"couponfee"` //优惠券费用(单位:元) + Tips uint `json:"tips"` //小费(单位:元) + Insurancefee uint `json:"insurancefee"` //保价费(单位:元) + Distance float64 `json:"distance"` // 配送距离(单位:米) + WaybillID string `json:"waybill_id"` //配送单号 + OrderStatus int `json:"order_status"` //配送状态 + FinishCode uint `json:"finish_code"` // 收货码 + PickupCode uint `json:"pickup_code"` //取货码 + DispatchDuration uint `json:"dispatch_duration"` // 预计骑手接单时间,单位秒,比如5分钟,就填300, 无法预计填0 +} + +// Create 下配送单 +func (creator *DeliveryOrderCreator) Create(token string) (*CreateDeliveryOrderResponse, error) { + api := baseURL + apiAddDeliveryOrder + return creator.create(api, token) +} + +func (creator *DeliveryOrderCreator) create(api, token string) (*CreateDeliveryOrderResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CreateDeliveryOrderResponse) + if err := postJSON(url, creator, res); err != nil { + return nil, err + } + + return res, nil +} + +// Recreate 重新下单 +func (creator *DeliveryOrderCreator) Recreate(token string) (*CreateDeliveryOrderResponse, error) { + api := baseURL + apiReAddDeliveryOrder + return creator.recreate(api, token) +} + +func (creator *DeliveryOrderCreator) recreate(api, token string) (*CreateDeliveryOrderResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CreateDeliveryOrderResponse) + if err := postJSON(url, creator, res); err != nil { + return nil, err + } + + return res, nil +} + +// DeliveryTipAdder 增加小费参数 +type DeliveryTipAdder struct { + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + WaybillID string `json:"waybill_id"` // 配送单id + OpenID string `json:"openid"` // 下单用户的openid + Tips float64 `json:"tips"` // 小费金额(单位:元) 各家配送公司最大值不同 + Remark string `json:"Remark"` // 备注 +} + +// Add 对待接单状态的订单增加小费。需要注意:订单的小费,以最新一次加小费动作的金额为准,故下一次增加小费额必须大于上一次小费额 +func (adder *DeliveryTipAdder) Add(token string) (*CommonResult, error) { + api := baseURL + apiAddDeliveryTip + return adder.add(api, token) +} + +func (adder *DeliveryTipAdder) add(api, token string) (*CommonResult, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonResult) + if err := postJSON(url, adder, res); err != nil { + return nil, err + } + + return res, nil +} + +// DeliveryOrderCanceler 取消配送单参数 +type DeliveryOrderCanceler struct { + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + DeliveryID string `json:"delivery_id"` // 快递公司ID + WaybillID string `json:"waybill_id"` // 配送单id + ReasonID uint8 `json:"cancel_reason_id"` // 取消原因Id + Reason string `json:"cancel_reason"` // 取消原因 +} + +// CancelDeliveryOrderResponse 取消配送单返回数据 +type CancelDeliveryOrderResponse struct { + CommonResult + DeductFee float64 `json:"deduct_fee"` // 预计扣除的违约金(单位:元),精确到分 + Desc string `json:"desc"` //说明 +} + +// Prepare 预取消配送单 +func (canceler *DeliveryOrderCanceler) Prepare(token string) (*CancelDeliveryOrderResponse, error) { + api := baseURL + apiCancelDeliveryOrder + return canceler.prepare(api, token) +} + +func (canceler *DeliveryOrderCanceler) prepare(api, token string) (*CancelDeliveryOrderResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CancelDeliveryOrderResponse) + if err := postJSON(url, canceler, res); err != nil { + return nil, err + } + + return res, nil +} + +// Cancel 取消配送单 +func (canceler *DeliveryOrderCanceler) Cancel(token string) (*CancelDeliveryOrderResponse, error) { + api := baseURL + apiCancelDeliveryOrder + return canceler.cancel(api, token) +} + +func (canceler *DeliveryOrderCanceler) cancel(api, token string) (*CancelDeliveryOrderResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CancelDeliveryOrderResponse) + if err := postJSON(url, canceler, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetAllImmediateDeliveryResponse 获取已支持的配送公司列表接口返回数据 +type GetAllImmediateDeliveryResponse struct { + CommonResult + List []struct { + ID string `json:"delivery_id"` //配送公司Id + Name string `json:"delivery_name"` // 配送公司名称 + } `json:"list"` // 配送公司列表 +} + +// GetAllImmediateDelivery 获取已支持的配送公司列表接口 +func GetAllImmediateDelivery(token string) (*GetAllImmediateDeliveryResponse, error) { + api := baseURL + apiGetAllImmediateDelivery + return getAllImmediateDelivery(api, token) +} + +func getAllImmediateDelivery(api, token string) (*GetAllImmediateDeliveryResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(GetAllImmediateDeliveryResponse) + if err := postJSON(url, nil, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetBindAccountResponse 返回数据 +type GetBindAccountResponse struct { + CommonResult + ShopList []struct { + DeliveryID string `json:"delivery_id"` // 配送公司Id + ShopID string `json:"shopid"` // 商家id + AuditResult uint8 `json:"audit_result"` // 审核状态 + } `json:"shop_list"` // 配送公司列表 +} + +// GetBindAccount 拉取已绑定账号 +func GetBindAccount(token string) (*GetBindAccountResponse, error) { + api := baseURL + apiGetDeliveryBindAccount + return getBindAccount(api, token) +} + +func getBindAccount(api, token string) (*GetBindAccountResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(GetBindAccountResponse) + if err := postJSON(url, nil, res); err != nil { + return nil, err + } + + return res, nil +} + +// DeliveryOrderGetter 请求参数 +type DeliveryOrderGetter struct { + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串说明 +} + +// GetDeliveryOrderResponse 返回数据 +type GetDeliveryOrderResponse struct { + CommonResult + OrderStatus int `json:"order_status"` // 配送状态,枚举值 + WaybillID string `json:"waybill_id"` // 配送单号 + RiderName string `json:"rider_name"` // 骑手姓名 + RiderPhone string `json:"rider_phone"` // 骑手电话 + RiderLng float64 `json:"rider_lng"` // 骑手位置经度, 配送中时返回 + RiderLat float64 `json:"rider_lat"` // 骑手位置纬度, 配送中时返回 +} + +// Get 下配送单 +func (getter *DeliveryOrderGetter) Get(token string) (*GetDeliveryOrderResponse, error) { + api := baseURL + apiGetDeliveryOrder + return getter.get(api, token) +} + +func (getter *DeliveryOrderGetter) get(api, token string) (*GetDeliveryOrderResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(GetDeliveryOrderResponse) + if err := postJSON(url, getter, res); err != nil { + return nil, err + } + + return res, nil +} + +// UpdateDeliveryOrderMocker 请求参数 +type UpdateDeliveryOrderMocker struct { + ShopID string `json:"shopid"` // 商家id, 必须是 "test_shop_id" + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ActionTime uint `json:"action_time"` // 状态变更时间点,Unix秒级时间戳 + OrderStatus int `json:"order_status"` // 配送状态,枚举值 + ActionMsg string `json:"action_msg"` // 附加信息 +} + +// Mock 模拟配送公司更新配送单状态 +func (mocker *UpdateDeliveryOrderMocker) Mock(token string) (*CommonResult, error) { + api := baseURL + apiMockUpdateDeliveryOrder + return mocker.mock(api, token) +} + +func (mocker *UpdateDeliveryOrderMocker) mock(api, token string) (*CommonResult, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonResult) + if err := postJSON(url, mocker, res); err != nil { + return nil, err + } + + return res, nil +} + +// DeliveryOrderUpdater 请求参数 +type DeliveryOrderUpdater struct { + WXToken string `json:"wx_token"` // 下单事件中推送的wx_token字段 + ShopID string `json:"shopid"` // 商家id, 由配送公司分配,可以是dev_id或者appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no,omitempty"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id"` // 配送单id + ActionTime uint `json:"action_time"` // 状态变更时间点,Unix秒级时间戳 + OrderStatus int `json:"order_status"` // 订单状态,枚举值,下附枚举值列表及说明 + ActionMsg string `json:"action_msg,omitempty"` // 附加信息 + WxaPath string `json:"wxa_path"` // 配送公司小程序跳转路径,用于用户收到消息会间接跳转到这个页面 + Agent DeliveryAgent `json:"agent,omitempty"` // 骑手信息, 骑手接单时需返回 + ExpectedDeliveryTime uint `json:"expected_delivery_time,omitempty"` // 预计送达时间戳, 骑手接单时需返回 +} + +// DeliveryAgent 骑手信息 +type DeliveryAgent struct { + Name string `json:"name"` // 骑手姓名 + Phone string `json:"phone"` // 骑手电话 + Encrypted uint8 `json:"is_phone_encrypted,omitempty"` // 电话是否加密 +} + +// Update 模拟配送公司更新配送单状态 +func (updater *DeliveryOrderUpdater) Update(token string) (*CommonResult, error) { + api := baseURL + apiUpdateDeliveryOrder + return updater.update(api, token) +} + +func (updater *DeliveryOrderUpdater) update(api, token string) (*CommonResult, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonResult) + if err := postJSON(url, updater, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/immediate_delivery_test.go b/app/lib/weapp/immediate_delivery_test.go new file mode 100644 index 0000000..cf34975 --- /dev/null +++ b/app/lib/weapp/immediate_delivery_test.go @@ -0,0 +1,2041 @@ +package weapp + +import ( + "encoding/base64" + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestAbnormalConfirm(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/order/confirm_return" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + WaybillID string `json:"waybill_id"` // 配送单id + Remark string `json:"remark"` // 备注 + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + if params.ShopID == "" { + t.Error("Response column shopid can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Response column shop_order_id can not be empty") + } + if params.ShopNo == "" { + t.Error("Response column shop_no can not be empty") + } + + if params.DeliverySign == "" { + t.Error("Response column delivery_sign can not be empty") + } + + if params.WaybillID == "" { + t.Error("Response column waybill_id can not be empty") + } + if params.Remark == "" { + t.Error("Response column remark can not be empty") + } + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 1, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "shopid": "123456", + "shop_order_id": "123456", + "shop_no": "shop_no_111", + "waybill_id": "123456", + "remark": "remark", + "delivery_sign": "123456" + }` + + confirmer := new(AbnormalConfirmer) + err := json.Unmarshal([]byte(raw), confirmer) + if err != nil { + t.Fatal(err) + } + + _, err = confirmer.confirm(ts.URL+apiAbnormalConfirm, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestAddDeliveryOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/order/add" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + DeliveryToken string `json:"delivery_token"` // 预下单接口返回的参数,配送公司可保证在一段时间内运费不变 + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + DeliveryID string `json:"delivery_id"` // 配送公司ID + OpenID string `json:"openid"` // 下单用户的openid + SubBizID string `json:"sub_biz_id"` // 子商户id,区分小程序内部多个子商户 + Sender struct { + Name string `json:"name"` // 姓名,最长不超过256个字符 + City string `json:"city"` // 城市名称,如广州市 + Address string `json:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"sender"` // 发件人信息,闪送、顺丰同城急送必须填写,美团配送、达达,若传了shop_no的值可不填该字段 + Receiver struct { + Name string `json:"name"` // 姓名,最长不超过256个字符 + City string `json:"city"` // 城市名称,如广州市 + Address string `json:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"receiver"` // 收件人信息 + Cargo struct { + GoodsValue float64 `json:"goods_value"` // 货物价格,单位为元,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-5000] + GoodsHeight float64 `json:"goods_height"` // 货物高度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-45] + GoodsLength float64 `json:"goods_length"` // 货物长度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-65] + GoodsWidth float64 `json:"goods_width"` // 货物宽度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsWeight float64 `json:"goods_weight"` // 货物重量,单位为kg,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsDetail struct { + Goods []struct { + Count uint `json:"good_count"` // 货物数量 + Name string `json:"good_name"` // 货品名称 + Price float32 `json:"good_price"` // 货品单价,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数) + Unit string `json:"good_unit"` // 货品单位,最长不超过20个字符 + } `json:"goods"` // 货物交付信息,最长不超过100个字符 + } `json:"goods_detail"` // 货物详情,最长不超过10240个字符 + GoodsPickupInfo string `json:"goods_pickup_info"` // 货物取货信息,用于骑手到店取货,最长不超过100个字符 + GoodsDeliveryInfo string `json:"goods_delivery_info"` // 货物交付信息,最长不超过100个字符 + CargoFirstClass string `json:"cargo_first_class"` // 品类一级类目 + CargoSecondClass string `json:"cargo_second_class"` // 品类二级类目 + } `json:"cargo"` // 货物信息 + OrderInfo struct { + DeliveryServiceCode string `json:"delivery_service_code"` // 配送服务代码 不同配送公司自定义,微信侧不理解 + OrderType uint8 `json:"order_type"` // 订单类型, 0: 即时单 1 预约单,如预约单,需要设置expected_delivery_time或expected_finish_time或expected_pick_time + ExpectedDeliveryTime uint `json:"expected_delivery_time"` // 期望派单时间(顺丰同城急送、达达、支持),unix-timestamp + ExpectedFinishTime uint `json:"expected_finish_time"` // 期望送达时间(顺丰同城急送、美团配送支持),unix-timestamp + ExpectedPickTime uint `json:"expected_pick_time"` // 期望取件时间(闪送支持),unix-timestamp + PoiSeq string `json:"poi_seq"` // 门店订单流水号,建议提供,方便骑手门店取货,最长不超过32个字符 + Note string `json:"note"` // 备注,最长不超过200个字符 + OrderTime uint `json:"order_time"` // 用户下单付款时间 + IsInsured uint8 `json:"is_insured"` // 是否保价,0,非保价,1.保价 + DeclaredValue float64 `json:"declared_value"` // 保价金额,单位为元,精确到分 + Tips float64 `json:"tips"` // 小费,单位为元, 下单一般不加小费 + IsDirectDelivery uint `json:"is_direct_delivery"` // 是否选择直拿直送(0:不需要;1:需要。选择直拿直送后,同一时间骑手只能配送此订单至完成,配送费用也相应高一些,闪送必须选1,达达可选0或1,其余配送公司不支持直拿直送) + CashOnDelivery uint `json:"cash_on_delivery"` // 骑手应付金额,单位为元,精确到分 + CashOnPickup uint `json:"cash_on_pickup"` // 骑手应收金额,单位为元,精确到分 + RiderPickMethod uint8 `json:"rider_pick_method"` // 物流流向,1:从门店取件送至用户;2:从用户取件送至门店 + IsFinishCodeNeeded uint8 `json:"is_finish_code_needed"` // 收货码(0:不需要;1:需要。收货码的作用是:骑手必须输入收货码才能完成订单妥投) + IsPickupCodeNeeded uint8 `json:"is_pickup_code_needed"` // 取货码(0:不需要;1:需要。取货码的作用是:骑手必须输入取货码才能从商家取货) + } `json:"order_info"` // 订单信息 + Shop struct { + WxaPath string `json:"wxa_path"` // 商家小程序的路径,建议为订单页面 + ImgURL string `json:"img_url"` // 商品缩略图 url + GoodsName string `json:"goods_name"` // 商品名称 + GoodsCount uint `json:"goods_count"` // 商品数量 + } `json:"shop"` // 商品信息,会展示到物流通知消息中 + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.DeliveryToken == "" { + t.Error("Response column 'delivery_token' can not be empty") + } + if params.ShopID == "" { + t.Error("Response column 'shopid' can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Response column 'shop_order_id' can not be empty") + } + if params.ShopNo == "" { + t.Error("Response column 'shop_no' can not be empty") + } + if params.DeliverySign == "" { + t.Error("Response column 'delivery_sign' can not be empty") + } + if params.DeliveryID == "" { + t.Error("Response column 'delivery_id' can not be empty") + } + if params.OpenID == "" { + t.Error("Response column 'openid' can not be empty") + } + if params.SubBizID == "" { + t.Error("Response column 'sub_biz_id' can not be empty") + } + + if params.Sender.Name == "" { + t.Error("Param 'sender.name' can not be empty") + } + if params.Sender.City == "" { + t.Error("Param 'sender.city' can not be empty") + } + if params.Sender.Address == "" { + t.Error("Param 'sender.address' can not be empty") + } + if params.Sender.AddressDetail == "" { + t.Error("Param 'sender.address_detail' can not be empty") + } + if params.Sender.Phone == "" { + t.Error("Param 'sender.phone' can not be empty") + } + if params.Sender.Lng == 0 { + t.Error("Param 'sender.lng' can not be empty") + } + if params.Sender.Lat == 0 { + t.Error("Param 'sender.lat' can not be empty") + } + if params.Sender.CoordinateType == 0 { + t.Error("Param 'sender.coordinate_type' can not be empty") + } + + if params.Receiver.Name == "" { + t.Error("Param 'receiver.name' can not be empty") + } + if params.Receiver.City == "" { + t.Error("Param 'receiver.city' can not be empty") + } + if params.Receiver.Address == "" { + t.Error("Param 'receiver.address' can not be empty") + } + if params.Receiver.AddressDetail == "" { + t.Error("Param 'receiver.address_detail' can not be empty") + } + if params.Receiver.Phone == "" { + t.Error("Param 'receiver.phone' can not be empty") + } + if params.Receiver.Lng == 0 { + t.Error("Param 'receiver.lng' can not be empty") + } + if params.Receiver.Lat == 0 { + t.Error("Param 'receiver.lat' can not be empty") + } + if params.Receiver.CoordinateType == 0 { + t.Error("Param 'receiver.coordinate_type' can not be empty") + } + if params.Cargo.GoodsValue == 0 { + t.Error("Param 'cargo.goods_value' can not be empty") + } + if params.Cargo.GoodsHeight == 0 { + t.Error("Param 'cargo.goods_height' can not be empty") + } + if params.Cargo.GoodsLength == 0 { + t.Error("Param 'cargo.goods_length' can not be empty") + } + if params.Cargo.GoodsWidth == 0 { + t.Error("Param 'cargo.goods_width' can not be empty") + } + if params.Cargo.GoodsWeight == 0 { + t.Error("Param 'cargo.goods_weight' can not be empty") + } + if params.Cargo.CargoFirstClass == "" { + t.Error("Param 'cargo.cargo_first_class' can not be empty") + } + if params.Cargo.CargoSecondClass == "" { + t.Error("Param 'cargo.cargo_second_class' can not be empty") + } + if len(params.Cargo.GoodsDetail.Goods) > 0 { + if params.Cargo.GoodsDetail.Goods[0].Count == 0 { + t.Error("Param 'cargo.goods_detail.goods.good_count' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Name == "" { + t.Error("Param 'cargo.goods_detail.goods.good_name' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Price == 0 { + t.Error("Param 'cargo.goods_detail.goods.good_price' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Unit == "" { + t.Error("Param 'cargo.goods_detail.goods.good_unit' can not be empty") + } + } + if params.OrderInfo.DeliveryServiceCode == "" { + t.Error("Param 'order_info.delivery_service_code' can not be empty") + } + if params.Shop.WxaPath == "" { + t.Error("Param 'shop.wxa_path' can not be empty") + } + if params.Shop.ImgURL == "" { + t.Error("Param 'shop.img_url' can not be empty") + } + if params.Shop.GoodsName == "" { + t.Error("Param 'shop.goods_name' can not be empty") + } + if params.Shop.GoodsCount == 0 { + t.Error("Param 'shop.goods_count' can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok", + "fee": 11, + "deliverfee": 11, + "couponfee": 1, + "tips": 1, + "insurancefee": 1000, + "insurancfee": 1, + "distance": 1001, + "waybill_id": "123456789", + "order_status": 101, + "finish_code": 1024, + "pickup_code": 2048, + "dispatch_duration": 300 + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "cargo": { + "cargo_first_class": "美食宵夜", + "cargo_second_class": "零食小吃", + "goods_detail": { + "goods": [ + { + "good_count": 1, + "good_name": "水果", + "good_price": 11, + "good_unit": "元" + }, + { + "good_count": 2, + "good_name": "蔬菜", + "good_price": 21, + "good_unit": "元" + } + ] + }, + "goods_height": 1, + "goods_length": 3, + "goods_value": 5, + "goods_weight": 1, + "goods_width": 2 + }, + "delivery_id": "SFTC", + "delivery_sign": "01234567890123456789", + "openid": "oABC123456", + "order_info": { + "delivery_service_code": "xxx", + "expected_delivery_time": 1, + "is_direct_delivery": 1, + "is_finish_code_needed": 1, + "is_insured": 1, + "is_pickup_code_needed": 1, + "note": "test_note", + "order_time": 1555220757, + "order_type": 1, + "poi_seq": "1111", + "tips": 0 + }, + "receiver": { + "address": "xxx地铁站", + "address_detail": "2号楼202", + "city": "北京市", + "coordinate_type": 1, + "lat": 40.1529600001, + "lng": 116.5060300001, + "name": "老王", + "phone": "18512345678" + }, + "sender": { + "address": "xx大厦", + "address_detail": "1号楼101", + "city": "北京市", + "coordinate_type": 1, + "lat": 40.4486120001, + "lng": 116.3830750001, + "name": "刘一", + "phone": "13712345678" + }, + "shop": { + "goods_count": 2, + "goods_name": "宝贝", + "img_url": "https://mmbiz.qpic.cn/mmbiz_png/xxxxxxxxx/0?wx_fmt=png", + "wxa_path": "/page/index/index" + }, + "shop_no": "12345678", + "sub_biz_id": "sub_biz_id_1", + "shop_order_id": "SFTC_001", + "shopid": "122222222", + "delivery_token": "xxxxxxxx" + }` + + creator := new(DeliveryOrderCreator) + err := json.Unmarshal([]byte(raw), creator) + if err != nil { + t.Fatal(err) + } + + res, err := creator.create(ts.URL+apiAddDeliveryOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.Fee == 0 { + t.Error("Response 'fee' can not be empty") + } + if res.Deliverfee == 0 { + t.Error("Response 'deliverfee' can not be empty") + } + if res.Couponfee == 0 { + t.Error("Response 'couponfee' can not be empty") + } + if res.Tips == 0 { + t.Error("Response 'tips' can not be empty") + } + if res.Insurancefee == 0 { + t.Error("Response 'insurancefee' can not be empty") + } + if res.Distance == 0 { + t.Error("Response 'distance' can not be empty") + } + if res.WaybillID == "" { + t.Error("Response 'waybill_id' can not be empty") + } + if res.OrderStatus == 0 { + t.Error("Response 'order_status' can not be empty") + } + if res.FinishCode == 0 { + t.Error("Response 'finish_code' can not be empty") + } + if res.PickupCode == 0 { + t.Error("Response 'pickup_code' can not be empty") + } + if res.DispatchDuration == 0 { + t.Error("Response 'dispatch_duration' can not be empty") + } + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } +} + +func TestAddDeliveryTip(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/order/addtips" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("Query 'access_token' can not be empty") + } + + params := struct { + ShopID string `json:"shopid"` + ShopOrderID string `json:"shop_order_id"` + ShopNo string `json:"shop_no"` + DeliverySign string `json:"delivery_sign"` + WaybillID string `json:"waybill_id"` + OpenID string `json:"openid"` + Tips float64 `json:"tips"` + Remark string `json:"remark"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.ShopID == "" { + t.Error("Param 'shopid' can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Param 'shop_order_id' can not be empty") + } + if params.ShopNo == "" { + t.Error("Param 'shop_no' can not be empty") + } + if params.DeliverySign == "" { + t.Error("Param 'delivery_sign' can not be empty") + } + if params.WaybillID == "" { + t.Error("Param 'waybill_id' can not be empty") + } + if params.OpenID == "" { + t.Error("Param 'openid' can not be empty") + } + if params.Tips == 0 { + t.Error("Param 'tips' can not be empty") + } + if params.Remark == "" { + t.Error("Param 'remark' can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "shopid": "123456", + "shop_order_id": "123456", + "waybill_id": "123456", + "tips": 5, + "openid": "mock-open-id", + "remark": "gogogo", + "delivery_sign": "123456", + "shop_no": "shop_no_111" + }` + + adder := new(DeliveryTipAdder) + err := json.Unmarshal([]byte(raw), adder) + if err != nil { + t.Fatal(err) + } + + res, err := adder.add(ts.URL+apiAddDeliveryTip, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } +} + +func TestCancelDeliveryOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/order/cancel" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("Query 'access_token' can not be empty") + } + + params := struct { + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + DeliveryID string `json:"delivery_id"` // 快递公司ID + WaybillID string `json:"waybill_id"` // 配送单id + ReasonID uint8 `json:"cancel_reason_id"` // 取消原因Id + Reason string `json:"cancel_reason"` // 取消原因 + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.ShopID == "" { + t.Error("Param 'shopid' can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Param 'shop_order_id' can not be empty") + } + if params.ShopNo == "" { + t.Error("Param 'shop_no' can not be empty") + } + if params.DeliverySign == "" { + t.Error("Param 'delivery_sign' can not be empty") + } + if params.WaybillID == "" { + t.Error("Param 'waybill_id' can not be empty") + } + if params.DeliveryID == "" { + t.Error("Param 'delivery_id' can not be empty") + } + if params.ReasonID == 0 { + t.Error("Param 'cancel_reason_id' can not be empty") + } + if params.Reason == "" { + t.Error("Param 'cancel_reason' can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok", + "deduct_fee": 5, + "desc": "blabla" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "shopid": "123456", + "shop_order_id": "123456", + "waybill_id": "123456", + "delivery_id": "123456", + "cancel_reason_id": 1, + "cancel_reason": "mock-cancel-reson", + "delivery_sign": "123456", + "shop_no": "shop_no_111" + }` + + canceler := new(DeliveryOrderCanceler) + err := json.Unmarshal([]byte(raw), canceler) + if err != nil { + t.Fatal(err) + } + + res, err := canceler.cancel(ts.URL+apiCancelDeliveryOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } + if res.DeductFee == 0 { + t.Error("Response 'deduct_fee' can not be empty") + } + if res.Desc == "" { + t.Error("Response 'desc' can not be empty") + } +} + +func TestGetAllImmediateDelivery(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/delivery/getall" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("Query 'access_token' can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok", + "list": [ + { + "delivery_id": "SFTC", + "delivery_name": "顺发同城" + }, + { + "delivery_id": "MTPS", + "delivery_name": "美团配送" + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + + res, err := getAllImmediateDelivery(ts.URL+apiGetAllImmediateDelivery, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } + if len(res.List) == 0 { + t.Error("Response 'list' can not be empty") + } else { + for _, item := range res.List { + if item.ID == "" { + t.Error("Response 'list.delivery_id' can not be empty") + } + if item.Name == "" { + t.Error("Response 'list.delivery_name' can not be empty") + } + } + } +} + +func TestGetBindAccount(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/shop/get" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("Query 'access_token' can not be empty") + } + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok", + "shop_list": [ + { + "delivery_id": "SFTC", + "shopid": "123456", + "audit_result": 1 + }, + { + "delivery_id": "MTPS", + "shopid": "123456", + "audit_result": 1 + } + ] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + + res, err := getBindAccount(ts.URL+apiGetDeliveryBindAccount, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } + if len(res.ShopList) == 0 { + t.Error("Response 'shop_list' can not be empty") + } else { + for _, item := range res.ShopList { + if item.DeliveryID == "" { + t.Error("Response 'shop_list.delivery_id' can not be empty") + } + if item.ShopID == "" { + t.Error("Response 'shop_list.shopid' can not be empty") + } + if item.AuditResult == 0 { + t.Error("Response 'audit_result.shopid' can not be empty") + } + } + } +} + +func TestGetDeliveryOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/order/get" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("Query 'access_token' can not be empty") + } + + params := struct { + ShopID string `json:"shopid"` + ShopOrderID string `json:"shop_order_id"` + ShopNo string `json:"shop_no"` + DeliverySign string `json:"delivery_sign"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + if params.ShopID == "" { + t.Error("Response column shopid can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Response column shop_order_id can not be empty") + } + if params.ShopNo == "" { + t.Error("Response column shop_no can not be empty") + } + if params.DeliverySign == "" { + t.Error("Response column delivery_sign can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok", + "order_status": 1, + "waybill_id": "string", + "rider_name": "string", + "rider_phone": "string", + "rider_lng": 3.14, + "rider_lat": 3.14 + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + + raw := `{ + "shopid": "xxxxxx", + "shop_order_id": "xxxxxx", + "shop_no": "xxxxxx", + "delivery_sign": "xxxxxx" + }` + + getter := new(DeliveryOrderGetter) + err := json.Unmarshal([]byte(raw), getter) + if err != nil { + t.Fatal(err) + } + + res, err := getter.get(ts.URL+apiGetDeliveryOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } + if res.WaybillID == "" { + t.Error("Response 'waybill_id' can not be empty") + } + if res.OrderStatus == 0 { + t.Error("Response 'order_status' can not be empty") + } + + if res.RiderName == "" { + t.Error("Response 'rider_name' can not be empty") + } + if res.RiderPhone == "" { + t.Error("Response 'rider_phone' can not be empty") + } + if res.RiderLng == 0 { + t.Error("Response 'rider_lng' can not be empty") + } + if res.RiderLat == 0 { + t.Error("Response 'rider_lat' can not be empty") + } +} + +func TestMockUpdateDeliveryOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/test_update_order" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("Query 'access_token' can not be empty") + } + + params := struct { + ShopID string `json:"shopid"` + ShopOrderID string `json:"shop_order_id"` + ActionTime uint `json:"action_time"` + OrderStatus int `json:"order_status"` + ActionMsg string `json:"action_msg"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + if params.ShopID == "" { + t.Error("Response column shopid can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Response column shop_order_id can not be empty") + } + if params.ActionTime == 0 { + t.Error("Response column action_time can not be empty") + } + if params.OrderStatus == 0 { + t.Error("Response column order_status can not be empty") + } + if params.ActionMsg == "" { + t.Error("Response column action_msg can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + + raw := `{ + "shopid": "test_shop_id", + "shop_order_id": "xxxxxxxxxxx", + "waybill_id": "xxxxxxxxxxxxx", + "action_time": 12345678, + "order_status": 101, + "action_msg": "xxxxxx" + }` + + mocker := new(UpdateDeliveryOrderMocker) + err := json.Unmarshal([]byte(raw), mocker) + if err != nil { + t.Fatal(err) + } + + res, err := mocker.mock(ts.URL+apiMockUpdateDeliveryOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } +} + +func TestPreAddDeliveryOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/order/pre_add" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + DeliveryID string `json:"delivery_id"` // 配送公司ID + OpenID string `json:"openid"` // 下单用户的openid + SubBizID string `json:"sub_biz_id"` // 子商户id,区分小程序内部多个子商户 + Sender struct { + Name string `json:"name"` // 姓名,最长不超过256个字符 + City string `json:"city"` // 城市名称,如广州市 + Address string `json:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"sender"` // 发件人信息,闪送、顺丰同城急送必须填写,美团配送、达达,若传了shop_no的值可不填该字段 + Receiver struct { + Name string `json:"name"` // 姓名,最长不超过256个字符 + City string `json:"city"` // 城市名称,如广州市 + Address string `json:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"receiver"` // 收件人信息 + Cargo struct { + GoodsValue float64 `json:"goods_value"` // 货物价格,单位为元,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-5000] + GoodsHeight float64 `json:"goods_height"` // 货物高度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-45] + GoodsLength float64 `json:"goods_length"` // 货物长度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-65] + GoodsWidth float64 `json:"goods_width"` // 货物宽度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsWeight float64 `json:"goods_weight"` // 货物重量,单位为kg,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsDetail struct { + Goods []struct { + Count uint `json:"good_count"` // 货物数量 + Name string `json:"good_name"` // 货品名称 + Price float32 `json:"good_price"` // 货品单价,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数) + Unit string `json:"good_unit"` // 货品单位,最长不超过20个字符 + } `json:"goods"` // 货物交付信息,最长不超过100个字符 + } `json:"goods_detail"` // 货物详情,最长不超过10240个字符 + GoodsPickupInfo string `json:"goods_pickup_info"` // 货物取货信息,用于骑手到店取货,最长不超过100个字符 + GoodsDeliveryInfo string `json:"goods_delivery_info"` // 货物交付信息,最长不超过100个字符 + CargoFirstClass string `json:"cargo_first_class"` // 品类一级类目 + CargoSecondClass string `json:"cargo_second_class"` // 品类二级类目 + } `json:"cargo"` // 货物信息 + OrderInfo struct { + DeliveryServiceCode string `json:"delivery_service_code"` // 配送服务代码 不同配送公司自定义,微信侧不理解 + OrderType uint8 `json:"order_type"` // 订单类型, 0: 即时单 1 预约单,如预约单,需要设置expected_delivery_time或expected_finish_time或expected_pick_time + ExpectedDeliveryTime uint `json:"expected_delivery_time"` // 期望派单时间(顺丰同城急送、达达、支持),unix-timestamp + ExpectedFinishTime uint `json:"expected_finish_time"` // 期望送达时间(顺丰同城急送、美团配送支持),unix-timestamp + ExpectedPickTime uint `json:"expected_pick_time"` // 期望取件时间(闪送支持),unix-timestamp + PoiSeq string `json:"poi_seq"` // 门店订单流水号,建议提供,方便骑手门店取货,最长不超过32个字符 + Note string `json:"note"` // 备注,最长不超过200个字符 + OrderTime uint `json:"order_time"` // 用户下单付款时间 + IsInsured uint8 `json:"is_insured"` // 是否保价,0,非保价,1.保价 + DeclaredValue float64 `json:"declared_value"` // 保价金额,单位为元,精确到分 + Tips float64 `json:"tips"` // 小费,单位为元, 下单一般不加小费 + IsDirectDelivery uint `json:"is_direct_delivery"` // 是否选择直拿直送(0:不需要;1:需要。选择直拿直送后,同一时间骑手只能配送此订单至完成,配送费用也相应高一些,闪送必须选1,达达可选0或1,其余配送公司不支持直拿直送) + CashOnDelivery uint `json:"cash_on_delivery"` // 骑手应付金额,单位为元,精确到分 + CashOnPickup uint `json:"cash_on_pickup"` // 骑手应收金额,单位为元,精确到分 + RiderPickMethod uint8 `json:"rider_pick_method"` // 物流流向,1:从门店取件送至用户;2:从用户取件送至门店 + IsFinishCodeNeeded uint8 `json:"is_finish_code_needed"` // 收货码(0:不需要;1:需要。收货码的作用是:骑手必须输入收货码才能完成订单妥投) + IsPickupCodeNeeded uint8 `json:"is_pickup_code_needed"` // 取货码(0:不需要;1:需要。取货码的作用是:骑手必须输入取货码才能从商家取货) + } `json:"order_info"` // 订单信息 + Shop struct { + WxaPath string `json:"wxa_path"` // 商家小程序的路径,建议为订单页面 + ImgURL string `json:"img_url"` // 商品缩略图 url + GoodsName string `json:"goods_name"` // 商品名称 + GoodsCount uint `json:"goods_count"` // 商品数量 + } `json:"shop"` // 商品信息,会展示到物流通知消息中 + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.ShopID == "" { + t.Error("Response column 'shopid' can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Response column 'shop_order_id' can not be empty") + } + if params.ShopNo == "" { + t.Error("Response column 'shop_no' can not be empty") + } + if params.DeliverySign == "" { + t.Error("Response column 'delivery_sign' can not be empty") + } + if params.DeliveryID == "" { + t.Error("Response column 'delivery_id' can not be empty") + } + if params.OpenID == "" { + t.Error("Response column 'openid' can not be empty") + } + if params.SubBizID == "" { + t.Error("Response column 'sub_biz_id' can not be empty") + } + + if params.Sender.Name == "" { + t.Error("Param 'sender.name' can not be empty") + } + if params.Sender.City == "" { + t.Error("Param 'sender.city' can not be empty") + } + if params.Sender.Address == "" { + t.Error("Param 'sender.address' can not be empty") + } + if params.Sender.AddressDetail == "" { + t.Error("Param 'sender.address_detail' can not be empty") + } + if params.Sender.Phone == "" { + t.Error("Param 'sender.phone' can not be empty") + } + if params.Sender.Lng == 0 { + t.Error("Param 'sender.lng' can not be empty") + } + if params.Sender.Lat == 0 { + t.Error("Param 'sender.lat' can not be empty") + } + if params.Sender.CoordinateType == 0 { + t.Error("Param 'sender.coordinate_type' can not be empty") + } + + if params.Receiver.Name == "" { + t.Error("Param 'receiver.name' can not be empty") + } + if params.Receiver.City == "" { + t.Error("Param 'receiver.city' can not be empty") + } + if params.Receiver.Address == "" { + t.Error("Param 'receiver.address' can not be empty") + } + if params.Receiver.AddressDetail == "" { + t.Error("Param 'receiver.address_detail' can not be empty") + } + if params.Receiver.Phone == "" { + t.Error("Param 'receiver.phone' can not be empty") + } + if params.Receiver.Lng == 0 { + t.Error("Param 'receiver.lng' can not be empty") + } + if params.Receiver.Lat == 0 { + t.Error("Param 'receiver.lat' can not be empty") + } + if params.Receiver.CoordinateType == 0 { + t.Error("Param 'receiver.coordinate_type' can not be empty") + } + if params.Cargo.GoodsValue == 0 { + t.Error("Param 'cargo.goods_value' can not be empty") + } + if params.Cargo.GoodsHeight == 0 { + t.Error("Param 'cargo.goods_height' can not be empty") + } + if params.Cargo.GoodsLength == 0 { + t.Error("Param 'cargo.goods_length' can not be empty") + } + if params.Cargo.GoodsWidth == 0 { + t.Error("Param 'cargo.goods_width' can not be empty") + } + if params.Cargo.GoodsWeight == 0 { + t.Error("Param 'cargo.goods_weight' can not be empty") + } + if params.Cargo.CargoFirstClass == "" { + t.Error("Param 'cargo.cargo_first_class' can not be empty") + } + if params.Cargo.CargoSecondClass == "" { + t.Error("Param 'cargo.cargo_second_class' can not be empty") + } + if len(params.Cargo.GoodsDetail.Goods) > 0 { + if params.Cargo.GoodsDetail.Goods[0].Count == 0 { + t.Error("Param 'cargo.goods_detail.goods.good_count' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Name == "" { + t.Error("Param 'cargo.goods_detail.goods.good_name' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Price == 0 { + t.Error("Param 'cargo.goods_detail.goods.good_price' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Unit == "" { + t.Error("Param 'cargo.goods_detail.goods.good_unit' can not be empty") + } + } + if params.OrderInfo.DeliveryServiceCode == "" { + t.Error("Param 'order_info.delivery_service_code' can not be empty") + } + if params.Shop.WxaPath == "" { + t.Error("Param 'shop.wxa_path' can not be empty") + } + if params.Shop.ImgURL == "" { + t.Error("Param 'shop.img_url' can not be empty") + } + if params.Shop.GoodsName == "" { + t.Error("Param 'shop.goods_name' can not be empty") + } + if params.Shop.GoodsCount == 0 { + t.Error("Param 'shop.goods_count' can not be empty") + } + + w.WriteHeader(http.StatusOK) + raw := `{ + "resultcode": 1, + "resultmsg": "ok", + "fee": 11, + "deliverfee": 11, + "couponfee": 1, + "insurancefee": 1000, + "tips": 1, + "insurancfee": 1, + "distance": 1001, + "dispatch_duration": 301, + "delivery_token": "1111111" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "cargo": { + "cargo_first_class": "美食宵夜", + "cargo_second_class": "零食小吃", + "goods_detail": { + "goods": [ + { + "good_count": 1, + "good_name": "水果", + "good_price": 11, + "good_unit": "元" + }, + { + "good_count": 2, + "good_name": "蔬菜", + "good_price": 21, + "good_unit": "元" + } + ] + }, + "goods_height": 1, + "goods_length": 3, + "goods_value": 5, + "goods_weight": 1, + "goods_width": 2 + }, + "delivery_id": "SFTC", + "delivery_sign": "01234567890123456789", + "openid": "oABC123456", + "order_info": { + "delivery_service_code": "xxx", + "expected_delivery_time": 1, + "is_direct_delivery": 1, + "is_finish_code_needed": 1, + "is_insured": 1, + "is_pickup_code_needed": 1, + "note": "test_note", + "order_time": 1555220757, + "order_type": 1, + "poi_seq": "1111", + "tips": 0 + }, + "receiver": { + "address": "xxx地铁站", + "address_detail": "2号楼202", + "city": "北京市", + "coordinate_type": 1, + "lat": 40.1529600001, + "lng": 116.5060300001, + "name": "老王", + "phone": "18512345678" + }, + "sender": { + "address": "xx大厦", + "address_detail": "1号楼101", + "city": "北京市", + "coordinate_type": 1, + "lat": 40.4486120001, + "lng": 116.3830750001, + "name": "刘一", + "phone": "13712345678" + }, + "shop": { + "goods_count": 2, + "goods_name": "宝贝", + "img_url": "https://mmbiz.qpic.cn/mmbiz_png/xxxxxxxxx/0?wx_fmt=png", + "wxa_path": "/page/index/index" + }, + "shop_no": "12345678", + "sub_biz_id": "sub_biz_id_1", + "shop_order_id": "SFTC_001", + "shopid": "122222222" + }` + + creator := new(DeliveryOrderCreator) + err := json.Unmarshal([]byte(raw), creator) + if err != nil { + t.Fatal(err) + } + + res, err := creator.prepare(ts.URL+apiPreAddDeliveryOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.Fee == 0 { + t.Error("Response 'fee' can not be empty") + } + if res.Deliverfee == 0 { + t.Error("Response 'deliverfee' can not be empty") + } + if res.Couponfee == 0 { + t.Error("Response 'couponfee' can not be empty") + } + if res.Tips == 0 { + t.Error("Response 'tips' can not be empty") + } + if res.Insurancefee == 0 { + t.Error("Response 'insurancefee' can not be empty") + } + if res.Distance == 0 { + t.Error("Response 'distance' can not be empty") + } + if res.DispatchDuration == 0 { + t.Error("Response 'dispatch_duration' can not be empty") + } +} + +func TestPreCancelDeliveryOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/order/precancel" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("Query 'access_token' can not be empty") + } + + params := struct { + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + DeliveryID string `json:"delivery_id"` // 快递公司ID + WaybillID string `json:"waybill_id"` // 配送单id + ReasonID uint8 `json:"cancel_reason_id"` // 取消原因Id + Reason string `json:"cancel_reason"` // 取消原因 + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.ShopID == "" { + t.Error("Param 'shopid' can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Param 'shop_order_id' can not be empty") + } + if params.ShopNo == "" { + t.Error("Param 'shop_no' can not be empty") + } + if params.DeliverySign == "" { + t.Error("Param 'delivery_sign' can not be empty") + } + if params.WaybillID == "" { + t.Error("Param 'waybill_id' can not be empty") + } + if params.DeliveryID == "" { + t.Error("Param 'delivery_id' can not be empty") + } + if params.ReasonID == 0 { + t.Error("Param 'cancel_reason_id' can not be empty") + } + if params.Reason == "" { + t.Error("Param 'cancel_reason' can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok", + "deduct_fee": 5, + "desc": "blabla" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "shopid": "123456", + "shop_order_id": "123456", + "waybill_id": "123456", + "delivery_id": "123456", + "cancel_reason_id": 1, + "cancel_reason": "xxxxxx", + "delivery_sign": "123456", + "shop_no": "shop_no_111" + }` + + canceler := new(DeliveryOrderCanceler) + err := json.Unmarshal([]byte(raw), canceler) + if err != nil { + t.Fatal(err) + } + + res, err := canceler.prepare(ts.URL+apiPreCancelDeliveryOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } + if res.DeductFee == 0 { + t.Error("Response 'deduct_fee' can not be empty") + } + if res.Desc == "" { + t.Error("Response 'desc' can not be empty") + } +} + +func TestReAddDeliveryOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/business/order/readd" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + DeliveryToken string `json:"delivery_token"` // 预下单接口返回的参数,配送公司可保证在一段时间内运费不变 + ShopID string `json:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no"` // 商家门店编号, 在配送公司登记,如果只有一个门店,可以不填 + DeliverySign string `json:"delivery_sign"` // 用配送公司提供的appSecret加密的校验串 + DeliveryID string `json:"delivery_id"` // 配送公司ID + OpenID string `json:"openid"` // 下单用户的openid + SubBizID string `json:"sub_biz_id"` // 子商户id,区分小程序内部多个子商户 + Sender struct { + Name string `json:"name"` // 姓名,最长不超过256个字符 + City string `json:"city"` // 城市名称,如广州市 + Address string `json:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"sender"` // 发件人信息,闪送、顺丰同城急送必须填写,美团配送、达达,若传了shop_no的值可不填该字段 + Receiver struct { + Name string `json:"name"` // 姓名,最长不超过256个字符 + City string `json:"city"` // 城市名称,如广州市 + Address string `json:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"receiver"` // 收件人信息 + Cargo struct { + GoodsValue float64 `json:"goods_value"` // 货物价格,单位为元,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-5000] + GoodsHeight float64 `json:"goods_height"` // 货物高度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-45] + GoodsLength float64 `json:"goods_length"` // 货物长度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-65] + GoodsWidth float64 `json:"goods_width"` // 货物宽度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsWeight float64 `json:"goods_weight"` // 货物重量,单位为kg,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsDetail struct { + Goods []struct { + Count uint `json:"good_count"` // 货物数量 + Name string `json:"good_name"` // 货品名称 + Price float32 `json:"good_price"` // 货品单价,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数) + Unit string `json:"good_unit"` // 货品单位,最长不超过20个字符 + } `json:"goods"` // 货物交付信息,最长不超过100个字符 + } `json:"goods_detail"` // 货物详情,最长不超过10240个字符 + GoodsPickupInfo string `json:"goods_pickup_info"` // 货物取货信息,用于骑手到店取货,最长不超过100个字符 + GoodsDeliveryInfo string `json:"goods_delivery_info"` // 货物交付信息,最长不超过100个字符 + CargoFirstClass string `json:"cargo_first_class"` // 品类一级类目 + CargoSecondClass string `json:"cargo_second_class"` // 品类二级类目 + } `json:"cargo"` // 货物信息 + OrderInfo struct { + DeliveryServiceCode string `json:"delivery_service_code"` // 配送服务代码 不同配送公司自定义,微信侧不理解 + OrderType uint8 `json:"order_type"` // 订单类型, 0: 即时单 1 预约单,如预约单,需要设置expected_delivery_time或expected_finish_time或expected_pick_time + ExpectedDeliveryTime uint `json:"expected_delivery_time"` // 期望派单时间(顺丰同城急送、达达、支持),unix-timestamp + ExpectedFinishTime uint `json:"expected_finish_time"` // 期望送达时间(顺丰同城急送、美团配送支持),unix-timestamp + ExpectedPickTime uint `json:"expected_pick_time"` // 期望取件时间(闪送支持),unix-timestamp + PoiSeq string `json:"poi_seq"` // 门店订单流水号,建议提供,方便骑手门店取货,最长不超过32个字符 + Note string `json:"note"` // 备注,最长不超过200个字符 + OrderTime uint `json:"order_time"` // 用户下单付款时间 + IsInsured uint8 `json:"is_insured"` // 是否保价,0,非保价,1.保价 + DeclaredValue float64 `json:"declared_value"` // 保价金额,单位为元,精确到分 + Tips float64 `json:"tips"` // 小费,单位为元, 下单一般不加小费 + IsDirectDelivery uint `json:"is_direct_delivery"` // 是否选择直拿直送(0:不需要;1:需要。选择直拿直送后,同一时间骑手只能配送此订单至完成,配送费用也相应高一些,闪送必须选1,达达可选0或1,其余配送公司不支持直拿直送) + CashOnDelivery uint `json:"cash_on_delivery"` // 骑手应付金额,单位为元,精确到分 + CashOnPickup uint `json:"cash_on_pickup"` // 骑手应收金额,单位为元,精确到分 + RiderPickMethod uint8 `json:"rider_pick_method"` // 物流流向,1:从门店取件送至用户;2:从用户取件送至门店 + IsFinishCodeNeeded uint8 `json:"is_finish_code_needed"` // 收货码(0:不需要;1:需要。收货码的作用是:骑手必须输入收货码才能完成订单妥投) + IsPickupCodeNeeded uint8 `json:"is_pickup_code_needed"` // 取货码(0:不需要;1:需要。取货码的作用是:骑手必须输入取货码才能从商家取货) + } `json:"order_info"` // 订单信息 + Shop struct { + WxaPath string `json:"wxa_path"` // 商家小程序的路径,建议为订单页面 + ImgURL string `json:"img_url"` // 商品缩略图 url + GoodsName string `json:"goods_name"` // 商品名称 + GoodsCount uint `json:"goods_count"` // 商品数量 + } `json:"shop"` // 商品信息,会展示到物流通知消息中 + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.DeliveryToken == "" { + t.Error("Response column 'delivery_token' can not be empty") + } + if params.ShopID == "" { + t.Error("Response column 'shopid' can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Response column 'shop_order_id' can not be empty") + } + if params.ShopNo == "" { + t.Error("Response column 'shop_no' can not be empty") + } + if params.DeliverySign == "" { + t.Error("Response column 'delivery_sign' can not be empty") + } + if params.DeliveryID == "" { + t.Error("Response column 'delivery_id' can not be empty") + } + if params.OpenID == "" { + t.Error("Response column 'openid' can not be empty") + } + if params.SubBizID == "" { + t.Error("Response column 'sub_biz_id' can not be empty") + } + + if params.Sender.Name == "" { + t.Error("Param 'sender.name' can not be empty") + } + if params.Sender.City == "" { + t.Error("Param 'sender.city' can not be empty") + } + if params.Sender.Address == "" { + t.Error("Param 'sender.address' can not be empty") + } + if params.Sender.AddressDetail == "" { + t.Error("Param 'sender.address_detail' can not be empty") + } + if params.Sender.Phone == "" { + t.Error("Param 'sender.phone' can not be empty") + } + if params.Sender.Lng == 0 { + t.Error("Param 'sender.lng' can not be empty") + } + if params.Sender.Lat == 0 { + t.Error("Param 'sender.lat' can not be empty") + } + if params.Sender.CoordinateType == 0 { + t.Error("Param 'sender.coordinate_type' can not be empty") + } + + if params.Receiver.Name == "" { + t.Error("Param 'receiver.name' can not be empty") + } + if params.Receiver.City == "" { + t.Error("Param 'receiver.city' can not be empty") + } + if params.Receiver.Address == "" { + t.Error("Param 'receiver.address' can not be empty") + } + if params.Receiver.AddressDetail == "" { + t.Error("Param 'receiver.address_detail' can not be empty") + } + if params.Receiver.Phone == "" { + t.Error("Param 'receiver.phone' can not be empty") + } + if params.Receiver.Lng == 0 { + t.Error("Param 'receiver.lng' can not be empty") + } + if params.Receiver.Lat == 0 { + t.Error("Param 'receiver.lat' can not be empty") + } + if params.Receiver.CoordinateType == 0 { + t.Error("Param 'receiver.coordinate_type' can not be empty") + } + if params.Cargo.GoodsValue == 0 { + t.Error("Param 'cargo.goods_value' can not be empty") + } + if params.Cargo.GoodsHeight == 0 { + t.Error("Param 'cargo.goods_height' can not be empty") + } + if params.Cargo.GoodsLength == 0 { + t.Error("Param 'cargo.goods_length' can not be empty") + } + if params.Cargo.GoodsWidth == 0 { + t.Error("Param 'cargo.goods_width' can not be empty") + } + if params.Cargo.GoodsWeight == 0 { + t.Error("Param 'cargo.goods_weight' can not be empty") + } + if params.Cargo.CargoFirstClass == "" { + t.Error("Param 'cargo.cargo_first_class' can not be empty") + } + if params.Cargo.CargoSecondClass == "" { + t.Error("Param 'cargo.cargo_second_class' can not be empty") + } + if len(params.Cargo.GoodsDetail.Goods) > 0 { + if params.Cargo.GoodsDetail.Goods[0].Count == 0 { + t.Error("Param 'cargo.goods_detail.goods.good_count' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Name == "" { + t.Error("Param 'cargo.goods_detail.goods.good_name' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Price == 0 { + t.Error("Param 'cargo.goods_detail.goods.good_price' can not be empty") + } + if params.Cargo.GoodsDetail.Goods[0].Unit == "" { + t.Error("Param 'cargo.goods_detail.goods.good_unit' can not be empty") + } + } + if params.OrderInfo.DeliveryServiceCode == "" { + t.Error("Param 'order_info.delivery_service_code' can not be empty") + } + if params.Shop.WxaPath == "" { + t.Error("Param 'shop.wxa_path' can not be empty") + } + if params.Shop.ImgURL == "" { + t.Error("Param 'shop.img_url' can not be empty") + } + if params.Shop.GoodsName == "" { + t.Error("Param 'shop.goods_name' can not be empty") + } + if params.Shop.GoodsCount == 0 { + t.Error("Param 'shop.goods_count' can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok", + "fee": 11, + "deliverfee": 11, + "couponfee": 1, + "tips": 1, + "insurancefee": 1000, + "insurancfee": 1, + "distance": 1001, + "waybill_id": "123456789", + "order_status": 101, + "finish_code": 1024, + "pickup_code": 2048, + "dispatch_duration": 300 + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + raw := `{ + "cargo": { + "cargo_first_class": "美食宵夜", + "cargo_second_class": "零食小吃", + "goods_detail": { + "goods": [ + { + "good_count": 1, + "good_name": "水果", + "good_price": 11, + "good_unit": "元" + }, + { + "good_count": 2, + "good_name": "蔬菜", + "good_price": 21, + "good_unit": "元" + } + ] + }, + "goods_height": 1, + "goods_length": 3, + "goods_value": 5, + "goods_weight": 1, + "goods_width": 2 + }, + "delivery_id": "SFTC", + "delivery_sign": "01234567890123456789", + "openid": "oABC123456", + "order_info": { + "delivery_service_code": "xxx", + "expected_delivery_time": 1, + "is_direct_delivery": 1, + "is_finish_code_needed": 1, + "is_insured": 1, + "is_pickup_code_needed": 1, + "note": "test_note", + "order_time": 1555220757, + "order_type": 1, + "poi_seq": "1111", + "tips": 0 + }, + "receiver": { + "address": "xxx地铁站", + "address_detail": "2号楼202", + "city": "北京市", + "coordinate_type": 1, + "lat": 40.1529600001, + "lng": 116.5060300001, + "name": "老王", + "phone": "18512345678" + }, + "sender": { + "address": "xx大厦", + "address_detail": "1号楼101", + "city": "北京市", + "coordinate_type": 1, + "lat": 40.4486120001, + "lng": 116.3830750001, + "name": "刘一", + "phone": "13712345678" + }, + "shop": { + "goods_count": 2, + "goods_name": "宝贝", + "img_url": "https://mmbiz.qpic.cn/mmbiz_png/xxxxxxxxx/0?wx_fmt=png", + "wxa_path": "/page/index/index" + }, + "shop_no": "12345678", + "sub_biz_id": "sub_biz_id_1", + "shop_order_id": "SFTC_001", + "shopid": "122222222", + "delivery_token": "xxxxxxxx" + }` + + creator := new(DeliveryOrderCreator) + err := json.Unmarshal([]byte(raw), creator) + if err != nil { + t.Fatal(err) + } + + res, err := creator.recreate(ts.URL+apiReAddDeliveryOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.Fee == 0 { + t.Error("Response 'fee' can not be empty") + } + if res.Deliverfee == 0 { + t.Error("Response 'deliverfee' can not be empty") + } + if res.Couponfee == 0 { + t.Error("Response 'couponfee' can not be empty") + } + if res.Tips == 0 { + t.Error("Response 'tips' can not be empty") + } + if res.Insurancefee == 0 { + t.Error("Response 'insurancefee' can not be empty") + } + if res.Distance == 0 { + t.Error("Response 'distance' can not be empty") + } + if res.WaybillID == "" { + t.Error("Response 'waybill_id' can not be empty") + } + if res.OrderStatus == 0 { + t.Error("Response 'order_status' can not be empty") + } + if res.FinishCode == 0 { + t.Error("Response 'finish_code' can not be empty") + } + if res.PickupCode == 0 { + t.Error("Response 'pickup_code' can not be empty") + } + if res.DispatchDuration == 0 { + t.Error("Response 'dispatch_duration' can not be empty") + } + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } +} + +func TestUpdateDeliveryOrder(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Error("UnExpect request method") + } + + if r.URL.EscapedPath() != "/cgi-bin/express/local/delivery/update_order" { + t.Error("Unexpected path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("Query 'access_token' can not be empty") + } + + params := struct { + WxToken string `json:"wx_token"` + ShopID string `json:"shopid"` + ShopOrderID string `json:"shop_order_id"` + ShopNo string `json:"shop_no"` + WaybillID string `json:"waybill_id"` + ActionTime uint `json:"action_time"` + OrderStatus int `json:"order_status"` + ActionMsg string `json:"action_msg"` + WxaPath string `json:"wxa_path"` + Agent struct { + Name string `json:"name"` + Phone string `json:"phone"` + IsPhoneEncrypted uint8 `json:"is_phone_encrypted"` + } `json:"agent"` + ExpectedDeliveryTime uint `json:"expected_delivery_time"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + if params.WxToken == "" { + t.Error("Response column wx_token can not be empty") + } + if params.Agent.Name == "" { + t.Error("Response column agent.name can not be empty") + } + if params.Agent.Phone == "" { + t.Error("Response column agent.phone can not be empty") + } + if params.Agent.IsPhoneEncrypted == 0 { + t.Error("Response column agent.is_phone_encrypted can not be empty") + } + if params.ShopID == "" { + t.Error("Response column shopid can not be empty") + } + if params.ShopNo == "" { + t.Error("Response column shop_no can not be empty") + } + if params.WaybillID == "" { + t.Error("Response column waybill_id can not be empty") + } + if params.ShopOrderID == "" { + t.Error("Response column expected_delivery_time can not be empty") + } + if params.ExpectedDeliveryTime == 0 { + t.Error("Response column action_time can not be empty") + } + if params.ActionTime == 0 { + t.Error("Response column action_time can not be empty") + } + if params.OrderStatus == 0 { + t.Error("Response column order_status can not be empty") + } + if params.ActionMsg == "" { + t.Error("Response column action_msg can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "resultcode": 1, + "resultmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + + raw := `{ + "wx_token": "xxxxxx", + "shopid": "test_shop_id", + "shop_no": "test_shop_id", + "shop_order_id": "xxxxxxxxxxx", + "waybill_id": "xxxxxxxxxxxxx", + "action_time": 12345678, + "order_status": 101, + "action_msg": "xxxxxx", + "wxa_path": "xxxxxx", + "expected_delivery_time": 123456, + "agent": { + "name": "xxxxxx", + "phone": "xxxxxx", + "is_phone_encrypted": 1 + } + }` + + updater := new(DeliveryOrderUpdater) + err := json.Unmarshal([]byte(raw), updater) + if err != nil { + t.Fatal(err) + } + + res, err := updater.update(ts.URL+apiUpdateDeliveryOrder, "mock-access-token") + if err != nil { + t.Fatal(err) + } + if res.ResultCode == 0 { + t.Error("Response 'resultcode' can not be empty") + } + if res.ResultMsg == "" { + t.Error("Response 'resultmsg' can not be empty") + } +} + +func TestOnDeliveryOrderStatusUpdate(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + aesKey := base64.StdEncoding.EncodeToString([]byte("mock-aes-key")) + srv, err := NewServer("mock-app-id", "mock-access-token", aesKey, "mock-mch-id", "mock-api-key", false) + if err != nil { + t.Fatal(err) + } + + srv.OnDeliveryOrderStatusUpdate(func(mix *DeliveryOrderStatusUpdateResult) *DeliveryOrderStatusUpdateReturn { + if mix.ToUserName == "" { + t.Error("ToUserName can not be empty") + } + + if mix.FromUserName == "" { + t.Error("FromUserName can not be empty") + } + if mix.CreateTime == 0 { + t.Error("CreateTime can not be zero") + } + if mix.MsgType != "event" { + t.Error("Unexpected message type") + } + + if mix.Event != "update_waybill_status" { + t.Error("Unexpected message event") + } + + if mix.ShopID == "" { + t.Error("Result 'shopid' can not be zero") + } + + if mix.ShopOrderID == "" { + t.Error("Result 'shop_order_id' can not be zero") + } + + if mix.ShopNo == "" { + t.Error("Result 'shop_no' can not be zero") + } + + if mix.WaybillID == "" { + t.Error("Result 'waybill_id' can not be zero") + } + + if mix.ActionTime == 0 { + t.Error("Result 'action_time' can not be zero") + } + + if mix.OrderStatus == 0 { + t.Error("Result 'order_status' can not be zero") + } + + if mix.ActionMsg == "" { + t.Error("Result 'action_msg' can not be zero") + } + + if mix.Agent.Name == "" { + t.Error("Result 'agent.name' can not be zero") + } + + if mix.Agent.Phone == "" { + t.Error("Result 'agent.phone' can not be zero") + } + + return &DeliveryOrderStatusUpdateReturn{ + "mock-to-user-name", + "mock-from-user-name", + 20060102150405, + "mock-message-type", + "mock-event", + 0, + "mock-result-message", + } + }) + + if err := srv.Serve(w, r); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + jsonData := `{ + "ToUserName": "toUser", + "FromUserName": "fromUser", + "CreateTime": 1546924844, + "MsgType": "event", + "Event": "update_waybill_status", + "shopid": "123456", + "shop_order_id": "123456", + "waybill_id": "123456", + "action_time": 1546924844, + "order_status": 102, + "action_msg": "xxx", + "shop_no": "123456", + "agent": { + "name": "xxx", + "phone": "1234567" + } + }` + + res, err := http.Post(ts.URL, "application/json", strings.NewReader(jsonData)) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() +} diff --git a/app/lib/weapp/nearby_poi.go b/app/lib/weapp/nearby_poi.go new file mode 100644 index 0000000..7d5849c --- /dev/null +++ b/app/lib/weapp/nearby_poi.go @@ -0,0 +1,231 @@ +package weapp + +import ( + "encoding/json" + "fmt" +) + +// apis +const ( + apiAddNearbyPoi = "/wxa/addnearbypoi" + apiDeleteNearbyPoi = "/wxa/delnearbypoi" + apiGetNearbyPoiList = "/wxa/getnearbypoilist" + apiSetNearbyPoiShowStatus = "/wxa/setnearbypoishowstatus" +) + +// NearbyPoi 附近地点 +type NearbyPoi struct { + PicList PicList `json:"pic_list"` // 门店图片,最多9张,最少1张,上传门店图片如门店外景、环境设施、商品服务等,图片将展示在微信客户端的门店页。图片链接通过文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729中的《上传图文消息内的图片获取URL》接口获取。必填,文件格式为bmp、png、jpeg、jpg或gif,大小不超过5M pic_list是字符串,内容是一个json! + ServiceInfos ServiceInfos `json:"service_infos"` // 必服务标签列表 选填,需要填写服务标签ID、APPID、对应服务落地页的path路径,详细字段格式见下方示例 + StoreName string `json:"store_name"` // 门店名字 必填,门店名称需按照所选地理位置自动拉取腾讯地图门店名称,不可修改,如需修改请重现选择地图地点或重新创建地点 + Hour string `json:"hour"` // 营业时间,格式11:11-12:12 必填 + Credential string `json:"credential"` // 资质号 必填, 15位营业执照注册号或9位组织机构代码 + Address string `json:"address"` // 地址 必填 + CompanyName string `json:"company_name"` // 主体名字 必填 + QualificationList string `json:"qualification_list"` // 证明材料 必填 如果company_name和该小程序主体不一致,需要填qualification_list,详细规则见附近的小程序使用指南-如何证明门店的经营主体跟公众号或小程序帐号主体相关http://kf.qq.com/faq/170401MbUnim17040122m2qY.html + KFInfo KFInfo `json:"kf_info"` // 客服信息 选填,可自定义服务头像与昵称,具体填写字段见下方示例kf_info pic_list是字符串,内容是一个json! + PoiID string `json:"poi_id"` // 如果创建新的门店,poi_id字段为空 如果更新门店,poi_id参数则填对应门店的poi_id 选填 +} + +// PicList 门店图片 +type PicList struct { + List []string `json:"list"` +} + +// ServiceInfos 必服务标签列表 +type ServiceInfos struct { + ServiceInfos []ServiceInfo `json:"service_infos"` +} + +// ServiceInfo 必服务标签 +type ServiceInfo struct { + ID uint `json:"id"` + Type uint8 `json:"type"` + Name string `json:"name"` + AppID string `json:"appid"` + Path string `json:"path"` +} + +// KFInfo // 客服信息 +type KFInfo struct { + OpenKF bool `json:"open_kf"` + KFHeading string `json:"kf_headimg"` + KFName string `json:"kf_name"` +} + +// AddNearbyPoiResponse response of add position. +type AddNearbyPoiResponse struct { + CommonError + Data struct { + AuditID string `json:"audit_id"` // 审核单 ID + PoiID string `json:"poi_id"` // 附近地点 ID + RelatedCredential string `json:"related_credential"` // 经营资质证件号 + } `json:"data"` +} + +// Add 添加地点 +// token 接口调用凭证 +func (p *NearbyPoi) Add(token string) (*AddNearbyPoiResponse, error) { + api := baseURL + apiAddNearbyPoi + return p.add(api, token) +} + +func (p *NearbyPoi) add(api, token string) (*AddNearbyPoiResponse, error) { + + pisList, err := json.Marshal(p.PicList) + if err != nil { + return nil, fmt.Errorf("failed to marshal picture list to json: %v", err) + } + + serviceInfos, err := json.Marshal(p.ServiceInfos) + if err != nil { + return nil, fmt.Errorf("failed to marshal service info list to json: %v", err) + } + + kfInfo, err := json.Marshal(p.KFInfo) + if err != nil { + return nil, fmt.Errorf("failed to marshal customer service staff info list to json: %v", err) + } + + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "is_comm_nearby": "1", + "pic_list": string(pisList), + "service_infos": string(serviceInfos), + "store_name": p.StoreName, + "hour": p.Hour, + "credential": p.Credential, + "address": p.Address, + "company_name": p.CompanyName, + "qualification_list": p.QualificationList, + "kf_info": string(kfInfo), + "poi_id": p.PoiID, + } + + res := new(AddNearbyPoiResponse) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// DeleteNearbyPoi 删除地点 +// token 接口调用凭证 +// id 附近地点 ID +func DeleteNearbyPoi(token, id string) (*CommonError, error) { + api := baseURL + apiDeleteNearbyPoi + return deleteNearbyPoi(api, token, id) +} + +func deleteNearbyPoi(api, token, id string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "poi_id": id, + } + + res := new(CommonError) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// PositionList 地点列表 +type PositionList struct { + CommonError + Data struct { + LeftApplyNum uint `json:"left_apply_num"` // 剩余可添加地点个数 + MaxApplyNum uint `json:"max_apply_num"` // 最大可添加地点个数 + Data struct { + List []struct { + PoiID string `json:"poi_id"` // 附近地点 ID + QualificationAddress string `json:"qualification_address"` // 资质证件地址 + QualificationNum string `json:"qualification_num"` // 资质证件证件号 + AuditStatus int `json:"audit_status"` // 地点审核状态 + DisplayStatus int `json:"display_status"` // 地点展示在附近状态 + RefuseReason string `json:"refuse_reason"` // 审核失败原因,audit_status=4 时返回 + } `json:"poi_list"` // 地址列表 + } `json:"-"` + RawData string `json:"data"` // 地址列表的 JSON 格式字符串 + } `json:"data"` // 返回数据 +} + +// GetNearbyPoiList 查看地点列表 +// token 接口调用凭证 +// page 起始页id(从1开始计数) +// rows 每页展示个数(最多1000个) +func GetNearbyPoiList(token string, page, rows uint) (*PositionList, error) { + api := baseURL + apiGetNearbyPoiList + return getNearbyPoiList(api, token, page, rows) +} + +func getNearbyPoiList(api, token string, page, rows uint) (*PositionList, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "page": page, + "page_rows": rows, + } + + res := new(PositionList) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + err = json.Unmarshal([]byte(res.Data.RawData), &res.Data.Data) + if err != nil { + return nil, err + } + + return res, nil +} + +// NearbyPoiShowStatus 展示状态 +type NearbyPoiShowStatus int8 + +// 所有展示状态 +const ( + HideNearbyPoi NearbyPoiShowStatus = iota // 不展示 + ShowNearbyPoi // 展示 +) + +// SetNearbyPoiShowStatus 展示/取消展示附近小程序 +// token 接口调用凭证 +// poiID 附近地点 ID +// status 是否展示 +func SetNearbyPoiShowStatus(token, poiID string, status NearbyPoiShowStatus) (*CommonError, error) { + api := baseURL + apiSetNearbyPoiShowStatus + return setNearbyPoiShowStatus(api, token, poiID, status) +} + +func setNearbyPoiShowStatus(api, token, poiID string, status NearbyPoiShowStatus) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "poi_id": poiID, + "status": status, + } + + res := new(CommonError) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/nearby_poi_test.go b/app/lib/weapp/nearby_poi_test.go new file mode 100644 index 0000000..e1c1f98 --- /dev/null +++ b/app/lib/weapp/nearby_poi_test.go @@ -0,0 +1,348 @@ +package weapp + +import ( + "encoding/base64" + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" +) + +func TestAddNearbyPoi(t *testing.T) { + + localServer := http.NewServeMux() + localServer.HandleFunc("/notify", func(w http.ResponseWriter, r *http.Request) { + aesKey := base64.StdEncoding.EncodeToString([]byte("mock-aes-key")) + srv, err := NewServer("mock-app-id", "mock-access-token", aesKey, "mock-mch-id", "mock-api-key", false) + if err != nil { + t.Fatal(err) + } + + srv.OnAddNearbyPoi(func(mix *AddNearbyPoiResult) { + if mix.ToUserName == "" { + t.Error("ToUserName can not be empty") + } + + if mix.FromUserName == "" { + t.Error("FromUserName can not be empty") + } + if mix.CreateTime == 0 { + t.Error("CreateTime can not be zero") + } + if mix.MsgType != "event" { + t.Error("Unexpected message type") + } + + if mix.Event != "add_nearby_poi_audit_info" { + t.Error("Unexpected message event") + } + + if mix.AuditID == 0 { + t.Error("audit_id can not be zero") + } + if mix.Status == 0 { + t.Error("status can not be zero") + } + if mix.Reason == "" { + t.Error("reason can not be empty") + } + if mix.PoiID == 0 { + t.Error("poi_id can not be zero") + } + + }) + + if err := srv.Serve(w, r); err != nil { + t.Fatal(err) + } + }) + + tls := httptest.NewServer(localServer) + defer tls.Close() + + remoteServer := http.NewServeMux() + remoteServer.HandleFunc(apiAddNearbyPoi, func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiAddNearbyPoi { + t.Fatalf("Except to path '%s',get '%s'", apiAddNearbyPoi, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + IsCommNearby string `json:"is_comm_nearby"` + PicList string `json:"pic_list"` // 门店图片,最多9张,最少1张,上传门店图片如门店外景、环境设施、商品服务等,图片将展示在微信客户端的门店页。图片链接通过文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729中的《上传图文消息内的图片获取URL》接口获取。必填,文件格式为bmp、png、jpeg、jpg或gif,大小不超过5M pic_list是字符串,内容是一个json! + ServiceInfos string `json:"service_infos"` // 必服务标签列表 选填,需要填写服务标签ID、APPID、对应服务落地页的path路径,详细字段格式见下方示例 + StoreName string `json:"store_name"` // 门店名字 必填,门店名称需按照所选地理位置自动拉取腾讯地图门店名称,不可修改,如需修改请重现选择地图地点或重新创建地点 + Hour string `json:"hour"` // 营业时间,格式11:11-12:12 必填 + Credential string `json:"credential"` // 资质号 必填, 15位营业执照注册号或9位组织机构代码 + Address string `json:"address"` // 地址 必填 + CompanyName string `json:"company_name"` // 主体名字 必填 + QualificationList string `json:"qualification_list"` // 证明材料 必填 如果company_name和该小程序主体不一致,需要填qualification_list,详细规则见附近的小程序使用指南-如何证明门店的经营主体跟公众号或小程序帐号主体相关http://kf.qq.com/faq/170401MbUnim17040122m2qY.html + KFInfo string `json:"kf_info"` // 客服信息 选填,可自定义服务头像与昵称,具体填写字段见下方示例kf_info pic_list是字符串,内容是一个json! + PoiID string `json:"poi_id"` // 如果创建新的门店,poi_id字段为空 如果更新门店,poi_id参数则填对应门店的poi_id 选填 + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + if params.IsCommNearby != "1" { + t.Error("param pic_list is invalid") + } + if params.PicList == "" { + t.Error("param pic_list can not be empty") + } + if params.ServiceInfos == "" { + t.Error("param service_infos can not be empty") + } + if params.StoreName == "" { + t.Error("param store_name can not be empty") + } + if params.Hour == "" { + t.Error("param hour can not be empty") + } + if params.Credential == "" { + t.Error("param credential can not be empty") + } + if params.Address == "" { + t.Error("param address can not be empty") + } + if params.CompanyName == "" { + t.Error("param company_name can not be empty") + } + if params.QualificationList == "" { + t.Error("param qualification_list can not be empty") + } + if params.KFInfo == "" { + t.Error("param kf_info can not be empty") + } + if params.PoiID == "" { + t.Error("param poi_id can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok", + "data":{ + "audit_id": "xxxxx", + "poi_id": "xxxxx", + "related_credential":"xxxxx" + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + + raw = ` + + + 1488856741 + + + 11111 + 3 + + 111111 + ` + reader := strings.NewReader(raw) + http.Post(tls.URL+"/notify", "text/xml", reader) + }) + trs := httptest.NewServer(remoteServer) + defer trs.Close() + + poi := NearbyPoi{ + PicList: PicList{[]string{"first-mock-picture-url", "second-mock-picture-url", "third-mock-picture-url"}}, + ServiceInfos: ServiceInfos{[]ServiceInfo{ + {1, 1, "mock-name", "mock-app-id", "mock-path"}, + }}, + StoreName: "mock-store-name", + Hour: "11:11-12:12", + Credential: "mock-credential", + Address: "mock-address", // 地址 必填 + CompanyName: "mock-company-name", // 主体名字 必填 + QualificationList: "mock-qualification-list", // 证明材料 必填 如果company_name和该小程序主体不一致,需要填qualification_list,详细规则见附近的小程序使用指南-如何证明门店的经营主体跟公众号或小程序帐号主体相关http://kf.qq.com/faq/170401MbUnim17040122m2qY.html + KFInfo: KFInfo{true, "kf-head-img", "kf-name"}, // 客服信息 选填,可自定义服务头像与昵称,具体填写字段见下方示例kf_info pic_list是字符串,内容是一个json! + PoiID: "mock-poi-id", // 如果创建新的门店,poi_id字段为空 如果更新门店,poi_id参数则填对应门店的poi_id 选填 + } + _, err := poi.add(trs.URL+apiAddNearbyPoi, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestDeleteNearbyPoi(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiDeleteNearbyPoi { + t.Fatalf("Except to path '%s',get '%s'", apiDeleteNearbyPoi, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + PoiID string `json:"poi_id"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.PoiID == "" { + t.Error("Response column poi_id can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := deleteNearbyPoi(ts.URL+apiDeleteNearbyPoi, "mock-access-token", "mock-poi-id") + if err != nil { + t.Fatal(err) + } +} + +func TestGetNearbyPoiList(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiGetNearbyPoiList { + t.Fatalf("Except to path '%s',get '%s'", apiGetNearbyPoiList, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Page uint `json:"page"` + Rows uint `json:"page_rows"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Page == 0 { + t.Error("Response column page can not be empty") + } + + if params.Rows == 0 { + t.Error("Response column page_rows can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "", + "data": { + "left_apply_num": 9, + "max_apply_num": 10, + "data": "{\"poi_list\": [{\"poi_id\": \"123456\",\"qualification_address\": \"广东省广州市海珠区新港中路123号\",\"qualification_num\": \"123456789-1\",\"audit_status\": 3,\"display_status\": 0,\"refuse_reason\": \"\"}]}" + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getNearbyPoiList(ts.URL+apiGetNearbyPoiList, "mock-access-token", 1, 10) + if err != nil { + t.Fatal(err) + } + +} + +func TestSetNearbyPoiShowStatus(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiSetNearbyPoiShowStatus { + t.Fatalf("Except to path '%s',get '%s'", apiSetNearbyPoiShowStatus, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + PoiID string `json:"poi_id"` + Status uint8 `json:"status"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.PoiID == "" { + t.Error("Response column poi_id can not be empty") + } + + if params.Status == 0 { + t.Error("Response column status can not be zero") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := setNearbyPoiShowStatus(ts.URL+apiSetNearbyPoiShowStatus, "mock-access-token", "mock-poi-id", ShowNearbyPoi) + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/ocr.go b/app/lib/weapp/ocr.go new file mode 100644 index 0000000..01e5c13 --- /dev/null +++ b/app/lib/weapp/ocr.go @@ -0,0 +1,386 @@ +package weapp + +const ( + apiBankcard = "/cv/ocr/bankcard" + apiVehicleLicense = "/cv/ocr/driving" + apiDrivingLicense = "/cv/ocr/drivinglicense" + apiIDCard = "/cv/ocr/idcard" + apiBusinessLicense = "/cv/ocr/bizlicense" + apiPrintedText = "/cv/ocr/comm" +) + +// RecognizeMode 图片识别模式 +type RecognizeMode = string + +// 所有图片识别模式 +const ( + RecognizeModePhoto RecognizeMode = "photo" // 拍照模式 + RecognizeModeScan RecognizeMode = "scan" // 扫描模式 +) + +// BankCardResponse 识别银行卡返回数据 +type BankCardResponse struct { + CommonError + Number string `json:"number"` // 银行卡号 +} + +// BankCardByURL 通过URL识别银行卡 +// 接口限制: 此接口需要提供对应小程序/公众号 appid,开通权限后方可调用。 +// +// token 接口调用凭证 +// url 要检测的图片 url,传这个则不用传 img 参数。 +// mode 图片识别模式,photo(拍照模式)或 scan(扫描模式) +func BankCardByURL(token, cardURL string, mode RecognizeMode) (*BankCardResponse, error) { + api := baseURL + apiBankcard + return bankCardByURL(api, token, cardURL, mode) +} + +func bankCardByURL(api, token, cardURL string, mode RecognizeMode) (*BankCardResponse, error) { + res := new(BankCardResponse) + err := ocrByURL(api, token, cardURL, mode, res) + if err != nil { + return nil, err + } + + return res, nil +} + +// BankCard 通过文件识别银行卡 +// 接口限制: 此接口需要提供对应小程序/公众号 appid,开通权限后方可调用。 +// +// token 接口调用凭证 +// img form-data 中媒体文件标识,有filename、filelength、content-type等信息,传这个则不用传递 img_url。 +// mode 图片识别模式,photo(拍照模式)或 scan(扫描模式) +func BankCard(token, filename string, mode RecognizeMode) (*BankCardResponse, error) { + api := baseURL + apiBankcard + return bankCard(api, token, filename, mode) +} + +func bankCard(api, token, filename string, mode RecognizeMode) (*BankCardResponse, error) { + res := new(BankCardResponse) + err := ocrByFile(api, token, filename, mode, res) + if err != nil { + return nil, err + } + + return res, err +} + +// CardType 卡片方向 +type CardType = string + +// 所有卡片方向 +const ( + CardTypeFront = "Front" // 正面 + CardTypeBack = "Back" // 背面 +) + +// CardResponse 识别卡片返回数据 +type CardResponse struct { + CommonError + Type CardType `json:"type"` // 正面或背面,Front / Back + ValidDate string `json:"valid_date"` // 有效期 +} + +// DrivingLicenseResponse 识别行驶证返回数据 +type DrivingLicenseResponse struct { + CommonError + IDNum string `json:"id_num"` // 证号 + Name string `json:"name"` // 姓名 + Nationality string `json:"nationality"` // 国家 + Sex string `json:"sex"` // 性别 + Address string `json:"address"` // 地址 + BirthDate string `json:"birth_date"` // 出生日期 + IssueDate string `json:"issue_date"` // 初次领证日期 + CarClass string `json:"car_class"` // 准驾车型 + ValidFrom string `json:"valid_from"` // 有效期限起始日 + ValidTo string `json:"valid_to"` // 有效期限终止日 + OfficialSeal string `json:"official_seal"` // 印章文构 +} + +// DriverLicenseByURL 通过URL识别行驶证 +// 接口限制: 此接口需要提供对应小程序/公众号 appid,开通权限后方可调用。 +// +// token 接口调用凭证 +// url 要检测的图片 url,传这个则不用传 img 参数。 +// mode 图片识别模式,photo(拍照模式)或 scan(扫描模式) +func DriverLicenseByURL(token, licenseURL string) (*DrivingLicenseResponse, error) { + api := baseURL + apiDrivingLicense + return driverLicenseByURL(api, token, licenseURL) +} + +func driverLicenseByURL(api, token, licenseURL string) (*DrivingLicenseResponse, error) { + res := new(DrivingLicenseResponse) + err := ocrByURL(api, token, licenseURL, "", res) + if err != nil { + return nil, err + } + + return res, nil +} + +// DriverLicense 通过文件识别行驶证 +// 接口限制: 此接口需要提供对应小程序/公众号 appid,开通权限后方可调用。 +// +// token 接口调用凭证 +// img form-data 中媒体文件标识,有filename、filelength、content-type等信息,传这个则不用传递 img_url。 +// mode 图片识别模式,photo(拍照模式)或 scan(扫描模式) +func DriverLicense(token, filename string) (*DrivingLicenseResponse, error) { + api := baseURL + apiDrivingLicense + return driverLicense(api, token, filename) +} + +func driverLicense(api, token, filename string) (*DrivingLicenseResponse, error) { + res := new(DrivingLicenseResponse) + err := ocrByFile(api, token, filename, "", res) + if err != nil { + return nil, err + } + + return res, err +} + +// IDCardResponse 识别身份证返回数据 +type IDCardResponse = CardResponse + +// IDCardByURL 通过URL识别身份证 +// 接口限制: 此接口需要提供对应小程序/公众号 appid,开通权限后方可调用。 +// +// token 接口调用凭证 +// url 要检测的图片 url,传这个则不用传 img 参数。 +// mode 图片识别模式,photo(拍照模式)或 scan(扫描模式) +func IDCardByURL(token, cardURL string, mode RecognizeMode) (*IDCardResponse, error) { + api := baseURL + apiIDCard + return idCardByURL(api, token, cardURL, mode) +} + +func idCardByURL(api, token, cardURL string, mode RecognizeMode) (*IDCardResponse, error) { + res := new(IDCardResponse) + err := ocrByURL(api, token, cardURL, mode, res) + if err != nil { + return nil, err + } + + return res, nil +} + +// IDCard 通过文件识别身份证 +// 接口限制: 此接口需要提供对应小程序/公众号 appid,开通权限后方可调用。 +// +// token 接口调用凭证 +// img form-data 中媒体文件标识,有filename、filelength、content-type等信息,传这个则不用传递 img_url。 +// mode 图片识别模式,photo(拍照模式)或 scan(扫描模式) +func IDCard(token, filename string, mode RecognizeMode) (*IDCardResponse, error) { + api := baseURL + apiIDCard + return idCard(api, token, filename, mode) +} + +func idCard(api, token, filename string, mode RecognizeMode) (*IDCardResponse, error) { + res := new(IDCardResponse) + err := ocrByFile(api, token, filename, mode, res) + if err != nil { + return nil, err + } + + return res, err +} + +// VehicleLicenseResponse 识别卡片返回数据 +type VehicleLicenseResponse struct { + CommonError + VehicleType string `json:"vehicle_type"` + Owner string `json:"owner"` + Addr string `json:"addr"` + UseCharacter string `json:"use_character"` + Model string `json:"model"` + Vin string `json:"vin"` + EngineNum string `json:"engine_num"` + RegisterDate string `json:"register_date"` + IssueDate string `json:"issue_date"` + PlateNumB string `json:"plate_num_b"` + Record string `json:"record"` + PassengersNum string `json:"passengers_num"` + TotalQuality string `json:"total_quality"` + TotalprepareQualityQuality string `json:"totalprepare_quality_quality"` +} + +// VehicleLicenseByURL 行驶证 OCR 识别 +func VehicleLicenseByURL(token, cardURL string, mode RecognizeMode) (*VehicleLicenseResponse, error) { + api := baseURL + apiVehicleLicense + return vehicleLicenseByURL(api, token, cardURL, mode) +} + +func vehicleLicenseByURL(api, token, cardURL string, mode RecognizeMode) (*VehicleLicenseResponse, error) { + res := new(VehicleLicenseResponse) + err := ocrByURL(api, token, cardURL, mode, res) + if err != nil { + return nil, err + } + + return res, nil +} + +// VehicleLicense 通过文件识别行驶证 +func VehicleLicense(token, filename string, mode RecognizeMode) (*VehicleLicenseResponse, error) { + api := baseURL + apiVehicleLicense + return vehicleLicense(api, token, filename, mode) +} + +func vehicleLicense(api, token, filename string, mode RecognizeMode) (*VehicleLicenseResponse, error) { + res := new(VehicleLicenseResponse) + err := ocrByFile(api, token, filename, mode, res) + if err != nil { + return nil, err + } + + return res, err +} + +// LicensePoint 证件点 +type LicensePoint struct { + X uint `json:"x"` + Y uint `json:"y"` +} + +// LicensePosition 证件位置 +type LicensePosition struct { + LeftTop LicensePoint `json:"left_top"` + RightTop LicensePoint `json:"right_top"` + RightBottom LicensePoint `json:"right_bottom"` + LeftBottom LicensePoint `json:"left_bottom"` +} + +// BusinessLicenseResponse 营业执照 OCR 识别返回数据 +type BusinessLicenseResponse struct { + CommonError + RegNum string `json:"reg_num"` // 注册号 + Serial string `json:"serial"` // 编号 + LegalRepresentative string `json:"legal_representative"` // 法定代表人姓名 + EnterpriseName string `json:"enterprise_name"` // 企业名称 + TypeOfOrganization string `json:"type_of_organization"` // 组成形式 + Address string `json:"address"` // 经营场所/企业住所 + TypeOfEnterprise string `json:"type_of_enterprise"` // 公司类型 + BusinessScope string `json:"business_scope"` // 经营范围 + RegisteredCapital string `json:"registered_capital"` // 注册资本 + PaidInCapital string `json:"paid_in_capital"` // 实收资本 + ValidPeriod string `json:"valid_period"` // 营业期限 + RegisteredDate string `json:"registered_date"` // 注册日期/成立日期 + CertPosition struct { + Position LicensePosition `json:"pos"` + } `json:"cert_position"` // 营业执照位置 + ImgSize LicensePoint `json:"img_size"` // 图片大小 +} + +// BusinessLicenseByURL 通过链接进行营业执照 OCR 识别 +func BusinessLicenseByURL(token, cardURL string) (*BusinessLicenseResponse, error) { + api := baseURL + apiBusinessLicense + return businessLicenseByURL(api, token, cardURL) +} + +func businessLicenseByURL(api, token, cardURL string) (*BusinessLicenseResponse, error) { + res := new(BusinessLicenseResponse) + err := ocrByURL(api, token, cardURL, "", res) + if err != nil { + return nil, err + } + + return res, nil +} + +// BusinessLicense 通过文件进行营业执照 OCR 识别 +func BusinessLicense(token, filename string) (*BusinessLicenseResponse, error) { + api := baseURL + apiBusinessLicense + return businessLicense(api, token, filename) +} + +func businessLicense(api, token, filename string) (*BusinessLicenseResponse, error) { + res := new(BusinessLicenseResponse) + err := ocrByFile(api, token, filename, "", res) + if err != nil { + return nil, err + } + + return res, err +} + +// PrintedTextResponse 通用印刷体 OCR 识别返回数据 +type PrintedTextResponse struct { + CommonError + Items []struct { + Text string `json:"text"` + Position LicensePosition `json:"pos"` + } `json:"items"` // 识别结果 + ImgSize LicensePoint `json:"img_size"` // 图片大小 +} + +// PrintedTextByURL 通过链接进行通用印刷体 OCR 识别 +func PrintedTextByURL(token, cardURL string) (*PrintedTextResponse, error) { + api := baseURL + apiPrintedText + return printedTextByURL(api, token, cardURL) +} + +func printedTextByURL(api, token, cardURL string) (*PrintedTextResponse, error) { + res := new(PrintedTextResponse) + err := ocrByURL(api, token, cardURL, "", res) + if err != nil { + return nil, err + } + + return res, nil +} + +// PrintedText 通过文件进行通用印刷体 OCR 识别 +func PrintedText(token, filename string) (*PrintedTextResponse, error) { + api := baseURL + apiPrintedText + return printedText(api, token, filename) +} + +func printedText(api, token, filename string) (*PrintedTextResponse, error) { + res := new(PrintedTextResponse) + err := ocrByFile(api, token, filename, "", res) + if err != nil { + return nil, err + } + + return res, err +} + +func ocrByFile(api, token, filename string, mode RecognizeMode, response interface{}) error { + queries := requestQueries{ + "access_token": token, + "type": mode, + } + + url, err := encodeURL(api, queries) + if err != nil { + return err + } + + if err := postFormByFile(url, "img", filename, response); err != nil { + return err + } + + return nil +} + +func ocrByURL(api, token, cardURL string, mode RecognizeMode, response interface{}) error { + queries := requestQueries{ + "access_token": token, + "img_url": cardURL, + } + + if mode != "" { + queries["type"] = mode + } + + url, err := encodeURL(api, queries) + if err != nil { + return err + } + + if err := postJSON(url, nil, response); err != nil { + return err + } + + return nil +} diff --git a/app/lib/weapp/ocr_test.go b/app/lib/weapp/ocr_test.go new file mode 100644 index 0000000..4fdac9a --- /dev/null +++ b/app/lib/weapp/ocr_test.go @@ -0,0 +1,894 @@ +package weapp + +import ( + "fmt" + "io" + "net/http" + "net/http/httptest" + "os" + "path" + "testing" +) + +func TestBankCardByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc(apiBankcard, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiBankcard { + t.Fatalf("Except to path '%s',get '%s'", apiBankcard, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"type", "access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "id": "622213XXXXXXXXX" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := bankCardByURL(ts.URL+apiBankcard, "mock-access-token", ts.URL+"/mediaurl", RecognizeModePhoto) + if err != nil { + t.Fatal(err) + } + + _, err = bankCardByURL(ts.URL+apiBankcard, "mock-access-token", ts.URL+"/mediaurl", RecognizeModeScan) + if err != nil { + t.Fatal(err) + } +} + +func TestBankCard(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiBankcard { + t.Fatalf("Except to path '%s',get '%s'", apiBankcard, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"type", "access_token"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "id": "622213XXXXXXXXX" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := bankCard(ts.URL+apiBankcard, "mock-access-token", testIMGName, RecognizeModePhoto) + if err != nil { + t.Fatal(err) + } + _, err = bankCard(ts.URL+apiBankcard, "mock-access-token", testIMGName, RecognizeModeScan) + if err != nil { + t.Fatal(err) + } +} + +func TestDriverLicenseByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc(apiDrivingLicense, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiDrivingLicense { + t.Fatalf("Except to path '%s',get '%s'", apiDrivingLicense, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "id_num": "660601xxxxxxxx1234", + "name": "张三", + "sex": "男", + "nationality": "中国", + "address": "广东省东莞市xxxxx号", + "birth_date": "1990-12-21", + "issue_date": "2012-12-21", + "car_class": "C1", + "valid_from": "2018-07-06", + "valid_to": "2020-07-01", + "official_seal": "xx市公安局公安交通管理局" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := driverLicenseByURL(ts.URL+apiDrivingLicense, "mock-access-token", ts.URL+"/mediaurl") + if err != nil { + t.Fatal(err) + } +} + +func TestDriverLicense(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiDrivingLicense { + t.Fatalf("Except to path '%s',get '%s'", apiDrivingLicense, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "id_num": "660601xxxxxxxx1234", + "name": "张三", + "sex": "男", + "nationality": "中国", + "address": "广东省东莞市xxxxx号", + "birth_date": "1990-12-21", + "issue_date": "2012-12-21", + "car_class": "C1", + "valid_from": "2018-07-06", + "valid_to": "2020-07-01", + "official_seal": "xx市公安局公安交通管理局" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := driverLicense(ts.URL+apiDrivingLicense, "mock-access-token", testIMGName) + if err != nil { + t.Fatal(err) + } +} + +func TestBusinessLicenseByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc("/cv/ocr/bizlicense", func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + if r.URL.EscapedPath() != "/cv/ocr/bizlicense" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "reg_num": "123123", + "serial": "123123", + "legal_representative": "张三", + "enterprise_name": "XX饮食店", + "type_of_organization": "个人经营", + "address": "XX市XX区XX路XX号", + "type_of_enterprise": "xxx", + "business_scope": "中型餐馆(不含凉菜、不含裱花蛋糕,不含生食海产品)。", + "registered_capital": "200万", + "paid_in_capital": "200万", + "valid_period": "2019年1月1日", + "registered_date": "2018年1月1日", + "cert_position": { + "pos": { + "left_top": { + "x": 155, + "y": 191 + }, + "right_top": { + "x": 725, + "y": 157 + }, + "right_bottom": { + "x": 743, + "y": 512 + }, + "left_bottom": { + "x": 164, + "y": 525 + } + } + }, + "img_size": { + "w": 966, + "h": 728 + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := businessLicenseByURL(ts.URL+apiBusinessLicense, "mock-access-token", ts.URL+"/mediaurl") + if err != nil { + t.Fatal(err) + } +} + +func TestBusinessLicense(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + if r.URL.EscapedPath() != "/cv/ocr/bizlicense" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "reg_num": "123123", + "serial": "123123", + "legal_representative": "张三", + "enterprise_name": "XX饮食店", + "type_of_organization": "个人经营", + "address": "XX市XX区XX路XX号", + "type_of_enterprise": "xxx", + "business_scope": "中型餐馆(不含凉菜、不含裱花蛋糕,不含生食海产品)。", + "registered_capital": "200万", + "paid_in_capital": "200万", + "valid_period": "2019年1月1日", + "registered_date": "2018年1月1日", + "cert_position": { + "pos": { + "left_top": { + "x": 155, + "y": 191 + }, + "right_top": { + "x": 725, + "y": 157 + }, + "right_bottom": { + "x": 743, + "y": 512 + }, + "left_bottom": { + "x": 164, + "y": 525 + } + } + }, + "img_size": { + "w": 966, + "h": 728 + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := businessLicense(ts.URL+apiBusinessLicense, "mock-access-token", testIMGName) + if err != nil { + t.Fatal(err) + } +} + +func TestPrintedTextByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc("/cv/ocr/comm", func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + if r.URL.EscapedPath() != "/cv/ocr/comm" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "items": [ + { + "text": "腾讯", + "pos": { + "left_top": { + "x": 575, + "y": 519 + }, + "right_top": { + "x": 744, + "y": 519 + }, + "right_bottom": { + "x": 744, + "y": 532 + }, + "left_bottom": { + "x": 573, + "y": 532 + } + } + }, + { + "text": "微信团队", + "pos": { + "left_top": { + "x": 670, + "y": 516 + }, + "right_top": { + "x": 762, + "y": 517 + }, + "right_bottom": { + "x": 762, + "y": 532 + }, + "left_bottom": { + "x": 670, + "y": 531 + } + } + } + ], + "img_size": { + "w": 1280, + "h": 720 + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := printedTextByURL(ts.URL+apiPrintedText, "mock-access-token", ts.URL+"/mediaurl") + if err != nil { + t.Fatal(err) + } +} + +func TestPrintedText(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + if r.URL.EscapedPath() != "/cv/ocr/comm" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "items": [ + { + "text": "腾讯", + "pos": { + "left_top": { + "x": 575, + "y": 519 + }, + "right_top": { + "x": 744, + "y": 519 + }, + "right_bottom": { + "x": 744, + "y": 532 + }, + "left_bottom": { + "x": 573, + "y": 532 + } + } + }, + { + "text": "微信团队", + "pos": { + "left_top": { + "x": 670, + "y": 516 + }, + "right_top": { + "x": 762, + "y": 517 + }, + "right_bottom": { + "x": 762, + "y": 532 + }, + "left_bottom": { + "x": 670, + "y": 531 + } + } + } + ], + "img_size": { + "w": 1280, + "h": 720 + } + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := printedText(ts.URL+apiPrintedText, "mock-access-token", testIMGName) + if err != nil { + t.Fatal(err) + } +} + +func TestIDCardByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc(apiIDCard, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiIDCard { + t.Fatalf("Except to path '%s',get '%s'", apiIDCard, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"type", "access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "type": "Front", + "id": "44XXXXXXXXXXXXXXX1" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := idCardByURL(ts.URL+apiIDCard, "mock-access-token", ts.URL+"/mediaurl", RecognizeModePhoto) + if err != nil { + t.Fatal(err) + } + + _, err = idCardByURL(ts.URL+apiIDCard, "mock-access-token", ts.URL+"/mediaurl", RecognizeModeScan) + if err != nil { + t.Fatal(err) + } +} + +func TestIDCard(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiIDCard { + t.Fatalf("Except to path '%s',get '%s'", apiIDCard, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + queries := []string{"type", "access_token"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok", + "type": "Front", + "id": "44XXXXXXXXXXXXXXX1" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := idCard(ts.URL+apiIDCard, "mock-access-token", testIMGName, RecognizeModePhoto) + if err != nil { + t.Fatal(err) + } + _, err = idCard(ts.URL+apiIDCard, "mock-access-token", testIMGName, RecognizeModeScan) + if err != nil { + t.Fatal(err) + } +} + +func TestVehicleLicenseByURL(t *testing.T) { + server := http.NewServeMux() + server.HandleFunc(apiVehicleLicense, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiVehicleLicense { + t.Fatalf("Except to path '%s',get '%s'", apiVehicleLicense, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + queries := []string{"type", "access_token", "img_url"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "vhicle_type": "小型普通客⻋", + "owner": "东莞市xxxxx机械厂", + "addr": "广东省东莞市xxxxx号", + "use_character": "非营运", + "model": "江淮牌HFCxxxxxxx", + "vin": "LJ166xxxxxxxx51", + "engine_num": "J3xxxxx3", + "register_date": "2018-07-06", + "issue_date": "2018-07-01", + "plate_num_b": "粤xxxxx", + "record": "441xxxxxx3", + "passengers_num": "7人", + "total_quality": "2700kg", + "prepare_quality": "1995kg" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + }) + + server.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + ts := httptest.NewServer(server) + defer ts.Close() + + _, err := vehicleLicenseByURL(ts.URL+apiVehicleLicense, "mock-access-token", ts.URL+"/mediaurl", RecognizeModePhoto) + if err != nil { + t.Fatal(err) + } + + _, err = vehicleLicenseByURL(ts.URL+apiVehicleLicense, "mock-access-token", ts.URL+"/mediaurl", RecognizeModeScan) + if err != nil { + t.Fatal(err) + } +} + +func TestVehicleLicense(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiVehicleLicense { + t.Fatalf("Except to path '%s',get '%s'", apiVehicleLicense, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + queries := []string{"type", "access_token"} + for _, v := range queries { + content := r.Form.Get(v) + if content == "" { + t.Fatalf("Params [%s] can not be empty", v) + } + } + + if _, _, err := r.FormFile("img"); err != nil { + t.Fatal(err) + + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "vhicle_type": "小型普通客⻋", + "owner": "东莞市xxxxx机械厂", + "addr": "广东省东莞市xxxxx号", + "use_character": "非营运", + "model": "江淮牌HFCxxxxxxx", + "vin": "LJ166xxxxxxxx51", + "engine_num": "J3xxxxx3", + "register_date": "2018-07-06", + "issue_date": "2018-07-01", + "plate_num_b": "粤xxxxx", + "record": "441xxxxxx3", + "passengers_num": "7人", + "total_quality": "2700kg", + "prepare_quality": "1995kg" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := vehicleLicense(ts.URL+apiVehicleLicense, "mock-access-token", testIMGName, RecognizeModePhoto) + if err != nil { + t.Fatal(err) + } + _, err = vehicleLicense(ts.URL+apiVehicleLicense, "mock-access-token", testIMGName, RecognizeModeScan) + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/plugin.go b/app/lib/weapp/plugin.go new file mode 100644 index 0000000..0769e44 --- /dev/null +++ b/app/lib/weapp/plugin.go @@ -0,0 +1,189 @@ +package weapp + +const ( + apiPlugin = "/wxa/plugin" + apiDevPlugin = "/wxa/devplugin" +) + +// ApplyPlugin 向插件开发者发起使用插件的申请 +// accessToken 接口调用凭证 +// action string 是 此接口下填写 "apply" +// appID string 是 插件 appId +// reason string 否 申请使用理由 +func ApplyPlugin(token, appID, reason string) (*CommonError, error) { + api := baseURL + apiPlugin + return applyPlugin(api, token, appID, reason) +} + +func applyPlugin(api, token, appID, reason string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "action": "apply", + "plugin_appid": appID, + } + + if reason != "" { + params["reason"] = reason + } + + res := new(CommonError) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetPluginDevApplyListResponse 查询已添加的插件返回数据 +type GetPluginDevApplyListResponse struct { + CommonError + ApplyList []struct { + AppID string `json:"appid"` // 插件 appId + Status uint8 `json:"status"` // 插件状态 + Nickname string `json:"nickname"` // 插件昵称 + HeadImgURL string `json:"headimgurl"` // 插件头像 + Categories []struct { + First string `json:"first"` + Second string `json:"second"` + } `json:"categories"` // 使用者的类目 + CreateTime string `json:"create_time"` // 使用者的申请时间 + ApplyURL string `json:"apply_url"` // 使用者的小程序码 + Reason string `json:"reason"` // 使用者的申请说明 + } `json:"apply_list"` // 申请或使用中的插件列表 +} + +// GetPluginDevApplyList 获取当前所有插件使用方 +// accessToken 接口调用凭证 +// page number 是 要拉取第几页的数据 +// num 是 每页的记录数 +func GetPluginDevApplyList(token string, page, num uint) (*GetPluginDevApplyListResponse, error) { + api := baseURL + apiDevPlugin + return getPluginDevApplyList(api, token, page, num) +} + +func getPluginDevApplyList(api, token string, page, num uint) (*GetPluginDevApplyListResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "num": num, + "page": page, + "action": "dev_apply_list", + } + + res := new(GetPluginDevApplyListResponse) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetPluginListResponse 查询已添加的插件返回数据 +type GetPluginListResponse struct { + CommonError + PluginList []struct { + AppID string `json:"appid"` // 插件 appId + Status int8 `json:"status"` // 插件状态 + Nickname string `json:"nickname"` // 插件昵称 + HeadImgURL string `json:"headimgurl"` // 插件头像 + } `json:"plugin_list"` // 申请或使用中的插件列表 +} + +// GetPluginList 查询已添加的插件 +// accessToken 接口调用凭证 +func GetPluginList(token string) (*GetPluginListResponse, error) { + api := baseURL + apiPlugin + return getPluginList(api, token) +} + +func getPluginList(api, token string) (*GetPluginListResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "action": "list", + } + + res := new(GetPluginListResponse) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// DevAction 修改操作 +type DevAction string + +// 所有修改操作 +const ( + DevAgree DevAction = "dev_agree" // 同意申请 + DevRefuse DevAction = "dev_refuse" // 拒绝申请 + DevDelete DevAction = "dev_refuse" // 删除已拒绝的申请者 +) + +// SetDevPluginApplyStatus 修改插件使用申请的状态 +// accessToken 接口调用凭证 +// appID 使用者的 appid。同意申请时填写。 +// reason 拒绝理由。拒绝申请时填写。 +// action 修改操作 +func SetDevPluginApplyStatus(token, appID, reason string, action DevAction) (*CommonError, error) { + api := baseURL + apiDevPlugin + return setDevPluginApplyStatus(api, token, appID, reason, action) +} + +func setDevPluginApplyStatus(api, token, appID, reason string, action DevAction) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "action": action, + "appid": appID, + "reason": reason, + } + + res := new(CommonError) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// UnbindPlugin 查询已添加的插件 +// accessToken 接口调用凭证 +// appID 插件 appId +func UnbindPlugin(token, appID string) (*CommonError, error) { + api := baseURL + apiPlugin + return unbindPlugin(api, token, appID) +} + +func unbindPlugin(api, token, appID string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "action": "unbind", + "plugin_appid": appID, + } + + res := new(CommonError) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/plugin_test.go b/app/lib/weapp/plugin_test.go new file mode 100644 index 0000000..9ecdbdb --- /dev/null +++ b/app/lib/weapp/plugin_test.go @@ -0,0 +1,300 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestApplyPlugin(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiPlugin { + t.Fatalf("Except to path '%s',get '%s'", apiPlugin, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Action string `json:"action"` + PluginAppID string `json:"plugin_appid"` + Reason string `json:"reason"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Action != "apply" { + t.Error("Unexpected action") + } + + if params.PluginAppID == "" { + t.Error("Response column plugin_appid can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := applyPlugin(ts.URL+apiPlugin, "mock-access-token", "plugin-app-id", "mock-reason") + if err != nil { + t.Fatal(err) + } +} + +func TestGetPluginDevApplyList(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiDevPlugin { + t.Fatalf("Except to path '%s',get '%s'", apiDevPlugin, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Action string `json:"action"` + Page uint `json:"page"` + Number uint `json:"num"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Action != "dev_apply_list" { + t.Error("Unexpected action") + } + + if params.Page == 0 { + t.Error("Response column page can not be zero") + } + + if params.Number == 0 { + t.Error("Response column num can not be zero") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok", + "apply_list": [{ + "appid": "xxxxxxxxxxxxx", + "status": 1, + "nickname": "名称", + "headimgurl": "**********", + "reason": "polo has gone", + "apply_url": "*******", + "create_time": "1536305096", + "categories": [{ + "first": "IT科技", + "second": "硬件与设备" + }] + }] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getPluginDevApplyList(ts.URL+apiDevPlugin, "mock-access-token", 1, 2) + if err != nil { + t.Fatal(err) + } +} + +func TestGetPluginList(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiPlugin { + t.Fatalf("Except to path '%s',get '%s'", apiPlugin, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Action string `json:"action"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Action != "list" { + t.Error("Unexpected action") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok", + "plugin_list": [{ + "appid": "aaaa", + "status": 1, + "nickname": "插件昵称", + "headimgurl": "http://plugin.qq.com" + }] + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := getPluginList(ts.URL+apiPlugin, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} + +func TestSetDevPluginApplyStatus(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiDevPlugin { + t.Fatalf("Except to path '%s',get '%s'", apiDevPlugin, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Action string `json:"action"` + AppID string `json:"appid"` + Reason string `json:"reason"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Action == "" { + t.Error("Response column action can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := setDevPluginApplyStatus(ts.URL+apiDevPlugin, "mock-access-token", "mock-plugin-app-id", "mock-reason", DevAgree) + if err != nil { + t.Fatal(err) + } +} + +func TestUnbindPlugin(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiPlugin { + t.Fatalf("Except to path '%s',get '%s'", apiPlugin, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Action string `json:"action"` + PluginAppID string `json:"plugin_appid"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Action != "unbind" { + t.Error("Unexpected action") + } + + if params.PluginAppID == "" { + t.Error("Response column plugin_appid can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := unbindPlugin(ts.URL+apiPlugin, "mock-access-token", "mock-plugin-app-id") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/qr_code.go b/app/lib/weapp/qr_code.go new file mode 100644 index 0000000..09e5d5f --- /dev/null +++ b/app/lib/weapp/qr_code.go @@ -0,0 +1,118 @@ +package weapp + +import ( + "encoding/json" + "errors" + "net/http" + "strings" +) + +const ( + apiGetQrCode = "/wxa/getwxacode" + apiGetUnlimitedQRCode = "/wxa/getwxacodeunlimit" + apiCreateQRCode = "/cgi-bin/wxaapp/createwxaqrcode" +) + +// Color QRCode color +type Color struct { + R string `json:"r"` + G string `json:"g"` + B string `json:"b"` +} + +// QRCode 小程序码参数 +type QRCode struct { + Path string `json:"path"` + Width int `json:"width,omitempty"` + AutoColor bool `json:"auto_color,omitempty"` + LineColor Color `json:"line_color,omitempty"` + IsHyaline bool `json:"is_hyaline,omitempty"` +} + +// Get 获取小程序码 +// 可接受path参数较长 生成个数受限 永久有效 适用于需要的码数量较少的业务场景 +// +// token 微信access_token +func (code *QRCode) Get(token string) (*http.Response, *CommonError, error) { + api := baseURL + apiGetQrCode + return code.get(api, token) +} + +func (code *QRCode) get(api, token string) (*http.Response, *CommonError, error) { + return qrCodeRequest(api, token, code) +} + +// UnlimitedQRCode 小程序码参数 +type UnlimitedQRCode struct { + Scene string `json:"scene"` + Page string `json:"page,omitempty"` + Width int `json:"width,omitempty"` + AutoColor bool `json:"auto_color,omitempty"` + LineColor Color `json:"line_color,omitempty"` + IsHyaline bool `json:"is_hyaline,omitempty"` +} + +// Get 获取小程序码 +// 可接受页面参数较短 生成个数不受限 适用于需要的码数量极多的业务场景 +// 根路径前不要填加'/' 不能携带参数(参数请放在scene字段里) +// +// token 微信access_token +func (code *UnlimitedQRCode) Get(token string) (*http.Response, *CommonError, error) { + api := baseURL + apiGetUnlimitedQRCode + return code.get(api, token) +} + +func (code *UnlimitedQRCode) get(api, token string) (*http.Response, *CommonError, error) { + return qrCodeRequest(api, token, code) +} + +// QRCodeCreator 二维码创建器 +type QRCodeCreator struct { + Path string `json:"path"` // 扫码进入的小程序页面路径,最大长度 128 字节,不能为空;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar",即可在 wx.getLaunchOptionsSync 接口中的 query 参数获取到 {foo:"bar"}。 + Width int `json:"width,omitempty"` // 二维码的宽度,单位 px。最小 280px,最大 1280px +} + +// Create 获取小程序二维码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制 +// 通过该接口生成的小程序码,永久有效,有数量限制 +// +// token 微信access_token +func (creator *QRCodeCreator) Create(token string) (*http.Response, *CommonError, error) { + api := baseURL + apiCreateQRCode + return creator.create(api, token) +} + +func (creator *QRCodeCreator) create(api, token string) (*http.Response, *CommonError, error) { + return qrCodeRequest(api, token, creator) +} + +// 向微信服务器获取二维码 +// 返回 HTTP 请求实例 +func qrCodeRequest(api, token string, params interface{}) (*http.Response, *CommonError, error) { + + url, err := tokenAPI(api, token) + if err != nil { + return nil, nil, err + } + + res, err := postJSONWithBody(url, params) + if err != nil { + return nil, nil, err + } + + response := new(CommonError) + switch header := res.Header.Get("Content-Type"); { + case strings.HasPrefix(header, "application/json"): // 返回错误信息 + if err := json.NewDecoder(res.Body).Decode(response); err != nil { + res.Body.Close() + return nil, nil, err + } + return res, response, nil + + case strings.HasPrefix(header, "image"): // 返回文件 + return res, response, nil + + default: + res.Body.Close() + return nil, nil, errors.New("invalid response header: " + header) + } +} diff --git a/app/lib/weapp/qr_code_test.go b/app/lib/weapp/qr_code_test.go new file mode 100644 index 0000000..df68e93 --- /dev/null +++ b/app/lib/weapp/qr_code_test.go @@ -0,0 +1,212 @@ +package weapp + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "os" + "path" + "testing" +) + +func TestCreateQRCode(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + ePath := r.URL.EscapedPath() + if ePath != apiCreateQRCode { + t.Fatalf("Except to path '%s',get '%s'", apiCreateQRCode, ePath) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Path string `json:"path"` + Width int `json:"width,omitempty"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Path == "" { + t.Error("Response column path can not be empty") + } + + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + creator := QRCodeCreator{ + Path: "mock/path", + Width: 430, + } + resp, _, err := creator.create(ts.URL+apiCreateQRCode, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + resp.Body.Close() +} + +func TestGetQRCode(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + ePath := r.URL.EscapedPath() + if ePath != apiGetQrCode { + t.Fatalf("Except to path '%s',get '%s'", apiGetQrCode, ePath) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Path string `json:"path"` + Width int `json:"width,omitempty"` + AutoColor bool `json:"auto_color,omitempty"` + LineColor Color `json:"line_color,omitempty"` + IsHyaline bool `json:"is_hyaline,omitempty"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Path == "" { + t.Error("Response column path can not be empty") + } + + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + qr := QRCode{ + Path: "mock/path", + Width: 430, + AutoColor: true, + LineColor: Color{"r", "g", "b"}, + IsHyaline: true, + } + resp, _, err := qr.get(ts.URL+apiGetQrCode, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + resp.Body.Close() +} + +func TestGetUnlimitedQRCode(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + ePath := r.URL.EscapedPath() + if ePath != apiGetUnlimitedQRCode { + t.Fatalf("Except to path '%s',get '%s'", apiGetUnlimitedQRCode, ePath) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Scene string `json:"scene"` + Page string `json:"page,omitempty"` + Width int `json:"width,omitempty"` + AutoColor bool `json:"auto_color,omitempty"` + LineColor Color `json:"line_color,omitempty"` + IsHyaline bool `json:"is_hyaline,omitempty"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Scene == "" { + t.Error("Response column scene can not be empty") + } + + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + qr := UnlimitedQRCode{ + Scene: "mock-scene-data", + Page: "mock/page", + Width: 430, + AutoColor: true, + LineColor: Color{"r", "g", "b"}, + IsHyaline: true, + } + resp, _, err := qr.get(ts.URL+apiGetUnlimitedQRCode, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + resp.Body.Close() +} diff --git a/app/lib/weapp/search_submit_pages.go b/app/lib/weapp/search_submit_pages.go new file mode 100644 index 0000000..08770de --- /dev/null +++ b/app/lib/weapp/search_submit_pages.go @@ -0,0 +1,35 @@ +package weapp + +const ( + apiSearchSubmitPages = "/wxa/search/wxaapi_submitpages" +) + +// SearchSubmitPages 小程序页面收录请求 +type SearchSubmitPages struct { + Pages []SearchSubmitPage `json:"pages"` +} + +// SearchSubmitPage 请求收录的页面 +type SearchSubmitPage struct { + Path string `json:"path"` + Query string `json:"query"` +} + +// Send 提交收录请求 +func (s *SearchSubmitPages) Send(token string) (*CommonError, error) { + return s.send(baseURL+apiSearchSubmitPages, token) +} + +func (s *SearchSubmitPages) send(api, token string) (*CommonError, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(api, s, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/search_submit_pages_test.go b/app/lib/weapp/search_submit_pages_test.go new file mode 100644 index 0000000..00e1a62 --- /dev/null +++ b/app/lib/weapp/search_submit_pages_test.go @@ -0,0 +1,69 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestSearchSubmitPages(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiSearchSubmitPages { + t.Fatalf("Except to path '%s',get '%s'", apiSearchSubmitPages, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Pages []struct { + Path string `json:"path"` + Query string `json:"query"` + } `json:"pages"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if len(params.Pages) != 1 { + t.Fatal("param pages can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + sender := SearchSubmitPages{ + []SearchSubmitPage{ + { + Path: "/pages/index/index", + Query: "id=test", + }, + }, + } + + _, err := sender.send(ts.URL+apiSearchSubmitPages, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/sec_check.go b/app/lib/weapp/sec_check.go new file mode 100644 index 0000000..a46f892 --- /dev/null +++ b/app/lib/weapp/sec_check.go @@ -0,0 +1,105 @@ +package weapp + +// 检测地址 +const ( + apiIMGSecCheck = "/wxa/img_sec_check" + apiMSGSecCheck = "/wxa/msg_sec_check" + apiMediaCheckAsync = "/wxa/media_check_async" +) + +// IMGSecCheck 本地图片检测 +// 官方文档: https://developers.weixin.qq.com/miniprogram/dev/api/imgSecCheck.html +// +// filename 要检测的图片本地路径 +// token 接口调用凭证(access_token) +func IMGSecCheck(token, filename string) (*CommonError, error) { + api := baseURL + apiIMGSecCheck + return imgSecCheck(api, token, filename) +} + +func imgSecCheck(api, token, filename string) (*CommonError, error) { + + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postFormByFile(url, "media", filename, res); err != nil { + return nil, err + } + + return res, nil +} + +// MSGSecCheck 文本检测 +// 官方文档: https://developers.weixin.qq.com/miniprogram/dev/api/msgSecCheck.html +// +// content 要检测的文本内容,长度不超过 500KB,编码格式为utf-8 +// token 接口调用凭证(access_token) +func MSGSecCheck(token, content string) (*CommonError, error) { + api := baseURL + apiMSGSecCheck + return msgSecCheck(api, token, content) +} + +func msgSecCheck(api, token, content string) (*CommonError, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "content": content, + } + + res := new(CommonError) + if err = postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} + +// MediaType 检测内容类型 +type MediaType = uint8 + +// 所有检测内容类型 +const ( + _ MediaType = iota + MediaTypeAudio // 音频 + MediaTypeImage // 图片 +) + +// CheckMediaResponse 异步校验图片/音频返回数据 +type CheckMediaResponse struct { + CommonError + TraceID string `json:"trace_id"` +} + +// MediaCheckAsync 异步校验图片/音频是否含有违法违规内容。 +// +// mediaURL 要检测的多媒体url +// mediaType 接口调用凭证(access_token) +func MediaCheckAsync(token, mediaURL string, mediaType MediaType) (*CheckMediaResponse, error) { + api := baseURL + apiMediaCheckAsync + return mediaCheckAsync(api, token, mediaURL, mediaType) +} + +func mediaCheckAsync(api, token, mediaURL string, mediaType MediaType) (*CheckMediaResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "media_url": mediaURL, + "media_type": mediaType, + } + + res := new(CheckMediaResponse) + if err = postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/sec_check_test.go b/app/lib/weapp/sec_check_test.go new file mode 100644 index 0000000..72f5de1 --- /dev/null +++ b/app/lib/weapp/sec_check_test.go @@ -0,0 +1,240 @@ +package weapp + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "os" + "path" + "strings" + "testing" +) + +func TestIMGSecCheck(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiIMGSecCheck { + t.Fatalf("Except to path '%s',get '%s'", apiIMGSecCheck, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + if _, _, err := r.FormFile("media"); err != nil { + t.Fatal(err) + + } + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := imgSecCheck(ts.URL+apiIMGSecCheck, "mock-access-token", testIMGName) + if err != nil { + t.Fatal(err) + } +} + +func TestMediaCheckAsync(t *testing.T) { + + localServer := http.NewServeMux() + localServer.HandleFunc("/notify", func(w http.ResponseWriter, r *http.Request) { + aesKey := base64.StdEncoding.EncodeToString([]byte("mock-aes-key")) + srv, err := NewServer("mock-app-id", "mock-access-token", aesKey, "mock-mch-id", "mock-api-key", false) + if err != nil { + t.Fatal(err) + } + + srv.OnMediaCheckAsync(func(mix *MediaCheckAsyncResult) { + if mix.ToUserName == "" { + t.Error("ToUserName can not be empty") + } + + if mix.FromUserName == "" { + t.Error("FromUserName can not be empty") + } + if mix.CreateTime == 0 { + t.Error("CreateTime can not be empty") + } + if mix.MsgType != "event" { + t.Error("Unexpected message type") + } + if mix.Event != "wxa_media_check" { + t.Error("Unexpected message event") + } + if mix.AppID == "" { + t.Error("AppID can not be empty") + } + if mix.TraceID == "" { + t.Error("TraceID can not be empty") + } + + }) + + if err := srv.Serve(w, r); err != nil { + t.Fatal(err) + } + }) + + tls := httptest.NewServer(localServer) + defer tls.Close() + + remoteServer := http.NewServeMux() + remoteServer.HandleFunc(apiMediaCheckAsync, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiMediaCheckAsync { + t.Fatalf("Except to path '%s',get '%s'", apiMediaCheckAsync, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + MediaURL string `json:"media_url"` + MediaType uint8 `json:"media_type"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.MediaURL == "" { + t.Error("Response column media_url can not be empty") + } + + if params.MediaType == 0 { + t.Error("Response column media_type can not be zero") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode" : 0, + "errmsg" : "ok", + "trace_id" : "967e945cd8a3e458f3c74dcb886068e9" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + + raw = `{ + "ToUserName" : "gh_38cc49f9733b", + "FromUserName" : "oH1fu0FdHqpToe2T6gBj0WyB8iS1", + "CreateTime" : 1552465698, + "MsgType" : "event", + "Event" : "wxa_media_check", + "isrisky" : 0, + "extra_info_json" : "", + "appid" : "wxd8c59133dfcbfc71", + "trace_id" : "967e945cd8a3e458f3c74dcb886068e9", + "status_code" : 0 + }` + reader := strings.NewReader(raw) + http.Post(tls.URL+"/notify", "application/json", reader) + }) + + remoteServer.HandleFunc("/mediaurl", func(w http.ResponseWriter, r *http.Request) { + filename := testIMGName + file, err := os.Open(filename) + if err != nil { + t.Fatal((err)) + } + defer file.Close() + + ext := path.Ext(filename) + ext = ext[1:len(ext)] + w.Header().Set("Content-Type", "image/"+ext) + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", path.Base(filename))) + w.WriteHeader(http.StatusOK) + + if _, err := io.Copy(w, file); err != nil { + t.Fatal(err) + } + }) + + trs := httptest.NewServer(remoteServer) + defer trs.Close() + + _, err := mediaCheckAsync(trs.URL+apiMediaCheckAsync, "mock-access-token", trs.URL+"/mediaurl", MediaTypeImage) + if err != nil { + t.Fatal(err) + } +} + +func TestMSGSecCheck(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != "/wxa/img_sec_check" { + t.Error("Invalid request path") + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + Content string `json:"content"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.Content == "" { + t.Error("Response column content can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := msgSecCheck(ts.URL+apiIMGSecCheck, "mock-access-token", "mock-content") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/server.go b/app/lib/weapp/server.go new file mode 100644 index 0000000..fd458bf --- /dev/null +++ b/app/lib/weapp/server.go @@ -0,0 +1,677 @@ +package weapp + +import ( + "encoding/base64" + "encoding/binary" + "encoding/json" + "encoding/xml" + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "reflect" + "strconv" + "strings" + "time" +) + +// MsgType 消息类型 +type MsgType = string + +// 所有消息类型 +const ( + MsgText MsgType = "text" // 文本消息类型 + MsgImg = "image" // 图片消息类型 + MsgCard = "miniprogrampage" // 小程序卡片消息类型 + MsgEvent = "event" // 事件类型 + MsgTrans = "transfer_customer_service" // 转发客服消息 +) + +// EventType 事件类型 +type EventType string + +// 所有事件类型 +const ( + EventQuotaGet EventType = "get_quota" // 查询商户余额 + EventCheckBusiness = "check_biz" // 取消订单事件 + EventMediaCheckAsync = "wxa_media_check" // 异步校验图片/音频 + EventAddExpressOrder = "add_waybill" // 请求下单事件 + EventExpressPathUpdate = "add_express_path" // 运单轨迹更新事件 + EventExpressOrderCancel = "cancel_waybill" // 审核商户事件 + EventUserTempsessionEnter = "user_enter_tempsession" // 用户进入临时会话状态 + EventNearbyPoiAuditInfoAdd = "add_nearby_poi_audit_info" // 附近小程序添加地点审核状态通知 + EventDeliveryOrderStatusUpdate = "update_waybill_status" // 配送单配送状态更新通知 + EventAgentPosQuery = "transport_get_agent_pos" // 查询骑手当前位置信息 + EventAuthInfoGet = "get_auth_info" // 使用授权码拉取授权信息 + EventAuthAccountCancel = "cancel_auth_account" // 取消授权帐号 + EventDeliveryOrderAdd = "transport_add_order" // 真实发起下单任务 + EventDeliveryOrderTipsAdd = "transport_add_tips" // 对待接单状态的订单增加小费 + EventDeliveryOrderCancel = "transport_cancel_order" // 取消订单操作 + EventDeliveryOrderReturnConfirm = "transport_confirm_return_to_biz" // 异常妥投商户收货确认 + EventDeliveryOrderPreAdd = "transport_precreate_order" // 预下单 + EventDeliveryOrderPreCancel = "transport_precancel_order" // 预取消订单 + EventDeliveryOrderQuery = "transport_query_order_status" // 查询订单状态 + EventDeliveryOrderReadd = "transport_readd_order" // 下单 + EventPreAuthCodeGet = "get_pre_auth_code" // 获取预授权码 + EventRiderScoreSet = "transport_set_rider_score" // 给骑手评分 +) + +// Server 微信通知服务处理器 +type Server struct { + appID string // 小程序 ID + mchID string // 商户号 + apiKey string // 商户签名密钥 + token string // 微信服务器验证令牌 + aesKey []byte // base64 解码后的消息加密密钥 + validate bool // 是否验证请求来自微信服务器 + + textMessageHandler func(*TextMessageResult) *TransferCustomerMessage + imageMessageHandler func(*ImageMessageResult) *TransferCustomerMessage + cardMessageHandler func(*CardMessageResult) *TransferCustomerMessage + userTempsessionEnterHandler func(*UserTempsessionEnterResult) + mediaCheckAsyncHandler func(*MediaCheckAsyncResult) + expressPathUpdateHandler func(*ExpressPathUpdateResult) + addNearbyPoiAuditHandler func(*AddNearbyPoiResult) + addExpressOrderHandler func(*AddExpressOrderResult) *AddExpressOrderReturn + expressOrderCancelHandler func(*CancelExpressOrderResult) *CancelExpressOrderReturn + checkExpressBusinessHandler func(*CheckExpressBusinessResult) *CheckExpressBusinessReturn + quotaGetHandler func(*GetExpressQuotaResult) *GetExpressQuotaReturn + deliveryOrderStatusUpdateHandler func(*DeliveryOrderStatusUpdateResult) *DeliveryOrderStatusUpdateReturn + agentPosQueryHandler func(*AgentPosQueryResult) *AgentPosQueryReturn + authInfoGetHandler func(*AuthInfoGetResult) *AuthInfoGetReturn + authAccountCancelHandler func(*CancelAuthResult) *CancelAuthReturn + deliveryOrderAddHandler func(*DeliveryOrderAddResult) *DeliveryOrderAddReturn + deliveryOrderTipsAddHandler func(*DeliveryOrderAddTipsResult) *DeliveryOrderAddTipsReturn + deliveryOrderCancelHandler func(*DeliveryOrderCancelResult) *DeliveryOrderCancelReturn + deliveryOrderReturnConfirmHandler func(*DeliveryOrderReturnConfirmResult) *DeliveryOrderReturnConfirmReturn + deliveryOrderPreAddHandler func(*DeliveryOrderPreAddResult) *DeliveryOrderPreAddReturn + deliveryOrderPreCancelHandler func(*DeliveryOrderPreCancelResult) *DeliveryOrderPreCancelReturn + deliveryOrderQueryHandler func(*DeliveryOrderQueryResult) *DeliveryOrderQueryReturn + deliveryOrderReaddHandler func(*DeliveryOrderReaddResult) *DeliveryOrderReaddReturn + preAuthCodeGetHandler func(*PreAuthCodeGetResult) *PreAuthCodeGetReturn + riderScoreSetHandler func(*RiderScoreSetResult) *RiderScoreSetReturn +} + +// OnCustomerServiceTextMessage add handler to handle customer text service message. +func (srv *Server) OnCustomerServiceTextMessage(fn func(*TextMessageResult) *TransferCustomerMessage) { + srv.textMessageHandler = fn +} + +// OnCustomerServiceImageMessage add handler to handle customer image service message. +func (srv *Server) OnCustomerServiceImageMessage(fn func(*ImageMessageResult) *TransferCustomerMessage) { + srv.imageMessageHandler = fn +} + +// OnCustomerServiceCardMessage add handler to handle customer card service message. +func (srv *Server) OnCustomerServiceCardMessage(fn func(*CardMessageResult) *TransferCustomerMessage) { + srv.cardMessageHandler = fn +} + +// OnUserTempsessionEnter add handler to handle customer service message. +func (srv *Server) OnUserTempsessionEnter(fn func(*UserTempsessionEnterResult)) { + srv.userTempsessionEnterHandler = fn +} + +// OnMediaCheckAsync add handler to handle MediaCheckAsync. +func (srv *Server) OnMediaCheckAsync(fn func(*MediaCheckAsyncResult)) { + srv.mediaCheckAsyncHandler = fn +} + +// OnExpressPathUpdate add handler to handle ExpressPathUpdate. +func (srv *Server) OnExpressPathUpdate(fn func(*ExpressPathUpdateResult)) { + srv.expressPathUpdateHandler = fn +} + +// OnAddNearbyPoi add handler to handle AddNearbyPoiAudit. +func (srv *Server) OnAddNearbyPoi(fn func(*AddNearbyPoiResult)) { + srv.addNearbyPoiAuditHandler = fn +} + +// OnAddExpressOrder add handler to handle AddExpressOrder. +func (srv *Server) OnAddExpressOrder(fn func(*AddExpressOrderResult) *AddExpressOrderReturn) { + srv.addExpressOrderHandler = fn +} + +// OnCheckExpressBusiness add handler to handle CheckBusiness. +func (srv *Server) OnCheckExpressBusiness(fn func(*CheckExpressBusinessResult) *CheckExpressBusinessReturn) { + srv.checkExpressBusinessHandler = fn +} + +// OnCancelExpressOrder add handler to handle ExpressOrderCancel. +func (srv *Server) OnCancelExpressOrder(fn func(*CancelExpressOrderResult) *CancelExpressOrderReturn) { + srv.expressOrderCancelHandler = fn +} + +// OnGetExpressQuota add handler to handle QuotaGet. +func (srv *Server) OnGetExpressQuota(fn func(*GetExpressQuotaResult) *GetExpressQuotaReturn) { + srv.quotaGetHandler = fn +} + +// OnDeliveryOrderStatusUpdate add handler to handle DeliveryOrderStatusUpdate. +// OnDeliveryOrderStatusUpdate add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderStatusUpdate(fn func(*DeliveryOrderStatusUpdateResult) *DeliveryOrderStatusUpdateReturn) { + srv.deliveryOrderStatusUpdateHandler = fn +} + +// OnAgentPosQuery add handler to handle AgentPosQuery. +func (srv *Server) OnAgentPosQuery(fn func(*AgentPosQueryResult) *AgentPosQueryReturn) { + srv.agentPosQueryHandler = fn +} + +// OnAuthInfoGet add handler to handle AuthInfoGet. +func (srv *Server) OnAuthInfoGet(fn func(*AuthInfoGetResult) *AuthInfoGetReturn) { + srv.authInfoGetHandler = fn +} + +// OnCancelAuth add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnCancelAuth(fn func(*CancelAuthResult) *CancelAuthReturn) { + srv.authAccountCancelHandler = fn +} + +// OnDeliveryOrderAdd add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderAdd(fn func(*DeliveryOrderAddResult) *DeliveryOrderAddReturn) { + srv.deliveryOrderAddHandler = fn +} + +// OnDeliveryOrderAddTips add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderAddTips(fn func(*DeliveryOrderAddTipsResult) *DeliveryOrderAddTipsReturn) { + srv.deliveryOrderTipsAddHandler = fn +} + +// OnDeliveryOrderCancel add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderCancel(fn func(*DeliveryOrderCancelResult) *DeliveryOrderCancelReturn) { + srv.deliveryOrderCancelHandler = fn +} + +// OnDeliveryOrderReturnConfirm add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderReturnConfirm(fn func(*DeliveryOrderReturnConfirmResult) *DeliveryOrderReturnConfirmReturn) { + srv.deliveryOrderReturnConfirmHandler = fn +} + +// OnDeliveryOrderPreAdd add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderPreAdd(fn func(*DeliveryOrderPreAddResult) *DeliveryOrderPreAddReturn) { + srv.deliveryOrderPreAddHandler = fn +} + +// OnDeliveryOrderPreCancel add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderPreCancel(fn func(*DeliveryOrderPreCancelResult) *DeliveryOrderPreCancelReturn) { + srv.deliveryOrderPreCancelHandler = fn +} + +// OnDeliveryOrderQuery add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderQuery(fn func(*DeliveryOrderQueryResult) *DeliveryOrderQueryReturn) { + srv.deliveryOrderQueryHandler = fn +} + +// OnDeliveryOrderReadd add handler to handle deliveryOrderStatusUpdate. +func (srv *Server) OnDeliveryOrderReadd(fn func(*DeliveryOrderReaddResult) *DeliveryOrderReaddReturn) { + srv.deliveryOrderReaddHandler = fn +} + +// OnPreAuthCodeGet add handler to handle preAuthCodeGet. +func (srv *Server) OnPreAuthCodeGet(fn func(*PreAuthCodeGetResult) *PreAuthCodeGetReturn) { + srv.preAuthCodeGetHandler = fn +} + +// OnRiderScoreSet add handler to handle riderScoreSet. +func (srv *Server) OnRiderScoreSet(fn func(*RiderScoreSetResult) *RiderScoreSetReturn) { + srv.riderScoreSetHandler = fn +} + +type dataType = string + +const ( + dataTypeJSON dataType = "application/json" + dataTypeXML = "text/xml" +) + +// NewServer 返回经过初始化的Server +func NewServer(appID, token, aesKey, mchID, apiKey string, validate bool) (*Server, error) { + + key, err := base64.RawStdEncoding.DecodeString(aesKey) + if err != nil { + return nil, err + } + + server := Server{ + appID: appID, + mchID: mchID, + apiKey: apiKey, + token: token, + aesKey: key, + validate: validate, + } + + return &server, nil +} + +func getDataType(req *http.Request) dataType { + content := req.Header.Get("Content-Type") + + switch { + case strings.Contains(content, dataTypeJSON): + return dataTypeJSON + case strings.Contains(content, dataTypeXML): + return dataTypeXML + default: + return content + } +} + +func unmarshal(data []byte, tp dataType, v interface{}) error { + switch tp { + case dataTypeJSON: + if err := json.Unmarshal(data, v); err != nil { + return err + } + case dataTypeXML: + if err := xml.Unmarshal(data, v); err != nil { + return err + } + default: + return errors.New("invalid content type: " + tp) + } + + return nil +} + +func marshal(data interface{}, tp dataType) ([]byte, error) { + switch tp { + case dataTypeJSON: + return json.Marshal(data) + case dataTypeXML: + return xml.Marshal(data) + default: + return nil, errors.New("invalid content type: " + tp) + } +} + +// 处理消息体 +func (srv *Server) handleRequest(w http.ResponseWriter, r *http.Request, isEncrpt bool, tp dataType) (interface{}, error) { + raw, err := ioutil.ReadAll(r.Body) + if err != nil { + return nil, err + } + if isEncrpt { // 处理加密消息 + + query := r.URL.Query() + nonce, signature, timestamp := query.Get("nonce"), query.Get("signature"), query.Get("timestamp") + + // 检验消息是否来自微信服务器 + if !validateSignature(signature, srv.token, timestamp, nonce) { + return nil, errors.New("failed to validate signature") + } + + res := new(EncryptedResult) + if err := unmarshal(raw, tp, res); err != nil { + return nil, err + } + + body, err := srv.decryptMsg(res.Encrypt) + if err != nil { + return nil, err + } + length := binary.BigEndian.Uint32(body[16:20]) + raw = body[20 : 20+length] + } + + res := new(CommonServerResult) + if err := unmarshal(raw, tp, res); err != nil { + return nil, err + } + + switch res.MsgType { + case MsgText: + msg := new(TextMessageResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.textMessageHandler != nil { + return srv.textMessageHandler(msg), nil + } + + case MsgImg: + msg := new(ImageMessageResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.imageMessageHandler != nil { + return srv.imageMessageHandler(msg), nil + } + + case MsgCard: + msg := new(CardMessageResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.cardMessageHandler != nil { + return srv.cardMessageHandler(msg), nil + } + case MsgEvent: + switch res.Event { + case EventUserTempsessionEnter: + msg := new(UserTempsessionEnterResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.userTempsessionEnterHandler != nil { + srv.userTempsessionEnterHandler(msg) + } + case EventQuotaGet: + msg := new(GetExpressQuotaResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.quotaGetHandler != nil { + return srv.quotaGetHandler(msg), nil + } + case EventMediaCheckAsync: + msg := new(MediaCheckAsyncResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.mediaCheckAsyncHandler != nil { + srv.mediaCheckAsyncHandler(msg) + } + case EventAddExpressOrder: + msg := new(AddExpressOrderResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.addExpressOrderHandler != nil { + return srv.addExpressOrderHandler(msg), nil + } + case EventExpressOrderCancel: + msg := new(CancelExpressOrderResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.expressOrderCancelHandler != nil { + return srv.expressOrderCancelHandler(msg), nil + } + case EventCheckBusiness: + msg := new(CheckExpressBusinessResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.checkExpressBusinessHandler != nil { + return srv.checkExpressBusinessHandler(msg), nil + } + case EventDeliveryOrderStatusUpdate: + msg := new(DeliveryOrderStatusUpdateResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderStatusUpdateHandler != nil { + return srv.deliveryOrderStatusUpdateHandler(msg), nil + } + case EventAgentPosQuery: + msg := new(AgentPosQueryResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.agentPosQueryHandler != nil { + return srv.agentPosQueryHandler(msg), nil + } + case EventAuthInfoGet: + msg := new(AuthInfoGetResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.authInfoGetHandler != nil { + return srv.authInfoGetHandler(msg), nil + } + case EventAuthAccountCancel: + msg := new(CancelAuthResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.authAccountCancelHandler != nil { + return srv.authAccountCancelHandler(msg), nil + } + case EventDeliveryOrderAdd: + msg := new(DeliveryOrderAddResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderAddHandler != nil { + return srv.deliveryOrderAddHandler(msg), nil + } + case EventDeliveryOrderTipsAdd: + msg := new(DeliveryOrderAddTipsResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderTipsAddHandler != nil { + return srv.deliveryOrderTipsAddHandler(msg), nil + } + case EventDeliveryOrderCancel: + msg := new(DeliveryOrderCancelResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderCancelHandler != nil { + return srv.deliveryOrderCancelHandler(msg), nil + } + case EventDeliveryOrderReturnConfirm: + msg := new(DeliveryOrderReturnConfirmResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderReturnConfirmHandler != nil { + return srv.deliveryOrderReturnConfirmHandler(msg), nil + } + case EventDeliveryOrderPreAdd: + msg := new(DeliveryOrderPreAddResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderPreAddHandler != nil { + return srv.deliveryOrderPreAddHandler(msg), nil + } + case EventDeliveryOrderPreCancel: + msg := new(DeliveryOrderPreCancelResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderPreCancelHandler != nil { + return srv.deliveryOrderPreCancelHandler(msg), nil + } + case EventDeliveryOrderQuery: + msg := new(DeliveryOrderQueryResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderQueryHandler != nil { + return srv.deliveryOrderQueryHandler(msg), nil + } + case EventDeliveryOrderReadd: + msg := new(DeliveryOrderReaddResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.deliveryOrderReaddHandler != nil { + return srv.deliveryOrderReaddHandler(msg), nil + } + case EventPreAuthCodeGet: + msg := new(PreAuthCodeGetResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.preAuthCodeGetHandler != nil { + return srv.preAuthCodeGetHandler(msg), nil + } + case EventRiderScoreSet: + msg := new(RiderScoreSetResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.riderScoreSetHandler != nil { + return srv.riderScoreSetHandler(msg), nil + } + case EventExpressPathUpdate: + msg := new(ExpressPathUpdateResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.expressPathUpdateHandler != nil { + srv.expressPathUpdateHandler(msg) + } + case EventNearbyPoiAuditInfoAdd: + msg := new(AddNearbyPoiResult) + if err := unmarshal(raw, tp, msg); err != nil { + return nil, err + } + if srv.addNearbyPoiAuditHandler != nil { + srv.addNearbyPoiAuditHandler(msg) + } + default: + return nil, fmt.Errorf("unexpected message type '%s'", res.MsgType) + } + default: + return nil, fmt.Errorf("unexpected message type '%s'", res.MsgType) + } + return nil, nil +} + +// 判断 interface{} 是否为空 +func isNil(i interface{}) bool { + defer func() { + recover() + }() + + vi := reflect.ValueOf(i) + return vi.IsNil() +} + +// Serve 接收并处理微信通知服务 +func (srv *Server) Serve(w http.ResponseWriter, r *http.Request) error { + switch r.Method { + case "POST": + tp := getDataType(r) + isEncrpt := isEncrypted(r) + res, err := srv.handleRequest(w, r, isEncrpt, tp) + if err != nil { + return fmt.Errorf("handle request content error: %s", err) + } + + if !isNil(res) { + raw, err := marshal(res, tp) + if err != nil { + return err + } + if isEncrpt { + res, err := srv.encryptMsg(string(raw), time.Now().Unix()) + if err != nil { + return err + } + raw, err = marshal(res, tp) + if err != nil { + return err + } + } + + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", tp) + if _, err := w.Write(raw); err != nil { + return err + } + } else { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") // normal header + w.WriteHeader(http.StatusOK) + _, err = io.WriteString(w, "success") + if err != nil { + return err + } + } + + return nil + case "GET": + if srv.validate { // 请求来自微信验证成功后原样返回 echostr 参数内容 + if !srv.validateServer(r) { + return errors.New("验证消息来自微信服务器失败") + } + + w.Header().Set("Content-Type", "text/plain; charset=utf-8") // normal header + w.WriteHeader(http.StatusOK) + + echostr := r.URL.Query().Get("echostr") + _, err := io.WriteString(w, echostr) + if err != nil { + return err + } + } + + return nil + default: + return errors.New("invalid request method: " + r.Method) + } +} + +// 判断消息是否加密 +func isEncrypted(req *http.Request) bool { + return req.URL.Query().Get("encrypt_type") == "aes" +} + +// 验证消息的确来自微信服务器 +// 1.将token、timestamp、nonce三个参数进行字典序排序 +// 2.将三个参数字符串拼接成一个字符串进行sha1加密 +// 3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 +func (srv *Server) validateServer(req *http.Request) bool { + query := req.URL.Query() + nonce := query.Get("nonce") + signature := query.Get("signature") + timestamp := query.Get("timestamp") + + return validateSignature(signature, nonce, timestamp, srv.token) +} + +// 加密消息 +func (srv *Server) encryptMsg(message string, timestamp int64) (*EncryptedMsgRequest, error) { + + key := srv.aesKey + + //获得16位随机字符串,填充到明文之前 + nonce := randomString(16) + text := nonce + strconv.Itoa(len(message)) + message + srv.appID + plaintext := pkcs7encode([]byte(text)) + + cipher, err := cbcEncrypt(key, plaintext, key) + if err != nil { + return nil, err + } + + encrypt := base64.StdEncoding.EncodeToString(cipher) + timestr := strconv.FormatInt(timestamp, 10) + + //生成安全签名 + signature := createSignature(srv.token, timestr, nonce, encrypt) + + request := EncryptedMsgRequest{ + Nonce: nonce, + Encrypt: encrypt, + TimeStamp: timestr, + MsgSignature: signature, + } + + return &request, nil +} + +// 检验消息的真实性,并且获取解密后的明文. +func (srv *Server) decryptMsg(encrypted string) ([]byte, error) { + + key := srv.aesKey + + ciphertext, err := base64.StdEncoding.DecodeString(encrypted) + if err != nil { + return nil, err + } + + data, err := cbcDecrypt(key, ciphertext, key) + if err != nil { + return nil, err + } + + return data, nil +} diff --git a/app/lib/weapp/server_types.go b/app/lib/weapp/server_types.go new file mode 100644 index 0000000..5614c21 --- /dev/null +++ b/app/lib/weapp/server_types.go @@ -0,0 +1,660 @@ +package weapp + +import "encoding/xml" + +// EncryptedResult 接收的加密数据 +type EncryptedResult struct { + XMLName xml.Name `xml:"xml" json:"-"` + ToUserName string `json:"ToUserName" xml:"ToUserName"` // 接收者 为小程序 AppID + Encrypt string `json:"Encrypt" xml:"Encrypt"` // 加密消息 +} + +// EncryptedMsgRequest 发送的加密消息格式 +type EncryptedMsgRequest struct { + XMLName xml.Name `xml:"xml"` + Encrypt string `json:"Encrypt" xml:"Encrypt"` // 加密消息 + TimeStamp string `json:"TimeStamp,omitempty" xml:"TimeStamp,omitempty"` // 时间戳 + Nonce string `json:"Nonce,omitempty" xml:"Nonce,omitempty"` // 随机数 + MsgSignature string `json:"MsgSignature,omitempty" xml:"MsgSignature,omitempty"` // 签名 +} + +// CommonServerResult 基础通知数据 +type CommonServerResult struct { + XMLName xml.Name `xml:"xml" json:"-"` + ToUserName string `json:"ToUserName" xml:"ToUserName"` // 小程序的原始ID + FromUserName string `json:"FromUserName" xml:"FromUserName"` // 发送者的 openID | 平台推送服务UserName + CreateTime uint `json:"CreateTime" xml:"CreateTime"` // 消息创建时间(整型) + MsgType MsgType `json:"MsgType" xml:"MsgType"` // 消息类型 + Event EventType `json:"Event" xml:"Event"` // 事件类型 +} + +// CommonServerReturn 没收到通知后返回的基础数据 +type CommonServerReturn struct { + ToUserName string `json:"ToUserName" xml:"ToUserName"` // 是 原样返回请求中的 FromUserName + FromUserName string `json:"FromUserName" xml:"FromUserName"` // 是 快递公司小程序 UserName + CreateTime uint `json:"CreateTime" xml:"CreateTime"` // 是 事件时间,Unix时间戳 + MsgType string `json:"MsgType" xml:"MsgType"` // 是 消息类型,固定为 event + Event string `json:"Event" xml:"Event"` // 是 事件类型,固定为 transport_add_order,不区分大小写 + ResultCode int `json:"resultcode" xml:"resultcode"` // 是 错误码 + ResultMsg string `json:"resultmsg" xml:"resultmsg"` // 是 错误描述 +} + +// UserTempsessionEnterResult 接收的文本消息 +type UserTempsessionEnterResult struct { + CommonServerResult + SessionFrom string `json:"SessionFrom" xml:"SessionFrom"` // 开发者在客服会话按钮设置的 session-from 属性 +} + +// TextMessageResult 接收的文本消息 +type TextMessageResult struct { + CommonServerResult + MsgID int `json:"MsgId" xml:"MsgId"` // 消息 ID + Content string `json:"Content" xml:"Content"` +} + +// ImageMessageResult 接收的图片消息 +type ImageMessageResult struct { + CommonServerResult + MsgID int `json:"MsgId" xml:"MsgId"` // 消息 ID + PicURL string `json:"PicUrl" xml:"PicUrl"` + MediaID string `json:"MediaId" xml:"MediaId"` +} + +// CardMessageResult 接收的卡片消息 +type CardMessageResult struct { + CommonServerResult + MsgID int `json:"MsgId" xml:"MsgId"` // 消息 ID + Title string `json:"Title" xml:"Title"` // 标题 + AppID string `json:"AppId" xml:"AppId"` // 小程序 appid + PagePath string `json:"PagePath" xml:"PagePath"` // 小程序页面路径 + ThumbURL string `json:"ThumbUrl" xml:"ThumbUrl"` // 封面图片的临时cdn链接 + ThumbMediaID string `json:"ThumbMediaId" xml:"ThumbMediaId"` // 封面图片的临时素材id +} + +// MediaCheckAsyncResult 异步校验的图片/音频结果 +type MediaCheckAsyncResult struct { + CommonServerResult + IsRisky uint8 `json:"isrisky" xml:"isrisky"` // 检测结果,0:暂未检测到风险,1:风险 + ExtraInfoJSON string `json:"extra_info_json" xml:"extra_info_json"` // 附加信息,默认为空 + AppID string `json:"appid" xml:"appid"` // 小程序的appid + TraceID string `json:"trace_id" xml:"trace_id"` // 任务id + StatusCode int `json:"status_code" xml:"status_code"` // 默认为:0,4294966288(-1008)为链接无法下载 +} + +// AddNearbyPoiResult 附近小程序添加地点审核状态通知数据 +type AddNearbyPoiResult struct { + CommonServerResult + AuditID uint `xml:"audit_id"` // 审核单id + Status uint8 `xml:"status"` // 审核状态(3:审核通过,2:审核失败) + Reason string `xml:"reason"` // 如果status为2,会返回审核失败的原因 + PoiID uint `xml:"poi_id"` +} + +// ExpressPathUpdateResult 运单轨迹更新事件需要返回的数据 +type ExpressPathUpdateResult struct { + CommonServerResult + DeliveryID string `json:"DeliveryID" xml:"DeliveryID"` // 快递公司ID + WayBillID string `json:"WayBillId" xml:"WayBillId"` // 运单ID + Version uint `json:"Version" xml:"Version"` // 轨迹版本号(整型) + Count uint `json:"Count" xml:"Count"` // 轨迹节点数(整型) + Actions []struct { + ActionTime uint `json:"ActionTime" xml:"ActionTime"` // 轨迹节点 Unix 时间戳 + ActionType uint `json:"ActionType" xml:"ActionType"` // 轨迹节点类型 + ActionMsg string `json:"ActionMsg" xml:"ActionMsg"` // 轨迹节点详情 + } `json:"Actions" xml:"Actions"` // 轨迹列表 +} + +// AddExpressOrderReturn 请求下单事件需要返回的数据 +type AddExpressOrderReturn struct { + CommonServerReturn + Token string `json:"Token" xml:"Token"` // 传入的 Token,原样返回 + OrderID string `json:"OrderID" xml:"OrderID"` // 传入的唯一标识订单的 ID,由商户生成,原样返回 + BizID string `json:"BizID" xml:"BizID"` // 商户 ID,原样返回 + WayBillID string `json:"WayBillID" xml:"WayBillID"` // 运单 ID + WaybillData string `json:"WaybillData" xml:"WaybillData"` // 集包地、三段码、大头笔等信息,用于生成面单信息。详见后文返回值说明 +} + +// TransferCustomerMessage 需要转发的客服消息 +type TransferCustomerMessage struct { + XMLName xml.Name `xml:"xml"` + // 接收方帐号(收到的OpenID) + ToUserName string `json:"ToUserName" xml:"ToUserName"` + // 开发者微信号 + FromUserName string `json:"FromUserName" xml:"FromUserName"` + // 消息创建时间 (整型) + CreateTime uint `json:"CreateTime" xml:"CreateTime"` + // 转发消息类型 + MsgType MsgType `json:"MsgType" xml:"MsgType"` +} + +// AddExpressOrderResult 请求下单事件参数 +type AddExpressOrderResult struct { + CommonServerResult + Token string `json:"Token" xml:"Token"` // 订单 Token。请保存该 Token,调用logistics.updatePath时需要传入 + OrderID string `json:"OrderID" xml:"OrderID"` // 唯一标识订单的 ID,由商户生成。快递需要保证相同的 OrderID 生成相同的运单ID。 + BizID string `json:"BizID" xml:"BizID"` // 商户 ID,即商户在快递注册的客户编码或月结账户名 + BizPwd string `json:"BizPwd" xml:"BizPwd"` // BizID 对应的密码 + ShopAppID string `json:"ShopAppID" xml:"ShopAppID"` // 商户的小程序 AppID + WayBillID string `json:"WayBillID" xml:"WayBillID"` // 运单 ID,从微信号段中生成。若为 0,则表示需要快递来生成运单 ID。 + Remark string `json:"Remark" xml:"Remark"` // 快递备注,会打印到面单上,比如"易碎物品" + Sender struct { + Name string `json:"Name" xml:"Name"` // 收件人/发件人姓名,不超过64字节 + Tel string `json:"Tel" xml:"Tel"` // 收件人/发件人座机号码,若不填写则必须填写 mobile,不超过32字节 + Mobile string `json:"Mobile" xml:"Mobile"` // 收件人/发件人手机号码,若不填写则必须填写 tel,不超过32字节 + Company string `json:"Company" xml:"Company"` // 收件人/发件人公司名称,不超过64字节 + PostCode string `json:"PostCode" xml:"PostCode"` // 收件人/发件人邮编,不超过10字节 + Country string `json:"Country" xml:"Country"` // 收件人/发件人国家,不超过64字节 + Province string `json:"Province" xml:"Province"` // 收件人/发件人省份,比如:"广东省",不超过64字节 + City string `json:"City" xml:"City"` // 收件人/发件人市/地区,比如:"广州市",不超过64字节 + Area string `json:"Area" xml:"Area"` // 收件人/发件人区/县,比如:"海珠区",不超过64字节 + Address string `json:"Address" xml:"Address"` // 收件人/发件人详细地址,比如:"XX路XX号XX大厦XX",不超过512字节 + } `json:"Sender" xml:"Sender"` // 发件人信息 + Receiver struct { + Name string `json:"Name" xml:"Name"` // 收件人/发件人姓名,不超过64字节 + Tel string `json:"Tel" xml:"Tel"` // 收件人/发件人座机号码,若不填写则必须填写 mobile,不超过32字节 + Mobile string `json:"Mobile" xml:"Mobile"` // 收件人/发件人手机号码,若不填写则必须填写 tel,不超过32字节 + Company string `json:"Company" xml:"Company"` // 收件人/发件人公司名称,不超过64字节 + PostCode string `json:"PostCode" xml:"PostCode"` // 收件人/发件人邮编,不超过10字节 + Country string `json:"Country" xml:"Country"` // 收件人/发件人国家,不超过64字节 + Province string `json:"Province" xml:"Province"` // 收件人/发件人省份,比如:"广东省",不超过64字节 + City string `json:"City" xml:"City"` // 收件人/发件人市/地区,比如:"广州市",不超过64字节 + Area string `json:"Area" xml:"Area"` // 收件人/发件人区/县,比如:"海珠区",不超过64字节 + Address string `json:"Address" xml:"Address"` // 收件人/发件人详细地址,比如:"XX路XX号XX大厦XX",不超过512字节 + } `json:"Receiver" xml:"Receiver"` // 收件人信息 + Cargo struct { + Weight float64 `json:"Weight" xml:"Weight"` // 包裹总重量,单位是千克(kg) + SpaceX float64 `json:"Space_X" xml:"Space_X"` // 包裹长度,单位厘米(cm) + SpaceY float64 `json:"Space_Y" xml:"Space_Y"` // 包裹宽度,单位厘米(cm) + SpaceZ float64 `json:"Space_Z" xml:"Space_Z"` // 包裹高度,单位厘米(cm) + Count uint `json:"Count" xml:"Count"` // 包裹数量 + } `json:"Cargo" xml:"Cargo"` // 包裹信息 + Insured struct { + Used InsureStatus `json:"UseInsured" xml:"UseInsured"` // 是否保价,0 表示不保价,1 表示保价 + Value uint `json:"InsuredValue" xml:"InsuredValue"` // 保价金额,单位是分,比如: 10000 表示 100 元 + } `json:"Insured" xml:"Insured"` // 保价信息 + Service struct { + Type uint8 `json:"ServiceType" xml:"ServiceType"` // 服务类型 ID + Name string `json:"ServiceName" xml:"ServiceName"` // 服务名称 + } `json:"Service" xml:"Service"` // 服务类型 +} + +// GetExpressQuotaReturn 查询商户余额事件需要返回的数据 +type GetExpressQuotaReturn struct { + CommonServerReturn + BizID string `json:"BizID" xml:"BizID"` // 商户ID + Quota float64 `json:"Quota" xml:"Quota"` // 商户可用余额,0 表示无可用余额 +} + +// GetExpressQuotaResult 查询商户余额事件参数 +type GetExpressQuotaResult struct { + CommonServerResult + BizID string `json:"BizID" xml:"BizID"` // 商户ID,即商户在快递注册的客户编码或月结账户名 + BizPwd string `json:"BizPwd" xml:"BizPwd"` // BizID 对应的密码 + ShopAppID string `json:"ShopAppID" xml:"ShopAppID"` // 商户小程序的 AppID +} + +// CancelExpressOrderResult 取消订单事件参数 +type CancelExpressOrderResult struct { + CommonServerResult + OrderID string `json:"OrderID" xml:"OrderID"` // 唯一标识订单的 ID,由商户生成 + BizID string `json:"BizID" xml:"BizID"` // 商户 ID + BizPwd string `json:"BizPwd" xml:"BizPwd"` // 商户密码 + ShopAppID string `json:"ShopAppID" xml:"ShopAppID"` // 商户的小程序 AppID + WayBillID string `json:"WayBillID" xml:"WayBillID"` // 运单 ID,从微信号段中生成 +} + +// CancelExpressOrderReturn 取消订单事件需要返回的数据 +type CancelExpressOrderReturn struct { + CommonServerReturn + BizID string `json:"BizID" xml:"BizID"` // 商户ID,请原样返回 + OrderID string `json:"OrderID" xml:"OrderID"` // 唯一标识订单的ID,由商户生成。请原样返回 + WayBillID string `json:"WayBillID" xml:"WayBillID"` // 运单ID,请原样返回 +} + +// CheckExpressBusinessResult 审核商户事件参数 +type CheckExpressBusinessResult struct { + CommonServerResult + BizID string `json:"BizID" xml:"BizID"` // 商户ID,即商户在快递注册的客户编码或月结账户名 + BizPwd string `json:"BizPwd" xml:"BizPwd"` // BizID 对应的密码 + ShopAppID string `json:"ShopAppID" xml:"ShopAppID"` // 商户的小程序 AppID + ShopName string `json:"ShopName" xml:"ShopName"` // 商户名称,即小程序昵称(仅EMS可用) + ShopTelphone string `json:"ShopTelphone" xml:"ShopTelphone"` // 商户联系电话(仅EMS可用) + ShopContact string `json:"ShopContact" xml:"ShopContact"` // 商户联系人姓名(仅EMS可用) + ServiceName string `json:"ServiceName" xml:"ServiceName"` // 预开通的服务类型名称(仅EMS可用) + SenderAddress string `json:"SenderAddress" xml:"SenderAddress"` // 商户发货地址(仅EMS可用) +} + +// CheckExpressBusinessReturn 审核商户事件需要需要返回的数据 +type CheckExpressBusinessReturn struct { + CommonServerReturn + BizID string `json:"BizID" xml:"BizID"` // 商户ID + Quota float64 `json:"Quota" xml:"Quota"` // 商户可用余额,0 表示无可用余额 +} + +// DeliveryOrderStatusUpdateResult 服务器携带的参数 +type DeliveryOrderStatusUpdateResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配的appkey + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 配送单id + ActionTime uint `json:"action_time" xml:"action_time"` // Unix时间戳 + OrderStatus int `json:"order_status" xml:"order_status"` // 配送状态,枚举值 + ActionMsg string `json:"action_msg" xml:"action_msg"` // 附加信息 + Agent struct { + Name string `json:"name" xml:"name"` // 骑手姓名 + Phone string `json:"phone" xml:"phone"` // 骑手电话 + } `json:"agent" xml:"agent"` // 骑手信息 +} + +// DeliveryOrderStatusUpdateReturn 需要返回的数据 +type DeliveryOrderStatusUpdateReturn CommonServerReturn + +// AgentPosQueryReturn 需要返回的数据 +type AgentPosQueryReturn struct { + CommonServerReturn + Lng float64 `json:"lng" xml:"lng"` // 必填 经度,火星坐标,精确到小数点后6位 + Lat float64 `json:"lat" xml:"lat"` // 必填 纬度,火星坐标,精确到小数点后6位 + Distance float64 `json:"distance" xml:"distance"` // 必填 和目的地距离,已取货配送中需返回,单位米 + ReachTime uint `json:"reach_time" xml:"reach_time"` // 必填 预计还剩多久送达时间, 单位秒, 已取货配送中需返回,比如5分钟后送达,填300 +} + +// AgentPosQueryResult 服务器携带的参数 +type AgentPosQueryResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配,可以是dev_id或者appkey + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 配送单id +} + +// AuthInfoGetReturn 需要返回的数据 +type AuthInfoGetReturn struct { + CommonServerReturn + AppKey string `json:"appkey" xml:"appkey"` // 必填 配送公司分配的appkey,对应shopid + Account string `json:"account" xml:"account"` // 必填 帐号名称 + AccountType uint `json:"account_type" xml:"account_type"` // 必填 帐号类型:0.不确定,1.预充值,2,月结,3,其它 +} + +// AuthInfoGetResult 服务器携带的参数 +type AuthInfoGetResult struct { + CommonServerResult + WxAppID string `json:"wx_appid" xml:"wx_appid"` // 发起授权的商户小程序appid + Code string `json:"code" xml:"code"` // 授权码 +} + +// CancelAuthReturn 需要返回的数据 +type CancelAuthReturn CommonServerReturn + +// CancelAuthResult 服务器携带的参数 +type CancelAuthResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 配送公司唯一标识 + WxAppID string `json:"wx_appid" xml:"wx_appid"` // 发起授权的商户小程序appid +} + +// DeliveryOrderAddReturn 需要返回的数据 +type DeliveryOrderAddReturn struct { + CommonServerReturn + Event string `json:"Event" xml:"Event"` // 是 事件类型,固定为 transport_add_order,不区分大小写 + Fee uint `json:"fee" xml:"fee"` // 是 实际运费(单位:元),运费减去优惠券费用 + Deliverfee uint `json:"deliverfee" xml:"deliverfee"` // 是 运费(单位:元) + Couponfee uint `json:"couponfee" xml:"couponfee"` // 是 优惠券费用(单位:元) + Tips uint `json:"tips" xml:"tips"` // 是 小费(单位:元) + Insurancefee uint `json:"insurancefee" xml:"insurancefee"` // 是 保价费(单位:元) + Distance float64 `json:"distance,omitempty" xml:"distance,omitempty"` // 否 配送距离(单位:米) + WaybillID string `json:"waybill_id,omitempty" xml:"waybill_id,omitempty"` // 否 配送单号, 可以在API1更新配送单状态异步返回 + OrderStatus int `json:"order_status" xml:"order_status"` // 是 配送单状态 + FinishCode uint `json:"finish_code,omitempty" xml:"finish_code,omitempty"` // 否 收货码 + PickupCode uint `json:"pickup_code,omitempty" xml:"pickup_code,omitempty"` // 否 取货码 + DispatchDuration uint `json:"dispatch_duration,omitempty" xml:"dispatch_duration,omitempty"` // 否 预计骑手接单时间,单位秒,比如5分钟,就填300, 无法预计填0 + SenderLng float64 `json:"sender_lng,omitempty" xml:"sender_lng,omitempty"` // 否 发货方经度,火星坐标,精确到小数点后6位, 用于消息通知,如果下单请求里有发货人信息则不需要 + SenderLat float64 `json:"sender_lat,omitempty" xml:"sender_lat,omitempty"` // 否 发货方纬度,火星坐标,精确到小数点后6位, 用于消息通知,如果下单请求里有发货人信息则不需要 +} + +// DeliveryOrderAddResult 服务器携带的参数 +type DeliveryOrderAddResult struct { + CommonServerResult + WxToken string `json:"wx_token" xml:"wx_token"` // 微信订单 Token。请保存该Token,调用更新配送单状态接口(updateOrder)时需要传入 + DeliveryToken string `json:"delivery_token" xml:"delivery_token"` // 配送公司侧在预下单时候返回的token,用于保证运费不变 + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配的appkey + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + DeliverySign string `json:"delivery_sign" xml:"delivery_sign"` // 用配送公司侧提供的appSecret加密的校验串 + Sender struct { + Name string `json:"name" xml:"name"` // 姓名,最长不超过256个字符 + City string `json:"city" xml:"city"` // 城市名称,如广州市 + Address string `json:"address" xml:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail" xml:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone" xml:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng" xml:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat" xml:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type" xml:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"sender" xml:"sender"` // 发件人信息,如果配送公司能从shopid+shop_no对应到门店地址,则不需要填写,否则需填写 + Receiver struct { + Name string `json:"name" xml:"name"` // 姓名,最长不超过256个字符 + City string `json:"city" xml:"city"` // 城市名称,如广州市 + Address string `json:"address" xml:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail" xml:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone" xml:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng" xml:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat" xml:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type" xml:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"receiver" xml:"receiver"` // 收件人信息 + Cargo struct { + GoodsValue float64 `json:"goods_value" xml:"goods_value"` // 货物价格,单位为元,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-5000] + GoodsHeight float64 `json:"goods_height" xml:"goods_height"` // 货物高度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-45] + GoodsLength float64 `json:"goods_length" xml:"goods_length"` // 货物长度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-65] + GoodsWidth float64 `json:"goods_width" xml:"goods_width"` // 货物宽度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsWeight float64 `json:"goods_weight" xml:"goods_weight"` // 货物重量,单位为kg,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsDetail struct { + Goods []struct { + Count uint `json:"good_count" xml:"good_count"` // 货物数量 + Name string `json:"good_name" xml:"good_name"` // 货品名称 + Price float64 `json:"good_price" xml:"good_price"` // 货品单价,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数) + Unit string `json:"good_unit" xml:"good_unit"` // 货品单位,最长不超过20个字符 + } `json:"goods" xml:"goods"` // 货物列表 + } `json:"goods_detail" xml:"goods_detail"` // 货物详情,最长不超过10240个字符 + GoodsPickupInfo string `json:"goods_pickup_info" xml:"goods_pickup_info"` // 货物取货信息,用于骑手到店取货,最长不超过100个字符 + GoodsDeliveryInfo string `json:"goods_delivery_info" xml:"goods_delivery_info"` // 货物交付信息,最长不超过100个字符 + CargoFirstClass string `json:"cargo_first_class" xml:"cargo_first_class"` // 品类一级类目 + CargoSecondClass string `json:"cargo_second_class" xml:"cargo_second_class"` // 品类二级类目 + } `json:"cargo" xml:"cargo"` // 货物信息 + OrderInfo struct { + DeliveryServiceCode string `json:"delivery_service_code" xml:"delivery_service_code"` // 配送服务代码 不同配送公司自定义,微信侧不理解 + OrderType uint8 `json:"order_type" xml:"order_type"` // 订单类型, 0: 即时单 1 预约单,如预约单,需要设置expected_delivery_time或expected_finish_time或expected_pick_time + ExpectedDeliveryTime uint `json:"expected_delivery_time" xml:"expected_delivery_time"` // 期望派单时间(达达支持,表示达达系统调度时间),unix-timestamp + ExpectedFinishTime uint `json:"expected_finish_time" xml:"expected_finish_time"` // 期望送达时间(美团、顺丰同城急送支持),unix-timestamp) + ExpectedPickTime uint `json:"expected_pick_time" xml:"expected_pick_time"` // 期望取件时间(闪送、顺丰同城急送支持,顺丰同城急送只需传expected_finish_time或expected_pick_time其中之一即可,同时都传则以expected_finish_time为准),unix-timestamp + PoiSeq string `json:"poi_seq" xml:"poi_seq"` // 门店订单流水号,建议提供,方便骑手门店取货,最长不超过32个字符 + Note string `json:"note" xml:"note"` // 备注,最长不超过200个字符 + OrderTime uint `json:"order_time" xml:"order_time"` // 用户下单付款时间 + IsInsured uint8 `json:"is_insured" xml:"is_insured"` // 是否保价,0,非保价,1.保价 + DeclaredValue float64 `json:"declared_value" xml:"declared_value"` // 保价金额,单位为元,精确到分 + Tips float64 `json:"tips" xml:"tips"` // 小费,单位为元, 下单一般不加小费 + IsDirectDelivery float64 `json:"is_direct_delivery" xml:"is_direct_delivery"` // 是否选择直拿直送(0:不需要;1:需要。选择直拿直送后,同一时间骑手只能配送此订单至完成,配送费用也相应高一些,闪送必须选1,达达可选0或1,其余配送公司不支持直拿直送) + CashOnDelivery float64 `json:"cash_on_delivery" xml:"cash_on_delivery"` // 骑手应付金额,单位为元,精确到分 + CashOnPickup float64 `json:"cash_on_pickup" xml:"cash_on_pickup"` // 骑手应收金额,单位为元,精确到分 + RiderPickMethod uint8 `json:"rider_pick_method" xml:"rider_pick_method"` // 物流流向,1:从门店取件送至用户;2:从用户取件送至门店 + IsFinishCodeNeeded uint8 `json:"is_finish_code_needed" xml:"is_finish_code_needed"` // 收货码(0:不需要;1:需要。收货码的作用是:骑手必须输入收货码才能完成订单妥投) + IsPickupCodeNeeded uint8 `json:"is_pickup_code_needed" xml:"is_pickup_code_needed"` // 取货码(0:不需要;1:需要。取货码的作用是:骑手必须输入取货码才能从商家取货) + } `json:"order_info" xml:"order_info"` // 订单信息 +} + +// DeliveryOrderAddTipsReturn 需要返回的数据 +type DeliveryOrderAddTipsReturn CommonServerReturn + +// DeliveryOrderAddTipsResult 服务器携带的参数 +type DeliveryOrderAddTipsResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配,可以是dev_id或者appkey + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 配送单id + DeliverySign string `json:"delivery_sign" xml:"delivery_sign"` // 用配送公司侧提供的appSecret加密的校验串 + Tips float64 `json:"tips" xml:"tips"` // 小费金额(单位:元) + Remark string `json:"remark" xml:"remark"` // 备注 +} + +// DeliveryOrderCancelReturn 需要返回的数据 +type DeliveryOrderCancelReturn struct { + CommonServerReturn + DeductFee uint `json:"deduct_fee" xml:"deduct_fee"` // 是 预计扣除的违约金(单位:元),可能没有 + Desc string `json:"desc" xml:"desc"` // 是 扣费说明 +} + +// DeliveryOrderCancelResult 服务器携带的参数 +type DeliveryOrderCancelResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配,可以是dev_id或者appkey + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 配送单id + DeliverySign string `json:"delivery_sign" xml:"delivery_sign"` // 用配送公司侧提供的appSecret加密的校验串 + CancelReasonID uint `json:"cancel_reason_id" xml:"cancel_reason_id"` // 取消原因id + CancelReason string `json:"cancel_reason" xml:"cancel_reason"` // 取消原因 +} + +// DeliveryOrderReturnConfirmReturn 需要返回的数据 +type DeliveryOrderReturnConfirmReturn CommonServerReturn + +// DeliveryOrderReturnConfirmResult 服务器携带的参数 +type DeliveryOrderReturnConfirmResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配,可以是dev_id或者appkey + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 配送单id + DeliverySign string `json:"delivery_sign" xml:"delivery_sign"` // 用配送公司侧提供的appSecret加密的校验串 +} + +// DeliveryOrderPreAddReturn 需要返回的数据 +type DeliveryOrderPreAddReturn struct { + CommonServerReturn + Fee uint `json:"fee" xml:"fee"` // 是 实际运费(单位:元),运费减去优惠券费用 + Deliverfee uint `json:"deliverfee" xml:"deliverfee"` // 是 运费(单位:元) + Couponfee uint `json:"couponfee" xml:"couponfee"` // 是 优惠券费用(单位:元) + Tips float64 `json:"tips" xml:"tips"` // 是 小费(单位:元) + Insurancefee uint `json:"insurancefee" xml:"insurancefee"` // 是 保价费(单位:元) + Distance uint `json:"distance" xml:"distance"` // 否 配送距离(单位:米) + DispatchDuration uint `json:"dispatch_duration" xml:"dispatch_duration"` // 否 预计骑手接单时间,单位秒,比如5分钟,就填300, 无法预计填0 + DeliveryToken string `json:"delivery_token" xml:"delivery_token"` // 否 配送公司可以返回此字段,当用户下单时候带上这个字段,配送公司可保证在一段时间内运费不变 +} + +// DeliveryOrderPreAddResult 服务器携带的参数 +type DeliveryOrderPreAddResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配的appkey + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + DeliverySign string `json:"delivery_sign" xml:"delivery_sign"` // 用配送公司侧提供的appSecret加密的校验串 + Sender struct { + Name string `json:"name" xml:"name"` // 姓名,最长不超过256个字符 + City string `json:"city" xml:"city"` // 城市名称,如广州市 + Address string `json:"address" xml:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail" xml:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone" xml:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng" xml:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat" xml:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type" xml:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"sender" xml:"sender"` // 发件人信息,如果配送公司能从shopid+shop_no对应到门店地址,则不需要填写,否则需填写 + Receiver struct { + Name string `json:"name" xml:"name"` // 姓名,最长不超过256个字符 + City string `json:"city" xml:"city"` // 城市名称,如广州市 + Address string `json:"address" xml:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail" xml:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone" xml:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng" xml:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat" xml:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type" xml:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"receiver" xml:"receiver"` // 收件人信息 + Cargo struct { + GoodsValue float64 `json:"goods_value" xml:"goods_value"` // 货物价格,单位为元,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-5000] + GoodsHeight float64 `json:"goods_height" xml:"goods_height"` // 货物高度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-45] + GoodsLength float64 `json:"goods_length" xml:"goods_length"` // 货物长度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-65] + GoodsWidth float64 `json:"goods_width" xml:"goods_width"` // 货物宽度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsWeight float64 `json:"goods_weight" xml:"goods_weight"` // 货物重量,单位为kg,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsDetail struct { + Goods []struct { + Count uint `json:"good_count" xml:"good_count"` // 货物数量 + Name string `json:"good_name" xml:"good_name"` // 货品名称 + Price float64 `json:"good_price" xml:"good_price"` // 货品单价,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数) + Unit string `json:"good_unit" xml:"good_unit"` // 货品单位,最长不超过20个字符 + } `json:"goods" xml:"goods"` // 货物列表 + } `json:"goods_detail" xml:"goods_detail"` // 货物详情,最长不超过10240个字符 + GoodsPickupInfo string `json:"goods_pickup_info" xml:"goods_pickup_info"` // 货物取货信息,用于骑手到店取货,最长不超过100个字符 + GoodsDeliveryInfo string `json:"goods_delivery_info" xml:"goods_delivery_info"` // 货物交付信息,最长不超过100个字符 + CargoFirstClass string `json:"cargo_first_class" xml:"cargo_first_class"` // 品类一级类目 + CargoSecondClass string `json:"cargo_second_class" xml:"cargo_second_class"` // 品类二级类目 + } `json:"cargo" xml:"cargo"` // 货物信息 + OrderInfo struct { + DeliveryServiceCode string `json:"delivery_service_code" xml:"delivery_service_code"` // 配送服务代码 不同配送公司自定义,微信侧不理解 + OrderType uint8 `json:"order_type" xml:"order_type"` // 订单类型, 0: 即时单 1 预约单,如预约单,需要设置expected_delivery_time或expected_finish_time或expected_pick_time + ExpectedDeliveryTime uint `json:"expected_delivery_time" xml:"expected_delivery_time"` // 期望派单时间(达达支持,表示达达系统调度时间),unix-timestamp + ExpectedFinishTime uint `json:"expected_finish_time" xml:"expected_finish_time"` // 期望送达时间(美团、顺丰同城急送支持),unix-timestamp) + ExpectedPickTime uint `json:"expected_pick_time" xml:"expected_pick_time"` // 期望取件时间(闪送、顺丰同城急送支持,顺丰同城急送只需传expected_finish_time或expected_pick_time其中之一即可,同时都传则以expected_finish_time为准),unix-timestamp + PoiSeq string `json:"poi_seq" xml:"poi_seq"` // 门店订单流水号,建议提供,方便骑手门店取货,最长不超过32个字符 + Note string `json:"note" xml:"note"` // 备注,最长不超过200个字符 + OrderTime uint `json:"order_time" xml:"order_time"` // 用户下单付款时间 + IsInsured uint8 `json:"is_insured" xml:"is_insured"` // 是否保价,0,非保价,1.保价 + DeclaredValue float64 `json:"declared_value" xml:"declared_value"` // 保价金额,单位为元,精确到分 + Tips float64 `json:"tips" xml:"tips"` // 小费,单位为元, 下单一般不加小费 + IsDirectDelivery float64 `json:"is_direct_delivery" xml:"is_direct_delivery"` // 是否选择直拿直送(0:不需要;1:需要。选择直拿直送后,同一时间骑手只能配送此订单至完成,配送费用也相应高一些,闪送必须选1,达达可选0或1,其余配送公司不支持直拿直送) + CashOnDelivery float64 `json:"cash_on_delivery" xml:"cash_on_delivery"` // 骑手应付金额,单位为元,精确到分 + CashOnPickup float64 `json:"cash_on_pickup" xml:"cash_on_pickup"` // 骑手应收金额,单位为元,精确到分 + RiderPickMethod uint8 `json:"rider_pick_method" xml:"rider_pick_method"` // 物流流向,1:从门店取件送至用户;2:从用户取件送至门店 + IsFinishCodeNeeded uint8 `json:"is_finish_code_needed" xml:"is_finish_code_needed"` // 收货码(0:不需要;1:需要。收货码的作用是:骑手必须输入收货码才能完成订单妥投) + IsPickupCodeNeeded uint8 `json:"is_pickup_code_needed" xml:"is_pickup_code_needed"` // 取货码(0:不需要;1:需要。取货码的作用是:骑手必须输入取货码才能从商家取货) + } `json:"order_info" xml:"order_info"` // 订单信息 +} + +// DeliveryOrderPreCancelReturn 需要返回的数据 +type DeliveryOrderPreCancelReturn struct { + CommonServerReturn + DeductFee uint `json:"deduct_fee" xml:"deduct_fee"` // 是 预计扣除的违约金(单位:元),可能没有 + Desc string `json:"desc" xml:"desc"` // 是 扣费说明 +} + +// DeliveryOrderPreCancelResult 服务器携带的参数 +type DeliveryOrderPreCancelResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配,可以是dev_id或者appkey + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 配送单id + DeliverySign string `json:"delivery_sign" xml:"delivery_sign"` // 用配送公司侧提供的appSecret加密的校验串 + CancelReasonID uint `json:"cancel_reason_id" xml:"cancel_reason_id"` // 取消原因id + CancelReason string `json:"cancel_reason" xml:"cancel_reason"` // 取消原因 +} + +// DeliveryOrderQueryReturn 需要返回的数据 +type DeliveryOrderQueryReturn struct { + CommonServerReturn + OrderStatus float64 `json:"order_status" xml:"order_status"` // 是 当前订单状态,枚举值 + ActionMsg string `json:"action_msg" xml:"action_msg"` // 否 附加信息 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 是 配送单id +} + +// DeliveryOrderQueryResult 服务器携带的参数 +type DeliveryOrderQueryResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配,可以是dev_id或者appkey + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 配送单id + DeliverySign string `json:"delivery_sign" xml:"delivery_sign"` // 用配送公司侧提供的appSecret加密的校验串 +} + +// DeliveryOrderReaddReturn 需要返回的数据 +type DeliveryOrderReaddReturn struct { + CommonServerReturn + Fee uint `json:"fee" xml:"fee"` // 是 实际运费(单位:元),运费减去优惠券费用 + Deliverfee uint `json:"deliverfee" xml:"deliverfee"` // 是 运费(单位:元) + Couponfee uint `json:"couponfee" xml:"couponfee"` // 是 优惠券费用(单位:元) + Tips float64 `json:"tips" xml:"tips"` // 是 小费(单位:元) + Insurancefee uint `json:"insurancefee" xml:"insurancefee"` // 是 保价费(单位:元) + Distance uint `json:"distance" xml:"distance"` // 否 配送距离(单位:米) + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 否 配送单号, 可以在API1更新配送单状态异步返回 + OrderStatus float64 `json:"order_status" xml:"order_status"` // 是 配送单状态 + FinishCode uint `json:"finish_code" xml:"finish_code"` // 否 收货码 + PickupCode uint `json:"pickup_code" xml:"pickup_code"` // 否 取货码 + DispatchDuration uint `json:"dispatch_duration" xml:"dispatch_duration"` // 否 预计骑手接单时间,单位秒,比如5分钟,就填300, 无法预计填0 + SenderLng float64 `json:"sender_lng" xml:"sender_lng"` // 否 发货方经度,火星坐标,精确到小数点后6位, 用于消息通知,如果下单请求里有发货人信息则不需要 + SenderLat float64 `json:"sender_lat" xml:"sender_lat"` // 否 发货方纬度,火星坐标,精确到小数点后6位, 用于消息通知,如果下单请求里有发货人信息则不需要 +} + +// DeliveryOrderReaddResult 服务器携带的参数 +type DeliveryOrderReaddResult struct { + CommonServerResult + WxToken string `json:"wx_token" xml:"wx_token"` // 微信订单 Token。请保存该Token,调用更新配送单状态接口(updateOrder)时需要传入 + DeliveryToken string `json:"delivery_token" xml:"delivery_token"` // 配送公司侧在预下单时候返回的token,用于保证运费不变 + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配的appkey + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + DeliverySign string `json:"delivery_sign" xml:"delivery_sign"` // 用配送公司侧提供的appSecret加密的校验串 + Sender struct { + Name string `json:"name" xml:"name"` // 姓名,最长不超过256个字符 + City string `json:"city" xml:"city"` // 城市名称,如广州市 + Address string `json:"address" xml:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail" xml:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone" xml:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng" xml:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat" xml:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type" xml:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"sender" xml:"sender"` // 发件人信息,如果配送公司能从shopid+shop_no对应到门店地址,则不需要填写,否则需填写 + Receiver struct { + Name string `json:"name" xml:"name"` // 姓名,最长不超过256个字符 + City string `json:"city" xml:"city"` // 城市名称,如广州市 + Address string `json:"address" xml:"address"` // 地址(街道、小区、大厦等,用于定位) + AddressDetail string `json:"address_detail" xml:"address_detail"` // 地址详情(楼号、单元号、层号) + Phone string `json:"phone" xml:"phone"` // 电话/手机号,最长不超过64个字符 + Lng float64 `json:"lng" xml:"lng"` // 经度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,确到小数点后6位 + Lat float64 `json:"lat" xml:"lat"` // 纬度(火星坐标或百度坐标,和 coordinate_type 字段配合使用,精确到小数点后6位) + CoordinateType uint8 `json:"coordinate_type" xml:"coordinate_type"` // 坐标类型,0:火星坐标(高德,腾讯地图均采用火星坐标) 1:百度坐标 + } `json:"receiver" xml:"receiver"` // 收件人信息 + Cargo struct { + GoodsValue float64 `json:"goods_value" xml:"goods_value"` // 货物价格,单位为元,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-5000] + GoodsHeight float64 `json:"goods_height" xml:"goods_height"` // 货物高度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-45] + GoodsLength float64 `json:"goods_length" xml:"goods_length"` // 货物长度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-65] + GoodsWidth float64 `json:"goods_width" xml:"goods_width"` // 货物宽度,单位为cm,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsWeight float64 `json:"goods_weight" xml:"goods_weight"` // 货物重量,单位为kg,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数),范围为(0-50] + GoodsDetail struct { + Goods []struct { + Count uint `json:"good_count" xml:"good_count"` // 货物数量 + Name string `json:"good_name" xml:"good_name"` // 货品名称 + Price float64 `json:"good_price" xml:"good_price"` // 货品单价,精确到小数点后两位(如果小数点后位数多于两位,则四舍五入保留两位小数) + Unit string `json:"good_unit" xml:"good_unit"` // 货品单位,最长不超过20个字符 + } `json:"goods" xml:"goods"` // 货物列表 + } `json:"goods_detail" xml:"goods_detail"` // 货物详情,最长不超过10240个字符 + GoodsPickupInfo string `json:"goods_pickup_info" xml:"goods_pickup_info"` // 货物取货信息,用于骑手到店取货,最长不超过100个字符 + GoodsDeliveryInfo string `json:"goods_delivery_info" xml:"goods_delivery_info"` // 货物交付信息,最长不超过100个字符 + CargoFirstClass string `json:"cargo_first_class" xml:"cargo_first_class"` // 品类一级类目 + CargoSecondClass string `json:"cargo_second_class" xml:"cargo_second_class"` // 品类二级类目 + } `json:"cargo" xml:"cargo"` // 货物信息 + OrderInfo struct { + DeliveryServiceCode string `json:"delivery_service_code" xml:"delivery_service_code"` // 配送服务代码 不同配送公司自定义,微信侧不理解 + OrderType uint8 `json:"order_type" xml:"order_type"` // 订单类型, 0: 即时单 1 预约单,如预约单,需要设置expected_delivery_time或expected_finish_time或expected_pick_time + ExpectedDeliveryTime uint `json:"expected_delivery_time" xml:"expected_delivery_time"` // 期望派单时间(达达支持,表示达达系统调度时间),unix-timestamp + ExpectedFinishTime uint `json:"expected_finish_time" xml:"expected_finish_time"` // 期望送达时间(美团、顺丰同城急送支持),unix-timestamp) + ExpectedPickTime uint `json:"expected_pick_time" xml:"expected_pick_time"` // 期望取件时间(闪送、顺丰同城急送支持,顺丰同城急送只需传expected_finish_time或expected_pick_time其中之一即可,同时都传则以expected_finish_time为准),unix-timestamp + PoiSeq string `json:"poi_seq" xml:"poi_seq"` // 门店订单流水号,建议提供,方便骑手门店取货,最长不超过32个字符 + Note string `json:"note" xml:"note"` // 备注,最长不超过200个字符 + OrderTime uint `json:"order_time" xml:"order_time"` // 用户下单付款时间 + IsInsured uint8 `json:"is_insured" xml:"is_insured"` // 是否保价,0,非保价,1.保价 + DeclaredValue float64 `json:"declared_value" xml:"declared_value"` // 保价金额,单位为元,精确到分 + Tips float64 `json:"tips" xml:"tips"` // 小费,单位为元, 下单一般不加小费 + IsDirectDelivery float64 `json:"is_direct_delivery" xml:"is_direct_delivery"` // 是否选择直拿直送(0:不需要;1:需要。选择直拿直送后,同一时间骑手只能配送此订单至完成,配送费用也相应高一些,闪送必须选1,达达可选0或1,其余配送公司不支持直拿直送) + CashOnDelivery float64 `json:"cash_on_delivery" xml:"cash_on_delivery"` // 骑手应付金额,单位为元,精确到分 + CashOnPickup float64 `json:"cash_on_pickup" xml:"cash_on_pickup"` // 骑手应收金额,单位为元,精确到分 + RiderPickMethod uint8 `json:"rider_pick_method" xml:"rider_pick_method"` // 物流流向,1:从门店取件送至用户;2:从用户取件送至门店 + IsFinishCodeNeeded uint8 `json:"is_finish_code_needed" xml:"is_finish_code_needed"` // 收货码(0:不需要;1:需要。收货码的作用是:骑手必须输入收货码才能完成订单妥投) + IsPickupCodeNeeded uint8 `json:"is_pickup_code_needed" xml:"is_pickup_code_needed"` // 取货码(0:不需要;1:需要。取货码的作用是:骑手必须输入取货码才能从商家取货) + } `json:"order_info" xml:"order_info"` // 订单信息 +} + +// PreAuthCodeGetReturn 需要返回的数据 +type PreAuthCodeGetReturn struct { + CommonServerReturn + PreAuthCode string `json:"pre_auth_code" xml:"pre_auth_code"` // 是 预授权码 +} + +// PreAuthCodeGetResult 服务器携带的参数 +type PreAuthCodeGetResult struct { + CommonServerResult + WxAppID string `json:"wx_appid" xml:"wx_appid"` // 发起授权的商户小程序appid +} + +// RiderScoreSetReturn 需要返回的数据 +type RiderScoreSetReturn CommonServerReturn + +// RiderScoreSetResult 服务器携带的参数 +type RiderScoreSetResult struct { + CommonServerResult + ShopID string `json:"shopid" xml:"shopid"` // 商家id, 由配送公司分配,可以是dev_id或者appkey + ShopOrderID string `json:"shop_order_id" xml:"shop_order_id"` // 唯一标识订单的 ID,由商户生成 + ShopNo string `json:"shop_no" xml:"shop_no"` // 商家门店编号, 在配送公司侧登记 + WaybillID string `json:"waybill_id" xml:"waybill_id"` // 配送单id + DeliveryOntimeScore uint `json:"delivery_ontime_score" xml:"delivery_ontime_score"` // 配送准时分数,范围 1 - 5 + CargoIntactScore uint `json:"cargo_intact_score" xml:"cargo_intact_score"` // 货物完整分数,范围1-5 + AttitudeScore uint `json:"attitude_score" xml:"attitude_score"` // 服务态度分数 范围1-5 +} diff --git a/app/lib/weapp/soter.go b/app/lib/weapp/soter.go new file mode 100644 index 0000000..490ed55 --- /dev/null +++ b/app/lib/weapp/soter.go @@ -0,0 +1,41 @@ +package weapp + +const ( + apiVerifySignature = "/cgi-bin/soter/verify_signature" +) + +// VerifySignatureResponse 生物认证秘钥签名验证请求返回数据 +type VerifySignatureResponse struct { + CommonError + IsOk bool `json:"is_ok"` +} + +// VerifySignature 生物认证秘钥签名验证 +// accessToken 接口调用凭证 +// openID 用户 openid +// data 通过 wx.startSoterAuthentication 成功回调获得的 resultJSON 字段 +// signature 通过 wx.startSoterAuthentication 成功回调获得的 resultJSONSignature 字段 +func VerifySignature(token, openID, data, signature string) (*VerifySignatureResponse, error) { + api := baseURL + apiVerifySignature + return verifySignature(api, token, openID, data, signature) +} + +func verifySignature(api, token, openID, data, signature string) (*VerifySignatureResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "openid": openID, + "json_string": data, + "json_signature": signature, + } + + res := new(VerifySignatureResponse) + if err := postJSON(url, params, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/soter_test.go b/app/lib/weapp/soter_test.go new file mode 100644 index 0000000..737124b --- /dev/null +++ b/app/lib/weapp/soter_test.go @@ -0,0 +1,67 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestVerifySignature(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiVerifySignature { + t.Fatalf("Except to path '%s',get '%s'", apiVerifySignature, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + OpenID string `json:"openid"` + JSONString string `json:"json_string"` + JSONSignature string `json:"json_signature"` + }{} + + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.OpenID == "" { + t.Error("Response column openid can not be empty") + } + + if params.JSONString == "" { + t.Error("Response column json_string can not be empty") + } + if params.JSONSignature == "" { + t.Error("Response column json_signature can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok", + "is_ok": true + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + _, err := verifySignature(ts.URL+apiVerifySignature, "mock-access-token", "mock-open-id", "mock-data", "mock-signature") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/subscribe_message.go b/app/lib/weapp/subscribe_message.go new file mode 100644 index 0000000..dd8ab45 --- /dev/null +++ b/app/lib/weapp/subscribe_message.go @@ -0,0 +1,277 @@ +package weapp + +import ( + "strconv" +) + +const ( + apiAddTemplate = "/wxaapi/newtmpl/addtemplate" + apiDeleteTemplate = "/wxaapi/newtmpl/deltemplate" + apiGetTemplateCategory = "/wxaapi/newtmpl/getcategory" + apiGetPubTemplateKeyWordsById = "/wxaapi/newtmpl/getpubtemplatekeywords" + apiGetPubTemplateTitleList = "/wxaapi/newtmpl/getpubtemplatetitles" + apiGetTemplateList = "/wxaapi/newtmpl/gettemplate" + apiSendSubscribeMessage = "/cgi-bin/message/subscribe/send" +) + +// AddTemplateResponse 添加模版消息返回数据 +type AddTemplateResponse struct { + CommonError + Pid string `json:"priTmplId"` // 添加至帐号下的模板id,发送小程序订阅消息时所需 +} + +// AddTemplate 组合模板并添加至帐号下的个人模板库 +// +// token 微信 access_token +// tid 模板ID +// desc 服务场景描述,15个字以内 +// keywordIDList 关键词 ID 列表 +func AddTemplate(token, tid, desc string, keywordIDList []int32) (*AddTemplateResponse, error) { + api := baseURL + apiAddTemplate + return addTemplate(api, token, tid, desc, keywordIDList) +} + +func addTemplate(api, token, tid, desc string, keywordIDList []int32) (*AddTemplateResponse, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "tid": tid, + "kidList": keywordIDList, + "sceneDesc": desc, + } + + res := new(AddTemplateResponse) + err = postJSON(api, params, res) + if err != nil { + return nil, err + } + + return res, nil +} + +// DeleteTemplate 删除帐号下的某个模板 +// +// token 微信 access_token +// pid 模板ID +func DeleteTemplate(token, pid string) (*CommonError, error) { + api := baseURL + apiDeleteTemplate + return deleteTemplate(api, token, pid) +} + +func deleteTemplate(api, token, pid string) (*CommonError, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + params := requestParams{ + "priTmplId": pid, + } + + res := new(CommonError) + err = postJSON(api, params, res) + if err != nil { + return nil, err + } + + return res, nil +} + +// GetTemplateCategoryResponse 删除帐号下的某个模板返回数据 +type GetTemplateCategoryResponse struct { + CommonError + Data []struct { + ID int `json:"id"` // 类目id,查询公共库模版时需要 + Name string `json:"name"` // 类目的中文名 + } `json:"data"` // 类目列表 +} + +// GetTemplateCategory 删除帐号下的某个模板 +// +// token 微信 access_token +func GetTemplateCategory(token string) (*GetTemplateCategoryResponse, error) { + api := baseURL + apiGetTemplateCategory + return getTemplateCategory(token, api) +} + +func getTemplateCategory(token, api string) (*GetTemplateCategoryResponse, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(GetTemplateCategoryResponse) + err = getJSON(api, res) + if err != nil { + return nil, err + } + + return res, nil +} + +// GetPubTemplateKeyWordsByIdResponse 模板标题下的关键词列表 +type GetPubTemplateKeyWordsByIdResponse struct { + CommonError + Count int32 `json:"count"` // 模版标题列表总数 + Data []struct { + Kid int `json:"kid"` // 关键词 id,选用模板时需要 + Name string `json:"name"` // 关键词内容 + Example string `json:"example"` // 关键词内容对应的示例 + Rule string `json:"rule"` // 参数类型 + } `json:"data"` // 关键词列表 +} + +// GetPubTemplateKeyWordsById 获取模板标题下的关键词列表 +// +// token 微信 access_token +// tid 模板ID +func GetPubTemplateKeyWordsById(token, tid string) (*GetPubTemplateKeyWordsByIdResponse, error) { + api := baseURL + apiGetPubTemplateKeyWordsById + return getPubTemplateKeyWordsById(api, token, tid) +} + +func getPubTemplateKeyWordsById(api, token, tid string) (*GetPubTemplateKeyWordsByIdResponse, error) { + queries := requestQueries{ + "access_token": token, + "tid": tid, + } + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(GetPubTemplateKeyWordsByIdResponse) + if err = getJSON(url, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetPubTemplateTitleListResponse 帐号所属类目下的公共模板标题 +type GetPubTemplateTitleListResponse struct { + CommonError + Count uint `json:"count"` // 模版标题列表总数 + Data []struct { + Tid int `json:"tid"` // 模版标题 id + Title string `json:"title"` // 模版标题 + Type int32 `json:"type"` // 模版类型,2 为一次性订阅,3 为长期订阅 + CategoryId string `json:"categoryId"` // 模版所属类目 id + } `json:"data"` // 模板标题列表 +} + +// GetPubTemplateTitleList 获取帐号所属类目下的公共模板标题 +// +// token 微信 access_token +// ids 类目 id,多个用逗号隔开 +// start 用于分页,表示从 start 开始。从 0 开始计数。 +// limit 用于分页,表示拉取 limit 条记录。最大为 30 +func GetPubTemplateTitleList(token, ids string, start, limit int) (*GetPubTemplateTitleListResponse, error) { + api := baseURL + apiGetPubTemplateTitleList + return getPubTemplateTitleList(api, token, ids, start, limit) +} + +func getPubTemplateTitleList(api, token, ids string, start, limit int) (*GetPubTemplateTitleListResponse, error) { + + queries := requestQueries{ + "access_token": token, + "ids": ids, + "start": strconv.Itoa(start), + "limit": strconv.Itoa(limit), + } + + url, err := encodeURL(api, queries) + if err != nil { + return nil, err + } + + res := new(GetPubTemplateTitleListResponse) + if err := getJSON(url, res); err != nil { + return nil, err + } + + return res, nil +} + +// GetTemplateListResponse 获取模板列表返回的数据 +type GetTemplateListResponse struct { + CommonError + Data []struct { + Pid string `json:"priTmplId"` // 添加至帐号下的模板 id,发送小程序订阅消息时所需 + Title string `json:"title"` // 模版标题 + Content string `json:"content"` // 模版内容 + Example string `json:"example"` // 模板内容示例 + Type int32 `json:"type"` // 模版类型,2 为一次性订阅,3 为长期订阅 + } `json:"data"` // 个人模板列表 +} + +// GetTemplateList 获取帐号下已存在的模板列表 +// +// token 微信 access_token +func GetTemplateList(token string) (*GetTemplateListResponse, error) { + api := baseURL + apiGetTemplateList + return getTemplateList(api, token) +} + +func getTemplateList(api, token string) (*GetTemplateListResponse, error) { + url, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(GetTemplateListResponse) + if err := getJSON(url, res); err != nil { + return nil, err + } + + return res, nil +} + +// SubscribeMessage 订阅消息 +type SubscribeMessage struct { + ToUser string `json:"touser"` + TemplateID string `json:"template_id"` + Page string `json:"page,omitempty"` + MiniprogramState MiniprogramState `json:"miniprogram_state,omitempty"` + Data SubscribeMessageData `json:"data"` +} + +// MiniprogramState 跳转小程序类型 +type MiniprogramState = string + +// developer为开发版;trial为体验版;formal为正式版;默认为正式版 +const ( + MiniprogramStateDeveloper = "developer" + MiniprogramStateTrial = "trial" + MiniprogramStateFormal = "formal" +) + +// SubscribeMessageData 订阅消息模板数据 +type SubscribeMessageData map[string]struct { + Value string `json:"value"` +} + +// Send 发送订阅消息 +// +// token access_token +func (sm *SubscribeMessage) Send(token string) (*CommonError, error) { + api := baseURL + apiSendSubscribeMessage + return sm.send(api, token) +} + +func (sm *SubscribeMessage) send(api, token string) (*CommonError, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := &CommonError{} + if err := postJSON(api, sm, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/subscribe_message_test.go b/app/lib/weapp/subscribe_message_test.go new file mode 100644 index 0000000..0662999 --- /dev/null +++ b/app/lib/weapp/subscribe_message_test.go @@ -0,0 +1,75 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestSendSubscribeMessage(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != "/cgi-bin/message/subscribe/send" { + t.Fatalf("Except path '/cgi-bin/message/subscribe/send' got '%s'", path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + ToUser string `json:"touser"` // 用户 openid + + TemplateID string `json:"template_id"` + Page string `json:"page,omitempty"` + Data map[string]struct { + Value string `json:"value"` + } `json:"data"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.ToUser == "" { + t.Fatal("param touser can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + sender := SubscribeMessage{ + ToUser: "mock-open-id", + TemplateID: "mock-template-id", + Page: "mock-page", + MiniprogramState: MiniprogramStateDeveloper, + Data: SubscribeMessageData{ + "mock01.DATA": { + Value: "mock-value", + }, + }, + } + + _, err := sender.send(ts.URL+apiSendSubscribeMessage, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/title.png b/app/lib/weapp/title.png new file mode 100644 index 0000000000000000000000000000000000000000..631f403b33d6e2a158f7230b61ff581be65cb822 GIT binary patch literal 33037 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 literal 0 HcmV?d00001 diff --git a/app/lib/weapp/uniform_message.go b/app/lib/weapp/uniform_message.go new file mode 100644 index 0000000..31cdb42 --- /dev/null +++ b/app/lib/weapp/uniform_message.go @@ -0,0 +1,73 @@ +package weapp + +const ( + apiSendUniformMessage = "/cgi-bin/message/wxopen/template/uniform_send" +) + +// UniformMsgData 模板消息内容 +type UniformMsgData map[string]UniformMsgKeyword + +// UniformMsgKeyword 关键字 +type UniformMsgKeyword struct { + Value string `json:"value"` + Color string `json:"color,omitempty"` +} + +// UniformWeappTmpMsg 小程序模板消息 +type UniformWeappTmpMsg struct { + TemplateID string `json:"template_id"` + Page string `json:"page"` + FormID string `json:"form_id"` + Data UniformMsgData `json:"data"` + EmphasisKeyword string `json:"emphasis_keyword,omitempty"` +} + +// UniformMsgMiniprogram 小程序 +type UniformMsgMiniprogram struct { + AppID string `json:"appid"` + PagePath string `json:"pagepath"` +} + +// UniformMpTmpMsg 公众号模板消息 +type UniformMpTmpMsg struct { + AppID string `json:"appid"` + TemplateID string `json:"template_id"` + URL string `json:"url"` + Miniprogram UniformMsgMiniprogram `json:"miniprogram"` + Data UniformMsgData `json:"data"` +} + +// Miniprogram 小程序 +type Miniprogram struct { + AppID string `json:"appid"` + PagePath string `json:"pagepath"` +} + +// UniformMsgSender 统一服务消息 +type UniformMsgSender struct { + ToUser string `json:"touser"` // 用户 openid + UniformWeappTmpMsg UniformWeappTmpMsg `json:"weapp_template_msg,omitempty"` + UniformMpTmpMsg UniformMpTmpMsg `json:"mp_template_msg,omitempty"` +} + +// Send 统一服务消息 +// +// token access_token +func (msg *UniformMsgSender) Send(token string) (*CommonError, error) { + api := baseURL + apiSendUniformMessage + return msg.send(api, token) +} + +func (msg *UniformMsgSender) send(api, token string) (*CommonError, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(api, msg, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/uniform_message_test.go b/app/lib/weapp/uniform_message_test.go new file mode 100644 index 0000000..2ad80f1 --- /dev/null +++ b/app/lib/weapp/uniform_message_test.go @@ -0,0 +1,102 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestSendUniformMessage(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + path := r.URL.EscapedPath() + if path != apiSendUniformMessage { + t.Fatalf("Except to path '%s',get '%s'", apiSendUniformMessage, path) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + ToUser string `json:"touser"` // 用户 openid + + UniformWeappTmpMsg struct { + TemplateID string `json:"template_id"` + Page string `json:"page"` + FormID string `json:"form_id"` + Data map[string]struct { + Value string `json:"value"` + } `json:"data"` + EmphasisKeyword string `json:"emphasis_keyword"` + } `json:"weapp_template_msg"` + UniformMpTmpMsg struct { + AppID string `json:"appid"` + TemplateID string `json:"template_id"` + URL string `json:"url"` + Miniprogram struct { + AppID string `json:"appid"` + PagePath string `json:"pagepath"` + } `json:"miniprogram"` + Data map[string]struct { + Value string `json:"value"` + Color string `json:"color,omitempty"` + } `json:"data"` + } `json:"mp_template_msg"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.ToUser == "" { + t.Fatal("param touser can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + sender := UniformMsgSender{ + ToUser: "mock-open-id", + UniformWeappTmpMsg: UniformWeappTmpMsg{ + TemplateID: "mock-template-id", + Page: "mock-page", + FormID: "mock-form-id", + Data: UniformMsgData{ + "mock-keyword": UniformMsgKeyword{Value: "mock-value"}, + }, + EmphasisKeyword: "mock-keyword.DATA", + }, + UniformMpTmpMsg: UniformMpTmpMsg{ + AppID: "mock-app-id", + TemplateID: "mock-template-id", + URL: "mock-url", + Miniprogram: UniformMsgMiniprogram{"mock-miniprogram-app-id", "mock-page-path"}, + Data: UniformMsgData{ + "mock-keyword": UniformMsgKeyword{"mock-value", "mock-color"}, + }, + }, + } + + _, err := sender.send(ts.URL+apiSendUniformMessage, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/updatable_message.go b/app/lib/weapp/updatable_message.go new file mode 100644 index 0000000..d6016fa --- /dev/null +++ b/app/lib/weapp/updatable_message.go @@ -0,0 +1,99 @@ +package weapp + +const ( + apiCreateActivityID = "/cgi-bin/message/wxopen/activityid/create" + apiSetUpdatableMsg = "/cgi-bin/message/wxopen/updatablemsg/send" +) + +// CreateActivityIDResponse 动态消息 +type CreateActivityIDResponse struct { + CommonError + ActivityID string `json:"activity_id"` // 动态消息的 ID + ExpirationTime uint `json:"expiration_time"` // activity_id 的过期时间戳。默认24小时后过期。 +} + +// CreateActivityID 创建被分享动态消息的 activity_id。 +// token 接口调用凭证 +func CreateActivityID(token string) (*CreateActivityIDResponse, error) { + api := baseURL + apiCreateActivityID + return createActivityID(api, token) +} + +func createActivityID(api, token string) (*CreateActivityIDResponse, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CreateActivityIDResponse) + if err := getJSON(api, res); err != nil { + return nil, err + } + + return res, nil +} + +// UpdatableMsgTempInfo 动态消息对应的模板信息 +type UpdatableMsgTempInfo struct { + ParameterList []UpdatableMsgParameter `json:"parameter_list"` // 模板中需要修改的参数列表 +} + +// UpdatableMsgParameter 参数 +// member_count target_state = 0 时必填,文字内容模板中 member_count 的值 +// room_limit target_state = 0 时必填,文字内容模板中 room_limit 的值 +// path target_state = 1 时必填,点击「进入」启动小程序时使用的路径。 +// 对于小游戏,没有页面的概念,可以用于传递查询字符串(query),如 "?foo=bar" +// version_type target_state = 1 时必填,点击「进入」启动小程序时使用的版本。 +// 有效参数值为:develop(开发版),trial(体验版),release(正式版) +type UpdatableMsgParameter struct { + Name UpdatableMsgParamName `json:"name"` // 要修改的参数名 + Value string `json:"value"` // 修改后的参数值 +} + +// UpdatableMsgTargetState 动态消息修改后的状态 +type UpdatableMsgTargetState = uint8 + +// 动态消息状态 +const ( + UpdatableMsgJoining UpdatableMsgTargetState = iota // 未开始 + UpdatableMsgStarted // 已开始 +) + +// UpdatableMsgParamName 参数 name 的合法值 +type UpdatableMsgParamName = string + +// 动态消息状态 +const ( + UpdatableMsgParamMemberCount UpdatableMsgParamName = "member_count" // target_state = 0 时必填,文字内容模板中 member_count 的值 + UpdatableMsgParamRoomLimit = "room_limit" // target_state = 0 时必填,文字内容模板中 room_limit 的值 + UpdatableMsgParamPath = "path" // target_state = 1 时必填,点击「进入」启动小程序时使用的路径。 对于小游戏,没有页面的概念,可以用于传递查询字符串(query),如 "?foo=bar" + UpdatableMsgParamVersionType = "version_type" // target_state = 1 时必填,点击「进入」启动小程序时使用的版本。有效参数值为:develop(开发版),trial(体验版),release(正式版) +) + +// UpdatableMsgSetter 动态消息 +type UpdatableMsgSetter struct { + ActivityID string `json:"activity_id"` // 动态消息的 ID,通过 updatableMessage.createActivityId 接口获取 + TargetState UpdatableMsgTargetState `json:"target_state"` // 动态消息修改后的状态(具体含义见后文) + TemplateInfo UpdatableMsgTempInfo `json:"template_info"` // 动态消息对应的模板信息 +} + +// Set 修改被分享的动态消息。 +// accessToken 接口调用凭证 +func (setter *UpdatableMsgSetter) Set(token string) (*CommonError, error) { + api := baseURL + apiSetUpdatableMsg + return setter.set(api, token) +} + +func (setter *UpdatableMsgSetter) set(api, token string) (*CommonError, error) { + api, err := tokenAPI(api, token) + if err != nil { + return nil, err + } + + res := new(CommonError) + if err := postJSON(api, setter, res); err != nil { + return nil, err + } + + return res, nil +} diff --git a/app/lib/weapp/updatable_message_test.go b/app/lib/weapp/updatable_message_test.go new file mode 100644 index 0000000..3e200d3 --- /dev/null +++ b/app/lib/weapp/updatable_message_test.go @@ -0,0 +1,129 @@ +package weapp + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" +) + +func TestCreateActivityID(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "GET" { + t.Fatalf("Expect 'GET' get '%s'", r.Method) + } + + realPath := r.URL.EscapedPath() + expectPath := "/cgi-bin/message/wxopen/activityid/create" + if realPath != expectPath { + t.Fatalf("Expect to path '%s',get '%s'", expectPath, realPath) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "expiration_time": 1000, + "activity_id": "ok", + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + res, err := createActivityID(ts.URL+apiCreateActivityID, "mock-access-token") + if err != nil { + t.Fatal(err) + } + + if res.ActivityID == "" { + t.Error("Response column activity_id can not be empty") + } + + if res.ExpirationTime == 0 { + t.Error("Response column expiration_time can not be zero") + } +} + +func TestSetUpdatableMsg(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + if r.Method != "POST" { + t.Fatalf("Expect 'POST' get '%s'", r.Method) + } + + realPath := r.URL.EscapedPath() + expectPath := "/cgi-bin/message/wxopen/updatablemsg/send" + if realPath != expectPath { + t.Fatalf("Expect to path '%s',get '%s'", expectPath, realPath) + } + + if err := r.ParseForm(); err != nil { + t.Fatal(err) + } + + if r.Form.Get("access_token") == "" { + t.Fatalf("access_token can not be empty") + } + + params := struct { + ActivityID string `json:"activity_id"` + TargetState uint8 `json:"target_state"` + TemplateInfo struct { + ParameterList []struct { + Name string `json:"name"` + Value string `json:"value"` + } `json:"parameter_list"` + } `json:"template_info"` + }{} + if err := json.NewDecoder(r.Body).Decode(¶ms); err != nil { + t.Fatal(err) + } + + if params.ActivityID == "" { + t.Fatal("param activity_id can not be empty") + } + + if len(params.TemplateInfo.ParameterList) == 0 { + t.Fatal("param template_info.parameter_list can not be empty") + } + + w.WriteHeader(http.StatusOK) + + raw := `{ + "errcode": 0, + "errmsg": "ok" + }` + if _, err := w.Write([]byte(raw)); err != nil { + t.Fatal(err) + } + })) + defer ts.Close() + + setter := UpdatableMsgSetter{ + "mock-activity-id", + UpdatableMsgJoining, + UpdatableMsgTempInfo{ + []UpdatableMsgParameter{ + {UpdatableMsgParamMemberCount, "mock-parameter-value-number"}, + {UpdatableMsgParamRoomLimit, "mock-parameter-value-number"}, + }, + }, + } + + _, err := setter.set(ts.URL+apiSetUpdatableMsg, "mock-access-token") + if err != nil { + t.Fatal(err) + } +} diff --git a/app/lib/weapp/util.go b/app/lib/weapp/util.go new file mode 100644 index 0000000..edf9b46 --- /dev/null +++ b/app/lib/weapp/util.go @@ -0,0 +1,149 @@ +package weapp + +import ( + "bytes" + "crypto/tls" + "encoding/json" + "io" + "log" + "math/rand" + "mime/multipart" + "net/http" + "net/url" + "os" + "time" +) + +// tokenAPI 获取带 token 的 API 地址 +func tokenAPI(api, token string) (string, error) { + queries := requestQueries{ + "access_token": token, + } + + return encodeURL(api, queries) +} + +// encodeURL add and encode parameters. +func encodeURL(api string, params requestQueries) (string, error) { + url, err := url.Parse(api) + if err != nil { + return "", err + } + + query := url.Query() + + for k, v := range params { + query.Set(k, v) + } + + url.RawQuery = query.Encode() + + return url.String(), nil +} + +// randomString random string generator +// +// ln length of return string +func randomString(ln int) string { + letters := []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + b := make([]rune, ln) + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := range b { + b[i] = letters[r.Intn(len(letters))] + } + + return string(b) +} + +// postJSON perform a HTTP/POST request with json body +func postJSON(url string, params interface{}, response interface{}) error { + resp, err := postJSONWithBody(url, params) + if err != nil { + return err + } + defer resp.Body.Close() + + return json.NewDecoder(resp.Body).Decode(response) +} + +func getJSON(url string, response interface{}) error { + resp, err := httpClient().Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + return json.NewDecoder(resp.Body).Decode(response) +} + +// postJSONWithBody return with http body. +func postJSONWithBody(url string, params interface{}) (*http.Response, error) { + b := &bytes.Buffer{} + if params != nil { + enc := json.NewEncoder(b) + enc.SetEscapeHTML(false) + err := enc.Encode(params) + if err != nil { + return nil, err + } + } + + return httpClient().Post(url, "application/json; charset=utf-8", b) +} + +func postFormByFile(url, field, filename string, response interface{}) error { + // Add your media file + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + + return postForm(url, field, filename, file, response) +} + +func postForm(url, field, filename string, reader io.Reader, response interface{}) error { + // Prepare a form that you will submit to that URL. + buf := new(bytes.Buffer) + w := multipart.NewWriter(buf) + fw, err := w.CreateFormFile(field, filename) + if err != nil { + return err + } + + if _, err = io.Copy(fw, reader); err != nil { + return err + } + + // Don't forget to close the multipart writer. + // If you don't close it, your request will be missing the terminating boundary. + w.Close() + + // Now that you have a form, you can submit it to your handler. + req, err := http.NewRequest("POST", url, buf) + if err != nil { + return err + } + // Don't forget to set the content type, this will contain the boundary. + req.Header.Set("Content-Type", w.FormDataContentType()) + + // Submit the request + client := httpClient() + + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + return json.NewDecoder(resp.Body).Decode(response) +} + +func httpClient() *http.Client { + log.Print("myweapp use http") + return &http.Client{ + Timeout: 10 * time.Second, + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + } +} diff --git a/app/lib/weapp/weapp.go b/app/lib/weapp/weapp.go new file mode 100644 index 0000000..5577192 --- /dev/null +++ b/app/lib/weapp/weapp.go @@ -0,0 +1,12 @@ +package weapp + +const ( + // baseURL 微信请求基础URL + baseURL = "https://api.weixin.qq.com" +) + +// POST 参数 +type requestParams map[string]interface{} + +// URL 参数 +type requestQueries map[string]string diff --git a/app/lib/wechat/.gitignore b/app/lib/wechat/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/app/lib/wechat/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/app/lib/wxpay/.gitignore b/app/lib/wxpay/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/app/lib/wxpay/api.go b/app/lib/wxpay/api.go new file mode 100644 index 0000000..275623d --- /dev/null +++ b/app/lib/wxpay/api.go @@ -0,0 +1,303 @@ +package wxpay + +import ( + "applet/app/utils" + "applet/app/utils/logx" + "fmt" + "github.com/iGoogle-ink/gopay" + "github.com/iGoogle-ink/gopay/pkg/util" + "github.com/iGoogle-ink/gopay/wechat" + v3 "github.com/iGoogle-ink/gopay/wechat/v3" + "strconv" + "time" +) + +func NewClient(appId, mchId, apiKey string, isProd bool) *wechat.Client { + // 初始化微信客户端 + // appId:应用ID + // mchId:商户ID + // apiKey:API秘钥值 + // isProd:是否是正式环境 + client := wechat.NewClient(appId, mchId, apiKey, isProd) + // 打开Debug开关,输出请求日志,默认关闭 + client.DebugSwitch = gopay.DebugOn + // 设置国家:不设置默认 中国国内 + // wechat.China:中国国内 + // wechat.China2:中国国内备用 + // wechat.SoutheastAsia:东南亚 + // wechat.Other:其他国家 + client.SetCountry(wechat.China) + // 添加微信证书 Path 路径 + // certFilePath:apiclient_cert.pem 路径 + // keyFilePath:apiclient_key.pem 路径 + // pkcs12FilePath:apiclient_cert.p12 路径 + // 返回err + //client.AddCertFilePath() + + // 添加微信证书内容 Content + // certFileContent:apiclient_cert.pem 内容 + // keyFileContent:apiclient_key.pem 内容 + // pkcs12FileContent:apiclient_cert.p12 内容 + // 返回err + //client.AddCertFileContent() + return client +} + +// TradeAppPay is 微信APP支付 +func TradeAppPay(client *wechat.Client, subject, orderID, amount, notifyUrl string) (map[string]string, error) { + // 初始化 BodyMap + bm := make(gopay.BodyMap) + bm.Set("nonce_str", util.GetRandomString(32)). + Set("body", subject). + Set("out_trade_no", orderID). + Set("total_fee", amount). + Set("spbill_create_ip", "127.0.0.1"). + Set("notify_url", notifyUrl). + Set("trade_type", wechat.TradeType_App). + Set("sign_type", wechat.SignType_MD5) + /*.Set("openid", "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")*/ + // 预下单 + wxRsp, err := client.UnifiedOrder(bm) + if err != nil { + _ = logx.Warn(err) + return nil, err + } + _, err = wechat.VerifySign(client.ApiKey, wechat.SignType_MD5, wxRsp) + if err != nil { + _ = logx.Warn(err) + return nil, err + } + //if !ok { + // return nil, errors.New("验签失败") + //} + timeStamp := strconv.FormatInt(time.Now().Unix(), 10) + paySign := wechat.GetAppPaySign(client.AppId, client.MchId, wxRsp.NonceStr, wxRsp.PrepayId, wechat.SignType_MD5, timeStamp, client.ApiKey) + res := map[string]string{ + "appid": client.AppId, + "partnerid": client.MchId, + "prepayid": wxRsp.PrepayId, + "sign": paySign, + "package": "Sign=WXPay", + "noncestr": wxRsp.NonceStr, + "timestamp": timeStamp, + } + return res, nil +} + +// TradeAppPay is 微信H5支付 +func TradeH5Pay(client *wechat.Client, subject, orderID, amount, notifyUrl string) (map[string]string, error) { + // 初始化 BodyMap + bm := make(gopay.BodyMap) + bm.Set("nonce_str", util.GetRandomString(32)). + Set("body", subject). + Set("out_trade_no", orderID). + Set("total_fee", amount). + Set("spbill_create_ip", "121.196.29.49"). + Set("notify_url", notifyUrl). + Set("trade_type", wechat.TradeType_H5). + Set("sign_type", wechat.SignType_MD5). + SetBodyMap("scene_info", func(bm gopay.BodyMap) { + bm.SetBodyMap("h5_info", func(bm gopay.BodyMap) { + bm.Set("type", "Wap") + bm.Set("wap_url", "https://www.fumm.cc") + bm.Set("wap_name", "zyos") + }) + }) + /*.Set("openid", "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")*/ + // 预下单 + wxRsp, err := client.UnifiedOrder(bm) + if err != nil { + _ = logx.Warn(err) + return nil, err + } + _, err = wechat.VerifySign(client.ApiKey, wechat.SignType_MD5, wxRsp) + if err != nil { + _ = logx.Warn(err) + return nil, err + } + timeStamp := strconv.FormatInt(time.Now().Unix(), 10) + packages := "prepay_id=" + wxRsp.PrepayId + paySign := wechat.GetH5PaySign(client.AppId, wxRsp.NonceStr, packages, wechat.SignType_MD5, timeStamp, client.ApiKey) + fmt.Println("paySign===", paySign) + r := map[string]string{ + "redirect_url": wxRsp.MwebUrl, + } + return r, nil +} + +// TradeMiniProgPay is 微信小程序支付 ☑️ +func TradeMiniProgPay(client *wechat.Client, subject, orderID, amount, notifyUrl, openid string) (map[string]string, error) { + // 初始化 BodyMap + bm := make(gopay.BodyMap) + bm.Set("nonce_str", util.GetRandomString(32)). + Set("body", subject). + Set("openid", openid). + Set("out_trade_no", orderID). + Set("total_fee", amount). + Set("spbill_create_ip", "127.0.0.1"). + Set("notify_url", notifyUrl). + Set("trade_type", wechat.TradeType_Mini). + Set("sign_type", wechat.SignType_MD5) + // 预下单 + wxRsp, err := client.UnifiedOrder(bm) + if err != nil { + _ = logx.Warn(err) + return nil, err + } + fmt.Println(wxRsp) + timeStamp := strconv.FormatInt(time.Now().Unix(), 10) + packages := "prepay_id=" + wxRsp.PrepayId + paySign := wechat.GetMiniPaySign(client.AppId, wxRsp.NonceStr, packages, wechat.SignType_MD5, timeStamp, client.ApiKey) + res := map[string]string{ + "appId": client.AppId, + "paySign": paySign, + "signType": wechat.SignType_MD5, + "package": packages, + "nonceStr": wxRsp.NonceStr, + "timeStamp": timeStamp, + } + return res, nil +} + +// TradeAppPayV3 is 微信APP支付v3 +func TradeAppPayV3(client *v3.ClientV3, subject, orderID, amount, notifyUrl string) (map[string]string, error) { + // 初始化 BodyMap + amountNew := utils.AnyToFloat64(amount) * 100 + bm := make(gopay.BodyMap) + bm.Set("nonce_str", util.GetRandomString(32)). + Set("body", subject). + Set("out_trade_no", orderID). + Set("total_fee", amountNew). + Set("spbill_create_ip", "127.0.0.1"). + Set("notify_url", notifyUrl). + Set("trade_type", wechat.TradeType_App). + Set("sign_type", wechat.SignType_MD5) + /*.Set("openid", "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")*/ + //// 预下单 + //wxRsp, err := v3.UnifiedOrder(bm) + //if err != nil { + // _ = logx.Warn(err) + // return nil, err + //} + //_, err = wechat.VerifySign(client.ApiKey, wechat.SignType_MD5, wxRsp) + //if err != nil { + // _ = logx.Warn(err) + // return nil, err + //} + ////if !ok { + //// return nil, errors.New("验签失败") + ////} + //timeStamp := strconv.FormatInt(time.Now().Unix(), 10) + //paySign := wechat.GetAppPaySign(client.AppId, client.MchId, wxRsp.NonceStr, wxRsp.PrepayId, wechat.SignType_MD5, timeStamp, client.ApiKey) + //res := map[string]string{ + // "appid": client.AppId, + // "partnerid": client.MchId, + // "prepayid": wxRsp.PrepayId, + // "sign": paySign, + // "package": "Sign=WXPay", + // "noncestr": wxRsp.NonceStr, + // "timestamp": timeStamp, + //} + //return res, nil + return nil, nil +} + +//// TradeJSAPIPay is 微信JSAPI支付 +func TradeJSAPIPay(client *wechat.Client, subject, orderID, amount, notifyUrl, openid string) (map[string]string, error) { + // 初始化 BodyMap + bm := make(gopay.BodyMap) + bm.Set("nonce_str", util.GetRandomString(32)). + Set("body", subject). + Set("out_trade_no", orderID). + Set("total_fee", amount). + Set("spbill_create_ip", "121.196.29.49"). + Set("notify_url", notifyUrl). + Set("trade_type", wechat.TradeType_JsApi). + Set("sign_type", wechat.SignType_MD5). + Set("openid", openid). + SetBodyMap("scene_info", func(bm gopay.BodyMap) { + bm.SetBodyMap("h5_info", func(bm gopay.BodyMap) { + bm.Set("type", "Wap") + bm.Set("wap_url", "https://www.fumm.cc") + bm.Set("wap_name", "zyos") + }) + }) + // 预下单 + wxRsp, err := client.UnifiedOrder(bm) + if err != nil { + _ = logx.Warn(err) + return nil, err + } + _, err = wechat.VerifySign(client.ApiKey, wechat.SignType_MD5, wxRsp) + if err != nil { + _ = logx.Warn(err) + return nil, err + } + //if !ok { + // return nil, errors.New("验签失败") + //} + timeStamp := strconv.FormatInt(time.Now().Unix(), 10) + //paySign := wechat.GetAppPaySign(client.AppId, client.MchId, wxRsp.NonceStr, wxRsp.PrepayId, wechat.SignType_MD5, timeStamp, client.ApiKey) + packages := "prepay_id=" + wxRsp.PrepayId + paySign := wechat.GetJsapiPaySign(client.AppId, wxRsp.NonceStr, packages, wechat.SignType_MD5, timeStamp, client.ApiKey) + + logx.Info("wxRsp.PrepayId:" + wxRsp.PrepayId) + logx.Info("wxRsp.PrepayId:" + wxRsp.PrepayId) + logx.Info("wxRsp.PrepayId:" + openid) + res := map[string]string{ + "appid": client.AppId, + "partnerid": client.MchId, + "prepayid": wxRsp.PrepayId, + "sign": paySign, + "package": "prepay_id=" + wxRsp.PrepayId, + "noncestr": wxRsp.NonceStr, + "timestamp": timeStamp, + } + return res, nil +} + +// TradeH5PayV3 is 微信H5支付v3 +func TradeH5PayV3(client *wechat.Client, subject, orderID, amount, notifyUrl string) (string, error) { + // 初始化 BodyMap + bm := make(gopay.BodyMap) + bm.Set("nonce_str", util.GetRandomString(32)). + Set("body", subject). + Set("out_trade_no", orderID). + Set("total_fee", amount). + Set("spbill_create_ip", "127.0.0.1"). + Set("notify_url", notifyUrl). + Set("trade_type", wechat.TradeType_App). + Set("device_info", "WEB"). + Set("sign_type", wechat.SignType_MD5). + SetBodyMap("scene_info", func(bm gopay.BodyMap) { + bm.SetBodyMap("h5_info", func(bm gopay.BodyMap) { + bm.Set("type", "Wap") + bm.Set("wap_url", "https://www.fumm.cc") + bm.Set("wap_name", "H5测试支付") + }) + }) /*.Set("openid", "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")*/ + // 预下单 + wxRsp, err := client.UnifiedOrder(bm) + if err != nil { + _ = logx.Warn(err) + return "", err + } + // ====APP支付 paySign==== + timeStamp := strconv.FormatInt(time.Now().Unix(), 10) + // 获取APP支付的 paySign + // 注意:package 参数因为是固定值,无需开发者再传入 + // appId:AppID + // partnerid:partnerid + // nonceStr:随机字符串 + // prepayId:统一下单成功后得到的值 + // signType:签名方式,务必与统一下单时用的签名方式一致 + // timeStamp:时间 + // apiKey:API秘钥值 + paySign := wechat.GetAppPaySign(client.AppId, client.MchId, wxRsp.NonceStr, wxRsp.PrepayId, wechat.SignType_MD5, timeStamp, client.ApiKey) + return paySign, nil +} + +// TradeMiniProgPayV3 is 微信小程序支付v3 +func TradeMiniProgPayV3(client *v3.ClientV3, subject, orderID, amount, notifyUrl string) (string, error) { + return "", nil +} diff --git a/app/md/alipay.go b/app/md/alipay.go new file mode 100644 index 0000000..0eafa67 --- /dev/null +++ b/app/md/alipay.go @@ -0,0 +1,69 @@ +package md + +// AliPayCallback 支付宝的回调结构体 +type AliPayCallback struct { + AppID string `json:"app_id"` + AuthAppID string `json:"auth_app_id"` + BuyerID string `json:"buyer_id"` + BuyerLogonID string `json:"buyer_logon_id"` + BuyerPayAmount string `json:"buyer_pay_amount"` + Charset string `json:"charset"` + FundBillList string `json:"fund_bill_list"` + GmtCreate string `json:"gmt_create"` + GmtPayment string `json:"gmt_payment"` + InvoiceAmount string `json:"invoice_amount"` + OrderType string `json:"order_type"` + MasterID string `json:"master_id"` + NotifyID string `json:"notify_id"` + NotifyTime string `json:"notify_time"` + NotifyType string `json:"notify_type"` + OutTradeNo string `json:"out_trade_no"` + PassbackParams string `json:"passback_params"` + PointAmount string `json:"point_amount"` + ReceiptAmount string `json:"receipt_amount"` + SellerEmail string `json:"seller_email"` + SellerID string `json:"seller_id"` + Sign string `json:"sign"` + SignType string `json:"sign_type"` + Subject string `json:"subject"` + TotalAmount string `json:"total_amount"` + TradeNo string `json:"trade_no"` + TradeStatus string `json:"trade_status"` + Version string `json:"version"` + PayMethod string `json:"pay_method"` +} + +type AliPayPayParams struct { + Subject string `json:"subject" binding:"required"` + Amount string `json:"amount" binding:"required"` + OrderType string `json:"order_type" binding:"required"` + OrdId string `json:"ord_id"` + Uid string `json:"uid"` + Phone string `json:"phone"` +} +type PayData struct { + PayAppCertSn string `json:"pay_app_cert_sn"` + PayAlipayRootCertSn string `json:"pay_alipay_root_cert_sn"` + PayAlipayrsaPublicKey string `json:"pay_alipayrsa_public_key"` + PayAliUseType string `json:"pay_ali_use_type"` + PriKey string `json:"pay_ali_new_private_key"` +} + +type AlipayUserCertdocCertverifyPreconsult struct { + AlipayUserCertdocCertverifyPreconsultResponse struct { + Code string `json:"code"` + Msg string `json:"msg"` + VerifyID string `json:"verify_id"` + } `json:"alipay_user_certdoc_certverify_preconsult_response"` + Sign string `json:"sign"` +} +type AlipayUserCertdocCertverifyConsult struct { + AlipayUserCertdocCertverifyConsultResponse struct { + Code string `json:"code"` + FailParams string `json:"fail_params"` + FailReason string `json:"fail_reason"` + Msg string `json:"msg"` + Passed string `json:"passed"` + } `json:"alipay_user_certdoc_certverify_consult_response"` + Sign string `json:"sign"` +} diff --git a/app/md/app_redis_key.go b/app/md/app_redis_key.go new file mode 100644 index 0000000..3ffa25f --- /dev/null +++ b/app/md/app_redis_key.go @@ -0,0 +1,23 @@ +package md + +// 缓存key统一管理, %s格式化为masterId +const ( + AppCfgCacheKey = "%s:app_cfg_cache:" // 占位符: masterId, key的第一个字母 + VirtualCoinCfgCacheKey = "%s:virtual_coin_cfg" + PlanRewardCfgCacheKey = "%s:plan_reward_cfg" + UnionSetCacheCfg = "%s:union_set_cfg:%s" // 联盟设置缓存key + + UserFinValidUpdateLock = "%s:user_fin_valid_update_lock:%s" // 用户余额更新锁(能拿到锁才能更新余额) + + WithdrawApplyQueueListKey = "withdraw_apply_queue" // 提现队列 + + TplBottomNavRedisKey = "%s:tpl_nav_bottom_key:%s" // master_id platform + + SysModByIdRedisKey = "%s:sys_mod_tpl_by_id:%s" + + AppLimiterLock = "%s:ZhiOs_app_limiter_lock:%s" // 限流器锁 + DealAppLimiterRequestIdPrefix = "%s:ZhiOs_app_comm_limiter_request_id:%s" + DealAppNewcomersLimiterRequestIdPrefix = "%s:ZhiOs_app_newcomers_limiter_request_id:%s" + + CfgCacheTime = 60 * 60 * 4 +) diff --git a/app/md/cfg_key.go b/app/md/cfg_key.go new file mode 100644 index 0000000..f93828d --- /dev/null +++ b/app/md/cfg_key.go @@ -0,0 +1,282 @@ +package md + +// 获取用户的缓存key +const ( + KEY_SYS_CFG_CACHE = "sys_cfg_cache" + FunctionPermissionCfgCacheKey = "%s:function_permission_cfg" + // 文件缓存的key + KEY_CFG_FILE_PVD = "file_provider" // 文件供应商 + KEY_CFG_FILE_BUCKET = "file_bucket" + KEY_CFG_FILE_REGION = "file_bucket_region" + KEY_CFG_FILE_HOST = "file_bucket_host" + KEY_CFG_FILE_SCHEME = "file_bucket_scheme" + KEY_CFG_FILE_AK = "file_access_key" + KEY_CFG_FILE_SK = "file_secret_key" + KEY_CFG_FILE_MAX_SIZE = "file_user_upload_max_size" + KEY_CFG_FILE_EXT = "file_ext" + KEY_CFG_FILE_AVATAR_THUMBNAIL = "file_avatar_thumbnail" // 默认头像缩略图参数,宽高120px,格式webp. + // 智盟 + KEY_CFG_ZM_JD_SITE_ID = "third_zm_jd_site_id" // 智盟京东联盟id + KEY_CFG_ZM_WEB_ID = "third_zm_web_id" // 智盟网站ID + KEY_CFG_ZM_AK = "third_zm_app_key" + KEY_CFG_ZM_SK = "third_zm_app_secret" + KEY_CFG_ZM_SMS_AK = "third_zm_sms_ak" + KEY_CFG_ZM_SMS_SK = "third_zm_sms_sk" + KEY_CFG_APP_NAME = "app_name" + + KEY_CFG_WHITELIST = "api_cfg_whitelist" // API允许的访问的设置白名单 + + // 淘宝 + KEY_CFG_TB_AUTH_AK = "third_taobao_auth_ak" + KEY_CFG_TB_AUTH_SK = "third_taobao_auth_sk" + KEY_CFG_TB_INVITER_CODE = "third_taobao_auth_inviter_code" + KEY_CFG_TB_AK = "third_taobao_ak" + KEY_CFG_TB_SK = "third_taobao_sk" + KEY_CFG_TB_PID = "third_taobao_pid" // 淘宝推广ID,如:mm_123_456_789,123是联盟ID,456是site_id,789是adzone_id + KEY_CFG_TB_SID = "third_taobao_sid" // 淘宝session id ,又称access_token + + // 苏宁 + KEY_CFG_SN_AK = "third_suning_ak" + KEY_CFG_SN_SK = "third_suning_sk" + + KEY_CFG_JD_AK = "" + KEY_CFG_JD_SK = "" + + KEY_CFG_KL_AK = "third_kaola_ak" + KEY_CFG_KL_SK = "third_kaola_sk" + + KEY_CFG_VIP_AK = "" + KEY_CFG_VIP_SK = "" + + // 自动任务配置 + KEY_CFG_CRON_TB = "cron_order_taobao" + KEY_CFG_CRON_TBSETTLEORDER = "cron_order_taobao_settle_order" + KEY_CFG_CRON_JD = "cron_order_jd" + KEY_CFG_CRON_PDD = "cron_order_pdd" + KEY_CFG_CRON_PDD_SUCC = "cron_order_pdd_succ" + KEY_CFG_CRON_PDDBYCREATETIME = "cron_order_pdd_by_create_time" + KEY_CFG_CRON_PDDBYLOOPTIME = "cron_order_pdd_by_loop_time" + KEY_CFG_CRON_PDDBYLOOPMONTHTIME = "cron_order_pdd_by_loop_month_ago_time" + KEY_CFG_CRON_JDBYCREATETIME = "cron_order_jd_by_create_time" + KEY_CFG_CRON_JDBYSUCCESS = "cron_order_jd_by_success" + KEY_CFG_CRON_JDFAILBYCREATETIME = "cron_order_jd_fail_by_create_time" + KEY_CFG_CRON_PDDBYAGOTIME = "cron_order_pdd_by_ago_time" + KEY_CFG_CRON_PDDBYSTATUS = "cron_order_pdd_by_status" + KEY_CFG_CRON_PDDBYSTATUSSUCCESS = "cron_order_pdd_by_status_success" + KEY_CFG_CRON_PDDBYSTATUSFAIL = "cron_order_pdd_by_status_fail" + KEY_CFG_CRON_JDBYSTATUS = "cron_order_jd_by_status" + KEY_CFG_CRON_TBBYAGOTIME = "cron_order_tb_by_ago_time" + KEY_CFG_CRON_TBBYPAY = "cron_order_tb_by_pay" + KEY_CFG_CRON_TB12 = "cron_order_tb12" + KEY_CFG_CRON_TB13 = "cron_order_tb13" + KEY_CFG_CRON_TB3 = "cron_order_tb3" + KEY_CFG_CRON_TB14 = "cron_order_tb14" + + KEY_CFG_CRON_PDDREFUND = "cron_order_pdd_refund" + KEY_CFG_CRON_TBREFUND = "cron_order_tb_refund" + KEY_CFG_CRON_WPHREFUND = "cron_order_wph_refund" + KEY_CFG_CRON_JDREFUND = "cron_order_jd_refund" + KEY_CFG_CRON_SN = "cron_order_suning" + KEY_CFG_CRON_VIP = "cron_order_vip" + KEY_CFG_CRON_KL = "cron_order_kaola" + KEY_CFG_CRON_DUOMAI = "cron_order_duomai" + KEY_CFG_CRON_HIS = "cron_order_his" // 迁移到历史订单 + KEY_CFG_CRON_SETTLE = "cron_order_settle" //结算 + KEY_CFG_CRON_FREE_SETTLE = "cron_order_free_settle" //结算 + KEY_CFG_CRON_SECOND_FREE_SETTLE = "cron_order_second_free_settle" + KEY_CFG_CRON_THIRD_FREE_SETTLE = "cron_order_third_free_settle" + KEY_CFG_CRON_ACQUISTION_SETTLE = "cron_acquistion_settle" // 拉新结算 + KEY_CFG_CRON_NEW_ACQUISTION_SETTLE = "cron_new_acquistion_settle" // 拉新结算 + KEY_CFG_CRON_PUBLISHER = "cron_taobao_publisher" // 跟踪淘宝备案信息绑定会员运营id 针对小程序 + KEY_CFG_CRON_AUTO_UN_FREEZE = "cron_auto_un_freeze" + KEY_CFG_CRON_MEITUAN = "cron_order_meituan_fxlm" //美团 + KEY_CFG_CRON_MEITUANLM = "cron_order_meituan_lm" //美团联盟 + KEY_CFG_CRON_MEITUANLM_START = "cron_order_meituan_lm_start" //美团联盟 + KEY_CFG_CRON_ORDER_SUCCESS_CHECK = "cron_order_success_check" + KEY_CFG_CRON_MEITUAN_START = "cron_order_meituan_start" //美团联盟 + KEY_CFG_CRON_STARBUCKS = "cron_order_starbucks" //海威星巴克 + KEY_CFG_CRON_HWMOVIE = "cron_order_hw_movie" //海威电影票 + KEY_CFG_CRON_MCDONALD = "cron_order_mcdonald" //海威麦当劳 + KEY_CFG_CRON_NAYUKI = "cron_order_nayuki" //海威奈雪 + KEY_CFG_CRON_BURGERKING = "cron_order_burger_king" //海威汉堡王 + KEY_CFG_CRON_HEYTEA = "cron_order_heytea" //海威喜茶 + KEY_CFG_CRON_TIKTOKLIFE = "cron_order_tik_tok_life" // + KEY_CFG_CRON_FAST_REFUND = "cron_order_fast_refund" + KEY_CFG_CRON_CHECK_GUIDE_STORE_ORDER = "cron_check_guide_store_order" + KEY_CFG_CRON_CHECK_BUCKLE_ORDER = "cron_check_buckle_order" + KEY_CFG_CRON_BUCKLE = "cron_order_buckle" + KEY_CFG_CRON_FAST_SUCCESS = "cron_order_fast_success" + KEY_CFG_CRON_PIZZA = "cron_order_pizza" //海威 + KEY_CFG_CRON_WALLACE = "cron_order_wallace" //海威 + KEY_CFG_CRON_TOURISM = "cron_order_tourism" //海威 + KEY_CFG_CRON_NEAR = "cron_order_near" //海威 + KEY_CFG_CRON_FLOWERCAKE = "cron_order_flowerCake" //海威 + KEY_CFG_CRON_DELIVERY = "cron_order_delivery" //海威 + KEY_CFG_CRON_TO_KFC = "cron_order_to_kfc" // + KEY_CFG_CRON_PAGODA = "cron_order_pagoda" // + KEY_CFG_CRON_LUCKIN = "cron_order_luckin" // + KEY_CFG_CRON_STATIONMEITUANLM = "cron_order_station_meituan_lm" //站长美团联盟 + KEY_CFG_CRON_MEITUANOFFICIAL = "cron_order_meituan_official" //美团联盟智莺 + KEY_CFG_CRON_OILSTATION = "cron_order_oilstation" //加油 + KEY_CFG_CRON_BRIGHTOILSTATION = "cron_order_bright_oilstation" //加油 + KEY_CFG_CRON_KFC = "cron_order_kfc" //肯德基 + KEY_CFG_CRON_CINEMA = "cron_order_cinema" //电影票 + KEY_CFG_CRON_OilRequest = "cron_order_oilrequest" //加入主动请求抓单 + KEY_CFG_CRON_AGOTB = "cron_order_agotaobao" //n天前的淘宝订单 + KEY_CFG_CRON_CREDIT_CARD = "cron_order_credit_card" + KEY_CFG_CRON_ORDER_STAT = "cron_order_stat" // 订单统计任务 + KEY_CFG_CRON_CARD_UPDATE = "cron_card_update" // 权益卡更新 + KEY_CFG_CRON_USER_LV_UP_SETTLE = "cron_user_lv_up_settle" //会员费订单结算 + KEY_CFG_CRON_DUOYOUORD_SETTLE = "cron_duoyou_settle" //会员费订单结算 + KEY_CFG_CRON_LIANLIAN_SETTLE = "cron_lianlian_settle" //会员费订单结算 + KEY_CFG_CRON_SWIPE_SETTLE = "cron_swipe_settle" + KEY_CFG_CRON_AGGREGATION_RECHARGE_SETTLE = "cron_aggregation_recharge_settle" + KEY_CFG_CRON_ACQUISITION_CONDITION = "cron_acquisition_condition" + KEY_CFG_CRON_ACQUISITION_CONDITION_BY_LV = "cron_acquisition_condition_by_lv" + KEY_CFG_CRON_ACQUISITION_REWARD = "cron_acquisition_reward" + KEY_CFG_CRON_PLAYLET_SETTLE = "cron_playlet_settle" + KEY_CFG_CRON_TIKTOK_AUTH = "cron_tik_tok_auth" + KEY_CFG_CRON_TASKBOX_SETTLE = "cron_task_box_settle" //会员费订单结算 + KEY_CFG_CRON_PRIVILEGE_CARD_SETTLE = "cron_privilege_card_settle" //权益卡订单结算 + KEY_CFG_CRON_CARD_RETURN = "cron_card_return" //权益卡退款 + KEY_CFG_CRON_PUBLISHER_RELATION = "cron_taobao_publisher_relation" //获取淘宝渠道 + KEY_CFG_CRON_PUBLISHER_RELATION_NEW = "cron_taobao_publisher_relation_new" //获取淘宝渠道 + + KEY_CFG_CRON_DTKBRAND = "cron_dtk_brand" //大淘客品牌信息 + KEY_CFG_CRON_PUBLISHER_RELATION_BIND = "cron_taobao_publisher_relation_bind" //获取淘宝渠道绑定 + KEY_CFG_CRON_GOODS_SHELF = "cron_goods_shelf" //商品上下架定时任务 + KEY_CFG_CRON_DIDI_ENERGY = "cron_order_didi_energy" // + KEY_CFG_CRON_T3_CAR = "cron_order_t3_car" // + KEY_CFG_CRON_DIDI_ONLINE_CAR = "cron_order_didi_online_car" // + KEY_CFG_CRON_KING_FLOWER = "cron_order_king_flower" // + KEY_CFG_CRON_DIDI_CHAUFFEUR = "cron_order_didi_chauffeur" // + KEY_CFG_CRON_PLAYLET_ORDER = "cron_order_playlet_order" // + KEY_CFG_CRON_PLAYLET_GOODS = "cron_order_playlet_goods" // + KEY_CFG_CRON_CARD_CHECK_RETURN = "cron_card_check_return" // + KEY_CFG_CRON_CARD_CHECK_UPDATE = "cron_card_check_update" // + KEY_CFG_CRON_DIDI_FREIGHT = "cron_order_didi_freight" // + KEY_CFG_CRON_TB_PUNISH_REFUND = "cron_order_tb_punish_refund" + KEY_CFG_CRON_TIKTOK = "cron_order_tikTok" + KEY_CFG_CRON_ELM = "cron_order_elm" + KEY_CFG_CRON_AUTO_ADD_TIKTOK_GOODS = "cron_order_auto_add_tiktok_goods" + KEY_CFG_CRON_TIKTOKOwn = "cron_order_tikTokOwn" + KEY_CFG_CRON_TIKTOKCsjp = "cron_order_tikTokCsjp" + KEY_CFG_CRON_TIKTOKCsjpLive = "cron_order_tikTokCsjpLive" + KEY_CFG_CRON_TIKTOKOwnCsjp = "cron_order_tikTokOwnCsjp" + KEY_CFG_CRON_TIKTOKOwnCsjpLive = "cron_order_tikTokOwnCsjpLive" + KEY_CFG_CRON_TIKTOKOwnCsjpActivity = "cron_order_tikTokOwnCsjpActivity" + KEY_CFG_CRON_PlayLet_Total = "cron_playlet_total" + KEY_CFG_CRON_TIKTOKOwnCreate = "cron_order_tikTokOwnCreate" + KEY_CFG_CRON_KuaishouOwn = "cron_order_kuaishouOwn" + KEY_CFG_CRON_KuaishouOwnCreate = "cron_order_kuaishouOwnCreate" + KEY_CFG_CRON_TIKTOKOwnACtivity = "cron_order_tikTokOwnActivity" + KEY_CFG_CRON_DUOYOUORD = "cron_order_DouYouOrd" + KEY_CFG_CRON_TASKBOX = "cron_order_TaskBox" + KEY_CFG_CRON_TASKBOXSECOND = "cron_order_TaskBoxSecond" + KEY_CFG_CRON_TIKTOKOwnMixH5 = "cron_order_tikTokOwnMixH5" + + KEY_CFG_CRON_TIKTOKLIVE_UPDATE = "cron_order_tikTokLive_update" + KEY_CFG_CRON_KUAISHOU = "cron_order_kuaishou" + KEY_CFG_CRON_KUAISHOUOFFICIAL = "cron_order_kuaishou_official" + KEY_CFG_CRON_KUAISHOUOFFICIALLive = "cron_order_kuaishou_official_live" + KEY_CFG_CRON_MEITUANFFICIAL = "cron_order_meituan_official" + KEY_CFG_CRON_TIKTOKLIVE = "cron_order_tikTok_live" + KEY_CFG_CRON_TIKTOKLIVEOWN = "cron_order_tikTok_live_own" + KEY_CFG_CRON_TIKTOKACTIVITY = "cron_order_tikTok_activity" + KEY_CFG_CRON_KUAISHOULIVE = "cron_order_kuaishou_live" + + ZhimengCronPlayletVideoOrder = "cron_playlet_video_order" //短剧订单 + ZhimengCronPlayletAdvOrder = "cron_playlet_adv_order" //短剧广告订单 + ZhimengCronPlayletVideoOrderYesterDay = "cron_playlet_video_order_yesterday" + ZhimengCronPlayletVideoOrderMonth = "cron_playlet_video_order_month" + ZhimengCronPlayletAdvOrderYesterDay = "cron_playlet_adv_order_yesterday" + ZhimengCronPlayletAdvOrderMonth = "cron_playlet_adv_order_month" + ZhimengCronPlayletAdvOrderYesterDayToMoney = "cron_playlet_adv_order_yesterday_to_money" + KEY_CFG_TIK_TOK_TEAM_ORDER_PAY = "cron_tik_tok_team_order_pay" + KEY_CFG_KUAISHOU_TEAM_ORDER_PAY = "cron_kuaishou_team_order_pay" + KEY_CFG_KUAISHOU_TEAM_ORDER_UPDATE = "cron_kuaishou_team_order_update" + KEY_CFG_KUAISHOU_AUTH = "cron_kuaishou_auth" + KEY_CFG_VERIFY = "cron_verify" + KEY_CFG_TIK_TOK_TEAM_ORDER_UPDATE = "cron_tik_tok_team_order_update" + KEY_CFG_TIK_TOK_TEAM_USER_BIND_BUYINID = "cron_tik_tok_team_user_bind_buyinid" + // 自动任务运行时设置 + KEY_CFG_CRON_TIME_PIZZA = "crontab_order_time_pizza" + KEY_CFG_CRON_TIME_WALLACE = "crontab_order_time_wallace" + KEY_CFG_CRON_TIME_TOURISM = "crontab_order_time_tourism" + KEY_CFG_CRON_TIME_NEAR = "crontab_order_time_pizza" + KEY_CFG_CRON_TIME_FLOWERCAKE = "crontab_order_time_flowerCake" + KEY_CFG_CRON_TIME_DELIVERY = "crontab_order_time_delivery" + KEY_CFG_CRON_TIME_TIKTOK = "crontab_order_time_tikTok" + KEY_CFG_CRON_TIME_ELM = "crontab_order_time_elm" + KEY_CFG_CRON_TIME_TIKTOKOwn = "crontab_order_time_tikTokOwn" + KEY_CFG_CRON_TIME_TIKTOKOwnCreate = "crontab_order_time_tikTokOwnCreate" + KEY_CFG_CRON_TIME_KuaishouOwn = "crontab_order_time_kuaishouOwn" + KEY_CFG_CRON_TIME_KuaishouOwnCreate = "crontab_order_time_kuaishouOwnCreate" + KEY_CFG_CRON_TIME_TIKTOKOwnActivity = "KEY_CFG_CRON_TIME_TIKTOKOwnActivity" + KEY_CFG_CRON_TIME_TIKTOKOwnMix = "KEY_CFG_CRON_TIME_TIKTOKOwnMix" + KEY_CFG_CRON_TIME_TIKTOKOwnLive = "crontab_order_time_tikTokOwnLive" + KEY_CFG_CRON_TIME_KUAISHOU = "crontab_order_time_kuaishou" + KEY_CFG_CRON_TIME_TIKTOKLIVE = "crontab_order_time_tikTok_live" + KEY_CFG_CRON_TIME_KUAISHOULIVE = "crontab_order_time_kuaishou_live" + KEY_CFG_CRON_TIME_TB = "crontab_order_time_taobao" + KEY_CFG_CRON_TIME_CSJP = "crontab_order_time_csjp" + KEY_CFG_CRON_TIME_KUAISHOU_OFFICIAL = "crontab_order_time_kuaishou_official" + KEY_CFG_CRON_TIME_KUAISHOU_OFFICIAL_LIVE = "crontab_order_time_kuaishou_official_live" + KEY_CFG_CRON_TIME_MEITUAN_OFFICIAL = "crontab_order_time_meituan_official" + KEY_CFG_CRON_TIME_CSJP_Live = "crontab_order_time_csjp_live" + KEY_CFG_CRON_TIME_OWN_CSJP = "crontab_order_time_own_csjp" + KEY_CFG_CRON_TIME_TIKTOK_TEAM_ORDER = "crontab_order_time_tiktok_team_order" + KEY_CFG_CRON_TIME_OWN_CSJP_Live = "crontab_order_time_own_csjp_live" + KEY_CFG_CRON_TIME_OWN_CSJP_ACTIVITY = "crontab_order_time_own_csjp_activity" + KEY_CFG_CRON_TIME_TBREFUND = "crontab_order_time_taobao_refund" + KEY_CFG_CRON_TIME_TBPUNISHREFUND = "crontab_order_time_taobao_punish_refund_new" + KEY_CFG_CRON_TIME_JD = "crontab_order_time_jd" + KEY_CFG_CRON_TIME_PDD = "crontab_order_time_pdd" + KEY_CFG_CRON_TIME_TBBYCREATETIME = "crontab_order_time_tb_by_create_time" + KEY_CFG_CRON_TIME_TBBYPAY = "crontab_order_time_tb_by_pay" + KEY_CFG_CRON_TIME_TB12 = "crontab_order_time_tb12" + KEY_CFG_CRON_TIME_TB13 = "crontab_order_time_tb13" + KEY_CFG_CRON_TIME_TB14 = "crontab_order_time_tb14" + KEY_CFG_CRON_TIME_TB3 = "crontab_order_time_tb3" + KEY_CFG_CRON_TIME_TBBYSETTLE = "crontab_order_time_tb_by_settle" + KEY_CFG_CRON_TIME_PDDBYCREATETIME = "crontab_order_time_pdd_by_create_time" + KEY_CFG_CRON_TIME_JDBYCREATETIME = "crontab_order_time_jd_by_create_time" + KEY_CFG_CRON_TIME_JDBYSUCCESS = "crontab_order_time_jd_by_success" + KEY_CFG_CRON_TIME_JDFAILBYCREATETIME = "crontab_order_time_jd_fail_by_create_time" + KEY_CFG_CRON_TIME_PDDBYAGOTIME = "crontab_order_time_pdd_by_ago_time" + KEY_CFG_CRON_TIME_PDDBYSTATUSSUCCESS = "crontab_order_time_pdd_by_status_success" + KEY_CFG_CRON_TIME_PDDBYSTATUSFAIL = "crontab_order_time_pdd_by_status_fail" + KEY_CFG_CRON_TIME_PDDBYSTATUS = "crontab_order_time_pdd_by_status" + KEY_CFG_CRON_TIME_JDBYSTATUS = "crontab_order_time_jd_by_status" + KEY_CFG_CRON_TIME_SN = "crontab_order_time_suning" + KEY_CFG_CRON_TIME_VIP = "crontab_order_time_vip" + KEY_CFG_CRON_TIME_KL = "crontab_order_time_kaola" + KEY_CFG_CRON_TIME_DUOMAI = "crontab_order_time_duomai" + KEY_CFG_CRON_TIME_PUBLISHER = "crontab_taobao_time_publisher" // 跟踪淘宝备案信息绑定会员运营id 针对小程序 + KEY_CFG_CRON_TIME_MEITUAN = "crontab_order_time_meituan" //美团 + KEY_CFG_CRON_TIME_MEITUANLM = "crontab_order_time_meituan_lm" //美团联盟 + KEY_CFG_CRON_TIME_MEITUANLMSTART = "crontab_order_time_meituan_lm_start" //美团联盟 + KEY_CFG_CRON_TIME_MEITUANSTART = "crontab_order_time_meituan_start" //美团联盟 + KEY_CFG_CRON_TIME_STATIONMEITUANLM = "crontab_order_time_station_meituan_lm" //美团联盟 + KEY_CFG_CRON_TIME_OILSTATION = "crontab_order_time_oilstation" //加油 + KEY_CFG_CRON_TIME_BRIGHT_OILSTATION = "crontab_order_time_bright_oilstation" //加油 + KEY_CFG_CRON_TIME_KFC = "crontab_order_time_kfc" //肯德基 + KEY_CFG_CRON_TIME_CINEMA = "crontab_order_time_cinema" //电影票 + KEY_CFG_CRON_TIME_STARBUCKS = "crontab_order_time_starbucks" //海威星巴克 + KEY_CFG_CRON_TIME_MCDONALD = "crontab_order_time_mcdonald" //海威麦当劳 + KEY_CFG_CRON_TIME_NAYUKI = "crontab_order_time_nayuki" //海威奈雪 + KEY_CFG_CRON_TIME_BURGERKING = "crontab_order_time_burger_king" //海威汉堡王 + KEY_CFG_CRON_TIME_HEYTEA = "crontab_order_time_heytea" //海威喜茶 + KEY_CFG_CRON_TIME_HWMOVIE = "crontab_order_time_hw_movie" //海威电影票 + KEY_CFG_CRON_TIME_TIKTOKLIFE = "crontab_order_time_tik_tok_life" //海威电影票 + KEY_CFG_CRON_TIME_PAGODA = "crontab_order_time_pagoda" // + KEY_CFG_CRON_TIME_TO_KFC = "crontab_order_time_to_kfc" // + KEY_CFG_CRON_TIME_LUCKIN = "crontab_order_time_luckin" // + KEY_CFG_CRON_TIME_DIDI_ENERGY = "crontab_order_time_didi_energy" // + KEY_CFG_CRON_TIME_T3_CAR = "crontab_order_time_t3_car" // + KEY_CFG_CRON_TIME_DIDI_ONLINE_CAR = "crontab_order_time_didi_online_car" // + KEY_CFG_CRON_TIME_KING_FLOWER = "crontab_order_time_king_flower" // + KEY_CFG_CRON_TIME_DIDI_FREIGHT = "crontab_order_time_didi_freight" // + KEY_CFG_CRON_TIME_DIDI_CHAUFFEUR = "crontab_order_time_didi_chauffeur" // + KEY_CFG_CRON_USER_RELATE = "cron_user_relate" +) diff --git a/app/md/md_order.go b/app/md/md_order.go new file mode 100644 index 0000000..5ee6618 --- /dev/null +++ b/app/md/md_order.go @@ -0,0 +1,47 @@ +package md + +type OrderTotal struct { + StoreId string `json:"store_id"` + BuyPhone string `json:"buy_phone"` + MealNum string `json:"meal_num"` + Memo string `json:"memo"` + CouponId string `json:"coupon_id"` + IsNow string `json:"is_now"` + Timer string `json:"timer"` + GoodsInfo []GoodsInfo `json:"goods_info"` +} +type GoodsInfo struct { + GoodsId string `json:"goods_id"` + SkuId string `json:"sku_id"` + Num string `json:"num"` +} + +type OneSkuPriceInfo struct { + Num string `json:"num"` + Amount string `json:"amount"` + GoodsId int `json:"goods_id"` +} +type SkuPriceStruct struct { + SkuId int64 `json:"skuId"` + Ratio string `json:"ratio"` + OneSkuPriceInfo OneSkuPriceInfo `json:"oneSkuPriceInfo"` +} + +// 每一种sku价格结构 +type SkuId2priceInfo map[int64]OneSkuPriceInfo + +type SkuId2originPrice map[int64]string +type CouponList struct { + Id string `json:"id"` + Title string `json:"title"` + Timer string `json:"timer"` + Label string `json:"label"` + Img string `json:"img"` + Content string `json:"content"` + IsCanUse string `json:"is_can_use"` + NotUseStr string `json:"not_use_str"` +} +type Sku struct { + Name string `json:"name"` + Value string `json:"value"` +} diff --git a/app/md/pay.go b/app/md/pay.go new file mode 100644 index 0000000..4994c8f --- /dev/null +++ b/app/md/pay.go @@ -0,0 +1,60 @@ +package md + +const ( + CALLBACK_URL = "%s/api/v1/communityTeam/pay/callback?master_id=%s&order_type=%s&pay_method=%s" + RECHARGGE_CALLBACK_URL = "http://%s/api/v1/new_recharge/callback/%s" + + BALANCE_PAY = "balance_pay" + ALIPAY = "alipay" + WX_PAY = "wxpay" + FB_PAY_ALI = "fb_pay_ali" + FB_PAY_WX = "fb_pay_wx" + FB_PAY_WX_SUB = "fb_pay_wx_sub" + FBCALLBACK_URL = "%s/api/v1/pay/fb/callback" +) + +var PayMethod = map[string]string{ + BALANCE_PAY: "余额支付", + ALIPAY: "支付宝支付", + WX_PAY: "微信支付", + FB_PAY_ALI: "乐刷支付宝", + FB_PAY_WX: "乐刷微信", + FB_PAY_WX_SUB: "乐刷微信", +} +var PayMethodIdToName = map[int]string{ + 1: "余额支付", + 2: "支付宝支付", + 3: "微信支付", + 18: "乐刷支付宝", + 19: "乐刷微信", +} +var PayMethodIDs = map[string]int{ + BALANCE_PAY: 1, + ALIPAY: 2, + WX_PAY: 3, + FB_PAY_ALI: 18, + FB_PAY_WX: 19, + FB_PAY_WX_SUB: 19, +} + +const ( + CommunityTeam = "community_team" + PrivilegeCard = "privilege_card" + LianlianPay = "lianlian_pay" + BusinessCollege = "business_college" + UserLevel = "user_level" + PrivilegeOpenCard = "privilege_open_card" + BusinessCollegeSub = "business_college_sub" + UserLevelSub = "user_level_sub" + PrivilegeOpenCardSub = "privilege_open_card_sub" + AggregationRecharge = "aggregation_recharge" + Swipe = "swipe" +) + +var NeedPayPart = map[string]string{ + PrivilegeCard: "权益卡", + BusinessCollege: "商学院", + UserLevel: "会员VIP升级", + PrivilegeOpenCard: "权益卡开卡", + AggregationRecharge: "聚合充值", +} diff --git a/app/md/platform.go b/app/md/platform.go new file mode 100644 index 0000000..b479ab5 --- /dev/null +++ b/app/md/platform.go @@ -0,0 +1,40 @@ +package md + +const ( + /*********** DEVICE ***********/ + PLATFORM_WX_APPLET = "wx_applet" // 小程序 + PLATFORM_TOUTIAO_APPLET = "toutiao_applet" + PLATFORM_TIKTOK_APPLET = "tiktok_applet" + PLATFORM_BAIDU_APPLET = "baidu_applet" + PLATFORM_ALIPAY_APPLET = "alipay_applet" + PLATFORM_WAP = "wap" //h5 + PLATFORM_ANDROID = "android" + PLATFORM_IOS = "ios" + PLATFORM_PC = "pc" + PLATFORM_JSAPI = "jsapi" // 公众号 +) + +const WX_PAY_BROWSER = "wx_pay_browser" // 用于判断显示支付方式 + +var PlatformList = map[string]struct{}{ + PLATFORM_WX_APPLET: {}, + PLATFORM_TOUTIAO_APPLET: {}, + PLATFORM_TIKTOK_APPLET: {}, + PLATFORM_BAIDU_APPLET: {}, + PLATFORM_ALIPAY_APPLET: {}, + PLATFORM_WAP: {}, + PLATFORM_ANDROID: {}, + PLATFORM_IOS: {}, + PLATFORM_PC: {}, +} + +var PlatformMap = map[string]string{ + "android": "2", + "ios": "2", + "wap": "4", // 和小程序公用模板 + "wx_applet": "4", //微信小程序 + "tiktok_applet": "4", + "baidu_applet": "4", + "alipay_applet": "4", + "toutiao_applet": "4", +} diff --git a/app/md/user_info.go b/app/md/user_info.go new file mode 100644 index 0000000..f6c5648 --- /dev/null +++ b/app/md/user_info.go @@ -0,0 +1,43 @@ +package md + +import ( + "applet/app/db/model" + "applet/app/lib/arkid" +) + +type UserInfoResponse struct { + Avatar string `json:"avatar"` + NickName string `json:"nickname"` + Gender string `json:"gender"` + Birthday string `json:"birthday"` + RegisterTime string `json:"register_time"` + FileBucketURL string `json:"file_bucket_url"` + FileFormat string `json:"file_format"` + IsNoChange string `json:"is_no_change"` + IsUpLoadWx string `json:"is_upload_wx"` + IsShowDelUserBtn string `json:"is_show_del_user_btn"` + IsShowQq string `json:"is_show_qq"` + IsShowSalePhone string `json:"is_show_sale_phone"` + IsShowWallet string `json:"is_show_wallet"` + IsShowBankCard string `json:"is_show_bank_card"` + Qq string `json:"qq"` + SalePhone string `json:"sale_phone"` + LevelName string `json:"level_name"` + Phone string `json:"phone"` +} + +type User struct { + Ark *arkid.ArkIDUser + Info *model.User + Profile *model.UserProfile + Level *model.UserLevel + Tags []string +} + +type UserRelation struct { + Uid int + CurUid int + Diff int // 与当前用户级别差 + Level int // 用户当前等级 + OldDiff int // 旧的级别 +} diff --git a/app/md/wxpay.go b/app/md/wxpay.go new file mode 100644 index 0000000..88a9f8d --- /dev/null +++ b/app/md/wxpay.go @@ -0,0 +1,30 @@ +package md + +type WxPayParams struct { + Subject string `json:"subject" binding:"required"` + Amount string `json:"amount" binding:"required"` + OrderType string `json:"order_type" binding:"required"` + OrdId string `json:"ord_id"` +} + +type WxPayCallback struct { + AppId string `json:"appid"` + BankType string `json:"bank_type"` + CashFee string `json:"cash_fee"` + FeeType string `json:"fee_type"` + IsSubscribe string `json:"is_subscribe"` + MasterID string `json:"master_id"` + MchID string `json:"mch_id"` + NonceStr string `json:"nonce_str"` + Openid string `json:"openid"` + OrderType string `json:"order_type"` + OutTradeNo string `json:"out_trade_no"` + PayMethod string `json:"pay_method"` + ResultCode string `json:"result_code"` + ReturnCode string `json:"return_code"` + Sign string `json:"sign"` + TimeEnd string `json:"time_end"` + TotalFee string `json:"total_fee"` + TradeType string `json:"trade_type"` + TransactionID string `json:"transaction_id"` +} diff --git a/app/mw/mw_access_log.go b/app/mw/mw_access_log.go new file mode 100644 index 0000000..84f6b52 --- /dev/null +++ b/app/mw/mw_access_log.go @@ -0,0 +1,31 @@ +package mw + +import ( + "time" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" + + "applet/app/utils/logx" +) + +// access log +func AccessLog(c *gin.Context) { + start := time.Now() + c.Next() + cost := time.Since(start) + + logx.Info(c.Request.URL.Path) + + logger := &zap.Logger{} + logger.Info(c.Request.URL.Path, + zap.Int("status", c.Writer.Status()), + zap.String("method", c.Request.Method), + zap.String("path", c.Request.URL.Path), + zap.String("query", c.Request.URL.RawQuery), + zap.String("ip", c.ClientIP()), + zap.String("user-agent", c.Request.UserAgent()), + zap.String("errors", c.Errors.ByType(gin.ErrorTypePrivate).String()), + zap.Duration("cost", cost), + ) +} diff --git a/app/mw/mw_auth.go b/app/mw/mw_auth.go new file mode 100644 index 0000000..645dbe3 --- /dev/null +++ b/app/mw/mw_auth.go @@ -0,0 +1,72 @@ +package mw + +import ( + "errors" + + "applet/app/db" + "applet/app/e" + "applet/app/lib/arkid" + "applet/app/md" + "applet/app/utils" + + "github.com/gin-gonic/gin" +) + +// 检查权限, 签名等等 +func Auth(c *gin.Context) { + + for k, v := range c.Request.Header { + c.Set(k, v[0]) + } + token, ok := c.Get("Token") + if !ok { + e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("没有找到token")) + return + } + if token == "" { + e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("token 不能为空")) + return + } + tokenStr := utils.AnyToString(token) + arkIdSdk := arkid.NewArkID() + var err error + signUser := &md.User{} + arkIdUser := new(arkid.ArkIDUser) + if err = arkIdSdk.SelectFunction("arkid_user_info"). + WithArgs(arkid.RequestBody{Token: tokenStr}). + Result(arkIdUser); err != nil { + e.OutErr(c, e.ERR_TOKEN_AUTH, err) //token 不存在 + return + } + if arkIdUser.Username == "" { + e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("Token error")) + return + } + if err = arkIdSdk.SelectFunction("arkid_login"). + WithArgs(arkid.RequestBody{Username: arkIdUser.Username, Password: utils.Md5(arkIdUser.Username)}). + Result(arkIdUser); err != nil { + e.OutErr(c, e.ERR_TOKEN_AUTH, err) + return + } + signUser.Ark = arkIdUser + if signUser.Ark == nil { + e.OutErr(c, e.ERR_TOKEN_AUTH, errors.New("无效token")) + return + } + signUser.Info, err = db.UserFindByArkidUserName(db.DBs[c.GetString("mid")], arkIdUser.Username) + if err != nil { + e.OutErr(c, e.ERR_TOKEN_AUTH, err) + return + } + if signUser.Info == nil { + e.OutErr(c, e.ERR_TOKEN_AUTH, errors.New("无效token")) + return + } + signUser.Profile, err = db.UserProfileFindByArkID(db.DBs[c.GetString("mid")], utils.IntToStr(arkIdUser.UserID)) + if err != nil { + e.OutErr(c, e.ERR_TOKEN_AUTH, err) + return + } + c.Set("user", signUser) + c.Next() +} diff --git a/app/mw/mw_auth_jwt.go b/app/mw/mw_auth_jwt.go new file mode 100644 index 0000000..cd4875b --- /dev/null +++ b/app/mw/mw_auth_jwt.go @@ -0,0 +1,122 @@ +package mw + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "applet/app/lib/auth" + "applet/app/md" + "applet/app/svc" + "applet/app/utils" + "applet/app/utils/cache" + "applet/app/utils/logx" + "errors" + "fmt" + "strings" + + "github.com/gin-gonic/gin" +) + +// AuthJWT is jwt middleware +func AuthJWT(c *gin.Context) { + authHeader := c.Request.Header.Get("Authorization") + if authHeader == "" { + e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("token 不能为空")) + return + } + + // 按空格分割 + parts := strings.SplitN(authHeader, " ", 2) + if !(len(parts) == 2 && parts[0] == "Bearer") { + e.OutErr(c, e.ERR_TOKEN_FORMAT, errors.New("token 格式不对")) + return + } + + // parts[1]是token + mc, err := utils.ParseToken(parts[1]) + if err != nil { + e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("token 过期或无效")) + return + } + + // 获取user + u, err := db.UserFindByID(db.DBs[c.GetString("mid")], mc.UID) + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err) + return + } + if u == nil { + e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("token 过期或无效")) + return + } + + // 检验账号是否未激活或被冻结 + switch u.State { + case 0: + e.OutErr(c, e.ERR_USER_NO_ACTIVE) + return + case 2: + if c.GetString("mid") == "31585332" { + utils.FilePutContents("ERR_USER_IS_BAN", utils.SerializeStr(map[string]interface{}{ + "token": parts[1], + "mc": mc, + "user": u, + })) + } + e.OutErr(c, e.ERR_USER_IS_BAN) + return + } + + // 校验是否和缓存的token一致,只能有一个token 是真实有效 + key := fmt.Sprintf("%s:token:%s", c.GetString("mid"), u.Username) + cjwt, err := cache.GetString(key) + fmt.Println("====================token", u.Username, key, cjwt, parts[1]) + if err != nil { + fmt.Println("====================token", err) + logx.Warn(err) + NOCACHE(c, parts, mc, u, false) + return + } + if parts[1] != cjwt { + e.OutErr(c, e.ERR_TOKEN_AUTH, errors.New("token expired")) + return + } + NOCACHE(c, parts, mc, u, true) +} + +func NOCACHE(c *gin.Context, parts []string, mc *auth.JWTUser, u *model.User, isTrue bool) { + // 获取user profile + up, err := db.UserProfileFindByID(db.DBs[c.GetString("mid")], mc.UID) + if err != nil || up == nil { + e.OutErr(c, e.ERR_DB_ORM, err) + return + } + if parts[1] != up.ArkidToken && isTrue == false || up.ArkidToken == "" { + e.OutErr(c, e.ERR_TOKEN_AUTH, errors.New("token expired")) + return + } + if parts[1] != up.ArkidToken && isTrue { + up.ArkidToken = parts[1] + db.UserProfileUpdate(svc.MasterDb(c), up.Uid, up, "arkid_token") + } + if up.AvatarUrl == "" { + up.AvatarUrl = c.GetString("appUserDefaultAvatar") + } + // 获取user 等级 + ul, err := db.UserLevelByID(db.DBs[c.GetString("mid")], u.Level) + if err != nil { + e.OutErr(c, e.ERR_DB_ORM, err) + return + } + + user := &md.User{ + Info: u, + Profile: up, + Level: ul, + } + + // 将当前请求的username信息保存到请求的上下文c上 + c.Set("user", user) + c.Next() // 后续的处理函数可以用过c.Get("user")来获取当前请求的用户信息 + +} diff --git a/app/mw/mw_breaker.go b/app/mw/mw_breaker.go new file mode 100644 index 0000000..fefc078 --- /dev/null +++ b/app/mw/mw_breaker.go @@ -0,0 +1,30 @@ +package mw + +import ( + "errors" + "net/http" + "strconv" + + "github.com/afex/hystrix-go/hystrix" + "github.com/gin-gonic/gin" +) + +// 熔断器, 此组件需要在gin.Recovery中间之前进行调用, 否则可能会导致panic时候, 无法recovery, 正确顺序如下 +//r.Use(BreakerWrapper) +//r.Use(gin.Recovery()) +func Breaker(c *gin.Context) { + name := c.Request.Method + "-" + c.Request.RequestURI + hystrix.Do(name, func() error { + c.Next() + statusCode := c.Writer.Status() + if statusCode >= http.StatusInternalServerError { + return errors.New("status code " + strconv.Itoa(statusCode)) + } + return nil + }, func(e error) error { + if e == hystrix.ErrCircuitOpen { + c.String(http.StatusAccepted, "请稍后重试") //todo 修改报错方法 + } + return e + }) +} diff --git a/app/mw/mw_change_header.go b/app/mw/mw_change_header.go new file mode 100644 index 0000000..c10bdb9 --- /dev/null +++ b/app/mw/mw_change_header.go @@ -0,0 +1,18 @@ +package mw + +import ( + "github.com/gin-gonic/gin" +) + +// 修改传过来的头部字段 +func ChangeHeader(c *gin.Context) { + appvserison := c.GetHeader("AppVersionName") + if appvserison == "" { + appvserison = c.GetHeader("app_version_name") + } + if appvserison != "" { + c.Request.Header.Add("app_version_name", appvserison) + } + + c.Next() +} diff --git a/app/mw/mw_check_sign.go b/app/mw/mw_check_sign.go new file mode 100644 index 0000000..599c512 --- /dev/null +++ b/app/mw/mw_check_sign.go @@ -0,0 +1,37 @@ +package mw + +import ( + "applet/app/e" + "applet/app/utils" + "bytes" + "errors" + "fmt" + "github.com/gin-gonic/gin" + "io/ioutil" +) + +// CheckSign is 中间件 用来检查签名 +func CheckSign(c *gin.Context) { + if utils.SignCheck(c) == false { + e.OutErr(c, 400, errors.New("请求失败~~")) + return + } + c.Next() +} + +func CheckBody(c *gin.Context) { + c.Set("api_version", "1") + if utils.GetApiVersion(c) > 0 { + body, _ := ioutil.ReadAll(c.Request.Body) + fmt.Println("check_", c.GetString("mid"), string(body)) + if string(body) != "" { + str := utils.ResultAesDecrypt(c, string(body)) + fmt.Println("check_de", c.GetString("mid"), str) + if str != "" { + c.Set("body_str", str) + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer([]byte(str))) + } + } + } + c.Next() +} diff --git a/app/mw/mw_checker.go b/app/mw/mw_checker.go new file mode 100644 index 0000000..44ee434 --- /dev/null +++ b/app/mw/mw_checker.go @@ -0,0 +1,22 @@ +package mw + +import ( + "strings" + + "github.com/gin-gonic/gin" + + "applet/app/e" + "applet/app/md" +) + +// 检查设备等, 把头部信息下放到hdl可以获取 +func Checker(c *gin.Context) { + // 校验平台支持 + platform := strings.ToLower(c.GetHeader("Platform")) + //fmt.Println(platform) + if _, ok := md.PlatformList[platform]; !ok { + e.OutErr(c, e.ERR_PLATFORM) + return + } + c.Next() +} diff --git a/app/mw/mw_cors.go b/app/mw/mw_cors.go new file mode 100644 index 0000000..3433553 --- /dev/null +++ b/app/mw/mw_cors.go @@ -0,0 +1,29 @@ +package mw + +import ( + "github.com/gin-gonic/gin" +) + +// cors跨域 +func Cors(c *gin.Context) { + // 放行所有OPTIONS方法 + if c.Request.Method == "OPTIONS" { + c.AbortWithStatus(204) + return + } + + origin := c.Request.Header.Get("Origin") // 请求头部 + if origin != "" { + c.Header("Access-Control-Allow-Origin", origin) // 这是允许访问来源域 + c.Header("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE,UPDATE") // 服务器支持的所有跨域请求的方法,为了避免浏览次请求的多次'预检'请求 + // header的类型 + c.Header("Access-Control-Allow-Headers", "Authorization,Content-Length,X-CSRF-Token,Token,session,X_Requested_With,Accept,Origin,Host,Connection,Accept-Encoding,Accept-Language,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Pragma,X-Mx-ReqToken") + // 允许跨域设置,可以返回其他子段 + // 跨域关键设置 让浏览器可以解析 + c.Header("Access-Control-Expose-Headers", "Content-Length,Access-Control-Allow-Origin,Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar") + c.Header("Access-Control-Max-Age", "172800") // 缓存请求信息 单位为秒 + c.Header("Access-Control-Allow-Credentials", "false") // 跨域请求是否需要带cookie信息 默认设置为true + c.Set("Content-Type", "Application/json") // 设置返回格式是json + } + c.Next() +} diff --git a/app/mw/mw_csrf.go b/app/mw/mw_csrf.go new file mode 100644 index 0000000..b15619b --- /dev/null +++ b/app/mw/mw_csrf.go @@ -0,0 +1,136 @@ +package mw + +import ( + "crypto/sha1" + "encoding/base64" + "errors" + "io" + + "github.com/dchest/uniuri" + "github.com/gin-contrib/sessions" + "github.com/gin-gonic/gin" +) + +// csrf,xsrf检查 +const ( + csrfSecret = "csrfSecret" + csrfSalt = "csrfSalt" + csrfToken = "csrfToken" +) + +var defaultIgnoreMethods = []string{"GET", "HEAD", "OPTIONS"} + +var defaultErrorFunc = func(c *gin.Context) { + panic(errors.New("CSRF token mismatch")) +} + +var defaultTokenGetter = func(c *gin.Context) string { + r := c.Request + + if t := r.FormValue("_csrf"); len(t) > 0 { + return t + } else if t := r.URL.Query().Get("_csrf"); len(t) > 0 { + return t + } else if t := r.Header.Get("X-CSRF-TOKEN"); len(t) > 0 { + return t + } else if t := r.Header.Get("X-XSRF-TOKEN"); len(t) > 0 { + return t + } + + return "" +} + +// Options stores configurations for a CSRF middleware. +type Options struct { + Secret string + IgnoreMethods []string + ErrorFunc gin.HandlerFunc + TokenGetter func(c *gin.Context) string +} + +func tokenize(secret, salt string) string { + h := sha1.New() + io.WriteString(h, salt+"-"+secret) + hash := base64.URLEncoding.EncodeToString(h.Sum(nil)) + + return hash +} + +func inArray(arr []string, value string) bool { + inarr := false + + for _, v := range arr { + if v == value { + inarr = true + break + } + } + + return inarr +} + +// Middleware validates CSRF token. +func Middleware(options Options) gin.HandlerFunc { + ignoreMethods := options.IgnoreMethods + errorFunc := options.ErrorFunc + tokenGetter := options.TokenGetter + + if ignoreMethods == nil { + ignoreMethods = defaultIgnoreMethods + } + + if errorFunc == nil { + errorFunc = defaultErrorFunc + } + + if tokenGetter == nil { + tokenGetter = defaultTokenGetter + } + + return func(c *gin.Context) { + session := sessions.Default(c) + c.Set(csrfSecret, options.Secret) + + if inArray(ignoreMethods, c.Request.Method) { + c.Next() + return + } + + salt, ok := session.Get(csrfSalt).(string) + + if !ok || len(salt) == 0 { + errorFunc(c) + return + } + + token := tokenGetter(c) + + if tokenize(options.Secret, salt) != token { + errorFunc(c) + return + } + + c.Next() + } +} + +// GetToken returns a CSRF token. +func GetToken(c *gin.Context) string { + session := sessions.Default(c) + secret := c.MustGet(csrfSecret).(string) + + if t, ok := c.Get(csrfToken); ok { + return t.(string) + } + + salt, ok := session.Get(csrfSalt).(string) + if !ok { + salt = uniuri.New() + session.Set(csrfSalt, salt) + session.Save() + } + token := tokenize(secret, salt) + c.Set(csrfToken, token) + + return token +} diff --git a/app/mw/mw_db.go b/app/mw/mw_db.go new file mode 100644 index 0000000..6e2d41f --- /dev/null +++ b/app/mw/mw_db.go @@ -0,0 +1,149 @@ +package mw + +import ( + "applet/app/svc" + "applet/app/utils" + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/mw" + "errors" + "fmt" + "github.com/gin-gonic/gin" + "strings" + + "applet/app/db" + "applet/app/e" + "applet/app/md" +) + +// DB is 中间件 用来检查master_id是否有对应的数据库engine +func DB(c *gin.Context) { + fmt.Println(c.Request.Header) + masterID := mw.GetMasterId(db.Db, c) + _, ok := db.DBs[masterID] + if !ok { + e.OutErr(c, e.ERR_MASTER_ID, errors.New("not found master_id in DBs")) + return + } + + fmt.Println("master_id", masterID) + c.Set("mid", masterID) + //判断应用是不是过期了 + isOverTime := svc.SysCfgGet(c, "is_over_time") + if isOverTime == "1" { + str := "应用已过期" + overTimeStr := svc.SysCfgGet(c, "over_time_str") + if overTimeStr != "" { + str = overTimeStr + } + e.OutErr(c, 400, e.NewErr(400, str)) + return + } + closeStation := svc.SysCfgGet(c, "close_station") + closeAppVersion := svc.SysCfgGet(c, "close_app_version") + platform := c.GetHeader("Platform") + if strings.Contains(closeStation, platform) && closeStation != "" && utils.StrToInt64(c.GetHeader("app_version")) <= utils.StrToInt64(closeAppVersion) { + str := "应用关闭" + overTimeStr := svc.SysCfgGet(c, "over_time_str") + if overTimeStr != "" { + str = overTimeStr + } + e.OutErr(c, 400, e.NewErr(400, str)) + return + } + //判断是否有独立域名 + domainWapBase := svc.GetWebSiteDomainInfo(c, "wap") + + httpStr := "http://" + if c.GetHeader("Platform") == md.PLATFORM_WX_APPLET || c.GetHeader("Platform") == md.PLATFORM_ALIPAY_APPLET || c.GetHeader("Platform") == md.PLATFORM_BAIDU_APPLET || c.GetHeader("Platform") == md.PLATFORM_TOUTIAO_APPLET || c.GetHeader("Platform") == md.PLATFORM_TIKTOK_APPLET { + httpStr = "https://" + domainWapBase = strings.Replace(domainWapBase, "http://", httpStr, 1) + } + c.Set("domain_wap_base", domainWapBase) + c.Set("domain_wap_base_new", svc.GetWebSiteLiveBroadcastDomainInfo(c, "wap", masterID)) + c.Set("domain_wap_base_second", svc.GetWebSiteDomainInfoSecond(c, "wap")) + + c.Set("http_host", httpStr) + + c.Set("h5_api_secret_key", svc.SysCfgGet(c, "h5_api_secret_key")) + c.Set("app_api_secret_key", svc.SysCfgGet(c, "app_api_secret_key")) + c.Set("applet_api_secret_key", svc.SysCfgGet(c, "applet_api_secret_key")) + c.Set("integral_prec", svc.SysCfgGet(c, "integral_prec")) + fanOrderCommissionPrec := svc.SysCfgGet(c, "fan_order_commission_prec") + if fanOrderCommissionPrec == "" { + fanOrderCommissionPrec = "2" + } + c.Set("fan_order_commission_prec", fanOrderCommissionPrec) + areaOrderCommissionPrec := svc.SysCfgGet(c, "area_order_commission_prec") + if areaOrderCommissionPrec == "" { + areaOrderCommissionPrec = "2" + } + c.Set("area_order_commission_prec", areaOrderCommissionPrec) + + commissionPrec := svc.SysCfgGet(c, "commission_prec") + c.Set("commission_prec", commissionPrec) + pricePrec := svc.SysCfgGet(c, "price_prec") + if pricePrec == "" { + pricePrec = commissionPrec + } + dsChcek := svc.SysCfgGet(c, "ds_check") + if dsChcek == "1" { + pricePrec = commissionPrec + } + c.Set("price_prec", pricePrec) + c.Set("is_show_point", svc.SysCfgGet(c, "is_show_point")) + c.Set("appUserDefaultAvatar", svc.SysCfgGet(c, "app_user_default_avatar")) + + translateOpen := "" + if strings.Contains(c.GetHeader("locale"), "zh_Hant_") { + translateOpen = "zh_Hant_" + } + if strings.Contains(c.GetHeader("locale"), "ug_CN") { + translateOpen = "ug_CN" + } + c.Set("translate_open", translateOpen) + orderVirtualCoinType := db.SysCfgGet(c, "order_virtual_coin_type") + c.Set("order_virtual_coin_type", orderVirtualCoinType) + orderVirtualCoinName := db.SysCfgGet(c, "order_virtual_coin_name") + if orderVirtualCoinName == "" { + orderVirtualCoinName = "收益:¥" + } + c.Set("orderVirtualCoinName", orderVirtualCoinName) + h5AppletMustSign := svc.SysCfgGet(c, "h5_applet_must_sign") + c.Set("h5_applet_must_sign", h5AppletMustSign) + androidMustSign := svc.SysCfgGet(c, "android_must_sign") + c.Set("android_must_sign", androidMustSign) + iosMustSign := svc.SysCfgGet(c, "ios_must_sign") + c.Set("ios_must_sign", iosMustSign) + c.Set("is_not_change_url", "0") + smsType := svc.SysCfgGet(c, "sms_type") + c.Set("sms_type", smsType) + if utils.StrToInt64(c.GetHeader("app_version")) > 1678445020 { + // || utils.StrToInt64(c.GetHeader("BuildVersion")) > 1678676004 + c.Set("is_not_change_url", "1") + } + if utils.InArr(c.GetHeader("platform"), []string{md.PLATFORM_ANDROID, md.PLATFORM_IOS}) == false { + c.Set("is_not_change_url", "1") + } + GetHeaderParam(c) + c.Next() +} + +func GetHeaderParam(c *gin.Context) { + var appTypeList = []string{"app_type", "App_type", "AppType"} + appType := "" + for _, v := range appTypeList { + val := c.GetHeader(v) + if val != "" { + appType = val + } + } + c.Set("app_type", appType) + var storeIdList = []string{"store_id", "Store_id", "StoreId"} + storeId := "" + for _, v := range storeIdList { + val := c.GetHeader(v) + if val != "" { + storeId = val + } + } + c.Set("store_id", storeId) +} diff --git a/app/mw/mw_limiter.go b/app/mw/mw_limiter.go new file mode 100644 index 0000000..3c9fb79 --- /dev/null +++ b/app/mw/mw_limiter.go @@ -0,0 +1,77 @@ +package mw + +import ( + "applet/app/e" + "applet/app/md" + "applet/app/svc" + "applet/app/utils" + "applet/app/utils/cache" + "bytes" + "fmt" + "github.com/gin-gonic/gin" + "io/ioutil" +) + +func Limiter(c *gin.Context) { + limit := 200 // 限流次数 + ttl := 2 // 限流过期时间 + ip := c.ClientIP() + // 读取token或者ip + token := c.GetHeader("Authorization") + mid := c.GetString("mid") + // 判断是否已经超出限额次数 + method := c.Request.Method + host := c.Request.Host + uri := c.Request.URL.String() + + buf := make([]byte, 5120*10) + num, _ := c.Request.Body.Read(buf) + body := buf[:num] + // Write body back + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body)) + //queryValue := utils.SerializeStr(c.Request.URL.Query()) //不建议开启,失去限流的意义 + + //TODO::分布式锁阻拦(保证原子性) + requestIdPrefix := fmt.Sprintf(md.DealAppLimiterRequestIdPrefix, mid, ip) + cb, err := svc.HandleLimiterDistributedLock(mid, ip, requestIdPrefix) + if err != nil { + e.OutErr(c, e.ERR, err.Error()) + return + } + if cb != nil { + defer cb() // 释放锁 + } + + Md5 := utils.Md5(ip + token + method + host + uri + string(body)) + //Md5 := utils.Md5(ip + token + method + host + uri + string(body) + queryValue) + if cache.Exists(Md5) { + c.AbortWithStatusJSON(428, gin.H{ + "code": 428, + "msg": "don't repeat the request", + "data": struct{}{}, + }) + return + } + + // 2s后没返回自动释放 + go cache.SetEx(Md5, "0", ttl) + + key := "NEW_LIMITER_APP_COMM_" + ip + reqs, _ := cache.GetInt(key) + if reqs >= limit { + c.AbortWithStatusJSON(429, gin.H{ + "code": 429, + "msg": "too many requests", + "data": struct{}{}, + }) + return + } + if reqs > 0 { + //go cache.Incr(key) + go cache.SetEx(key, reqs+1, ttl) + } else { + go cache.SetEx(key, 1, ttl) + } + c.Next() + go cache.Del(Md5) +} diff --git a/app/mw/mw_limiter_newcomers.go b/app/mw/mw_limiter_newcomers.go new file mode 100644 index 0000000..7cf7d2b --- /dev/null +++ b/app/mw/mw_limiter_newcomers.go @@ -0,0 +1,77 @@ +package mw + +import ( + "applet/app/e" + "applet/app/md" + "applet/app/svc" + "applet/app/utils" + "applet/app/utils/cache" + "bytes" + "fmt" + "github.com/gin-gonic/gin" + "io/ioutil" +) + +func LimiterNewComers(c *gin.Context) { + limit := 200 // 限流次数 + ttl := 2 // 限流过期时间 + ip := c.ClientIP() + // 读取token或者ip + token := c.GetHeader("Authorization") + mid := c.GetString("mid") + // 判断是否已经超出限额次数 + method := c.Request.Method + host := c.Request.Host + uri := c.Request.URL.String() + + buf := make([]byte, 5120*10) + num, _ := c.Request.Body.Read(buf) + body := buf[:num] + // Write body back + c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body)) + //queryValue := utils.SerializeStr(c.Request.URL.Query()) //不建议开启,失去限流的意义 + + //TODO::分布式锁阻拦(保证原子性) + requestIdPrefix := fmt.Sprintf(md.DealAppNewcomersLimiterRequestIdPrefix, mid, ip) + cb, err := svc.HandleLimiterDistributedLock(mid, ip, requestIdPrefix) + if err != nil { + e.OutErr(c, e.ERR, err.Error()) + return + } + if cb != nil { + defer cb() // 释放锁 + } + + Md5 := utils.Md5(ip + token + method + host + uri + string(body)) + //Md5 := utils.Md5(ip + token + method + host + uri + string(body) + queryValue) + if cache.Exists(Md5) { + c.AbortWithStatusJSON(428, gin.H{ + "code": 428, + "msg": "请求频繁", + "data": struct{}{}, + }) + return + } + + // 2s后没返回自动释放 + go cache.SetEx(Md5, "0", ttl) + + key := "NEW_LIMITER_APP_NEWCOMERS_COMM_" + ip + reqs, _ := cache.GetInt(key) + if reqs >= limit { + c.AbortWithStatusJSON(429, gin.H{ + "code": 429, + "msg": "请求频繁", + "data": struct{}{}, + }) + return + } + if reqs > 0 { + //go cache.Incr(key) + go cache.SetEx(key, reqs+1, ttl) + } else { + go cache.SetEx(key, 1, ttl) + } + c.Next() + go cache.Del(Md5) +} diff --git a/app/mw/mw_recovery.go b/app/mw/mw_recovery.go new file mode 100644 index 0000000..b32cc82 --- /dev/null +++ b/app/mw/mw_recovery.go @@ -0,0 +1,57 @@ +package mw + +import ( + "net" + "net/http" + "net/http/httputil" + "os" + "runtime/debug" + "strings" + + "github.com/gin-gonic/gin" + "go.uber.org/zap" +) + +func Recovery(logger *zap.Logger, stack bool) gin.HandlerFunc { + return func(c *gin.Context) { + defer func() { + if err := recover(); err != nil { + var brokenPipe bool + if ne, ok := err.(*net.OpError); ok { + if se, ok := ne.Err.(*os.SyscallError); ok { + if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") { + brokenPipe = true + } + } + } + + httpRequest, _ := httputil.DumpRequest(c.Request, false) + if brokenPipe { + logger.Error(c.Request.URL.Path, + zap.Any("error", err), + zap.String("request", string(httpRequest)), + ) + // If the connection is dead, we can't write a status to it. + c.Error(err.(error)) + c.Abort() + return + } + + if stack { + logger.Error("[Recovery from panic]", + zap.Any("error", err), + zap.String("request", string(httpRequest)), + zap.String("stack", string(debug.Stack())), + ) + } else { + logger.Error("[Recovery from panic]", + zap.Any("error", err), + zap.String("request", string(httpRequest)), + ) + } + c.AbortWithStatus(http.StatusInternalServerError) + } + }() + c.Next() + } +} diff --git a/app/router/router.go b/app/router/router.go new file mode 100644 index 0000000..94edf78 --- /dev/null +++ b/app/router/router.go @@ -0,0 +1,72 @@ +package router + +import ( + "applet/app/cfg" + "applet/app/hdl" + "applet/app/mw" + _ "applet/docs" + "github.com/gin-gonic/gin" +) + +// 初始化路由 +// 1 +func Init() *gin.Engine { + // debug, release, test 项目阶段 + mode := "release" + if cfg.Debug { + mode = "debug" + } + gin.SetMode(mode) + //创建一个新的启动器 + r := gin.New() + r.Use(mw.ChangeHeader) + + // 是否打印访问日志, 在非正式环境都打印 + if mode != "release" { + r.Use(gin.Logger()) + } + r.Use(gin.Recovery()) + + r.GET("/favicon.ico", func(c *gin.Context) { + c.Status(204) + }) + r.NoRoute(func(c *gin.Context) { + c.JSON(404, gin.H{"code": 404, "msg": "page not found", "data": []struct{}{}}) + }) + r.NoMethod(func(c *gin.Context) { + c.JSON(405, gin.H{"code": 405, "msg": "method not allowed", "data": []struct{}{}}) + }) + r.Use(mw.Cors) + routeCommunityTeam(r.Group("/api/v1/communityTeam")) + return r +} +func routeCommunityTeam(r *gin.RouterGroup) { + r.Use(mw.DB) // 下面接口再根据mid 获取数据库名 + r.Use(mw.CheckBody) //body参数转换 + r.Use(mw.CheckSign) //签名校验 + r.Use(mw.Checker) + r.GET("/cate", hdl.Cate) + r.GET("/bank/store/cate", hdl.BankStoreCate) + r.POST("/bank/store/list", hdl.BankStore) + r.POST("/store", hdl.Store) + // 用户授权后调用的接口 + r.Use(mw.AuthJWT) + r.POST("/store/addLike", hdl.StoreAddLike) + r.POST("/store/cancelLike", hdl.StoreCancelLike) + r.POST("/goods", hdl.Goods) + r.POST("/goods/sku", hdl.GoodsSku) + r.POST("/goods/coupon", hdl.GoodsCoupon) + r.POST("/order/total", hdl.OrderTotal) + r.POST("/order/create", hdl.OrderCreate) + r.POST("/order/cancel", hdl.OrderCancel) + r.POST("/order/coupon", hdl.OrderCoupon) + r.POST("/order/list", hdl.OrderList) + r.POST("/order/detail", hdl.OrderDetail) + r.GET("/order/cate", hdl.OrderCate) + r.POST("/pay/:payMethod/:orderType", hdl.Pay) + + r.POST("/store/order/list", hdl.StoreOrderList) + r.POST("/store/order/detail", hdl.StoreOrderDetail) + r.POST("/store/order/confirm", hdl.StoreOrderConfirm) + r.GET("/store/order/cate", hdl.StoreOrderCate) +} diff --git a/app/svc/svc_alipay.go b/app/svc/svc_alipay.go new file mode 100644 index 0000000..b2b384f --- /dev/null +++ b/app/svc/svc_alipay.go @@ -0,0 +1,106 @@ +package svc + +import ( + "applet/app/cfg" + "applet/app/db" + "applet/app/e" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/logx" + "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay" + "fmt" + "github.com/gin-gonic/gin" + "github.com/iGoogle-ink/gopay/alipay" +) + +// 支付宝回调处理 +func AlipayCallback(c *gin.Context) (string, error) { + data, ok := c.Get("callback") + if data == nil || !ok { + return "", e.NewErrCode(e.ERR_INVALID_ARGS) + } + args := data.(*md.AliPayCallback) + _, ok = db.DBs[args.MasterID] + if !ok { + return "", logx.Warn("Alipay Failed : master_id not found") + } + c.Set("mid", args.MasterID) + // 回调交易状态失败 + if args.TradeStatus != "TRADE_SUCCESS" { + return "", logx.Warn("Alipay Failed : trade status failed") + } + return args.OutTradeNo, nil +} + +func PrepareAlipayCode(c *gin.Context, p *md.AliPayPayParams) (interface{}, error) { + req, err := CommAlipayConfig(c, p) + if err != nil { + return "", err + } + var param interface{} + switch req["platform"] { + case md.PLATFORM_ALIPAY_APPLET: + param, err = pay.AlipayApplet(req) + case md.PLATFORM_WAP: + param, err = pay.AlipayWap(req) + case md.PLATFORM_ANDROID, md.PLATFORM_IOS: + param, err = pay.AlipayApp(req) + default: + return "", e.NewErrCode(e.ERR_PLATFORM) + } + if err != nil { + fmt.Println("支付宝错误日志") + fmt.Println(param) + fmt.Println(err) + return "", e.NewErrCode(e.ERR_ALIPAY_ORDER_ERR) + } + return utils.AnyToString(param), nil + +} + +func CommAlipayConfig(c *gin.Context, p *md.AliPayPayParams) (map[string]string, error) { + //获取支付配置 + req := map[string]string{ + "pay_ali_use_type": SysCfgGet(c, "pay_ali_use_type"), + "private_key": SysCfgGet(c, "pay_ali_private_key"), + "app_id": SysCfgGet(c, "pay_ali_app_id"), + "rsa": SysCfgGet(c, "pay_ali_key_len_type"), + "pkcs": SysCfgGet(c, "pay_ali_key_format_type"), + } + if req["pay_ali_use_type"] == "1" { + req["private_key"] = SysCfgGet(c, "pay_ali_new_private_key") + req["app_id"] = SysCfgGet(c, "pay_ali_new_app_id") + appCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + SysCfgGet(c, "pay_app_cert_sn")) + if err != nil { + fmt.Println(err) + return nil, err + } + if appCertSN == "" { + fmt.Println(err) + return nil, err + } + req["pay_app_cert_sn"] = appCertSN + aliPayPublicCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + SysCfgGet(c, "pay_alipayrsa_public_key")) + if err != nil { + fmt.Println(err) + return nil, err + } + if aliPayPublicCertSN == "" { + fmt.Println(err) + return nil, err + } + req["pay_alipayrsa_public_key"] = aliPayPublicCertSN + } + if req["private_key"] == "" || req["app_id"] == "" { + return req, e.NewErr(400, "请在后台正确配置支付宝") + } + req["ord_id"] = p.OrdId + req["amount"] = p.Amount + req["subject"] = p.Subject + req["order_type"] = p.OrderType + req["notify_url"] = fmt.Sprintf(md.CALLBACK_URL, c.Request.Host, c.GetString("mid"), p.OrderType, md.ALIPAY) + req["platform"] = c.GetHeader("Platform") + req["page_url"] = c.Query("page_url") + utils.FilePutContents(c.GetString("mid")+"alipay", utils.SerializeStr(req)) + return req, nil +} diff --git a/app/svc/svc_auth.go b/app/svc/svc_auth.go new file mode 100644 index 0000000..988a3d7 --- /dev/null +++ b/app/svc/svc_auth.go @@ -0,0 +1,69 @@ +package svc + +import ( + "applet/app/db" + "applet/app/md" + "applet/app/utils" + "errors" + "github.com/gin-gonic/gin" + "strings" +) + +// 因为在mw_auth已经做完所有校验, 因此在此不再做任何校验 +// GetUser is get user model +func GetUser(c *gin.Context) *md.User { + user, _ := c.Get("user") + if user == nil { + return nil + } + return user.(*md.User) +} + +func GetUid(c *gin.Context) string { + user, _ := c.Get("user") + u := user.(*md.User) + return utils.IntToStr(u.Info.Uid) +} + +func CheckUser(c *gin.Context) (*md.User, error) { + token := c.GetHeader("Authorization") + if token == "" { + return nil, errors.New("token not exist") + } + // 按空格分割 + parts := strings.SplitN(token, " ", 2) + if !(len(parts) == 2 && parts[0] == "Bearer") { + return nil, errors.New("token format error") + } + // parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它 + mc, err := utils.ParseToken(parts[1]) + if err != nil { + return nil, err + } + + // 获取user + u, err := db.UserFindByID(db.DBs[c.GetString("mid")], mc.UID) + if err != nil { + return nil, err + } + if u == nil { + return nil, errors.New("token can not find user") + } + // 获取user profile + up, err := db.UserProfileFindByID(db.DBs[c.GetString("mid")], mc.UID) + if err != nil { + return nil, err + } + // 获取user 等级 + ul, err := db.UserLevelByID(db.DBs[c.GetString("mid")], u.Level) + if err != nil { + return nil, err + } + + user := &md.User{ + Info: u, + Profile: up, + Level: ul, + } + return user, nil +} diff --git a/app/svc/svc_balance.go b/app/svc/svc_balance.go new file mode 100644 index 0000000..6e30eec --- /dev/null +++ b/app/svc/svc_balance.go @@ -0,0 +1,74 @@ +package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/logx" + "github.com/gin-gonic/gin" + "time" + "xorm.io/xorm" +) + +func BalancePay(c *gin.Context, money, oid string, types string) error { + + user, err := CheckUser(c) + if user == nil || err != nil { + return err + } + // 获取余额更新锁 + cb, err := HandleBalanceDistributedLock(c.GetString("mid"), utils.IntToStr(user.Info.Uid), "balance_pay") + if err != nil { + return err + } + // 释放锁 + if cb != nil { + defer cb() + } + finValid := utils.AnyToFloat64(user.Profile.FinValid) + needMoney := utils.AnyToFloat64(money) + if finValid < needMoney { + return e.NewErrCode(e.ERR_BALANCE_NOT_ENOUGH) + } + user.Profile.FinValid = utils.AnyToString(finValid - needMoney) + affect, err := db.UserProfileUpdate(db.DBs[c.GetString("mid")], user.Profile.Uid, user.Profile, "fin_valid") + if err != nil || affect != 1 { + return err + } + var str = "" + if types == md.CommunityTeam { + str = "小店下单" + } + flowInsert(db.DBs[c.GetString("mid")], user.Profile.Uid, money, 21, utils.StrToInt64(oid), 0, 0, str+"余额支付", types, 1, utils.Float64ToStr(finValid), user.Profile.FinValid) + return nil +} +func flowInsert(eg *xorm.Engine, uid int, paidPrice string, orderAction int, ordId int64, id int64, goodsId int, ItemTitle string, ordType string, types int, beforeAmount string, afterAmount string) { + session := eg.NewSession() + + now := time.Now() + if err := db.FinUserFlowInsertOneWithSession( + session, + &model.FinUserFlow{ + Type: types, + Uid: uid, + Amount: paidPrice, + BeforeAmount: beforeAmount, + AfterAmount: afterAmount, + OrdType: ordType, + OrdId: utils.Int64ToStr(ordId), + OrdAction: orderAction, + OrdDetail: utils.IntToStr(goodsId), + State: 2, + OtherId: id, + OrdTitle: ItemTitle, + OrdTime: int(now.Unix()), + CreateAt: now, + UpdateAt: now, + }); err != nil { + _ = session.Rollback() + _ = logx.Warn(err) + return + } +} diff --git a/app/svc/svc_cate.go b/app/svc/svc_cate.go new file mode 100644 index 0000000..1b02dbe --- /dev/null +++ b/app/svc/svc_cate.go @@ -0,0 +1,24 @@ +package svc + +import ( + "applet/app/db" + "applet/app/e" + "applet/app/utils" + "github.com/gin-gonic/gin" +) + +func Cate(c *gin.Context) { + cate := db.GetCate(MasterDb(c), "0") + cateList := make([]map[string]string, 0) + if cate != nil { + for _, v := range *cate { + tmp := map[string]string{ + "id": utils.IntToStr(v.Id), + "name": v.Title, + } + cateList = append(cateList, tmp) + } + } + e.OutSuc(c, cateList, nil) + return +} diff --git a/app/svc/svc_comm.go b/app/svc/svc_comm.go new file mode 100644 index 0000000..f5b28e3 --- /dev/null +++ b/app/svc/svc_comm.go @@ -0,0 +1,25 @@ +package svc + +import ( + "applet/app/utils" + "github.com/gin-gonic/gin" + "strings" +) + +func GetCommissionPrec(c *gin.Context, sum, commPrec, isShowPoint string) string { + if sum == "" { + sum = "0" + } + sum = utils.StrToFormat(c, sum, utils.StrToInt(commPrec)) + ex := strings.Split(sum, ".") + if len(ex) == 2 && isShowPoint != "1" { + if utils.StrToFloat64(ex[1]) == 0 { + sum = ex[0] + } else { + val := utils.Float64ToStrByPrec(utils.StrToFloat64(ex[1]), 0) + valNew := strings.ReplaceAll(val, "0", "") + sum = ex[0] + "." + strings.ReplaceAll(ex[1], val, valNew) + } + } + return sum +} diff --git a/app/svc/svc_db.go b/app/svc/svc_db.go new file mode 100644 index 0000000..99b1e0d --- /dev/null +++ b/app/svc/svc_db.go @@ -0,0 +1,11 @@ +package svc + +import ( + "applet/app/db" + "github.com/gin-gonic/gin" + "xorm.io/xorm" +) + +func MasterDb(c *gin.Context) *xorm.Engine { + return db.DBs[c.GetString("mid")] +} diff --git a/app/svc/svc_default_user.go b/app/svc/svc_default_user.go new file mode 100644 index 0000000..63bdaaa --- /dev/null +++ b/app/svc/svc_default_user.go @@ -0,0 +1,50 @@ +package svc + +import ( + "applet/app/db" + "applet/app/md" + "errors" + "github.com/gin-gonic/gin" + "strings" +) + +// GetDefaultUser is 获取默认账号,uid =0 为系统默认账号,用于一些请求需要渠道id之类的东西 +func GetDefaultUser(c *gin.Context, token string) (*md.User, error) { + user := new(md.User) + if c.GetString("convert_url") == "1" { //转链接口 + goto DEFALUT + } else { + // Token 不为空时拿对应的用户数据 + if token != "" && strings.Contains(token, "Bearer") { + + user, err := CheckUser(c) + if user == nil { + return nil, errors.New("token is expired") + } + if err != nil { + // 有报错自己拿默认用户 + goto DEFALUT + } + return user, nil + } + } + +DEFALUT: + // 默认拿uid 等于0的用户数据 + profile, err := db.UserProfileFindByID(db.DBs[c.GetString("mid")], 0) + if err != nil { + return nil, err + } + info, err := db.UserFindByID(db.DBs[c.GetString("mid")], 0) + if err != nil { + return nil, err + } + ul, err := db.UserLevelInIDescByWeightLowWithOne(db.DBs[c.GetString("mid")]) + if err != nil { + return nil, err + } + user.Info = info + user.Profile = profile + user.Level = ul + return user, nil +} diff --git a/app/svc/svc_domain_info.go b/app/svc/svc_domain_info.go new file mode 100644 index 0000000..9318ad9 --- /dev/null +++ b/app/svc/svc_domain_info.go @@ -0,0 +1,206 @@ +package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/db/offical" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/logx" + "github.com/gin-gonic/gin" + "github.com/tidwall/gjson" + "strings" +) + +// 获取指定类型的域名:admin、wap、api +func GetWebSiteDomainInfo(c *gin.Context, domainType string) string { + if domainType == "" { + domainType = "wap" + } + + domainSetting := SysCfgGet(c, "domain_setting") + + domainTypePath := domainType + ".type" + domainSslPath := domainType + ".isOpenHttps" + domainPath := domainType + ".domain" + + domainTypeValue := gjson.Get(domainSetting, domainTypePath).String() + domainSslValue := gjson.Get(domainSetting, domainSslPath).String() + domain := gjson.Get(domainSetting, domainPath).String() + + scheme := "http://" + if domainSslValue == "1" { + scheme = "https://" + } + + // 有自定义域名 返回自定义的 + if domainTypeValue == "own" && domain != "" { + return scheme + domain + } + // 否则返回官方的 + official, err := db.GetOfficialDomainInfoByType(db.Db, c.GetString("mid"), domainType) + if err != nil { + _ = logx.Errorf("Get Official Domain Fail! %s", err) + return "" + } + if strings.Contains(official, "http") { + return official + } + return scheme + official +} +func GetWebSiteDomainInfoToAgent(c *gin.Context, domainType string) string { + if domainType == "" { + domainType = "wap" + } + + domainSetting := SysCfgGet(c, "domain_setting") + + domainTypePath := domainType + ".type" + domainSslPath := domainType + ".isOpenHttps" + domainPath := domainType + ".domain" + + domainTypeValue := gjson.Get(domainSetting, domainTypePath).String() + domainSslValue := gjson.Get(domainSetting, domainSslPath).String() + domain := gjson.Get(domainSetting, domainPath).String() + + scheme := "http://" + if domainSslValue == "1" { + scheme = "https://" + } + + // 有自定义域名 返回自定义的 + if domainTypeValue == "own" && domain != "" { + return scheme + domain + } + // 否则返回官方的 + puid := AppUserListPuid(c) + var official = "" + var err error + if puid != "" && puid != "0" { + official, err = db.GetOfficialDomainInfoByTypeToAgent(db.Db, c.GetString("mid"), puid, domainType) + if err != nil { + _ = logx.Errorf("Get Official Domain Fail! %s", err) + return "" + } + } else { + official, err = db.GetOfficialDomainInfoByType(db.Db, c.GetString("mid"), domainType) + if err != nil { + _ = logx.Errorf("Get Official Domain Fail! %s", err) + return "" + } + } + if strings.Contains(official, "http") { + return official + } + return scheme + official +} +func GetWebSiteDomainInfoOfficial(c *gin.Context, domainType string) string { + if domainType == "" { + domainType = "wap" + } + + domainSetting := SysCfgGet(c, "domain_setting") + + domainSslPath := domainType + ".isOpenHttps" + + domainSslValue := gjson.Get(domainSetting, domainSslPath).String() + + scheme := "http://" + if domainSslValue == "1" { + scheme = "https://" + } + + // 有自定义域名 返回自定义的 + // 否则返回官方的 + official, err := db.GetOfficialDomainInfoByType(db.Db, c.GetString("mid"), domainType) + if err != nil { + _ = logx.Errorf("Get Official Domain Fail! %s", err) + return "" + } + if strings.Contains(official, "http") { + return official + } + return scheme + official +} + +// 获取指定类型的域名对应的masterId:admin、wap、api +func GetWebSiteDomainMasterId(domainType string, host string) string { + obj := new(model.UserAppDomain) + has, err := db.Db.Where("domain=? and type=?", host, domainType).Get(obj) + if err != nil || !has { + return "" + } + return utils.AnyToString(obj.Uuid) +} + +func GetWebSiteAppSmsPlatform(mid string) string { + obj := new(model.UserAppList) + has, err := db.Db.Where("uuid=? ", mid).Asc("id").Get(obj) + if err != nil || !has { + return "" + } + return utils.AnyToString(obj.SmsPlatform) +} + +// 获取指定类型的域名:admin、wap、api +func GetWebSiteLiveBroadcastDomainInfo(c *gin.Context, domainType, mid string) string { + if domainType == "" { + domainType = "wap" + } + + domainSetting := SysCfgGet(c, "domain_setting") + domainSslPath := domainType + ".isOpenHttps" + domainSslValue := gjson.Get(domainSetting, domainSslPath).String() + //masterid.izhyin.cn + domain := mid + ".izhim.net" + + scheme := "http://" + if domainSslValue == "1" { + scheme = "https://" + } + if c.GetHeader("platform") == md.PLATFORM_WX_APPLET { //小程序需要https + scheme = "https://" + } + return scheme + domain +} +func GetWebSiteDomainInfoSecond(c *gin.Context, domainType string) string { + if domainType == "" { + domainType = "wap" + } + + domainSetting := SysCfgGet(c, "domain_setting") + domainSslPath := domainType + ".isOpenHttps" + domainSslValue := gjson.Get(domainSetting, domainSslPath).String() + domain := c.GetString("mid") + ".izhim.net" + domainTypePath := domainType + ".type" + domainTypeValue := gjson.Get(domainSetting, domainTypePath).String() + scheme := "http://" + if domainSslValue == "1" { + scheme = "https://" + } + if c.GetHeader("platform") == md.PLATFORM_WX_APPLET { //小程序需要https + scheme = "https://" + } + // 有自定义域名 返回自定义的 + if domainTypeValue == "own" { + domainPath := domainType + ".domain" + domain = gjson.Get(domainSetting, domainPath).String() + } + return scheme + domain +} +func AppUserListPuid(c *gin.Context) string { + appList := offical.GetUserAppList(c.GetString("mid")) + uid := "0" + if appList != nil && appList.Puid > 0 { + uid = utils.IntToStr(appList.Puid) + } + return uid +} +func AppUserListPuidWithDb(dbName string) string { + appList := offical.GetUserAppList(dbName) + uid := "0" + if appList != nil && appList.Puid > 0 { + uid = utils.IntToStr(appList.Puid) + } + return uid +} diff --git a/app/svc/svc_file_img_format.go b/app/svc/svc_file_img_format.go new file mode 100644 index 0000000..4131981 --- /dev/null +++ b/app/svc/svc_file_img_format.go @@ -0,0 +1,81 @@ +package svc + +import ( + "applet/app/utils" + "fmt" + "github.com/syyongx/php2go" + "strings" + + "github.com/gin-gonic/gin" +) + +// ImageFormat is 格式化 图片 +func ImageFormat(c *gin.Context, name string) string { + if strings.Contains(name, "https:") || strings.Contains(name, "http:") { + return name + } + scheme := SysCfgGet(c, "file_bucket_scheme") + domain := SysCfgGet(c, "file_bucket_host") + name, _ = php2go.URLDecode(name) + name = php2go.URLEncode(name) + return fmt.Sprintf("%s://%s/%s", scheme, domain, name) +} + +// OffImageFormat is 格式化官方 图片 +func OffImageFormat(c *gin.Context, name string) string { + if strings.Contains(name, "https:") || strings.Contains(name, "http:") { + return name + } + name, _ = php2go.URLDecode(name) + name = php2go.URLEncode(name) + + return fmt.Sprintf("%s://%s/%s", "http", "ossn.izhim.net", name) +} + +// ImageBucket is 获取域名 +func ImageBucket(c *gin.Context) (string, string) { + return SysCfgGet(c, "file_bucket_scheme"), SysCfgGet(c, "file_bucket_host") +} + +// ImageFormatWithBucket is 格式化成oss 域名 +func ImageFormatWithBucket(scheme, domain, name string) string { + if strings.Contains(name, "http") || name == "" { + return name + } + name, _ = php2go.URLDecode(name) + name = php2go.URLEncode(name) + return fmt.Sprintf("%s://%s/%s", scheme, domain, name) +} + +// ImageBucketNew is 获取域名 +func ImageBucketNew(c *gin.Context) (string, string, string, map[string]string) { + var list = make(map[string]string, 0) + for i := 1; i < 10; i++ { + keys := "file_bucket_sub_host" + utils.IntToStr(i) + list[keys] = SysCfgGet(c, keys) + } + return SysCfgGet(c, "file_bucket_scheme"), SysCfgGet(c, "file_bucket_host"), SysCfgGet(c, "file_bucket_sub_host"), list +} + +// ImageFormatWithBucket is 格式化成oss 域名 +func ImageFormatWithBucketNew(scheme, domain, subDomain string, moreSubDomain map[string]string, name string) string { + if strings.Contains(name, "http") { + return name + } + if strings.Contains(name, "{{subhost}}") && subDomain != "" { //读副域名 有可能是其他平台的 + domain = subDomain + } + //为了兼容一些客户自营商城导到不同系统 并且七牛云不一样 + for i := 1; i < 10; i++ { + keys := "file_bucket_sub_host" + utils.IntToStr(i) + if strings.Contains(name, "{{subhost"+utils.IntToStr(i)+"}}") && moreSubDomain[keys] != "" { + domain = moreSubDomain[keys] + } + name = strings.ReplaceAll(name, "{{subhost"+utils.IntToStr(i)+"}}", "") + } + name = strings.ReplaceAll(name, "{{host}}", "") + name = strings.ReplaceAll(name, "{{subhost}}", "") + name, _ = php2go.URLDecode(name) + name = php2go.URLEncode(name) + return fmt.Sprintf("%s://%s/%s", scheme, domain, name) +} diff --git a/app/svc/svc_goods.go b/app/svc/svc_goods.go new file mode 100644 index 0000000..7c6f19e --- /dev/null +++ b/app/svc/svc_goods.go @@ -0,0 +1,75 @@ +package svc + +import ( + "applet/app/db" + "applet/app/e" + "applet/app/utils" + "encoding/json" + "github.com/gin-gonic/gin" +) + +func Goods(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + goods := db.GetGoods(MasterDb(c), arg) + goodsList := make([]map[string]interface{}, 0) + if goods != nil { + for _, v := range *goods { + speImageList := make([]string, 0) + if v.IsSpeImageOn == 1 { + json.Unmarshal([]byte(v.SpeImages), &speImageList) + } + tmp := map[string]interface{}{ + "id": utils.IntToStr(v.Id), + "title": v.Title, + "img": v.Img, + "info": v.Info, + "price": v.Price, + "stock": utils.IntToStr(v.Stock), + "is_single_sku": utils.IntToStr(v.IsSingleSku), + "sale_count": utils.IntToStr(v.SaleCount), + "spe_image_list": speImageList, + } + goodsList = append(goodsList, tmp) + } + } + e.OutSuc(c, goodsList, nil) + return +} +func GoodsSku(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + sku := db.GetGoodsSku(MasterDb(c), arg["goods_id"]) + skuList := make([]map[string]string, 0) + if sku != nil { + for _, v := range *sku { + tmp := map[string]string{ + "sku_id": utils.Int64ToStr(v.SkuId), + "goods_id": utils.IntToStr(v.GoodsId), + "price": v.Price, + "stock": utils.IntToStr(v.Stock), + "indexes": v.Indexes, + "sku": v.Sku, + } + skuList = append(skuList, tmp) + } + } + e.OutSuc(c, skuList, nil) + return +} +func GoodsCoupon(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + returnData := CommCoupon(c, arg["amount"]) + e.OutSuc(c, returnData, nil) + return +} diff --git a/app/svc/svc_order.go b/app/svc/svc_order.go new file mode 100644 index 0000000..d0be942 --- /dev/null +++ b/app/svc/svc_order.go @@ -0,0 +1,656 @@ +package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "applet/app/enum" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/cache" + "encoding/json" + "errors" + "fmt" + "github.com/gin-gonic/gin" + "github.com/shopspring/decimal" + "time" + "xorm.io/xorm" +) + +func OrderCate(c *gin.Context) { + var cate = []map[string]string{ + {"name": "全部", "value": ""}, + {"name": "待付款", "value": "0"}, + {"name": "待提货", "value": "1"}, + {"name": "已完成", "value": "2"}, + {"name": "已取消", "value": "3"}, + } + e.OutSuc(c, cate, nil) + return +} +func OrderList(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := GetUser(c) + arg["uid"] = utils.IntToStr(user.Info.Uid) + data := db.GetOrderList(MasterDb(c), arg) + var state = []string{"待付款", "待提货", "已完成", "已取消"} + list := make([]map[string]string, 0) + if data != nil { + now := time.Now().Unix() + for _, v := range *data { + store := db.GetStoreIdEg(MasterDb(c), utils.IntToStr(v.StoreUid)) + info := db.GetOrderInfoEg(MasterDb(c), utils.Int64ToStr(v.Oid)) + downTime := "0" + if v.State == 0 { + downTime = utils.IntToStr(int(v.CreateAt.Unix() + 15*60 - now)) + if now > v.CreateAt.Unix()+15*60 { + v.State = 3 + } + if utils.StrToInt(downTime) < 0 { + downTime = "0" + } + } + img := "" + title := "" + storeName := "" + if store != nil { + storeName = store.Name + } + if info != nil { + img = info.Img + title = info.Title + } + tmp := map[string]string{ + "oid": utils.Int64ToStr(v.Oid), + "label": "自提", + "state": utils.IntToStr(v.State), + "state_str": state[v.State], + "store_name": storeName, + "img": img, + "title": title, + "amount": v.Amount, + "num": utils.IntToStr(v.Num), + "timer": "", + "down_time": downTime, + } + if v.Type == 1 { + tmp["label"] = "外卖" + } + if v.IsNow == 1 { + tmp["timer"] = "立即提货" + } else if v.Timer != "" { + tmp["timer"] = "提货时间:" + v.Timer + } + list = append(list, tmp) + } + } + e.OutSuc(c, list, nil) + return +} +func OrderDetail(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + data := db.GetOrderEg(MasterDb(c), arg["oid"]) + var state = []string{"待付款", "待提货", "已完成", "已取消"} + now := time.Now().Unix() + store := db.GetStoreIdEg(MasterDb(c), utils.IntToStr(data.StoreUid)) + downTime := "0" + if data.State == 0 { + downTime = utils.IntToStr(int(data.CreateAt.Unix() + 15*60 - now)) + if now > data.CreateAt.Unix()+15*60 { + data.State = 3 + } + if utils.StrToInt(downTime) < 0 { + downTime = "0" + } + } + img := "" + title := "" + storeName := "" + storeAddress := "" + lat := "" + lng := "" + km := "" + if store != nil { + storeName = store.Name + storeAddress = store.Address + lat = store.Lat + lng = store.Lng + km = "" + if arg["lat"] != "" && arg["lng"] != "" { + km1 := utils.CalculateDistance(utils.StrToFloat64(lat), utils.StrToFloat64(lng), utils.StrToFloat64(arg["lat"]), utils.StrToFloat64(arg["lng"])) + if km1 < 1 { + km = utils.Float64ToStr(km1*1000) + "m" + } else { + km = utils.Float64ToStr(km1) + "km" + } + } + } + confirmAt := "" + if data.ConfirmAt.IsZero() == false { + confirmAt = data.ConfirmAt.Format("2006-01-02 15:04:05") + } + payMethod := "-" + if data.PayMethod > 0 { + payMethod = md.PayMethodIdToName[data.PayMethod] + } + orderInfo := []map[string]string{ + {"title": "订单编号", "content": utils.Int64ToStr(data.Oid)}, + {"title": "下单时间", "content": data.CreateAt.Format("2006-01-02 15:04:05")}, + {"title": "提货时间", "content": confirmAt}, + {"title": "预留电话", "content": data.Phone}, + {"title": "支付方式", "content": payMethod}, + {"title": "备注信息", "content": data.Memo}, + } + goodsInfo := make([]map[string]string, 0) + info := db.GetOrderInfoAllEg(MasterDb(c), utils.Int64ToStr(data.Oid)) + if info != nil { + for _, v := range *info { + tmp := map[string]string{ + "img": v.Img, + "title": v.Title, + "price": v.Price, + "num": utils.IntToStr(v.Num), + "sku_str": "", + } + skuData := make([]md.Sku, 0) + json.Unmarshal([]byte(v.SkuInfo), &skuData) + skuStr := "" + for _, v1 := range skuData { + if skuStr != "" { + skuStr += ";" + } + skuStr += v1.Value + } + tmp["sku_str"] = skuStr + goodsInfo = append(goodsInfo, tmp) + } + } + tmp := map[string]interface{}{ + "oid": utils.Int64ToStr(data.Oid), + "label": "自提", + "state": utils.IntToStr(data.State), + "state_str": state[data.State], + "store_name": storeName, + "store_address": storeAddress, + "lat": lat, + "lng": lng, + "km": km, + "img": img, + "title": title, + "amount": data.Amount, + "num": utils.IntToStr(data.Num), + "timer": "", + "code": data.Code, + "down_time": downTime, + "order_info": orderInfo, + "goods_info": goodsInfo, + "goods_count": utils.IntToStr(len(goodsInfo)), + } + if data.Type == 1 { + tmp["label"] = "外卖" + } + if data.IsNow == 1 { + tmp["timer"] = "立即提货" + } else if data.Timer != "" { + tmp["timer"] = data.Timer + } + e.OutSuc(c, tmp, nil) + return +} +func OrderCoupon(c *gin.Context) { + var arg md.OrderTotal + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + totalPrice := commGoods(c, arg) + returnData := CommCoupon(c, totalPrice) + e.OutSuc(c, returnData, nil) + return +} +func CommCoupon(c *gin.Context, totalPrice string) map[string]interface{} { + var err error + engine := MasterDb(c) + user := GetUser(c) + now := time.Now().Format("2006-01-02 15:04:05") + var ActCouponUserList []*model.CommunityTeamCouponUser + sess := engine.Table("act_coupon_user"). + Where("store_type=? and uid = ? AND is_use = ? AND (valid_time_start < ? AND valid_time_end > ?)", 0, + user.Info.Uid, 0, now, now) + err = sess.Find(&ActCouponUserList) + if err != nil { + return map[string]interface{}{} + } + var ids = make([]int, 0) + for _, v := range ActCouponUserList { + ids = append(ids, v.MerchantSchemeId) + } + var merchantScheme []model.CommunityTeamCoupon + engine.In("id", ids).Find(&merchantScheme) + var merchantSchemeMap = make(map[int]model.CommunityTeamCoupon) + for _, v := range merchantScheme { + merchantSchemeMap[v.Id] = v + } + + var couponList []md.CouponList // 可使用的 + couponList = make([]md.CouponList, 0) + count := 0 + for _, item := range ActCouponUserList { + var coupon = md.CouponList{ + Id: utils.Int64ToStr(item.Id), + Title: item.Name, + Timer: item.ValidTimeStart.Format("2006.01.02") + "-" + item.ValidTimeEnd.Format("2006.01.02"), + Label: "全部商品可用", + Img: item.Img, + Content: item.ActivityStatement, + IsCanUse: "0", + NotUseStr: "", + } + var cal struct { + Reach string `json:"reach"` + Reduce string `json:"reduce"` + } + err = json.Unmarshal([]byte(item.Cal), &cal) + if err != nil { + return map[string]interface{}{} + } + switch item.Kind { + case int(enum.ActCouponTypeImmediate): + if utils.AnyToFloat64(totalPrice) >= utils.AnyToFloat64(cal.Reduce) { + coupon.IsCanUse = "1" + } + case int(enum.ActCouponTypeReachReduce): + if utils.AnyToFloat64(totalPrice) >= utils.AnyToFloat64(cal.Reduce) { + coupon.IsCanUse = "1" + } + case int(enum.ActCouponTypeReachDiscount): + if utils.AnyToFloat64(totalPrice) >= utils.AnyToFloat64(cal.Reduce) && utils.AnyToFloat64(cal.Reduce) > 0 { + coupon.IsCanUse = "1" + } + if utils.AnyToFloat64(cal.Reduce) == 0 { + coupon.IsCanUse = "1" + } + } + if coupon.IsCanUse != "1" { + coupon.NotUseStr = "订单金额未满" + cal.Reduce + "元" + } + if coupon.IsCanUse == "1" { + count++ + } + couponList = append(couponList, coupon) + } + + returnData := map[string]interface{}{ + "total": utils.IntToStr(count), + "coupon_list": couponList, + } + + return returnData +} +func OrderCancel(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + // 加锁 防止并发提取 + mutexKey := fmt.Sprintf("%s:team.OrderCancel:%s", c.GetString("mid"), arg["oid"]) + withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX") + if err != nil { + e.OutErr(c, e.ERR, err) + return + } + if withdrawAvailable != "OK" { + e.OutErr(c, e.ERR, e.NewErr(400000, "请求过于频繁,请稍后再试")) + return + } + sess := MasterDb(c).NewSession() + defer sess.Close() + sess.Begin() + order := db.GetOrder(sess, arg["oid"]) + if order == nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单不存在")) + return + } + if order.State > 0 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单不能取消")) + return + } + orderInfo := db.GetOrderInfo(sess, arg["oid"]) + if orderInfo != nil { + goodsMap := make(map[int]int) + skuMap := make(map[int]int) + for _, v := range *orderInfo { + goodsMap[v.GoodsId] += v.Num + skuMap[v.SkuId] += v.Num + } + for k, v := range goodsMap { + sql := `update community_team_goods set stock=stock+%d where id=%d` + sql = fmt.Sprintf(sql, v, k) + _, err := db.QueryNativeStringWithSess(sess, sql) + if err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单取消失败")) + return + } + } + for k, v := range skuMap { + sql := `update community_team_sku set stock=stock+%d where sku_id=%d` + sql = fmt.Sprintf(sql, v, k) + _, err := db.QueryNativeStringWithSess(sess, sql) + if err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单取消失败")) + return + } + } + } + order.State = 3 + order.UpdateAt = time.Now() + update, err := sess.Where("id=?", order.Id).Cols("state,update_at").Update(order) + if update == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单取消失败")) + return + } + if order.CouponId > 0 { + update, err = sess.Where("id=?", order.CouponId).Cols("is_use").Update(&model.CommunityTeamCouponUser{IsUse: 0}) + if update == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单取消失败")) + return + } + } + sess.Commit() + e.OutSuc(c, "success", nil) + return +} +func OrderCreate(c *gin.Context) { + var arg md.OrderTotal + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := GetUser(c) + // 加锁 防止并发提取 + mutexKey := fmt.Sprintf("%s:team.OrderCreate:%s", c.GetString("mid"), utils.IntToStr(user.Info.Uid)) + withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX") + if err != nil { + e.OutErr(c, e.ERR, err) + return + } + if withdrawAvailable != "OK" { + e.OutErr(c, e.ERR, e.NewErr(400000, "请求过于频繁,请稍后再试")) + return + } + sess := MasterDb(c).NewSession() + defer sess.Close() + err = sess.Begin() + if err != nil { + e.OutErr(c, 400, err.Error()) + return + } + totalPrice := commGoods(c, arg) + coupon := "0" + totalPrice, coupon, err = CouponProcess(c, sess, totalPrice, arg) + if err != nil { + sess.Rollback() + e.OutErr(c, 400, err.Error()) + return + } + ordId := utils.OrderUUID(user.Info.Uid) + // 获取店铺信息 + store := db.GetStoreId(sess, arg.StoreId) + num := 0 + for _, item := range arg.GoodsInfo { + num += utils.StrToInt(item.Num) + } + var order = &model.CommunityTeamOrder{ + Uid: user.Info.Uid, + StoreUid: utils.StrToInt(arg.StoreId), + Commission: utils.Float64ToStr(utils.FloatFormat(utils.AnyToFloat64(totalPrice)*(utils.AnyToFloat64(store.Commission)/100), 2)), + CreateAt: time.Now(), + UpdateAt: time.Now(), + BuyPhone: arg.BuyPhone, + Coupon: coupon, + Num: num, + IsNow: utils.StrToInt(arg.IsNow), + Timer: arg.Timer, + Memo: arg.Memo, + Oid: utils.StrToInt64(ordId), + Amount: totalPrice, + MealNum: utils.StrToInt(arg.MealNum), + } + if utils.StrToFloat64(coupon) > 0 { + order.CouponId = utils.StrToInt(arg.CouponId) + } + insert, err := sess.Insert(order) + if insert == 0 || err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "下单失败")) + return + } + for _, item := range arg.GoodsInfo { + // 获取详细信息 + goodsInterface, has, err := db.GetComm(MasterDb(c), &model.CommunityTeamGoods{Id: utils.StrToInt(item.GoodsId)}) + if err != nil || !has { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "商品不存在")) + return + } + goodsModel := goodsInterface.(*model.CommunityTeamGoods) + var skuInterface interface{} + if item.SkuId != "-1" { + skuInterface, _, _ = db.GetComm(MasterDb(c), &model.CommunityTeamSku{GoodsId: utils.StrToInt(item.GoodsId), SkuId: utils.StrToInt64(item.SkuId)}) + } else { + skuInterface, _, _ = db.GetComm(MasterDb(c), &model.CommunityTeamSku{GoodsId: utils.StrToInt(item.GoodsId)}) + } + if err != nil || !has { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "商品不存在")) + return + } + skuModel := skuInterface.(*model.CommunityTeamSku) + var goodsSaleCount int + // 走普通逻辑 + stock := skuModel.Stock - utils.StrToInt(item.Num) + saleCount := skuModel.SaleCount + utils.StrToInt(item.Num) + goodsSaleCount = goodsModel.SaleCount + utils.StrToInt(item.Num) + if stock < 0 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "库存不足")) + return + } + update, err := sess.Where("sku_id=?", skuModel.SkuId).Cols("stock", "sale_count").Update(&model.CommunityTeamSku{Stock: stock, SaleCount: saleCount}) + if err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "商品不存在")) + return + } + if update != 1 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "商品不存在")) + return + } + // 更新销量 + goodsModel.SaleCount = goodsSaleCount + goodsModel.Stock = goodsModel.Stock - utils.StrToInt(item.Num) + _, err = sess.Where("id = ?", goodsModel.Id).Cols("sale_count,stock").Update(goodsModel) + if err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "商品不存在")) + return + } + + // 插入订单 + insert, err := sess.Insert(&model.CommunityTeamOrderInfo{ + Oid: utils.StrToInt64(ordId), + Title: goodsModel.Title, + Img: goodsModel.Img, + Price: skuModel.Price, + Num: utils.StrToInt(item.Num), + SkuInfo: skuModel.Sku, + GoodsId: skuModel.GoodsId, + SkuId: int(skuModel.SkuId), + }) + + if err != nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "下单失败")) + return + } + if insert != 1 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "下单失败")) + return + } + } + // 更新优惠券使用状态 + if utils.StrToInt(arg.CouponId) > 0 { + affect, err := sess.Where("id = ?", arg.CouponId). + Update(&model.CommunityTeamCouponUser{IsUse: 1}) + if err != nil { + e.OutErr(c, 400, e.NewErr(400, "下单失败")) + return + } + if affect != 1 { + e.OutErr(c, 400, e.NewErr(400, "下单失败")) + return + } + } + + err = sess.Commit() + if err != nil { + sess.Rollback() + e.OutErr(c, 400, err.Error()) + return + } + sess.Commit() + return +} +func OrderTotal(c *gin.Context) { + var arg md.OrderTotal + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + sess := MasterDb(c).NewSession() + defer sess.Close() + err := sess.Begin() + if err != nil { + e.OutErr(c, 400, err.Error()) + return + } + totalPrice := commGoods(c, arg) + oldTotalPrice := totalPrice + coupon := "0" + totalPrice, coupon, err = CouponProcess(c, sess, totalPrice, arg) + if err != nil { + sess.Rollback() + e.OutErr(c, 400, err.Error()) + return + } + user := GetUser(c) + result := map[string]interface{}{ + "balance_money": GetCommissionPrec(c, user.Profile.FinValid, SysCfgGet(c, "commission_prec"), SysCfgGet(c, "is_show_point")), + "small_amount": GetCommissionPrec(c, oldTotalPrice, SysCfgGet(c, "commission_prec"), SysCfgGet(c, "is_show_point")), + "all_amount": GetCommissionPrec(c, totalPrice, SysCfgGet(c, "commission_prec"), SysCfgGet(c, "is_show_point")), + "coupon": GetCommissionPrec(c, coupon, SysCfgGet(c, "commission_prec"), SysCfgGet(c, "is_show_point")), + } + sess.Commit() + e.OutSuc(c, result, nil) + return +} +func CouponProcess(c *gin.Context, sess *xorm.Session, total string, args md.OrderTotal) (string, string, error) { + if utils.StrToInt(args.CouponId) == 0 { + return total, "0", nil + } + now := time.Now().Format("2006-01-02 15:04:05") + user := GetUser(c) + var goodsIds []int + var skuIds []string + for _, item := range args.GoodsInfo { + goodsIds = append(goodsIds, utils.StrToInt(item.GoodsId)) + skuIds = append(skuIds, utils.AnyToString(item.SkuId)) + } + // 获取优惠券信息 + var mallUserCoupon model.CommunityTeamCouponUser + isExist, err := sess. + Where("id = ? AND uid = ? AND is_use = ? AND (valid_time_start < ? AND valid_time_end > ?)", args.CouponId, user.Info.Uid, 0, now, now). + Get(&mallUserCoupon) + if err != nil { + return "", "", err + } + if !isExist { + return "", "", errors.New("无相关优惠券信息") + } + + var cal struct { + Reach string `json:"reach"` + Reduce string `json:"reduce"` + } + _ = json.Unmarshal([]byte(mallUserCoupon.Cal), &cal) + reach, err := decimal.NewFromString(cal.Reach) + reduce, err := decimal.NewFromString(cal.Reduce) + if err != nil { + return "", "", err + } + + var specialTotal = total + // 是否满足优惠条件 + if !reach.IsZero() { // 满减及有门槛折扣 + if utils.StrToFloat64(specialTotal) < utils.StrToFloat64(reach.String()) { + return "", "", errors.New("不满足优惠条件") + } + } else { + if mallUserCoupon.Kind == 1 { //立减 + if utils.StrToFloat64(specialTotal) < utils.StrToFloat64(reduce.String()) { + return "", "", errors.New("付款金额有误") + } + } + } + // 计算优惠后支付金额 + couponTotal := "0" + if mallUserCoupon.Kind == int(enum.ActCouponTypeImmediate) || + mallUserCoupon.Kind == int(enum.ActCouponTypeReachReduce) { // 立减 || 满减 + couponTotal = reduce.String() + total = utils.Float64ToStr(utils.StrToFloat64(total) - utils.StrToFloat64(reduce.String())) + } else { // 折扣 + couponTotal = utils.Float64ToStr(utils.StrToFloat64(total) - utils.StrToFloat64(total)*utils.StrToFloat64(reduce.String())/10) + total = utils.Float64ToStr(utils.StrToFloat64(total) * utils.StrToFloat64(reduce.String()) / 10) + } + return total, couponTotal, nil +} + +func commGoods(c *gin.Context, arg md.OrderTotal) (totalPrice string) { + engine := MasterDb(c) + var totalPriceAmt float64 = 0 + for _, item := range arg.GoodsInfo { + goodsInterface, _, _ := db.GetComm(engine, &model.CommunityTeamGoods{Id: utils.StrToInt(item.GoodsId)}) + goodsModel := goodsInterface.(*model.CommunityTeamGoods) + var skuInterface interface{} + if item.SkuId != "-1" { + skuInterface, _, _ = db.GetComm(engine, &model.CommunityTeamSku{GoodsId: utils.StrToInt(item.GoodsId), SkuId: utils.StrToInt64(item.SkuId)}) + } else { + skuInterface, _, _ = db.GetComm(engine, &model.CommunityTeamSku{GoodsId: utils.StrToInt(item.GoodsId)}) + } + skuModel := skuInterface.(*model.CommunityTeamSku) + priceOne := goodsModel.Price + if item.SkuId != "-1" { + priceOne = skuModel.Price + } + totalPriceAmt += utils.StrToFloat64(priceOne) * utils.StrToFloat64(item.Num) + } + return utils.Float64ToStr(totalPriceAmt) + +} diff --git a/app/svc/svc_pay.go b/app/svc/svc_pay.go new file mode 100644 index 0000000..a888629 --- /dev/null +++ b/app/svc/svc_pay.go @@ -0,0 +1,21 @@ +package svc + +import ( + "applet/app/md" + "github.com/gin-gonic/gin" +) + +var PayFuncList = map[string]map[string]func(*gin.Context) (interface{}, error){ + md.CommunityTeam: { + md.BALANCE_PAY: BalanceCommunityTeam, + md.ALIPAY: AlipayCommunityTeam, + md.WX_PAY: WxPayCommunityTeam, + }, +} +var PayCallbackFuncList = map[string]map[string]func(*gin.Context){ + md.CommunityTeam: { + md.BALANCE_PAY: nil, + md.ALIPAY: AlipayCallbackCommunityTeam, + md.WX_PAY: WxPayCallbackCommunityTeam, + }, +} diff --git a/app/svc/svc_pay_community_team.go b/app/svc/svc_pay_community_team.go new file mode 100644 index 0000000..e88b408 --- /dev/null +++ b/app/svc/svc_pay_community_team.go @@ -0,0 +1,142 @@ +package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "applet/app/md" + "applet/app/utils" + "fmt" + "github.com/gin-gonic/gin" + "github.com/shopspring/decimal" + "math" + "math/rand" + "time" +) + +func BalanceCommunityTeam(c *gin.Context) (interface{}, error) { + + ord, err := CheckCommunityTeam(c) + if err != nil || ord == nil { + return nil, err + } + err = BalancePay(c, ord.Amount, utils.Int64ToStr(ord.Oid), md.CommunityTeam) + if err != nil { + return nil, err + } + // 回调 + CommonCallbackCommunityTeam(c, utils.AnyToString(ord.Oid), md.BALANCE_PAY) + return nil, nil +} +func AlipayCommunityTeam(c *gin.Context) (interface{}, error) { + ord, err := CheckCommunityTeam(c) + if err != nil { + return nil, err + } + payParams := &md.AliPayPayParams{ + Subject: "小店下单", + Amount: ord.Amount, + OrdId: utils.AnyToString(ord.Oid), + OrderType: md.CommunityTeam, + Uid: utils.IntToStr(ord.Uid), + } + r, err := PrepareAlipayCode(c, payParams) + if err != nil { + return nil, err + } + return r, nil +} +func WxPayCommunityTeam(c *gin.Context) (interface{}, error) { + var r interface{} + var err error + ord, err := CheckCommunityTeam(c) + if err != nil { + return nil, err + } + params := map[string]string{ + "subject": md.NeedPayPart[md.AggregationRecharge], + "amount": wxMoneyMulHundred(ord.Amount), + "order_type": md.AggregationRecharge, + "ord_id": utils.AnyToString(ord.Oid), + "pay_wx_mch_id": SysCfgGet(c, "pay_wx_mch_id"), + "pay_wx_api_key": SysCfgGet(c, "pay_wx_api_key"), + "uid": utils.IntToStr(ord.Uid), + } + params["notify_url"] = fmt.Sprintf(md.CALLBACK_URL, c.Request.Host, c.GetString("mid"), params["order_type"], md.WX_PAY) + r, err = CommPayData(c, params) + if err != nil { + return nil, err + } + + return r, nil +} +func AlipayCallbackCommunityTeam(c *gin.Context) { + orderId, err := AlipayCallback(c) + if err != nil || orderId == "" { + return + } + CommonCallbackCommunityTeam(c, orderId, md.ALIPAY) +} +func WxPayCallbackCommunityTeam(c *gin.Context) { + orderId, err := wxPayCallback(c) + if err != nil || orderId == "" { + return + } + CommonCallbackCommunityTeam(c, orderId, md.WX_PAY) +} + +// 微信金额乘100 +func wxMoneyMulHundred(m string) string { + amount, _ := decimal.NewFromString(m) + newM := amount.Mul(decimal.NewFromInt(100)) + return newM.String() +} +func CommonCallbackCommunityTeam(c *gin.Context, orderId string, payMethod string) { + ord := db.GetOrderEg(db.DBs[c.GetString("mid")], orderId) + if ord == nil { + return + } + // 判断是否失效 + if ord.State != 0 { + return + } + ord.State = 1 + ord.UpdateAt = time.Now() + ord.Code = Code() + ord.PayAt = time.Now() + ord.PayMethod = md.PayMethodIDs[payMethod] + MasterDb(c).Where("id=?", ord.Id).Cols("state,update_at,code,pay_at,pay_method").Update(ord) + return +} +func Code() string { + rand.Seed(time.Now().UnixNano()) + var digits = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") + b := make([]rune, 6) + for i := range b { + if fl := float64(rand.Intn(10)); fl > math.Log10(float64(i+1)) { + b[i] = digits[rand.Intn(len(digits))] + } else { + b[i] = digits[rand.Intn(10)] + } + } + fmt.Println(string(b)) + return string(b) +} +func CheckCommunityTeam(c *gin.Context) (*model.CommunityTeamOrder, error) { + var args struct { + MainOrdId string `json:"main_ord_id"` + } + if err := c.ShouldBindJSON(&args); err != nil || args.MainOrdId == "" { + return nil, e.NewErrCode(e.ERR_INVALID_ARGS) + } + // 查询订单 + ord := db.GetOrderEg(db.DBs[c.GetString("mid")], args.MainOrdId) + if ord == nil { + return nil, e.NewErr(403000, "不存在该订单") + } + // 判断是否失效 + if ord.State != 0 { + return nil, e.NewErr(403000, "订单已处理") + } + return ord, nil +} diff --git a/app/svc/svc_redis_mutex_lock.go b/app/svc/svc_redis_mutex_lock.go new file mode 100644 index 0000000..f35e0f9 --- /dev/null +++ b/app/svc/svc_redis_mutex_lock.go @@ -0,0 +1,100 @@ +package svc + +import ( + "applet/app/md" + "applet/app/utils" + "applet/app/utils/cache" + "errors" + "fmt" + "math/rand" + "reflect" + "time" +) + +const redisMutexLockExpTime = 15 + +// TryGetDistributedLock 分布式锁获取 +// requestId 用于标识请求客户端,可以是随机字符串,需确保唯一 +func TryGetDistributedLock(lockKey, requestId string, isNegative bool) bool { + if isNegative { // 多次尝试获取 + retry := 1 + for { + ok, err := cache.Do("SET", lockKey, requestId, "EX", redisMutexLockExpTime, "NX") + // 获取锁成功 + if err == nil && ok == "OK" { + return true + } + // 尝试多次没获取成功 + if retry > 10 { + return false + } + time.Sleep(time.Millisecond * time.Duration(rand.Intn(1000))) + retry += 1 + } + } else { // 只尝试一次 + ok, err := cache.Do("SET", lockKey, requestId, "EX", redisMutexLockExpTime, "NX") + // 获取锁成功 + if err == nil && ok == "OK" { + return true + } + + return false + } +} + +// ReleaseDistributedLock 释放锁,通过比较requestId,用于确保客户端只释放自己的锁,使用lua脚本保证操作的原子型 +func ReleaseDistributedLock(lockKey, requestId string) (bool, error) { + luaScript := ` + if redis.call("get",KEYS[1]) == ARGV[1] + then + return redis.call("del",KEYS[1]) + else + return 0 + end` + + do, err := cache.Do("eval", luaScript, 1, lockKey, requestId) + fmt.Println(reflect.TypeOf(do)) + fmt.Println(do) + + if utils.AnyToInt64(do) == 1 { + return true, err + } else { + return false, err + } +} + +func GetDistributedLockRequestId(prefix string) string { + return prefix + utils.IntToStr(rand.Intn(100000000)) +} + +// HandleBalanceDistributedLock 处理余额更新时获取锁和释放锁 如果加锁成功,使用语句 ` defer cb() ` 释放锁 +func HandleBalanceDistributedLock(masterId, uid, requestIdPrefix string) (cb func(), err error) { + // 获取余额更新锁 + balanceLockKey := fmt.Sprintf(md.UserFinValidUpdateLock, masterId, uid) + requestId := GetDistributedLockRequestId(requestIdPrefix) + balanceLockOk := TryGetDistributedLock(balanceLockKey, requestId, true) + if !balanceLockOk { + return nil, errors.New("系统繁忙,请稍后再试") + } + + cb = func() { + _, _ = ReleaseDistributedLock(balanceLockKey, requestId) + } + + return cb, nil +} + +func HandleLimiterDistributedLock(masterId, ip, requestIdPrefix string) (cb func(), err error) { + balanceLockKey := fmt.Sprintf(md.AppLimiterLock, masterId, ip) + requestId := GetDistributedLockRequestId(requestIdPrefix) + balanceLockOk := TryGetDistributedLock(balanceLockKey, requestId, true) + if !balanceLockOk { + return nil, errors.New("系统繁忙,请稍后再试") + } + + cb = func() { + _, _ = ReleaseDistributedLock(balanceLockKey, requestId) + } + + return cb, nil +} diff --git a/app/svc/svc_store.go b/app/svc/svc_store.go new file mode 100644 index 0000000..0ec26ab --- /dev/null +++ b/app/svc/svc_store.go @@ -0,0 +1,135 @@ +package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/e" + "applet/app/utils" + "github.com/gin-gonic/gin" + "time" +) + +func BankStore(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + arg["store_type"] = "0" + user, _ := GetDefaultUser(c, c.GetHeader("Authorization")) + var store = make([]map[string]string, 0) + if arg["cid"] == "2" { + store = db.GetStoreLike(MasterDb(c), arg) + } else { + store = db.GetStore(MasterDb(c), arg) + } + storeList := make([]map[string]interface{}, 0) + for _, v := range store { + if utils.StrToFloat64(v["km"]) < 1 { + v["km"] = utils.IntToStr(int(utils.StrToFloat64(v["km"])*1000)) + "m" + } else { + v["km"] += "km" + } + if utils.StrToFloat64(v["km"]) <= 0 { + v["km"] = "-" + } + tmp := map[string]interface{}{ + "lat": v["lat"], + "lng": v["lng"], + "address": v["address"], + "name": v["name"], + "id": v["id"], + "km": v["km"], + "time_str": v["timer"], + "phone": v["phone"], + "logo": v["logo"], + "is_like": "0", + "fan": "", + } + if user != nil { + count, _ := MasterDb(c).Where("uid=? and store_id=?", user.Info.Uid, v["id"]).Count(&model.CommunityTeamStoreLike{}) + if count > 0 { + tmp["is_like"] = "1" + } + } + storeList = append(storeList, tmp) + } + e.OutSuc(c, storeList, nil) + return +} +func Store(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + arg["store_type"] = "0" + + user, _ := GetDefaultUser(c, c.GetHeader("Authorization")) + store := db.GetStore(MasterDb(c), arg) + storeList := make([]map[string]interface{}, 0) + for _, v := range store { + if utils.StrToFloat64(v["km"]) < 1 { + v["km"] = utils.IntToStr(int(utils.StrToFloat64(v["km"])*1000)) + "m" + } else { + v["km"] += "km" + } + label := make([]string, 0) + tmp := map[string]interface{}{ + "lat": v["lat"], + "lng": v["lng"], + "address": v["address"], + "work_state": v["work_state"], + "name": v["name"], + "id": v["id"], + "km": v["km"], + "time_str": v["timer"], + "phone": v["phone"], + "label": label, + "is_like": "0", + } + if user != nil { + count, _ := MasterDb(c).Where("uid=? and store_id=?", user.Info.Uid, v["id"]).Count(&model.CommunityTeamStoreLike{}) + if count > 0 { + tmp["is_like"] = "1" + } + } + + storeList = append(storeList, tmp) + } + e.OutSuc(c, storeList, nil) + return +} +func StoreAddLike(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := GetUser(c) + count, _ := MasterDb(c).Where("uid=? and store_id=?", user.Info.Uid, arg["id"]).Count(&model.CommunityTeamStoreLike{}) + if count > 0 { + e.OutErr(c, 400, e.NewErr(400, "已收藏")) + return + } + var data = model.CommunityTeamStoreLike{ + Uid: user.Info.Uid, + StoreId: utils.StrToInt(arg["id"]), + Time: time.Now(), + } + MasterDb(c).Insert(&data) + e.OutSuc(c, "success", nil) + return +} + +func StoreCancelLike(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := GetUser(c) + MasterDb(c).Where("uid=? and store_id=?", user.Info.Uid, arg["id"]).Delete(&model.CommunityTeamStoreLike{}) + e.OutSuc(c, "success", nil) + return +} diff --git a/app/svc/svc_store_order.go b/app/svc/svc_store_order.go new file mode 100644 index 0000000..79cc221 --- /dev/null +++ b/app/svc/svc_store_order.go @@ -0,0 +1,277 @@ +package svc + +import ( + "applet/app/db" + "applet/app/e" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/cache" + "encoding/json" + "fmt" + "github.com/gin-gonic/gin" + "time" +) + +func StoreOrderCate(c *gin.Context) { + var cate = []map[string]string{ + {"name": "全部", "value": ""}, + {"name": "待付款", "value": "0"}, + {"name": "待提货", "value": "1"}, + {"name": "已完成", "value": "2"}, + {"name": "已取消", "value": "3"}, + } + e.OutSuc(c, cate, nil) + return +} +func StoreOrderList(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := GetUser(c) + arg["store_uid"] = utils.IntToStr(user.Info.Uid) + data := db.GetOrderList(MasterDb(c), arg) + var state = []string{"待付款", "待提货", "已完成", "已取消"} + list := make([]map[string]interface{}, 0) + if data != nil { + now := time.Now().Unix() + for _, v := range *data { + store := db.GetStoreIdEg(MasterDb(c), utils.IntToStr(v.StoreUid)) + info := db.GetOrderInfoAllEg(MasterDb(c), utils.Int64ToStr(v.Oid)) + downTime := "0" + if v.State == 0 { + downTime = utils.IntToStr(int(v.CreateAt.Unix() + 15*60 - now)) + if now > v.CreateAt.Unix()+15*60 { + v.State = 3 + } + if utils.StrToInt(downTime) < 0 { + downTime = "0" + } + } + storeName := "" + if store != nil { + storeName = store.Name + } + goodsInfo := make([]map[string]string, 0) + if info != nil { + for _, v1 := range *info { + skuData := make([]md.Sku, 0) + json.Unmarshal([]byte(v1.SkuInfo), &skuData) + skuStr := "" + for _, v2 := range skuData { + if skuStr != "" { + skuStr += ";" + } + skuStr += v2.Value + } + if skuStr != "" { + skuStr = "(" + skuStr + ")" + } + tmp := map[string]string{ + "title": v1.Title + skuStr, + "num": utils.IntToStr(v1.Num), + "img": v1.Img, + } + goodsInfo = append(goodsInfo, tmp) + } + } + user1, _ := db.UserFindByID(MasterDb(c), v.Uid) + userProfile, _ := db.UserProfileFindByID(MasterDb(c), v.Uid) + nickname := "" + headImg := "" + if userProfile != nil { + headImg = userProfile.AvatarUrl + } + if user1 != nil { + if user1.Nickname != user1.Phone { + user1.Nickname += " " + user1.Phone + } + nickname = user1.Nickname + } + tmp := map[string]interface{}{ + "goods_info": goodsInfo, + "oid": utils.Int64ToStr(v.Oid), + "label": "自提", + "state": utils.IntToStr(v.State), + "state_str": state[v.State], + "store_name": storeName, + "coupon": v.Coupon, + "username": nickname, + "head_img": headImg, + "amount": v.Amount, + "num": utils.IntToStr(v.Num), + "timer": "", + "down_time": downTime, + "create_at": v.CreateAt.Format("2006-01-02 15:04:05"), + "pay_at": "", + "confirm_at": "", + } + if v.PayAt.IsZero() == false { + tmp["pay_at"] = v.PayAt.Format("2006-01-02 15:04:05") + } + if v.ConfirmAt.IsZero() == false { + tmp["confirm_at"] = v.ConfirmAt.Format("2006-01-02 15:04:05") + } + if v.Type == 1 { + tmp["label"] = "外卖" + } + if v.IsNow == 1 { + tmp["timer"] = "立即提货" + } else if v.Timer != "" { + tmp["timer"] = v.Timer + } + list = append(list, tmp) + } + } + e.OutSuc(c, list, nil) + return +} +func StoreOrderDetail(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + data := db.GetOrderEg(MasterDb(c), arg["oid"]) + var state = []string{"待付款", "待提货", "已完成", "已取消"} + now := time.Now().Unix() + downTime := "0" + if data.State == 0 { + downTime = utils.IntToStr(int(data.CreateAt.Unix() + 15*60 - now)) + if now > data.CreateAt.Unix()+15*60 { + data.State = 3 + } + if utils.StrToInt(downTime) < 0 { + downTime = "0" + } + } + img := "" + title := "" + confirmAt := "" + if data.ConfirmAt.IsZero() == false { + confirmAt = data.ConfirmAt.Format("2006-01-02 15:04:05") + } + payAt := "" + if data.PayAt.IsZero() == false { + payAt = data.PayAt.Format("2006-01-02 15:04:05") + } + timer := "" + if data.IsNow == 1 { + timer = "立即提货" + } else if data.Timer != "" { + timer = data.Timer + } + orderInfo := []map[string]string{ + {"title": "订单编号", "content": utils.Int64ToStr(data.Oid)}, + {"title": "提货码", "content": data.Code}, + {"title": "下单时间", "content": data.CreateAt.Format("2006-01-02 15:04:05")}, + {"title": "付款时间", "content": payAt}, + {"title": "预计提货时间", "content": timer}, + {"title": "提货时间", "content": confirmAt}, + {"title": "预留电话", "content": data.Phone}, + {"title": "备注信息", "content": data.Memo}, + } + goodsInfo := make([]map[string]string, 0) + info := db.GetOrderInfoAllEg(MasterDb(c), utils.Int64ToStr(data.Oid)) + if info != nil { + for _, v := range *info { + tmp := map[string]string{ + "img": v.Img, + "title": v.Title, + "price": v.Price, + "num": utils.IntToStr(v.Num), + "sku_str": "", + } + skuData := make([]md.Sku, 0) + json.Unmarshal([]byte(v.SkuInfo), &skuData) + skuStr := "" + for _, v1 := range skuData { + if skuStr != "" { + skuStr += ";" + } + skuStr += v1.Value + } + tmp["sku_str"] = skuStr + goodsInfo = append(goodsInfo, tmp) + } + } + user1, _ := db.UserFindByID(MasterDb(c), data.Uid) + userProfile, _ := db.UserProfileFindByID(MasterDb(c), data.Uid) + nickname := "" + headImg := "" + if userProfile != nil { + headImg = userProfile.AvatarUrl + } + if user1 != nil { + if user1.Nickname != user1.Phone { + user1.Nickname += " " + user1.Phone + } + nickname = user1.Nickname + } + tmp := map[string]interface{}{ + "oid": utils.Int64ToStr(data.Oid), + "label": "自提", + "username": nickname, + "head_img": headImg, + "state": utils.IntToStr(data.State), + "state_str": state[data.State], + "img": img, + "title": title, + "amount": data.Amount, + "all_amount": utils.Float64ToStr(utils.StrToFloat64(data.Amount) + utils.StrToFloat64(data.Coupon)), + "coupon": data.Coupon, + "num": utils.IntToStr(data.Num), + "code": data.Code, + "down_time": downTime, + "order_info": orderInfo, + "goods_info": goodsInfo, + "goods_count": utils.IntToStr(len(goodsInfo)), + } + if data.Type == 1 { + tmp["label"] = "外卖" + } + e.OutSuc(c, tmp, nil) + return +} +func StoreOrderConfirm(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + // 加锁 防止并发提取 + mutexKey := fmt.Sprintf("%s:team.StoreOrderConfirm:%s", c.GetString("mid"), arg["oid"]) + withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX") + if err != nil { + e.OutErr(c, e.ERR, err) + return + } + if withdrawAvailable != "OK" { + e.OutErr(c, e.ERR, e.NewErr(400000, "请求过于频繁,请稍后再试")) + return + } + sess := MasterDb(c).NewSession() + defer sess.Close() + sess.Begin() + order := db.GetOrder(sess, arg["oid"]) + if order == nil { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单不存在")) + return + } + if order.State != 1 { + sess.Rollback() + e.OutErr(c, 400, e.NewErr(400, "订单不能确认")) + return + } + order.State = 2 + order.UpdateAt = time.Now() + update, err := sess.Where("id=?", order.Id).Cols("state,update_at").Update(order) + if update == 0 || err != nil { + e.OutErr(c, 400, e.NewErr(400, "订单确认失败")) + return + } + e.OutSuc(c, "success", nil) + return +} diff --git a/app/svc/svc_sys_cfg_get.go b/app/svc/svc_sys_cfg_get.go new file mode 100644 index 0000000..976a7a3 --- /dev/null +++ b/app/svc/svc_sys_cfg_get.go @@ -0,0 +1,218 @@ +package svc + +import ( + "applet/app/md" + "errors" + "github.com/gin-gonic/gin" + "strings" + "xorm.io/xorm" + + "applet/app/cfg" + "applet/app/db" + + "applet/app/utils" + "applet/app/utils/cache" +) + +// 单挑记录获取 +func SysCfgGet(c *gin.Context, key string) string { + mid := c.GetString("mid") + eg := db.DBs[mid] + return db.SysCfgGetWithDb(eg, mid, key) +} + +// 多条记录获取 +func SysCfgFind(c *gin.Context, keys ...string) map[string]string { + var masterId string + if c == nil { + masterId = "" + } else { + masterId = c.GetString("mid") + } + tmp := SysCfgFindComm(masterId, keys...) + return tmp +} + +// SysCfgGetByMasterId get one config by master id +func SysCfgGetByMasterId(masterId, key string) string { + res := SysCfgFindComm(masterId, key) + if _, ok := res[key]; !ok { + return "" + } + return res[key] +} + +// SysCfgFindComm get cfg by master id +func SysCfgFindComm(masterId string, keys ...string) map[string]string { + var eg *xorm.Engine + if masterId == "" { + eg = db.Db + } else { + eg = db.DBs[masterId] + } + res := map[string]string{} + //TODO::判断keys长度(大于10个直接查数据库) + if len(keys) > 10 { + cfgList, _ := db.SysCfgGetAll(eg) + if cfgList == nil { + return nil + } + for _, v := range *cfgList { + res[v.Key] = v.Val + } + } else { + for _, key := range keys { + res[key] = db.SysCfgGetWithDb(eg, masterId, key) + } + } + return res +} + +// 多条记录获取 +func EgSysCfgFind(keys ...string) map[string]string { + var e *xorm.Engine + res := map[string]string{} + if len(res) == 0 { + cfgList, _ := db.SysCfgGetAll(e) + if cfgList == nil { + return nil + } + for _, v := range *cfgList { + res[v.Key] = v.Val + } + // 先不设置缓存 + // cache.SetJson(md.KEY_SYS_CFG_CACHE, res, 60) + } + if len(keys) == 0 { + return res + } + tmp := map[string]string{} + for _, v := range keys { + if val, ok := res[v]; ok { + tmp[v] = val + } else { + tmp[v] = "" + } + } + return tmp +} + +// 清理系统配置信息 +func SysCfgCleanCache() { + cache.Del(md.KEY_SYS_CFG_CACHE) +} + +// 写入系统设置 +func SysCfgSet(c *gin.Context, key, val, memo string) bool { + cfg, err := db.SysCfgGetOne(db.DBs[c.GetString("mid")], key) + if err != nil || cfg == nil { + return db.SysCfgInsert(db.DBs[c.GetString("mid")], key, val, memo) + } + if memo != "" && cfg.Memo != memo { + cfg.Memo = memo + } + SysCfgCleanCache() + return db.SysCfgUpdate(db.DBs[c.GetString("mid")], key, val, cfg.Memo) +} + +// 多条记录获取 +func SysCfgFindByIds(eg *xorm.Engine, keys ...string) map[string]string { + key := utils.Md5(eg.DataSourceName() + md.KEY_SYS_CFG_CACHE) + res := map[string]string{} + c, ok := cfg.MemCache.Get(key).(map[string]string) + if !ok || len(c) == 0 { + cfgList, _ := db.DbsSysCfgGetAll(eg) + if cfgList == nil { + return nil + } + for _, v := range *cfgList { + res[v.Key] = v.Val + } + cfg.MemCache.Put(key, res, 10) + } else { + res = c + } + if len(keys) == 0 { + return res + } + tmp := map[string]string{} + for _, v := range keys { + if val, ok := res[v]; ok { + tmp[v] = val + } else { + tmp[v] = "" + } + } + return tmp +} + +// 多条记录获取 +func SysCfgFindByIdsToCache(eg *xorm.Engine, dbName string, keys ...string) map[string]string { + key := utils.Md5(dbName + md.KEY_SYS_CFG_CACHE) + res := map[string]string{} + c, ok := cfg.MemCache.Get(key).(map[string]string) + if !ok || len(c) == 0 { + cfgList, _ := db.DbsSysCfgGetAll(eg) + if cfgList == nil { + return nil + } + for _, v := range *cfgList { + res[v.Key] = v.Val + } + cfg.MemCache.Put(key, res, 1800) + } else { + res = c + } + if len(keys) == 0 { + return res + } + tmp := map[string]string{} + for _, v := range keys { + if val, ok := res[v]; ok { + tmp[v] = val + } else { + tmp[v] = "" + } + } + return tmp +} + +// 支付配置 +func SysCfgFindPayment(c *gin.Context) ([]map[string]string, error) { + platform := c.GetHeader("platform") + payCfg := SysCfgFind(c, "pay_wx_pay_img", "pay_ali_pay_img", "pay_balance_img", "pay_type") + if payCfg["pay_wx_pay_img"] == "" || payCfg["pay_ali_pay_img"] == "" || payCfg["pay_balance_img"] == "" || payCfg["pay_type"] == "" { + return nil, errors.New("lack of payment config") + } + payCfg["pay_wx_pay_img"] = ImageFormat(c, payCfg["pay_wx_pay_img"]) + payCfg["pay_ali_pay_img"] = ImageFormat(c, payCfg["pay_ali_pay_img"]) + payCfg["pay_balance_img"] = ImageFormat(c, payCfg["pay_balance_img"]) + + var result []map[string]string + + if strings.Contains(payCfg["pay_type"], "aliPay") && platform != md.PLATFORM_WX_APPLET { + item := make(map[string]string) + item["pay_channel"] = "alipay" + item["img"] = payCfg["pay_ali_pay_img"] + item["name"] = "支付宝支付" + result = append(result, item) + } + + if strings.Contains(payCfg["pay_type"], "wxPay") { + item := make(map[string]string) + item["pay_channel"] = "wx" + item["img"] = payCfg["pay_wx_pay_img"] + item["name"] = "微信支付" + result = append(result, item) + } + + if strings.Contains(payCfg["pay_type"], "walletPay") { + item := make(map[string]string) + item["pay_channel"] = "fin" + item["img"] = payCfg["pay_balance_img"] + item["name"] = "余额支付" + result = append(result, item) + } + + return result, nil +} diff --git a/app/svc/svc_wx.go b/app/svc/svc_wx.go new file mode 100644 index 0000000..c551fbf --- /dev/null +++ b/app/svc/svc_wx.go @@ -0,0 +1,103 @@ +package svc + +import ( + "applet/app/db" + "applet/app/e" + "applet/app/md" + "applet/app/utils/logx" + "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay" + "github.com/gin-gonic/gin" + "strings" +) + +// 微信支付回调处理 +func wxPayCallback(c *gin.Context) (string, error) { + data, ok := c.Get("callback") + if data == nil || !ok { + return "", e.NewErrCode(e.ERR_INVALID_ARGS) + } + args := data.(*md.WxPayCallback) + _, ok = db.DBs[args.MasterID] + if !ok { + return "", logx.Warn("wxpay Failed : master_id not found") + } + c.Set("mid", args.MasterID) + //回调交易状态失败 + if args.ResultCode != "SUCCESS" || args.ReturnCode != "SUCCESS" { + return "", logx.Warn("wxpay Failed : trade status failed") + } + return args.OutTradeNo, nil +} +func CommPayData(c *gin.Context, params map[string]string) (interface{}, error) { + platform := c.GetHeader("Platform") + browser := c.GetHeader("browser") + var r interface{} + var err error + switch platform { + case md.PLATFORM_WX_APPLET: + params = WxMiniProgPayConfig(c, params) + r, err = pay.WxMiniProgPay(params) + case md.PLATFORM_WAP: + if strings.Contains(browser, "wx_pay_browser") { + params = WxJsApiConfig(c, params) + r, err = pay.WxAppJSAPIPay(params) + } else { + params = WxH5PayConfig(c, params) + r, err = pay.WxH5Pay(params) + } + case md.PLATFORM_ANDROID, md.PLATFORM_IOS, md.PLATFORM_JSAPI: + params = WxAPPConfig(c, params) + r, err = pay.WxAppPay(params) + default: + return nil, e.NewErrCode(e.ERR_PLATFORM) + } + if err != nil { + return nil, err + } + + return r, nil +} +func WxH5PayConfig(c *gin.Context, params map[string]string) map[string]string { + params["pay_wx_appid"] = SysCfgGet(c, "wx_official_account_app_id") + return params +} +func WxAPPConfig(c *gin.Context, params map[string]string) map[string]string { + params["pay_wx_appid"] = SysCfgGet(c, "pay_wx_appid") + return params +} + +// 小程序v2 +func WxMiniProgPayConfig(c *gin.Context, params map[string]string) map[string]string { + //读取小程序设置的 + wxAppletCfg := db.GetAppletKey(c, MasterDb(c)) + params["pay_wx_appid"] = wxAppletCfg["app_id"] + // 兼容未登录支付 api/v1/unlogin/pay/:payMethod/:orderType(因为该路由未经过jwt-auth中间件) + user, err := CheckUser(c) + if user == nil || err != nil { + return params + } + if c.GetHeader("openid") != "" { //前端会传过来 + user.Profile.ThirdPartyWechatMiniOpenid = c.GetHeader("openid") + } + if user.Profile.ThirdPartyWechatMiniOpenid == "" { + return params + } + params["third_party_wechat_openid"] = user.Profile.ThirdPartyWechatMiniOpenid + return params +} +func WxJsApiConfig(c *gin.Context, params map[string]string) map[string]string { + params["pay_wx_appid"] = SysCfgGet(c, "wx_official_account_app_id") + // 兼容未登录支付 api/v1/unlogin/pay/:payMethod/:orderType(因为该路由未经过jwt-auth中间件) + user, err := CheckUser(c) + if user == nil || err != nil { + return params + } + if c.GetHeader("openid") != "" { //前端会传过来 + user.Profile.ThirdPartyWechatH5Openid = c.GetHeader("openid") + } + if user.Profile.ThirdPartyWechatH5Openid == "" { + return params + } + params["third_party_wechat_openid"] = user.Profile.ThirdPartyWechatH5Openid + return params +} diff --git a/app/task/init.go b/app/task/init.go new file mode 100644 index 0000000..c35f775 --- /dev/null +++ b/app/task/init.go @@ -0,0 +1,300 @@ +package task + +import ( + "github.com/robfig/cron/v3" + "time" + + "applet/app/cfg" + "applet/app/db" + "applet/app/db/model" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/logx" + "xorm.io/xorm" +) + +var ( + timer *cron.Cron + jobs = map[string]func(*xorm.Engine, string){} + baseEntryId cron.EntryID + entryIds []cron.EntryID + taskCfgList map[string]*[]model.SysCfg + ch = make(chan int, 50) + workerNum = 50 // 智盟跟单并发数量 + orderStatWorkerNum = 50 // 智盟跟单并发数量 + tbagoworkerNum = 50 // 智盟跟单并发数量 + tbsettleworkerNum = 50 // 智盟跟单并发数量 + pddOrderWorkerNum = 50 // 拼多多跟单并发数量 + orderSuccessWorkerNum = 50 // + tbOrderWorkerNum = 50 // 淘宝跟单并发数量 + jdOrderWorkerNum = 50 // 京东跟单并发数量 + wphOrderWorkerNum = 50 // 唯品会跟单并发数量 + cardWorkerNum = 20 // 权益卡并发数量 + tbRelationWorkerNum = 50 // 淘宝并发数量 + hw365WorkerNum = 50 // 海威并发数量 + hw365TourismWorkerNum = 50 // 海威并发数量 + tbpubWorkerNum = 50 // 海威并发数量 + liveWorkerNum = 50 // 海威并发数量 + tikTokOwnWorkerNum = 50 // 海威并发数量 + cardUpdateWorkerNum = 50 // 海威并发数量 + lifeWorkerNum = 50 //生活服务跟单 + pddWorkerNum = 50 // + oilWorkerNum = 50 // + otherWorkerNum = 50 // 淘宝, 苏宁, 考拉并发量 + jdWorkerNum = 50 // + tikTokWorkerNum = 50 // + teamGoodsWorkerNum = 50 + jdCh = make(chan int, 50) + jdWorkerNum1 = 50 // + orderStatCh = make(chan int, 50) + jdCh1 = make(chan int, 50) + oilCh = make(chan int, 50) + otherCh = make(chan int, 50) + otherTourismCh = make(chan int, 50) + liveOtherCh = make(chan int, 50) + teamGoodsCh = make(chan int, 50) + tikTokOwnOtherCh = make(chan int, 50) + cardUpdateCh = make(chan int, 50) + tbpubCh = make(chan int, 50) + cardCh = make(chan int, 20) + pddCh = make(chan int, 50) + tikTokCh = make(chan int, 50) + tbRefundCh = make(chan int, 50) + tbagodCh = make(chan int, 50) + tbsettleCh = make(chan int, 50) + pddFailCh = make(chan int, 50) + orderSuccessCh = make(chan int, 50) + tbRelationCh = make(chan int, 50) +) + +func Init() { + // 初始化任务列表 + initTasks() + var err error + timer = cron.New() + if baseEntryId, err = timer.AddFunc("@every 20m", reload); err != nil { + _ = logx.Fatal(err) + } +} + +func Run() { + reload() + timer.Start() + _ = logx.Info("auto tasks running...") +} + +func reload() { + // 重新初始化数据库 + db.InitMapDbs(cfg.DB, cfg.Prd) + + if len(taskCfgList) == 0 { + taskCfgList = map[string]*[]model.SysCfg{} + } + + // 获取所有站长的配置信息 + for dbName, v := range db.DBs { + if conf := db.MapCrontabCfg(v); conf != nil { + if cfg.Debug { + dbInfo := md.SplitDbInfo(v) + // 去掉模版库 + if dbName == "000000" { + continue + } + _ = logx.Debugf("【MasterId】%s, 【Host】%s, 【Name】%s, 【User】%s, 【prd】%v, 【Task】%v\n", dbName, dbInfo.Host, dbInfo.Name, dbInfo.User, cfg.Prd, utils.SerializeStr(*conf)) + } + taskCfgList[dbName] = conf + } + } + if len(taskCfgList) > 0 { + // 删除原有所有任务 + if len(entryIds) > 0 { + for _, v := range entryIds { + if v != baseEntryId { + timer.Remove(v) + } + } + entryIds = nil + } + var ( + entryId cron.EntryID + err error + ) + // 添加任务 + for dbName, v := range taskCfgList { + for _, vv := range *v { + if _, ok := jobs[vv.Key]; ok && vv.Val != "" { + // fmt.Println(vv.Val) + if entryId, err = timer.AddFunc(vv.Val, doTask(dbName, vv.Key)); err == nil { + entryIds = append(entryIds, entryId) + } + } + } + } + + } +} + +func doTask(dbName, fnName string) func() { + return func() { + begin := time.Now().Local() + jobs[fnName](db.DBs[dbName], dbName) + end := time.Now().Local() + logx.Infof( + "[%s] AutoTask <%s> started at <%s>, ended at <%s> duration <%s>", + dbName, + fnName, + begin.Format("2006-01-02 15:04:05.000"), + end.Format("2006-01-02 15:04:05.000"), + time.Duration(end.UnixNano()-begin.UnixNano()).String(), + ) + } +} + +// 增加自动任务队列 +func initTasks() { + //v2 + //jobs[md.KEY_CFG_CRON_BUCKLE] = taskOrderBuckle // + //jobs[md.KEY_CFG_CRON_CHECK_BUCKLE_ORDER] = taskCheckBuckleOrder // + //jobs[md.KEY_CFG_CRON_USER_RELATE] = taskUserRelate // + + //v3 + //jobs[md.KEY_CFG_CRON_TB12] = taskOrderTaobao12 //淘宝抓单 + //jobs[md.KEY_CFG_CRON_TBBYAGOTIME] = taskAgoOrderTB //用于恢复个别时间丢单的 + //jobs[md.KEY_CFG_CRON_TB_PUNISH_REFUND] = taskTbPunishOrderRefund //淘宝退款订单处理 + //jobs[md.KEY_CFG_CRON_TBREFUND] = taskTbOrderRefund //淘宝退款订单处理 + //jobs[md.KEY_CFG_CRON_PUBLISHER_RELATION] = taskTaobaoPublisherRelation //获取渠道信息 + //jobs[md.KEY_CFG_CRON_PUBLISHER_RELATION_NEW] = taskTaobaoPublisherRelationNew //获取渠道信息 + //jobs[md.KEY_CFG_CRON_TBSETTLEORDER] = taskOrderTaobaoSettleOrder //淘宝抓单结算订单 + + //v4 + //jobs[md.KEY_CFG_CRON_PDD_SUCC] = taskOrderPddSucc + //jobs[md.KEY_CFG_CRON_PDDBYSTATUS] = taskOrderPddStatus + //jobs[md.KEY_CFG_CRON_PDDBYSTATUSSUCCESS] = taskOrderPddStatusSuccess + //jobs[md.KEY_CFG_CRON_PDDBYSTATUSFAIL] = taskOrderPddStatusFail + //jobs[md.KEY_CFG_CRON_PDDBYLOOPTIME] = taskLoopOrderPdd //拼多多创建时间循环当天 + //jobs[md.KEY_CFG_CRON_PDDREFUND] = taskPddOrderRefund //拼多多退款订单处理 + //jobs[md.KEY_CFG_CRON_PDDBYAGOTIME] = taskAgoOrderPdd //用于恢复个别时间丢单的 + //jobs[md.KEY_CFG_CRON_PDDBYCREATETIME] = taskOrderPddByCreateTime //拼多多创建时间跟踪订单 + //jobs[md.KEY_CFG_CRON_PDD] = taskOrderPdd + + //v5-guide-settle + //jobs[md.KEY_CFG_CRON_SETTLE] = taskOrderSettle // 结算 + //v5 + //jobs[md.KEY_CFG_CRON_FREE_SETTLE] = taskOrderFreeSettle // 结算 + //jobs[md.KEY_CFG_CRON_SECOND_FREE_SETTLE] = taskOrderSecondFreeSettle // 结算 + //jobs[md.KEY_CFG_CRON_THIRD_FREE_SETTLE] = taskOrderMoreFreeSettle // 结算 + //jobs[md.KEY_CFG_CRON_AGGREGATION_RECHARGE_SETTLE] = taskAggregationRechargeSettle // + //jobs[md.KEY_CFG_CRON_PLAYLET_SETTLE] = taskAggregationPlaylet // + //jobs[md.KEY_CFG_CRON_DUOYOUORD_SETTLE] = taskDuoYouSettle // + //jobs[md.KEY_CFG_CRON_LIANLIAN_SETTLE] = taskLianlianSettle // + //jobs[md.KEY_CFG_CRON_SWIPE_SETTLE] = taskSwipeSettle // + //jobs[md.KEY_CFG_CRON_USER_LV_UP_SETTLE] = taskUserLvUpOrderSettle // 会员费订单结算 + //jobs[md.KEY_CFG_CRON_PRIVILEGE_CARD_SETTLE] = taskPrivilegeCardOrderSettle // 权益卡订单结算 + //jobs[md.KEY_CFG_CRON_ACQUISITION_CONDITION] = taskAcquisitionCondition + //jobs[md.KEY_CFG_CRON_ACQUISITION_CONDITION_BY_LV] = taskAcquisitionConditionByLv + //jobs[md.KEY_CFG_CRON_ACQUISITION_REWARD] = taskAcquisitionReward + //jobs[md.KEY_CFG_CRON_NEW_ACQUISTION_SETTLE] = taskNewAcquisition // 拉新 + //jobs[md.KEY_CFG_CRON_ACQUISTION_SETTLE] = taskAcquisition // 拉新 + //jobs[md.KEY_CFG_VERIFY] = taskVerify //团长 + + //v7 + //jobs[md.KEY_CFG_CRON_JD] = taskOrderJd + //jobs[md.KEY_CFG_CRON_JDFAILBYCREATETIME] = taskOrderJDFailByCreateTime //拼多多创建时间跟踪订单 + //jobs[md.KEY_CFG_CRON_JDBYCREATETIME] = taskOrderJDByCreateTime //拼多多创建时间跟踪订单 + //jobs[md.KEY_CFG_CRON_JDBYSUCCESS] = taskOrderJDBySuccess //拼多多创建时间跟踪订单 + //jobs[md.KEY_CFG_CRON_ORDER_SUCCESS_CHECK] = taskOrderSuccessCheck // + //jobs[md.KEY_CFG_CRON_JDBYSTATUS] = taskOrderJdStatus + //jobs[md.KEY_CFG_CRON_JDREFUND] = taskJdOrderRefund //京东退款订单处理 + + //v6 + jobs[md.KEY_CFG_CRON_TIKTOKLIFE] = taskOrderTikTokLife //抖音本地生活 + jobs[md.KEY_CFG_KUAISHOU_AUTH] = taskKuaishouAuth //团长 + jobs[md.KEY_CFG_TIK_TOK_TEAM_ORDER_PAY] = taskTikTokTeamOrder //团长 + jobs[md.KEY_CFG_TIK_TOK_TEAM_ORDER_UPDATE] = taskTikTokTeamOrderUpdate //团长 + jobs[md.KEY_CFG_TIK_TOK_TEAM_USER_BIND_BUYINID] = taskTikTokTeamUserBindBuyinid //达人buyin_id + jobs[md.KEY_CFG_KUAISHOU_TEAM_ORDER_PAY] = taskKuaishouTeamOrder //团长 + jobs[md.KEY_CFG_KUAISHOU_TEAM_ORDER_UPDATE] = taskKuaishouTeamOrderUpdate //团长 + jobs[md.KEY_CFG_CRON_AUTO_ADD_TIKTOK_GOODS] = taskAutoAddTikTokGoods // + jobs[md.KEY_CFG_CRON_KuaishouOwn] = taskOrderKuaishouOwn // + jobs[md.KEY_CFG_CRON_KuaishouOwnCreate] = taskOrderKuaishouOwnCreate // + jobs[md.KEY_CFG_CRON_KUAISHOU] = taskOrderKuaishou // + jobs[md.KEY_CFG_CRON_KUAISHOULIVE] = taskOrderKuaishouLive // + jobs[md.KEY_CFG_CRON_TIKTOKCsjp] = taskOrderTIKTokCsjp // + jobs[md.KEY_CFG_CRON_TIKTOKCsjpLive] = taskOrderTIKTokCsjpLive // + jobs[md.KEY_CFG_CRON_TIKTOKOwnCsjp] = taskOrderTIKTokOwnCsjp // + jobs[md.KEY_CFG_CRON_TIKTOKOwnCsjpLive] = taskOrderTIKTokOwnCsjpLive // + jobs[md.KEY_CFG_CRON_TIKTOKOwnCsjpActivity] = taskOrderTIKTokOwnCsjpActivity // + jobs[md.KEY_CFG_CRON_KUAISHOUOFFICIAL] = taskOrderKuaishouOfficial // + jobs[md.KEY_CFG_CRON_KUAISHOUOFFICIALLive] = taskOrderKuaishouOfficialLive // + + //v8 + //jobs[md.KEY_CFG_CRON_MEITUANLM_START] = taskOrderMeituanLmStart //智盟返回的美团联盟 + //jobs[md.KEY_CFG_CRON_MEITUAN_START] = taskOrderMeituanStart //智盟返回的美团联盟 + //jobs[md.KEY_CFG_CRON_MEITUAN] = taskOrderMeituan + //jobs[md.KEY_CFG_CRON_MEITUANLM] = taskOrderMeituanLm //智盟返回的美团联盟 + //jobs[md.KEY_CFG_CRON_STATIONMEITUANLM] = taskOrderStationMeituanLm //站长自己美团联盟 + //jobs[md.KEY_CFG_CRON_MEITUANOFFICIAL] = taskOrderMeituanOfficial //站长自己美团联盟 + + //v9 + //jobs[md.KEY_CFG_CRON_ELM] = taskOrderElm // + //jobs[md.KEY_CFG_CRON_HEYTEA] = taskOrderHeytea //海威365喜茶 + //jobs[md.KEY_CFG_CRON_PIZZA] = taskOrderPizza //海威365 + //jobs[md.KEY_CFG_CRON_WALLACE] = taskOrderWallace //海威365 + //jobs[md.KEY_CFG_CRON_TOURISM] = taskOrderTourism //海威365 + //jobs[md.KEY_CFG_CRON_FLOWERCAKE] = taskOrderFlowerCake //海威365 + //jobs[md.KEY_CFG_CRON_DELIVERY] = taskOrderDelivery //海威365 + //jobs[md.KEY_CFG_CRON_BURGERKING] = taskOrderBurgerKing //海威365汉堡王 + //jobs[md.KEY_CFG_CRON_STARBUCKS] = taskOrderStarbucks //海威365星巴克 + //jobs[md.KEY_CFG_CRON_MCDONALD] = taskOrderMcdonald //海威365麦当劳 + //jobs[md.KEY_CFG_CRON_HWMOVIE] = taskOrderHwMovie //海威365电影票 + //jobs[md.KEY_CFG_CRON_NAYUKI] = taskOrderNayuki //海威365奈雪 + //jobs[md.KEY_CFG_CRON_TO_KFC] = taskOrderToKfc //海威365 + //jobs[md.KEY_CFG_CRON_PAGODA] = taskOrderPagoda //海威365 + //jobs[md.KEY_CFG_CRON_LUCKIN] = taskOrderLuckin //海威365 + + //v10 + + ////jobs[md.KEY_CFG_CRON_WPHREFUND] = taskWphOrderRefund //唯品会退款订单处理 + ////jobs[md.KEY_CFG_CRON_VIP] = taskOrderVip + //jobs[md.KEY_CFG_CRON_KFC] = taskOrderKfc + //jobs[md.KEY_CFG_CRON_CINEMA] = taskOrderCinema + //jobs[md.KEY_CFG_CRON_DUOMAI] = taskOrderDuomai //多麦跟单 + //jobs[md.KEY_CFG_CRON_PLAYLET_ORDER] = taskPlayletOrder + //jobs[md.KEY_CFG_CRON_DIDI_ENERGY] = taskOrderDidiEnergy //滴滴加油 + //jobs[md.KEY_CFG_CRON_T3_CAR] = taskOrderT3Car //T3打车 + //jobs[md.KEY_CFG_CRON_DIDI_ONLINE_CAR] = taskOrderDidiOnlineCar //滴滴网约车 + //jobs[md.KEY_CFG_CRON_KING_FLOWER] = taskOrderKingFlower //滴滴网约车 + //jobs[md.KEY_CFG_CRON_DIDI_FREIGHT] = taskOrderDidiFreight //滴滴货运 + //jobs[md.KEY_CFG_CRON_DIDI_CHAUFFEUR] = taskOrderDidiChauffeur //滴滴代驾 + //jobs[md.KEY_CFG_CRON_OILSTATION] = taskOrderOilstation + //jobs[md.KEY_CFG_CRON_BRIGHTOILSTATION] = taskOrderBrightOilstation + //jobs[md.KEY_CFG_CRON_SN] = taskOrderSuning + //jobs[md.KEY_CFG_CRON_KL] = taskOrderKaola + + ////原来的 + //jobs[md.KEY_CFG_CRON_PlayLet_Total] = taskPlayletTotal // + //jobs[md.KEY_CFG_CRON_CHECK_GUIDE_STORE_ORDER] = taskCheckGuideStoreOrder // + //jobs[md.KEY_CFG_CRON_FAST_REFUND] = taskOrderFastRefund // + //jobs[md.KEY_CFG_CRON_FAST_SUCCESS] = taskOrderFastSuccess // + //jobs[md.KEY_CFG_CRON_DUOYOUORD] = taskOrderDuoYouOrd // + //jobs[md.KEY_CFG_CRON_TASKBOX] = taskOrderTaskBoxOrd // + //jobs[md.KEY_CFG_CRON_TASKBOXSECOND] = taskOrderTaskSecondOrd // + //jobs[md.KEY_CFG_CRON_CARD_CHECK_UPDATE] = taskCardCheckUpdate //权益卡退款 + //jobs[md.KEY_CFG_CRON_CARD_UPDATE] = taskCardUpdate // 权益卡更新 + //jobs[md.KEY_CFG_CRON_ORDER_STAT] = taskOrderStat // 订单统计 + //jobs[md.KEY_CFG_CRON_GOODS_SHELF] = taskGoodsShelf //站内商品上下架 + //jobs[md.KEY_CFG_CRON_CARD_RETURN] = taskCardReturn //权益卡退款 + //jobs[md.KEY_CFG_CRON_DTKBRAND] = taskTaoKeBrandInfo // 大淘客品牌信息 + //jobs[md.KEY_CFG_CRON_PUBLISHER] = taskTaobaoPublisherInfo // 淘宝备案信息绑定 + //jobs[md.KEY_CFG_CRON_AUTO_UN_FREEZE] = taskAutoUnFreeze // 定时解冻 + + //先不用 + //jobs[md.ZhimengCronPlayletVideoOrder] = taskPlayletVideoOrder // + //jobs[md.ZhimengCronPlayletVideoOrderYesterDay] = taskPlayletVideoOrderYesterday // + //jobs[md.ZhimengCronPlayletVideoOrderMonth] = taskPlayletVideoOrderMonth // + //jobs[md.ZhimengCronPlayletAdvOrderMonth] = taskPlayletAdvOrderMonth // + //jobs[md.ZhimengCronPlayletAdvOrder] = taskPlayletAdvOrder // + //jobs[md.ZhimengCronPlayletAdvOrderYesterDay] = taskPlayletAdvOrderYesterday // + //jobs[md.ZhimengCronPlayletAdvOrderYesterDayToMoney] = taskPlayletAdvOrderYesterdayToMoney // + +} diff --git a/app/utils/aes.go b/app/utils/aes.go new file mode 100644 index 0000000..5a39181 --- /dev/null +++ b/app/utils/aes.go @@ -0,0 +1,172 @@ +package utils + +import ( + "applet/app/cfg" + "bytes" + "crypto/aes" + "crypto/cipher" + "encoding/base64" + "encoding/json" + "fmt" +) + +func AesEncrypt(rawData, key []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + blockSize := block.BlockSize() + rawData = PKCS5Padding(rawData, blockSize) + // rawData = ZeroPadding(rawData, block.BlockSize()) + blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) + encrypted := make([]byte, len(rawData)) + // 根据CryptBlocks方法的说明,如下方式初始化encrypted也可以 + // encrypted := rawData + blockMode.CryptBlocks(encrypted, rawData) + return encrypted, nil +} + +func AesDecrypt(encrypted, key []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + blockSize := block.BlockSize() + blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) + rawData := make([]byte, len(encrypted)) + // rawData := encrypted + blockMode.CryptBlocks(rawData, encrypted) + rawData = PKCS5UnPadding(rawData) + // rawData = ZeroUnPadding(rawData) + return rawData, nil +} + +func ZeroPadding(cipherText []byte, blockSize int) []byte { + padding := blockSize - len(cipherText)%blockSize + padText := bytes.Repeat([]byte{0}, padding) + return append(cipherText, padText...) +} + +func ZeroUnPadding(rawData []byte) []byte { + length := len(rawData) + unPadding := int(rawData[length-1]) + return rawData[:(length - unPadding)] +} + +func PKCS5Padding(cipherText []byte, blockSize int) []byte { + padding := blockSize - len(cipherText)%blockSize + padText := bytes.Repeat([]byte{byte(padding)}, padding) + return append(cipherText, padText...) +} + +func PKCS5UnPadding(rawData []byte) []byte { + length := len(rawData) + // 去掉最后一个字节 unPadding 次 + unPadding := int(rawData[length-1]) + return rawData[:(length - unPadding)] +} + +// 填充0 +func zeroFill(key *string) { + l := len(*key) + if l != 16 && l != 24 && l != 32 { + if l < 16 { + *key = *key + fmt.Sprintf("%0*d", 16-l, 0) + } else if l < 24 { + *key = *key + fmt.Sprintf("%0*d", 24-l, 0) + } else if l < 32 { + *key = *key + fmt.Sprintf("%0*d", 32-l, 0) + } else { + *key = string([]byte(*key)[:32]) + } + } +} + +type AesCrypt struct { + Key []byte + Iv []byte +} + +func (a *AesCrypt) Encrypt(data []byte) ([]byte, error) { + aesBlockEncrypt, err := aes.NewCipher(a.Key) + if err != nil { + println(err.Error()) + return nil, err + } + + content := pKCS5Padding(data, aesBlockEncrypt.BlockSize()) + cipherBytes := make([]byte, len(content)) + aesEncrypt := cipher.NewCBCEncrypter(aesBlockEncrypt, a.Iv) + aesEncrypt.CryptBlocks(cipherBytes, content) + return cipherBytes, nil +} + +func (a *AesCrypt) Decrypt(src []byte) (data []byte, err error) { + decrypted := make([]byte, len(src)) + var aesBlockDecrypt cipher.Block + aesBlockDecrypt, err = aes.NewCipher(a.Key) + if err != nil { + println(err.Error()) + return nil, err + } + aesDecrypt := cipher.NewCBCDecrypter(aesBlockDecrypt, a.Iv) + aesDecrypt.CryptBlocks(decrypted, src) + return pKCS5Trimming(decrypted), nil +} + +func pKCS5Padding(cipherText []byte, blockSize int) []byte { + padding := blockSize - len(cipherText)%blockSize + padText := bytes.Repeat([]byte{byte(padding)}, padding) + return append(cipherText, padText...) +} + +func pKCS5Trimming(encrypt []byte) []byte { + padding := encrypt[len(encrypt)-1] + return encrypt[:len(encrypt)-int(padding)] +} + +// AesAdminCurlPOST is 与后台接口加密交互 +func AesAdminCurlPOST(aesData string, url string, uid int) ([]byte, error) { + adminKey := cfg.Admin.AesKey + adminVI := cfg.Admin.AesIV + crypto := AesCrypt{ + Key: []byte(adminKey), + Iv: []byte(adminVI), + } + + encrypt, err := crypto.Encrypt([]byte(aesData)) + if err != nil { + return nil, err + } + + // 发送请求到后台 + postData := map[string]string{ + "postData": base64.StdEncoding.EncodeToString(encrypt), + } + fmt.Println(adminKey) + fmt.Println(adminVI) + fmt.Println("=======ADMIN请求=====") + fmt.Println(postData) + postDataByte, _ := json.Marshal(postData) + rdata, err := CurlPost(url, postDataByte, nil) + fmt.Println(">>>>>>>>>>>>>>>>>>>>>>>>>", err) + + if err != nil { + return nil, err + } + + FilePutContents("cash_out", fmt.Sprintf("curl Result返回:%s uid:%d, >>>>>>>>>>>>>>>>>>>>", string(rdata), uid)) + pass, err := base64.StdEncoding.DecodeString(string(rdata)) + if err != nil { + return nil, err + } + fmt.Println(pass) + + decrypt, err := crypto.Decrypt(pass) + fmt.Println(err) + + if err != nil { + return nil, err + } + return decrypt, nil +} diff --git a/app/utils/auth.go b/app/utils/auth.go new file mode 100644 index 0000000..d7bd9ae --- /dev/null +++ b/app/utils/auth.go @@ -0,0 +1,46 @@ +package utils + +import ( + "errors" + "time" + + "applet/app/lib/auth" + + "github.com/dgrijalva/jwt-go" +) + +// GenToken 生成JWT +func GenToken(uid int, username, phone, appname, MiniOpenID, MiniSK string) (string, error) { + // 创建一个我们自己的声明 + c := auth.JWTUser{ + uid, + username, + phone, + appname, + MiniOpenID, + MiniSK, + jwt.StandardClaims{ + ExpiresAt: time.Now().Add(auth.TokenExpireDuration).Unix(), // 过期时间 + Issuer: "zyos", // 签发人 + }, + } + // 使用指定的签名方法创建签名对象 + token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) + // 使用指定的secret签名并获得完整的编码后的字符串token + return token.SignedString(auth.Secret) +} + +// ParseToken 解析JWT +func ParseToken(tokenString string) (*auth.JWTUser, error) { + // 解析token + token, err := jwt.ParseWithClaims(tokenString, &auth.JWTUser{}, func(token *jwt.Token) (i interface{}, err error) { + return auth.Secret, nil + }) + if err != nil { + return nil, err + } + if claims, ok := token.Claims.(*auth.JWTUser); ok && token.Valid { // 校验token + return claims, nil + } + return nil, errors.New("invalid token") +} diff --git a/app/utils/base64.go b/app/utils/base64.go new file mode 100644 index 0000000..661b552 --- /dev/null +++ b/app/utils/base64.go @@ -0,0 +1,117 @@ +package utils + +import ( + "encoding/base64" + "fmt" + "regexp" +) + +const ( + Base64Std = iota + Base64Url + Base64RawStd + Base64RawUrl +) + +func Base64StdEncode(str interface{}) string { + return Base64Encode(str, Base64Std) +} + +func Base64StdDecode(str interface{}) string { + return Base64Decode(str, Base64Std) +} + +func Base64UrlEncode(str interface{}) string { + return Base64Encode(str, Base64Url) +} + +func Base64UrlDecode(str interface{}) string { + return Base64Decode(str, Base64Url) +} + +func Base64RawStdEncode(str interface{}) string { + return Base64Encode(str, Base64RawStd) +} + +func Base64RawStdDecode(str interface{}) string { + return Base64Decode(str, Base64RawStd) +} + +func Base64RawUrlEncode(str interface{}) string { + return Base64Encode(str, Base64RawUrl) +} + +func Base64RawUrlDecode(str interface{}) string { + return Base64Decode(str, Base64RawUrl) +} + +func Base64Encode(str interface{}, encode int) string { + newEncode := base64Encode(encode) + if newEncode == nil { + return "" + } + switch v := str.(type) { + case string: + return newEncode.EncodeToString([]byte(v)) + case []byte: + return newEncode.EncodeToString(v) + } + return newEncode.EncodeToString([]byte(fmt.Sprint(str))) +} + +func Base64Decode(str interface{}, encode int) string { + var err error + var b []byte + newEncode := base64Encode(encode) + if newEncode == nil { + return "" + } + switch v := str.(type) { + case string: + b, err = newEncode.DecodeString(v) + case []byte: + b, err = newEncode.DecodeString(string(v)) + default: + return "" + } + if err != nil { + return "" + } + return string(b) +} + +func base64Encode(encode int) *base64.Encoding { + switch encode { + case Base64Std: + return base64.StdEncoding + case Base64Url: + return base64.URLEncoding + case Base64RawStd: + return base64.RawStdEncoding + case Base64RawUrl: + return base64.RawURLEncoding + default: + return nil + } +} + +func JudgeBase64(str string) bool { + pattern := "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$" + matched, err := regexp.MatchString(pattern, str) + if err != nil { + return false + } + if !(len(str)%4 == 0 && matched) { + return false + } + unCodeStr, err := base64.StdEncoding.DecodeString(str) + if err != nil { + return false + } + tranStr := base64.StdEncoding.EncodeToString(unCodeStr) + //return str==base64.StdEncoding.EncodeToString(unCodeStr) + if str == tranStr { + return true + } + return false +} diff --git a/app/utils/boolean.go b/app/utils/boolean.go new file mode 100644 index 0000000..fdfd986 --- /dev/null +++ b/app/utils/boolean.go @@ -0,0 +1,26 @@ +package utils + +import "reflect" + +// 检验一个值是否为空 +func Empty(val interface{}) bool { + v := reflect.ValueOf(val) + switch v.Kind() { + case reflect.String, reflect.Array: + return v.Len() == 0 + case reflect.Map, reflect.Slice: + return v.Len() == 0 || v.IsNil() + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + + return reflect.DeepEqual(val, reflect.Zero(v.Type()).Interface()) +} diff --git a/app/utils/cache/base.go b/app/utils/cache/base.go new file mode 100644 index 0000000..64648dd --- /dev/null +++ b/app/utils/cache/base.go @@ -0,0 +1,421 @@ +package cache + +import ( + "errors" + "fmt" + "strconv" + "time" +) + +const ( + redisDialTTL = 10 * time.Second + redisReadTTL = 3 * time.Second + redisWriteTTL = 3 * time.Second + redisIdleTTL = 10 * time.Second + redisPoolTTL = 10 * time.Second + redisPoolSize int = 512 + redisMaxIdleConn int = 64 + redisMaxActive int = 512 +) + +var ( + ErrNil = errors.New("nil return") + ErrWrongArgsNum = errors.New("args num error") + ErrNegativeInt = errors.New("redis cluster: unexpected value for Uint64") +) + +// 以下为提供类型转换 + +func Int(reply interface{}, err error) (int, error) { + if err != nil { + return 0, err + } + switch reply := reply.(type) { + case int: + return reply, nil + case int8: + return int(reply), nil + case int16: + return int(reply), nil + case int32: + return int(reply), nil + case int64: + x := int(reply) + if int64(x) != reply { + return 0, strconv.ErrRange + } + return x, nil + case uint: + n := int(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case uint8: + return int(reply), nil + case uint16: + return int(reply), nil + case uint32: + n := int(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case uint64: + n := int(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case []byte: + data := string(reply) + if len(data) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseInt(data, 10, 0) + return int(n), err + case string: + if len(reply) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseInt(reply, 10, 0) + return int(n), err + case nil: + return 0, ErrNil + case error: + return 0, reply + } + return 0, fmt.Errorf("redis cluster: unexpected type for Int, got type %T", reply) +} + +func Int64(reply interface{}, err error) (int64, error) { + if err != nil { + return 0, err + } + switch reply := reply.(type) { + case int: + return int64(reply), nil + case int8: + return int64(reply), nil + case int16: + return int64(reply), nil + case int32: + return int64(reply), nil + case int64: + return reply, nil + case uint: + n := int64(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case uint8: + return int64(reply), nil + case uint16: + return int64(reply), nil + case uint32: + return int64(reply), nil + case uint64: + n := int64(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case []byte: + data := string(reply) + if len(data) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseInt(data, 10, 64) + return n, err + case string: + if len(reply) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseInt(reply, 10, 64) + return n, err + case nil: + return 0, ErrNil + case error: + return 0, reply + } + return 0, fmt.Errorf("redis cluster: unexpected type for Int64, got type %T", reply) +} + +func Uint64(reply interface{}, err error) (uint64, error) { + if err != nil { + return 0, err + } + switch reply := reply.(type) { + case uint: + return uint64(reply), nil + case uint8: + return uint64(reply), nil + case uint16: + return uint64(reply), nil + case uint32: + return uint64(reply), nil + case uint64: + return reply, nil + case int: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case int8: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case int16: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case int32: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case int64: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case []byte: + data := string(reply) + if len(data) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseUint(data, 10, 64) + return n, err + case string: + if len(reply) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseUint(reply, 10, 64) + return n, err + case nil: + return 0, ErrNil + case error: + return 0, reply + } + return 0, fmt.Errorf("redis cluster: unexpected type for Uint64, got type %T", reply) +} + +func Float64(reply interface{}, err error) (float64, error) { + if err != nil { + return 0, err + } + + var value float64 + err = nil + switch v := reply.(type) { + case float32: + value = float64(v) + case float64: + value = v + case int: + value = float64(v) + case int8: + value = float64(v) + case int16: + value = float64(v) + case int32: + value = float64(v) + case int64: + value = float64(v) + case uint: + value = float64(v) + case uint8: + value = float64(v) + case uint16: + value = float64(v) + case uint32: + value = float64(v) + case uint64: + value = float64(v) + case []byte: + data := string(v) + if len(data) == 0 { + return 0, ErrNil + } + value, err = strconv.ParseFloat(string(v), 64) + case string: + if len(v) == 0 { + return 0, ErrNil + } + value, err = strconv.ParseFloat(v, 64) + case nil: + err = ErrNil + case error: + err = v + default: + err = fmt.Errorf("redis cluster: unexpected type for Float64, got type %T", v) + } + + return value, err +} + +func Bool(reply interface{}, err error) (bool, error) { + if err != nil { + return false, err + } + switch reply := reply.(type) { + case bool: + return reply, nil + case int64: + return reply != 0, nil + case []byte: + data := string(reply) + if len(data) == 0 { + return false, ErrNil + } + + return strconv.ParseBool(data) + case string: + if len(reply) == 0 { + return false, ErrNil + } + + return strconv.ParseBool(reply) + case nil: + return false, ErrNil + case error: + return false, reply + } + return false, fmt.Errorf("redis cluster: unexpected type for Bool, got type %T", reply) +} + +func Bytes(reply interface{}, err error) ([]byte, error) { + if err != nil { + return nil, err + } + switch reply := reply.(type) { + case []byte: + if len(reply) == 0 { + return nil, ErrNil + } + return reply, nil + case string: + data := []byte(reply) + if len(data) == 0 { + return nil, ErrNil + } + return data, nil + case nil: + return nil, ErrNil + case error: + return nil, reply + } + return nil, fmt.Errorf("redis cluster: unexpected type for Bytes, got type %T", reply) +} + +func String(reply interface{}, err error) (string, error) { + if err != nil { + return "", err + } + + value := "" + err = nil + switch v := reply.(type) { + case string: + if len(v) == 0 { + return "", ErrNil + } + + value = v + case []byte: + if len(v) == 0 { + return "", ErrNil + } + + value = string(v) + case int: + value = strconv.FormatInt(int64(v), 10) + case int8: + value = strconv.FormatInt(int64(v), 10) + case int16: + value = strconv.FormatInt(int64(v), 10) + case int32: + value = strconv.FormatInt(int64(v), 10) + case int64: + value = strconv.FormatInt(v, 10) + case uint: + value = strconv.FormatUint(uint64(v), 10) + case uint8: + value = strconv.FormatUint(uint64(v), 10) + case uint16: + value = strconv.FormatUint(uint64(v), 10) + case uint32: + value = strconv.FormatUint(uint64(v), 10) + case uint64: + value = strconv.FormatUint(v, 10) + case float32: + value = strconv.FormatFloat(float64(v), 'f', -1, 32) + case float64: + value = strconv.FormatFloat(v, 'f', -1, 64) + case bool: + value = strconv.FormatBool(v) + case nil: + err = ErrNil + case error: + err = v + default: + err = fmt.Errorf("redis cluster: unexpected type for String, got type %T", v) + } + + return value, err +} + +func Strings(reply interface{}, err error) ([]string, error) { + if err != nil { + return nil, err + } + switch reply := reply.(type) { + case []interface{}: + result := make([]string, len(reply)) + for i := range reply { + if reply[i] == nil { + continue + } + switch subReply := reply[i].(type) { + case string: + result[i] = subReply + case []byte: + result[i] = string(subReply) + default: + return nil, fmt.Errorf("redis cluster: unexpected element type for String, got type %T", reply[i]) + } + } + return result, nil + case []string: + return reply, nil + case nil: + return nil, ErrNil + case error: + return nil, reply + } + return nil, fmt.Errorf("redis cluster: unexpected type for Strings, got type %T", reply) +} + +func Values(reply interface{}, err error) ([]interface{}, error) { + if err != nil { + return nil, err + } + switch reply := reply.(type) { + case []interface{}: + return reply, nil + case nil: + return nil, ErrNil + case error: + return nil, reply + } + return nil, fmt.Errorf("redis cluster: unexpected type for Values, got type %T", reply) +} diff --git a/app/utils/cache/cache/cache.go b/app/utils/cache/cache/cache.go new file mode 100644 index 0000000..e43c5f0 --- /dev/null +++ b/app/utils/cache/cache/cache.go @@ -0,0 +1,107 @@ +package cache + +import ( + "fmt" + "time" +) + +var c Cache + +type Cache interface { + // get cached value by key. + Get(key string) interface{} + // GetMulti is a batch version of Get. + GetMulti(keys []string) []interface{} + // set cached value with key and expire time. + Put(key string, val interface{}, timeout time.Duration) error + // delete cached value by key. + Delete(key string) error + // increase cached int value by key, as a counter. + Incr(key string) error + // decrease cached int value by key, as a counter. + Decr(key string) error + // check if cached value exists or not. + IsExist(key string) bool + // clear all cache. + ClearAll() error + // start gc routine based on config string settings. + StartAndGC(config string) error +} + +// Instance is a function create a new Cache Instance +type Instance func() Cache + +var adapters = make(map[string]Instance) + +// Register makes a cache adapter available by the adapter name. +// If Register is called twice with the same name or if driver is nil, +// it panics. +func Register(name string, adapter Instance) { + if adapter == nil { + panic("cache: Register adapter is nil") + } + if _, ok := adapters[name]; ok { + panic("cache: Register called twice for adapter " + name) + } + adapters[name] = adapter +} + +// NewCache Create a new cache driver by adapter name and config string. +// config need to be correct JSON as string: {"interval":360}. +// it will start gc automatically. +func NewCache(adapterName, config string) (adapter Cache, err error) { + instanceFunc, ok := adapters[adapterName] + if !ok { + err = fmt.Errorf("cache: unknown adapter name %q (forgot to import?)", adapterName) + return + } + adapter = instanceFunc() + err = adapter.StartAndGC(config) + if err != nil { + adapter = nil + } + return +} + +func InitCache(adapterName, config string) (err error) { + instanceFunc, ok := adapters[adapterName] + if !ok { + err = fmt.Errorf("cache: unknown adapter name %q (forgot to import?)", adapterName) + return + } + c = instanceFunc() + err = c.StartAndGC(config) + if err != nil { + c = nil + } + return +} + +func Get(key string) interface{} { + return c.Get(key) +} + +func GetMulti(keys []string) []interface{} { + return c.GetMulti(keys) +} +func Put(key string, val interface{}, ttl time.Duration) error { + return c.Put(key, val, ttl) +} +func Delete(key string) error { + return c.Delete(key) +} +func Incr(key string) error { + return c.Incr(key) +} +func Decr(key string) error { + return c.Decr(key) +} +func IsExist(key string) bool { + return c.IsExist(key) +} +func ClearAll() error { + return c.ClearAll() +} +func StartAndGC(cfg string) error { + return c.StartAndGC(cfg) +} diff --git a/app/utils/cache/cache/conv.go b/app/utils/cache/cache/conv.go new file mode 100644 index 0000000..6b700ae --- /dev/null +++ b/app/utils/cache/cache/conv.go @@ -0,0 +1,86 @@ +package cache + +import ( + "fmt" + "strconv" +) + +// GetString convert interface to string. +func GetString(v interface{}) string { + switch result := v.(type) { + case string: + return result + case []byte: + return string(result) + default: + if v != nil { + return fmt.Sprint(result) + } + } + return "" +} + +// GetInt convert interface to int. +func GetInt(v interface{}) int { + switch result := v.(type) { + case int: + return result + case int32: + return int(result) + case int64: + return int(result) + default: + if d := GetString(v); d != "" { + value, _ := strconv.Atoi(d) + return value + } + } + return 0 +} + +// GetInt64 convert interface to int64. +func GetInt64(v interface{}) int64 { + switch result := v.(type) { + case int: + return int64(result) + case int32: + return int64(result) + case int64: + return result + default: + + if d := GetString(v); d != "" { + value, _ := strconv.ParseInt(d, 10, 64) + return value + } + } + return 0 +} + +// GetFloat64 convert interface to float64. +func GetFloat64(v interface{}) float64 { + switch result := v.(type) { + case float64: + return result + default: + if d := GetString(v); d != "" { + value, _ := strconv.ParseFloat(d, 64) + return value + } + } + return 0 +} + +// GetBool convert interface to bool. +func GetBool(v interface{}) bool { + switch result := v.(type) { + case bool: + return result + default: + if d := GetString(v); d != "" { + value, _ := strconv.ParseBool(d) + return value + } + } + return false +} diff --git a/app/utils/cache/cache/file.go b/app/utils/cache/cache/file.go new file mode 100644 index 0000000..5c4e366 --- /dev/null +++ b/app/utils/cache/cache/file.go @@ -0,0 +1,241 @@ +package cache + +import ( + "bytes" + "crypto/md5" + "encoding/gob" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "reflect" + "strconv" + "time" +) + +// FileCacheItem is basic unit of file cache adapter. +// it contains data and expire time. +type FileCacheItem struct { + Data interface{} + LastAccess time.Time + Expired time.Time +} + +// FileCache Config +var ( + FileCachePath = "cache" // cache directory + FileCacheFileSuffix = ".bin" // cache file suffix + FileCacheDirectoryLevel = 2 // cache file deep level if auto generated cache files. + FileCacheEmbedExpiry time.Duration // cache expire time, default is no expire forever. +) + +// FileCache is cache adapter for file storage. +type FileCache struct { + CachePath string + FileSuffix string + DirectoryLevel int + EmbedExpiry int +} + +// NewFileCache Create new file cache with no config. +// the level and expiry need set in method StartAndGC as config string. +func NewFileCache() Cache { + // return &FileCache{CachePath:FileCachePath, FileSuffix:FileCacheFileSuffix} + return &FileCache{} +} + +// StartAndGC will start and begin gc for file cache. +// the config need to be like {CachePath:"/cache","FileSuffix":".bin","DirectoryLevel":2,"EmbedExpiry":0} +func (fc *FileCache) StartAndGC(config string) error { + + var cfg map[string]string + json.Unmarshal([]byte(config), &cfg) + if _, ok := cfg["CachePath"]; !ok { + cfg["CachePath"] = FileCachePath + } + if _, ok := cfg["FileSuffix"]; !ok { + cfg["FileSuffix"] = FileCacheFileSuffix + } + if _, ok := cfg["DirectoryLevel"]; !ok { + cfg["DirectoryLevel"] = strconv.Itoa(FileCacheDirectoryLevel) + } + if _, ok := cfg["EmbedExpiry"]; !ok { + cfg["EmbedExpiry"] = strconv.FormatInt(int64(FileCacheEmbedExpiry.Seconds()), 10) + } + fc.CachePath = cfg["CachePath"] + fc.FileSuffix = cfg["FileSuffix"] + fc.DirectoryLevel, _ = strconv.Atoi(cfg["DirectoryLevel"]) + fc.EmbedExpiry, _ = strconv.Atoi(cfg["EmbedExpiry"]) + + fc.Init() + return nil +} + +// Init will make new dir for file cache if not exist. +func (fc *FileCache) Init() { + if ok, _ := exists(fc.CachePath); !ok { // todo : error handle + _ = os.MkdirAll(fc.CachePath, os.ModePerm) // todo : error handle + } +} + +// get cached file name. it's md5 encoded. +func (fc *FileCache) getCacheFileName(key string) string { + m := md5.New() + io.WriteString(m, key) + keyMd5 := hex.EncodeToString(m.Sum(nil)) + cachePath := fc.CachePath + switch fc.DirectoryLevel { + case 2: + cachePath = filepath.Join(cachePath, keyMd5[0:2], keyMd5[2:4]) + case 1: + cachePath = filepath.Join(cachePath, keyMd5[0:2]) + } + + if ok, _ := exists(cachePath); !ok { // todo : error handle + _ = os.MkdirAll(cachePath, os.ModePerm) // todo : error handle + } + + return filepath.Join(cachePath, fmt.Sprintf("%s%s", keyMd5, fc.FileSuffix)) +} + +// Get value from file cache. +// if non-exist or expired, return empty string. +func (fc *FileCache) Get(key string) interface{} { + fileData, err := FileGetContents(fc.getCacheFileName(key)) + if err != nil { + return "" + } + var to FileCacheItem + GobDecode(fileData, &to) + if to.Expired.Before(time.Now()) { + return "" + } + return to.Data +} + +// GetMulti gets values from file cache. +// if non-exist or expired, return empty string. +func (fc *FileCache) GetMulti(keys []string) []interface{} { + var rc []interface{} + for _, key := range keys { + rc = append(rc, fc.Get(key)) + } + return rc +} + +// Put value into file cache. +// timeout means how long to keep this file, unit of ms. +// if timeout equals FileCacheEmbedExpiry(default is 0), cache this item forever. +func (fc *FileCache) Put(key string, val interface{}, timeout time.Duration) error { + gob.Register(val) + + item := FileCacheItem{Data: val} + if timeout == FileCacheEmbedExpiry { + item.Expired = time.Now().Add((86400 * 365 * 10) * time.Second) // ten years + } else { + item.Expired = time.Now().Add(timeout) + } + item.LastAccess = time.Now() + data, err := GobEncode(item) + if err != nil { + return err + } + return FilePutContents(fc.getCacheFileName(key), data) +} + +// Delete file cache value. +func (fc *FileCache) Delete(key string) error { + filename := fc.getCacheFileName(key) + if ok, _ := exists(filename); ok { + return os.Remove(filename) + } + return nil +} + +// Incr will increase cached int value. +// fc value is saving forever unless Delete. +func (fc *FileCache) Incr(key string) error { + data := fc.Get(key) + var incr int + if reflect.TypeOf(data).Name() != "int" { + incr = 0 + } else { + incr = data.(int) + 1 + } + fc.Put(key, incr, FileCacheEmbedExpiry) + return nil +} + +// Decr will decrease cached int value. +func (fc *FileCache) Decr(key string) error { + data := fc.Get(key) + var decr int + if reflect.TypeOf(data).Name() != "int" || data.(int)-1 <= 0 { + decr = 0 + } else { + decr = data.(int) - 1 + } + fc.Put(key, decr, FileCacheEmbedExpiry) + return nil +} + +// IsExist check value is exist. +func (fc *FileCache) IsExist(key string) bool { + ret, _ := exists(fc.getCacheFileName(key)) + return ret +} + +// ClearAll will clean cached files. +// not implemented. +func (fc *FileCache) ClearAll() error { + return nil +} + +// check file exist. +func exists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +// FileGetContents Get bytes to file. +// if non-exist, create this file. +func FileGetContents(filename string) (data []byte, e error) { + return ioutil.ReadFile(filename) +} + +// FilePutContents Put bytes to file. +// if non-exist, create this file. +func FilePutContents(filename string, content []byte) error { + return ioutil.WriteFile(filename, content, os.ModePerm) +} + +// GobEncode Gob encodes file cache item. +func GobEncode(data interface{}) ([]byte, error) { + buf := bytes.NewBuffer(nil) + enc := gob.NewEncoder(buf) + err := enc.Encode(data) + if err != nil { + return nil, err + } + return buf.Bytes(), err +} + +// GobDecode Gob decodes file cache item. +func GobDecode(data []byte, to *FileCacheItem) error { + buf := bytes.NewBuffer(data) + dec := gob.NewDecoder(buf) + return dec.Decode(&to) +} + +func init() { + Register("file", NewFileCache) +} diff --git a/app/utils/cache/cache/memory.go b/app/utils/cache/cache/memory.go new file mode 100644 index 0000000..0cc5015 --- /dev/null +++ b/app/utils/cache/cache/memory.go @@ -0,0 +1,239 @@ +package cache + +import ( + "encoding/json" + "errors" + "sync" + "time" +) + +var ( + // DefaultEvery means the clock time of recycling the expired cache items in memory. + DefaultEvery = 60 // 1 minute +) + +// MemoryItem store memory cache item. +type MemoryItem struct { + val interface{} + createdTime time.Time + lifespan time.Duration +} + +func (mi *MemoryItem) isExpire() bool { + // 0 means forever + if mi.lifespan == 0 { + return false + } + return time.Now().Sub(mi.createdTime) > mi.lifespan +} + +// MemoryCache is Memory cache adapter. +// it contains a RW locker for safe map storage. +type MemoryCache struct { + sync.RWMutex + dur time.Duration + items map[string]*MemoryItem + Every int // run an expiration check Every clock time +} + +// NewMemoryCache returns a new MemoryCache. +func NewMemoryCache() Cache { + cache := MemoryCache{items: make(map[string]*MemoryItem)} + return &cache +} + +// Get cache from memory. +// if non-existed or expired, return nil. +func (bc *MemoryCache) Get(name string) interface{} { + bc.RLock() + defer bc.RUnlock() + if itm, ok := bc.items[name]; ok { + if itm.isExpire() { + return nil + } + return itm.val + } + return nil +} + +// GetMulti gets caches from memory. +// if non-existed or expired, return nil. +func (bc *MemoryCache) GetMulti(names []string) []interface{} { + var rc []interface{} + for _, name := range names { + rc = append(rc, bc.Get(name)) + } + return rc +} + +// Put cache to memory. +// if lifespan is 0, it will be forever till restart. +func (bc *MemoryCache) Put(name string, value interface{}, lifespan time.Duration) error { + bc.Lock() + defer bc.Unlock() + bc.items[name] = &MemoryItem{ + val: value, + createdTime: time.Now(), + lifespan: lifespan, + } + return nil +} + +// Delete cache in memory. +func (bc *MemoryCache) Delete(name string) error { + bc.Lock() + defer bc.Unlock() + if _, ok := bc.items[name]; !ok { + return errors.New("key not exist") + } + delete(bc.items, name) + if _, ok := bc.items[name]; ok { + return errors.New("delete key error") + } + return nil +} + +// Incr increase cache counter in memory. +// it supports int,int32,int64,uint,uint32,uint64. +func (bc *MemoryCache) Incr(key string) error { + bc.RLock() + defer bc.RUnlock() + itm, ok := bc.items[key] + if !ok { + return errors.New("key not exist") + } + switch itm.val.(type) { + case int: + itm.val = itm.val.(int) + 1 + case int32: + itm.val = itm.val.(int32) + 1 + case int64: + itm.val = itm.val.(int64) + 1 + case uint: + itm.val = itm.val.(uint) + 1 + case uint32: + itm.val = itm.val.(uint32) + 1 + case uint64: + itm.val = itm.val.(uint64) + 1 + default: + return errors.New("item val is not (u)int (u)int32 (u)int64") + } + return nil +} + +// Decr decrease counter in memory. +func (bc *MemoryCache) Decr(key string) error { + bc.RLock() + defer bc.RUnlock() + itm, ok := bc.items[key] + if !ok { + return errors.New("key not exist") + } + switch itm.val.(type) { + case int: + itm.val = itm.val.(int) - 1 + case int64: + itm.val = itm.val.(int64) - 1 + case int32: + itm.val = itm.val.(int32) - 1 + case uint: + if itm.val.(uint) > 0 { + itm.val = itm.val.(uint) - 1 + } else { + return errors.New("item val is less than 0") + } + case uint32: + if itm.val.(uint32) > 0 { + itm.val = itm.val.(uint32) - 1 + } else { + return errors.New("item val is less than 0") + } + case uint64: + if itm.val.(uint64) > 0 { + itm.val = itm.val.(uint64) - 1 + } else { + return errors.New("item val is less than 0") + } + default: + return errors.New("item val is not int int64 int32") + } + return nil +} + +// IsExist check cache exist in memory. +func (bc *MemoryCache) IsExist(name string) bool { + bc.RLock() + defer bc.RUnlock() + if v, ok := bc.items[name]; ok { + return !v.isExpire() + } + return false +} + +// ClearAll will delete all cache in memory. +func (bc *MemoryCache) ClearAll() error { + bc.Lock() + defer bc.Unlock() + bc.items = make(map[string]*MemoryItem) + return nil +} + +// StartAndGC start memory cache. it will check expiration in every clock time. +func (bc *MemoryCache) StartAndGC(config string) error { + var cf map[string]int + json.Unmarshal([]byte(config), &cf) + if _, ok := cf["interval"]; !ok { + cf = make(map[string]int) + cf["interval"] = DefaultEvery + } + dur := time.Duration(cf["interval"]) * time.Second + bc.Every = cf["interval"] + bc.dur = dur + go bc.vacuum() + return nil +} + +// check expiration. +func (bc *MemoryCache) vacuum() { + bc.RLock() + every := bc.Every + bc.RUnlock() + + if every < 1 { + return + } + for { + <-time.After(bc.dur) + if bc.items == nil { + return + } + if keys := bc.expiredKeys(); len(keys) != 0 { + bc.clearItems(keys) + } + } +} + +// expiredKeys returns key list which are expired. +func (bc *MemoryCache) expiredKeys() (keys []string) { + bc.RLock() + defer bc.RUnlock() + for key, itm := range bc.items { + if itm.isExpire() { + keys = append(keys, key) + } + } + return +} + +// clearItems removes all the items which key in keys. +func (bc *MemoryCache) clearItems(keys []string) { + bc.Lock() + defer bc.Unlock() + for _, key := range keys { + delete(bc.items, key) + } +} + +func init() { + Register("memory", NewMemoryCache) +} diff --git a/app/utils/cache/redis.go b/app/utils/cache/redis.go new file mode 100644 index 0000000..4e5f047 --- /dev/null +++ b/app/utils/cache/redis.go @@ -0,0 +1,403 @@ +package cache + +import ( + "encoding/json" + "errors" + "log" + "strings" + "time" + + redigo "github.com/gomodule/redigo/redis" +) + +// configuration +type Config struct { + Server string + Password string + MaxIdle int // Maximum number of idle connections in the pool. + + // Maximum number of connections allocated by the pool at a given time. + // When zero, there is no limit on the number of connections in the pool. + MaxActive int + + // Close connections after remaining idle for this duration. If the value + // is zero, then idle connections are not closed. Applications should set + // the timeout to a value less than the server's timeout. + IdleTimeout time.Duration + + // If Wait is true and the pool is at the MaxActive limit, then Get() waits + // for a connection to be returned to the pool before returning. + Wait bool + KeyPrefix string // prefix to all keys; example is "dev environment name" + KeyDelimiter string // delimiter to be used while appending keys; example is ":" + KeyPlaceholder string // placeholder to be parsed using given arguments to obtain a final key; example is "?" +} + +var pool *redigo.Pool +var conf *Config + +func NewRedis(addr string) { + if addr == "" { + panic("\nredis connect string cannot be empty\n") + } + pool = &redigo.Pool{ + MaxIdle: redisMaxIdleConn, + IdleTimeout: redisIdleTTL, + MaxActive: redisMaxActive, + // MaxConnLifetime: redisDialTTL, + Wait: true, + Dial: func() (redigo.Conn, error) { + c, err := redigo.Dial("tcp", addr, + redigo.DialConnectTimeout(redisDialTTL), + redigo.DialReadTimeout(redisReadTTL), + redigo.DialWriteTimeout(redisWriteTTL), + ) + if err != nil { + log.Println("Redis Dial failed: ", err) + return nil, err + } + return c, err + }, + TestOnBorrow: func(c redigo.Conn, t time.Time) error { + _, err := c.Do("PING") + if err != nil { + log.Println("Unable to ping to redis server:", err) + } + return err + }, + } + conn := pool.Get() + defer conn.Close() + if conn.Err() != nil { + println("\nredis connect " + addr + " error: " + conn.Err().Error()) + } else { + println("\nredis connect " + addr + " success!\n") + } +} + +func Do(cmd string, args ...interface{}) (reply interface{}, err error) { + conn := pool.Get() + defer conn.Close() + return conn.Do(cmd, args...) +} + +func GetPool() *redigo.Pool { + return pool +} + +func ParseKey(key string, vars []string) (string, error) { + arr := strings.Split(key, conf.KeyPlaceholder) + actualKey := "" + if len(arr) != len(vars)+1 { + return "", errors.New("redis/connection.go: Insufficient arguments to parse key") + } else { + for index, val := range arr { + if index == 0 { + actualKey = arr[index] + } else { + actualKey += vars[index-1] + val + } + } + } + return getPrefixedKey(actualKey), nil +} + +func getPrefixedKey(key string) string { + return conf.KeyPrefix + conf.KeyDelimiter + key +} +func StripEnvKey(key string) string { + return strings.TrimLeft(key, conf.KeyPrefix+conf.KeyDelimiter) +} +func SplitKey(key string) []string { + return strings.Split(key, conf.KeyDelimiter) +} +func Expire(key string, ttl int) (interface{}, error) { + return Do("EXPIRE", key, ttl) +} +func Persist(key string) (interface{}, error) { + return Do("PERSIST", key) +} + +func Del(key string) (interface{}, error) { + return Do("DEL", key) +} +func Set(key string, data interface{}) (interface{}, error) { + // set + return Do("SET", key, data) +} +func SetNX(key string, data interface{}) (interface{}, error) { + return Do("SETNX", key, data) +} +func SetEx(key string, data interface{}, ttl int) (interface{}, error) { + return Do("SETEX", key, ttl, data) +} + +func SetJson(key string, data interface{}, ttl int) bool { + c, err := json.Marshal(data) + if err != nil { + return false + } + if ttl < 1 { + _, err = Set(key, c) + } else { + _, err = SetEx(key, c, ttl) + } + if err != nil { + return false + } + return true +} + +func GetJson(key string, dst interface{}) error { + b, err := GetBytes(key) + if err != nil { + return err + } + if err = json.Unmarshal(b, dst); err != nil { + return err + } + return nil +} + +func Get(key string) (interface{}, error) { + // get + return Do("GET", key) +} +func GetTTL(key string) (time.Duration, error) { + ttl, err := redigo.Int64(Do("TTL", key)) + return time.Duration(ttl) * time.Second, err +} +func GetBytes(key string) ([]byte, error) { + return redigo.Bytes(Do("GET", key)) +} +func GetString(key string) (string, error) { + return redigo.String(Do("GET", key)) +} +func GetStringMap(key string) (map[string]string, error) { + return redigo.StringMap(Do("GET", key)) +} +func GetInt(key string) (int, error) { + return redigo.Int(Do("GET", key)) +} +func GetInt64(key string) (int64, error) { + return redigo.Int64(Do("GET", key)) +} +func GetStringLength(key string) (int, error) { + return redigo.Int(Do("STRLEN", key)) +} +func ZAdd(key string, score float64, data interface{}) (interface{}, error) { + return Do("ZADD", key, score, data) +} +func ZAddNX(key string, score float64, data interface{}) (interface{}, error) { + return Do("ZADD", key, "NX", score, data) +} +func ZRem(key string, data interface{}) (interface{}, error) { + return Do("ZREM", key, data) +} +func ZRange(key string, start int, end int, withScores bool) ([]interface{}, error) { + if withScores { + return redigo.Values(Do("ZRANGE", key, start, end, "WITHSCORES")) + } + return redigo.Values(Do("ZRANGE", key, start, end)) +} +func ZRemRangeByScore(key string, start int64, end int64) ([]interface{}, error) { + return redigo.Values(Do("ZREMRANGEBYSCORE", key, start, end)) +} +func ZCard(setName string) (int64, error) { + return redigo.Int64(Do("ZCARD", setName)) +} +func ZScan(setName string) (int64, error) { + return redigo.Int64(Do("ZCARD", setName)) +} +func SAdd(setName string, data interface{}) (interface{}, error) { + return Do("SADD", setName, data) +} +func SCard(setName string) (int64, error) { + return redigo.Int64(Do("SCARD", setName)) +} +func SIsMember(setName string, data interface{}) (bool, error) { + return redigo.Bool(Do("SISMEMBER", setName, data)) +} +func SMembers(setName string) ([]string, error) { + return redigo.Strings(Do("SMEMBERS", setName)) +} +func SRem(setName string, data interface{}) (interface{}, error) { + return Do("SREM", setName, data) +} +func HSet(key string, HKey string, data interface{}) (interface{}, error) { + return Do("HSET", key, HKey, data) +} + +func HGet(key string, HKey string) (interface{}, error) { + return Do("HGET", key, HKey) +} + +func HMGet(key string, hashKeys ...string) ([]interface{}, error) { + ret, err := Do("HMGET", key, hashKeys) + if err != nil { + return nil, err + } + reta, ok := ret.([]interface{}) + if !ok { + return nil, errors.New("result not an array") + } + return reta, nil +} + +func HMSet(key string, hashKeys []string, vals []interface{}) (interface{}, error) { + if len(hashKeys) == 0 || len(hashKeys) != len(vals) { + var ret interface{} + return ret, errors.New("bad length") + } + input := []interface{}{key} + for i, v := range hashKeys { + input = append(input, v, vals[i]) + } + return Do("HMSET", input...) +} + +func HGetString(key string, HKey string) (string, error) { + return redigo.String(Do("HGET", key, HKey)) +} +func HGetFloat(key string, HKey string) (float64, error) { + f, err := redigo.Float64(Do("HGET", key, HKey)) + return f, err +} +func HGetInt(key string, HKey string) (int, error) { + return redigo.Int(Do("HGET", key, HKey)) +} +func HGetInt64(key string, HKey string) (int64, error) { + return redigo.Int64(Do("HGET", key, HKey)) +} +func HGetBool(key string, HKey string) (bool, error) { + return redigo.Bool(Do("HGET", key, HKey)) +} +func HDel(key string, HKey string) (interface{}, error) { + return Do("HDEL", key, HKey) +} + +func HGetAll(key string) (map[string]interface{}, error) { + vals, err := redigo.Values(Do("HGETALL", key)) + if err != nil { + return nil, err + } + num := len(vals) / 2 + result := make(map[string]interface{}, num) + for i := 0; i < num; i++ { + key, _ := redigo.String(vals[2*i], nil) + result[key] = vals[2*i+1] + } + return result, nil +} + +func FlushAll() bool { + res, _ := redigo.String(Do("FLUSHALL")) + if res == "" { + return false + } + return true +} + +// NOTE: Use this in production environment with extreme care. +// Read more here:https://redigo.io/commands/keys +func Keys(pattern string) ([]string, error) { + return redigo.Strings(Do("KEYS", pattern)) +} + +func HKeys(key string) ([]string, error) { + return redigo.Strings(Do("HKEYS", key)) +} + +func Exists(key string) bool { + count, err := redigo.Int(Do("EXISTS", key)) + if count == 0 || err != nil { + return false + } + return true +} + +func Incr(key string) (int64, error) { + return redigo.Int64(Do("INCR", key)) +} + +func Decr(key string) (int64, error) { + return redigo.Int64(Do("DECR", key)) +} + +func IncrBy(key string, incBy int64) (int64, error) { + return redigo.Int64(Do("INCRBY", key, incBy)) +} + +func DecrBy(key string, decrBy int64) (int64, error) { + return redigo.Int64(Do("DECRBY", key)) +} + +func IncrByFloat(key string, incBy float64) (float64, error) { + return redigo.Float64(Do("INCRBYFLOAT", key, incBy)) +} + +func DecrByFloat(key string, decrBy float64) (float64, error) { + return redigo.Float64(Do("DECRBYFLOAT", key, decrBy)) +} + +// use for message queue +func LPush(key string, data interface{}) (interface{}, error) { + // set + return Do("LPUSH", key, data) +} + +func LPop(key string) (interface{}, error) { + return Do("LPOP", key) +} + +func LPopString(key string) (string, error) { + return redigo.String(Do("LPOP", key)) +} +func LPopFloat(key string) (float64, error) { + f, err := redigo.Float64(Do("LPOP", key)) + return f, err +} +func LPopInt(key string) (int, error) { + return redigo.Int(Do("LPOP", key)) +} +func LPopInt64(key string) (int64, error) { + return redigo.Int64(Do("LPOP", key)) +} + +func RPush(key string, data interface{}) (interface{}, error) { + // set + return Do("RPUSH", key, data) +} + +func RPop(key string) (interface{}, error) { + return Do("RPOP", key) +} + +func RPopString(key string) (string, error) { + return redigo.String(Do("RPOP", key)) +} +func RPopFloat(key string) (float64, error) { + f, err := redigo.Float64(Do("RPOP", key)) + return f, err +} +func RPopInt(key string) (int, error) { + return redigo.Int(Do("RPOP", key)) +} +func RPopInt64(key string) (int64, error) { + return redigo.Int64(Do("RPOP", key)) +} + +func Scan(cursor int64, pattern string, count int64) (int64, []string, error) { + var items []string + var newCursor int64 + + values, err := redigo.Values(Do("SCAN", cursor, "MATCH", pattern, "COUNT", count)) + if err != nil { + return 0, nil, err + } + values, err = redigo.Scan(values, &newCursor, &items) + if err != nil { + return 0, nil, err + } + return newCursor, items, nil +} diff --git a/app/utils/cache/redis_cluster.go b/app/utils/cache/redis_cluster.go new file mode 100644 index 0000000..901f30c --- /dev/null +++ b/app/utils/cache/redis_cluster.go @@ -0,0 +1,622 @@ +package cache + +import ( + "strconv" + "time" + + "github.com/go-redis/redis" +) + +var pools *redis.ClusterClient + +func NewRedisCluster(addrs []string) error { + opt := &redis.ClusterOptions{ + Addrs: addrs, + PoolSize: redisPoolSize, + PoolTimeout: redisPoolTTL, + IdleTimeout: redisIdleTTL, + DialTimeout: redisDialTTL, + ReadTimeout: redisReadTTL, + WriteTimeout: redisWriteTTL, + } + pools = redis.NewClusterClient(opt) + if err := pools.Ping().Err(); err != nil { + return err + } + return nil +} + +func RCGet(key string) (interface{}, error) { + res, err := pools.Get(key).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func RCSet(key string, value interface{}) error { + err := pools.Set(key, value, 0).Err() + return convertError(err) +} +func RCGetSet(key string, value interface{}) (interface{}, error) { + res, err := pools.GetSet(key, value).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func RCSetNx(key string, value interface{}) (int64, error) { + res, err := pools.SetNX(key, value, 0).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func RCSetEx(key string, value interface{}, timeout int64) error { + _, err := pools.Set(key, value, time.Duration(timeout)*time.Second).Result() + if err != nil { + return convertError(err) + } + return nil +} + +// nil表示成功,ErrNil表示数据库内已经存在这个key,其他表示数据库发生错误 +func RCSetNxEx(key string, value interface{}, timeout int64) error { + res, err := pools.SetNX(key, value, time.Duration(timeout)*time.Second).Result() + if err != nil { + return convertError(err) + } + if res { + return nil + } + return ErrNil +} +func RCMGet(keys ...string) ([]interface{}, error) { + res, err := pools.MGet(keys...).Result() + return res, convertError(err) +} + +// 为确保多个key映射到同一个slot,每个key最好加上hash tag,如:{test} +func RCMSet(kvs map[string]interface{}) error { + pairs := make([]string, 0, len(kvs)*2) + for k, v := range kvs { + val, err := String(v, nil) + if err != nil { + return err + } + pairs = append(pairs, k, val) + } + return convertError(pools.MSet(pairs).Err()) +} + +// 为确保多个key映射到同一个slot,每个key最好加上hash tag,如:{test} +func RCMSetNX(kvs map[string]interface{}) (bool, error) { + pairs := make([]string, 0, len(kvs)*2) + for k, v := range kvs { + val, err := String(v, nil) + if err != nil { + return false, err + } + pairs = append(pairs, k, val) + } + res, err := pools.MSetNX(pairs).Result() + return res, convertError(err) +} +func RCExpireAt(key string, timestamp int64) (int64, error) { + res, err := pools.ExpireAt(key, time.Unix(timestamp, 0)).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func RCDel(keys ...string) (int64, error) { + args := make([]interface{}, 0, len(keys)) + for _, key := range keys { + args = append(args, key) + } + res, err := pools.Del(keys...).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCIncr(key string) (int64, error) { + res, err := pools.Incr(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCIncrBy(key string, delta int64) (int64, error) { + res, err := pools.IncrBy(key, delta).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCExpire(key string, duration int64) (int64, error) { + res, err := pools.Expire(key, time.Duration(duration)*time.Second).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func RCExists(key string) (bool, error) { + res, err := pools.Exists(key).Result() + if err != nil { + return false, convertError(err) + } + if res > 0 { + return true, nil + } + return false, nil +} +func RCHGet(key string, field string) (interface{}, error) { + res, err := pools.HGet(key, field).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func RCHLen(key string) (int64, error) { + res, err := pools.HLen(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCHSet(key string, field string, val interface{}) error { + value, err := String(val, nil) + if err != nil && err != ErrNil { + return err + } + _, err = pools.HSet(key, field, value).Result() + if err != nil { + return convertError(err) + } + return nil +} +func RCHDel(key string, fields ...string) (int64, error) { + args := make([]interface{}, 0, len(fields)+1) + args = append(args, key) + for _, field := range fields { + args = append(args, field) + } + res, err := pools.HDel(key, fields...).Result() + if err != nil { + return 0, convertError(err) + } + return res, nil +} + +func RCHMGet(key string, fields ...string) (interface{}, error) { + args := make([]interface{}, 0, len(fields)+1) + args = append(args, key) + for _, field := range fields { + args = append(args, field) + } + if len(fields) == 0 { + return nil, ErrNil + } + res, err := pools.HMGet(key, fields...).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCHMSet(key string, kvs ...interface{}) error { + if len(kvs) == 0 { + return nil + } + if len(kvs)%2 != 0 { + return ErrWrongArgsNum + } + var err error + v := map[string]interface{}{} // todo change + v["field"], err = String(kvs[0], nil) + if err != nil && err != ErrNil { + return err + } + v["value"], err = String(kvs[1], nil) + if err != nil && err != ErrNil { + return err + } + pairs := make([]string, 0, len(kvs)-2) + if len(kvs) > 2 { + for _, kv := range kvs[2:] { + kvString, err := String(kv, nil) + if err != nil && err != ErrNil { + return err + } + pairs = append(pairs, kvString) + } + } + v["paris"] = pairs + _, err = pools.HMSet(key, v).Result() + if err != nil { + return convertError(err) + } + return nil +} + +func RCHKeys(key string) ([]string, error) { + res, err := pools.HKeys(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCHVals(key string) ([]interface{}, error) { + res, err := pools.HVals(key).Result() + if err != nil { + return nil, convertError(err) + } + rs := make([]interface{}, 0, len(res)) + for _, res := range res { + rs = append(rs, res) + } + return rs, nil +} +func RCHGetAll(key string) (map[string]string, error) { + vals, err := pools.HGetAll(key).Result() + if err != nil { + return nil, convertError(err) + } + return vals, nil +} +func RCHIncrBy(key, field string, delta int64) (int64, error) { + res, err := pools.HIncrBy(key, field, delta).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCZAdd(key string, kvs ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(kvs)+1) + args = append(args, key) + args = append(args, kvs...) + if len(kvs) == 0 { + return 0, nil + } + if len(kvs)%2 != 0 { + return 0, ErrWrongArgsNum + } + zs := make([]redis.Z, len(kvs)/2) + for i := 0; i < len(kvs); i += 2 { + idx := i / 2 + score, err := Float64(kvs[i], nil) + if err != nil && err != ErrNil { + return 0, err + } + zs[idx].Score = score + zs[idx].Member = kvs[i+1] + } + res, err := pools.ZAdd(key, zs...).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCZRem(key string, members ...string) (int64, error) { + args := make([]interface{}, 0, len(members)) + args = append(args, key) + for _, member := range members { + args = append(args, member) + } + res, err := pools.ZRem(key, members).Result() + if err != nil { + return res, convertError(err) + } + return res, err +} + +func RCZRange(key string, min, max int64, withScores bool) (interface{}, error) { + res := make([]interface{}, 0) + if withScores { + zs, err := pools.ZRangeWithScores(key, min, max).Result() + if err != nil { + return nil, convertError(err) + } + for _, z := range zs { + res = append(res, z.Member, strconv.FormatFloat(z.Score, 'f', -1, 64)) + } + } else { + ms, err := pools.ZRange(key, min, max).Result() + if err != nil { + return nil, convertError(err) + } + for _, m := range ms { + res = append(res, m) + } + } + return res, nil +} +func RCZRangeByScoreWithScore(key string, min, max int64) (map[string]int64, error) { + opt := new(redis.ZRangeBy) + opt.Min = strconv.FormatInt(int64(min), 10) + opt.Max = strconv.FormatInt(int64(max), 10) + opt.Count = -1 + opt.Offset = 0 + vals, err := pools.ZRangeByScoreWithScores(key, *opt).Result() + if err != nil { + return nil, convertError(err) + } + res := make(map[string]int64, len(vals)) + for _, val := range vals { + key, err := String(val.Member, nil) + if err != nil && err != ErrNil { + return nil, err + } + res[key] = int64(val.Score) + } + return res, nil +} +func RCLRange(key string, start, stop int64) (interface{}, error) { + res, err := pools.LRange(key, start, stop).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCLSet(key string, index int, value interface{}) error { + err := pools.LSet(key, int64(index), value).Err() + return convertError(err) +} +func RCLLen(key string) (int64, error) { + res, err := pools.LLen(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCLRem(key string, count int, value interface{}) (int, error) { + val, _ := value.(string) + res, err := pools.LRem(key, int64(count), val).Result() + if err != nil { + return int(res), convertError(err) + } + return int(res), nil +} +func RCTTl(key string) (int64, error) { + duration, err := pools.TTL(key).Result() + if err != nil { + return int64(duration.Seconds()), convertError(err) + } + return int64(duration.Seconds()), nil +} +func RCLPop(key string) (interface{}, error) { + res, err := pools.LPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCRPop(key string) (interface{}, error) { + res, err := pools.RPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCBLPop(key string, timeout int) (interface{}, error) { + res, err := pools.BLPop(time.Duration(timeout)*time.Second, key).Result() + if err != nil { + // 兼容redis 2.x + if err == redis.Nil { + return nil, ErrNil + } + return nil, err + } + return res[1], nil +} +func RCBRPop(key string, timeout int) (interface{}, error) { + res, err := pools.BRPop(time.Duration(timeout)*time.Second, key).Result() + if err != nil { + // 兼容redis 2.x + if err == redis.Nil { + return nil, ErrNil + } + return nil, convertError(err) + } + return res[1], nil +} +func RCLPush(key string, value ...interface{}) error { + args := make([]interface{}, 0, len(value)+1) + args = append(args, key) + args = append(args, value...) + vals := make([]string, 0, len(value)) + for _, v := range value { + val, err := String(v, nil) + if err != nil && err != ErrNil { + return err + } + vals = append(vals, val) + } + _, err := pools.LPush(key, vals).Result() // todo ... + if err != nil { + return convertError(err) + } + return nil +} +func RCRPush(key string, value ...interface{}) error { + args := make([]interface{}, 0, len(value)+1) + args = append(args, key) + args = append(args, value...) + vals := make([]string, 0, len(value)) + for _, v := range value { + val, err := String(v, nil) + if err != nil && err != ErrNil { + if err == ErrNil { + continue + } + return err + } + if val == "" { + continue + } + vals = append(vals, val) + } + _, err := pools.RPush(key, vals).Result() // todo ... + if err != nil { + return convertError(err) + } + return nil +} + +// 为确保srcKey跟destKey映射到同一个slot,srcKey和destKey需要加上hash tag,如:{test} +func RCBRPopLPush(srcKey string, destKey string, timeout int) (interface{}, error) { + res, err := pools.BRPopLPush(srcKey, destKey, time.Duration(timeout)*time.Second).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} + +// 为确保srcKey跟destKey映射到同一个slot,srcKey和destKey需要加上hash tag,如:{test} +func RCRPopLPush(srcKey string, destKey string) (interface{}, error) { + res, err := pools.RPopLPush(srcKey, destKey).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCSAdd(key string, members ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(members)+1) + args = append(args, key) + args = append(args, members...) + ms := make([]string, 0, len(members)) + for _, member := range members { + m, err := String(member, nil) + if err != nil && err != ErrNil { + return 0, err + } + ms = append(ms, m) + } + res, err := pools.SAdd(key, ms).Result() // todo ... + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCSPop(key string) ([]byte, error) { + res, err := pools.SPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func RCSIsMember(key string, member interface{}) (bool, error) { + m, _ := member.(string) + res, err := pools.SIsMember(key, m).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCSRem(key string, members ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(members)+1) + args = append(args, key) + args = append(args, members...) + ms := make([]string, 0, len(members)) + for _, member := range members { + m, err := String(member, nil) + if err != nil && err != ErrNil { + return 0, err + } + ms = append(ms, m) + } + res, err := pools.SRem(key, ms).Result() // todo ... + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCSMembers(key string) ([]string, error) { + res, err := pools.SMembers(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCScriptLoad(luaScript string) (interface{}, error) { + res, err := pools.ScriptLoad(luaScript).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCEvalSha(sha1 string, numberKeys int, keysArgs ...interface{}) (interface{}, error) { + vals := make([]interface{}, 0, len(keysArgs)+2) + vals = append(vals, sha1, numberKeys) + vals = append(vals, keysArgs...) + keys := make([]string, 0, numberKeys) + args := make([]string, 0, len(keysArgs)-numberKeys) + for i, value := range keysArgs { + val, err := String(value, nil) + if err != nil && err != ErrNil { + return nil, err + } + if i < numberKeys { + keys = append(keys, val) + } else { + args = append(args, val) + } + } + res, err := pools.EvalSha(sha1, keys, args).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCEval(luaScript string, numberKeys int, keysArgs ...interface{}) (interface{}, error) { + vals := make([]interface{}, 0, len(keysArgs)+2) + vals = append(vals, luaScript, numberKeys) + vals = append(vals, keysArgs...) + keys := make([]string, 0, numberKeys) + args := make([]string, 0, len(keysArgs)-numberKeys) + for i, value := range keysArgs { + val, err := String(value, nil) + if err != nil && err != ErrNil { + return nil, err + } + if i < numberKeys { + keys = append(keys, val) + } else { + args = append(args, val) + } + } + res, err := pools.Eval(luaScript, keys, args).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCGetBit(key string, offset int64) (int64, error) { + res, err := pools.GetBit(key, offset).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCSetBit(key string, offset uint32, value int) (int, error) { + res, err := pools.SetBit(key, int64(offset), value).Result() + return int(res), convertError(err) +} +func RCGetClient() *redis.ClusterClient { + return pools +} +func convertError(err error) error { + if err == redis.Nil { + // 为了兼容redis 2.x,这里不返回 ErrNil,ErrNil在调用redis_cluster_reply函数时才返回 + return nil + } + return err +} diff --git a/app/utils/cache/redis_pool.go b/app/utils/cache/redis_pool.go new file mode 100644 index 0000000..ca38b3f --- /dev/null +++ b/app/utils/cache/redis_pool.go @@ -0,0 +1,324 @@ +package cache + +import ( + "errors" + "log" + "strings" + "time" + + redigo "github.com/gomodule/redigo/redis" +) + +type RedisPool struct { + *redigo.Pool +} + +func NewRedisPool(cfg *Config) *RedisPool { + return &RedisPool{&redigo.Pool{ + MaxIdle: cfg.MaxIdle, + IdleTimeout: cfg.IdleTimeout, + MaxActive: cfg.MaxActive, + Wait: cfg.Wait, + Dial: func() (redigo.Conn, error) { + c, err := redigo.Dial("tcp", cfg.Server) + if err != nil { + log.Println("Redis Dial failed: ", err) + return nil, err + } + if cfg.Password != "" { + if _, err := c.Do("AUTH", cfg.Password); err != nil { + c.Close() + log.Println("Redis AUTH failed: ", err) + return nil, err + } + } + return c, err + }, + TestOnBorrow: func(c redigo.Conn, t time.Time) error { + _, err := c.Do("PING") + if err != nil { + log.Println("Unable to ping to redis server:", err) + } + return err + }, + }} +} + +func (p *RedisPool) Do(cmd string, args ...interface{}) (reply interface{}, err error) { + conn := pool.Get() + defer conn.Close() + return conn.Do(cmd, args...) +} + +func (p *RedisPool) GetPool() *redigo.Pool { + return pool +} + +func (p *RedisPool) ParseKey(key string, vars []string) (string, error) { + arr := strings.Split(key, conf.KeyPlaceholder) + actualKey := "" + if len(arr) != len(vars)+1 { + return "", errors.New("redis/connection.go: Insufficient arguments to parse key") + } else { + for index, val := range arr { + if index == 0 { + actualKey = arr[index] + } else { + actualKey += vars[index-1] + val + } + } + } + return getPrefixedKey(actualKey), nil +} + +func (p *RedisPool) getPrefixedKey(key string) string { + return conf.KeyPrefix + conf.KeyDelimiter + key +} +func (p *RedisPool) StripEnvKey(key string) string { + return strings.TrimLeft(key, conf.KeyPrefix+conf.KeyDelimiter) +} +func (p *RedisPool) SplitKey(key string) []string { + return strings.Split(key, conf.KeyDelimiter) +} +func (p *RedisPool) Expire(key string, ttl int) (interface{}, error) { + return Do("EXPIRE", key, ttl) +} +func (p *RedisPool) Persist(key string) (interface{}, error) { + return Do("PERSIST", key) +} + +func (p *RedisPool) Del(key string) (interface{}, error) { + return Do("DEL", key) +} +func (p *RedisPool) Set(key string, data interface{}) (interface{}, error) { + // set + return Do("SET", key, data) +} +func (p *RedisPool) SetNX(key string, data interface{}) (interface{}, error) { + return Do("SETNX", key, data) +} +func (p *RedisPool) SetEx(key string, data interface{}, ttl int) (interface{}, error) { + return Do("SETEX", key, ttl, data) +} +func (p *RedisPool) Get(key string) (interface{}, error) { + // get + return Do("GET", key) +} +func (p *RedisPool) GetStringMap(key string) (map[string]string, error) { + // get + return redigo.StringMap(Do("GET", key)) +} + +func (p *RedisPool) GetTTL(key string) (time.Duration, error) { + ttl, err := redigo.Int64(Do("TTL", key)) + return time.Duration(ttl) * time.Second, err +} +func (p *RedisPool) GetBytes(key string) ([]byte, error) { + return redigo.Bytes(Do("GET", key)) +} +func (p *RedisPool) GetString(key string) (string, error) { + return redigo.String(Do("GET", key)) +} +func (p *RedisPool) GetInt(key string) (int, error) { + return redigo.Int(Do("GET", key)) +} +func (p *RedisPool) GetStringLength(key string) (int, error) { + return redigo.Int(Do("STRLEN", key)) +} +func (p *RedisPool) ZAdd(key string, score float64, data interface{}) (interface{}, error) { + return Do("ZADD", key, score, data) +} +func (p *RedisPool) ZRem(key string, data interface{}) (interface{}, error) { + return Do("ZREM", key, data) +} +func (p *RedisPool) ZRange(key string, start int, end int, withScores bool) ([]interface{}, error) { + if withScores { + return redigo.Values(Do("ZRANGE", key, start, end, "WITHSCORES")) + } + return redigo.Values(Do("ZRANGE", key, start, end)) +} +func (p *RedisPool) SAdd(setName string, data interface{}) (interface{}, error) { + return Do("SADD", setName, data) +} +func (p *RedisPool) SCard(setName string) (int64, error) { + return redigo.Int64(Do("SCARD", setName)) +} +func (p *RedisPool) SIsMember(setName string, data interface{}) (bool, error) { + return redigo.Bool(Do("SISMEMBER", setName, data)) +} +func (p *RedisPool) SMembers(setName string) ([]string, error) { + return redigo.Strings(Do("SMEMBERS", setName)) +} +func (p *RedisPool) SRem(setName string, data interface{}) (interface{}, error) { + return Do("SREM", setName, data) +} +func (p *RedisPool) HSet(key string, HKey string, data interface{}) (interface{}, error) { + return Do("HSET", key, HKey, data) +} + +func (p *RedisPool) HGet(key string, HKey string) (interface{}, error) { + return Do("HGET", key, HKey) +} + +func (p *RedisPool) HMGet(key string, hashKeys ...string) ([]interface{}, error) { + ret, err := Do("HMGET", key, hashKeys) + if err != nil { + return nil, err + } + reta, ok := ret.([]interface{}) + if !ok { + return nil, errors.New("result not an array") + } + return reta, nil +} + +func (p *RedisPool) HMSet(key string, hashKeys []string, vals []interface{}) (interface{}, error) { + if len(hashKeys) == 0 || len(hashKeys) != len(vals) { + var ret interface{} + return ret, errors.New("bad length") + } + input := []interface{}{key} + for i, v := range hashKeys { + input = append(input, v, vals[i]) + } + return Do("HMSET", input...) +} + +func (p *RedisPool) HGetString(key string, HKey string) (string, error) { + return redigo.String(Do("HGET", key, HKey)) +} +func (p *RedisPool) HGetFloat(key string, HKey string) (float64, error) { + f, err := redigo.Float64(Do("HGET", key, HKey)) + return float64(f), err +} +func (p *RedisPool) HGetInt(key string, HKey string) (int, error) { + return redigo.Int(Do("HGET", key, HKey)) +} +func (p *RedisPool) HGetInt64(key string, HKey string) (int64, error) { + return redigo.Int64(Do("HGET", key, HKey)) +} +func (p *RedisPool) HGetBool(key string, HKey string) (bool, error) { + return redigo.Bool(Do("HGET", key, HKey)) +} +func (p *RedisPool) HDel(key string, HKey string) (interface{}, error) { + return Do("HDEL", key, HKey) +} +func (p *RedisPool) HGetAll(key string) (map[string]interface{}, error) { + vals, err := redigo.Values(Do("HGETALL", key)) + if err != nil { + return nil, err + } + num := len(vals) / 2 + result := make(map[string]interface{}, num) + for i := 0; i < num; i++ { + key, _ := redigo.String(vals[2*i], nil) + result[key] = vals[2*i+1] + } + return result, nil +} + +// NOTE: Use this in production environment with extreme care. +// Read more here:https://redigo.io/commands/keys +func (p *RedisPool) Keys(pattern string) ([]string, error) { + return redigo.Strings(Do("KEYS", pattern)) +} + +func (p *RedisPool) HKeys(key string) ([]string, error) { + return redigo.Strings(Do("HKEYS", key)) +} + +func (p *RedisPool) Exists(key string) (bool, error) { + count, err := redigo.Int(Do("EXISTS", key)) + if count == 0 { + return false, err + } else { + return true, err + } +} + +func (p *RedisPool) Incr(key string) (int64, error) { + return redigo.Int64(Do("INCR", key)) +} + +func (p *RedisPool) Decr(key string) (int64, error) { + return redigo.Int64(Do("DECR", key)) +} + +func (p *RedisPool) IncrBy(key string, incBy int64) (int64, error) { + return redigo.Int64(Do("INCRBY", key, incBy)) +} + +func (p *RedisPool) DecrBy(key string, decrBy int64) (int64, error) { + return redigo.Int64(Do("DECRBY", key)) +} + +func (p *RedisPool) IncrByFloat(key string, incBy float64) (float64, error) { + return redigo.Float64(Do("INCRBYFLOAT", key, incBy)) +} + +func (p *RedisPool) DecrByFloat(key string, decrBy float64) (float64, error) { + return redigo.Float64(Do("DECRBYFLOAT", key, decrBy)) +} + +// use for message queue +func (p *RedisPool) LPush(key string, data interface{}) (interface{}, error) { + // set + return Do("LPUSH", key, data) +} + +func (p *RedisPool) LPop(key string) (interface{}, error) { + return Do("LPOP", key) +} + +func (p *RedisPool) LPopString(key string) (string, error) { + return redigo.String(Do("LPOP", key)) +} +func (p *RedisPool) LPopFloat(key string) (float64, error) { + f, err := redigo.Float64(Do("LPOP", key)) + return float64(f), err +} +func (p *RedisPool) LPopInt(key string) (int, error) { + return redigo.Int(Do("LPOP", key)) +} +func (p *RedisPool) LPopInt64(key string) (int64, error) { + return redigo.Int64(Do("LPOP", key)) +} + +func (p *RedisPool) RPush(key string, data interface{}) (interface{}, error) { + // set + return Do("RPUSH", key, data) +} + +func (p *RedisPool) RPop(key string) (interface{}, error) { + return Do("RPOP", key) +} + +func (p *RedisPool) RPopString(key string) (string, error) { + return redigo.String(Do("RPOP", key)) +} +func (p *RedisPool) RPopFloat(key string) (float64, error) { + f, err := redigo.Float64(Do("RPOP", key)) + return float64(f), err +} +func (p *RedisPool) RPopInt(key string) (int, error) { + return redigo.Int(Do("RPOP", key)) +} +func (p *RedisPool) RPopInt64(key string) (int64, error) { + return redigo.Int64(Do("RPOP", key)) +} + +func (p *RedisPool) Scan(cursor int64, pattern string, count int64) (int64, []string, error) { + var items []string + var newCursor int64 + + values, err := redigo.Values(Do("SCAN", cursor, "MATCH", pattern, "COUNT", count)) + if err != nil { + return 0, nil, err + } + values, err = redigo.Scan(values, &newCursor, &items) + if err != nil { + return 0, nil, err + } + + return newCursor, items, nil +} diff --git a/app/utils/cache/redis_pool_cluster.go b/app/utils/cache/redis_pool_cluster.go new file mode 100644 index 0000000..cd1911b --- /dev/null +++ b/app/utils/cache/redis_pool_cluster.go @@ -0,0 +1,617 @@ +package cache + +import ( + "strconv" + "time" + + "github.com/go-redis/redis" +) + +type RedisClusterPool struct { + client *redis.ClusterClient +} + +func NewRedisClusterPool(addrs []string) (*RedisClusterPool, error) { + opt := &redis.ClusterOptions{ + Addrs: addrs, + PoolSize: 512, + PoolTimeout: 10 * time.Second, + IdleTimeout: 10 * time.Second, + DialTimeout: 10 * time.Second, + ReadTimeout: 3 * time.Second, + WriteTimeout: 3 * time.Second, + } + c := redis.NewClusterClient(opt) + if err := c.Ping().Err(); err != nil { + return nil, err + } + return &RedisClusterPool{client: c}, nil +} + +func (p *RedisClusterPool) Get(key string) (interface{}, error) { + res, err := p.client.Get(key).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func (p *RedisClusterPool) Set(key string, value interface{}) error { + err := p.client.Set(key, value, 0).Err() + return convertError(err) +} +func (p *RedisClusterPool) GetSet(key string, value interface{}) (interface{}, error) { + res, err := p.client.GetSet(key, value).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func (p *RedisClusterPool) SetNx(key string, value interface{}) (int64, error) { + res, err := p.client.SetNX(key, value, 0).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func (p *RedisClusterPool) SetEx(key string, value interface{}, timeout int64) error { + _, err := p.client.Set(key, value, time.Duration(timeout)*time.Second).Result() + if err != nil { + return convertError(err) + } + return nil +} + +// nil表示成功,ErrNil表示数据库内已经存在这个key,其他表示数据库发生错误 +func (p *RedisClusterPool) SetNxEx(key string, value interface{}, timeout int64) error { + res, err := p.client.SetNX(key, value, time.Duration(timeout)*time.Second).Result() + if err != nil { + return convertError(err) + } + if res { + return nil + } + return ErrNil +} +func (p *RedisClusterPool) MGet(keys ...string) ([]interface{}, error) { + res, err := p.client.MGet(keys...).Result() + return res, convertError(err) +} + +// 为确保多个key映射到同一个slot,每个key最好加上hash tag,如:{test} +func (p *RedisClusterPool) MSet(kvs map[string]interface{}) error { + pairs := make([]string, 0, len(kvs)*2) + for k, v := range kvs { + val, err := String(v, nil) + if err != nil { + return err + } + pairs = append(pairs, k, val) + } + return convertError(p.client.MSet(pairs).Err()) +} + +// 为确保多个key映射到同一个slot,每个key最好加上hash tag,如:{test} +func (p *RedisClusterPool) MSetNX(kvs map[string]interface{}) (bool, error) { + pairs := make([]string, 0, len(kvs)*2) + for k, v := range kvs { + val, err := String(v, nil) + if err != nil { + return false, err + } + pairs = append(pairs, k, val) + } + res, err := p.client.MSetNX(pairs).Result() + return res, convertError(err) +} +func (p *RedisClusterPool) ExpireAt(key string, timestamp int64) (int64, error) { + res, err := p.client.ExpireAt(key, time.Unix(timestamp, 0)).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func (p *RedisClusterPool) Del(keys ...string) (int64, error) { + args := make([]interface{}, 0, len(keys)) + for _, key := range keys { + args = append(args, key) + } + res, err := p.client.Del(keys...).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) Incr(key string) (int64, error) { + res, err := p.client.Incr(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) IncrBy(key string, delta int64) (int64, error) { + res, err := p.client.IncrBy(key, delta).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) Expire(key string, duration int64) (int64, error) { + res, err := p.client.Expire(key, time.Duration(duration)*time.Second).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func (p *RedisClusterPool) Exists(key string) (bool, error) { // todo (bool, error) + res, err := p.client.Exists(key).Result() + if err != nil { + return false, convertError(err) + } + if res > 0 { + return true, nil + } + return false, nil +} +func (p *RedisClusterPool) HGet(key string, field string) (interface{}, error) { + res, err := p.client.HGet(key, field).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func (p *RedisClusterPool) HLen(key string) (int64, error) { + res, err := p.client.HLen(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) HSet(key string, field string, val interface{}) error { + value, err := String(val, nil) + if err != nil && err != ErrNil { + return err + } + _, err = p.client.HSet(key, field, value).Result() + if err != nil { + return convertError(err) + } + return nil +} +func (p *RedisClusterPool) HDel(key string, fields ...string) (int64, error) { + args := make([]interface{}, 0, len(fields)+1) + args = append(args, key) + for _, field := range fields { + args = append(args, field) + } + res, err := p.client.HDel(key, fields...).Result() + if err != nil { + return 0, convertError(err) + } + return res, nil +} + +func (p *RedisClusterPool) HMGet(key string, fields ...string) (interface{}, error) { + args := make([]interface{}, 0, len(fields)+1) + args = append(args, key) + for _, field := range fields { + args = append(args, field) + } + if len(fields) == 0 { + return nil, ErrNil + } + res, err := p.client.HMGet(key, fields...).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) HMSet(key string, kvs ...interface{}) error { + if len(kvs) == 0 { + return nil + } + if len(kvs)%2 != 0 { + return ErrWrongArgsNum + } + var err error + v := map[string]interface{}{} // todo change + v["field"], err = String(kvs[0], nil) + if err != nil && err != ErrNil { + return err + } + v["value"], err = String(kvs[1], nil) + if err != nil && err != ErrNil { + return err + } + pairs := make([]string, 0, len(kvs)-2) + if len(kvs) > 2 { + for _, kv := range kvs[2:] { + kvString, err := String(kv, nil) + if err != nil && err != ErrNil { + return err + } + pairs = append(pairs, kvString) + } + } + v["paris"] = pairs + _, err = p.client.HMSet(key, v).Result() + if err != nil { + return convertError(err) + } + return nil +} + +func (p *RedisClusterPool) HKeys(key string) ([]string, error) { + res, err := p.client.HKeys(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) HVals(key string) ([]interface{}, error) { + res, err := p.client.HVals(key).Result() + if err != nil { + return nil, convertError(err) + } + rs := make([]interface{}, 0, len(res)) + for _, res := range res { + rs = append(rs, res) + } + return rs, nil +} +func (p *RedisClusterPool) HGetAll(key string) (map[string]string, error) { + vals, err := p.client.HGetAll(key).Result() + if err != nil { + return nil, convertError(err) + } + return vals, nil +} +func (p *RedisClusterPool) HIncrBy(key, field string, delta int64) (int64, error) { + res, err := p.client.HIncrBy(key, field, delta).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) ZAdd(key string, kvs ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(kvs)+1) + args = append(args, key) + args = append(args, kvs...) + if len(kvs) == 0 { + return 0, nil + } + if len(kvs)%2 != 0 { + return 0, ErrWrongArgsNum + } + zs := make([]redis.Z, len(kvs)/2) + for i := 0; i < len(kvs); i += 2 { + idx := i / 2 + score, err := Float64(kvs[i], nil) + if err != nil && err != ErrNil { + return 0, err + } + zs[idx].Score = score + zs[idx].Member = kvs[i+1] + } + res, err := p.client.ZAdd(key, zs...).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) ZRem(key string, members ...string) (int64, error) { + args := make([]interface{}, 0, len(members)) + args = append(args, key) + for _, member := range members { + args = append(args, member) + } + res, err := p.client.ZRem(key, members).Result() + if err != nil { + return res, convertError(err) + } + return res, err +} + +func (p *RedisClusterPool) ZRange(key string, min, max int64, withScores bool) (interface{}, error) { + res := make([]interface{}, 0) + if withScores { + zs, err := p.client.ZRangeWithScores(key, min, max).Result() + if err != nil { + return nil, convertError(err) + } + for _, z := range zs { + res = append(res, z.Member, strconv.FormatFloat(z.Score, 'f', -1, 64)) + } + } else { + ms, err := p.client.ZRange(key, min, max).Result() + if err != nil { + return nil, convertError(err) + } + for _, m := range ms { + res = append(res, m) + } + } + return res, nil +} +func (p *RedisClusterPool) ZRangeByScoreWithScore(key string, min, max int64) (map[string]int64, error) { + opt := new(redis.ZRangeBy) + opt.Min = strconv.FormatInt(int64(min), 10) + opt.Max = strconv.FormatInt(int64(max), 10) + opt.Count = -1 + opt.Offset = 0 + vals, err := p.client.ZRangeByScoreWithScores(key, *opt).Result() + if err != nil { + return nil, convertError(err) + } + res := make(map[string]int64, len(vals)) + for _, val := range vals { + key, err := String(val.Member, nil) + if err != nil && err != ErrNil { + return nil, err + } + res[key] = int64(val.Score) + } + return res, nil +} +func (p *RedisClusterPool) LRange(key string, start, stop int64) (interface{}, error) { + res, err := p.client.LRange(key, start, stop).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) LSet(key string, index int, value interface{}) error { + err := p.client.LSet(key, int64(index), value).Err() + return convertError(err) +} +func (p *RedisClusterPool) LLen(key string) (int64, error) { + res, err := p.client.LLen(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) LRem(key string, count int, value interface{}) (int, error) { + val, _ := value.(string) + res, err := p.client.LRem(key, int64(count), val).Result() + if err != nil { + return int(res), convertError(err) + } + return int(res), nil +} +func (p *RedisClusterPool) TTl(key string) (int64, error) { + duration, err := p.client.TTL(key).Result() + if err != nil { + return int64(duration.Seconds()), convertError(err) + } + return int64(duration.Seconds()), nil +} +func (p *RedisClusterPool) LPop(key string) (interface{}, error) { + res, err := p.client.LPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) RPop(key string) (interface{}, error) { + res, err := p.client.RPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) BLPop(key string, timeout int) (interface{}, error) { + res, err := p.client.BLPop(time.Duration(timeout)*time.Second, key).Result() + if err != nil { + // 兼容redis 2.x + if err == redis.Nil { + return nil, ErrNil + } + return nil, err + } + return res[1], nil +} +func (p *RedisClusterPool) BRPop(key string, timeout int) (interface{}, error) { + res, err := p.client.BRPop(time.Duration(timeout)*time.Second, key).Result() + if err != nil { + // 兼容redis 2.x + if err == redis.Nil { + return nil, ErrNil + } + return nil, convertError(err) + } + return res[1], nil +} +func (p *RedisClusterPool) LPush(key string, value ...interface{}) error { + args := make([]interface{}, 0, len(value)+1) + args = append(args, key) + args = append(args, value...) + vals := make([]string, 0, len(value)) + for _, v := range value { + val, err := String(v, nil) + if err != nil && err != ErrNil { + return err + } + vals = append(vals, val) + } + _, err := p.client.LPush(key, vals).Result() // todo ... + if err != nil { + return convertError(err) + } + return nil +} +func (p *RedisClusterPool) RPush(key string, value ...interface{}) error { + args := make([]interface{}, 0, len(value)+1) + args = append(args, key) + args = append(args, value...) + vals := make([]string, 0, len(value)) + for _, v := range value { + val, err := String(v, nil) + if err != nil && err != ErrNil { + if err == ErrNil { + continue + } + return err + } + if val == "" { + continue + } + vals = append(vals, val) + } + _, err := p.client.RPush(key, vals).Result() // todo ... + if err != nil { + return convertError(err) + } + return nil +} + +// 为确保srcKey跟destKey映射到同一个slot,srcKey和destKey需要加上hash tag,如:{test} +func (p *RedisClusterPool) BRPopLPush(srcKey string, destKey string, timeout int) (interface{}, error) { + res, err := p.client.BRPopLPush(srcKey, destKey, time.Duration(timeout)*time.Second).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} + +// 为确保srcKey跟destKey映射到同一个slot,srcKey和destKey需要加上hash tag,如:{test} +func (p *RedisClusterPool) RPopLPush(srcKey string, destKey string) (interface{}, error) { + res, err := p.client.RPopLPush(srcKey, destKey).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SAdd(key string, members ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(members)+1) + args = append(args, key) + args = append(args, members...) + ms := make([]string, 0, len(members)) + for _, member := range members { + m, err := String(member, nil) + if err != nil && err != ErrNil { + return 0, err + } + ms = append(ms, m) + } + res, err := p.client.SAdd(key, ms).Result() // todo ... + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SPop(key string) ([]byte, error) { + res, err := p.client.SPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func (p *RedisClusterPool) SIsMember(key string, member interface{}) (bool, error) { + m, _ := member.(string) + res, err := p.client.SIsMember(key, m).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SRem(key string, members ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(members)+1) + args = append(args, key) + args = append(args, members...) + ms := make([]string, 0, len(members)) + for _, member := range members { + m, err := String(member, nil) + if err != nil && err != ErrNil { + return 0, err + } + ms = append(ms, m) + } + res, err := p.client.SRem(key, ms).Result() // todo ... + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SMembers(key string) ([]string, error) { + res, err := p.client.SMembers(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) ScriptLoad(luaScript string) (interface{}, error) { + res, err := p.client.ScriptLoad(luaScript).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) EvalSha(sha1 string, numberKeys int, keysArgs ...interface{}) (interface{}, error) { + vals := make([]interface{}, 0, len(keysArgs)+2) + vals = append(vals, sha1, numberKeys) + vals = append(vals, keysArgs...) + keys := make([]string, 0, numberKeys) + args := make([]string, 0, len(keysArgs)-numberKeys) + for i, value := range keysArgs { + val, err := String(value, nil) + if err != nil && err != ErrNil { + return nil, err + } + if i < numberKeys { + keys = append(keys, val) + } else { + args = append(args, val) + } + } + res, err := p.client.EvalSha(sha1, keys, args).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) Eval(luaScript string, numberKeys int, keysArgs ...interface{}) (interface{}, error) { + vals := make([]interface{}, 0, len(keysArgs)+2) + vals = append(vals, luaScript, numberKeys) + vals = append(vals, keysArgs...) + keys := make([]string, 0, numberKeys) + args := make([]string, 0, len(keysArgs)-numberKeys) + for i, value := range keysArgs { + val, err := String(value, nil) + if err != nil && err != ErrNil { + return nil, err + } + if i < numberKeys { + keys = append(keys, val) + } else { + args = append(args, val) + } + } + res, err := p.client.Eval(luaScript, keys, args).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) GetBit(key string, offset int64) (int64, error) { + res, err := p.client.GetBit(key, offset).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SetBit(key string, offset uint32, value int) (int, error) { + res, err := p.client.SetBit(key, int64(offset), value).Result() + return int(res), convertError(err) +} +func (p *RedisClusterPool) GetClient() *redis.ClusterClient { + return pools +} diff --git a/app/utils/cachesecond/base.go b/app/utils/cachesecond/base.go new file mode 100644 index 0000000..126c4d3 --- /dev/null +++ b/app/utils/cachesecond/base.go @@ -0,0 +1,421 @@ +package cachesecond + +import ( + "errors" + "fmt" + "strconv" + "time" +) + +const ( + redisDialTTL = 10 * time.Second + redisReadTTL = 3 * time.Second + redisWriteTTL = 3 * time.Second + redisIdleTTL = 10 * time.Second + redisPoolTTL = 10 * time.Second + redisPoolSize int = 512 + redisMaxIdleConn int = 64 + redisMaxActive int = 512 +) + +var ( + ErrNil = errors.New("nil return") + ErrWrongArgsNum = errors.New("args num error") + ErrNegativeInt = errors.New("redis cluster: unexpected value for Uint64") +) + +// 以下为提供类型转换 + +func Int(reply interface{}, err error) (int, error) { + if err != nil { + return 0, err + } + switch reply := reply.(type) { + case int: + return reply, nil + case int8: + return int(reply), nil + case int16: + return int(reply), nil + case int32: + return int(reply), nil + case int64: + x := int(reply) + if int64(x) != reply { + return 0, strconv.ErrRange + } + return x, nil + case uint: + n := int(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case uint8: + return int(reply), nil + case uint16: + return int(reply), nil + case uint32: + n := int(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case uint64: + n := int(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case []byte: + data := string(reply) + if len(data) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseInt(data, 10, 0) + return int(n), err + case string: + if len(reply) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseInt(reply, 10, 0) + return int(n), err + case nil: + return 0, ErrNil + case error: + return 0, reply + } + return 0, fmt.Errorf("redis cluster: unexpected type for Int, got type %T", reply) +} + +func Int64(reply interface{}, err error) (int64, error) { + if err != nil { + return 0, err + } + switch reply := reply.(type) { + case int: + return int64(reply), nil + case int8: + return int64(reply), nil + case int16: + return int64(reply), nil + case int32: + return int64(reply), nil + case int64: + return reply, nil + case uint: + n := int64(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case uint8: + return int64(reply), nil + case uint16: + return int64(reply), nil + case uint32: + return int64(reply), nil + case uint64: + n := int64(reply) + if n < 0 { + return 0, strconv.ErrRange + } + return n, nil + case []byte: + data := string(reply) + if len(data) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseInt(data, 10, 64) + return n, err + case string: + if len(reply) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseInt(reply, 10, 64) + return n, err + case nil: + return 0, ErrNil + case error: + return 0, reply + } + return 0, fmt.Errorf("redis cluster: unexpected type for Int64, got type %T", reply) +} + +func Uint64(reply interface{}, err error) (uint64, error) { + if err != nil { + return 0, err + } + switch reply := reply.(type) { + case uint: + return uint64(reply), nil + case uint8: + return uint64(reply), nil + case uint16: + return uint64(reply), nil + case uint32: + return uint64(reply), nil + case uint64: + return reply, nil + case int: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case int8: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case int16: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case int32: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case int64: + if reply < 0 { + return 0, ErrNegativeInt + } + return uint64(reply), nil + case []byte: + data := string(reply) + if len(data) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseUint(data, 10, 64) + return n, err + case string: + if len(reply) == 0 { + return 0, ErrNil + } + + n, err := strconv.ParseUint(reply, 10, 64) + return n, err + case nil: + return 0, ErrNil + case error: + return 0, reply + } + return 0, fmt.Errorf("redis cluster: unexpected type for Uint64, got type %T", reply) +} + +func Float64(reply interface{}, err error) (float64, error) { + if err != nil { + return 0, err + } + + var value float64 + err = nil + switch v := reply.(type) { + case float32: + value = float64(v) + case float64: + value = v + case int: + value = float64(v) + case int8: + value = float64(v) + case int16: + value = float64(v) + case int32: + value = float64(v) + case int64: + value = float64(v) + case uint: + value = float64(v) + case uint8: + value = float64(v) + case uint16: + value = float64(v) + case uint32: + value = float64(v) + case uint64: + value = float64(v) + case []byte: + data := string(v) + if len(data) == 0 { + return 0, ErrNil + } + value, err = strconv.ParseFloat(string(v), 64) + case string: + if len(v) == 0 { + return 0, ErrNil + } + value, err = strconv.ParseFloat(v, 64) + case nil: + err = ErrNil + case error: + err = v + default: + err = fmt.Errorf("redis cluster: unexpected type for Float64, got type %T", v) + } + + return value, err +} + +func Bool(reply interface{}, err error) (bool, error) { + if err != nil { + return false, err + } + switch reply := reply.(type) { + case bool: + return reply, nil + case int64: + return reply != 0, nil + case []byte: + data := string(reply) + if len(data) == 0 { + return false, ErrNil + } + + return strconv.ParseBool(data) + case string: + if len(reply) == 0 { + return false, ErrNil + } + + return strconv.ParseBool(reply) + case nil: + return false, ErrNil + case error: + return false, reply + } + return false, fmt.Errorf("redis cluster: unexpected type for Bool, got type %T", reply) +} + +func Bytes(reply interface{}, err error) ([]byte, error) { + if err != nil { + return nil, err + } + switch reply := reply.(type) { + case []byte: + if len(reply) == 0 { + return nil, ErrNil + } + return reply, nil + case string: + data := []byte(reply) + if len(data) == 0 { + return nil, ErrNil + } + return data, nil + case nil: + return nil, ErrNil + case error: + return nil, reply + } + return nil, fmt.Errorf("redis cluster: unexpected type for Bytes, got type %T", reply) +} + +func String(reply interface{}, err error) (string, error) { + if err != nil { + return "", err + } + + value := "" + err = nil + switch v := reply.(type) { + case string: + if len(v) == 0 { + return "", ErrNil + } + + value = v + case []byte: + if len(v) == 0 { + return "", ErrNil + } + + value = string(v) + case int: + value = strconv.FormatInt(int64(v), 10) + case int8: + value = strconv.FormatInt(int64(v), 10) + case int16: + value = strconv.FormatInt(int64(v), 10) + case int32: + value = strconv.FormatInt(int64(v), 10) + case int64: + value = strconv.FormatInt(v, 10) + case uint: + value = strconv.FormatUint(uint64(v), 10) + case uint8: + value = strconv.FormatUint(uint64(v), 10) + case uint16: + value = strconv.FormatUint(uint64(v), 10) + case uint32: + value = strconv.FormatUint(uint64(v), 10) + case uint64: + value = strconv.FormatUint(v, 10) + case float32: + value = strconv.FormatFloat(float64(v), 'f', -1, 32) + case float64: + value = strconv.FormatFloat(v, 'f', -1, 64) + case bool: + value = strconv.FormatBool(v) + case nil: + err = ErrNil + case error: + err = v + default: + err = fmt.Errorf("redis cluster: unexpected type for String, got type %T", v) + } + + return value, err +} + +func Strings(reply interface{}, err error) ([]string, error) { + if err != nil { + return nil, err + } + switch reply := reply.(type) { + case []interface{}: + result := make([]string, len(reply)) + for i := range reply { + if reply[i] == nil { + continue + } + switch subReply := reply[i].(type) { + case string: + result[i] = subReply + case []byte: + result[i] = string(subReply) + default: + return nil, fmt.Errorf("redis cluster: unexpected element type for String, got type %T", reply[i]) + } + } + return result, nil + case []string: + return reply, nil + case nil: + return nil, ErrNil + case error: + return nil, reply + } + return nil, fmt.Errorf("redis cluster: unexpected type for Strings, got type %T", reply) +} + +func Values(reply interface{}, err error) ([]interface{}, error) { + if err != nil { + return nil, err + } + switch reply := reply.(type) { + case []interface{}: + return reply, nil + case nil: + return nil, ErrNil + case error: + return nil, reply + } + return nil, fmt.Errorf("redis cluster: unexpected type for Values, got type %T", reply) +} diff --git a/app/utils/cachesecond/cache/cache.go b/app/utils/cachesecond/cache/cache.go new file mode 100644 index 0000000..e43c5f0 --- /dev/null +++ b/app/utils/cachesecond/cache/cache.go @@ -0,0 +1,107 @@ +package cache + +import ( + "fmt" + "time" +) + +var c Cache + +type Cache interface { + // get cached value by key. + Get(key string) interface{} + // GetMulti is a batch version of Get. + GetMulti(keys []string) []interface{} + // set cached value with key and expire time. + Put(key string, val interface{}, timeout time.Duration) error + // delete cached value by key. + Delete(key string) error + // increase cached int value by key, as a counter. + Incr(key string) error + // decrease cached int value by key, as a counter. + Decr(key string) error + // check if cached value exists or not. + IsExist(key string) bool + // clear all cache. + ClearAll() error + // start gc routine based on config string settings. + StartAndGC(config string) error +} + +// Instance is a function create a new Cache Instance +type Instance func() Cache + +var adapters = make(map[string]Instance) + +// Register makes a cache adapter available by the adapter name. +// If Register is called twice with the same name or if driver is nil, +// it panics. +func Register(name string, adapter Instance) { + if adapter == nil { + panic("cache: Register adapter is nil") + } + if _, ok := adapters[name]; ok { + panic("cache: Register called twice for adapter " + name) + } + adapters[name] = adapter +} + +// NewCache Create a new cache driver by adapter name and config string. +// config need to be correct JSON as string: {"interval":360}. +// it will start gc automatically. +func NewCache(adapterName, config string) (adapter Cache, err error) { + instanceFunc, ok := adapters[adapterName] + if !ok { + err = fmt.Errorf("cache: unknown adapter name %q (forgot to import?)", adapterName) + return + } + adapter = instanceFunc() + err = adapter.StartAndGC(config) + if err != nil { + adapter = nil + } + return +} + +func InitCache(adapterName, config string) (err error) { + instanceFunc, ok := adapters[adapterName] + if !ok { + err = fmt.Errorf("cache: unknown adapter name %q (forgot to import?)", adapterName) + return + } + c = instanceFunc() + err = c.StartAndGC(config) + if err != nil { + c = nil + } + return +} + +func Get(key string) interface{} { + return c.Get(key) +} + +func GetMulti(keys []string) []interface{} { + return c.GetMulti(keys) +} +func Put(key string, val interface{}, ttl time.Duration) error { + return c.Put(key, val, ttl) +} +func Delete(key string) error { + return c.Delete(key) +} +func Incr(key string) error { + return c.Incr(key) +} +func Decr(key string) error { + return c.Decr(key) +} +func IsExist(key string) bool { + return c.IsExist(key) +} +func ClearAll() error { + return c.ClearAll() +} +func StartAndGC(cfg string) error { + return c.StartAndGC(cfg) +} diff --git a/app/utils/cachesecond/cache/conv.go b/app/utils/cachesecond/cache/conv.go new file mode 100644 index 0000000..6b700ae --- /dev/null +++ b/app/utils/cachesecond/cache/conv.go @@ -0,0 +1,86 @@ +package cache + +import ( + "fmt" + "strconv" +) + +// GetString convert interface to string. +func GetString(v interface{}) string { + switch result := v.(type) { + case string: + return result + case []byte: + return string(result) + default: + if v != nil { + return fmt.Sprint(result) + } + } + return "" +} + +// GetInt convert interface to int. +func GetInt(v interface{}) int { + switch result := v.(type) { + case int: + return result + case int32: + return int(result) + case int64: + return int(result) + default: + if d := GetString(v); d != "" { + value, _ := strconv.Atoi(d) + return value + } + } + return 0 +} + +// GetInt64 convert interface to int64. +func GetInt64(v interface{}) int64 { + switch result := v.(type) { + case int: + return int64(result) + case int32: + return int64(result) + case int64: + return result + default: + + if d := GetString(v); d != "" { + value, _ := strconv.ParseInt(d, 10, 64) + return value + } + } + return 0 +} + +// GetFloat64 convert interface to float64. +func GetFloat64(v interface{}) float64 { + switch result := v.(type) { + case float64: + return result + default: + if d := GetString(v); d != "" { + value, _ := strconv.ParseFloat(d, 64) + return value + } + } + return 0 +} + +// GetBool convert interface to bool. +func GetBool(v interface{}) bool { + switch result := v.(type) { + case bool: + return result + default: + if d := GetString(v); d != "" { + value, _ := strconv.ParseBool(d) + return value + } + } + return false +} diff --git a/app/utils/cachesecond/cache/file.go b/app/utils/cachesecond/cache/file.go new file mode 100644 index 0000000..5c4e366 --- /dev/null +++ b/app/utils/cachesecond/cache/file.go @@ -0,0 +1,241 @@ +package cache + +import ( + "bytes" + "crypto/md5" + "encoding/gob" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "reflect" + "strconv" + "time" +) + +// FileCacheItem is basic unit of file cache adapter. +// it contains data and expire time. +type FileCacheItem struct { + Data interface{} + LastAccess time.Time + Expired time.Time +} + +// FileCache Config +var ( + FileCachePath = "cache" // cache directory + FileCacheFileSuffix = ".bin" // cache file suffix + FileCacheDirectoryLevel = 2 // cache file deep level if auto generated cache files. + FileCacheEmbedExpiry time.Duration // cache expire time, default is no expire forever. +) + +// FileCache is cache adapter for file storage. +type FileCache struct { + CachePath string + FileSuffix string + DirectoryLevel int + EmbedExpiry int +} + +// NewFileCache Create new file cache with no config. +// the level and expiry need set in method StartAndGC as config string. +func NewFileCache() Cache { + // return &FileCache{CachePath:FileCachePath, FileSuffix:FileCacheFileSuffix} + return &FileCache{} +} + +// StartAndGC will start and begin gc for file cache. +// the config need to be like {CachePath:"/cache","FileSuffix":".bin","DirectoryLevel":2,"EmbedExpiry":0} +func (fc *FileCache) StartAndGC(config string) error { + + var cfg map[string]string + json.Unmarshal([]byte(config), &cfg) + if _, ok := cfg["CachePath"]; !ok { + cfg["CachePath"] = FileCachePath + } + if _, ok := cfg["FileSuffix"]; !ok { + cfg["FileSuffix"] = FileCacheFileSuffix + } + if _, ok := cfg["DirectoryLevel"]; !ok { + cfg["DirectoryLevel"] = strconv.Itoa(FileCacheDirectoryLevel) + } + if _, ok := cfg["EmbedExpiry"]; !ok { + cfg["EmbedExpiry"] = strconv.FormatInt(int64(FileCacheEmbedExpiry.Seconds()), 10) + } + fc.CachePath = cfg["CachePath"] + fc.FileSuffix = cfg["FileSuffix"] + fc.DirectoryLevel, _ = strconv.Atoi(cfg["DirectoryLevel"]) + fc.EmbedExpiry, _ = strconv.Atoi(cfg["EmbedExpiry"]) + + fc.Init() + return nil +} + +// Init will make new dir for file cache if not exist. +func (fc *FileCache) Init() { + if ok, _ := exists(fc.CachePath); !ok { // todo : error handle + _ = os.MkdirAll(fc.CachePath, os.ModePerm) // todo : error handle + } +} + +// get cached file name. it's md5 encoded. +func (fc *FileCache) getCacheFileName(key string) string { + m := md5.New() + io.WriteString(m, key) + keyMd5 := hex.EncodeToString(m.Sum(nil)) + cachePath := fc.CachePath + switch fc.DirectoryLevel { + case 2: + cachePath = filepath.Join(cachePath, keyMd5[0:2], keyMd5[2:4]) + case 1: + cachePath = filepath.Join(cachePath, keyMd5[0:2]) + } + + if ok, _ := exists(cachePath); !ok { // todo : error handle + _ = os.MkdirAll(cachePath, os.ModePerm) // todo : error handle + } + + return filepath.Join(cachePath, fmt.Sprintf("%s%s", keyMd5, fc.FileSuffix)) +} + +// Get value from file cache. +// if non-exist or expired, return empty string. +func (fc *FileCache) Get(key string) interface{} { + fileData, err := FileGetContents(fc.getCacheFileName(key)) + if err != nil { + return "" + } + var to FileCacheItem + GobDecode(fileData, &to) + if to.Expired.Before(time.Now()) { + return "" + } + return to.Data +} + +// GetMulti gets values from file cache. +// if non-exist or expired, return empty string. +func (fc *FileCache) GetMulti(keys []string) []interface{} { + var rc []interface{} + for _, key := range keys { + rc = append(rc, fc.Get(key)) + } + return rc +} + +// Put value into file cache. +// timeout means how long to keep this file, unit of ms. +// if timeout equals FileCacheEmbedExpiry(default is 0), cache this item forever. +func (fc *FileCache) Put(key string, val interface{}, timeout time.Duration) error { + gob.Register(val) + + item := FileCacheItem{Data: val} + if timeout == FileCacheEmbedExpiry { + item.Expired = time.Now().Add((86400 * 365 * 10) * time.Second) // ten years + } else { + item.Expired = time.Now().Add(timeout) + } + item.LastAccess = time.Now() + data, err := GobEncode(item) + if err != nil { + return err + } + return FilePutContents(fc.getCacheFileName(key), data) +} + +// Delete file cache value. +func (fc *FileCache) Delete(key string) error { + filename := fc.getCacheFileName(key) + if ok, _ := exists(filename); ok { + return os.Remove(filename) + } + return nil +} + +// Incr will increase cached int value. +// fc value is saving forever unless Delete. +func (fc *FileCache) Incr(key string) error { + data := fc.Get(key) + var incr int + if reflect.TypeOf(data).Name() != "int" { + incr = 0 + } else { + incr = data.(int) + 1 + } + fc.Put(key, incr, FileCacheEmbedExpiry) + return nil +} + +// Decr will decrease cached int value. +func (fc *FileCache) Decr(key string) error { + data := fc.Get(key) + var decr int + if reflect.TypeOf(data).Name() != "int" || data.(int)-1 <= 0 { + decr = 0 + } else { + decr = data.(int) - 1 + } + fc.Put(key, decr, FileCacheEmbedExpiry) + return nil +} + +// IsExist check value is exist. +func (fc *FileCache) IsExist(key string) bool { + ret, _ := exists(fc.getCacheFileName(key)) + return ret +} + +// ClearAll will clean cached files. +// not implemented. +func (fc *FileCache) ClearAll() error { + return nil +} + +// check file exist. +func exists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +// FileGetContents Get bytes to file. +// if non-exist, create this file. +func FileGetContents(filename string) (data []byte, e error) { + return ioutil.ReadFile(filename) +} + +// FilePutContents Put bytes to file. +// if non-exist, create this file. +func FilePutContents(filename string, content []byte) error { + return ioutil.WriteFile(filename, content, os.ModePerm) +} + +// GobEncode Gob encodes file cache item. +func GobEncode(data interface{}) ([]byte, error) { + buf := bytes.NewBuffer(nil) + enc := gob.NewEncoder(buf) + err := enc.Encode(data) + if err != nil { + return nil, err + } + return buf.Bytes(), err +} + +// GobDecode Gob decodes file cache item. +func GobDecode(data []byte, to *FileCacheItem) error { + buf := bytes.NewBuffer(data) + dec := gob.NewDecoder(buf) + return dec.Decode(&to) +} + +func init() { + Register("file", NewFileCache) +} diff --git a/app/utils/cachesecond/cache/memory.go b/app/utils/cachesecond/cache/memory.go new file mode 100644 index 0000000..0cc5015 --- /dev/null +++ b/app/utils/cachesecond/cache/memory.go @@ -0,0 +1,239 @@ +package cache + +import ( + "encoding/json" + "errors" + "sync" + "time" +) + +var ( + // DefaultEvery means the clock time of recycling the expired cache items in memory. + DefaultEvery = 60 // 1 minute +) + +// MemoryItem store memory cache item. +type MemoryItem struct { + val interface{} + createdTime time.Time + lifespan time.Duration +} + +func (mi *MemoryItem) isExpire() bool { + // 0 means forever + if mi.lifespan == 0 { + return false + } + return time.Now().Sub(mi.createdTime) > mi.lifespan +} + +// MemoryCache is Memory cache adapter. +// it contains a RW locker for safe map storage. +type MemoryCache struct { + sync.RWMutex + dur time.Duration + items map[string]*MemoryItem + Every int // run an expiration check Every clock time +} + +// NewMemoryCache returns a new MemoryCache. +func NewMemoryCache() Cache { + cache := MemoryCache{items: make(map[string]*MemoryItem)} + return &cache +} + +// Get cache from memory. +// if non-existed or expired, return nil. +func (bc *MemoryCache) Get(name string) interface{} { + bc.RLock() + defer bc.RUnlock() + if itm, ok := bc.items[name]; ok { + if itm.isExpire() { + return nil + } + return itm.val + } + return nil +} + +// GetMulti gets caches from memory. +// if non-existed or expired, return nil. +func (bc *MemoryCache) GetMulti(names []string) []interface{} { + var rc []interface{} + for _, name := range names { + rc = append(rc, bc.Get(name)) + } + return rc +} + +// Put cache to memory. +// if lifespan is 0, it will be forever till restart. +func (bc *MemoryCache) Put(name string, value interface{}, lifespan time.Duration) error { + bc.Lock() + defer bc.Unlock() + bc.items[name] = &MemoryItem{ + val: value, + createdTime: time.Now(), + lifespan: lifespan, + } + return nil +} + +// Delete cache in memory. +func (bc *MemoryCache) Delete(name string) error { + bc.Lock() + defer bc.Unlock() + if _, ok := bc.items[name]; !ok { + return errors.New("key not exist") + } + delete(bc.items, name) + if _, ok := bc.items[name]; ok { + return errors.New("delete key error") + } + return nil +} + +// Incr increase cache counter in memory. +// it supports int,int32,int64,uint,uint32,uint64. +func (bc *MemoryCache) Incr(key string) error { + bc.RLock() + defer bc.RUnlock() + itm, ok := bc.items[key] + if !ok { + return errors.New("key not exist") + } + switch itm.val.(type) { + case int: + itm.val = itm.val.(int) + 1 + case int32: + itm.val = itm.val.(int32) + 1 + case int64: + itm.val = itm.val.(int64) + 1 + case uint: + itm.val = itm.val.(uint) + 1 + case uint32: + itm.val = itm.val.(uint32) + 1 + case uint64: + itm.val = itm.val.(uint64) + 1 + default: + return errors.New("item val is not (u)int (u)int32 (u)int64") + } + return nil +} + +// Decr decrease counter in memory. +func (bc *MemoryCache) Decr(key string) error { + bc.RLock() + defer bc.RUnlock() + itm, ok := bc.items[key] + if !ok { + return errors.New("key not exist") + } + switch itm.val.(type) { + case int: + itm.val = itm.val.(int) - 1 + case int64: + itm.val = itm.val.(int64) - 1 + case int32: + itm.val = itm.val.(int32) - 1 + case uint: + if itm.val.(uint) > 0 { + itm.val = itm.val.(uint) - 1 + } else { + return errors.New("item val is less than 0") + } + case uint32: + if itm.val.(uint32) > 0 { + itm.val = itm.val.(uint32) - 1 + } else { + return errors.New("item val is less than 0") + } + case uint64: + if itm.val.(uint64) > 0 { + itm.val = itm.val.(uint64) - 1 + } else { + return errors.New("item val is less than 0") + } + default: + return errors.New("item val is not int int64 int32") + } + return nil +} + +// IsExist check cache exist in memory. +func (bc *MemoryCache) IsExist(name string) bool { + bc.RLock() + defer bc.RUnlock() + if v, ok := bc.items[name]; ok { + return !v.isExpire() + } + return false +} + +// ClearAll will delete all cache in memory. +func (bc *MemoryCache) ClearAll() error { + bc.Lock() + defer bc.Unlock() + bc.items = make(map[string]*MemoryItem) + return nil +} + +// StartAndGC start memory cache. it will check expiration in every clock time. +func (bc *MemoryCache) StartAndGC(config string) error { + var cf map[string]int + json.Unmarshal([]byte(config), &cf) + if _, ok := cf["interval"]; !ok { + cf = make(map[string]int) + cf["interval"] = DefaultEvery + } + dur := time.Duration(cf["interval"]) * time.Second + bc.Every = cf["interval"] + bc.dur = dur + go bc.vacuum() + return nil +} + +// check expiration. +func (bc *MemoryCache) vacuum() { + bc.RLock() + every := bc.Every + bc.RUnlock() + + if every < 1 { + return + } + for { + <-time.After(bc.dur) + if bc.items == nil { + return + } + if keys := bc.expiredKeys(); len(keys) != 0 { + bc.clearItems(keys) + } + } +} + +// expiredKeys returns key list which are expired. +func (bc *MemoryCache) expiredKeys() (keys []string) { + bc.RLock() + defer bc.RUnlock() + for key, itm := range bc.items { + if itm.isExpire() { + keys = append(keys, key) + } + } + return +} + +// clearItems removes all the items which key in keys. +func (bc *MemoryCache) clearItems(keys []string) { + bc.Lock() + defer bc.Unlock() + for _, key := range keys { + delete(bc.items, key) + } +} + +func init() { + Register("memory", NewMemoryCache) +} diff --git a/app/utils/cachesecond/redis.go b/app/utils/cachesecond/redis.go new file mode 100644 index 0000000..99c5247 --- /dev/null +++ b/app/utils/cachesecond/redis.go @@ -0,0 +1,406 @@ +package cachesecond + +import ( + "encoding/json" + "errors" + "log" + "strings" + "time" + + redigo "github.com/gomodule/redigo/redis" +) + +// configuration +type Config struct { + Server string + Password string + MaxIdle int // Maximum number of idle connections in the pool. + + // Maximum number of connections allocated by the pool at a given time. + // When zero, there is no limit on the number of connections in the pool. + MaxActive int + + // Close connections after remaining idle for this duration. If the value + // is zero, then idle connections are not closed. Applications should set + // the timeout to a value less than the server's timeout. + IdleTimeout time.Duration + + // If Wait is true and the pool is at the MaxActive limit, then Get() waits + // for a connection to be returned to the pool before returning. + Wait bool + KeyPrefix string // prefix to all keys; example is "dev environment name" + KeyDelimiter string // delimiter to be used while appending keys; example is ":" + KeyPlaceholder string // placeholder to be parsed using given arguments to obtain a final key; example is "?" +} + +var pool *redigo.Pool +var conf *Config + +func NewRedis(addr, pwd string) { + if addr == "" { + panic("\nredis connect string cannot be empty\n") + } + pool = &redigo.Pool{ + MaxIdle: redisMaxIdleConn, + IdleTimeout: redisIdleTTL, + MaxActive: redisMaxActive, + // MaxConnLifetime: redisDialTTL, + Wait: true, + Dial: func() (redigo.Conn, error) { + c, err := redigo.Dial("tcp", addr, + redigo.DialConnectTimeout(redisDialTTL), + redigo.DialReadTimeout(redisReadTTL), + redigo.DialWriteTimeout(redisWriteTTL), + ) + if err != nil { + log.Println("Redis Dial failed: ", err) + return nil, err + } + if pwd != "" { + c.Send("auth", pwd) + } + return c, err + }, + TestOnBorrow: func(c redigo.Conn, t time.Time) error { + _, err := c.Do("PING") + if err != nil { + log.Println("Unable to ping to redis server:", err) + } + return err + }, + } + conn := pool.Get() + defer conn.Close() + if conn.Err() != nil { + println("\nredis connect " + addr + " error: " + conn.Err().Error()) + } else { + println("\nredis connect " + addr + " success!\n") + } +} + +func Do(cmd string, args ...interface{}) (reply interface{}, err error) { + conn := pool.Get() + defer conn.Close() + return conn.Do(cmd, args...) +} + +func GetPool() *redigo.Pool { + return pool +} + +func ParseKey(key string, vars []string) (string, error) { + arr := strings.Split(key, conf.KeyPlaceholder) + actualKey := "" + if len(arr) != len(vars)+1 { + return "", errors.New("redis/connection.go: Insufficient arguments to parse key") + } else { + for index, val := range arr { + if index == 0 { + actualKey = arr[index] + } else { + actualKey += vars[index-1] + val + } + } + } + return getPrefixedKey(actualKey), nil +} + +func getPrefixedKey(key string) string { + return conf.KeyPrefix + conf.KeyDelimiter + key +} +func StripEnvKey(key string) string { + return strings.TrimLeft(key, conf.KeyPrefix+conf.KeyDelimiter) +} +func SplitKey(key string) []string { + return strings.Split(key, conf.KeyDelimiter) +} +func Expire(key string, ttl int) (interface{}, error) { + return Do("EXPIRE", key, ttl) +} +func Persist(key string) (interface{}, error) { + return Do("PERSIST", key) +} + +func Del(key string) (interface{}, error) { + return Do("DEL", key) +} +func Set(key string, data interface{}) (interface{}, error) { + // set + return Do("SET", key, data) +} +func SetNX(key string, data interface{}) (interface{}, error) { + return Do("SETNX", key, data) +} +func SetEx(key string, data interface{}, ttl int) (interface{}, error) { + return Do("SETEX", key, ttl, data) +} + +func SetJson(key string, data interface{}, ttl int) bool { + c, err := json.Marshal(data) + if err != nil { + return false + } + if ttl < 1 { + _, err = Set(key, c) + } else { + _, err = SetEx(key, c, ttl) + } + if err != nil { + return false + } + return true +} + +func GetJson(key string, dst interface{}) error { + b, err := GetBytes(key) + if err != nil { + return err + } + if err = json.Unmarshal(b, dst); err != nil { + return err + } + return nil +} + +func Get(key string) (interface{}, error) { + // get + return Do("GET", key) +} +func GetTTL(key string) (time.Duration, error) { + ttl, err := redigo.Int64(Do("TTL", key)) + return time.Duration(ttl) * time.Second, err +} +func GetBytes(key string) ([]byte, error) { + return redigo.Bytes(Do("GET", key)) +} +func GetString(key string) (string, error) { + return redigo.String(Do("GET", key)) +} +func GetStringMap(key string) (map[string]string, error) { + return redigo.StringMap(Do("GET", key)) +} +func GetInt(key string) (int, error) { + return redigo.Int(Do("GET", key)) +} +func GetInt64(key string) (int64, error) { + return redigo.Int64(Do("GET", key)) +} +func GetStringLength(key string) (int, error) { + return redigo.Int(Do("STRLEN", key)) +} +func ZAdd(key string, score float64, data interface{}) (interface{}, error) { + return Do("ZADD", key, score, data) +} +func ZAddNX(key string, score float64, data interface{}) (interface{}, error) { + return Do("ZADD", key, "NX", score, data) +} +func ZRem(key string, data interface{}) (interface{}, error) { + return Do("ZREM", key, data) +} +func ZRange(key string, start int, end int, withScores bool) ([]interface{}, error) { + if withScores { + return redigo.Values(Do("ZRANGE", key, start, end, "WITHSCORES")) + } + return redigo.Values(Do("ZRANGE", key, start, end)) +} +func ZRemRangeByScore(key string, start int64, end int64) ([]interface{}, error) { + return redigo.Values(Do("ZREMRANGEBYSCORE", key, start, end)) +} +func ZCard(setName string) (int64, error) { + return redigo.Int64(Do("ZCARD", setName)) +} +func ZScan(setName string) (int64, error) { + return redigo.Int64(Do("ZCARD", setName)) +} +func SAdd(setName string, data interface{}) (interface{}, error) { + return Do("SADD", setName, data) +} +func SCard(setName string) (int64, error) { + return redigo.Int64(Do("SCARD", setName)) +} +func SIsMember(setName string, data interface{}) (bool, error) { + return redigo.Bool(Do("SISMEMBER", setName, data)) +} +func SMembers(setName string) ([]string, error) { + return redigo.Strings(Do("SMEMBERS", setName)) +} +func SRem(setName string, data interface{}) (interface{}, error) { + return Do("SREM", setName, data) +} +func HSet(key string, HKey string, data interface{}) (interface{}, error) { + return Do("HSET", key, HKey, data) +} + +func HGet(key string, HKey string) (interface{}, error) { + return Do("HGET", key, HKey) +} + +func HMGet(key string, hashKeys ...string) ([]interface{}, error) { + ret, err := Do("HMGET", key, hashKeys) + if err != nil { + return nil, err + } + reta, ok := ret.([]interface{}) + if !ok { + return nil, errors.New("result not an array") + } + return reta, nil +} + +func HMSet(key string, hashKeys []string, vals []interface{}) (interface{}, error) { + if len(hashKeys) == 0 || len(hashKeys) != len(vals) { + var ret interface{} + return ret, errors.New("bad length") + } + input := []interface{}{key} + for i, v := range hashKeys { + input = append(input, v, vals[i]) + } + return Do("HMSET", input...) +} + +func HGetString(key string, HKey string) (string, error) { + return redigo.String(Do("HGET", key, HKey)) +} +func HGetFloat(key string, HKey string) (float64, error) { + f, err := redigo.Float64(Do("HGET", key, HKey)) + return f, err +} +func HGetInt(key string, HKey string) (int, error) { + return redigo.Int(Do("HGET", key, HKey)) +} +func HGetInt64(key string, HKey string) (int64, error) { + return redigo.Int64(Do("HGET", key, HKey)) +} +func HGetBool(key string, HKey string) (bool, error) { + return redigo.Bool(Do("HGET", key, HKey)) +} +func HDel(key string, HKey string) (interface{}, error) { + return Do("HDEL", key, HKey) +} + +func HGetAll(key string) (map[string]interface{}, error) { + vals, err := redigo.Values(Do("HGETALL", key)) + if err != nil { + return nil, err + } + num := len(vals) / 2 + result := make(map[string]interface{}, num) + for i := 0; i < num; i++ { + key, _ := redigo.String(vals[2*i], nil) + result[key] = vals[2*i+1] + } + return result, nil +} + +func FlushAll() bool { + res, _ := redigo.String(Do("FLUSHALL")) + if res == "" { + return false + } + return true +} + +// NOTE: Use this in production environment with extreme care. +// Read more here:https://redigo.io/commands/keys +func Keys(pattern string) ([]string, error) { + return redigo.Strings(Do("KEYS", pattern)) +} + +func HKeys(key string) ([]string, error) { + return redigo.Strings(Do("HKEYS", key)) +} + +func Exists(key string) bool { + count, err := redigo.Int(Do("EXISTS", key)) + if count == 0 || err != nil { + return false + } + return true +} + +func Incr(key string) (int64, error) { + return redigo.Int64(Do("INCR", key)) +} + +func Decr(key string) (int64, error) { + return redigo.Int64(Do("DECR", key)) +} + +func IncrBy(key string, incBy int64) (int64, error) { + return redigo.Int64(Do("INCRBY", key, incBy)) +} + +func DecrBy(key string, decrBy int64) (int64, error) { + return redigo.Int64(Do("DECRBY", key)) +} + +func IncrByFloat(key string, incBy float64) (float64, error) { + return redigo.Float64(Do("INCRBYFLOAT", key, incBy)) +} + +func DecrByFloat(key string, decrBy float64) (float64, error) { + return redigo.Float64(Do("DECRBYFLOAT", key, decrBy)) +} + +// use for message queue +func LPush(key string, data interface{}) (interface{}, error) { + // set + return Do("LPUSH", key, data) +} + +func LPop(key string) (interface{}, error) { + return Do("LPOP", key) +} + +func LPopString(key string) (string, error) { + return redigo.String(Do("LPOP", key)) +} +func LPopFloat(key string) (float64, error) { + f, err := redigo.Float64(Do("LPOP", key)) + return f, err +} +func LPopInt(key string) (int, error) { + return redigo.Int(Do("LPOP", key)) +} +func LPopInt64(key string) (int64, error) { + return redigo.Int64(Do("LPOP", key)) +} + +func RPush(key string, data interface{}) (interface{}, error) { + // set + return Do("RPUSH", key, data) +} + +func RPop(key string) (interface{}, error) { + return Do("RPOP", key) +} + +func RPopString(key string) (string, error) { + return redigo.String(Do("RPOP", key)) +} +func RPopFloat(key string) (float64, error) { + f, err := redigo.Float64(Do("RPOP", key)) + return f, err +} +func RPopInt(key string) (int, error) { + return redigo.Int(Do("RPOP", key)) +} +func RPopInt64(key string) (int64, error) { + return redigo.Int64(Do("RPOP", key)) +} + +func Scan(cursor int64, pattern string, count int64) (int64, []string, error) { + var items []string + var newCursor int64 + + values, err := redigo.Values(Do("SCAN", cursor, "MATCH", pattern, "COUNT", count)) + if err != nil { + return 0, nil, err + } + values, err = redigo.Scan(values, &newCursor, &items) + if err != nil { + return 0, nil, err + } + return newCursor, items, nil +} diff --git a/app/utils/cachesecond/redis_cluster.go b/app/utils/cachesecond/redis_cluster.go new file mode 100644 index 0000000..c86bf55 --- /dev/null +++ b/app/utils/cachesecond/redis_cluster.go @@ -0,0 +1,622 @@ +package cachesecond + +import ( + "strconv" + "time" + + "github.com/go-redis/redis" +) + +var pools *redis.ClusterClient + +func NewRedisCluster(addrs []string) error { + opt := &redis.ClusterOptions{ + Addrs: addrs, + PoolSize: redisPoolSize, + PoolTimeout: redisPoolTTL, + IdleTimeout: redisIdleTTL, + DialTimeout: redisDialTTL, + ReadTimeout: redisReadTTL, + WriteTimeout: redisWriteTTL, + } + pools = redis.NewClusterClient(opt) + if err := pools.Ping().Err(); err != nil { + return err + } + return nil +} + +func RCGet(key string) (interface{}, error) { + res, err := pools.Get(key).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func RCSet(key string, value interface{}) error { + err := pools.Set(key, value, 0).Err() + return convertError(err) +} +func RCGetSet(key string, value interface{}) (interface{}, error) { + res, err := pools.GetSet(key, value).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func RCSetNx(key string, value interface{}) (int64, error) { + res, err := pools.SetNX(key, value, 0).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func RCSetEx(key string, value interface{}, timeout int64) error { + _, err := pools.Set(key, value, time.Duration(timeout)*time.Second).Result() + if err != nil { + return convertError(err) + } + return nil +} + +// nil表示成功,ErrNil表示数据库内已经存在这个key,其他表示数据库发生错误 +func RCSetNxEx(key string, value interface{}, timeout int64) error { + res, err := pools.SetNX(key, value, time.Duration(timeout)*time.Second).Result() + if err != nil { + return convertError(err) + } + if res { + return nil + } + return ErrNil +} +func RCMGet(keys ...string) ([]interface{}, error) { + res, err := pools.MGet(keys...).Result() + return res, convertError(err) +} + +// 为确保多个key映射到同一个slot,每个key最好加上hash tag,如:{test} +func RCMSet(kvs map[string]interface{}) error { + pairs := make([]string, 0, len(kvs)*2) + for k, v := range kvs { + val, err := String(v, nil) + if err != nil { + return err + } + pairs = append(pairs, k, val) + } + return convertError(pools.MSet(pairs).Err()) +} + +// 为确保多个key映射到同一个slot,每个key最好加上hash tag,如:{test} +func RCMSetNX(kvs map[string]interface{}) (bool, error) { + pairs := make([]string, 0, len(kvs)*2) + for k, v := range kvs { + val, err := String(v, nil) + if err != nil { + return false, err + } + pairs = append(pairs, k, val) + } + res, err := pools.MSetNX(pairs).Result() + return res, convertError(err) +} +func RCExpireAt(key string, timestamp int64) (int64, error) { + res, err := pools.ExpireAt(key, time.Unix(timestamp, 0)).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func RCDel(keys ...string) (int64, error) { + args := make([]interface{}, 0, len(keys)) + for _, key := range keys { + args = append(args, key) + } + res, err := pools.Del(keys...).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCIncr(key string) (int64, error) { + res, err := pools.Incr(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCIncrBy(key string, delta int64) (int64, error) { + res, err := pools.IncrBy(key, delta).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCExpire(key string, duration int64) (int64, error) { + res, err := pools.Expire(key, time.Duration(duration)*time.Second).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func RCExists(key string) (bool, error) { + res, err := pools.Exists(key).Result() + if err != nil { + return false, convertError(err) + } + if res > 0 { + return true, nil + } + return false, nil +} +func RCHGet(key string, field string) (interface{}, error) { + res, err := pools.HGet(key, field).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func RCHLen(key string) (int64, error) { + res, err := pools.HLen(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCHSet(key string, field string, val interface{}) error { + value, err := String(val, nil) + if err != nil && err != ErrNil { + return err + } + _, err = pools.HSet(key, field, value).Result() + if err != nil { + return convertError(err) + } + return nil +} +func RCHDel(key string, fields ...string) (int64, error) { + args := make([]interface{}, 0, len(fields)+1) + args = append(args, key) + for _, field := range fields { + args = append(args, field) + } + res, err := pools.HDel(key, fields...).Result() + if err != nil { + return 0, convertError(err) + } + return res, nil +} + +func RCHMGet(key string, fields ...string) (interface{}, error) { + args := make([]interface{}, 0, len(fields)+1) + args = append(args, key) + for _, field := range fields { + args = append(args, field) + } + if len(fields) == 0 { + return nil, ErrNil + } + res, err := pools.HMGet(key, fields...).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCHMSet(key string, kvs ...interface{}) error { + if len(kvs) == 0 { + return nil + } + if len(kvs)%2 != 0 { + return ErrWrongArgsNum + } + var err error + v := map[string]interface{}{} // todo change + v["field"], err = String(kvs[0], nil) + if err != nil && err != ErrNil { + return err + } + v["value"], err = String(kvs[1], nil) + if err != nil && err != ErrNil { + return err + } + pairs := make([]string, 0, len(kvs)-2) + if len(kvs) > 2 { + for _, kv := range kvs[2:] { + kvString, err := String(kv, nil) + if err != nil && err != ErrNil { + return err + } + pairs = append(pairs, kvString) + } + } + v["paris"] = pairs + _, err = pools.HMSet(key, v).Result() + if err != nil { + return convertError(err) + } + return nil +} + +func RCHKeys(key string) ([]string, error) { + res, err := pools.HKeys(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCHVals(key string) ([]interface{}, error) { + res, err := pools.HVals(key).Result() + if err != nil { + return nil, convertError(err) + } + rs := make([]interface{}, 0, len(res)) + for _, res := range res { + rs = append(rs, res) + } + return rs, nil +} +func RCHGetAll(key string) (map[string]string, error) { + vals, err := pools.HGetAll(key).Result() + if err != nil { + return nil, convertError(err) + } + return vals, nil +} +func RCHIncrBy(key, field string, delta int64) (int64, error) { + res, err := pools.HIncrBy(key, field, delta).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCZAdd(key string, kvs ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(kvs)+1) + args = append(args, key) + args = append(args, kvs...) + if len(kvs) == 0 { + return 0, nil + } + if len(kvs)%2 != 0 { + return 0, ErrWrongArgsNum + } + zs := make([]redis.Z, len(kvs)/2) + for i := 0; i < len(kvs); i += 2 { + idx := i / 2 + score, err := Float64(kvs[i], nil) + if err != nil && err != ErrNil { + return 0, err + } + zs[idx].Score = score + zs[idx].Member = kvs[i+1] + } + res, err := pools.ZAdd(key, zs...).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCZRem(key string, members ...string) (int64, error) { + args := make([]interface{}, 0, len(members)) + args = append(args, key) + for _, member := range members { + args = append(args, member) + } + res, err := pools.ZRem(key, members).Result() + if err != nil { + return res, convertError(err) + } + return res, err +} + +func RCZRange(key string, min, max int64, withScores bool) (interface{}, error) { + res := make([]interface{}, 0) + if withScores { + zs, err := pools.ZRangeWithScores(key, min, max).Result() + if err != nil { + return nil, convertError(err) + } + for _, z := range zs { + res = append(res, z.Member, strconv.FormatFloat(z.Score, 'f', -1, 64)) + } + } else { + ms, err := pools.ZRange(key, min, max).Result() + if err != nil { + return nil, convertError(err) + } + for _, m := range ms { + res = append(res, m) + } + } + return res, nil +} +func RCZRangeByScoreWithScore(key string, min, max int64) (map[string]int64, error) { + opt := new(redis.ZRangeBy) + opt.Min = strconv.FormatInt(int64(min), 10) + opt.Max = strconv.FormatInt(int64(max), 10) + opt.Count = -1 + opt.Offset = 0 + vals, err := pools.ZRangeByScoreWithScores(key, *opt).Result() + if err != nil { + return nil, convertError(err) + } + res := make(map[string]int64, len(vals)) + for _, val := range vals { + key, err := String(val.Member, nil) + if err != nil && err != ErrNil { + return nil, err + } + res[key] = int64(val.Score) + } + return res, nil +} +func RCLRange(key string, start, stop int64) (interface{}, error) { + res, err := pools.LRange(key, start, stop).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCLSet(key string, index int, value interface{}) error { + err := pools.LSet(key, int64(index), value).Err() + return convertError(err) +} +func RCLLen(key string) (int64, error) { + res, err := pools.LLen(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCLRem(key string, count int, value interface{}) (int, error) { + val, _ := value.(string) + res, err := pools.LRem(key, int64(count), val).Result() + if err != nil { + return int(res), convertError(err) + } + return int(res), nil +} +func RCTTl(key string) (int64, error) { + duration, err := pools.TTL(key).Result() + if err != nil { + return int64(duration.Seconds()), convertError(err) + } + return int64(duration.Seconds()), nil +} +func RCLPop(key string) (interface{}, error) { + res, err := pools.LPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCRPop(key string) (interface{}, error) { + res, err := pools.RPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCBLPop(key string, timeout int) (interface{}, error) { + res, err := pools.BLPop(time.Duration(timeout)*time.Second, key).Result() + if err != nil { + // 兼容redis 2.x + if err == redis.Nil { + return nil, ErrNil + } + return nil, err + } + return res[1], nil +} +func RCBRPop(key string, timeout int) (interface{}, error) { + res, err := pools.BRPop(time.Duration(timeout)*time.Second, key).Result() + if err != nil { + // 兼容redis 2.x + if err == redis.Nil { + return nil, ErrNil + } + return nil, convertError(err) + } + return res[1], nil +} +func RCLPush(key string, value ...interface{}) error { + args := make([]interface{}, 0, len(value)+1) + args = append(args, key) + args = append(args, value...) + vals := make([]string, 0, len(value)) + for _, v := range value { + val, err := String(v, nil) + if err != nil && err != ErrNil { + return err + } + vals = append(vals, val) + } + _, err := pools.LPush(key, vals).Result() // todo ... + if err != nil { + return convertError(err) + } + return nil +} +func RCRPush(key string, value ...interface{}) error { + args := make([]interface{}, 0, len(value)+1) + args = append(args, key) + args = append(args, value...) + vals := make([]string, 0, len(value)) + for _, v := range value { + val, err := String(v, nil) + if err != nil && err != ErrNil { + if err == ErrNil { + continue + } + return err + } + if val == "" { + continue + } + vals = append(vals, val) + } + _, err := pools.RPush(key, vals).Result() // todo ... + if err != nil { + return convertError(err) + } + return nil +} + +// 为确保srcKey跟destKey映射到同一个slot,srcKey和destKey需要加上hash tag,如:{test} +func RCBRPopLPush(srcKey string, destKey string, timeout int) (interface{}, error) { + res, err := pools.BRPopLPush(srcKey, destKey, time.Duration(timeout)*time.Second).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} + +// 为确保srcKey跟destKey映射到同一个slot,srcKey和destKey需要加上hash tag,如:{test} +func RCRPopLPush(srcKey string, destKey string) (interface{}, error) { + res, err := pools.RPopLPush(srcKey, destKey).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCSAdd(key string, members ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(members)+1) + args = append(args, key) + args = append(args, members...) + ms := make([]string, 0, len(members)) + for _, member := range members { + m, err := String(member, nil) + if err != nil && err != ErrNil { + return 0, err + } + ms = append(ms, m) + } + res, err := pools.SAdd(key, ms).Result() // todo ... + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCSPop(key string) ([]byte, error) { + res, err := pools.SPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func RCSIsMember(key string, member interface{}) (bool, error) { + m, _ := member.(string) + res, err := pools.SIsMember(key, m).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCSRem(key string, members ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(members)+1) + args = append(args, key) + args = append(args, members...) + ms := make([]string, 0, len(members)) + for _, member := range members { + m, err := String(member, nil) + if err != nil && err != ErrNil { + return 0, err + } + ms = append(ms, m) + } + res, err := pools.SRem(key, ms).Result() // todo ... + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCSMembers(key string) ([]string, error) { + res, err := pools.SMembers(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCScriptLoad(luaScript string) (interface{}, error) { + res, err := pools.ScriptLoad(luaScript).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCEvalSha(sha1 string, numberKeys int, keysArgs ...interface{}) (interface{}, error) { + vals := make([]interface{}, 0, len(keysArgs)+2) + vals = append(vals, sha1, numberKeys) + vals = append(vals, keysArgs...) + keys := make([]string, 0, numberKeys) + args := make([]string, 0, len(keysArgs)-numberKeys) + for i, value := range keysArgs { + val, err := String(value, nil) + if err != nil && err != ErrNil { + return nil, err + } + if i < numberKeys { + keys = append(keys, val) + } else { + args = append(args, val) + } + } + res, err := pools.EvalSha(sha1, keys, args).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCEval(luaScript string, numberKeys int, keysArgs ...interface{}) (interface{}, error) { + vals := make([]interface{}, 0, len(keysArgs)+2) + vals = append(vals, luaScript, numberKeys) + vals = append(vals, keysArgs...) + keys := make([]string, 0, numberKeys) + args := make([]string, 0, len(keysArgs)-numberKeys) + for i, value := range keysArgs { + val, err := String(value, nil) + if err != nil && err != ErrNil { + return nil, err + } + if i < numberKeys { + keys = append(keys, val) + } else { + args = append(args, val) + } + } + res, err := pools.Eval(luaScript, keys, args).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func RCGetBit(key string, offset int64) (int64, error) { + res, err := pools.GetBit(key, offset).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func RCSetBit(key string, offset uint32, value int) (int, error) { + res, err := pools.SetBit(key, int64(offset), value).Result() + return int(res), convertError(err) +} +func RCGetClient() *redis.ClusterClient { + return pools +} +func convertError(err error) error { + if err == redis.Nil { + // 为了兼容redis 2.x,这里不返回 ErrNil,ErrNil在调用redis_cluster_reply函数时才返回 + return nil + } + return err +} diff --git a/app/utils/cachesecond/redis_pool.go b/app/utils/cachesecond/redis_pool.go new file mode 100644 index 0000000..501aa27 --- /dev/null +++ b/app/utils/cachesecond/redis_pool.go @@ -0,0 +1,324 @@ +package cachesecond + +import ( + "errors" + "log" + "strings" + "time" + + redigo "github.com/gomodule/redigo/redis" +) + +type RedisPool struct { + *redigo.Pool +} + +func NewRedisPool(cfg *Config) *RedisPool { + return &RedisPool{&redigo.Pool{ + MaxIdle: cfg.MaxIdle, + IdleTimeout: cfg.IdleTimeout, + MaxActive: cfg.MaxActive, + Wait: cfg.Wait, + Dial: func() (redigo.Conn, error) { + c, err := redigo.Dial("tcp", cfg.Server) + if err != nil { + log.Println("Redis Dial failed: ", err) + return nil, err + } + if cfg.Password != "" { + if _, err := c.Do("AUTH", cfg.Password); err != nil { + c.Close() + log.Println("Redis AUTH failed: ", err) + return nil, err + } + } + return c, err + }, + TestOnBorrow: func(c redigo.Conn, t time.Time) error { + _, err := c.Do("PING") + if err != nil { + log.Println("Unable to ping to redis server:", err) + } + return err + }, + }} +} + +func (p *RedisPool) Do(cmd string, args ...interface{}) (reply interface{}, err error) { + conn := pool.Get() + defer conn.Close() + return conn.Do(cmd, args...) +} + +func (p *RedisPool) GetPool() *redigo.Pool { + return pool +} + +func (p *RedisPool) ParseKey(key string, vars []string) (string, error) { + arr := strings.Split(key, conf.KeyPlaceholder) + actualKey := "" + if len(arr) != len(vars)+1 { + return "", errors.New("redis/connection.go: Insufficient arguments to parse key") + } else { + for index, val := range arr { + if index == 0 { + actualKey = arr[index] + } else { + actualKey += vars[index-1] + val + } + } + } + return getPrefixedKey(actualKey), nil +} + +func (p *RedisPool) getPrefixedKey(key string) string { + return conf.KeyPrefix + conf.KeyDelimiter + key +} +func (p *RedisPool) StripEnvKey(key string) string { + return strings.TrimLeft(key, conf.KeyPrefix+conf.KeyDelimiter) +} +func (p *RedisPool) SplitKey(key string) []string { + return strings.Split(key, conf.KeyDelimiter) +} +func (p *RedisPool) Expire(key string, ttl int) (interface{}, error) { + return Do("EXPIRE", key, ttl) +} +func (p *RedisPool) Persist(key string) (interface{}, error) { + return Do("PERSIST", key) +} + +func (p *RedisPool) Del(key string) (interface{}, error) { + return Do("DEL", key) +} +func (p *RedisPool) Set(key string, data interface{}) (interface{}, error) { + // set + return Do("SET", key, data) +} +func (p *RedisPool) SetNX(key string, data interface{}) (interface{}, error) { + return Do("SETNX", key, data) +} +func (p *RedisPool) SetEx(key string, data interface{}, ttl int) (interface{}, error) { + return Do("SETEX", key, ttl, data) +} +func (p *RedisPool) Get(key string) (interface{}, error) { + // get + return Do("GET", key) +} +func (p *RedisPool) GetStringMap(key string) (map[string]string, error) { + // get + return redigo.StringMap(Do("GET", key)) +} + +func (p *RedisPool) GetTTL(key string) (time.Duration, error) { + ttl, err := redigo.Int64(Do("TTL", key)) + return time.Duration(ttl) * time.Second, err +} +func (p *RedisPool) GetBytes(key string) ([]byte, error) { + return redigo.Bytes(Do("GET", key)) +} +func (p *RedisPool) GetString(key string) (string, error) { + return redigo.String(Do("GET", key)) +} +func (p *RedisPool) GetInt(key string) (int, error) { + return redigo.Int(Do("GET", key)) +} +func (p *RedisPool) GetStringLength(key string) (int, error) { + return redigo.Int(Do("STRLEN", key)) +} +func (p *RedisPool) ZAdd(key string, score float64, data interface{}) (interface{}, error) { + return Do("ZADD", key, score, data) +} +func (p *RedisPool) ZRem(key string, data interface{}) (interface{}, error) { + return Do("ZREM", key, data) +} +func (p *RedisPool) ZRange(key string, start int, end int, withScores bool) ([]interface{}, error) { + if withScores { + return redigo.Values(Do("ZRANGE", key, start, end, "WITHSCORES")) + } + return redigo.Values(Do("ZRANGE", key, start, end)) +} +func (p *RedisPool) SAdd(setName string, data interface{}) (interface{}, error) { + return Do("SADD", setName, data) +} +func (p *RedisPool) SCard(setName string) (int64, error) { + return redigo.Int64(Do("SCARD", setName)) +} +func (p *RedisPool) SIsMember(setName string, data interface{}) (bool, error) { + return redigo.Bool(Do("SISMEMBER", setName, data)) +} +func (p *RedisPool) SMembers(setName string) ([]string, error) { + return redigo.Strings(Do("SMEMBERS", setName)) +} +func (p *RedisPool) SRem(setName string, data interface{}) (interface{}, error) { + return Do("SREM", setName, data) +} +func (p *RedisPool) HSet(key string, HKey string, data interface{}) (interface{}, error) { + return Do("HSET", key, HKey, data) +} + +func (p *RedisPool) HGet(key string, HKey string) (interface{}, error) { + return Do("HGET", key, HKey) +} + +func (p *RedisPool) HMGet(key string, hashKeys ...string) ([]interface{}, error) { + ret, err := Do("HMGET", key, hashKeys) + if err != nil { + return nil, err + } + reta, ok := ret.([]interface{}) + if !ok { + return nil, errors.New("result not an array") + } + return reta, nil +} + +func (p *RedisPool) HMSet(key string, hashKeys []string, vals []interface{}) (interface{}, error) { + if len(hashKeys) == 0 || len(hashKeys) != len(vals) { + var ret interface{} + return ret, errors.New("bad length") + } + input := []interface{}{key} + for i, v := range hashKeys { + input = append(input, v, vals[i]) + } + return Do("HMSET", input...) +} + +func (p *RedisPool) HGetString(key string, HKey string) (string, error) { + return redigo.String(Do("HGET", key, HKey)) +} +func (p *RedisPool) HGetFloat(key string, HKey string) (float64, error) { + f, err := redigo.Float64(Do("HGET", key, HKey)) + return float64(f), err +} +func (p *RedisPool) HGetInt(key string, HKey string) (int, error) { + return redigo.Int(Do("HGET", key, HKey)) +} +func (p *RedisPool) HGetInt64(key string, HKey string) (int64, error) { + return redigo.Int64(Do("HGET", key, HKey)) +} +func (p *RedisPool) HGetBool(key string, HKey string) (bool, error) { + return redigo.Bool(Do("HGET", key, HKey)) +} +func (p *RedisPool) HDel(key string, HKey string) (interface{}, error) { + return Do("HDEL", key, HKey) +} +func (p *RedisPool) HGetAll(key string) (map[string]interface{}, error) { + vals, err := redigo.Values(Do("HGETALL", key)) + if err != nil { + return nil, err + } + num := len(vals) / 2 + result := make(map[string]interface{}, num) + for i := 0; i < num; i++ { + key, _ := redigo.String(vals[2*i], nil) + result[key] = vals[2*i+1] + } + return result, nil +} + +// NOTE: Use this in production environment with extreme care. +// Read more here:https://redigo.io/commands/keys +func (p *RedisPool) Keys(pattern string) ([]string, error) { + return redigo.Strings(Do("KEYS", pattern)) +} + +func (p *RedisPool) HKeys(key string) ([]string, error) { + return redigo.Strings(Do("HKEYS", key)) +} + +func (p *RedisPool) Exists(key string) (bool, error) { + count, err := redigo.Int(Do("EXISTS", key)) + if count == 0 { + return false, err + } else { + return true, err + } +} + +func (p *RedisPool) Incr(key string) (int64, error) { + return redigo.Int64(Do("INCR", key)) +} + +func (p *RedisPool) Decr(key string) (int64, error) { + return redigo.Int64(Do("DECR", key)) +} + +func (p *RedisPool) IncrBy(key string, incBy int64) (int64, error) { + return redigo.Int64(Do("INCRBY", key, incBy)) +} + +func (p *RedisPool) DecrBy(key string, decrBy int64) (int64, error) { + return redigo.Int64(Do("DECRBY", key)) +} + +func (p *RedisPool) IncrByFloat(key string, incBy float64) (float64, error) { + return redigo.Float64(Do("INCRBYFLOAT", key, incBy)) +} + +func (p *RedisPool) DecrByFloat(key string, decrBy float64) (float64, error) { + return redigo.Float64(Do("DECRBYFLOAT", key, decrBy)) +} + +// use for message queue +func (p *RedisPool) LPush(key string, data interface{}) (interface{}, error) { + // set + return Do("LPUSH", key, data) +} + +func (p *RedisPool) LPop(key string) (interface{}, error) { + return Do("LPOP", key) +} + +func (p *RedisPool) LPopString(key string) (string, error) { + return redigo.String(Do("LPOP", key)) +} +func (p *RedisPool) LPopFloat(key string) (float64, error) { + f, err := redigo.Float64(Do("LPOP", key)) + return float64(f), err +} +func (p *RedisPool) LPopInt(key string) (int, error) { + return redigo.Int(Do("LPOP", key)) +} +func (p *RedisPool) LPopInt64(key string) (int64, error) { + return redigo.Int64(Do("LPOP", key)) +} + +func (p *RedisPool) RPush(key string, data interface{}) (interface{}, error) { + // set + return Do("RPUSH", key, data) +} + +func (p *RedisPool) RPop(key string) (interface{}, error) { + return Do("RPOP", key) +} + +func (p *RedisPool) RPopString(key string) (string, error) { + return redigo.String(Do("RPOP", key)) +} +func (p *RedisPool) RPopFloat(key string) (float64, error) { + f, err := redigo.Float64(Do("RPOP", key)) + return float64(f), err +} +func (p *RedisPool) RPopInt(key string) (int, error) { + return redigo.Int(Do("RPOP", key)) +} +func (p *RedisPool) RPopInt64(key string) (int64, error) { + return redigo.Int64(Do("RPOP", key)) +} + +func (p *RedisPool) Scan(cursor int64, pattern string, count int64) (int64, []string, error) { + var items []string + var newCursor int64 + + values, err := redigo.Values(Do("SCAN", cursor, "MATCH", pattern, "COUNT", count)) + if err != nil { + return 0, nil, err + } + values, err = redigo.Scan(values, &newCursor, &items) + if err != nil { + return 0, nil, err + } + + return newCursor, items, nil +} diff --git a/app/utils/cachesecond/redis_pool_cluster.go b/app/utils/cachesecond/redis_pool_cluster.go new file mode 100644 index 0000000..30ea8ac --- /dev/null +++ b/app/utils/cachesecond/redis_pool_cluster.go @@ -0,0 +1,617 @@ +package cachesecond + +import ( + "strconv" + "time" + + "github.com/go-redis/redis" +) + +type RedisClusterPool struct { + client *redis.ClusterClient +} + +func NewRedisClusterPool(addrs []string) (*RedisClusterPool, error) { + opt := &redis.ClusterOptions{ + Addrs: addrs, + PoolSize: 512, + PoolTimeout: 10 * time.Second, + IdleTimeout: 10 * time.Second, + DialTimeout: 10 * time.Second, + ReadTimeout: 3 * time.Second, + WriteTimeout: 3 * time.Second, + } + c := redis.NewClusterClient(opt) + if err := c.Ping().Err(); err != nil { + return nil, err + } + return &RedisClusterPool{client: c}, nil +} + +func (p *RedisClusterPool) Get(key string) (interface{}, error) { + res, err := p.client.Get(key).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func (p *RedisClusterPool) Set(key string, value interface{}) error { + err := p.client.Set(key, value, 0).Err() + return convertError(err) +} +func (p *RedisClusterPool) GetSet(key string, value interface{}) (interface{}, error) { + res, err := p.client.GetSet(key, value).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func (p *RedisClusterPool) SetNx(key string, value interface{}) (int64, error) { + res, err := p.client.SetNX(key, value, 0).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func (p *RedisClusterPool) SetEx(key string, value interface{}, timeout int64) error { + _, err := p.client.Set(key, value, time.Duration(timeout)*time.Second).Result() + if err != nil { + return convertError(err) + } + return nil +} + +// nil表示成功,ErrNil表示数据库内已经存在这个key,其他表示数据库发生错误 +func (p *RedisClusterPool) SetNxEx(key string, value interface{}, timeout int64) error { + res, err := p.client.SetNX(key, value, time.Duration(timeout)*time.Second).Result() + if err != nil { + return convertError(err) + } + if res { + return nil + } + return ErrNil +} +func (p *RedisClusterPool) MGet(keys ...string) ([]interface{}, error) { + res, err := p.client.MGet(keys...).Result() + return res, convertError(err) +} + +// 为确保多个key映射到同一个slot,每个key最好加上hash tag,如:{test} +func (p *RedisClusterPool) MSet(kvs map[string]interface{}) error { + pairs := make([]string, 0, len(kvs)*2) + for k, v := range kvs { + val, err := String(v, nil) + if err != nil { + return err + } + pairs = append(pairs, k, val) + } + return convertError(p.client.MSet(pairs).Err()) +} + +// 为确保多个key映射到同一个slot,每个key最好加上hash tag,如:{test} +func (p *RedisClusterPool) MSetNX(kvs map[string]interface{}) (bool, error) { + pairs := make([]string, 0, len(kvs)*2) + for k, v := range kvs { + val, err := String(v, nil) + if err != nil { + return false, err + } + pairs = append(pairs, k, val) + } + res, err := p.client.MSetNX(pairs).Result() + return res, convertError(err) +} +func (p *RedisClusterPool) ExpireAt(key string, timestamp int64) (int64, error) { + res, err := p.client.ExpireAt(key, time.Unix(timestamp, 0)).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func (p *RedisClusterPool) Del(keys ...string) (int64, error) { + args := make([]interface{}, 0, len(keys)) + for _, key := range keys { + args = append(args, key) + } + res, err := p.client.Del(keys...).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) Incr(key string) (int64, error) { + res, err := p.client.Incr(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) IncrBy(key string, delta int64) (int64, error) { + res, err := p.client.IncrBy(key, delta).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) Expire(key string, duration int64) (int64, error) { + res, err := p.client.Expire(key, time.Duration(duration)*time.Second).Result() + if err != nil { + return 0, convertError(err) + } + if res { + return 1, nil + } + return 0, nil +} +func (p *RedisClusterPool) Exists(key string) (bool, error) { // todo (bool, error) + res, err := p.client.Exists(key).Result() + if err != nil { + return false, convertError(err) + } + if res > 0 { + return true, nil + } + return false, nil +} +func (p *RedisClusterPool) HGet(key string, field string) (interface{}, error) { + res, err := p.client.HGet(key, field).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func (p *RedisClusterPool) HLen(key string) (int64, error) { + res, err := p.client.HLen(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) HSet(key string, field string, val interface{}) error { + value, err := String(val, nil) + if err != nil && err != ErrNil { + return err + } + _, err = p.client.HSet(key, field, value).Result() + if err != nil { + return convertError(err) + } + return nil +} +func (p *RedisClusterPool) HDel(key string, fields ...string) (int64, error) { + args := make([]interface{}, 0, len(fields)+1) + args = append(args, key) + for _, field := range fields { + args = append(args, field) + } + res, err := p.client.HDel(key, fields...).Result() + if err != nil { + return 0, convertError(err) + } + return res, nil +} + +func (p *RedisClusterPool) HMGet(key string, fields ...string) (interface{}, error) { + args := make([]interface{}, 0, len(fields)+1) + args = append(args, key) + for _, field := range fields { + args = append(args, field) + } + if len(fields) == 0 { + return nil, ErrNil + } + res, err := p.client.HMGet(key, fields...).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) HMSet(key string, kvs ...interface{}) error { + if len(kvs) == 0 { + return nil + } + if len(kvs)%2 != 0 { + return ErrWrongArgsNum + } + var err error + v := map[string]interface{}{} // todo change + v["field"], err = String(kvs[0], nil) + if err != nil && err != ErrNil { + return err + } + v["value"], err = String(kvs[1], nil) + if err != nil && err != ErrNil { + return err + } + pairs := make([]string, 0, len(kvs)-2) + if len(kvs) > 2 { + for _, kv := range kvs[2:] { + kvString, err := String(kv, nil) + if err != nil && err != ErrNil { + return err + } + pairs = append(pairs, kvString) + } + } + v["paris"] = pairs + _, err = p.client.HMSet(key, v).Result() + if err != nil { + return convertError(err) + } + return nil +} + +func (p *RedisClusterPool) HKeys(key string) ([]string, error) { + res, err := p.client.HKeys(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) HVals(key string) ([]interface{}, error) { + res, err := p.client.HVals(key).Result() + if err != nil { + return nil, convertError(err) + } + rs := make([]interface{}, 0, len(res)) + for _, res := range res { + rs = append(rs, res) + } + return rs, nil +} +func (p *RedisClusterPool) HGetAll(key string) (map[string]string, error) { + vals, err := p.client.HGetAll(key).Result() + if err != nil { + return nil, convertError(err) + } + return vals, nil +} +func (p *RedisClusterPool) HIncrBy(key, field string, delta int64) (int64, error) { + res, err := p.client.HIncrBy(key, field, delta).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) ZAdd(key string, kvs ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(kvs)+1) + args = append(args, key) + args = append(args, kvs...) + if len(kvs) == 0 { + return 0, nil + } + if len(kvs)%2 != 0 { + return 0, ErrWrongArgsNum + } + zs := make([]redis.Z, len(kvs)/2) + for i := 0; i < len(kvs); i += 2 { + idx := i / 2 + score, err := Float64(kvs[i], nil) + if err != nil && err != ErrNil { + return 0, err + } + zs[idx].Score = score + zs[idx].Member = kvs[i+1] + } + res, err := p.client.ZAdd(key, zs...).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) ZRem(key string, members ...string) (int64, error) { + args := make([]interface{}, 0, len(members)) + args = append(args, key) + for _, member := range members { + args = append(args, member) + } + res, err := p.client.ZRem(key, members).Result() + if err != nil { + return res, convertError(err) + } + return res, err +} + +func (p *RedisClusterPool) ZRange(key string, min, max int64, withScores bool) (interface{}, error) { + res := make([]interface{}, 0) + if withScores { + zs, err := p.client.ZRangeWithScores(key, min, max).Result() + if err != nil { + return nil, convertError(err) + } + for _, z := range zs { + res = append(res, z.Member, strconv.FormatFloat(z.Score, 'f', -1, 64)) + } + } else { + ms, err := p.client.ZRange(key, min, max).Result() + if err != nil { + return nil, convertError(err) + } + for _, m := range ms { + res = append(res, m) + } + } + return res, nil +} +func (p *RedisClusterPool) ZRangeByScoreWithScore(key string, min, max int64) (map[string]int64, error) { + opt := new(redis.ZRangeBy) + opt.Min = strconv.FormatInt(int64(min), 10) + opt.Max = strconv.FormatInt(int64(max), 10) + opt.Count = -1 + opt.Offset = 0 + vals, err := p.client.ZRangeByScoreWithScores(key, *opt).Result() + if err != nil { + return nil, convertError(err) + } + res := make(map[string]int64, len(vals)) + for _, val := range vals { + key, err := String(val.Member, nil) + if err != nil && err != ErrNil { + return nil, err + } + res[key] = int64(val.Score) + } + return res, nil +} +func (p *RedisClusterPool) LRange(key string, start, stop int64) (interface{}, error) { + res, err := p.client.LRange(key, start, stop).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) LSet(key string, index int, value interface{}) error { + err := p.client.LSet(key, int64(index), value).Err() + return convertError(err) +} +func (p *RedisClusterPool) LLen(key string) (int64, error) { + res, err := p.client.LLen(key).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) LRem(key string, count int, value interface{}) (int, error) { + val, _ := value.(string) + res, err := p.client.LRem(key, int64(count), val).Result() + if err != nil { + return int(res), convertError(err) + } + return int(res), nil +} +func (p *RedisClusterPool) TTl(key string) (int64, error) { + duration, err := p.client.TTL(key).Result() + if err != nil { + return int64(duration.Seconds()), convertError(err) + } + return int64(duration.Seconds()), nil +} +func (p *RedisClusterPool) LPop(key string) (interface{}, error) { + res, err := p.client.LPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) RPop(key string) (interface{}, error) { + res, err := p.client.RPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) BLPop(key string, timeout int) (interface{}, error) { + res, err := p.client.BLPop(time.Duration(timeout)*time.Second, key).Result() + if err != nil { + // 兼容redis 2.x + if err == redis.Nil { + return nil, ErrNil + } + return nil, err + } + return res[1], nil +} +func (p *RedisClusterPool) BRPop(key string, timeout int) (interface{}, error) { + res, err := p.client.BRPop(time.Duration(timeout)*time.Second, key).Result() + if err != nil { + // 兼容redis 2.x + if err == redis.Nil { + return nil, ErrNil + } + return nil, convertError(err) + } + return res[1], nil +} +func (p *RedisClusterPool) LPush(key string, value ...interface{}) error { + args := make([]interface{}, 0, len(value)+1) + args = append(args, key) + args = append(args, value...) + vals := make([]string, 0, len(value)) + for _, v := range value { + val, err := String(v, nil) + if err != nil && err != ErrNil { + return err + } + vals = append(vals, val) + } + _, err := p.client.LPush(key, vals).Result() // todo ... + if err != nil { + return convertError(err) + } + return nil +} +func (p *RedisClusterPool) RPush(key string, value ...interface{}) error { + args := make([]interface{}, 0, len(value)+1) + args = append(args, key) + args = append(args, value...) + vals := make([]string, 0, len(value)) + for _, v := range value { + val, err := String(v, nil) + if err != nil && err != ErrNil { + if err == ErrNil { + continue + } + return err + } + if val == "" { + continue + } + vals = append(vals, val) + } + _, err := p.client.RPush(key, vals).Result() // todo ... + if err != nil { + return convertError(err) + } + return nil +} + +// 为确保srcKey跟destKey映射到同一个slot,srcKey和destKey需要加上hash tag,如:{test} +func (p *RedisClusterPool) BRPopLPush(srcKey string, destKey string, timeout int) (interface{}, error) { + res, err := p.client.BRPopLPush(srcKey, destKey, time.Duration(timeout)*time.Second).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} + +// 为确保srcKey跟destKey映射到同一个slot,srcKey和destKey需要加上hash tag,如:{test} +func (p *RedisClusterPool) RPopLPush(srcKey string, destKey string) (interface{}, error) { + res, err := p.client.RPopLPush(srcKey, destKey).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SAdd(key string, members ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(members)+1) + args = append(args, key) + args = append(args, members...) + ms := make([]string, 0, len(members)) + for _, member := range members { + m, err := String(member, nil) + if err != nil && err != ErrNil { + return 0, err + } + ms = append(ms, m) + } + res, err := p.client.SAdd(key, ms).Result() // todo ... + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SPop(key string) ([]byte, error) { + res, err := p.client.SPop(key).Result() + if err != nil { + return nil, convertError(err) + } + return []byte(res), nil +} +func (p *RedisClusterPool) SIsMember(key string, member interface{}) (bool, error) { + m, _ := member.(string) + res, err := p.client.SIsMember(key, m).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SRem(key string, members ...interface{}) (int64, error) { + args := make([]interface{}, 0, len(members)+1) + args = append(args, key) + args = append(args, members...) + ms := make([]string, 0, len(members)) + for _, member := range members { + m, err := String(member, nil) + if err != nil && err != ErrNil { + return 0, err + } + ms = append(ms, m) + } + res, err := p.client.SRem(key, ms).Result() // todo ... + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SMembers(key string) ([]string, error) { + res, err := p.client.SMembers(key).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) ScriptLoad(luaScript string) (interface{}, error) { + res, err := p.client.ScriptLoad(luaScript).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) EvalSha(sha1 string, numberKeys int, keysArgs ...interface{}) (interface{}, error) { + vals := make([]interface{}, 0, len(keysArgs)+2) + vals = append(vals, sha1, numberKeys) + vals = append(vals, keysArgs...) + keys := make([]string, 0, numberKeys) + args := make([]string, 0, len(keysArgs)-numberKeys) + for i, value := range keysArgs { + val, err := String(value, nil) + if err != nil && err != ErrNil { + return nil, err + } + if i < numberKeys { + keys = append(keys, val) + } else { + args = append(args, val) + } + } + res, err := p.client.EvalSha(sha1, keys, args).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) Eval(luaScript string, numberKeys int, keysArgs ...interface{}) (interface{}, error) { + vals := make([]interface{}, 0, len(keysArgs)+2) + vals = append(vals, luaScript, numberKeys) + vals = append(vals, keysArgs...) + keys := make([]string, 0, numberKeys) + args := make([]string, 0, len(keysArgs)-numberKeys) + for i, value := range keysArgs { + val, err := String(value, nil) + if err != nil && err != ErrNil { + return nil, err + } + if i < numberKeys { + keys = append(keys, val) + } else { + args = append(args, val) + } + } + res, err := p.client.Eval(luaScript, keys, args).Result() + if err != nil { + return nil, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) GetBit(key string, offset int64) (int64, error) { + res, err := p.client.GetBit(key, offset).Result() + if err != nil { + return res, convertError(err) + } + return res, nil +} +func (p *RedisClusterPool) SetBit(key string, offset uint32, value int) (int, error) { + res, err := p.client.SetBit(key, int64(offset), value).Result() + return int(res), convertError(err) +} +func (p *RedisClusterPool) GetClient() *redis.ClusterClient { + return pools +} diff --git a/app/utils/convert.go b/app/utils/convert.go new file mode 100644 index 0000000..4b88b99 --- /dev/null +++ b/app/utils/convert.go @@ -0,0 +1,434 @@ +package utils + +import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_coupon.git/utils" + "encoding/binary" + "encoding/json" + "fmt" + "github.com/gin-gonic/gin" + "math" + "strconv" + "strings" +) + +func ToString(raw interface{}, e error) (res string) { + if e != nil { + return "" + } + return AnyToString(raw) +} + +func ToInt64(raw interface{}, e error) int64 { + if e != nil { + return 0 + } + return AnyToInt64(raw) +} + +func Float64ToStrPrec4(f float64) string { + return strconv.FormatFloat(f, 'f', 4, 64) +} +func AnyToBool(raw interface{}) bool { + switch i := raw.(type) { + case float32, float64, int, int64, uint, uint8, uint16, uint32, uint64, int8, int16, int32: + return i != 0 + case []byte: + return i != nil + case string: + if i == "false" { + return false + } + return i != "" + case error: + return false + case nil: + return true + } + val := fmt.Sprint(raw) + val = strings.TrimLeft(val, "&") + if strings.TrimLeft(val, "{}") == "" { + return false + } + if strings.TrimLeft(val, "[]") == "" { + return false + } + // ptr type + b, err := json.Marshal(raw) + if err != nil { + return false + } + if strings.TrimLeft(string(b), "\"\"") == "" { + return false + } + if strings.TrimLeft(string(b), "{}") == "" { + return false + } + return true +} + +func AnyToInt64(raw interface{}) int64 { + switch i := raw.(type) { + case string: + res, _ := strconv.ParseInt(i, 10, 64) + return res + case []byte: + return BytesToInt64(i) + case int: + return int64(i) + case int64: + return i + case uint: + return int64(i) + case uint8: + return int64(i) + case uint16: + return int64(i) + case uint32: + return int64(i) + case uint64: + return int64(i) + case int8: + return int64(i) + case int16: + return int64(i) + case int32: + return int64(i) + case float32: + return int64(i) + case float64: + return int64(i) + case error: + return 0 + case bool: + if i { + return 1 + } + return 0 + } + return 0 +} + +func AnyToString(raw interface{}) string { + switch i := raw.(type) { + case []byte: + return string(i) + case int: + return strconv.FormatInt(int64(i), 10) + case int64: + return strconv.FormatInt(i, 10) + case float32: + return Float64ToStr(float64(i)) + case float64: + return Float64ToStr(i) + case uint: + return strconv.FormatInt(int64(i), 10) + case uint8: + return strconv.FormatInt(int64(i), 10) + case uint16: + return strconv.FormatInt(int64(i), 10) + case uint32: + return strconv.FormatInt(int64(i), 10) + case uint64: + return strconv.FormatInt(int64(i), 10) + case int8: + return strconv.FormatInt(int64(i), 10) + case int16: + return strconv.FormatInt(int64(i), 10) + case int32: + return strconv.FormatInt(int64(i), 10) + case string: + return i + case error: + return i.Error() + case bool: + return strconv.FormatBool(i) + } + return fmt.Sprintf("%#v", raw) +} + +func AnyToFloat64(raw interface{}) float64 { + switch i := raw.(type) { + case []byte: + f, _ := strconv.ParseFloat(string(i), 64) + return f + case int: + return float64(i) + case int64: + return float64(i) + case float32: + return float64(i) + case float64: + return i + case uint: + return float64(i) + case uint8: + return float64(i) + case uint16: + return float64(i) + case uint32: + return float64(i) + case uint64: + return float64(i) + case int8: + return float64(i) + case int16: + return float64(i) + case int32: + return float64(i) + case string: + f, _ := strconv.ParseFloat(i, 64) + return f + case bool: + if i { + return 1 + } + } + return 0 +} + +func ToByte(raw interface{}, e error) []byte { + if e != nil { + return []byte{} + } + switch i := raw.(type) { + case string: + return []byte(i) + case int: + return Int64ToBytes(int64(i)) + case int64: + return Int64ToBytes(i) + case float32: + return Float32ToByte(i) + case float64: + return Float64ToByte(i) + case uint: + return Int64ToBytes(int64(i)) + case uint8: + return Int64ToBytes(int64(i)) + case uint16: + return Int64ToBytes(int64(i)) + case uint32: + return Int64ToBytes(int64(i)) + case uint64: + return Int64ToBytes(int64(i)) + case int8: + return Int64ToBytes(int64(i)) + case int16: + return Int64ToBytes(int64(i)) + case int32: + return Int64ToBytes(int64(i)) + case []byte: + return i + case error: + return []byte(i.Error()) + case bool: + if i { + return []byte("true") + } + return []byte("false") + } + return []byte(fmt.Sprintf("%#v", raw)) +} + +func Int64ToBytes(i int64) []byte { + var buf = make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(i)) + return buf +} + +func BytesToInt64(buf []byte) int64 { + return int64(binary.BigEndian.Uint64(buf)) +} + +func StrToInt(s string) int { + res, _ := strconv.Atoi(s) + return res +} + +func StrToInt64(s string) int64 { + res, _ := strconv.ParseInt(s, 10, 64) + return res +} + +func Float32ToByte(float float32) []byte { + bits := math.Float32bits(float) + bytes := make([]byte, 4) + binary.LittleEndian.PutUint32(bytes, bits) + + return bytes +} + +func ByteToFloat32(bytes []byte) float32 { + bits := binary.LittleEndian.Uint32(bytes) + return math.Float32frombits(bits) +} + +func Float64ToByte(float float64) []byte { + bits := math.Float64bits(float) + bytes := make([]byte, 8) + binary.LittleEndian.PutUint64(bytes, bits) + return bytes +} + +func ByteToFloat64(bytes []byte) float64 { + bits := binary.LittleEndian.Uint64(bytes) + return math.Float64frombits(bits) +} + +func Float64ToStr(f float64) string { + return strconv.FormatFloat(f, 'f', 2, 64) +} +func Float64ToStrPrec1(f float64) string { + return strconv.FormatFloat(f, 'f', 1, 64) +} +func Float64ToStrByPrec(f float64, prec int) string { + return strconv.FormatFloat(f, 'f', prec, 64) +} +func Float32ToStrByPrec(f float32, prec int) string { + return Float64ToStrByPrec(float64(f), prec) +} +func GetFloatByOne(count, num, mul float64, prec int) string { + + return Float64ToStrByPrec(float64(int(float64(count)/num*mul))/mul, prec) +} + +func Float32ToStr(f float32) string { + return Float64ToStr(float64(f)) +} + +func StrToFloat64(s string) float64 { + res, err := strconv.ParseFloat(s, 64) + if err != nil { + return 0 + } + return res +} +func StrToFormatByType(c *gin.Context, s string, types string) string { + commPrec := "2" + if types == "commission" { + commPrec = c.GetString("commission_prec") + } + if types == "integral" { + commPrec = c.GetString("integral_prec") + } + if s == "" { + s = "0" + } + s = StrToFormat(c, s, utils.StrToInt(commPrec)) + ex := strings.Split(s, ".") + if len(ex) == 2 && c.GetString("is_show_point") != "1" { + if utils.StrToFloat64(ex[1]) == 0 { + s = ex[0] + } else { + val := utils.Float64ToStrByPrec(utils.StrToFloat64(ex[1]), 0) + keyMax := 0 + for i := 0; i < len(val); i++ { + ch := string(val[i]) + fmt.Println(utils.StrToInt(ch)) + if utils.StrToInt(ch) > 0 { + keyMax = i + } + } + valNew := val[0 : keyMax+1] + s = ex[0] + "." + strings.ReplaceAll(ex[1], val, valNew) + } + } + return s +} +func StrToFormat(c *gin.Context, s string, prec int) string { + ex := strings.Split(s, ".") + if len(ex) == 2 { + if StrToFloat64(ex[1]) == 0 && c.GetString("is_show_point") != "1" { //小数点后面为空就是不要小数点了 + return ex[0] + } + //看取多少位 + str := ex[1] + str1 := str + if prec < len(str) { + str1 = str[0:prec] + } else { + for i := 0; i < prec-len(str); i++ { + str1 += "0" + } + } + if prec > 0 { + return ex[0] + "." + str1 + } else { + return ex[0] + } + } + return s +} +func StrToFormatEg(s string, prec int, is_show_point string) string { + ex := strings.Split(s, ".") + if len(ex) == 2 { + if StrToFloat64(ex[1]) == 0 && is_show_point != "1" { //小数点后面为空就是不要小数点了 + return ex[0] + } + //看取多少位 + str := ex[1] + str1 := str + if prec < len(str) { + str1 = str[0:prec] + } else { + for i := 0; i < prec-len(str); i++ { + str1 += "0" + } + } + if prec > 0 { + return ex[0] + "." + str1 + } else { + return ex[0] + } + } + return s +} + +func StrToFloat32(s string) float32 { + res, err := strconv.ParseFloat(s, 32) + if err != nil { + return 0 + } + return float32(res) +} + +func StrToBool(s string) bool { + b, _ := strconv.ParseBool(s) + return b +} + +func BoolToStr(b bool) string { + if b { + return "true" + } + return "false" +} + +func FloatToInt64(f float64) int64 { + return int64(f) +} + +func IntToStr(i int) string { + return strconv.Itoa(i) +} + +func Int64ToStr(i int64) string { + return strconv.FormatInt(i, 10) +} + +func IntToFloat64(i int) float64 { + s := strconv.Itoa(i) + res, err := strconv.ParseFloat(s, 64) + if err != nil { + return 0 + } + return res +} +func Int64ToFloat64(i int64) float64 { + s := strconv.FormatInt(i, 10) + res, err := strconv.ParseFloat(s, 64) + if err != nil { + return 0 + } + return res +} diff --git a/app/utils/crypto.go b/app/utils/crypto.go new file mode 100644 index 0000000..56289c5 --- /dev/null +++ b/app/utils/crypto.go @@ -0,0 +1,19 @@ +package utils + +import ( + "crypto/md5" + "encoding/base64" + "fmt" +) + +func GetMd5(raw []byte) string { + h := md5.New() + h.Write(raw) + return fmt.Sprintf("%x", h.Sum(nil)) +} + +func GetBase64Md5(raw []byte) string { + h := md5.New() + h.Write(raw) + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} diff --git a/app/utils/curl.go b/app/utils/curl.go new file mode 100644 index 0000000..0a45607 --- /dev/null +++ b/app/utils/curl.go @@ -0,0 +1,209 @@ +package utils + +import ( + "bytes" + "crypto/tls" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "sort" + "strings" + "time" +) + +var CurlDebug bool + +func CurlGet(router string, header map[string]string) ([]byte, error) { + return curl(http.MethodGet, router, nil, header) +} +func CurlGetJson(router string, body interface{}, header map[string]string) ([]byte, error) { + return curl_new(http.MethodGet, router, body, header) +} + +// 只支持form 与json 提交, 请留意body的类型, 支持string, []byte, map[string]string +func CurlPost(router string, body interface{}, header map[string]string) ([]byte, error) { + return curl(http.MethodPost, router, body, header) +} + +func CurlPut(router string, body interface{}, header map[string]string) ([]byte, error) { + return curl(http.MethodPut, router, body, header) +} + +// 只支持form 与json 提交, 请留意body的类型, 支持string, []byte, map[string]string +func CurlPatch(router string, body interface{}, header map[string]string) ([]byte, error) { + return curl(http.MethodPatch, router, body, header) +} + +// CurlDelete is curl delete +func CurlDelete(router string, body interface{}, header map[string]string) ([]byte, error) { + return curl(http.MethodDelete, router, body, header) +} + +func curl(method, router string, body interface{}, header map[string]string) ([]byte, error) { + var reqBody io.Reader + contentType := "application/json" + switch v := body.(type) { + case string: + reqBody = strings.NewReader(v) + case []byte: + reqBody = bytes.NewReader(v) + case map[string]string: + val := url.Values{} + for k, v := range v { + val.Set(k, v) + } + reqBody = strings.NewReader(val.Encode()) + contentType = "application/x-www-form-urlencoded" + case map[string]interface{}: + val := url.Values{} + for k, v := range v { + val.Set(k, v.(string)) + } + reqBody = strings.NewReader(val.Encode()) + contentType = "application/x-www-form-urlencoded" + } + if header == nil { + header = map[string]string{"Content-Type": contentType} + } + if _, ok := header["Content-Type"]; !ok { + header["Content-Type"] = contentType + } + resp, er := CurlReq(method, router, reqBody, header) + if er != nil { + return nil, er + } + res, err := ioutil.ReadAll(resp.Body) + if CurlDebug { + blob := SerializeStr(body) + if contentType != "application/json" { + blob = HttpBuild(body) + } + fmt.Printf("\n\n=====================\n[url]: %s\n[time]: %s\n[method]: %s\n[content-type]: %v\n[req_header]: %s\n[req_body]: %#v\n[resp_err]: %v\n[resp_header]: %v\n[resp_body]: %v\n=====================\n\n", + router, + time.Now().Format("2006-01-02 15:04:05.000"), + method, + contentType, + HttpBuildQuery(header), + blob, + err, + SerializeStr(resp.Header), + string(res), + ) + } + resp.Body.Close() + return res, err +} + +func curl_new(method, router string, body interface{}, header map[string]string) ([]byte, error) { + var reqBody io.Reader + contentType := "application/json" + + if header == nil { + header = map[string]string{"Content-Type": contentType} + } + if _, ok := header["Content-Type"]; !ok { + header["Content-Type"] = contentType + } + resp, er := CurlReq(method, router, reqBody, header) + if er != nil { + return nil, er + } + res, err := ioutil.ReadAll(resp.Body) + if CurlDebug { + blob := SerializeStr(body) + if contentType != "application/json" { + blob = HttpBuild(body) + } + fmt.Printf("\n\n=====================\n[url]: %s\n[time]: %s\n[method]: %s\n[content-type]: %v\n[req_header]: %s\n[req_body]: %#v\n[resp_err]: %v\n[resp_header]: %v\n[resp_body]: %v\n=====================\n\n", + router, + time.Now().Format("2006-01-02 15:04:05.000"), + method, + contentType, + HttpBuildQuery(header), + blob, + err, + SerializeStr(resp.Header), + string(res), + ) + } + resp.Body.Close() + return res, err +} + +func CurlReq(method, router string, reqBody io.Reader, header map[string]string) (*http.Response, error) { + req, _ := http.NewRequest(method, router, reqBody) + if header != nil { + for k, v := range header { + req.Header.Set(k, v) + } + } + // 绕过github等可能因为特征码返回503问题 + // https://www.imwzk.com/posts/2021-03-14-why-i-always-get-503-with-golang/ + defaultCipherSuites := []uint16{0xc02f, 0xc030, 0xc02b, 0xc02c, 0xcca8, 0xcca9, 0xc013, 0xc009, + 0xc014, 0xc00a, 0x009c, 0x009d, 0x002f, 0x0035, 0xc012, 0x000a} + client := &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + CipherSuites: append(defaultCipherSuites[8:], defaultCipherSuites[:8]...), + }, + }, + // 获取301重定向 + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }, + } + return client.Do(req) +} + +// 组建get请求参数,sortAsc true为小到大,false为大到小,nil不排序 a=123&b=321 +func HttpBuildQuery(args map[string]string, sortAsc ...bool) string { + str := "" + if len(args) == 0 { + return str + } + if len(sortAsc) > 0 { + keys := make([]string, 0, len(args)) + for k := range args { + keys = append(keys, k) + } + if sortAsc[0] { + sort.Strings(keys) + } else { + sort.Sort(sort.Reverse(sort.StringSlice(keys))) + } + for _, k := range keys { + str += "&" + k + "=" + args[k] + } + } else { + for k, v := range args { + str += "&" + k + "=" + v + } + } + return str[1:] +} + +func HttpBuild(body interface{}, sortAsc ...bool) string { + params := map[string]string{} + if args, ok := body.(map[string]interface{}); ok { + for k, v := range args { + params[k] = AnyToString(v) + } + return HttpBuildQuery(params, sortAsc...) + } + if args, ok := body.(map[string]string); ok { + for k, v := range args { + params[k] = AnyToString(v) + } + return HttpBuildQuery(params, sortAsc...) + } + if args, ok := body.(map[string]int); ok { + for k, v := range args { + params[k] = AnyToString(v) + } + return HttpBuildQuery(params, sortAsc...) + } + return AnyToString(body) +} diff --git a/app/utils/debug.go b/app/utils/debug.go new file mode 100644 index 0000000..bb2e9d3 --- /dev/null +++ b/app/utils/debug.go @@ -0,0 +1,25 @@ +package utils + +import ( + "fmt" + "os" + "strconv" + "time" +) + +func Debug(args ...interface{}) { + s := "" + l := len(args) + if l < 1 { + fmt.Println("please input some data") + os.Exit(0) + } + i := 1 + for _, v := range args { + s += fmt.Sprintf("【"+strconv.Itoa(i)+"】: %#v\n", v) + i++ + } + s = "******************** 【DEBUG - " + time.Now().Format("2006-01-02 15:04:05") + "】 ********************\n" + s + "******************** 【DEBUG - END】 ********************\n" + fmt.Println(s) + os.Exit(0) +} diff --git a/app/utils/distance.go b/app/utils/distance.go new file mode 100644 index 0000000..2a6923b --- /dev/null +++ b/app/utils/distance.go @@ -0,0 +1,16 @@ +package utils + +import "math" + +//返回单位为:千米 +func GetDistance(lat1, lat2, lng1, lng2 float64) float64 { + radius := 6371000.0 //6378137.0 + rad := math.Pi / 180.0 + lat1 = lat1 * rad + lng1 = lng1 * rad + lat2 = lat2 * rad + lng2 = lng2 * rad + theta := lng2 - lng1 + dist := math.Acos(math.Sin(lat1)*math.Sin(lat2) + math.Cos(lat1)*math.Cos(lat2)*math.Cos(theta)) + return dist * radius / 1000 +} diff --git a/app/utils/duplicate.go b/app/utils/duplicate.go new file mode 100644 index 0000000..17cea88 --- /dev/null +++ b/app/utils/duplicate.go @@ -0,0 +1,37 @@ +package utils + +func RemoveDuplicateString(elms []string) []string { + res := make([]string, 0, len(elms)) + temp := map[string]struct{}{} + for _, item := range elms { + if _, ok := temp[item]; !ok { + temp[item] = struct{}{} + res = append(res, item) + } + } + return res +} + +func RemoveDuplicateInt(elms []int) []int { + res := make([]int, 0, len(elms)) + temp := map[int]struct{}{} + for _, item := range elms { + if _, ok := temp[item]; !ok { + temp[item] = struct{}{} + res = append(res, item) + } + } + return res +} + +func RemoveDuplicateInt64(elms []int64) []int64 { + res := make([]int64, 0, len(elms)) + temp := map[int64]struct{}{} + for _, item := range elms { + if _, ok := temp[item]; !ok { + temp[item] = struct{}{} + res = append(res, item) + } + } + return res +} diff --git a/app/utils/file.go b/app/utils/file.go new file mode 100644 index 0000000..93ed08f --- /dev/null +++ b/app/utils/file.go @@ -0,0 +1,22 @@ +package utils + +import ( + "os" + "path" + "strings" + "time" +) + +// 获取文件后缀 +func FileExt(fname string) string { + return strings.ToLower(strings.TrimLeft(path.Ext(fname), ".")) +} + +func FilePutContents(fileName string, content string) { + fd, _ := os.OpenFile("./tmp/"+fileName+".log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) + fd_time := time.Now().Format("2006-01-02 15:04:05") + fd_content := strings.Join([]string{"[", fd_time, "] ", content, "\n"}, "") + buf := []byte(fd_content) + fd.Write(buf) + fd.Close() +} diff --git a/app/utils/file_and_dir.go b/app/utils/file_and_dir.go new file mode 100644 index 0000000..93141f9 --- /dev/null +++ b/app/utils/file_and_dir.go @@ -0,0 +1,29 @@ +package utils + +import "os" + +// 判断所给路径文件、文件夹是否存在 +func Exists(path string) bool { + _, err := os.Stat(path) //os.Stat获取文件信息 + if err != nil { + if os.IsExist(err) { + return true + } + return false + } + return true +} + +// 判断所给路径是否为文件夹 +func IsDir(path string) bool { + s, err := os.Stat(path) + if err != nil { + return false + } + return s.IsDir() +} + +// 判断所给路径是否为文件 +func IsFile(path string) bool { + return !IsDir(path) +} diff --git a/app/utils/format.go b/app/utils/format.go new file mode 100644 index 0000000..55fa4ac --- /dev/null +++ b/app/utils/format.go @@ -0,0 +1,197 @@ +package utils + +import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_coupon.git/utils" + "fmt" + "github.com/gin-gonic/gin" + "math" + "strings" +) + +func CouponFormat(c *gin.Context, data string) string { + switch data { + case "0.00", "0", "": + return "" + default: + return GetPrec(c, data, "2") + } +} +func GetPrec(c *gin.Context, sum, commPrec string) string { + if sum == "" { + sum = "0" + } + sum = StrToFormat(c, sum, utils.StrToInt(commPrec)) + ex := strings.Split(sum, ".") + if len(ex) == 2 && c.GetString("is_show_point") != "1" { + if utils.StrToFloat64(ex[1]) == 0 { + sum = ex[0] + } else { + val := utils.Float64ToStrByPrec(utils.StrToFloat64(ex[1]), 0) + keyMax := 0 + for i := 0; i < len(val); i++ { + ch := string(val[i]) + fmt.Println(utils.StrToInt(ch)) + if utils.StrToInt(ch) > 0 { + keyMax = i + } + } + valNew := val[0 : keyMax+1] + sum = ex[0] + "." + strings.ReplaceAll(ex[1], val, valNew) + } + } + return sum +} + +func CommissionFormat(data string) string { + if StrToFloat64(data) > 0 { + return data + } + + return "" +} + +func HideString(src string, hLen int) string { + str := []rune(src) + if hLen == 0 { + hLen = 4 + } + hideStr := "" + for i := 0; i < hLen; i++ { + hideStr += "*" + } + hideLen := len(str) / 2 + showLen := len(str) - hideLen + if hideLen == 0 || showLen == 0 { + return hideStr + } + subLen := showLen / 2 + if subLen == 0 { + return string(str[:showLen]) + hideStr + } + s := string(str[:subLen]) + s += hideStr + s += string(str[len(str)-subLen:]) + return s +} + +// SaleCountFormat is 格式化销量 +func SaleCountFormat(s string) string { + s = strings.ReplaceAll(s, "+", "") + if strings.Contains(s, "万") { + s = strings.ReplaceAll(s, "万", "") + s = Float64ToStrByPrec(StrToFloat64(s)*10000, 0) + } + ex := strings.Split(s, ".") + if len(ex) == 2 && StrToInt(ex[1]) == 0 { + s = ex[0] + } + if utils.StrToInt(s) > 0 { + s = Comm(s) + return "已售" + s + } + return "已售0" +} +func SaleCountFormat2(s string) string { + s = strings.ReplaceAll(s, "+", "") + if strings.Contains(s, "万") { + s = strings.ReplaceAll(s, "万", "") + s = Float64ToStrByPrec(StrToFloat64(s)*10000, 0) + } + ex := strings.Split(s, ".") + if len(ex) == 2 && StrToInt(ex[1]) == 0 { + s = ex[0] + } + if utils.StrToInt(s) > 0 { + s = Comm(s) + + return s + } + return "0" +} +func SaleCountFormat1(s string) string { + s = strings.ReplaceAll(s, "+", "") + if strings.Contains(s, "万") { + s = strings.ReplaceAll(s, "万", "") + s = Float64ToStrByPrec(StrToFloat64(s)*10000, 0) + } + ex := strings.Split(s, ".") + if len(ex) == 2 && StrToInt(ex[1]) == 0 { + s = ex[0] + } + if utils.StrToInt(s) > 0 { + s = Comm(s) + return s + } + return "0" +} +func Comm(s string) string { + ex := strings.Split(s, ".") + if len(ex) == 2 && StrToInt(ex[1]) == 0 { + s = ex[0] + } + if utils.StrToInt(s) >= 10000 { + num := FloatFormat(StrToFloat64(s)/10000, 2) + numStr := Float64ToStr(num) + ex := strings.Split(numStr, ".") + if len(ex) == 2 { + if utils.StrToFloat64(ex[1]) == 0 { + numStr = ex[0] + } else { + val := utils.Float64ToStrByPrec(utils.StrToFloat64(ex[1]), 0) + keyMax := 0 + for i := 0; i < len(val); i++ { + ch := string(val[i]) + fmt.Println(utils.StrToInt(ch)) + if utils.StrToInt(ch) > 0 { + keyMax = i + } + } + valNew := val[0 : keyMax+1] + numStr = ex[0] + "." + strings.ReplaceAll(ex[1], val, valNew) + } + } + s = numStr + "万" + } + //if StrToInt(s) >= 10000000 { + // num := FloatFormat(StrToFloat64(s)/10000000, 2) + // numStr := Float64ToStr(num) + // ex := strings.Split(numStr, ".") + // if len(ex) == 2 { + // if utils.StrToFloat64(ex[1]) == 0 { + // numStr = ex[0] + // } else { + // val := utils.Float64ToStrByPrec(utils.StrToFloat64(ex[1]), 0) + // keyMax := 0 + // for i := 0; i < len(val); i++ { + // ch := string(val[i]) + // fmt.Println(utils.StrToInt(ch)) + // if utils.StrToInt(ch) > 0 { + // keyMax = i + // } + // } + // valNew := val[0 : keyMax+1] + // numStr = ex[0] + "." + strings.ReplaceAll(ex[1], val, valNew) + // } + // } + // s = numStr + "千万" + //} + return s +} +func CommissionFormat1(numStr string) string { + split := strings.Split(numStr, ".") + if len(split) == 2 { + if split[1] == "00" { + numStr = strings.ReplaceAll(numStr, ".00", "") + } + } + return numStr +} + +// 小数格式化 +func FloatFormat(f float64, i int) float64 { + if i > 14 { + return f + } + p := math.Pow10(i) + return float64(int64((f+0.000000000000009)*p)) / p +} diff --git a/app/utils/json.go b/app/utils/json.go new file mode 100644 index 0000000..2905833 --- /dev/null +++ b/app/utils/json.go @@ -0,0 +1,37 @@ +package utils + +import ( + "bytes" + "encoding/json" + "regexp" +) + +func JsonMarshal(interface{}) { + +} + +// 不科学计数法 +func JsonDecode(data []byte, v interface{}) error { + d := json.NewDecoder(bytes.NewReader(data)) + d.UseNumber() + return d.Decode(v) +} + +// json字符串驼峰命名格式 转为 下划线命名格式 +// c :json字符串 +func MarshalJSONCamelCase2JsonSnakeCase(c string) []byte { + // Regexp definitions + var keyMatchRegex = regexp.MustCompile(`\"(\w+)\":`) + var wordBarrierRegex = regexp.MustCompile(`(\w)([A-Z])`) + marshalled := []byte(c) + converted := keyMatchRegex.ReplaceAllFunc( + marshalled, + func(match []byte) []byte { + return bytes.ToLower(wordBarrierRegex.ReplaceAll( + match, + []byte(`${1}_${2}`), + )) + }, + ) + return converted +} diff --git a/app/utils/logx/log.go b/app/utils/logx/log.go new file mode 100644 index 0000000..ca11223 --- /dev/null +++ b/app/utils/logx/log.go @@ -0,0 +1,245 @@ +package logx + +import ( + "os" + "strings" + "time" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +type LogConfig struct { + AppName string `yaml:"app_name" json:"app_name" toml:"app_name"` + Level string `yaml:"level" json:"level" toml:"level"` + StacktraceLevel string `yaml:"stacktrace_level" json:"stacktrace_level" toml:"stacktrace_level"` + IsStdOut bool `yaml:"is_stdout" json:"is_stdout" toml:"is_stdout"` + TimeFormat string `yaml:"time_format" json:"time_format" toml:"time_format"` // second, milli, nano, standard, iso, + Encoding string `yaml:"encoding" json:"encoding" toml:"encoding"` // console, json + Skip int `yaml:"skip" json:"skip" toml:"skip"` + + IsFileOut bool `yaml:"is_file_out" json:"is_file_out" toml:"is_file_out"` + FileDir string `yaml:"file_dir" json:"file_dir" toml:"file_dir"` + FileName string `yaml:"file_name" json:"file_name" toml:"file_name"` + FileMaxSize int `yaml:"file_max_size" json:"file_max_size" toml:"file_max_size"` + FileMaxAge int `yaml:"file_max_age" json:"file_max_age" toml:"file_max_age"` +} + +var ( + l *LogX = defaultLogger() + conf *LogConfig +) + +// default logger setting +func defaultLogger() *LogX { + conf = &LogConfig{ + Level: "debug", + StacktraceLevel: "error", + IsStdOut: true, + TimeFormat: "standard", + Encoding: "console", + Skip: 2, + } + writers := []zapcore.WriteSyncer{os.Stdout} + lg, lv := newZapLogger(setLogLevel(conf.Level), setLogLevel(conf.StacktraceLevel), conf.Encoding, conf.TimeFormat, conf.Skip, zapcore.NewMultiWriteSyncer(writers...)) + zap.RedirectStdLog(lg) + return &LogX{logger: lg, atomLevel: lv} +} + +// initial standard log, if you don't init, it will use default logger setting +func InitDefaultLogger(cfg *LogConfig) { + var writers []zapcore.WriteSyncer + if cfg.IsStdOut || (!cfg.IsStdOut && !cfg.IsFileOut) { + writers = append(writers, os.Stdout) + } + if cfg.IsFileOut { + writers = append(writers, NewRollingFile(cfg.FileDir, cfg.FileName, cfg.FileMaxSize, cfg.FileMaxAge)) + } + + lg, lv := newZapLogger(setLogLevel(cfg.Level), setLogLevel(cfg.StacktraceLevel), cfg.Encoding, cfg.TimeFormat, cfg.Skip, zapcore.NewMultiWriteSyncer(writers...)) + zap.RedirectStdLog(lg) + if cfg.AppName != "" { + lg = lg.With(zap.String("app", cfg.AppName)) // 加上应用名称 + } + l = &LogX{logger: lg, atomLevel: lv} +} + +// create a new logger +func NewLogger(cfg *LogConfig) *LogX { + var writers []zapcore.WriteSyncer + if cfg.IsStdOut || (!cfg.IsStdOut && !cfg.IsFileOut) { + writers = append(writers, os.Stdout) + } + if cfg.IsFileOut { + writers = append(writers, NewRollingFile(cfg.FileDir, cfg.FileName, cfg.FileMaxSize, cfg.FileMaxAge)) + } + + lg, lv := newZapLogger(setLogLevel(cfg.Level), setLogLevel(cfg.StacktraceLevel), cfg.Encoding, cfg.TimeFormat, cfg.Skip, zapcore.NewMultiWriteSyncer(writers...)) + zap.RedirectStdLog(lg) + if cfg.AppName != "" { + lg = lg.With(zap.String("app", cfg.AppName)) // 加上应用名称 + } + return &LogX{logger: lg, atomLevel: lv} +} + +// create a new zaplog logger +func newZapLogger(level, stacktrace zapcore.Level, encoding, timeType string, skip int, output zapcore.WriteSyncer) (*zap.Logger, *zap.AtomicLevel) { + encCfg := zapcore.EncoderConfig{ + TimeKey: "T", + LevelKey: "L", + NameKey: "N", + CallerKey: "C", + MessageKey: "M", + StacktraceKey: "S", + LineEnding: zapcore.DefaultLineEnding, + EncodeCaller: zapcore.ShortCallerEncoder, + EncodeDuration: zapcore.NanosDurationEncoder, + EncodeLevel: zapcore.LowercaseLevelEncoder, + } + setTimeFormat(timeType, &encCfg) // set time type + atmLvl := zap.NewAtomicLevel() // set level + atmLvl.SetLevel(level) + encoder := zapcore.NewJSONEncoder(encCfg) // 确定encoder格式 + if encoding == "console" { + encoder = zapcore.NewConsoleEncoder(encCfg) + } + return zap.New(zapcore.NewCore(encoder, output, atmLvl), zap.AddCaller(), zap.AddStacktrace(stacktrace), zap.AddCallerSkip(skip)), &atmLvl +} + +// set log level +func setLogLevel(lvl string) zapcore.Level { + switch strings.ToLower(lvl) { + case "panic": + return zapcore.PanicLevel + case "fatal": + return zapcore.FatalLevel + case "error": + return zapcore.ErrorLevel + case "warn", "warning": + return zapcore.WarnLevel + case "info": + return zapcore.InfoLevel + default: + return zapcore.DebugLevel + } +} + +// set time format +func setTimeFormat(timeType string, z *zapcore.EncoderConfig) { + switch strings.ToLower(timeType) { + case "iso": // iso8601 standard + z.EncodeTime = zapcore.ISO8601TimeEncoder + case "sec": // only for unix second, without millisecond + z.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendInt64(t.Unix()) + } + case "second": // unix second, with millisecond + z.EncodeTime = zapcore.EpochTimeEncoder + case "milli", "millisecond": // millisecond + z.EncodeTime = zapcore.EpochMillisTimeEncoder + case "nano", "nanosecond": // nanosecond + z.EncodeTime = zapcore.EpochNanosTimeEncoder + default: // standard format + z.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendString(t.Format("2006-01-02 15:04:05.000")) + } + } +} + +func GetLevel() string { + switch l.atomLevel.Level() { + case zapcore.PanicLevel: + return "panic" + case zapcore.FatalLevel: + return "fatal" + case zapcore.ErrorLevel: + return "error" + case zapcore.WarnLevel: + return "warn" + case zapcore.InfoLevel: + return "info" + default: + return "debug" + } +} + +func SetLevel(lvl string) { + l.atomLevel.SetLevel(setLogLevel(lvl)) +} + +// temporary add call skip +func AddCallerSkip(skip int) *LogX { + l.logger.WithOptions(zap.AddCallerSkip(skip)) + return l +} + +// permanent add call skip +func AddDepth(skip int) *LogX { + l.logger = l.logger.WithOptions(zap.AddCallerSkip(skip)) + return l +} + +// permanent add options +func AddOptions(opts ...zap.Option) *LogX { + l.logger = l.logger.WithOptions(opts...) + return l +} + +func AddField(k string, v interface{}) { + l.logger.With(zap.Any(k, v)) +} + +func AddFields(fields map[string]interface{}) *LogX { + for k, v := range fields { + l.logger.With(zap.Any(k, v)) + } + return l +} + +// Normal log +func Debug(e interface{}, args ...interface{}) error { + return l.Debug(e, args...) +} +func Info(e interface{}, args ...interface{}) error { + return l.Info(e, args...) +} +func Warn(e interface{}, args ...interface{}) error { + return l.Warn(e, args...) +} +func Error(e interface{}, args ...interface{}) error { + return l.Error(e, args...) +} +func Panic(e interface{}, args ...interface{}) error { + return l.Panic(e, args...) +} +func Fatal(e interface{}, args ...interface{}) error { + return l.Fatal(e, args...) +} + +// Format logs +func Debugf(format string, args ...interface{}) error { + return l.Debugf(format, args...) +} +func Infof(format string, args ...interface{}) error { + return l.Infof(format, args...) +} +func Warnf(format string, args ...interface{}) error { + return l.Warnf(format, args...) +} +func Errorf(format string, args ...interface{}) error { + return l.Errorf(format, args...) +} +func Panicf(format string, args ...interface{}) error { + return l.Panicf(format, args...) +} +func Fatalf(format string, args ...interface{}) error { + return l.Fatalf(format, args...) +} + +func formatFieldMap(m FieldMap) []Field { + var res []Field + for k, v := range m { + res = append(res, zap.Any(k, v)) + } + return res +} diff --git a/app/utils/logx/output.go b/app/utils/logx/output.go new file mode 100644 index 0000000..ef33f0b --- /dev/null +++ b/app/utils/logx/output.go @@ -0,0 +1,105 @@ +package logx + +import ( + "bytes" + "io" + "os" + "path/filepath" + "time" + + "gopkg.in/natefinch/lumberjack.v2" +) + +// output interface +type WriteSyncer interface { + io.Writer + Sync() error +} + +// split writer +func NewRollingFile(dir, filename string, maxSize, MaxAge int) WriteSyncer { + s, err := os.Stat(dir) + if err != nil || !s.IsDir() { + os.RemoveAll(dir) + if err := os.MkdirAll(dir, 0766); err != nil { + panic(err) + } + } + return newLumberjackWriteSyncer(&lumberjack.Logger{ + Filename: filepath.Join(dir, filename), + MaxSize: maxSize, // megabytes, MB + MaxAge: MaxAge, // days + LocalTime: true, + Compress: false, + }) +} + +type lumberjackWriteSyncer struct { + *lumberjack.Logger + buf *bytes.Buffer + logChan chan []byte + closeChan chan interface{} + maxSize int +} + +func newLumberjackWriteSyncer(l *lumberjack.Logger) *lumberjackWriteSyncer { + ws := &lumberjackWriteSyncer{ + Logger: l, + buf: bytes.NewBuffer([]byte{}), + logChan: make(chan []byte, 5000), + closeChan: make(chan interface{}), + maxSize: 1024, + } + go ws.run() + return ws +} + +func (l *lumberjackWriteSyncer) run() { + ticker := time.NewTicker(1 * time.Second) + + for { + select { + case <-ticker.C: + if l.buf.Len() > 0 { + l.sync() + } + case bs := <-l.logChan: + _, err := l.buf.Write(bs) + if err != nil { + continue + } + if l.buf.Len() > l.maxSize { + l.sync() + } + case <-l.closeChan: + l.sync() + return + } + } +} + +func (l *lumberjackWriteSyncer) Stop() { + close(l.closeChan) +} + +func (l *lumberjackWriteSyncer) Write(bs []byte) (int, error) { + b := make([]byte, len(bs)) + for i, c := range bs { + b[i] = c + } + l.logChan <- b + return 0, nil +} + +func (l *lumberjackWriteSyncer) Sync() error { + return nil +} + +func (l *lumberjackWriteSyncer) sync() error { + defer l.buf.Reset() + _, err := l.Logger.Write(l.buf.Bytes()) + if err != nil { + return err + } + return nil +} diff --git a/app/utils/logx/sugar.go b/app/utils/logx/sugar.go new file mode 100644 index 0000000..ab380fc --- /dev/null +++ b/app/utils/logx/sugar.go @@ -0,0 +1,192 @@ +package logx + +import ( + "errors" + "fmt" + "strconv" + + "go.uber.org/zap" +) + +type LogX struct { + logger *zap.Logger + atomLevel *zap.AtomicLevel +} + +type Field = zap.Field +type FieldMap map[string]interface{} + +// 判断其他类型--start +func getFields(msg string, format bool, args ...interface{}) (string, []Field) { + var str []interface{} + var fields []zap.Field + if len(args) > 0 { + for _, v := range args { + if f, ok := v.(Field); ok { + fields = append(fields, f) + } else if f, ok := v.(FieldMap); ok { + fields = append(fields, formatFieldMap(f)...) + } else { + str = append(str, AnyToString(v)) + } + } + if format { + return fmt.Sprintf(msg, str...), fields + } + str = append([]interface{}{msg}, str...) + return fmt.Sprintln(str...), fields + } + return msg, []Field{} +} + +func (l *LogX) Debug(s interface{}, args ...interface{}) error { + es, e := checkErr(s) + if es != "" { + msg, field := getFields(es, false, args...) + l.logger.Debug(msg, field...) + } + return e +} +func (l *LogX) Info(s interface{}, args ...interface{}) error { + es, e := checkErr(s) + if es != "" { + msg, field := getFields(es, false, args...) + l.logger.Info(msg, field...) + } + return e +} +func (l *LogX) Warn(s interface{}, args ...interface{}) error { + es, e := checkErr(s) + if es != "" { + msg, field := getFields(es, false, args...) + l.logger.Warn(msg, field...) + } + return e +} +func (l *LogX) Error(s interface{}, args ...interface{}) error { + es, e := checkErr(s) + if es != "" { + msg, field := getFields(es, false, args...) + l.logger.Error(msg, field...) + } + return e +} +func (l *LogX) DPanic(s interface{}, args ...interface{}) error { + es, e := checkErr(s) + if es != "" { + msg, field := getFields(es, false, args...) + l.logger.DPanic(msg, field...) + } + return e +} +func (l *LogX) Panic(s interface{}, args ...interface{}) error { + es, e := checkErr(s) + if es != "" { + msg, field := getFields(es, false, args...) + l.logger.Panic(msg, field...) + } + return e +} +func (l *LogX) Fatal(s interface{}, args ...interface{}) error { + es, e := checkErr(s) + if es != "" { + msg, field := getFields(es, false, args...) + l.logger.Fatal(msg, field...) + } + return e +} + +func checkErr(s interface{}) (string, error) { + switch e := s.(type) { + case error: + return e.Error(), e + case string: + return e, errors.New(e) + case []byte: + return string(e), nil + default: + return "", nil + } +} + +func (l *LogX) LogError(err error) error { + return l.Error(err.Error()) +} + +func (l *LogX) Debugf(msg string, args ...interface{}) error { + s, f := getFields(msg, true, args...) + l.logger.Debug(s, f...) + return errors.New(s) +} + +func (l *LogX) Infof(msg string, args ...interface{}) error { + s, f := getFields(msg, true, args...) + l.logger.Info(s, f...) + return errors.New(s) +} + +func (l *LogX) Warnf(msg string, args ...interface{}) error { + s, f := getFields(msg, true, args...) + l.logger.Warn(s, f...) + return errors.New(s) +} + +func (l *LogX) Errorf(msg string, args ...interface{}) error { + s, f := getFields(msg, true, args...) + l.logger.Error(s, f...) + return errors.New(s) +} + +func (l *LogX) DPanicf(msg string, args ...interface{}) error { + s, f := getFields(msg, true, args...) + l.logger.DPanic(s, f...) + return errors.New(s) +} + +func (l *LogX) Panicf(msg string, args ...interface{}) error { + s, f := getFields(msg, true, args...) + l.logger.Panic(s, f...) + return errors.New(s) +} + +func (l *LogX) Fatalf(msg string, args ...interface{}) error { + s, f := getFields(msg, true, args...) + l.logger.Fatal(s, f...) + return errors.New(s) +} + +func AnyToString(raw interface{}) string { + switch i := raw.(type) { + case []byte: + return string(i) + case int: + return strconv.FormatInt(int64(i), 10) + case int64: + return strconv.FormatInt(i, 10) + case float32: + return strconv.FormatFloat(float64(i), 'f', 2, 64) + case float64: + return strconv.FormatFloat(i, 'f', 2, 64) + case uint: + return strconv.FormatInt(int64(i), 10) + case uint8: + return strconv.FormatInt(int64(i), 10) + case uint16: + return strconv.FormatInt(int64(i), 10) + case uint32: + return strconv.FormatInt(int64(i), 10) + case uint64: + return strconv.FormatInt(int64(i), 10) + case int8: + return strconv.FormatInt(int64(i), 10) + case int16: + return strconv.FormatInt(int64(i), 10) + case int32: + return strconv.FormatInt(int64(i), 10) + case string: + return i + case error: + return i.Error() + } + return fmt.Sprintf("%#v", raw) +} diff --git a/app/utils/map_and_struct.go b/app/utils/map_and_struct.go new file mode 100644 index 0000000..34904ce --- /dev/null +++ b/app/utils/map_and_struct.go @@ -0,0 +1,341 @@ +package utils + +import ( + "encoding/json" + "fmt" + "reflect" + "strconv" + "strings" +) + +func Map2Struct(vals map[string]interface{}, dst interface{}) (err error) { + return Map2StructByTag(vals, dst, "json") +} + +func Map2StructByTag(vals map[string]interface{}, dst interface{}, structTag string) (err error) { + defer func() { + e := recover() + if e != nil { + if v, ok := e.(error); ok { + err = fmt.Errorf("Panic: %v", v.Error()) + } else { + err = fmt.Errorf("Panic: %v", e) + } + } + }() + + pt := reflect.TypeOf(dst) + pv := reflect.ValueOf(dst) + + if pv.Kind() != reflect.Ptr || pv.Elem().Kind() != reflect.Struct { + return fmt.Errorf("not a pointer of struct") + } + + var f reflect.StructField + var ft reflect.Type + var fv reflect.Value + + for i := 0; i < pt.Elem().NumField(); i++ { + f = pt.Elem().Field(i) + fv = pv.Elem().Field(i) + ft = f.Type + + if f.Anonymous || !fv.CanSet() { + continue + } + + tag := f.Tag.Get(structTag) + + name, option := parseTag(tag) + + if name == "-" { + continue + } + + if name == "" { + name = strings.ToLower(f.Name) + } + val, ok := vals[name] + + if !ok { + if option == "required" { + return fmt.Errorf("'%v' not found", name) + } + if len(option) != 0 { + val = option // default value + } else { + //fv.Set(reflect.Zero(ft)) // TODO set zero value or just ignore it? + continue + } + } + + // convert or set value to field + vv := reflect.ValueOf(val) + vt := reflect.TypeOf(val) + + if vt.Kind() != reflect.String { + // try to assign and convert + if vt.AssignableTo(ft) { + fv.Set(vv) + continue + } + + if vt.ConvertibleTo(ft) { + fv.Set(vv.Convert(ft)) + continue + } + + return fmt.Errorf("value type not match: field=%v(%v) value=%v(%v)", f.Name, ft.Kind(), val, vt.Kind()) + } + s := strings.TrimSpace(vv.String()) + if len(s) == 0 && option == "required" { + return fmt.Errorf("value of required argument can't not be empty") + } + fk := ft.Kind() + + // convert string to value + if fk == reflect.Ptr && ft.Elem().Kind() == reflect.String { + fv.Set(reflect.ValueOf(&s)) + continue + } + if fk == reflect.Ptr || fk == reflect.Struct { + err = convertJsonValue(s, name, fv) + } else if fk == reflect.Slice { + err = convertSlice(s, f.Name, ft, fv) + } else { + err = convertValue(fk, s, f.Name, fv) + } + + if err != nil { + return err + } + continue + } + + return nil +} + +func Struct2Map(s interface{}) map[string]interface{} { + return Struct2MapByTag(s, "json") +} +func Struct2MapByTag(s interface{}, tagName string) map[string]interface{} { + t := reflect.TypeOf(s) + v := reflect.ValueOf(s) + + if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct { + t = t.Elem() + v = v.Elem() + } + + if v.Kind() != reflect.Struct { + return nil + } + + m := make(map[string]interface{}) + + for i := 0; i < t.NumField(); i++ { + fv := v.Field(i) + ft := t.Field(i) + + if !fv.CanInterface() { + continue + } + + if ft.PkgPath != "" { // unexported + continue + } + + var name string + var option string + tag := ft.Tag.Get(tagName) + if tag != "" { + ts := strings.Split(tag, ",") + if len(ts) == 1 { + name = ts[0] + } else if len(ts) > 1 { + name = ts[0] + option = ts[1] + } + if name == "-" { + continue // skip this field + } + if name == "" { + name = strings.ToLower(ft.Name) + } + if option == "omitempty" { + if isEmpty(&fv) { + continue // skip empty field + } + } + } else { + name = strings.ToLower(ft.Name) + } + + if ft.Anonymous && fv.Kind() == reflect.Ptr && fv.IsNil() { + continue + } + if (ft.Anonymous && fv.Kind() == reflect.Struct) || + (ft.Anonymous && fv.Kind() == reflect.Ptr && fv.Elem().Kind() == reflect.Struct) { + + // embedded struct + embedded := Struct2MapByTag(fv.Interface(), tagName) + for embName, embValue := range embedded { + m[embName] = embValue + } + } else if option == "string" { + kind := fv.Kind() + if kind == reflect.Int || kind == reflect.Int8 || kind == reflect.Int16 || kind == reflect.Int32 || kind == reflect.Int64 { + m[name] = strconv.FormatInt(fv.Int(), 10) + } else if kind == reflect.Uint || kind == reflect.Uint8 || kind == reflect.Uint16 || kind == reflect.Uint32 || kind == reflect.Uint64 { + m[name] = strconv.FormatUint(fv.Uint(), 10) + } else if kind == reflect.Float32 || kind == reflect.Float64 { + m[name] = strconv.FormatFloat(fv.Float(), 'f', 2, 64) + } else { + m[name] = fv.Interface() + } + } else { + m[name] = fv.Interface() + } + } + + return m +} + +func isEmpty(v *reflect.Value) bool { + k := v.Kind() + if k == reflect.Bool { + return v.Bool() == false + } else if reflect.Int < k && k < reflect.Int64 { + return v.Int() == 0 + } else if reflect.Uint < k && k < reflect.Uintptr { + return v.Uint() == 0 + } else if k == reflect.Float32 || k == reflect.Float64 { + return v.Float() == 0 + } else if k == reflect.Array || k == reflect.Map || k == reflect.Slice || k == reflect.String { + return v.Len() == 0 + } else if k == reflect.Interface || k == reflect.Ptr { + return v.IsNil() + } + return false +} + +func convertSlice(s string, name string, ft reflect.Type, fv reflect.Value) error { + var err error + et := ft.Elem() + + if et.Kind() == reflect.Ptr || et.Kind() == reflect.Struct { + return convertJsonValue(s, name, fv) + } + + ss := strings.Split(s, ",") + + if len(s) == 0 || len(ss) == 0 { + return nil + } + + fs := reflect.MakeSlice(ft, 0, len(ss)) + + for _, si := range ss { + ev := reflect.New(et).Elem() + + err = convertValue(et.Kind(), si, name, ev) + if err != nil { + return err + } + fs = reflect.Append(fs, ev) + } + + fv.Set(fs) + + return nil +} + +func convertJsonValue(s string, name string, fv reflect.Value) error { + var err error + d := StringToSlice(s) + + if fv.Kind() == reflect.Ptr { + if fv.IsNil() { + fv.Set(reflect.New(fv.Type().Elem())) + } + } else { + fv = fv.Addr() + } + + err = json.Unmarshal(d, fv.Interface()) + + if err != nil { + return fmt.Errorf("invalid json '%v': %v, %v", name, err.Error(), s) + } + + return nil +} + +func convertValue(kind reflect.Kind, s string, name string, fv reflect.Value) error { + if !fv.CanAddr() { + return fmt.Errorf("can not addr: %v", name) + } + + if kind == reflect.String { + fv.SetString(s) + return nil + } + + if kind == reflect.Bool { + switch s { + case "true": + fv.SetBool(true) + case "false": + fv.SetBool(false) + case "1": + fv.SetBool(true) + case "0": + fv.SetBool(false) + default: + return fmt.Errorf("invalid bool: %v value=%v", name, s) + } + return nil + } + + if reflect.Int <= kind && kind <= reflect.Int64 { + i, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return fmt.Errorf("invalid int: %v value=%v", name, s) + } + fv.SetInt(i) + + } else if reflect.Uint <= kind && kind <= reflect.Uint64 { + i, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return fmt.Errorf("invalid int: %v value=%v", name, s) + } + fv.SetUint(i) + + } else if reflect.Float32 == kind || kind == reflect.Float64 { + i, err := strconv.ParseFloat(s, 64) + + if err != nil { + return fmt.Errorf("invalid float: %v value=%v", name, s) + } + + fv.SetFloat(i) + } else { + // not support or just ignore it? + // return fmt.Errorf("type not support: field=%v(%v) value=%v(%v)", name, ft.Kind(), val, vt.Kind()) + } + return nil +} + +func parseTag(tag string) (string, string) { + tags := strings.Split(tag, ",") + + if len(tags) <= 0 { + return "", "" + } + + if len(tags) == 1 { + return tags[0], "" + } + + return tags[0], tags[1] +} diff --git a/app/utils/map_to_map.go b/app/utils/map_to_map.go new file mode 100644 index 0000000..3a68bad --- /dev/null +++ b/app/utils/map_to_map.go @@ -0,0 +1,112 @@ +package utils + +import ( + "math" +) + +// WGS84坐标系:即地球坐标系,国际上通用的坐标系。 +// GCJ02坐标系:即火星坐标系,WGS84坐标系经加密后的坐标系。Google Maps,高德在用。 +// BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系。 + +const ( + X_PI = math.Pi * 3000.0 / 180.0 + OFFSET = 0.00669342162296594323 + AXIS = 6378245.0 +) + +//BD09toGCJ02 百度坐标系->火星坐标系 +func BD09toGCJ02(lon, lat float64) (float64, float64) { + x := lon - 0.0065 + y := lat - 0.006 + + z := math.Sqrt(x*x+y*y) - 0.00002*math.Sin(y*X_PI) + theta := math.Atan2(y, x) - 0.000003*math.Cos(x*X_PI) + + gLon := z * math.Cos(theta) + gLat := z * math.Sin(theta) + + return gLon, gLat +} + +//GCJ02toBD09 火星坐标系->百度坐标系 +func GCJ02toBD09(lon, lat float64) (float64, float64) { + z := math.Sqrt(lon*lon+lat*lat) + 0.00002*math.Sin(lat*X_PI) + theta := math.Atan2(lat, lon) + 0.000003*math.Cos(lon*X_PI) + + bdLon := z*math.Cos(theta) + 0.0065 + bdLat := z*math.Sin(theta) + 0.006 + + return bdLon, bdLat +} + +//WGS84toGCJ02 WGS84坐标系->火星坐标系 +func WGS84toGCJ02(lon, lat float64) (float64, float64) { + if isOutOFChina(lon, lat) { + return lon, lat + } + + mgLon, mgLat := delta(lon, lat) + + return mgLon, mgLat +} + +//GCJ02toWGS84 火星坐标系->WGS84坐标系 +func GCJ02toWGS84(lon, lat float64) (float64, float64) { + if isOutOFChina(lon, lat) { + return lon, lat + } + + mgLon, mgLat := delta(lon, lat) + + return lon*2 - mgLon, lat*2 - mgLat +} + +//BD09toWGS84 百度坐标系->WGS84坐标系 +func BD09toWGS84(lon, lat float64) (float64, float64) { + lon, lat = BD09toGCJ02(lon, lat) + return GCJ02toWGS84(lon, lat) +} + +//WGS84toBD09 WGS84坐标系->百度坐标系 +func WGS84toBD09(lon, lat float64) (float64, float64) { + lon, lat = WGS84toGCJ02(lon, lat) + return GCJ02toBD09(lon, lat) +} + +func delta(lon, lat float64) (float64, float64) { + dlat := transformlat(lon-105.0, lat-35.0) + dlon := transformlng(lon-105.0, lat-35.0) + + radlat := lat / 180.0 * math.Pi + magic := math.Sin(radlat) + magic = 1 - OFFSET*magic*magic + sqrtmagic := math.Sqrt(magic) + + dlat = (dlat * 180.0) / ((AXIS * (1 - OFFSET)) / (magic * sqrtmagic) * math.Pi) + dlon = (dlon * 180.0) / (AXIS / sqrtmagic * math.Cos(radlat) * math.Pi) + + mgLat := lat + dlat + mgLon := lon + dlon + + return mgLon, mgLat +} + +func transformlat(lon, lat float64) float64 { + var ret = -100.0 + 2.0*lon + 3.0*lat + 0.2*lat*lat + 0.1*lon*lat + 0.2*math.Sqrt(math.Abs(lon)) + ret += (20.0*math.Sin(6.0*lon*math.Pi) + 20.0*math.Sin(2.0*lon*math.Pi)) * 2.0 / 3.0 + ret += (20.0*math.Sin(lat*math.Pi) + 40.0*math.Sin(lat/3.0*math.Pi)) * 2.0 / 3.0 + ret += (160.0*math.Sin(lat/12.0*math.Pi) + 320*math.Sin(lat*math.Pi/30.0)) * 2.0 / 3.0 + return ret +} + +func transformlng(lon, lat float64) float64 { + var ret = 300.0 + lon + 2.0*lat + 0.1*lon*lon + 0.1*lon*lat + 0.1*math.Sqrt(math.Abs(lon)) + ret += (20.0*math.Sin(6.0*lon*math.Pi) + 20.0*math.Sin(2.0*lon*math.Pi)) * 2.0 / 3.0 + ret += (20.0*math.Sin(lon*math.Pi) + 40.0*math.Sin(lon/3.0*math.Pi)) * 2.0 / 3.0 + ret += (150.0*math.Sin(lon/12.0*math.Pi) + 300.0*math.Sin(lon/30.0*math.Pi)) * 2.0 / 3.0 + return ret +} + +func isOutOFChina(lon, lat float64) bool { + return !(lon > 73.66 && lon < 135.05 && lat > 3.86 && lat < 53.55) +} diff --git a/app/utils/md5.go b/app/utils/md5.go new file mode 100644 index 0000000..52c108d --- /dev/null +++ b/app/utils/md5.go @@ -0,0 +1,12 @@ +package utils + +import ( + "crypto/md5" + "encoding/hex" +) + +func Md5(str string) string { + h := md5.New() + h.Write([]byte(str)) + return hex.EncodeToString(h.Sum(nil)) +} diff --git a/app/utils/open_platform.go b/app/utils/open_platform.go new file mode 100644 index 0000000..b4f79da --- /dev/null +++ b/app/utils/open_platform.go @@ -0,0 +1,135 @@ +package utils + +import ( + "applet/app/cfg" + "encoding/json" + "errors" + "fmt" + "sort" + "time" +) + +// 调用开放平台的封装 +type OpenPlatformReqClient struct { + AppKey string + AppSecret string + Method string + Version string + Timestamp string + Nonce string + Sign string + BizData map[string]interface{} + params map[string]string + ReturnData ReturnDataResp +} + +type ReturnDataResp struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data interface{} `json:"data"` +} + +func NewOpenPlatformReqClient(appKey, method, version, appSecret string, bizData map[string]interface{}) (*OpenPlatformReqClient, error) { + if appKey == "" || appSecret == "" || method == "" || version == "" { + return nil, errors.New("appKey,method,version not allow empty") + } + nowStr := AnyToString(time.Now().Unix()) + nonce := UUIDString() + return &OpenPlatformReqClient{ + AppKey: appKey, + AppSecret: appSecret, + Method: method, + Version: version, + Nonce: nonce, + Timestamp: nowStr, + params: map[string]string{"app_key": appKey, "method": method, "version": version, "timestamp": nowStr, "nonce": nonce}, + BizData: bizData, + }, nil +} + +func (client *OpenPlatformReqClient) CurlOpen() error { + if client.params == nil { + return errors.New("params not allow empty") + } + url := cfg.ZhiosOpen.URL + "/api/open/gw" + fmt.Printf("%#v\n", string(Serialize(client.params))) + resp, err := CurlPost(url, Serialize(client.params), nil) + if err != nil { + return err + } + err = json.Unmarshal(resp, &client.ReturnData) + if err != nil { + return err + } + return nil +} + +/*func (client *OpenPlatformReqClient) CreateParams() *OpenPlatformReqClient { + client.params["timestamp"] = client.Timestamp + client.params["nonce"] = client.Nonce + //client.params["biz_data"] = SerializeStr(client.BizData) + return client +}*/ + +func (client *OpenPlatformReqClient) SetBizDataToParams() *OpenPlatformReqClient { + client.params["biz_data"] = SerializeStr(client.BizData) + return client +} + +func (client *OpenPlatformReqClient) SetParams(key, value string) *OpenPlatformReqClient { + client.params[key] = value + return client +} + +func (client *OpenPlatformReqClient) GetParams(key string) string { + return client.params[key] +} + +func (client *OpenPlatformReqClient) CreateSign() *OpenPlatformReqClient { + /*if client.BizData != nil { + for key := range client.BizData { + client.params[key] = AnyToString2(client.BizData[key]) + } + }*/ + var keys []string + for key := range client.params { + keys = append(keys, key) + } + sort.Strings(keys) + str := "" + for _, key := range keys { + str += fmt.Sprintf("%v=%v&", key, client.params[key]) + } + str = client.AppSecret + str[:len(str)-1] + client.AppSecret + fmt.Printf("sign: %s\n", str) + client.Sign = Md5(str) + client.params["sign"] = client.Sign + if client.BizData != nil { + for key := range client.BizData { + if _, ok := client.params[key]; ok { + delete(client.params, key) + } + } + } + return client +} + +func (client *OpenPlatformReqClient) VerifySign(sign string) bool { + if sign == "" || client.Sign == "" { + return false + } + if client.Sign == sign { + return true + } + return false +} + +func (client *OpenPlatformReqClient) ResetNonce() *OpenPlatformReqClient { + client.Nonce = UUIDString() + return client +} + +func (client *OpenPlatformReqClient) ResetTimestamp() *OpenPlatformReqClient { + client.Timestamp = AnyToString(time.Now().Unix()) + return client +} diff --git a/app/utils/qrcode/decodeFile.go b/app/utils/qrcode/decodeFile.go new file mode 100644 index 0000000..f50fb28 --- /dev/null +++ b/app/utils/qrcode/decodeFile.go @@ -0,0 +1,33 @@ +package qrcode + +import ( + "image" + _ "image/jpeg" + _ "image/png" + "os" + + "github.com/makiuchi-d/gozxing" + "github.com/makiuchi-d/gozxing/qrcode" +) + +func DecodeFile(fi string) (string, error) { + file, err := os.Open(fi) + if err != nil { + return "", err + } + img, _, err := image.Decode(file) + if err != nil { + return "", err + } + // prepare BinaryBitmap + bmp, err := gozxing.NewBinaryBitmapFromImage(img) + if err != nil { + return "", err + } + // decode image + result, err := qrcode.NewQRCodeReader().Decode(bmp, nil) + if err != nil { + return "", err + } + return result.String(), nil +} diff --git a/app/utils/qrcode/getBase64.go b/app/utils/qrcode/getBase64.go new file mode 100644 index 0000000..2d0fe75 --- /dev/null +++ b/app/utils/qrcode/getBase64.go @@ -0,0 +1,55 @@ +package qrcode + +// 生成登录二维码图片, 方便在网页上显示 + +import ( + "bytes" + "encoding/base64" + "image/jpeg" + "image/png" + "io/ioutil" + "net/http" + + "github.com/boombuler/barcode" + "github.com/boombuler/barcode/qr" +) + +func GetJPGBase64(content string, edges ...int) string { + edgeLen := 300 + if len(edges) > 0 && edges[0] > 100 && edges[0] < 2000 { + edgeLen = edges[0] + } + img, _ := qr.Encode(content, qr.L, qr.Unicode) + img, _ = barcode.Scale(img, edgeLen, edgeLen) + + emptyBuff := bytes.NewBuffer(nil) // 开辟一个新的空buff缓冲区 + jpeg.Encode(emptyBuff, img, nil) + dist := make([]byte, 50000) // 开辟存储空间 + base64.StdEncoding.Encode(dist, emptyBuff.Bytes()) // buff转成base64 + return "data:image/png;base64," + string(dist) // 输出图片base64(type = []byte) +} + +func GetPNGBase64(content string, edges ...int) string { + edgeLen := 300 + if len(edges) > 0 && edges[0] > 100 && edges[0] < 2000 { + edgeLen = edges[0] + } + img, _ := qr.Encode(content, qr.L, qr.Unicode) + img, _ = barcode.Scale(img, edgeLen, edgeLen) + + emptyBuff := bytes.NewBuffer(nil) // 开辟一个新的空buff缓冲区 + png.Encode(emptyBuff, img) + dist := make([]byte, 50000) // 开辟存储空间 + base64.StdEncoding.Encode(dist, emptyBuff.Bytes()) // buff转成base64 + return string(dist) // 输出图片base64(type = []byte) +} +func GetFileBase64(content string) string { + res, err := http.Get(content) + if err != nil { + return "" + } + defer res.Body.Close() + data, _ := ioutil.ReadAll(res.Body) + imageBase64 := base64.StdEncoding.EncodeToString(data) + return imageBase64 +} diff --git a/app/utils/qrcode/saveFile.go b/app/utils/qrcode/saveFile.go new file mode 100644 index 0000000..4854783 --- /dev/null +++ b/app/utils/qrcode/saveFile.go @@ -0,0 +1,85 @@ +package qrcode + +// 生成登录二维码图片 + +import ( + "errors" + "image" + "image/jpeg" + "image/png" + "os" + "path/filepath" + "strings" + + "github.com/boombuler/barcode" + "github.com/boombuler/barcode/qr" +) + +func SaveJpegFile(filePath, content string, edges ...int) error { + edgeLen := 300 + if len(edges) > 0 && edges[0] > 100 && edges[0] < 2000 { + edgeLen = edges[0] + } + img, _ := qr.Encode(content, qr.L, qr.Unicode) + img, _ = barcode.Scale(img, edgeLen, edgeLen) + + return writeFile(filePath, img, "jpg") +} + +func SavePngFile(filePath, content string, edges ...int) error { + edgeLen := 300 + if len(edges) > 0 && edges[0] > 100 && edges[0] < 2000 { + edgeLen = edges[0] + } + img, _ := qr.Encode(content, qr.L, qr.Unicode) + img, _ = barcode.Scale(img, edgeLen, edgeLen) + + return writeFile(filePath, img, "png") +} + +func writeFile(filePath string, img image.Image, format string) error { + if err := createDir(filePath); err != nil { + return err + } + file, err := os.Create(filePath) + defer file.Close() + if err != nil { + return err + } + switch strings.ToLower(format) { + case "png": + err = png.Encode(file, img) + break + case "jpg": + err = jpeg.Encode(file, img, nil) + default: + return errors.New("format not accept") + } + if err != nil { + return err + } + return nil +} + +func createDir(filePath string) error { + var err error + // filePath, _ = filepath.Abs(filePath) + dirPath := filepath.Dir(filePath) + dirInfo, err := os.Stat(dirPath) + if err != nil { + if !os.IsExist(err) { + err = os.MkdirAll(dirPath, 0777) + if err != nil { + return err + } + } else { + return err + } + } else { + if dirInfo.IsDir() { + return nil + } + return errors.New("directory is a file") + } + return nil +} diff --git a/app/utils/qrcode/writeWeb.go b/app/utils/qrcode/writeWeb.go new file mode 100644 index 0000000..57e1e92 --- /dev/null +++ b/app/utils/qrcode/writeWeb.go @@ -0,0 +1,39 @@ +package qrcode + +import ( + "bytes" + "image/jpeg" + "image/png" + "net/http" + + "github.com/boombuler/barcode" + "github.com/boombuler/barcode/qr" +) + +func WritePng(w http.ResponseWriter, content string, edges ...int) error { + edgeLen := 300 + if len(edges) > 0 && edges[0] > 100 && edges[0] < 2000 { + edgeLen = edges[0] + } + img, _ := qr.Encode(content, qr.L, qr.Unicode) + img, _ = barcode.Scale(img, edgeLen, edgeLen) + buff := bytes.NewBuffer(nil) + png.Encode(buff, img) + w.Header().Set("Content-Type", "image/png") + _, err := w.Write(buff.Bytes()) + return err +} + +func WriteJpg(w http.ResponseWriter, content string, edges ...int) error { + edgeLen := 300 + if len(edges) > 0 && edges[0] > 100 && edges[0] < 2000 { + edgeLen = edges[0] + } + img, _ := qr.Encode(content, qr.L, qr.Unicode) + img, _ = barcode.Scale(img, edgeLen, edgeLen) + buff := bytes.NewBuffer(nil) + jpeg.Encode(buff, img, nil) + w.Header().Set("Content-Type", "image/jpg") + _, err := w.Write(buff.Bytes()) + return err +} diff --git a/app/utils/rand.go b/app/utils/rand.go new file mode 100644 index 0000000..fd4bf25 --- /dev/null +++ b/app/utils/rand.go @@ -0,0 +1,77 @@ +package utils + +import ( + crand "crypto/rand" + "fmt" + "math" + "math/big" + "math/rand" + "time" +) + +func RandString(l int, c ...string) string { + var ( + chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + str string + num *big.Int + ) + if len(c) > 0 { + chars = c[0] + } + chrLen := int64(len(chars)) + for len(str) < l { + num, _ = crand.Int(crand.Reader, big.NewInt(chrLen)) + str += string(chars[num.Int64()]) + } + return str +} + +func RandNum() string { + seed := time.Now().UnixNano() + rand.Int63() + return fmt.Sprintf("%05v", rand.New(rand.NewSource(seed)).Int31n(1000000)) +} + +// x的y次方 +func RandPow(l int) string { + var i = "1" + for j := 0; j < l; j++ { + i += "0" + } + k := StrToInt64(i) + n := rand.New(rand.NewSource(time.Now().UnixNano())).Int63n(k) + ls := "%0" + IntToStr(l) + "v" + str := fmt.Sprintf(ls, n) + //min := int(math.Pow10(l - 1)) + //max := int(math.Pow10(l) - 1) + return str +} +func RandInt(min, max int) int { + if min >= max || min == 0 || max == 0 { + if max == 0 { + max = min + } + return max + } + return rand.Intn(max-min) + min +} +func RandInt1(min, max int) int { + rand.Seed(time.Now().UnixNano()) + return rand.Intn(max-min+1) + min +} + +func CalculateDistance(lat1, lng1, lat2, lng2 float64) float64 { + radius := 6371.0 // 地球半径(单位:公里) + dLat := DegToRad(lat2 - lat1) + dLng := DegToRad(lng2 - lng1) + a := math.Sin(dLat/2)*math.Sin(dLat/2) + math.Cos(DegToRad(lat1))*math.Cos(DegToRad(lat2))*math.Sin(dLng/2)*math.Sin(dLng/2) + c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a)) + distance := radius * c + + return distance +} + +// 将角度转换为弧度 +func DegToRad(deg float64) float64 { + return deg * (math.Pi / 180) + +} diff --git a/app/utils/redis.go b/app/utils/redis.go new file mode 100644 index 0000000..6080e6e --- /dev/null +++ b/app/utils/redis.go @@ -0,0 +1,32 @@ +package utils + +import ( + "applet/app/utils/cache" + "fmt" + "github.com/gin-gonic/gin" +) + +func ClearRedis(c *gin.Context) { + var str = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} + key := fmt.Sprintf("%s:cfg_cache", c.GetString("mid")) + cache.Del(key) + key2 := fmt.Sprintf("%s:virtual_coin_cfg", c.GetString("mid")) + cache.Del(key2) + for _, v := range str { + key1 := fmt.Sprintf("%s:cfg_cache:%s", c.GetString("mid"), v) + cache.Del(key1) + } + +} +func ClearRedisDb(dbname string) { + var str = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} + key := fmt.Sprintf("%s:cfg_cache", dbname) + cache.Del(key) + key2 := fmt.Sprintf("%s:virtual_coin_cfg", dbname) + cache.Del(key2) + for _, v := range str { + key1 := fmt.Sprintf("%s:cfg_cache:%s", dbname, v) + cache.Del(key1) + } + +} diff --git a/app/utils/rpc_client.go b/app/utils/rpc_client.go new file mode 100644 index 0000000..4fc392a --- /dev/null +++ b/app/utils/rpc_client.go @@ -0,0 +1,60 @@ +package utils + +import ( + "applet/pkg/pb" + "context" + "fmt" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" + "strconv" + "time" +) + +func GetBusinessIntClient(url, port string) pb.BusinessIntClient { + target := fmt.Sprintf("%s:%s", url, port) + conn, err := grpc.Dial(target, grpc.WithInsecure()) + if err != nil { + fmt.Println(err) + return nil + } + return pb.NewBusinessIntClient(conn) +} + +func GetBusinessExtClient(url, port string) pb.BusinessExtClient { + target := fmt.Sprintf("%s:%s", url, port) + conn, err := grpc.Dial(target, grpc.WithInsecure()) + //defer conn.Close() + if err != nil { + fmt.Println(err) + return nil + } + return pb.NewBusinessExtClient(conn) +} + +func GetLogicExtClient(url, port string) pb.LogicExtClient { + target := fmt.Sprintf("%s:%s", url, port) + conn, err := grpc.Dial(target, grpc.WithInsecure()) + if err != nil { + fmt.Println(err) + return nil + } + return pb.NewLogicExtClient(conn) +} + +func GetCtx(token, userId, deviceId, masterId string) context.Context { + if userId == "" { + userId = "1" + } + if deviceId == "" { + deviceId = "1" + } + if token == "" { + token = "0" + } + return metadata.NewOutgoingContext(context.TODO(), metadata.Pairs( + "user_id", userId, + "device_id", deviceId, + "token", token, + "master_id", masterId, + "request_id", strconv.FormatInt(time.Now().UnixNano(), 10))) +} diff --git a/app/utils/rsa.go b/app/utils/rsa.go new file mode 100644 index 0000000..02f0386 --- /dev/null +++ b/app/utils/rsa.go @@ -0,0 +1,231 @@ +package utils + +import ( + "bytes" + "crypto" + "crypto/rand" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/base64" + "encoding/pem" + "errors" + "fmt" + "io/ioutil" + "log" + "os" + "strings" +) + +// 生成私钥文件 TODO 未指定路径 +func RsaKeyGen(bits int) error { + privateKey, err := rsa.GenerateKey(rand.Reader, bits) + if err != nil { + return err + } + derStream := x509.MarshalPKCS1PrivateKey(privateKey) + block := &pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: derStream, + } + priFile, err := os.Create("private.pem") + if err != nil { + return err + } + err = pem.Encode(priFile, block) + priFile.Close() + if err != nil { + return err + } + // 生成公钥文件 + publicKey := &privateKey.PublicKey + derPkix, err := x509.MarshalPKIXPublicKey(publicKey) + if err != nil { + return err + } + block = &pem.Block{ + Type: "PUBLIC KEY", + Bytes: derPkix, + } + pubFile, err := os.Create("public.pem") + if err != nil { + return err + } + err = pem.Encode(pubFile, block) + pubFile.Close() + if err != nil { + return err + } + return nil +} + +// 生成私钥文件, 返回 privateKey , publicKey, error +func RsaKeyGenText(bits int) (string, string, error) { // bits 字节位 1024/2048 + privateKey, err := rsa.GenerateKey(rand.Reader, bits) + if err != nil { + return "", "", err + } + derStream := x509.MarshalPKCS1PrivateKey(privateKey) + block := &pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: derStream, + } + priBuff := bytes.NewBuffer(nil) + err = pem.Encode(priBuff, block) + if err != nil { + return "", "", err + } + // 生成公钥文件 + publicKey := &privateKey.PublicKey + derPkix, err := x509.MarshalPKIXPublicKey(publicKey) + if err != nil { + return "", "", err + } + block = &pem.Block{ + Type: "PUBLIC KEY", + Bytes: derPkix, + } + pubBuff := bytes.NewBuffer(nil) + err = pem.Encode(pubBuff, block) + if err != nil { + return "", "", err + } + return priBuff.String(), pubBuff.String(), nil +} + +// 加密 +func RsaEncrypt(rawData, publicKey []byte) ([]byte, error) { + block, _ := pem.Decode(publicKey) + if block == nil { + return nil, errors.New("public key error") + } + pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return nil, err + } + pub := pubInterface.(*rsa.PublicKey) + return rsa.EncryptPKCS1v15(rand.Reader, pub, rawData) +} + +// 公钥加密 +func RsaEncrypts(data, keyBytes []byte) []byte { + //解密pem格式的公钥 + block, _ := pem.Decode(keyBytes) + if block == nil { + panic(errors.New("public key error")) + } + // 解析公钥 + pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + panic(err) + } + // 类型断言 + pub := pubInterface.(*rsa.PublicKey) + //加密 + ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, pub, data) + if err != nil { + panic(err) + } + return ciphertext +} + +// 解密 +func RsaDecrypt(cipherText, privateKey []byte) ([]byte, error) { + block, _ := pem.Decode(privateKey) + if block == nil { + return nil, errors.New("private key error") + } + priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return nil, err + } + return rsa.DecryptPKCS1v15(rand.Reader, priv, cipherText) +} +func SyRsaEncrypt(signStr, signature, privateKeyBytes string) error { + h := sha256.New() + h.Write([]byte(signStr)) + d := h.Sum(nil) + sign, _ := base64.StdEncoding.DecodeString(signature) + pub, err := ParsePKIXPublicKey(privateKeyBytes) + err = rsa.VerifyPKCS1v15(pub, crypto.SHA256, d, sign) + if err != nil { + return err + } + + return nil +} +func FormatPublicKey(publicKey string) (pKey string) { + var buffer strings.Builder + buffer.WriteString("-----BEGIN PUBLIC KEY-----\n") + rawLen := 64 + keyLen := len(publicKey) + raws := keyLen / rawLen + temp := keyLen % rawLen + if temp > 0 { + raws++ + } + start := 0 + end := start + rawLen + for i := 0; i < raws; i++ { + if i == raws-1 { + buffer.WriteString(publicKey[start:]) + } else { + buffer.WriteString(publicKey[start:end]) + } + buffer.WriteByte('\n') + start += rawLen + end = start + rawLen + } + buffer.WriteString("-----END PUBLIC KEY-----\n") + pKey = buffer.String() + return +} + +func ParsePKIXPublicKey(privateKey string) (*rsa.PublicKey, error) { + + privateKey = FormatPublicKey(privateKey) + // 2、解码私钥字节,生成加密对象 + block, _ := pem.Decode([]byte(privateKey)) + if block == nil { + + return nil, errors.New("私钥信息错误!") + } + // 3、解析DER编码的私钥,生成私钥对象 + priKey, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + + return nil, err + } + return priKey.(*rsa.PublicKey), nil +} + +// 从证书获取公钥 +func OpensslPemGetPublic(pathOrString string) (interface{}, error) { + var certPem []byte + var err error + if IsFile(pathOrString) && Exists(pathOrString) { + certPem, err = ioutil.ReadFile(pathOrString) + if err != nil { + return nil, err + } + if string(certPem) == "" { + return nil, errors.New("empty pem file") + } + } else { + if pathOrString == "" { + return nil, errors.New("empty pem string") + } + certPem = StringToSlice(pathOrString) + } + block, rest := pem.Decode(certPem) + if block == nil || block.Type != "PUBLIC KEY" { + //log.Fatal("failed to decode PEM block containing public key") + return nil, errors.New("failed to decode PEM block containing public key") + } + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + log.Fatal(err) + } + fmt.Printf("Got a %T, with remaining data: %q", pub, rest) + return pub, nil +} diff --git a/app/utils/serialize.go b/app/utils/serialize.go new file mode 100644 index 0000000..1ac4d80 --- /dev/null +++ b/app/utils/serialize.go @@ -0,0 +1,23 @@ +package utils + +import ( + "encoding/json" +) + +func Serialize(data interface{}) []byte { + res, err := json.Marshal(data) + if err != nil { + return []byte{} + } + return res +} + +func Unserialize(b []byte, dst interface{}) { + if err := json.Unmarshal(b, dst); err != nil { + dst = nil + } +} + +func SerializeStr(data interface{}, arg ...interface{}) string { + return string(Serialize(data)) +} diff --git a/app/utils/shuffle.go b/app/utils/shuffle.go new file mode 100644 index 0000000..2c845a8 --- /dev/null +++ b/app/utils/shuffle.go @@ -0,0 +1,48 @@ +package utils + +import ( + "math/rand" + "time" +) + +// 打乱随机字符串 +func ShuffleString(s *string) { + if len(*s) > 1 { + b := []byte(*s) + rand.Seed(time.Now().UnixNano()) + rand.Shuffle(len(b), func(x, y int) { + b[x], b[y] = b[y], b[x] + }) + *s = string(b) + } +} + +// 打乱随机slice +func ShuffleSliceBytes(b []byte) { + if len(b) > 1 { + rand.Seed(time.Now().UnixNano()) + rand.Shuffle(len(b), func(x, y int) { + b[x], b[y] = b[y], b[x] + }) + } +} + +// 打乱slice int +func ShuffleSliceInt(i []int) { + if len(i) > 1 { + rand.Seed(time.Now().UnixNano()) + rand.Shuffle(len(i), func(x, y int) { + i[x], i[y] = i[y], i[x] + }) + } +} + +// 打乱slice interface +func ShuffleSliceInterface(i []interface{}) { + if len(i) > 1 { + rand.Seed(time.Now().UnixNano()) + rand.Shuffle(len(i), func(x, y int) { + i[x], i[y] = i[y], i[x] + }) + } +} diff --git a/app/utils/sign_check.go b/app/utils/sign_check.go new file mode 100644 index 0000000..5c80ab1 --- /dev/null +++ b/app/utils/sign_check.go @@ -0,0 +1,216 @@ +package utils + +import ( + "applet/app/cfg" + "applet/app/utils/logx" + "fmt" + "github.com/forgoer/openssl" + "github.com/gin-gonic/gin" + "github.com/syyongx/php2go" + "strings" + "time" +) + +var publicKey = []byte(`-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCFQD7RL2tDNuwdg0jTfV0zjAzh +WoCWfGrcNiucy2XUHZZU2oGhHv1N10qu3XayTDD4pu4sJ73biKwqR6ZN7IS4Sfon +vrzaXGvrTG4kmdo3XrbrkzmyBHDLTsJvv6pyS2HPl9QPSvKDN0iJ66+KN8QjBpw1 +FNIGe7xbDaJPY733/QIDAQAB +-----END PUBLIC KEY-----`) + +var privateKey = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCFQD7RL2tDNuwdg0jTfV0zjAzhWoCWfGrcNiucy2XUHZZU2oGh +Hv1N10qu3XayTDD4pu4sJ73biKwqR6ZN7IS4SfonvrzaXGvrTG4kmdo3Xrbrkzmy +BHDLTsJvv6pyS2HPl9QPSvKDN0iJ66+KN8QjBpw1FNIGe7xbDaJPY733/QIDAQAB +AoGADi14wY8XDY7Bbp5yWDZFfV+QW0Xi2qAgSo/k8gjeK8R+I0cgdcEzWF3oz1Q2 +9d+PclVokAAmfj47e0AmXLImqMCSEzi1jDBUFIRoJk9WE1YstE94mrCgV0FW+N/u ++L6OgZcjmF+9dHKprnpaUGQuUV5fF8j0qp8S2Jfs3Sw+dOECQQCQnHALzFjmXXIR +Ez3VSK4ZoYgDIrrpzNst5Hh6AMDNZcG3CrCxlQrgqjgTzBSr3ZSavvkfYRj42STk +TqyX1tQFAkEA6+O6UENoUTk2lG7iO/ta7cdIULnkTGwQqvkgLIUjk6w8E3sBTIfw +rerTEmquw5F42HHE+FMrRat06ZN57lENmQJAYgUHlZevcoZIePZ35Qfcqpbo4Gc8 +Fpm6vwKr/tZf2Vlt0qo2VkhWFS6L0C92m4AX6EQmDHT+Pj7BWNdS+aCuGQJBAOkq +NKPZvWdr8jNOV3mKvxqB/U0uMigIOYGGtvLKt5vkh42J7ILFbHW8w95UbWMKjDUG +X/hF3WQEUo//Imsa2yECQHSZIpJxiTRueoDiyRt0LH+jdbYFUu/6D0UIYXhFvP/p +EZX+hfCfUnNYX59UVpRjSZ66g0CbCjuBPOhmOD+hDeQ= +-----END RSA PRIVATE KEY-----`) + +func GetApiVersion(c *gin.Context) int { + var apiVersion = c.GetHeader("apiVersion") + if StrToInt(apiVersion) == 0 { //没有版本号先不校验 + apiVersion = c.GetHeader("Apiversion") + } + if StrToInt(apiVersion) == 0 { //没有版本号先不校验 + apiVersion = c.GetHeader("api_version") + } + if StrToInt(apiVersion) == 0 { //没有版本号先不校验 + apiVersion = c.GetString("apiVersion") + } + if StrToInt(apiVersion) == 0 { + platform := c.GetHeader("platform") + if InArr(platform, []string{"ios", "android"}) == false && c.GetString("h5_applet_must_sign") == "1" { + apiVersion = "1" + } + if InArr(platform, []string{"android"}) && c.GetString("android_must_sign") == "1" { + apiVersion = "1" + } + if InArr(platform, []string{"ios"}) && c.GetString("ios_must_sign") == "1" { + apiVersion = "1" + } + } + if c.GetString("api_version") == "1" && cfg.Prd { + apiVersion = "1" + } + if (strings.Contains(c.Request.Host, "zhios-app") || strings.Contains(c.Request.Host, "api.zhios.cn")) && apiVersion == "1" { + apiVersion = "0" + c.Set("api_version", "0") + } + + //if InArr(c.GetHeader("platform"), []string{"ios", "android"}) { + // apiVersion = "0" + //} + var uri = c.Request.RequestURI + if InArr(c.GetHeader("platform"), []string{"ios", "android", "pc"}) { //不用签名的接口 + var filterList = []string{ + "/api/v1/appcheck", + "/api/v1/app/guide", + "/api/v1/new/config.json", + "pub.flutter.web_download_page", + } + for _, v := range filterList { + if strings.Contains(uri, v) { + apiVersion = "0" + } + } + } + return StrToInt(apiVersion) +} +func CheckUri(c *gin.Context) int { + apiVersion := "1" + //var uri = c.Request.RequestURI + if InArr(c.GetHeader("platform"), []string{"ios", "android"}) { //不用签名的接口 + //var filterList = []string{ + // "/api/v1/appcheck", + // "/api/v1/app/guide", + // "/api/v1/new/config.json", + // "api/v1/rec", + // "api/v1/custom/mod/", + // "api/v1/mod/", + // "api/v1/s/", + //} + //for _, v := range filterList { + // if strings.Contains(uri, v) { + // apiVersion = "0" + // } + //} + apiVersion = "0" + } + return StrToInt(apiVersion) +} + +// 签名校验 +func SignCheck(c *gin.Context) bool { + var apiVersion = GetApiVersion(c) + if apiVersion == 0 { //没有版本号先不校验 + return true + } + //1.通过rsa 解析出 aes + var key = c.GetHeader("key") + + //拼接对应参数 + var uri = c.Request.RequestURI + var query = GetQueryParam(uri) + fmt.Println(query) + query["timestamp"] = c.GetHeader("timestamp") + query["nonce"] = c.GetHeader("nonce") + query["key"] = key + token := c.GetHeader("Authorization") + if token != "" { + // 按空格分割 + parts := strings.SplitN(token, " ", 2) + if len(parts) == 2 && parts[0] == "Bearer" { + token = parts[1] + } + } + query["token"] = token + //2.query参数按照 ASCII 码从小到大排序 + str := JoinStringsInASCII(query, "&", false, false, "") + //3.拼上密钥 + secret := "" + if InArr(c.GetHeader("platform"), []string{"android", "ios"}) { + secret = c.GetString("app_api_secret_key") + } else if c.GetHeader("platform") == "wap" { + secret = c.GetString("h5_api_secret_key") + } else { + secret = c.GetString("applet_api_secret_key") + } + + str = fmt.Sprintf("%s&secret=%s", str, secret) + fmt.Println(str) + //4.md5加密 转小写 + sign := strings.ToLower(Md5(str)) + //5.判断跟前端传来的sign是否一致 + if sign != c.GetHeader("sign") { + return false + } + + if StrToInt64(query["timestamp"])/1000 < time.Now().Unix()-300 { + fmt.Println("============" + query["timestamp"]) + return false + } + //if query["nonce"] != "" { + // //TODO s + // getString, err := cache.GetString(query["nonce"]) + // if err != nil { + // fmt.Println("nonce", err) + // } + // if getString != "" { + // fmt.Println("nonce", "============"+getString) + // return false + // } else { + // cache.SetEx(query["nonce"], "1", 300) + // } + //} + return true +} + +func ResultAes(c *gin.Context, raw []byte) string { + var key = c.GetHeader("key") + base, _ := php2go.Base64Decode(key) + aes, err := RsaDecrypt([]byte(base), privateKey) + if err != nil { + logx.Info(err) + return "" + } + fmt.Println("============aes============") + fmt.Println(string(aes)) + fmt.Println(string(raw)) + str, _ := openssl.AesECBEncrypt(raw, aes, openssl.PKCS7_PADDING) + value := php2go.Base64Encode(string(str)) + fmt.Println(value) + + return value +} + +func ResultAesDecrypt(c *gin.Context, raw string) string { + var key = c.GetHeader("key") + if key == "" { + key = c.GetHeader("Key") + } + fmt.Println("验签", key) + base, _ := php2go.Base64Decode(key) + aes, err := RsaDecrypt([]byte(base), privateKey) + if err != nil { + logx.Info(err) + return "" + } + raw = strings.ReplaceAll(raw, "\"", "") + fmt.Println(raw) + value1, _ := php2go.Base64Decode(raw) + if value1 == "" { + return "" + } + str1, _ := openssl.AesECBDecrypt([]byte(value1), aes, openssl.PKCS7_PADDING) + fmt.Println("==========解码=========") + fmt.Println(string(str1)) + return string(str1) +} diff --git a/app/utils/slice.go b/app/utils/slice.go new file mode 100644 index 0000000..fd86081 --- /dev/null +++ b/app/utils/slice.go @@ -0,0 +1,13 @@ +package utils + +// ContainsString is 字符串是否包含在字符串切片里 +func ContainsString(array []string, val string) (index int) { + index = -1 + for i := 0; i < len(array); i++ { + if array[i] == val { + index = i + return + } + } + return +} diff --git a/app/utils/slice_and_string.go b/app/utils/slice_and_string.go new file mode 100644 index 0000000..3ae6946 --- /dev/null +++ b/app/utils/slice_and_string.go @@ -0,0 +1,47 @@ +package utils + +import ( + "fmt" + "reflect" + "strings" + "unsafe" +) + +// string与slice互转,零copy省内存 + +// zero copy to change slice to string +func Slice2String(b []byte) (s string) { + pBytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + pString := (*reflect.StringHeader)(unsafe.Pointer(&s)) + pString.Data = pBytes.Data + pString.Len = pBytes.Len + return +} + +// no copy to change string to slice +func StringToSlice(s string) (b []byte) { + pBytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) + pString := (*reflect.StringHeader)(unsafe.Pointer(&s)) + pBytes.Data = pString.Data + pBytes.Len = pString.Len + pBytes.Cap = pString.Len + return +} + +// 任意slice合并 +func SliceJoin(sep string, elems ...interface{}) string { + l := len(elems) + if l == 0 { + return "" + } + if l == 1 { + s := fmt.Sprint(elems[0]) + sLen := len(s) - 1 + if s[0] == '[' && s[sLen] == ']' { + return strings.Replace(s[1:sLen], " ", sep, -1) + } + return s + } + sep = strings.Replace(fmt.Sprint(elems), " ", sep, -1) + return sep[1 : len(sep)-1] +} diff --git a/app/utils/string.go b/app/utils/string.go new file mode 100644 index 0000000..adae62e --- /dev/null +++ b/app/utils/string.go @@ -0,0 +1,223 @@ +package utils + +import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/lib/comm_plan" + "fmt" + "github.com/syyongx/php2go" + "math/rand" + "reflect" + "regexp" + "sort" + "strings" + "unicode" +) + +func Implode(glue string, args ...interface{}) string { + data := make([]string, len(args)) + for i, s := range args { + data[i] = fmt.Sprint(s) + } + return strings.Join(data, glue) +} +func RremoveChinese(s string) string { + // 正则表达式匹配中文字符 + re := regexp.MustCompile("[\u4e00-\u9fa5]") + // 将所有中文字符替换为空字符串 + s = re.ReplaceAllString(s, "") + return s +} + +// 字符串是否在数组里 +func InArr(target string, strArray []string) bool { + for _, element := range strArray { + if target == element { + return true + } + } + return false +} +func ContainsDigitOrLetter(s string) bool { + reg, err := regexp.Compile("[0-9a-zA-Z]") + if err != nil { + // 处理正则表达式编译错误 + return false + } + return reg.MatchString(s) +} + +// 生成指定长度的字符串 +func RandStringBytes(n int) string { + const letterBytes = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + b := make([]byte, n) + for i := range b { + b[i] = letterBytes[rand.Intn(len(letterBytes))] + } + return string(b) +} + +// 把数组的值放到key里 +func ArrayColumn(array interface{}, key string) (result map[string]interface{}, err error) { + result = make(map[string]interface{}) + t := reflect.TypeOf(array) + v := reflect.ValueOf(array) + if t.Kind() != reflect.Slice { + return nil, nil + } + if v.Len() == 0 { + return nil, nil + } + for i := 0; i < v.Len(); i++ { + indexv := v.Index(i) + if indexv.Type().Kind() != reflect.Struct { + return nil, nil + } + mapKeyInterface := indexv.FieldByName(key) + if mapKeyInterface.Kind() == reflect.Invalid { + return nil, nil + } + mapKeyString, err := InterfaceToString(mapKeyInterface.Interface()) + if err != nil { + return nil, err + } + result[mapKeyString] = indexv.Interface() + } + return result, err +} + +// 转string +func InterfaceToString(v interface{}) (result string, err error) { + switch reflect.TypeOf(v).Kind() { + case reflect.Int64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32: + result = fmt.Sprintf("%v", v) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + result = fmt.Sprintf("%v", v) + case reflect.String: + result = v.(string) + default: + err = nil + } + return result, err +} + +func HideTrueName(name string) string { + res := "**" + if name != "" { + runs := []rune(name) + leng := len(runs) + if leng <= 3 { + res = string(runs[0:1]) + res + } else if leng < 5 { + res = string(runs[0:2]) + res + } else if leng < 10 { + res = string(runs[0:2]) + "***" + string(runs[leng-2:leng]) + } else if leng < 16 { + res = string(runs[0:3]) + "****" + string(runs[leng-3:leng]) + } else { + res = string(runs[0:4]) + "*****" + string(runs[leng-4:leng]) + } + } + return res +} + +// 是否有中文 +func IsChineseChar(str string) bool { + for _, r := range str { + if unicode.Is(unicode.Scripts["Han"], r) || (regexp.MustCompile("[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]").MatchString(string(r))) { + return true + } + } + return false +} + +// 清空前面是0的 +func LeadZeros(str string) string { + bytes := []byte(str) + var index int + for i, b := range bytes { + if b != byte(48) { + index = i + break + } + } + i := bytes[index:len(bytes)] + return string(i) +} +func GetQueryParam(uri string) map[string]string { + //根据问号分割路由还是query参数 + uriList := strings.Split(uri, "?") + var query = make(map[string]string, 0) + //有参数才处理 + if len(uriList) == 2 { + //分割query参数 + var queryList = strings.Split(uriList[1], "&") + if len(queryList) > 0 { + //key value 分别赋值 + for _, v := range queryList { + var valueList = strings.Split(v, "=") + if len(valueList) == 2 { + value, _ := php2go.URLDecode(valueList[1]) + if value == "" { + value = valueList[1] + } + query[valueList[0]] = value + } + } + } + } + return query +} + +// JoinStringsInASCII 按照规则,参数名ASCII码从小到大排序后拼接 +// data 待拼接的数据 +// sep 连接符 +// onlyValues 是否只包含参数值,true则不包含参数名,否则参数名和参数值均有 +// includeEmpty 是否包含空值,true则包含空值,否则不包含,注意此参数不影响参数名的存在 +// exceptKeys 被排除的参数名,不参与排序及拼接 +func JoinStringsInASCII(data map[string]string, sep string, onlyValues, includeEmpty bool, exceptKeys ...string) string { + var list []string + var keyList []string + m := make(map[string]int) + if len(exceptKeys) > 0 { + for _, except := range exceptKeys { + m[except] = 1 + } + } + for k := range data { + if _, ok := m[k]; ok { + continue + } + value := data[k] + if !includeEmpty && value == "" { + continue + } + if onlyValues { + keyList = append(keyList, k) + } else { + list = append(list, fmt.Sprintf("%s=%s", k, value)) + } + } + if onlyValues { + sort.Strings(keyList) + for _, v := range keyList { + list = append(list, AnyToString(data[v])) + } + } else { + sort.Strings(list) + } + return strings.Join(list, sep) +} + +// 手机号中间4位替换为*号 +func FormatMobileStar(mobile string) string { + if len(mobile) <= 10 { + return mobile + } + return mobile[:3] + "****" + mobile[7:] +} +func ConvertList2Map(a []*comm_plan.VirtualCoinCommission) (b map[string]float64) { + b = make(map[string]float64) + for _, i := range a { + b[i.Cid] = i.Val + } + return b +} diff --git a/app/utils/struct2UrlParams.go b/app/utils/struct2UrlParams.go new file mode 100644 index 0000000..7f8ac05 --- /dev/null +++ b/app/utils/struct2UrlParams.go @@ -0,0 +1,43 @@ +package utils + +import "sort" + +func Struct2UrlParams(obj interface{}) string { + var str = "" + mapVal := Struct2Map(obj) + var keys []string + for key := range mapVal { + keys = append(keys, key) + } + sort.Strings(keys) + for _, key := range keys { + str += key + "=" + AnyToString(mapVal[key]) + "&" + } + /*t := reflect.TypeOf(origin) + v := reflect.ValueOf(origin) + + for i := 0; i < t.NumField(); i++ { + tag := strings.ToLower(t.Field(i).Tag.Get("json")) + if tag != "sign" { + switch v.Field(i).Kind(){ + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + str += tag + "=" + utils.Int64ToStr(v.Field(i).Int()) + "&" + break + case reflect.String: + str += tag + "=" + v.Field(i).String() + "&" + break + case reflect.Bool: + str += tag + "=" + utils.BoolToStr(v.Field(i).Bool()) + "&" + break + case reflect.Float32, reflect.Float64: + str += tag + "=" + utils.Float64ToStr(v.Field(i).Float()) + break + case reflect.Array, reflect.Struct, reflect.Slice: + str += ToUrlKeyValue(v.Field(i).Interface()) + default: + break + } + } + }*/ + return str +} diff --git a/app/utils/time.go b/app/utils/time.go new file mode 100644 index 0000000..9c0f6f8 --- /dev/null +++ b/app/utils/time.go @@ -0,0 +1,239 @@ +package utils + +import ( + "errors" + "fmt" + "strconv" + "strings" + "time" +) + +func StrToTime(s string) (int64, error) { + // delete all not int characters + if s == "" { + return time.Now().Unix(), nil + } + r := make([]rune, 14) + l := 0 + // 过滤除数字以外的字符 + for _, v := range s { + if '0' <= v && v <= '9' { + r[l] = v + l++ + if l == 14 { + break + } + } + } + for l < 14 { + r[l] = '0' // 补0 + l++ + } + t, err := time.Parse("20060102150405", string(r)) + if err != nil { + return 0, err + } + return t.Unix(), nil +} + +func TimeToStr(unixSecTime interface{}, layout ...string) string { + i := AnyToInt64(unixSecTime) + if i == 0 { + return "" + } + f := "2006-01-02 15:04:05" + if len(layout) > 0 { + f = layout[0] + } + return time.Unix(i, 0).Format(f) +} + +func FormatNanoUnix() string { + return strings.Replace(time.Now().Format("20060102150405.0000000"), ".", "", 1) +} + +func TimeParse(format, src string) (time.Time, error) { + return time.ParseInLocation(format, src, time.Local) +} + +func TimeParseStd(src string) time.Time { + t, _ := TimeParse("2006-01-02 15:04:05", src) + return t +} + +func TimeStdParseUnix(src string) int64 { + t, err := TimeParse("2006-01-02 15:04:05", src) + if err != nil { + return 0 + } + return t.Unix() +} + +// 获取一个当前时间 时间间隔 时间戳 +func GetTimeInterval(unit string, amount int) (startTime, endTime int64) { + t := time.Now() + nowTime := t.Unix() + tmpTime := int64(0) + switch unit { + case "years": + tmpTime = time.Date(t.Year()+amount, t.Month(), t.Day(), t.Hour(), 0, 0, 0, t.Location()).Unix() + case "months": + tmpTime = time.Date(t.Year(), t.Month()+time.Month(amount), t.Day(), t.Hour(), 0, 0, 0, t.Location()).Unix() + case "days": + tmpTime = time.Date(t.Year(), t.Month(), t.Day()+amount, t.Hour(), 0, 0, 0, t.Location()).Unix() + case "hours": + tmpTime = time.Date(t.Year(), t.Month(), t.Day(), t.Hour()+amount, 0, 0, 0, t.Location()).Unix() + } + if amount > 0 { + startTime = nowTime + endTime = tmpTime + } else { + startTime = tmpTime + endTime = nowTime + } + return +} + +// 几天前 +func TimeInterval(newTime int) string { + now := time.Now().Unix() + newTime64 := AnyToInt64(newTime) + if newTime64 >= now { + return "刚刚" + } + interval := now - newTime64 + switch { + case interval < 60: + return AnyToString(interval) + "秒前" + case interval < 60*60: + return AnyToString(interval/60) + "分前" + case interval < 60*60*24: + return AnyToString(interval/60/60) + "小时前" + case interval < 60*60*24*30: + return AnyToString(interval/60/60/24) + "天前" + case interval < 60*60*24*30*12: + return AnyToString(interval/60/60/24/30) + "月前" + default: + return AnyToString(interval/60/60/24/30/12) + "年前" + } +} + +// 时分秒字符串转时间戳,传入示例:8:40 or 8:40:10 +func HmsToUnix(str string) (int64, error) { + t := time.Now() + arr := strings.Split(str, ":") + if len(arr) < 2 { + return 0, errors.New("Time format error") + } + h, _ := strconv.Atoi(arr[0]) + m, _ := strconv.Atoi(arr[1]) + s := 0 + if len(arr) == 3 { + s, _ = strconv.Atoi(arr[3]) + } + formatted1 := fmt.Sprintf("%d%02d%02d%02d%02d%02d", t.Year(), t.Month(), t.Day(), h, m, s) + res, err := time.ParseInLocation("20060102150405", formatted1, time.Local) + if err != nil { + return 0, err + } else { + return res.Unix(), nil + } +} + +// 获取特定时间范围 +func GetTimeRange(s string) map[string]int64 { + t := time.Now() + var stime, etime time.Time + switch s { + case "today": + stime = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) + etime = time.Date(t.Year(), t.Month(), t.Day()+1, 0, 0, 0, 0, t.Location()) + case "yesterday": + stime = time.Date(t.Year(), t.Month(), t.Day()-1, 0, 0, 0, 0, t.Location()) + etime = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) + case "within_seven_days": + // 明天 0点 + etime = time.Date(t.Year(), t.Month(), t.Day()+1, 0, 0, 0, 0, t.Location()) + stime = time.Unix(etime.Unix()-7*86400, 0) + + case "within_fifteen_days": + // 明天 0点 + etime = time.Date(t.Year(), t.Month(), t.Day()+1, 0, 0, 0, 0, t.Location()) + // 前14天0点 + stime = time.Unix(etime.Unix()-15*86400, 0) + case "current_month": + stime = GetFirstDateOfMonth(t) + etime = time.Now() + case "last_month": + etime = GetFirstDateOfMonth(t) + monthTimes := TimeStdParseUnix(etime.Format("2006-01-02 15:04:05")) - 86400 + times, _ := UnixToTime(Int64ToStr(monthTimes)) + stime = GetFirstDateOfMonth(times) + } + + return map[string]int64{ + "start": stime.Unix(), + "end": etime.Unix(), + } +} + +/** +获取本周周一的日期 +*/ +func GetFirstDateOfWeek() (weekMonday string) { + now := time.Now() + + offset := int(time.Monday - now.Weekday()) + if offset > 0 { + offset = -6 + } + + weekStartDate := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, offset) + weekMonday = weekStartDate.Format("2006-01-02") + return +} + +/** +获取上周的周一日期 +*/ +func GetLastWeekFirstDate() (weekMonday string) { + thisWeekMonday := GetFirstDateOfWeek() + TimeMonday, _ := time.Parse("2006-01-02", thisWeekMonday) + lastWeekMonday := TimeMonday.AddDate(0, 0, -7) + weekMonday = lastWeekMonday.Format("2006-01-02") + return +} + +//时间戳转时间格式 +func UnixToTime(e string) (datatime time.Time, err error) { + data, err := strconv.ParseInt(e, 10, 64) + datatime = time.Unix(data, 0) + return +} + +//获取传入的时间所在月份的第一天,即某月第一天的0点。如传入time.Now(), 返回当前月份的第一天0点时间。 +func GetFirstDateOfMonth(d time.Time) time.Time { + d = d.AddDate(0, 0, -d.Day()+1) + return GetZeroTime(d) +} + +//获取传入的时间所在月份的最后一天,即某月最后一天的0点。如传入time.Now(), 返回当前月份的最后一天0点时间。 +func GetLastDateOfMonth(d time.Time) time.Time { + return GetFirstDateOfMonth(d).AddDate(0, 1, -1) +} + +//获取某一天的0点时间 +func GetZeroTime(d time.Time) time.Time { + return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, d.Location()) +} + +//获取当月某天的某个时间的时间 +func GetDayToTime(day, timeStr string) string { + if timeStr == "" { + timeStr = "00:00:00" + } + year := time.Now().Year() + month := time.Now().Format("01") + times := fmt.Sprintf("%s-%s-%s %s", IntToStr(year), month, day, timeStr) + return times +} diff --git a/app/utils/translate.go b/app/utils/translate.go new file mode 100644 index 0000000..dbcb00d --- /dev/null +++ b/app/utils/translate.go @@ -0,0 +1,110 @@ +package utils + +import ( + "applet/app/cfg" + "applet/app/utils/cache" + "encoding/json" + "github.com/gin-gonic/gin" + "github.com/go-creed/sat" + "strings" +) + +func ReadReverse(c *gin.Context, str string) string { + if c.GetString("translate_open") == "zh_Hant_" { //繁体先不改 + sat.InitDefaultDict(sat.SetPath(cfg.WxappletFilepath.URL + "/" + "sat.txt")) //使用自定义词库 + sat := sat.DefaultDict() + res := sat.ReadReverse(str) + list := strings.Split(res, "http") + imgList := []string{".png", ".jpg", ".jpeg", ".gif"} + for _, v := range list { + for _, v1 := range imgList { + if strings.Contains(v, v1) { //判断是不是有图片 有图片就截取 替换简繁体 + strs := strings.Split(v, v1) + if len(strs) > 0 { + oldStr := strs[0] + newStr := sat.Read(oldStr) + res = strings.ReplaceAll(res, oldStr, newStr) + } + } + } + } + return res + } + if c.GetString("translate_open") != "zh_Hant_" { //除了繁体,其他都走这里 + //简体---其他语言 + cTouString, err := cache.GetString("multi_language_c_to_" + c.GetString("translate_open")) + if err != nil { + return str + } + var cTou = make(map[string]string) + json.Unmarshal([]byte(cTouString), &cTou) + if len(cTou) == 0 { + return str + } + //其他语言--简体 + getString1, err1 := cache.GetString("multi_language_" + c.GetString("translate_open") + "_to_c") + if err1 != nil { + return str + } + var uToc = make(map[string]string) + json.Unmarshal([]byte(getString1), &uToc) + if len(uToc) == 0 { + return str + } + res := str + for k, v := range cTou { + res = strings.ReplaceAll(res, k, v) + } + list := strings.Split(res, "http") + imgList := []string{".png", ".jpg", ".jpeg", ".gif"} + for _, v := range list { + for _, v1 := range imgList { + if strings.Contains(v, v1) { //判断是不是有图片 有图片就截取 替换简繁体 + strs := strings.Split(v, v1) + if len(strs) > 0 { + oldStr := strs[0] + newStr := oldStr + for k2, v2 := range uToc { + newStr = strings.ReplaceAll(oldStr, k2, v2) + } + res = strings.ReplaceAll(res, oldStr, newStr) + } + } + } + } + return res + } + return str + +} + +func ReadReverse1(str, types string) string { + res := map[string]map[string]string{} + err := cache.GetJson("multi_language", &res) + if err != nil { + return str + } + for k, v := range res { + str = strings.ReplaceAll(str, k, v[types]) + } + resStr := str + list := strings.Split(resStr, "http") + imgList := []string{".png", ".jpg", ".jpeg", ".gif"} + for _, v := range list { + for _, v1 := range imgList { + if strings.Contains(v, v1) { //判断是不是有图片 有图片就截取 替换简繁体 + strs := strings.Split(v, v1) + if len(strs) > 0 { + oldStr := strs[0] + for k2, v2 := range res { + if v2[types] == oldStr { + resStr = strings.ReplaceAll(resStr, oldStr, k2) + } + } + //res = strings.ReplaceAll(res, oldStr, newStr) + } + } + } + } + return resStr +} diff --git a/app/utils/trim_html.go b/app/utils/trim_html.go new file mode 100644 index 0000000..f796f32 --- /dev/null +++ b/app/utils/trim_html.go @@ -0,0 +1,38 @@ +package utils + +import ( + "regexp" + "strings" +) + +func TrimHtml(src string) string { + re, _ := regexp.Compile("<[\\S\\s]+?>") + src = re.ReplaceAllStringFunc(src, strings.ToLower) + + re, _ = regexp.Compile("") + src = re.ReplaceAllString(src, "") + + re, _ = regexp.Compile("") + src = re.ReplaceAllString(src, "") + + re, _ = regexp.Compile("<[\\S\\s]+?>") + src = re.ReplaceAllString(src, "\n") + + re, _ = regexp.Compile("\\s{2,}") + src = re.ReplaceAllString(src, "\n") + + return strings.TrimSpace(src) +} + +func TrimScript(src string) string { + re, _ := regexp.Compile("<[\\S\\s]+?>") + src = re.ReplaceAllStringFunc(src, strings.ToLower) + re, _ = regexp.Compile("") + src = re.ReplaceAllString(src, "") + + re, _ = regexp.Compile("") + + src = re.ReplaceAllString(src, "") + + return src +} diff --git a/app/utils/uuid.go b/app/utils/uuid.go new file mode 100644 index 0000000..346b7b2 --- /dev/null +++ b/app/utils/uuid.go @@ -0,0 +1,61 @@ +package utils + +import ( + "fmt" + "math/rand" + "time" +) + +const ( + KC_RAND_KIND_NUM = 0 // 纯数字 + KC_RAND_KIND_LOWER = 1 // 小写字母 + KC_RAND_KIND_UPPER = 2 // 大写字母 + KC_RAND_KIND_ALL = 3 // 数字、大小写字母 +) + +func newUUID() *[16]byte { + u := &[16]byte{} + rand.Read(u[:16]) + u[8] = (u[8] | 0x80) & 0xBf + u[6] = (u[6] | 0x40) & 0x4f + return u +} + +func UUIDString() string { + u := newUUID() + return fmt.Sprintf("%x-%x-%x-%x-%x", u[:4], u[4:6], u[6:8], u[8:10], u[10:]) +} + +func UUIDHexString() string { + u := newUUID() + return fmt.Sprintf("%x%x%x%x%x", u[:4], u[4:6], u[6:8], u[8:10], u[10:]) +} +func UUIDBinString() string { + u := newUUID() + return fmt.Sprintf("%s", [16]byte(*u)) +} + +func Krand(size int, kind int) []byte { + ikind, kinds, result := kind, [][]int{[]int{10, 48}, []int{26, 97}, []int{26, 65}}, make([]byte, size) + isAll := kind > 2 || kind < 0 + rand.Seed(time.Now().UnixNano()) + for i := 0; i < size; i++ { + if isAll { // random ikind + ikind = rand.Intn(3) + } + scope, base := kinds[ikind][0], kinds[ikind][1] + result[i] = uint8(base + rand.Intn(scope)) + } + return result +} + +// OrderUUID is only num for uuid +func OrderUUID(uid int) string { + ustr := IntToStr(uid) + tstr := Int64ToStr(time.Now().Unix()) + ulen := len(ustr) + tlen := len(tstr) + rlen := 18 - ulen - tlen + krb := Krand(rlen, KC_RAND_KIND_NUM) + return ustr + tstr + string(krb) +} diff --git a/applet.sql b/applet.sql new file mode 100644 index 0000000..24b077e --- /dev/null +++ b/applet.sql @@ -0,0 +1,133 @@ +/* +SQLyog Ultimate +MySQL - 5.7.25-28 : Database - applet +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*Table structure for table `adm_profile` */ + +DROP TABLE IF EXISTS `adm_profile`; + +CREATE TABLE `adm_profile` ( + `adm_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `adm_name` varchar(64) NOT NULL COMMENT '姓名', + `adm_psw` char(32) NOT NULL COMMENT '密码', + `salt` char(6) NOT NULL DEFAULT '' COMMENT '加密盐', + `state` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0关闭,1正常', + `is_super` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否超管', + `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`adm_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员信息'; + +/*Data for the table `adm_profile` */ + +/*Table structure for table `log_api` */ + +DROP TABLE IF EXISTS `log_api`; + +CREATE TABLE `log_api` ( + `req_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '请求ID', + `req_ip` varchar(15) NOT NULL DEFAULT '' COMMENT '请求用户IP', + `req_header` varchar(2047) NOT NULL DEFAULT '', + `req_body` varchar(2047) NOT NULL DEFAULT '', + `resp_body` text, + `req_time` bigint(20) DEFAULT '0' COMMENT '请求时间,ms', + `resp_time` bigint(20) DEFAULT '0' COMMENT '响应时间,ms', + `duration` bigint(20) DEFAULT '0' COMMENT '处理时长,ms', + PRIMARY KEY (`req_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='api请求记录'; + +/*Data for the table `log_api` */ + +/*Table structure for table `sys_cfg` */ + +DROP TABLE IF EXISTS `sys_cfg`; + +CREATE TABLE `sys_cfg` ( + `key` varchar(255) NOT NULL COMMENT '键', + `value` text NOT NULL COMMENT '值', + `memo` varchar(127) NOT NULL DEFAULT '' COMMENT '备注', + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统设置'; + +/*Data for the table `sys_cfg` */ + +insert into `sys_cfg`(`key`,`value`,`memo`) values +('site_name','这只是个小程序','网站名称'), +('tb_access_key','123123',''); + +/*Table structure for table `sys_module` */ + +DROP TABLE IF EXISTS `sys_module`; + +CREATE TABLE `sys_module` ( + `mod_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `mod_pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父级模块ID', + `mod_name` varchar(255) NOT NULL DEFAULT '' COMMENT '模块名称', + `position` varchar(512) NOT NULL DEFAULT '' COMMENT '位置', + `title` varchar(128) NOT NULL DEFAULT '' COMMENT '标题', + `subtitle` varchar(255) NOT NULL DEFAULT '' COMMENT '副标题', + `icon` varchar(512) NOT NULL DEFAULT '' COMMENT '图标', + `img` varchar(512) NOT NULL DEFAULT '' COMMENT '图片', + `font-color` varchar(128) NOT NULL DEFAULT '' COMMENT '文字颜色', + `bg_img` varchar(512) NOT NULL DEFAULT '' COMMENT '背景图片', + `bg_color` varchar(512) NOT NULL DEFAULT '' COMMENT '背景颜色', + `badge` varchar(512) NOT NULL DEFAULT '' COMMENT 'badge图片', + `path` varchar(255) NOT NULL DEFAULT '' COMMENT '跳转路径', + `data` text COMMENT '内容', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `state` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '0不显示,1显示', + `is_global` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否全局显示', + `device` varchar(255) NOT NULL DEFAULT 'wx_applet' COMMENT '使用设备,wx_applet,toutiao_applet,baidu_,toutiao_applet,tiktok_,toutiao_applet,baidu_applet,wap,android,ios', + `create_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`mod_id`) +) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COMMENT='系统模块'; + +/*Data for the table `sys_module` */ + +insert into `sys_module`(`mod_id`,`mod_pid`,`mod_name`,`position`,`title`,`subtitle`,`icon`,`img`,`font-color`,`bg_img`,`bg_color`,`badge`,`path`,`data`,`sort`,`state`,`is_global`,`device`,`create_at`,`update_at`) values +(1,0,'index','','首页','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:18:44'), +(2,0,'nav','','底部导航','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:18:42'), +(3,0,'genre','','分类','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:16:34'), +(4,0,'person','','个人中心','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:17:44'), +(5,2,'nav_home','nav','首页','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:21:07'), +(6,2,'nav_channel','nav','分类','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:25:06'), +(7,2,'nav_person','nav','个人','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:28:36'), +(8,0,'index_title','index','嗨如意','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:29:04'), +(9,0,'index_search','index','','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:31:13'), +(10,0,'index_search_placeholder','search','','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:32:07'), +(11,0,'index_search_icon','search','','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:32:07'), +(12,0,'index_search_button','search','搜索','','','','','','','','',NULL,0,1,0,'wx_applet',0,'2020-08-15 16:32:16'); + +/*Table structure for table `user_profile` */ + +DROP TABLE IF EXISTS `user_profile`; + +CREATE TABLE `user_profile` ( + `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `username` varchar(32) NOT NULL COMMENT '用户名', + `password` char(32) NOT NULL COMMENT '密码', + `avatar` varchar(255) DEFAULT NULL COMMENT '头像', + `phone` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号码', + `level` tinyint(1) NOT NULL, + `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/*Data for the table `user_profile` */ + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..bafcb6e --- /dev/null +++ b/build.sh @@ -0,0 +1,18 @@ +echo "update -> repo" +git fetch +git reset --hard origin/master +echo "update repo -> Success" + +id="git rev-parse --short HEAD" +export ZYOS_APP_COMMIT_ID=`eval $id` +echo "GET the Commit ID for git -> $ZYOS_APP_COMMIT_ID" + +echo "Start build image " + +image_name=registry-vpc.cn-shenzhen.aliyuncs.com/fnuoos-prd/zyos_community_team:${ZYOS_APP_COMMIT_ID} +#final_image_name=registry.cn-shenzhen.aliyuncs.com/fnuoos-prd/zyos:${ZYOS_APP_COMMIT_ID} +docker build -t ${image_name} . + +docker push ${image_name} +echo "Push image -> $image_name Success" +export ZYOS_APP_LATEST_VERSION=${image_name} \ No newline at end of file diff --git a/cmd/task/main.go b/cmd/task/main.go new file mode 100644 index 0000000..c4b4113 --- /dev/null +++ b/cmd/task/main.go @@ -0,0 +1,44 @@ +package main + +import ( + "fmt" + "os" + "os/signal" + "syscall" + + "applet/app/cfg" + "applet/app/db" + "applet/app/task" + "applet/app/utils/logx" +) + +func init() { + cfg.InitTaskCfg() + cfg.InitLog() + cfg.InitCache() + cfg.InitCacheSecond() + cfg.InitEs() //ElasticSearch初始化 + cfg.InitMq() + baseDb := *cfg.DB + baseDb.Path = fmt.Sprintf(cfg.DB.Path, cfg.DB.Name) + if err := db.InitDB(&baseDb); err != nil { + panic(err) + } + if err := db.InitZhimengDB(cfg.ZhimengDB); err != nil { + panic(err) + } + //utils.CurlDebug = true + cfg.InitMemCache() +} + +func main() { + go func() { + task.Init() + task.Run() + }() + // graceful shutdown + quit := make(chan os.Signal) + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + <-quit + _ = logx.Info("Server exiting...") +} diff --git a/cmd_db.bat b/cmd_db.bat new file mode 100644 index 0000000..7a9e8d5 --- /dev/null +++ b/cmd_db.bat @@ -0,0 +1,25 @@ +@echo off + +set Table=* +set TName="" +set one=%1 + +if "%one%" NEQ "" ( + set Table=%one% + set TName="^%one%$" +) + +set BasePath="./" +set DBUSER="root" +set DBPSW="Fnuo123com@" +set DBNAME="fnuoos_test1" +set DBHOST="119.23.182.117" +set DBPORT="3306" + +del "app\db\model\%Table%.go" + +echo start reverse table %Table% + +xorm reverse mysql "%DBUSER%:%DBPSW%@tcp(%DBHOST%:%DBPORT%)/%DBNAME%?charset=utf8" %BasePath%/etc/db_tpl %BasePath%/app/db/model/ %TName% + +echo end \ No newline at end of file diff --git a/cmd_db.sh b/cmd_db.sh new file mode 100644 index 0000000..ab769e2 --- /dev/null +++ b/cmd_db.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# 使用方法, 直接执行该脚本更新所有表, cmd_db.sh 表名, 如 ./cmd_db.sh tableName + +Table=* +TName="" +if [ "$1" ] ;then + Table=$1 + TName="^$1$" +fi + +BasePath="./" +DBUSER="root" +DBPSW="Fnuo123com@" +DBNAME="fnuoos_test1" +DBHOST="119.23.182.117" +DBPORT="3306" + +rm -rf $BasePath/app/db/model/$Table.go && \ + +xorm reverse mysql "$DBUSER:$DBPSW@tcp($DBHOST:$DBPORT)/$DBNAME?charset=utf8" $BasePath/etc/db_tpl $BasePath/app/db/model/ $TName \ No newline at end of file diff --git a/cmd_run.bat b/cmd_run.bat new file mode 100644 index 0000000..51d7b81 --- /dev/null +++ b/cmd_run.bat @@ -0,0 +1,12 @@ +@echo off + +set BasePath=%~dp0 +set APP=applet.exe +set CfgPath=%BasePath%\etc\cfg.yml + +del %BasePath%\bin\%APP% + +go build -o %BasePath%\bin\%APP% %BasePath%\cmd\main.go && %BasePath%\bin\%APP% -c=%CfgPath% + + +pause diff --git a/cmd_run.sh b/cmd_run.sh new file mode 100644 index 0000000..6758f1b --- /dev/null +++ b/cmd_run.sh @@ -0,0 +1,8 @@ +#!/bin/bash +APP=applet +BasePath=$(dirname $(readlink -f $0)) +CfgPath=$BasePath/etc/cfg.yml +cd $BasePath +rm -rf $BasePath/bin/$APP +go build -o $BasePath/bin/$APP $BasePath/main.go \ +&& $BasePath/bin/$APP -c=$CfgPath \ No newline at end of file diff --git a/cmd_task.bat b/cmd_task.bat new file mode 100644 index 0000000..f70eabc --- /dev/null +++ b/cmd_task.bat @@ -0,0 +1,13 @@ +@echo off + +set Name=task +set BasePath=%~dp0 +set APP=%Name%.exe +set CfgPath=%BasePath%etc\%Name%.yml + +del %BasePath%\bin\%APP% + +go build -o %BasePath%\bin\%APP% %BasePath%\cmd\%Name%\main.go && %BasePath%\bin\%APP% -c=%CfgPath% + + +pause diff --git a/cmd_task.sh b/cmd_task.sh new file mode 100644 index 0000000..8f7da10 --- /dev/null +++ b/cmd_task.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +APP=task +BasePath=$(dirname $(readlink -f $0)) +CfgPath=$BasePath/etc/task.yml +cd $BasePath +rm -rf $BasePath/bin/$APP +go build -o $BasePath/bin/$APP $BasePath/cmd/$APP/main.go \ +&& $BasePath/bin/$APP -c=$CfgPath \ No newline at end of file diff --git a/docs/docs.go b/docs/docs.go new file mode 100644 index 0000000..3e7d945 --- /dev/null +++ b/docs/docs.go @@ -0,0 +1,1708 @@ +// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// This file was generated by swaggo/swag + +package docs + +import ( + "bytes" + "encoding/json" + "strings" + + "github.com/alecthomas/template" + "github.com/swaggo/swag" +) + +var doc = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{.Description}}", + "title": "{{.Title}}", + "termsOfService": "智莺生活后端组", + "contact": { + "name": "sherlockwhite" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/api/v1/acq/fix": { + "get": { + "description": "拉新活动--fix", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新活动--fix", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/acquisition/home": { + "post": { + "description": "本期榜单/上期榜单/我的邀请人数和奖励/任务列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新--首页数据", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/acquisition/qrcode": { + "get": { + "description": "二维码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新--邀请二维码", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/acquisition/reward/detail": { + "post": { + "description": "拉新活动--我的奖励明细", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新活动--我的奖励明细", + "parameters": [ + { + "description": "1为以发放,2为待发放,3为失效", + "name": "state", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/acquisition/reward_receive": { + "post": { + "description": "拉新活动--领取奖励", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新活动--领取奖励", + "parameters": [ + { + "description": "任务ID", + "name": "job_id", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/credit/card/config": { + "get": { + "description": "获取信用卡配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "信用卡" + ], + "summary": "获取信用卡配置", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/duomai/mall/detail": { + "post": { + "description": "多麦商城--商城详情", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城--商城详情", + "parameters": [ + { + "description": "商城id", + "name": "brand_id", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/duomai/mall/home": { + "get": { + "description": "多麦商城--首页数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城--首页数据", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/duomai/mall/search": { + "post": { + "description": "多麦商城--搜索", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城--搜索", + "parameters": [ + { + "description": "搜索关键词", + "name": "key", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/duomai/mall/update": { + "get": { + "description": "多麦商城--更新数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城--更新数据", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/logistic/query": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "物流" + ], + "summary": "快递100物流查询", + "parameters": [ + { + "description": "logisticQueryReq", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.logisticQueryReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"该快递公司不支持查询\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/mod/pub.flutter.duomai.mall.detail.page": { + "get": { + "description": "多麦商城详情页样式", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城详情页样式", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/mod/pub.flutter.duomai.mall.home.page": { + "get": { + "description": "多麦商城首页样式", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城首页样式", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/mod/pub.flutter.duomai.mall.search.page": { + "get": { + "description": "多麦商城搜索页样式", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城搜索页样式", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/privilege/card/activation": { + "post": { + "description": "权益卡激活", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡激活", + "parameters": [ + { + "description": "json", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.privilegeOpenCardCheckReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/privilege/open_card/check": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡卡号卡密检测", + "parameters": [ + { + "description": "json", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.privilegeOpenCardCheckReq" + } + } + ], + "responses": { + "200": { + "description": "0:不存在 1:已经被使用 2:可用", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/privilege/open_card/order_query": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡开卡订单查询页面", + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/hdl.PrivilegeOpenCardOrdQueryPageResp" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"验证码错误\"}", + "schema": { + "type": "string" + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡开卡订单查询", + "parameters": [ + { + "description": "json", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.PrivilegeOpenCardOrdQueryReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/model.PrivilegeOpenCardOrd" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"验证码错误\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/privilege/open_card/order_suc": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "订单支付成功页面", + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/model.PrivilegeOpenCardOrd" + } + } + } + } + }, + "/api/v1/privilege/open_card/pay_page": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡开卡支付页面", + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/hdl.privilegeOpenCardPayPageResp" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"权益卡配置缺失\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/shake_ticket/:goods_id/:type": { + "get": { + "description": "收藏/领券买/分享赚", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "抖券" + ], + "summary": "抖券商品收藏/领券买/分享赚", + "parameters": [ + { + "type": "string", + "description": "商品id", + "name": "goods_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "类型(0取消收藏,1收藏,2点击 领券买,3点击分享赚)", + "name": "type", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/shake_ticket_list": { + "get": { + "description": "定向计划/高佣专场/精选低价包邮/偏远地区包邮/抖货商品/各大榜单商品/今日值得买", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "抖券" + ], + "summary": "抖券商品推荐列表", + "parameters": [ + { + "type": "string", + "description": "页码", + "name": "page", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "页数", + "name": "page_size", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "分类id(3定向计划/4高佣专场/5精选低价包邮/6偏远地区包邮/7抖货商品/8各大榜单商品/9今日值得买)", + "name": "category_id", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "渠道", + "name": "pvd", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/md.IndexRecommendList" + } + } + } + } + }, + "/api/v1/sign/fast/in": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "登录、注册" + ], + "summary": "用户手机快速登录", + "parameters": [ + { + "description": "json", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/md.FastLoginRequestBody" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/md.LoginResponse" + } + }, + "400": { + "description": "{\"code\":400001,\"data\":[],\"msg\":\"请求参数错误\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/sub_region_list": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "获取区域id下的区域", + "parameters": [ + { + "type": "string", + "description": "上级地区类型:root(查询省级列表)、province(省级ID下的城市)、city(市级id下的区域)", + "name": "parent", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "上级地区id", + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/hdl.resultItem" + } + } + }, + "400": { + "description": "{\"code\":400001,\"data\":[],\"msg\":\"请求参数错误\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/user/address/:id": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "用户地址详情", + "parameters": [ + { + "type": "string", + "description": "地址id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/model.UserAddress" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"地址不存在\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/user/address/delete/:id": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "用户地址删除", + "parameters": [ + { + "type": "string", + "description": "ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"地址不存在\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/user/address/update": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "用户地址新增、编辑", + "parameters": [ + { + "description": "json参数,Id不传为新增", + "name": "\"\"", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.updateAddressReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"地址不存在\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/user/addresses": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "用户地址列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/model.UserAddress" + } + } + }, + "500": { + "description": "{\"code\":500000,\"data\":[],\"msg\":\"数据库操作失败\"}", + "schema": { + "type": "string" + } + } + } + } + } + }, + "definitions": { + "hdl.PrivilegeOpenCardOrdQueryPageResp": { + "type": "object", + "properties": { + "btn_bg_color_1": { + "type": "string" + }, + "btn_bg_color_2": { + "type": "string" + }, + "btn_text": { + "type": "string" + }, + "btn_text_color": { + "type": "string" + }, + "header_img": { + "type": "string" + }, + "logistic_company": { + "type": "array", + "items": { + "$ref": "#/definitions/model.LogisticCompany" + } + } + } + }, + "hdl.PrivilegeOpenCardOrdQueryReq": { + "type": "object", + "required": [ + "com", + "num" + ], + "properties": { + "com": { + "description": "快递公司名称", + "type": "string" + }, + "num": { + "description": "快递单号", + "type": "string" + } + } + }, + "hdl.logisticQueryReq": { + "type": "object", + "required": [ + "com", + "num" + ], + "properties": { + "com": { + "description": "快递公司名称", + "type": "string" + }, + "num": { + "description": "快递单号", + "type": "string" + } + } + }, + "hdl.privilegeOpenCardCheckReq": { + "type": "object", + "required": [ + "key", + "num" + ], + "properties": { + "key": { + "description": "卡密", + "type": "string" + }, + "num": { + "description": "卡号", + "type": "string" + } + } + }, + "hdl.privilegeOpenCardPayPageResp": { + "type": "object", + "properties": { + "amount": { + "description": "付费金额", + "type": "string" + }, + "card_type": { + "description": "卡的类型:\"1\"实体卡 \"2\"虚拟卡", + "type": "string" + }, + "date_type": { + "description": "日期类型:month:月 season:季 year:年 forever:永久", + "type": "string" + }, + "page_style": { + "description": "页面样式", + "$ref": "#/definitions/hdl.privilegeOpenCardPayStyle" + } + } + }, + "hdl.privilegeOpenCardPayStyle": { + "type": "object", + "properties": { + "exclusive_privilege": { + "description": "专属特权", + "type": "array", + "items": { + "type": "object", + "properties": { + "brand_id": { + "type": "string" + }, + "brand_img": { + "type": "string" + }, + "brand_img_url": { + "type": "string" + }, + "brand_name": { + "type": "string" + }, + "is_show": { + "type": "string" + }, + "sub_title": { + "type": "string" + } + } + } + }, + "payment_btn": { + "description": "底部支付按钮", + "type": "array", + "items": { + "type": "object", + "properties": { + "bg_img": { + "type": "string" + }, + "bg_img_url": { + "type": "string" + }, + "func": { + "type": "string" + }, + "name": { + "type": "string" + }, + "text": { + "type": "string" + }, + "text_color": { + "type": "string" + }, + "type": { + "type": "string" + } + } + } + }, + "payment_choose_icon": { + "description": "支付方式选中、未选中图标", + "type": "array", + "items": { + "type": "object", + "properties": { + "icon": { + "type": "string" + }, + "icon_url": { + "type": "string" + }, + "type": { + "type": "string" + } + } + } + }, + "payment_style": { + "description": "支付方式", + "type": "array", + "items": { + "type": "object", + "properties": { + "icon": { + "type": "string" + }, + "icon_url": { + "type": "string" + }, + "type": { + "type": "string" + } + } + } + }, + "style": { + "description": "头部样式", + "type": "object", + "properties": { + "header_bg_img": { + "type": "string" + }, + "header_bg_img_url": { + "type": "string" + }, + "special_deals_img": { + "type": "string" + }, + "special_deals_img_url": { + "type": "string" + }, + "special_deals_text": { + "type": "string" + } + } + } + } + }, + "hdl.resultItem": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "440100000000" + }, + "name": { + "type": "string", + "example": "city" + } + } + }, + "hdl.updateAddressReq": { + "type": "object", + "required": [ + "city_id", + "county_id", + "detail", + "phone", + "province_id", + "receiver" + ], + "properties": { + "city_id": { + "type": "string" + }, + "county_id": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "phone": { + "type": "string" + }, + "post_code": { + "type": "string" + }, + "province_id": { + "type": "string" + }, + "receiver": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "md.Apple": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + }, + "md.FastLoginRequestBody": { + "type": "object", + "properties": { + "apple": { + "$ref": "#/definitions/md.Apple" + }, + "captcha": { + "type": "string" + }, + "is_not_create": { + "type": "string" + }, + "mobile": { + "type": "string" + }, + "parent_uid": { + "type": "string" + }, + "qq": { + "$ref": "#/definitions/md.QQLogin" + }, + "return_user_msg": { + "type": "string" + }, + "taobao": { + "$ref": "#/definitions/md.TaobaoLogin" + }, + "wechat": { + "$ref": "#/definitions/md.WeChat" + }, + "wechat_mini": { + "$ref": "#/definitions/md.WeChatMiniApp" + }, + "zone": { + "type": "string" + } + } + }, + "md.IndexRecommendList": { + "type": "object", + "properties": { + "good": { + "type": "array", + "items": { + "$ref": "#/definitions/md.RecommendGood" + } + }, + "provider": { + "description": "BarTitleList []BarTitle ` + "`" + `json:\"bar_title_list\"` + "`" + `", + "type": "string" + } + } + }, + "md.LoginResponse": { + "type": "object", + "properties": { + "bind_phone_enable": { + "type": "string" + }, + "is_pid": { + "type": "string" + }, + "perms": { + "type": "array", + "items": { + "type": "string" + } + }, + "phone": { + "type": "string" + }, + "register_invite_code_enable": { + "type": "string" + }, + "register_popup_condition": { + "description": "弹出类型设置", + "$ref": "#/definitions/md.RegisterPopupCondition" + }, + "token": { + "type": "string" + }, + "user_id": { + "type": "string" + }, + "username": { + "type": "string" + }, + "wechat_applet_open_id": { + "type": "string" + }, + "wechat_union_id": { + "type": "string" + } + } + }, + "md.Marquee": { + "type": "object", + "properties": { + "avatar_url": { + "type": "string" + }, + "content": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "md.ProductDetailResponse": { + "type": "object", + "properties": { + "commission": { + "type": "string" + }, + "coupon_price": { + "type": "string" + }, + "good_id": { + "type": "string" + }, + "mod_list": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "provider": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "shop_avatar": { + "type": "string" + } + } + }, + "md.QQLogin": { + "type": "object", + "properties": { + "access_token": { + "type": "string" + }, + "avatar_url": { + "type": "string" + }, + "city": { + "type": "string" + }, + "expires_in": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "open_id": { + "type": "string" + }, + "pay_token": { + "type": "string" + }, + "pf": { + "type": "string" + }, + "pf_key": { + "type": "string" + }, + "province": { + "type": "string" + }, + "ret": { + "type": "string" + }, + "unionid": { + "type": "string" + } + } + }, + "md.RecommendGood": { + "type": "object", + "properties": { + "commission": { + "type": "string" + }, + "coupon": { + "type": "string" + }, + "current_price": { + "type": "string" + }, + "detail_data": { + "$ref": "#/definitions/md.ProductDetailResponse" + }, + "good_id": { + "type": "string" + }, + "good_image": { + "type": "string" + }, + "good_title": { + "type": "string" + }, + "inorder_count": { + "type": "string" + }, + "is_collect": { + "type": "integer" + }, + "is_coupons": { + "type": "integer" + }, + "is_share": { + "type": "integer" + }, + "market_price": { + "type": "string" + }, + "marquee_list": { + "type": "array", + "items": { + "$ref": "#/definitions/md.Marquee" + } + }, + "provider": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "pvd": { + "type": "string" + }, + "shop_avatar": { + "type": "string" + }, + "shop_name": { + "type": "string" + }, + "video": { + "type": "string" + } + } + }, + "md.RegisterPopupCondition": { + "type": "object", + "properties": { + "invite_code": { + "description": "邀请码设置:弹出类型是激活码的时候起作用", + "type": "object", + "properties": { + "popup": { + "description": "是否弹出 “0”否 “1”是", + "type": "string" + }, + "should_input": { + "description": "是否必填 “0”否 “1”是", + "type": "string" + } + } + }, + "popup_type": { + "description": "弹出类型:“0”关闭 ”1”激活码 “2”邀请码", + "type": "string" + }, + "should_input": { + "description": "是否必填 “0”否 “1”是", + "type": "string" + } + } + }, + "md.TaobaoLogin": { + "type": "object", + "properties": { + "access_token": { + "type": "string" + }, + "auth_code": { + "type": "string" + }, + "avatar_url": { + "type": "string" + }, + "nick_name": { + "type": "string" + }, + "open_id": { + "type": "string" + }, + "sid": { + "type": "string" + } + } + }, + "md.WeChat": { + "type": "object", + "properties": { + "access_token": { + "type": "string" + }, + "avatar_url": { + "type": "string" + }, + "city": { + "type": "string" + }, + "expires_in": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "open_id": { + "type": "string" + }, + "pay_token": { + "type": "string" + }, + "pf": { + "type": "string" + }, + "pf_key": { + "type": "string" + }, + "province": { + "type": "string" + }, + "ret": { + "type": "string" + }, + "unionid": { + "type": "string" + } + } + }, + "md.WeChatMiniApp": { + "type": "object", + "properties": { + "avatar": { + "type": "string" + }, + "code": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "open_id": { + "type": "string" + }, + "unionid": { + "type": "string" + } + } + }, + "model.LogisticCompany": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "model.PrivilegeOpenCardOrd": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "after_sale_id": { + "type": "integer" + }, + "card_key": { + "type": "string" + }, + "card_num": { + "type": "string" + }, + "card_type": { + "type": "integer" + }, + "cost_price": { + "type": "string" + }, + "create_time": { + "type": "string" + }, + "date_type": { + "type": "integer" + }, + "given_data": { + "type": "string" + }, + "logistic_company": { + "type": "string" + }, + "logistic_num": { + "type": "string" + }, + "ord_id": { + "type": "integer" + }, + "pay_channel": { + "type": "integer" + }, + "pay_time": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "receiver": { + "type": "string" + }, + "settle_at": { + "type": "integer" + }, + "state": { + "type": "integer" + }, + "uid": { + "type": "integer" + }, + "update_time": { + "type": "string" + } + } + }, + "model.UserAddress": { + "type": "object", + "properties": { + "city_id": { + "type": "string" + }, + "city_name": { + "type": "string" + }, + "county_id": { + "type": "string" + }, + "county_name": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "phone": { + "type": "string" + }, + "post_code": { + "type": "string" + }, + "province_id": { + "type": "string" + }, + "province_name": { + "type": "string" + }, + "receiver": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "uid": { + "type": "integer" + } + } + } + }, + "securityDefinitions": { + "MasterID": { + "type": "apiKey", + "name": "MasterID", + "in": "header" + } + } +}` + +type swaggerInfo struct { + Version string + Host string + BasePath string + Schemes []string + Title string + Description string +} + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = swaggerInfo{ + Version: "1.0", + Host: "localhost:5000", + BasePath: "/", + Schemes: []string{}, + Title: "智莺生活移动端接口", + Description: "移动端接口", +} + +type s struct{} + +func (s *s) ReadDoc() string { + sInfo := SwaggerInfo + sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1) + + t, err := template.New("swagger_info").Funcs(template.FuncMap{ + "marshal": func(v interface{}) string { + a, _ := json.Marshal(v) + return string(a) + }, + }).Parse(doc) + if err != nil { + return doc + } + + var tpl bytes.Buffer + if err := t.Execute(&tpl, sInfo); err != nil { + return doc + } + + return tpl.String() +} + +func init() { + swag.Register(swag.Name, &s{}) +} diff --git a/docs/swagger.json b/docs/swagger.json new file mode 100644 index 0000000..527c14e --- /dev/null +++ b/docs/swagger.json @@ -0,0 +1,1646 @@ +{ + "swagger": "2.0", + "info": { + "description": "移动端接口", + "title": "智莺生活移动端接口", + "termsOfService": "智莺生活后端组", + "contact": { + "name": "sherlockwhite" + }, + "version": "1.0" + }, + "host": "localhost:5000", + "basePath": "/", + "paths": { + "/api/v1/acq/fix": { + "get": { + "description": "拉新活动--fix", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新活动--fix", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/acquisition/home": { + "post": { + "description": "本期榜单/上期榜单/我的邀请人数和奖励/任务列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新--首页数据", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/acquisition/qrcode": { + "get": { + "description": "二维码", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新--邀请二维码", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/acquisition/reward/detail": { + "post": { + "description": "拉新活动--我的奖励明细", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新活动--我的奖励明细", + "parameters": [ + { + "description": "1为以发放,2为待发放,3为失效", + "name": "state", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/acquisition/reward_receive": { + "post": { + "description": "拉新活动--领取奖励", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "拉新活动" + ], + "summary": "拉新活动--领取奖励", + "parameters": [ + { + "description": "任务ID", + "name": "job_id", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/credit/card/config": { + "get": { + "description": "获取信用卡配置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "信用卡" + ], + "summary": "获取信用卡配置", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/duomai/mall/detail": { + "post": { + "description": "多麦商城--商城详情", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城--商城详情", + "parameters": [ + { + "description": "商城id", + "name": "brand_id", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/duomai/mall/home": { + "get": { + "description": "多麦商城--首页数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城--首页数据", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/duomai/mall/search": { + "post": { + "description": "多麦商城--搜索", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城--搜索", + "parameters": [ + { + "description": "搜索关键词", + "name": "key", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/duomai/mall/update": { + "get": { + "description": "多麦商城--更新数据", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城--更新数据", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/logistic/query": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "物流" + ], + "summary": "快递100物流查询", + "parameters": [ + { + "description": "logisticQueryReq", + "name": "req", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.logisticQueryReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"该快递公司不支持查询\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/mod/pub.flutter.duomai.mall.detail.page": { + "get": { + "description": "多麦商城详情页样式", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城详情页样式", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/mod/pub.flutter.duomai.mall.home.page": { + "get": { + "description": "多麦商城首页样式", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城首页样式", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/mod/pub.flutter.duomai.mall.search.page": { + "get": { + "description": "多麦商城搜索页样式", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "多麦商城" + ], + "summary": "多麦商城搜索页样式", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/privilege/card/activation": { + "post": { + "description": "权益卡激活", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡激活", + "parameters": [ + { + "description": "json", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.privilegeOpenCardCheckReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/privilege/open_card/check": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡卡号卡密检测", + "parameters": [ + { + "description": "json", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.privilegeOpenCardCheckReq" + } + } + ], + "responses": { + "200": { + "description": "0:不存在 1:已经被使用 2:可用", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/privilege/open_card/order_query": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡开卡订单查询页面", + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/hdl.PrivilegeOpenCardOrdQueryPageResp" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"验证码错误\"}", + "schema": { + "type": "string" + } + } + } + }, + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡开卡订单查询", + "parameters": [ + { + "description": "json", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.PrivilegeOpenCardOrdQueryReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/model.PrivilegeOpenCardOrd" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"验证码错误\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/privilege/open_card/order_suc": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "订单支付成功页面", + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/model.PrivilegeOpenCardOrd" + } + } + } + } + }, + "/api/v1/privilege/open_card/pay_page": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "权益卡" + ], + "summary": "权益卡开卡支付页面", + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/hdl.privilegeOpenCardPayPageResp" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"权益卡配置缺失\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/shake_ticket/:goods_id/:type": { + "get": { + "description": "收藏/领券买/分享赚", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "抖券" + ], + "summary": "抖券商品收藏/领券买/分享赚", + "parameters": [ + { + "type": "string", + "description": "商品id", + "name": "goods_id", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "类型(0取消收藏,1收藏,2点击 领券买,3点击分享赚)", + "name": "type", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/shake_ticket_list": { + "get": { + "description": "定向计划/高佣专场/精选低价包邮/偏远地区包邮/抖货商品/各大榜单商品/今日值得买", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "抖券" + ], + "summary": "抖券商品推荐列表", + "parameters": [ + { + "type": "string", + "description": "页码", + "name": "page", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "页数", + "name": "page_size", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "分类id(3定向计划/4高佣专场/5精选低价包邮/6偏远地区包邮/7抖货商品/8各大榜单商品/9今日值得买)", + "name": "category_id", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "渠道", + "name": "pvd", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/md.IndexRecommendList" + } + } + } + } + }, + "/api/v1/sign/fast/in": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "登录、注册" + ], + "summary": "用户手机快速登录", + "parameters": [ + { + "description": "json", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/md.FastLoginRequestBody" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/md.LoginResponse" + } + }, + "400": { + "description": "{\"code\":400001,\"data\":[],\"msg\":\"请求参数错误\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/sub_region_list": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "获取区域id下的区域", + "parameters": [ + { + "type": "string", + "description": "上级地区类型:root(查询省级列表)、province(省级ID下的城市)、city(市级id下的区域)", + "name": "parent", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "上级地区id", + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/hdl.resultItem" + } + } + }, + "400": { + "description": "{\"code\":400001,\"data\":[],\"msg\":\"请求参数错误\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/user/address/:id": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "用户地址详情", + "parameters": [ + { + "type": "string", + "description": "地址id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "$ref": "#/definitions/model.UserAddress" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"地址不存在\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/user/address/delete/:id": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "用户地址删除", + "parameters": [ + { + "type": "string", + "description": "ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"地址不存在\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/user/address/update": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "用户地址新增、编辑", + "parameters": [ + { + "description": "json参数,Id不传为新增", + "name": "\"\"", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/hdl.updateAddressReq" + } + } + ], + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "string" + } + }, + "400": { + "description": "{\"code\":400000,\"data\":[],\"msg\":\"地址不存在\"}", + "schema": { + "type": "string" + } + } + } + } + }, + "/api/v1/user/addresses": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "地址" + ], + "summary": "用户地址列表", + "responses": { + "200": { + "description": "ok", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/model.UserAddress" + } + } + }, + "500": { + "description": "{\"code\":500000,\"data\":[],\"msg\":\"数据库操作失败\"}", + "schema": { + "type": "string" + } + } + } + } + } + }, + "definitions": { + "hdl.PrivilegeOpenCardOrdQueryPageResp": { + "type": "object", + "properties": { + "btn_bg_color_1": { + "type": "string" + }, + "btn_bg_color_2": { + "type": "string" + }, + "btn_text": { + "type": "string" + }, + "btn_text_color": { + "type": "string" + }, + "header_img": { + "type": "string" + }, + "logistic_company": { + "type": "array", + "items": { + "$ref": "#/definitions/model.LogisticCompany" + } + } + } + }, + "hdl.PrivilegeOpenCardOrdQueryReq": { + "type": "object", + "required": [ + "com", + "num" + ], + "properties": { + "com": { + "description": "快递公司名称", + "type": "string" + }, + "num": { + "description": "快递单号", + "type": "string" + } + } + }, + "hdl.logisticQueryReq": { + "type": "object", + "required": [ + "com", + "num" + ], + "properties": { + "com": { + "description": "快递公司名称", + "type": "string" + }, + "num": { + "description": "快递单号", + "type": "string" + } + } + }, + "hdl.privilegeOpenCardCheckReq": { + "type": "object", + "required": [ + "key", + "num" + ], + "properties": { + "key": { + "description": "卡密", + "type": "string" + }, + "num": { + "description": "卡号", + "type": "string" + } + } + }, + "hdl.privilegeOpenCardPayPageResp": { + "type": "object", + "properties": { + "amount": { + "description": "付费金额", + "type": "string" + }, + "card_type": { + "description": "卡的类型:\"1\"实体卡 \"2\"虚拟卡", + "type": "string" + }, + "date_type": { + "description": "日期类型:month:月 season:季 year:年 forever:永久", + "type": "string" + }, + "page_style": { + "description": "页面样式", + "$ref": "#/definitions/hdl.privilegeOpenCardPayStyle" + } + } + }, + "hdl.privilegeOpenCardPayStyle": { + "type": "object", + "properties": { + "exclusive_privilege": { + "description": "专属特权", + "type": "array", + "items": { + "type": "object", + "properties": { + "brand_id": { + "type": "string" + }, + "brand_img": { + "type": "string" + }, + "brand_img_url": { + "type": "string" + }, + "brand_name": { + "type": "string" + }, + "is_show": { + "type": "string" + }, + "sub_title": { + "type": "string" + } + } + } + }, + "payment_btn": { + "description": "底部支付按钮", + "type": "array", + "items": { + "type": "object", + "properties": { + "bg_img": { + "type": "string" + }, + "bg_img_url": { + "type": "string" + }, + "func": { + "type": "string" + }, + "name": { + "type": "string" + }, + "text": { + "type": "string" + }, + "text_color": { + "type": "string" + }, + "type": { + "type": "string" + } + } + } + }, + "payment_choose_icon": { + "description": "支付方式选中、未选中图标", + "type": "array", + "items": { + "type": "object", + "properties": { + "icon": { + "type": "string" + }, + "icon_url": { + "type": "string" + }, + "type": { + "type": "string" + } + } + } + }, + "payment_style": { + "description": "支付方式", + "type": "array", + "items": { + "type": "object", + "properties": { + "icon": { + "type": "string" + }, + "icon_url": { + "type": "string" + }, + "type": { + "type": "string" + } + } + } + }, + "style": { + "description": "头部样式", + "type": "object", + "properties": { + "header_bg_img": { + "type": "string" + }, + "header_bg_img_url": { + "type": "string" + }, + "special_deals_img": { + "type": "string" + }, + "special_deals_img_url": { + "type": "string" + }, + "special_deals_text": { + "type": "string" + } + } + } + } + }, + "hdl.resultItem": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "440100000000" + }, + "name": { + "type": "string", + "example": "city" + } + } + }, + "hdl.updateAddressReq": { + "type": "object", + "required": [ + "city_id", + "county_id", + "detail", + "phone", + "province_id", + "receiver" + ], + "properties": { + "city_id": { + "type": "string" + }, + "county_id": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "phone": { + "type": "string" + }, + "post_code": { + "type": "string" + }, + "province_id": { + "type": "string" + }, + "receiver": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "md.Apple": { + "type": "object", + "properties": { + "token": { + "type": "string" + } + } + }, + "md.FastLoginRequestBody": { + "type": "object", + "properties": { + "apple": { + "$ref": "#/definitions/md.Apple" + }, + "captcha": { + "type": "string" + }, + "is_not_create": { + "type": "string" + }, + "mobile": { + "type": "string" + }, + "parent_uid": { + "type": "string" + }, + "qq": { + "$ref": "#/definitions/md.QQLogin" + }, + "return_user_msg": { + "type": "string" + }, + "taobao": { + "$ref": "#/definitions/md.TaobaoLogin" + }, + "wechat": { + "$ref": "#/definitions/md.WeChat" + }, + "wechat_mini": { + "$ref": "#/definitions/md.WeChatMiniApp" + }, + "zone": { + "type": "string" + } + } + }, + "md.IndexRecommendList": { + "type": "object", + "properties": { + "good": { + "type": "array", + "items": { + "$ref": "#/definitions/md.RecommendGood" + } + }, + "provider": { + "description": "BarTitleList []BarTitle `json:\"bar_title_list\"`", + "type": "string" + } + } + }, + "md.LoginResponse": { + "type": "object", + "properties": { + "bind_phone_enable": { + "type": "string" + }, + "is_pid": { + "type": "string" + }, + "perms": { + "type": "array", + "items": { + "type": "string" + } + }, + "phone": { + "type": "string" + }, + "register_invite_code_enable": { + "type": "string" + }, + "register_popup_condition": { + "description": "弹出类型设置", + "$ref": "#/definitions/md.RegisterPopupCondition" + }, + "token": { + "type": "string" + }, + "user_id": { + "type": "string" + }, + "username": { + "type": "string" + }, + "wechat_applet_open_id": { + "type": "string" + }, + "wechat_union_id": { + "type": "string" + } + } + }, + "md.Marquee": { + "type": "object", + "properties": { + "avatar_url": { + "type": "string" + }, + "content": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "md.ProductDetailResponse": { + "type": "object", + "properties": { + "commission": { + "type": "string" + }, + "coupon_price": { + "type": "string" + }, + "good_id": { + "type": "string" + }, + "mod_list": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + }, + "provider": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "shop_avatar": { + "type": "string" + } + } + }, + "md.QQLogin": { + "type": "object", + "properties": { + "access_token": { + "type": "string" + }, + "avatar_url": { + "type": "string" + }, + "city": { + "type": "string" + }, + "expires_in": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "open_id": { + "type": "string" + }, + "pay_token": { + "type": "string" + }, + "pf": { + "type": "string" + }, + "pf_key": { + "type": "string" + }, + "province": { + "type": "string" + }, + "ret": { + "type": "string" + }, + "unionid": { + "type": "string" + } + } + }, + "md.RecommendGood": { + "type": "object", + "properties": { + "commission": { + "type": "string" + }, + "coupon": { + "type": "string" + }, + "current_price": { + "type": "string" + }, + "detail_data": { + "$ref": "#/definitions/md.ProductDetailResponse" + }, + "good_id": { + "type": "string" + }, + "good_image": { + "type": "string" + }, + "good_title": { + "type": "string" + }, + "inorder_count": { + "type": "string" + }, + "is_collect": { + "type": "integer" + }, + "is_coupons": { + "type": "integer" + }, + "is_share": { + "type": "integer" + }, + "market_price": { + "type": "string" + }, + "marquee_list": { + "type": "array", + "items": { + "$ref": "#/definitions/md.Marquee" + } + }, + "provider": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "pvd": { + "type": "string" + }, + "shop_avatar": { + "type": "string" + }, + "shop_name": { + "type": "string" + }, + "video": { + "type": "string" + } + } + }, + "md.RegisterPopupCondition": { + "type": "object", + "properties": { + "invite_code": { + "description": "邀请码设置:弹出类型是激活码的时候起作用", + "type": "object", + "properties": { + "popup": { + "description": "是否弹出 “0”否 “1”是", + "type": "string" + }, + "should_input": { + "description": "是否必填 “0”否 “1”是", + "type": "string" + } + } + }, + "popup_type": { + "description": "弹出类型:“0”关闭 ”1”激活码 “2”邀请码", + "type": "string" + }, + "should_input": { + "description": "是否必填 “0”否 “1”是", + "type": "string" + } + } + }, + "md.TaobaoLogin": { + "type": "object", + "properties": { + "access_token": { + "type": "string" + }, + "auth_code": { + "type": "string" + }, + "avatar_url": { + "type": "string" + }, + "nick_name": { + "type": "string" + }, + "open_id": { + "type": "string" + }, + "sid": { + "type": "string" + } + } + }, + "md.WeChat": { + "type": "object", + "properties": { + "access_token": { + "type": "string" + }, + "avatar_url": { + "type": "string" + }, + "city": { + "type": "string" + }, + "expires_in": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "open_id": { + "type": "string" + }, + "pay_token": { + "type": "string" + }, + "pf": { + "type": "string" + }, + "pf_key": { + "type": "string" + }, + "province": { + "type": "string" + }, + "ret": { + "type": "string" + }, + "unionid": { + "type": "string" + } + } + }, + "md.WeChatMiniApp": { + "type": "object", + "properties": { + "avatar": { + "type": "string" + }, + "code": { + "type": "string" + }, + "nickname": { + "type": "string" + }, + "open_id": { + "type": "string" + }, + "unionid": { + "type": "string" + } + } + }, + "model.LogisticCompany": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "model.PrivilegeOpenCardOrd": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "after_sale_id": { + "type": "integer" + }, + "card_key": { + "type": "string" + }, + "card_num": { + "type": "string" + }, + "card_type": { + "type": "integer" + }, + "cost_price": { + "type": "string" + }, + "create_time": { + "type": "string" + }, + "date_type": { + "type": "integer" + }, + "given_data": { + "type": "string" + }, + "logistic_company": { + "type": "string" + }, + "logistic_num": { + "type": "string" + }, + "ord_id": { + "type": "integer" + }, + "pay_channel": { + "type": "integer" + }, + "pay_time": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "receiver": { + "type": "string" + }, + "settle_at": { + "type": "integer" + }, + "state": { + "type": "integer" + }, + "uid": { + "type": "integer" + }, + "update_time": { + "type": "string" + } + } + }, + "model.UserAddress": { + "type": "object", + "properties": { + "city_id": { + "type": "string" + }, + "city_name": { + "type": "string" + }, + "county_id": { + "type": "string" + }, + "county_name": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "phone": { + "type": "string" + }, + "post_code": { + "type": "string" + }, + "province_id": { + "type": "string" + }, + "province_name": { + "type": "string" + }, + "receiver": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "uid": { + "type": "integer" + } + } + } + }, + "securityDefinitions": { + "MasterID": { + "type": "apiKey", + "name": "MasterID", + "in": "header" + } + } +} \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100644 index 0000000..ca2a7a9 --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,1084 @@ +basePath: / +definitions: + hdl.PrivilegeOpenCardOrdQueryPageResp: + properties: + btn_bg_color_1: + type: string + btn_bg_color_2: + type: string + btn_text: + type: string + btn_text_color: + type: string + header_img: + type: string + logistic_company: + items: + $ref: '#/definitions/model.LogisticCompany' + type: array + type: object + hdl.PrivilegeOpenCardOrdQueryReq: + properties: + com: + description: 快递公司名称 + type: string + num: + description: 快递单号 + type: string + required: + - com + - num + type: object + hdl.logisticQueryReq: + properties: + com: + description: 快递公司名称 + type: string + num: + description: 快递单号 + type: string + required: + - com + - num + type: object + hdl.privilegeOpenCardCheckReq: + properties: + key: + description: 卡密 + type: string + num: + description: 卡号 + type: string + required: + - key + - num + type: object + hdl.privilegeOpenCardPayPageResp: + properties: + amount: + description: 付费金额 + type: string + card_type: + description: 卡的类型:"1"实体卡 "2"虚拟卡 + type: string + date_type: + description: 日期类型:month:月 season:季 year:年 forever:永久 + type: string + page_style: + $ref: '#/definitions/hdl.privilegeOpenCardPayStyle' + description: 页面样式 + type: object + hdl.privilegeOpenCardPayStyle: + properties: + exclusive_privilege: + description: 专属特权 + items: + properties: + brand_id: + type: string + brand_img: + type: string + brand_img_url: + type: string + brand_name: + type: string + is_show: + type: string + sub_title: + type: string + type: object + type: array + payment_btn: + description: 底部支付按钮 + items: + properties: + bg_img: + type: string + bg_img_url: + type: string + func: + type: string + name: + type: string + text: + type: string + text_color: + type: string + type: + type: string + type: object + type: array + payment_choose_icon: + description: 支付方式选中、未选中图标 + items: + properties: + icon: + type: string + icon_url: + type: string + type: + type: string + type: object + type: array + payment_style: + description: 支付方式 + items: + properties: + icon: + type: string + icon_url: + type: string + type: + type: string + type: object + type: array + style: + description: 头部样式 + properties: + header_bg_img: + type: string + header_bg_img_url: + type: string + special_deals_img: + type: string + special_deals_img_url: + type: string + special_deals_text: + type: string + type: object + type: object + hdl.resultItem: + properties: + id: + example: "440100000000" + type: string + name: + example: city + type: string + type: object + hdl.updateAddressReq: + properties: + city_id: + type: string + county_id: + type: string + detail: + type: string + id: + type: integer + phone: + type: string + post_code: + type: string + province_id: + type: string + receiver: + type: string + tag: + type: string + required: + - city_id + - county_id + - detail + - phone + - province_id + - receiver + type: object + md.Apple: + properties: + token: + type: string + type: object + md.FastLoginRequestBody: + properties: + apple: + $ref: '#/definitions/md.Apple' + captcha: + type: string + is_not_create: + type: string + mobile: + type: string + parent_uid: + type: string + qq: + $ref: '#/definitions/md.QQLogin' + return_user_msg: + type: string + taobao: + $ref: '#/definitions/md.TaobaoLogin' + wechat: + $ref: '#/definitions/md.WeChat' + wechat_mini: + $ref: '#/definitions/md.WeChatMiniApp' + zone: + type: string + type: object + md.IndexRecommendList: + properties: + good: + items: + $ref: '#/definitions/md.RecommendGood' + type: array + provider: + description: BarTitleList []BarTitle `json:"bar_title_list"` + type: string + type: object + md.LoginResponse: + properties: + bind_phone_enable: + type: string + is_pid: + type: string + perms: + items: + type: string + type: array + phone: + type: string + register_invite_code_enable: + type: string + register_popup_condition: + $ref: '#/definitions/md.RegisterPopupCondition' + description: 弹出类型设置 + token: + type: string + user_id: + type: string + username: + type: string + wechat_applet_open_id: + type: string + wechat_union_id: + type: string + type: object + md.Marquee: + properties: + avatar_url: + type: string + content: + type: string + name: + type: string + type: object + md.ProductDetailResponse: + properties: + commission: + type: string + coupon_price: + type: string + good_id: + type: string + mod_list: + items: + additionalProperties: true + type: object + type: array + provider: + type: string + provider_name: + type: string + shop_avatar: + type: string + type: object + md.QQLogin: + properties: + access_token: + type: string + avatar_url: + type: string + city: + type: string + expires_in: + type: string + gender: + type: string + nickname: + type: string + open_id: + type: string + pay_token: + type: string + pf: + type: string + pf_key: + type: string + province: + type: string + ret: + type: string + unionid: + type: string + type: object + md.RecommendGood: + properties: + commission: + type: string + coupon: + type: string + current_price: + type: string + detail_data: + $ref: '#/definitions/md.ProductDetailResponse' + good_id: + type: string + good_image: + type: string + good_title: + type: string + inorder_count: + type: string + is_collect: + type: integer + is_coupons: + type: integer + is_share: + type: integer + market_price: + type: string + marquee_list: + items: + $ref: '#/definitions/md.Marquee' + type: array + provider: + type: string + provider_name: + type: string + pvd: + type: string + shop_avatar: + type: string + shop_name: + type: string + video: + type: string + type: object + md.RegisterPopupCondition: + properties: + invite_code: + description: 邀请码设置:弹出类型是激活码的时候起作用 + properties: + popup: + description: 是否弹出 “0”否 “1”是 + type: string + should_input: + description: 是否必填 “0”否 “1”是 + type: string + type: object + popup_type: + description: 弹出类型:“0”关闭 ”1”激活码 “2”邀请码 + type: string + should_input: + description: 是否必填 “0”否 “1”是 + type: string + type: object + md.TaobaoLogin: + properties: + access_token: + type: string + auth_code: + type: string + avatar_url: + type: string + nick_name: + type: string + open_id: + type: string + sid: + type: string + type: object + md.WeChat: + properties: + access_token: + type: string + avatar_url: + type: string + city: + type: string + expires_in: + type: string + gender: + type: string + nickname: + type: string + open_id: + type: string + pay_token: + type: string + pf: + type: string + pf_key: + type: string + province: + type: string + ret: + type: string + unionid: + type: string + type: object + md.WeChatMiniApp: + properties: + avatar: + type: string + code: + type: string + nickname: + type: string + open_id: + type: string + unionid: + type: string + type: object + model.LogisticCompany: + properties: + code: + type: string + name: + type: string + type: object + model.PrivilegeOpenCardOrd: + properties: + address: + type: string + after_sale_id: + type: integer + card_key: + type: string + card_num: + type: string + card_type: + type: integer + cost_price: + type: string + create_time: + type: string + date_type: + type: integer + given_data: + type: string + logistic_company: + type: string + logistic_num: + type: string + ord_id: + type: integer + pay_channel: + type: integer + pay_time: + type: string + phone: + type: string + receiver: + type: string + settle_at: + type: integer + state: + type: integer + uid: + type: integer + update_time: + type: string + type: object + model.UserAddress: + properties: + city_id: + type: string + city_name: + type: string + county_id: + type: string + county_name: + type: string + detail: + type: string + id: + type: integer + phone: + type: string + post_code: + type: string + province_id: + type: string + province_name: + type: string + receiver: + type: string + tag: + type: string + uid: + type: integer + type: object +host: localhost:5000 +info: + contact: + name: sherlockwhite + description: 移动端接口 + termsOfService: 智莺生活后端组 + title: 智莺生活移动端接口 + version: "1.0" +paths: + /api/v1/acq/fix: + get: + consumes: + - application/json + description: 拉新活动--fix + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 拉新活动--fix + tags: + - 拉新活动 + /api/v1/acquisition/home: + post: + consumes: + - application/json + description: 本期榜单/上期榜单/我的邀请人数和奖励/任务列表 + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 拉新--首页数据 + tags: + - 拉新活动 + /api/v1/acquisition/qrcode: + get: + consumes: + - application/json + description: 二维码 + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 拉新--邀请二维码 + tags: + - 拉新活动 + /api/v1/acquisition/reward/detail: + post: + consumes: + - application/json + description: 拉新活动--我的奖励明细 + parameters: + - description: 1为以发放,2为待发放,3为失效 + in: body + name: state + required: true + schema: + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 拉新活动--我的奖励明细 + tags: + - 拉新活动 + /api/v1/acquisition/reward_receive: + post: + consumes: + - application/json + description: 拉新活动--领取奖励 + parameters: + - description: 任务ID + in: body + name: job_id + required: true + schema: + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 拉新活动--领取奖励 + tags: + - 拉新活动 + /api/v1/credit/card/config: + get: + consumes: + - application/json + description: 获取信用卡配置 + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 获取信用卡配置 + tags: + - 信用卡 + /api/v1/duomai/mall/detail: + post: + consumes: + - application/json + description: 多麦商城--商城详情 + parameters: + - description: 商城id + in: body + name: brand_id + required: true + schema: + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 多麦商城--商城详情 + tags: + - 多麦商城 + /api/v1/duomai/mall/home: + get: + consumes: + - application/json + description: 多麦商城--首页数据 + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 多麦商城--首页数据 + tags: + - 多麦商城 + /api/v1/duomai/mall/search: + post: + consumes: + - application/json + description: 多麦商城--搜索 + parameters: + - description: 搜索关键词 + in: body + name: key + required: true + schema: + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 多麦商城--搜索 + tags: + - 多麦商城 + /api/v1/duomai/mall/update: + get: + consumes: + - application/json + description: 多麦商城--更新数据 + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 多麦商城--更新数据 + tags: + - 多麦商城 + /api/v1/logistic/query: + post: + consumes: + - application/json + parameters: + - description: logisticQueryReq + in: body + name: req + required: true + schema: + $ref: '#/definitions/hdl.logisticQueryReq' + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + "400": + description: '{"code":400000,"data":[],"msg":"该快递公司不支持查询"}' + schema: + type: string + summary: 快递100物流查询 + tags: + - 物流 + /api/v1/mod/pub.flutter.duomai.mall.detail.page: + get: + consumes: + - application/json + description: 多麦商城详情页样式 + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 多麦商城详情页样式 + tags: + - 多麦商城 + /api/v1/mod/pub.flutter.duomai.mall.home.page: + get: + consumes: + - application/json + description: 多麦商城首页样式 + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 多麦商城首页样式 + tags: + - 多麦商城 + /api/v1/mod/pub.flutter.duomai.mall.search.page: + get: + consumes: + - application/json + description: 多麦商城搜索页样式 + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 多麦商城搜索页样式 + tags: + - 多麦商城 + /api/v1/privilege/card/activation: + post: + consumes: + - application/json + description: 权益卡激活 + parameters: + - description: json + in: body + name: body + required: true + schema: + $ref: '#/definitions/hdl.privilegeOpenCardCheckReq' + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 权益卡激活 + tags: + - 权益卡 + /api/v1/privilege/open_card/check: + get: + consumes: + - application/json + parameters: + - description: json + in: body + name: body + required: true + schema: + $ref: '#/definitions/hdl.privilegeOpenCardCheckReq' + produces: + - application/json + responses: + "200": + description: 0:不存在 1:已经被使用 2:可用 + schema: + type: string + summary: 权益卡卡号卡密检测 + tags: + - 权益卡 + /api/v1/privilege/open_card/order_query: + get: + produces: + - application/json + responses: + "200": + description: ok + schema: + $ref: '#/definitions/hdl.PrivilegeOpenCardOrdQueryPageResp' + "400": + description: '{"code":400000,"data":[],"msg":"验证码错误"}' + schema: + type: string + summary: 权益卡开卡订单查询页面 + tags: + - 权益卡 + post: + parameters: + - description: json + in: body + name: body + required: true + schema: + $ref: '#/definitions/hdl.PrivilegeOpenCardOrdQueryReq' + produces: + - application/json + responses: + "200": + description: ok + schema: + $ref: '#/definitions/model.PrivilegeOpenCardOrd' + "400": + description: '{"code":400000,"data":[],"msg":"验证码错误"}' + schema: + type: string + summary: 权益卡开卡订单查询 + tags: + - 权益卡 + /api/v1/privilege/open_card/order_suc: + get: + produces: + - application/json + responses: + "200": + description: ok + schema: + $ref: '#/definitions/model.PrivilegeOpenCardOrd' + summary: 订单支付成功页面 + tags: + - 权益卡 + /api/v1/privilege/open_card/pay_page: + get: + produces: + - application/json + responses: + "200": + description: ok + schema: + $ref: '#/definitions/hdl.privilegeOpenCardPayPageResp' + "400": + description: '{"code":400000,"data":[],"msg":"权益卡配置缺失"}' + schema: + type: string + summary: 权益卡开卡支付页面 + tags: + - 权益卡 + /api/v1/shake_ticket/:goods_id/:type: + get: + consumes: + - application/json + description: 收藏/领券买/分享赚 + parameters: + - description: 商品id + in: path + name: goods_id + required: true + type: string + - description: 类型(0取消收藏,1收藏,2点击 领券买,3点击分享赚) + in: path + name: type + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + summary: 抖券商品收藏/领券买/分享赚 + tags: + - 抖券 + /api/v1/shake_ticket_list: + get: + consumes: + - application/json + description: 定向计划/高佣专场/精选低价包邮/偏远地区包邮/抖货商品/各大榜单商品/今日值得买 + parameters: + - description: 页码 + in: query + name: page + required: true + type: string + - description: 页数 + in: query + name: page_size + required: true + type: string + - description: 分类id(3定向计划/4高佣专场/5精选低价包邮/6偏远地区包邮/7抖货商品/8各大榜单商品/9今日值得买) + in: query + name: category_id + required: true + type: string + - description: 渠道 + in: query + name: pvd + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/md.IndexRecommendList' + summary: 抖券商品推荐列表 + tags: + - 抖券 + /api/v1/sign/fast/in: + post: + parameters: + - description: json + in: body + name: body + required: true + schema: + $ref: '#/definitions/md.FastLoginRequestBody' + produces: + - application/json + responses: + "200": + description: ok + schema: + $ref: '#/definitions/md.LoginResponse' + "400": + description: '{"code":400001,"data":[],"msg":"请求参数错误"}' + schema: + type: string + summary: 用户手机快速登录 + tags: + - 登录、注册 + /api/v1/sub_region_list: + get: + parameters: + - description: 上级地区类型:root(查询省级列表)、province(省级ID下的城市)、city(市级id下的区域) + in: query + name: parent + required: true + type: string + - description: 上级地区id + in: query + name: id + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + items: + $ref: '#/definitions/hdl.resultItem' + type: array + "400": + description: '{"code":400001,"data":[],"msg":"请求参数错误"}' + schema: + type: string + summary: 获取区域id下的区域 + tags: + - 地址 + /api/v1/user/address/:id: + get: + parameters: + - description: 地址id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + $ref: '#/definitions/model.UserAddress' + "400": + description: '{"code":400000,"data":[],"msg":"地址不存在"}' + schema: + type: string + summary: 用户地址详情 + tags: + - 地址 + /api/v1/user/address/delete/:id: + post: + consumes: + - application/json + parameters: + - description: ID + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + "400": + description: '{"code":400000,"data":[],"msg":"地址不存在"}' + schema: + type: string + summary: 用户地址删除 + tags: + - 地址 + /api/v1/user/address/update: + post: + consumes: + - application/json + parameters: + - description: json参数,Id不传为新增 + in: body + name: '""' + required: true + schema: + $ref: '#/definitions/hdl.updateAddressReq' + produces: + - application/json + responses: + "200": + description: ok + schema: + type: string + "400": + description: '{"code":400000,"data":[],"msg":"地址不存在"}' + schema: + type: string + summary: 用户地址新增、编辑 + tags: + - 地址 + /api/v1/user/addresses: + get: + produces: + - application/json + responses: + "200": + description: ok + schema: + items: + $ref: '#/definitions/model.UserAddress' + type: array + "500": + description: '{"code":500000,"data":[],"msg":"数据库操作失败"}' + schema: + type: string + summary: 用户地址列表 + tags: + - 地址 +securityDefinitions: + MasterID: + in: header + name: MasterID + type: apiKey +swagger: "2.0" diff --git a/etc/cfg.yml b/etc/cfg.yml new file mode 100644 index 0000000..6f3e4de --- /dev/null +++ b/etc/cfg.yml @@ -0,0 +1,97 @@ +# 当前域名 +debug: true +curldebug: true +prd: false +local: true +# 服务器参数 +srv_addr: ':6001' +# 缓存 +redis_addr: '120.24.28.6:32572' + +redis_addr_second: + addr: '120.24.28.6:32572' + pwd: '' + +admin: + url: http://zyos.com + iurl: http://zyos.com + api_aes_key: e{&[^Ft(.~g]1eR-]VO + api_aes_iv: ZV`7<5X]/2brS@sz + +official: + url: http://pc.fnuo123.com.cn + +wxapplet_filepath: + url: '/etc/zyos-admin/wx_check_file' + +h5_filepath: + url: '/etc/zyos-admin/h5-wap' + +im_business_rpc: + url: im-rpc-logic.izhyin.com + port: 8000 + +zhios_open: + url: http://127.0.0.1:5006 + +app_comm: + url: http://127.0.0.1:5003 + +supply: + url: http://supply-chain-admin:5500 + +zhimeng: + url: http://zhimeng.zhiyinos.cn + +website_backend: + url: http://admin.fnuo123.com.cn + +# 连接官网数据库获取db mapping +db: + host: '119.23.182.117:3306' + name: 'zyos_website' + user: 'root' + psw: 'Fnuo123com@' + show_log: true + max_lifetime: 30 + max_open_conns: 100 + max_idle_conns: 100 + path: 'tmp/%s.log' + +# 连接RabbitMq +mq: + host: '116.62.62.35' + port: '5672' + user: 'zhios' + pwd: 'ZHIoscnfnuo123' + +# 连接ElasticSearch +es: + url: 'http://120.55.48.175:9200' + user: 'elastic' + pwd: 'fnuo123' + +zhimeng_db: + host: '119.23.182.117:3306' + name: 'zhi_meng' + user: 'root' + psw: 'Fnuo123com@' + show_log: true + max_lifetime: 30 + max_open_conns: 100 + max_idle_conns: 100 + path: 'tmp/%s.log' + + +# 日志 +log: + app_name: 'applet' + level: 'debug' # 普通日志级别 #debug, info, warn, fatal, panic + is_stdout: true + time_format: 'standard' # sec, second, milli, nano, standard, iso + encoding: 'console' + is_file_out: true + file_dir: './tmp/' + file_max_size: 256 + file_max_age: 1 + file_name: 'debug.log' diff --git a/etc/db_tpl/config b/etc/db_tpl/config new file mode 100644 index 0000000..34c75ee --- /dev/null +++ b/etc/db_tpl/config @@ -0,0 +1,7 @@ +lang=go +genJson=1 +prefix=cos_ +ignoreColumnsJSON= +created= +updated= +deleted= \ No newline at end of file diff --git a/etc/db_tpl/struct.go.tpl b/etc/db_tpl/struct.go.tpl new file mode 100644 index 0000000..74b2896 --- /dev/null +++ b/etc/db_tpl/struct.go.tpl @@ -0,0 +1,17 @@ +package {{.Models}} + +{{$ilen := len .Imports}} +{{if gt $ilen 0}} +import ( + {{range .Imports}}"{{.}}"{{end}} +) +{{end}} + +{{range .Tables}} +type {{Mapper .Name}} struct { +{{$table := .}} +{{range .ColumnsSeq}}{{$col := $table.GetColumn .}} {{Mapper $col.Name}} {{Type $col}} {{Tag $table $col}} +{{end}} +} +{{end}} + diff --git a/etc/nginx.conf b/etc/nginx.conf new file mode 100644 index 0000000..18fab25 --- /dev/null +++ b/etc/nginx.conf @@ -0,0 +1,28 @@ +server { + listen 80; + #listen 443 ssl http2; + charset utf-8; + server_name applet.xx; + + proxy_set_header Host $http_host; + proxy_set_header X-Scheme $scheme; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass_header Server; + + location /api { + proxy_pass http://127.0.0.1:9900/api/v1/; + } + + error_log /tmp/applet_err.log; + access_log /tmp/applet_acc.log main buffer=32k; + + #ssl_certificate /www/server/panel/vhost/cert/aid.im/fullchain.pem; + #ssl_certificate_key /www/server/panel/vhost/cert/aid.im/privkey.pem; + #ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1; + #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; + #ssl_prefer_server_ciphers on; + #ssl_session_cache shared:SSL:10m; + #ssl_session_timeout 10m; +} \ No newline at end of file diff --git a/etc/task.yml b/etc/task.yml new file mode 100644 index 0000000..4670960 --- /dev/null +++ b/etc/task.yml @@ -0,0 +1,60 @@ +# debug release test +debug: true +prd: false +local: true +# 缓存 +redis_addr: '120.24.28.6:32572' +redis_addr_second: + addr: '120.24.28.6:32572' + pwd: '' +admin: + api_aes_key: e{&[^Ft(.~g]1eR-]VO + api_aes_iv: ZV`7<5X]/2brS@sz +app_comm: + url: http://127.0.0.1:5003 + +# 连接ElasticSearch +es: + url: 'http://120.55.48.175:9200' + user: 'elastic' + pwd: 'fnuo123' + +# 数据库 +db: + host: '119.23.182.117:3306' + name: 'zyos_website' + user: 'root' + psw: 'Fnuo123com@' + show_log: true + max_lifetime: 30 + max_open_conns: 100 + max_idle_conns: 100 + path: 'tmp/task_sql_%v.log' + +zhimeng_db: + host: '119.23.182.117:3306' + name: 'zhi_meng' + user: 'root' + psw: 'Fnuo123com@' + show_log: true + max_lifetime: 30 + max_open_conns: 100 + max_idle_conns: 100 + path: 'tmp/%s.log' +# 日志 +log: + level: 'debug' # 普通日志级别 #debug, info, warn, fatal, panic + is_stdout: true + time_format: 'standard' # sec, second, milli, nano, standard, iso + encoding: 'console' + is_file_out: true + file_dir: './tmp/' + file_max_size: 256 + file_max_age: 1 + file_name: 'task.log' +# 连接RabbitMq +mq: + host: '116.62.62.35' + port: '5672' + user: 'zhios' + pwd: 'ZHIoscnfnuo123' \ No newline at end of file diff --git a/flags/flag.go b/flags/flag.go new file mode 100644 index 0000000..f2d2ca5 --- /dev/null +++ b/flags/flag.go @@ -0,0 +1,41 @@ +package flags + +import "errors" + +const ( + // CacheAlterTable is 修改表缓存名 + CacheAlterTable string = "db_center_alter_table" + // CacheUserMigrate is 用户迁移 + CacheUserMigrate string = "user_migrate" +) + +// BoolFlag is type of map[string]bool +type BoolFlag map[string]bool + +// BoolFlagMap is mapping bool +var BoolFlagMap = BoolFlag{ + "1": true, + "true": true, + "True": true, + "0": false, + "false": false, + "False": false, +} + +// BoundCheck is return false and err if is not found +func (b BoolFlag) BoundCheck(flag string) (bool, error) { + bl, ok := b[flag] + if !ok { + return false, errors.New("Flag Not Mapping Any Key") + } + return bl, nil +} + +// Check is not found return flase +func (b BoolFlag) Check(flag string) bool { + bl, ok := b[flag] + if !ok { + return false + } + return bl +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..868369c --- /dev/null +++ b/go.mod @@ -0,0 +1,79 @@ +module applet + +go 1.15 + +require ( + code.fnuoos.com/go_rely_warehouse/zyos_go_condition_statistics.git v1.1.2-0.20240702071747-c6b3b336ad1c + code.fnuoos.com/go_rely_warehouse/zyos_go_coupon.git v1.1.2 + code.fnuoos.com/go_rely_warehouse/zyos_go_jg_push.git v1.0.2 + code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240823083437-5a9b1907d83c + code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git v1.6.2-0.20240105031805-d6d481cf00c0 + github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 + github.com/bitly/go-simplejson v0.5.0 + github.com/boombuler/barcode v1.0.1 + github.com/dchest/uniuri v0.0.0-20200228104902-7aecb25e1fe5 + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/forgoer/openssl v1.2.1 + github.com/gin-contrib/sessions v0.0.3 + github.com/gin-gonic/gin v1.9.1 + github.com/go-creed/sat v1.0.3 + github.com/go-redis/redis v6.15.9+incompatible + github.com/go-sql-driver/mysql v1.8.1 + github.com/gocolly/colly v1.2.0 + github.com/gomodule/redigo v2.0.0+incompatible + github.com/iGoogle-ink/gopay v1.5.36 + github.com/jinzhu/copier v0.4.0 + github.com/makiuchi-d/gozxing v0.1.1 + github.com/mvdan/xurls v1.1.0 + github.com/nilorg/sdk v0.0.0-20221104025912-4b6ccb7004d8 + github.com/opesun/goquery v0.0.0-20160908163916-0d77e43213cd + github.com/pkg/errors v0.9.1 + github.com/qiniu/api.v7/v7 v7.8.2 + github.com/robfig/cron/v3 v3.0.1 + github.com/shopspring/decimal v1.3.1 + github.com/swaggo/swag v1.7.0 + github.com/syyongx/php2go v0.9.8 + github.com/tidwall/gjson v1.17.0 + github.com/xluohome/phonedata v0.0.0-20220123041135-c005bb2f5d35 + go.uber.org/zap v1.23.0 + golang.org/x/sync v0.2.0 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 + gopkg.in/yaml.v2 v2.4.0 + xorm.io/xorm v1.3.2 +) + +require ( + code.fnuoos.com/go_rely_warehouse/zyos_go_day_luck_draw.git v1.2.0 + code.fnuoos.com/go_rely_warehouse/zyos_go_es.git v1.0.1-0.20230113125201-a16543b7da1d + code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5 + code.fnuoos.com/go_rely_warehouse/zyos_go_o2o_business.git v1.0.10-0.20240710030252-6d4151ab994b + code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240830072333-a1980ffb256e + code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240816014008-a236ebf42395 + github.com/andybalholm/cascadia v1.2.0 // indirect + github.com/antchfx/htmlquery v1.2.3 // indirect + github.com/antchfx/xmlquery v1.3.5 // indirect + github.com/antchfx/xpath v1.1.11 // indirect + github.com/cc14514/go-geoip2 v0.0.0-20190105051856-0a1854480a11 + github.com/cc14514/go-geoip2-db v0.0.0-20190106063142-7b6408a9812a + github.com/dchest/captcha v1.0.0 + github.com/fogleman/gg v1.3.0 + github.com/go-openapi/spec v0.20.3 // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + github.com/gookit/color v1.3.8 // indirect + github.com/gorilla/sessions v1.2.1 // indirect + github.com/json-iterator/go v1.1.12 + github.com/kennygrant/sanitize v1.2.4 // indirect + github.com/olivere/elastic/v7 v7.0.32 + github.com/rakyll/statik v0.1.7 // indirect + github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect + github.com/temoto/robotstxt v1.1.2 // indirect + github.com/wenlng/go-captcha v1.2.5 + golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 + golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/grpc v1.33.2 + google.golang.org/protobuf v1.30.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..3a66eca --- /dev/null +++ b/go.sum @@ -0,0 +1,1544 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +code.fnuoos.com/go_rely_warehouse/zyos_go_condition_statistics.git v1.1.2-0.20240702071747-c6b3b336ad1c h1:7oW6off5WIplX2hd+BDO/bS/iU/WIQPHBh6uUHjJspU= +code.fnuoos.com/go_rely_warehouse/zyos_go_condition_statistics.git v1.1.2-0.20240702071747-c6b3b336ad1c/go.mod h1:3dgECgbJufgRYy8O714HGkrkYshaIAv30ShFBsSaCfs= +code.fnuoos.com/go_rely_warehouse/zyos_go_coupon.git v1.1.2 h1:DHsLo+xOvr72LwJOKEV0fT19zEKqbJtAGYv5kDLUZrc= +code.fnuoos.com/go_rely_warehouse/zyos_go_coupon.git v1.1.2/go.mod h1:yr9zroGixMbJ5gm+lVLVcUAZ4mRIaFlWHtBBTLJm5z0= +code.fnuoos.com/go_rely_warehouse/zyos_go_day_luck_draw.git v1.2.0 h1:OYaoKdrpK0obnK/OMJ0Bg8DyU1Uliq35xPljaRGvDAY= +code.fnuoos.com/go_rely_warehouse/zyos_go_day_luck_draw.git v1.2.0/go.mod h1:Yc/SFCnyo6Ninzr+BrcXdkwoEEthMGSgWG+J0Oo8HtE= +code.fnuoos.com/go_rely_warehouse/zyos_go_es.git v1.0.1-0.20230113125201-a16543b7da1d h1:w87z133GUwiw6l3eSvoYt52pPR3lLiX9E08flRVcecE= +code.fnuoos.com/go_rely_warehouse/zyos_go_es.git v1.0.1-0.20230113125201-a16543b7da1d/go.mod h1:aHatysIWFJ4DzLRSDljlbMObA61wYivI9ab9sygiA8s= +code.fnuoos.com/go_rely_warehouse/zyos_go_jg_push.git v1.0.2 h1:LUWlvBgmzZfGqvH4VGEWk+JhXHlI+MFmLNl9uX7eh28= +code.fnuoos.com/go_rely_warehouse/zyos_go_jg_push.git v1.0.2/go.mod h1:IEw6A61Kp2ctoeKIQMFVM/cFq9PUDAzJMb5lVXiEY2Y= +code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5 h1:dqvWJqlJi0WXCwTxbWPLvSOsKPjP+iEDBVgLcAl9nOE= +code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git v0.0.5/go.mod h1:TTcCnFn/LhBGapnutpezlW+GXkLRNPMWkziOoCsXQqY= +code.fnuoos.com/go_rely_warehouse/zyos_go_o2o_business.git v1.0.10-0.20240710030252-6d4151ab994b h1:qJ3n/N84ByxpbHXsMB3319cvffLwa3Gcnx7WMqNvpX0= +code.fnuoos.com/go_rely_warehouse/zyos_go_o2o_business.git v1.0.10-0.20240710030252-6d4151ab994b/go.mod h1:8lqoRm7PkDuPV9shACAu3B+LPplV99cgOxM91Z+pa5k= +code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240118152737-08e0d2709655/go.mod h1:Q/C2vLPgAWDPyKyll2sFRWdJsw26nZknL+mjGGB1uuw= +code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240823083437-5a9b1907d83c h1:wKd5mCUszsNwe+qpUyxPfjsZ+CquyKaHad9Ci3pfeMo= +code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git v1.9.10-0.20240823083437-5a9b1907d83c/go.mod h1:LXKefjdbY6D+P1jALLM87wDej8N5D+sLub4YfrnU7TA= +code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git v1.6.2-0.20240105031805-d6d481cf00c0 h1:Y2PHy4RxhpPPy6hrSsDnzK+mEbY76If3UJGZIk6cmg4= +code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git v1.6.2-0.20240105031805-d6d481cf00c0/go.mod h1:0eObND+Vum1rxf8Ro5ai16phWdWGZ3lkKDXqO/v082s= +code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240826023213-74e7e23bee7c h1:yfSb2PgHMmNlvdQCkdFFZF9i5yrQNMGgFARs9VzPrf0= +code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240826023213-74e7e23bee7c/go.mod h1:WEwF5BOzArem2a/EMJqoZ6gxb0DIEADruUROS4s5bNA= +code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240830072333-a1980ffb256e h1:9uiwLba7UGSyox/83pJkho1akyDKJf9bRb/fTcPmAaE= +code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git v1.1.21-0.20240830072333-a1980ffb256e/go.mod h1:WEwF5BOzArem2a/EMJqoZ6gxb0DIEADruUROS4s5bNA= +code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240816014008-a236ebf42395 h1:xM3v+GLMYQMYeyp48SzJOXvylsbNRbdlvWRMXViWwFI= +code.fnuoos.com/go_rely_warehouse/zyos_model.git v0.0.4-0.20240816014008-a236ebf42395/go.mod h1:nT2x13YFgrS3tS1fDyUR6q/GNIK+hPw7bdzZXz99SM0= +contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= +gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= +gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE= +github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= +github.com/Azure/go-autorest/autorest v0.5.0/go.mod h1:9HLKlQjVBH6U3oDfsXOeVc56THsLPw1L03yban4xThw= +github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= +github.com/Azure/go-autorest/autorest/adal v0.2.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= +github.com/Azure/go-autorest/autorest/azure/auth v0.1.0/go.mod h1:Gf7/i2FUpyb/sGBLIFxTBzrNzBo7aPXXE3ZVeDRwdpM= +github.com/Azure/go-autorest/autorest/azure/cli v0.1.0/go.mod h1:Dk8CUAt/b/PzkfeRsWzVG9Yj3ps8mS8ECztu43rdU8U= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/hcsshim v0.8.7-0.20191101173118-65519b62243c/go.mod h1:7xhjOwRV2+0HXGmM0jxaEu+ZiXJFoVZOTfL/dmqbrD8= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks= +github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.0/go.mod h1:zpDJeKyp9ScW4NNrbdr+Eyxvry3ilGPewKoXw3XGN1k= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= +github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/andybalholm/cascadia v1.2.0 h1:vuRCkM5Ozh/BfmsaTm26kbjm0mIOM3yS5Ek/F5h18aE= +github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antchfx/htmlquery v1.2.3 h1:sP3NFDneHx2stfNXCKbhHFo8XgNjCACnU/4AO5gWz6M= +github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0= +github.com/antchfx/xmlquery v1.3.5 h1:I7TuBRqsnfFuL11ruavGm911Awx9IqSdiU6W/ztSmVw= +github.com/antchfx/xmlquery v1.3.5/go.mod h1:64w0Xesg2sTaawIdNqMB+7qaW/bSqkQm+ssPaCMWNnc= +github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= +github.com/antchfx/xpath v1.1.10/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk= +github.com/antchfx/xpath v1.1.11 h1:WOFtK8TVAjLm3lbgqeP0arlHpvCEeTANeWZ/csPpJkQ= +github.com/antchfx/xpath v1.1.11/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/rocketmq-client-go/v2 v2.1.0/go.mod h1:oEZKFDvS7sz/RWU0839+dQBupazyBV7WX5cP6nrio0Q= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/asim/go-micro/plugins/registry/etcd/v3 v3.0.0-20210227064844-df90f2ca63ff/go.mod h1:BwrEEWiVIldDOWEWrdNKDMU8jILSNvzkuLTn6VLM28E= +github.com/asim/go-micro/v3 v3.5.0/go.mod h1:PR/RCuFk1F7aPnK6pc8Ca9rHOZzfg1x7+fvTygQa55g= +github.com/asim/go-micro/v3 v3.5.1-0.20210227064844-df90f2ca63ff/go.mod h1:OJ5DnUQmoEVQTNbKRstR7/krtYJI+QaBe/XeN5MZkqE= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.23.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= +github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cc14514/go-geoip2 v0.0.0-20190105051856-0a1854480a11 h1:smFM+R9NconJ5FHiMyQsq/fIjtYE0jxVJwX8ZxAmWF0= +github.com/cc14514/go-geoip2 v0.0.0-20190105051856-0a1854480a11/go.mod h1:gC4wJD6T+unJtW078G4ugNE2UNbk4/oYwQKteOaybQE= +github.com/cc14514/go-geoip2-db v0.0.0-20190106063142-7b6408a9812a h1:tc57+CsbpTjJLvcp2AyVAvaYmS0FFxSaRCQeUa4jcHg= +github.com/cc14514/go-geoip2-db v0.0.0-20190106063142-7b6408a9812a/go.mod h1:MBxCt6+ltWZRodx2FgXuQm7LQweWyPofmXsuhX3D6Zo= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.10.2/go.mod h1:qhVI5MKwBGhdNU89ZRz2plgYutcJ5PCekLxXn56w6SY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o= +github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo= +github.com/dchest/uniuri v0.0.0-20200228104902-7aecb25e1fe5 h1:RAV05c0xOkJ3dZGS0JFybxFKZ2WMLabgx3uXnd7rpGs= +github.com/dchest/uniuri v0.0.0-20200228104902-7aecb25e1fe5/go.mod h1:GgB8SF9nRG+GqaDtLcwJZsQFhcogVCJ79j4EdT0c2V4= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v0.0.0-20180814043457-aafff18a5cc2/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnsimple/dnsimple-go v0.30.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/ef-ds/deque v1.0.4-0.20190904040645-54cb57c252a1/go.mod h1:HvODWzv6Y6kBf3Ah2WzN1bHjDUezGLaAhwuWVwfpEJs= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/evanphx/json-patch/v5 v5.0.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/forgoer/openssl v1.2.1 h1:Qvgk8K+pKayd3QG/f7fB2LJm1ObYNA2iqYraipxm8jQ= +github.com/forgoer/openssl v1.2.1/go.mod h1:NMVFOzYeLVR7UiGTxsa+A21nrERTZ3Rv2JHDPcJpDyI= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsouza/go-dockerclient v1.6.0/go.mod h1:YWwtNPuL4XTX1SKJQk86cWPmmqwx+4np9qfPbb+znGc= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sessions v0.0.3 h1:PoBXki+44XdJdlgDqDrY5nDVe3Wk7wDV/UCOuLP6fBI= +github.com/gin-contrib/sessions v0.0.3/go.mod h1:8C/J6cad3Il1mWYYgtw0w+hqasmpvy25mPkXdOgeB9I= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.8.0/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-acme/lego/v3 v3.4.0/go.mod h1:xYbLDuxq3Hy4bMUT1t9JIuz6GWIWb3m5X+TeTHYaT7M= +github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= +github.com/go-creed/sat v1.0.3 h1:V1IkiYYFDPKXaRhdg95oAh5IHZ3Qhs5AEVlhteM+6XA= +github.com/go-creed/sat v1.0.3/go.mod h1:ZxAhQ0ikMzjqeMbFeoMdCr6es8p10Y87F2nHkqNjSbY= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.44.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.19.14/go.mod h1:gwrgJS15eCUgjLpMjBJmbZezCsw88LmgeEip0M63doA= +github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= +github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v8 v8.6.0/go.mod h1:DQ9q4Rk2HtwkrwVrdgmphoOQDMfpvcd/nHEwRsicg8s= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.3/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI= +github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.8.8/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= +github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gookit/color v1.3.6/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= +github.com/gookit/color v1.3.8 h1:w2WcSwaCa1ojRWO60Mm4GJUJomBNKR9G+x9DwaaCL1c= +github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= +github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iGoogle-ink/gopay v1.5.28/go.mod h1:yjS9Sc8VYzs3LMFJaubYMGs9LS7Pc2Sf2pAcL1jOW5M= +github.com/iGoogle-ink/gopay v1.5.36 h1:RctuoiEdTbiXOmzQ9i1388opwAOjheUDIFoHl1EeNr8= +github.com/iGoogle-ink/gopay v1.5.36/go.mod h1:JADVzrfz9kzGMCgV7OzJ954pqwMU7PotYMAjP84YKIE= +github.com/iGoogle-ink/gotil v1.0.20/go.mod h1:1msXAn0/WhPRn/gBUT/JDSzo0LSibueFKBqZemh4x5M= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.8.1/go.mod h1:JV6m6b6jhjdmzchES0drzCcYcAHS1OPD5xu3OZ/lE2g= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.7.0/go.mod h1:ZnHF+rMePVqDKaOfJVI4Q8IVvAQMryDlDkZnKOI75BE= +github.com/jackc/pgtype v1.8.0/go.mod h1:PqDKcEBtllAtk/2p6z6SHdXW5UB+MhE75tUol2OKexE= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.11.0/go.mod h1:i62xJgdrtVDsnL3U8ekyrQXEwGNTRoG7/8r+CIdYfcc= +github.com/jackc/pgx/v4 v4.12.0/go.mod h1:fE547h6VulLPA3kySjfnSG/e2D861g/50JlVUa/ub60= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= +github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA= +github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w= +github.com/labstack/echo/v4 v4.2.0/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linode/linodego v0.10.0/go.mod h1:cziNP7pbvE3mXIPneHj0oRY8L1WtGEIKlZ8LANE4eXA= +github.com/liquidweb/liquidweb-go v1.6.0/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVLEIG/i5J9cyixzQ= +github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/makiuchi-d/gozxing v0.1.1 h1:xxqijhoedi+/lZlhINteGbywIrewVdVv2wl9r5O9S1I= +github.com/makiuchi-d/gozxing v0.1.1/go.mod h1:eRIHbOjX7QWxLIDJoQuMLhuXg9LAuw6znsUtRkNw9DU= +github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= +github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= +github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA= +github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc= +github.com/micro/cli/v2 v2.1.2/go.mod h1:EguNh6DAoWKm9nmk+k/Rg0H3lQnDxqzu5x5srOtGtYg= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mvdan/xurls v1.1.0 h1:OpuDelGQ1R1ueQ6sSryzi6P+1RtBpfQHM8fJwlE45ww= +github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nilorg/sdk v0.0.0-20221104025912-4b6ccb7004d8 h1:9hvJ/9GQssABrUYNOW1Q6X9/7uY6+Srj9YYYQZVC0AE= +github.com/nilorg/sdk v0.0.0-20221104025912-4b6ccb7004d8/go.mod h1:X1swpPdqguAZaBDoEPyEWHSsJii0YQ1o+3piMv6W3JU= +github.com/nrdcg/auroradns v1.0.0/go.mod h1:6JPXKzIRzZzMqtTDgueIhTi6rFf1QvYE/HzqidhOhjw= +github.com/nrdcg/dnspod-go v0.4.0/go.mod h1:vZSoFSFeQVm2gWLMkyX61LZ8HI3BaqtHZWgPTGKr6KQ= +github.com/nrdcg/goinwx v0.6.1/go.mod h1:XPiut7enlbEdntAqalBIqcYcTEVhpv/dKWgDCX2SwKQ= +github.com/nrdcg/namesilo v0.2.1/go.mod h1:lwMvfQTyYq+BbjJd30ylEG4GPSS6PII0Tia4rRpRiyw= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E= +github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/opesun/goquery v0.0.0-20160908163916-0d77e43213cd h1:taV1toAfzAdRwNWpIB7JMdgX2xL+JT3Rq8GXzyPK1Is= +github.com/opesun/goquery v0.0.0-20160908163916-0d77e43213cd/go.mod h1:XIY7IuxoZH2deZdjIgzLqXlYkOHiwNC+hL1m3vS2A8g= +github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= +github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/qiniu/api.v7/v7 v7.8.2 h1:f08kI0MmsJNzK4sUS8bG3HDH67ktwd/ji23Gkiy2ra4= +github.com/qiniu/api.v7/v7 v7.8.2/go.mod h1:FPsIqxh1Ym3X01sANE5ZwXfLZSWoCUp5+jNI8cLo3l0= +github.com/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= +github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sacloud/libsacloud v1.26.1/go.mod h1:79ZwATmHLIFZIMd7sxA3LwzVy/B77uj3LDoToVTxDoQ= +github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI= +github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.1.1 h1:T/YLemO5Yp7KPzS+lVtu+WsHn8yoSwTfItdAd1r3cck= +github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/swaggo/swag v1.7.0 h1:5bCA/MTLQoIqDXXyHfOpMeDvL9j68OY/udlK4pQoo4E= +github.com/swaggo/swag v1.7.0/go.mod h1:BdPIL73gvS9NBsdi7M1JOxLvlbfvNRaBP8m6WT6Aajo= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/syyongx/php2go v0.9.6/go.mod h1:meN2eIhhUoxOd2nMxbpe8g6cFPXI5O9/UAAuz7oDdzw= +github.com/syyongx/php2go v0.9.7/go.mod h1:meN2eIhhUoxOd2nMxbpe8g6cFPXI5O9/UAAuz7oDdzw= +github.com/syyongx/php2go v0.9.8 h1:FNwV1y+RaZxl7KTm/ICh0Zrhca/70d5JRMpwByuQ1FM= +github.com/syyongx/php2go v0.9.8/go.mod h1:meN2eIhhUoxOd2nMxbpe8g6cFPXI5O9/UAAuz7oDdzw= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg= +github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= +github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA= +github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= +github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v0.0.0-20190325153808-1166b9ac2b65/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4o2HM0m3DZYQWsj6/MEowD57VzoH0v3d7igeFY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= +github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= +github.com/vultr/govultr v0.1.4/go.mod h1:9H008Uxr/C4vFNGLqKx232C206GL0PBHzOP0809bGNA= +github.com/wenlng/go-captcha v1.2.5 h1:zA0/fovEl9oAhSg+KwHBwmq99GeeAXknWx6wYKjhjTg= +github.com/wenlng/go-captcha v1.2.5/go.mod h1:QgPgpEURSa37gF3GtojNoNRwbMwuatSBx5NXrzASOb0= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xluohome/phonedata v0.0.0-20220123041135-c005bb2f5d35 h1:CzJpvB76GmmRNs4AVpGEuhO+gien7G5CcC+8vaIIWPI= +github.com/xluohome/phonedata v0.0.0-20220123041135-c005bb2f5d35/go.mod h1:xLEBvbUFvuBHRWeV/SNefGARR5QedFRkThwnodnmCKw= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd/api/v3 v3.5.0-alpha.0/go.mod h1:mPcW6aZJukV6Aa81LSKpBjQXTWlXB5r74ymPoSWa3Sw= +go.etcd.io/etcd/client/v3 v3.5.0-alpha.0/go.mod h1:wKt7jgDgf/OfKiYmCq5WFGxOFAkVMLxiiXgLDFhECr8= +go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0/go.mod h1:tV31atvwzcybuqejDoY3oaNRTtlD2l/Ot78Pc9w7DMY= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/otel v0.17.0/go.mod h1:Oqtdxmf7UtEvL037ohlgnaYa1h7GtMh0NcSd9eqkC9s= +go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk= +go.opentelemetry.io/otel/metric v0.17.0/go.mod h1:hUz9lH1rNXyEwWAhIWCMFWKhYtpASgSnObJFnU26dJ0= +go.opentelemetry.io/otel/oteltest v0.17.0/go.mod h1:JT/LGFxPwpN+nlsTiinSYjdIx3hZIGqHCpChcIZmdoE= +go.opentelemetry.io/otel/trace v0.17.0/go.mod h1:bIujpqg6ZL6xUTubIUgziI1jSaUPthmabA/ygf/6Cfg= +go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= +go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180611182652-db08ff08e862/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191027093000-83d349e8ac1a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20221004154528-8021a29435af/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20201120155355-20be4ac4bd6e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/ns1/ns1-go.v2 v2.0.0-20190730140822-b51389932cbc/go.mod h1:VV+3haRsgDiVLxyifmMBrBIuCWFBPYKbRssXB9z67Hw= +gopkg.in/resty.v1 v1.9.1/go.mod h1:vo52Hzryw9PnPHcJfPsBiFW62XhNx5OczbV9y+IMpgc= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.0.3/go.mod h1:twGxftLBlFgNVNakL7F+P/x9oYqoymG3YYT8cAfI9oI= +gorm.io/gorm v1.20.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.21.8/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.33.9/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.33.11/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.34.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.0/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.4/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.5/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.7/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.8/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.10/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.15/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.16/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/cc/v3 v3.35.18 h1:rMZhRcWrba0y3nVmdiQ7kxAgOOSq2m2f2VzjHLgEs6U= +modernc.org/cc/v3 v3.35.18/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= +modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60= +modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw= +modernc.org/ccgo/v3 v3.11.0/go.mod h1:dGNposbDp9TOZ/1KBxghxtUp/bzErD0/0QW4hhSaBMI= +modernc.org/ccgo/v3 v3.11.1/go.mod h1:lWHxfsn13L3f7hgGsGlU28D9eUOf6y3ZYHKoPaKU0ag= +modernc.org/ccgo/v3 v3.11.3/go.mod h1:0oHunRBMBiXOKdaglfMlRPBALQqsfrCKXgw9okQ3GEw= +modernc.org/ccgo/v3 v3.12.4/go.mod h1:Bk+m6m2tsooJchP/Yk5ji56cClmN6R1cqc9o/YtbgBQ= +modernc.org/ccgo/v3 v3.12.6/go.mod h1:0Ji3ruvpFPpz+yu+1m0wk68pdr/LENABhTrDkMDWH6c= +modernc.org/ccgo/v3 v3.12.8/go.mod h1:Hq9keM4ZfjCDuDXxaHptpv9N24JhgBZmUG5q60iLgUo= +modernc.org/ccgo/v3 v3.12.11/go.mod h1:0jVcmyDwDKDGWbcrzQ+xwJjbhZruHtouiBEvDfoIsdg= +modernc.org/ccgo/v3 v3.12.14/go.mod h1:GhTu1k0YCpJSuWwtRAEHAol5W7g1/RRfS4/9hc9vF5I= +modernc.org/ccgo/v3 v3.12.18/go.mod h1:jvg/xVdWWmZACSgOiAhpWpwHWylbJaSzayCqNOJKIhs= +modernc.org/ccgo/v3 v3.12.20/go.mod h1:aKEdssiu7gVgSy/jjMastnv/q6wWGRbszbheXgWRHc8= +modernc.org/ccgo/v3 v3.12.21/go.mod h1:ydgg2tEprnyMn159ZO/N4pLBqpL7NOkJ88GT5zNU2dE= +modernc.org/ccgo/v3 v3.12.22/go.mod h1:nyDVFMmMWhMsgQw+5JH6B6o4MnZ+UQNw1pp52XYFPRk= +modernc.org/ccgo/v3 v3.12.25/go.mod h1:UaLyWI26TwyIT4+ZFNjkyTbsPsY3plAEB6E7L/vZV3w= +modernc.org/ccgo/v3 v3.12.29/go.mod h1:FXVjG7YLf9FetsS2OOYcwNhcdOLGt8S9bQ48+OP75cE= +modernc.org/ccgo/v3 v3.12.36/go.mod h1:uP3/Fiezp/Ga8onfvMLpREq+KUjUmYMxXPO8tETHtA8= +modernc.org/ccgo/v3 v3.12.38/go.mod h1:93O0G7baRST1vNj4wnZ49b1kLxt0xCW5Hsa2qRaZPqc= +modernc.org/ccgo/v3 v3.12.43/go.mod h1:k+DqGXd3o7W+inNujK15S5ZYuPoWYLpF5PYougCmthU= +modernc.org/ccgo/v3 v3.12.46/go.mod h1:UZe6EvMSqOxaJ4sznY7b23/k13R8XNlyWsO5bAmSgOE= +modernc.org/ccgo/v3 v3.12.47/go.mod h1:m8d6p0zNps187fhBwzY/ii6gxfjob1VxWb919Nk1HUk= +modernc.org/ccgo/v3 v3.12.50/go.mod h1:bu9YIwtg+HXQxBhsRDE+cJjQRuINuT9PUK4orOco/JI= +modernc.org/ccgo/v3 v3.12.51/go.mod h1:gaIIlx4YpmGO2bLye04/yeblmvWEmE4BBBls4aJXFiE= +modernc.org/ccgo/v3 v3.12.53/go.mod h1:8xWGGTFkdFEWBEsUmi+DBjwu/WLy3SSOrqEmKUjMeEg= +modernc.org/ccgo/v3 v3.12.54/go.mod h1:yANKFTm9llTFVX1FqNKHE0aMcQb1fuPJx6p8AcUx+74= +modernc.org/ccgo/v3 v3.12.55/go.mod h1:rsXiIyJi9psOwiBkplOaHye5L4MOOaCjHg1Fxkj7IeU= +modernc.org/ccgo/v3 v3.12.56/go.mod h1:ljeFks3faDseCkr60JMpeDb2GSO3TKAmrzm7q9YOcMU= +modernc.org/ccgo/v3 v3.12.57/go.mod h1:hNSF4DNVgBl8wYHpMvPqQWDQx8luqxDnNGCMM4NFNMc= +modernc.org/ccgo/v3 v3.12.60/go.mod h1:k/Nn0zdO1xHVWjPYVshDeWKqbRWIfif5dtsIOCUVMqM= +modernc.org/ccgo/v3 v3.12.65/go.mod h1:D6hQtKxPNZiY6wDBtehSGKFKmyXn53F8nGTpH+POmS4= +modernc.org/ccgo/v3 v3.12.66/go.mod h1:jUuxlCFZTUZLMV08s7B1ekHX5+LIAurKTTaugUr/EhQ= +modernc.org/ccgo/v3 v3.12.67/go.mod h1:Bll3KwKvGROizP2Xj17GEGOTrlvB1XcVaBrC90ORO84= +modernc.org/ccgo/v3 v3.12.73/go.mod h1:hngkB+nUUqzOf3iqsM48Gf1FZhY599qzVg1iX+BT3cQ= +modernc.org/ccgo/v3 v3.12.81/go.mod h1:p2A1duHoBBg1mFtYvnhAnQyI6vL0uw5PGYLSIgF6rYY= +modernc.org/ccgo/v3 v3.12.82 h1:wudcnJyjLj1aQQCXF3IM9Gz2X6UNjw+afIghzdtn0v8= +modernc.org/ccgo/v3 v3.12.82/go.mod h1:ApbflUfa5BKadjHynCficldU1ghjen84tuM5jRynB7w= +modernc.org/ccorpus v1.11.1 h1:K0qPfpVG1MJh5BYazccnmhywH4zHuOgJXgbjzyp6dWA= +modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= +modernc.org/libc v1.9.11/go.mod h1:NyF3tsA5ArIjJ83XB0JlqhjTabTCHm9aX4XMPHyQn0Q= +modernc.org/libc v1.11.0/go.mod h1:2lOfPmj7cz+g1MrPNmX65QCzVxgNq2C5o0jdLY2gAYg= +modernc.org/libc v1.11.2/go.mod h1:ioIyrl3ETkugDO3SGZ+6EOKvlP3zSOycUETe4XM4n8M= +modernc.org/libc v1.11.5/go.mod h1:k3HDCP95A6U111Q5TmG3nAyUcp3kR5YFZTeDS9v8vSU= +modernc.org/libc v1.11.6/go.mod h1:ddqmzR6p5i4jIGK1d/EiSw97LBcE3dK24QEwCFvgNgE= +modernc.org/libc v1.11.11/go.mod h1:lXEp9QOOk4qAYOtL3BmMve99S5Owz7Qyowzvg6LiZso= +modernc.org/libc v1.11.13/go.mod h1:ZYawJWlXIzXy2Pzghaf7YfM8OKacP3eZQI81PDLFdY8= +modernc.org/libc v1.11.16/go.mod h1:+DJquzYi+DMRUtWI1YNxrlQO6TcA5+dRRiq8HWBWRC8= +modernc.org/libc v1.11.19/go.mod h1:e0dgEame6mkydy19KKaVPBeEnyJB4LGNb0bBH1EtQ3I= +modernc.org/libc v1.11.24/go.mod h1:FOSzE0UwookyT1TtCJrRkvsOrX2k38HoInhw+cSCUGk= +modernc.org/libc v1.11.26/go.mod h1:SFjnYi9OSd2W7f4ct622o/PAYqk7KHv6GS8NZULIjKY= +modernc.org/libc v1.11.27/go.mod h1:zmWm6kcFXt/jpzeCgfvUNswM0qke8qVwxqZrnddlDiE= +modernc.org/libc v1.11.28/go.mod h1:Ii4V0fTFcbq3qrv3CNn+OGHAvzqMBvC7dBNyC4vHZlg= +modernc.org/libc v1.11.31/go.mod h1:FpBncUkEAtopRNJj8aRo29qUiyx5AvAlAxzlx9GNaVM= +modernc.org/libc v1.11.34/go.mod h1:+Tzc4hnb1iaX/SKAutJmfzES6awxfU1BPvrrJO0pYLg= +modernc.org/libc v1.11.37/go.mod h1:dCQebOwoO1046yTrfUE5nX1f3YpGZQKNcITUYWlrAWo= +modernc.org/libc v1.11.39/go.mod h1:mV8lJMo2S5A31uD0k1cMu7vrJbSA3J3waQJxpV4iqx8= +modernc.org/libc v1.11.42/go.mod h1:yzrLDU+sSjLE+D4bIhS7q1L5UwXDOw99PLSX0BlZvSQ= +modernc.org/libc v1.11.44/go.mod h1:KFq33jsma7F5WXiYelU8quMJasCCTnHK0mkri4yPHgA= +modernc.org/libc v1.11.45/go.mod h1:Y192orvfVQQYFzCNsn+Xt0Hxt4DiO4USpLNXBlXg/tM= +modernc.org/libc v1.11.47/go.mod h1:tPkE4PzCTW27E6AIKIR5IwHAQKCAtudEIeAV1/SiyBg= +modernc.org/libc v1.11.49/go.mod h1:9JrJuK5WTtoTWIFQ7QjX2Mb/bagYdZdscI3xrvHbXjE= +modernc.org/libc v1.11.51/go.mod h1:R9I8u9TS+meaWLdbfQhq2kFknTW0O3aw3kEMqDDxMaM= +modernc.org/libc v1.11.53/go.mod h1:5ip5vWYPAoMulkQ5XlSJTy12Sz5U6blOQiYasilVPsU= +modernc.org/libc v1.11.54/go.mod h1:S/FVnskbzVUrjfBqlGFIPA5m7UwB3n9fojHhCNfSsnw= +modernc.org/libc v1.11.55/go.mod h1:j2A5YBRm6HjNkoSs/fzZrSxCuwWqcMYTDPLNx0URn3M= +modernc.org/libc v1.11.56/go.mod h1:pakHkg5JdMLt2OgRadpPOTnyRXm/uzu+Yyg/LSLdi18= +modernc.org/libc v1.11.58/go.mod h1:ns94Rxv0OWyoQrDqMFfWwka2BcaF6/61CqJRK9LP7S8= +modernc.org/libc v1.11.70/go.mod h1:DUOmMYe+IvKi9n6Mycyx3DbjfzSKrdr/0Vgt3j7P5gw= +modernc.org/libc v1.11.71/go.mod h1:DUOmMYe+IvKi9n6Mycyx3DbjfzSKrdr/0Vgt3j7P5gw= +modernc.org/libc v1.11.75/go.mod h1:dGRVugT6edz361wmD9gk6ax1AbDSe0x5vji0dGJiPT0= +modernc.org/libc v1.11.82/go.mod h1:NF+Ek1BOl2jeC7lw3a7Jj5PWyHPwWD4aq3wVKxqV1fI= +modernc.org/libc v1.11.86/go.mod h1:ePuYgoQLmvxdNT06RpGnaDKJmDNEkV7ZPKI2jnsvZoE= +modernc.org/libc v1.11.87 h1:PzIzOqtlzMDDcCzJ5cUP6h/Ku6Fa9iyflP2ccTY64aE= +modernc.org/libc v1.11.87/go.mod h1:Qvd5iXTeLhI5PS0XSyqMY99282y+3euapQFxM7jYnpY= +modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= +modernc.org/memory v1.0.5 h1:XRch8trV7GgvTec2i7jc33YlUI0RKVDBvZ5eZ5m8y14= +modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM= +modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.14.2 h1:ohsW2+e+Qe2To1W6GNezzKGwjXwSax6R+CrhRxVaFbE= +modernc.org/sqlite v1.14.2/go.mod h1:yqfn85u8wVOE6ub5UT8VI9JjhrwBUUCNyTACN0h6Sx8= +modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/tcl v1.8.13 h1:V0sTNBw0Re86PvXZxuCub3oO9WrSTqALgrwNZNvLFGw= +modernc.org/tcl v1.8.13/go.mod h1:V+q/Ef0IJaNUSECieLU4o+8IScapxnMyFV6i/7uQlAY= +modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.2.19 h1:BGyRFWhDVn5LFS5OcX4Yd/MlpRTOc7hOPTdcIpCiUao= +modernc.org/z v1.2.19/go.mod h1:+ZpP0pc4zz97eukOzW3xagV/lS82IpPN9NGG5pNF9vY= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +stathat.com/c/consistent v1.0.0/go.mod h1:QkzMWzcbB+yQBL2AttO6sgsQS/JSTapcDISJalmCDS0= +xorm.io/builder v0.3.7/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= +xorm.io/builder v0.3.9/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= +xorm.io/builder v0.3.10/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= +xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 h1:bvLlAPW1ZMTWA32LuZMBEGHAUOcATZjzHcotf3SWweM= +xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= +xorm.io/xorm v1.0.5/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4= +xorm.io/xorm v1.3.0/go.mod h1:cEaWjDPqoIusTkmDAG+krCcPcTglqo8CDU8geX/yhko= +xorm.io/xorm v1.3.1/go.mod h1:9NbjqdnjX6eyjRRhh01GHm64r6N9shTb/8Ak3YRt8Nw= +xorm.io/xorm v1.3.2 h1:uTRRKF2jYzbZ5nsofXVUx6ncMaek+SHjWYtCXyZo1oM= +xorm.io/xorm v1.3.2/go.mod h1:9NbjqdnjX6eyjRRhh01GHm64r6N9shTb/8Ak3YRt8Nw= diff --git a/main.go b/main.go new file mode 100644 index 0000000..5dd0ea7 --- /dev/null +++ b/main.go @@ -0,0 +1,98 @@ +package main + +import ( + "context" + "fmt" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "applet/app/cfg" + "applet/app/db" + "applet/app/router" + "applet/app/utils" +) + +//系统初始化 +func init() { + cfg.InitCfg() //配置初始化 + cfg.InitLog() //日志初始化 + cfg.InitCache() //缓存初始化 + cfg.InitCacheSecond() //缓存初始化 + cfg.InitMq() //缓存初始化 + cfg.InitEs() //ElasticSearch初始化 + if cfg.Debug { //判断是否是debug + if err := db.InitDB(cfg.DB); err != nil { //主数据库初始化 + panic(err) + } + if err := db.InitZhimengDB(cfg.ZhimengDB); err != nil { + panic(err) + } + channel := make(chan int, 0) //开辟管道,缓冲为 + go db.InitDBs(channel) + <-channel + } + fmt.Println("init success") + +} + +// @title 智莺生活移动端接口 +// @version 1.0 +// @description 移动端接口 +// @termsOfService 智莺生活后端组 +// @contact.name sherlockwhite +// @host localhost:5000 +// @securityDefinitions.apikey MasterID +// @in header +// @name MasterID +// @BasePath / +func main() { + // 启动获取所有品牌 + //go taoke.GetAllBrand() + r := router.Init() //创建路由 + // arkid.Init() + srv := &http.Server{ //设置http服务参数 + Addr: cfg.SrvAddr, //指定ip和端口 + Handler: r, //指定路由 + } + // 读取默认站长的推广位 并写进redis + // master, err := db.UserProfileFindByID(,"1") + + // if err != nil { + // panic(err) + // } + if cfg.CurlDebug { + utils.CurlDebug = true + } + // + // if has := cache.SetJson(svc.SysCfgGet(nil, "app_name")+"_default_pid_user", master, 0); has != true { + // panic(errors.New("设置默认pid缓存失败")) + // } + // Initializing the server in a goroutine so that it won't block the graceful shutdown handling below + go func() { //协程启动监听http服务 + fmt.Println("Listening and serving HTTP on " + cfg.SrvAddr) + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatalf("listen: %s\n", err) + } + }() + + /*go func() { + _ = http.ListenAndServe("0.0.0.0:6060", nil) + }()*/ + // graceful shutdown + //退出go守护进程 + quit := make(chan os.Signal) + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + <-quit + log.Println("Shutting down server...") + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil { + log.Fatal("Server forced to shutdown:", err) + } + log.Println("Server exiting") + +} diff --git a/pkg/pb/im.business.ext.pb.go b/pkg/pb/im.business.ext.pb.go new file mode 100644 index 0000000..6a43688 --- /dev/null +++ b/pkg/pb/im.business.ext.pb.go @@ -0,0 +1,1853 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.0--rc1 +// source: im.business.ext.proto + +package pb + +import ( + "context" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoimpl" + "reflect" + "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// 消息类型 +type ComplainType int32 + +const ( + ComplainType_CT_UNKNOWN ComplainType = 0 // 未知 + ComplainType_CT_GAMBLE ComplainType = 1 // 存在赌博行为 + ComplainType_MT_DEFRAUD ComplainType = 2 // 存在骗钱行为 + ComplainType_MT_HARASS ComplainType = 3 // 不当信息骚扰 + ComplainType_MT_RUMOUR ComplainType = 4 // 传播谣言 + ComplainType_MT_COUNTERFEIT_GOODS_INFO ComplainType = 5 // 发布假冒商品信息 + ComplainType_MT_VIOLATION_OF_MINORS ComplainType = 6 // 侵犯未成年人权益 + ComplainType_MT_OTHER ComplainType = 7 // 其他 +) + +// Enum value maps for ComplainType. +var ( + ComplainType_name = map[int32]string{ + 0: "CT_UNKNOWN", + 1: "CT_GAMBLE", + 2: "MT_DEFRAUD", + 3: "MT_HARASS", + 4: "MT_RUMOUR", + 5: "MT_COUNTERFEIT_GOODS_INFO", + 6: "MT_VIOLATION_OF_MINORS", + 7: "MT_OTHER", + } + ComplainType_value = map[string]int32{ + "CT_UNKNOWN": 0, + "CT_GAMBLE": 1, + "MT_DEFRAUD": 2, + "MT_HARASS": 3, + "MT_RUMOUR": 4, + "MT_COUNTERFEIT_GOODS_INFO": 5, + "MT_VIOLATION_OF_MINORS": 6, + "MT_OTHER": 7, + } +) + +func (x ComplainType) Enum() *ComplainType { + p := new(ComplainType) + *p = x + return p +} + +func (x ComplainType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ComplainType) Descriptor() protoreflect.EnumDescriptor { + return file_business_ext_proto_enumTypes[0].Descriptor() +} + +func (ComplainType) Type() protoreflect.EnumType { + return &file_business_ext_proto_enumTypes[0] +} + +func (x ComplainType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ComplainType.Descriptor instead. +func (ComplainType) EnumDescriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{0} +} + +type ComplainGroupReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + ComplainType ComplainType `protobuf:"varint,2,opt,name=complain_type,json=complainType,proto3,enum=pb.ComplainType" json:"complain_type,omitempty"` // 投诉类型 + Text string `protobuf:"bytes,3,opt,name=text,proto3" json:"text,omitempty"` // 投诉内容 + ImageList []string `protobuf:"bytes,4,rep,name=image_list,json=imageList,proto3" json:"image_list,omitempty"` // 图片 +} + +func (x *ComplainGroupReq) Reset() { + *x = ComplainGroupReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComplainGroupReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComplainGroupReq) ProtoMessage() {} + +func (x *ComplainGroupReq) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComplainGroupReq.ProtoReflect.Descriptor instead. +func (*ComplainGroupReq) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{0} +} + +func (x *ComplainGroupReq) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +func (x *ComplainGroupReq) GetComplainType() ComplainType { + if x != nil { + return x.ComplainType + } + return ComplainType_CT_UNKNOWN +} + +func (x *ComplainGroupReq) GetText() string { + if x != nil { + return x.Text + } + return "" +} + +func (x *ComplainGroupReq) GetImageList() []string { + if x != nil { + return x.ImageList + } + return nil +} + +type IsFriendsReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserPhone string `protobuf:"bytes,1,opt,name=user_phone,json=userPhone,proto3" json:"user_phone,omitempty"` + FriendPhone string `protobuf:"bytes,2,opt,name=friend_phone,json=friendPhone,proto3" json:"friend_phone,omitempty"` +} + +func (x *IsFriendsReq) Reset() { + *x = IsFriendsReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IsFriendsReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IsFriendsReq) ProtoMessage() {} + +func (x *IsFriendsReq) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IsFriendsReq.ProtoReflect.Descriptor instead. +func (*IsFriendsReq) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{1} +} + +func (x *IsFriendsReq) GetUserPhone() string { + if x != nil { + return x.UserPhone + } + return "" +} + +func (x *IsFriendsReq) GetFriendPhone() string { + if x != nil { + return x.FriendPhone + } + return "" +} + +type IsFriendsResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsFriend int64 `protobuf:"varint,1,opt,name=is_friend,json=isFriend,proto3" json:"is_friend,omitempty"` + User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` // 用户信息 +} + +func (x *IsFriendsResp) Reset() { + *x = IsFriendsResp{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IsFriendsResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IsFriendsResp) ProtoMessage() {} + +func (x *IsFriendsResp) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IsFriendsResp.ProtoReflect.Descriptor instead. +func (*IsFriendsResp) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{2} +} + +func (x *IsFriendsResp) GetIsFriend() int64 { + if x != nil { + return x.IsFriend + } + return 0 +} + +func (x *IsFriendsResp) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +type Emoticon struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // 名称 + ImgUrl string `protobuf:"bytes,2,opt,name=img_url,json=imgUrl,proto3" json:"img_url,omitempty"` // 图片地址 + Memo string `protobuf:"bytes,3,opt,name=memo,proto3" json:"memo,omitempty"` // 备注 + Sort int32 `protobuf:"varint,4,opt,name=sort,proto3" json:"sort,omitempty"` // 排序 +} + +func (x *Emoticon) Reset() { + *x = Emoticon{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Emoticon) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Emoticon) ProtoMessage() {} + +func (x *Emoticon) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Emoticon.ProtoReflect.Descriptor instead. +func (*Emoticon) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{3} +} + +func (x *Emoticon) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Emoticon) GetImgUrl() string { + if x != nil { + return x.ImgUrl + } + return "" +} + +func (x *Emoticon) GetMemo() string { + if x != nil { + return x.Memo + } + return "" +} + +func (x *Emoticon) GetSort() int32 { + if x != nil { + return x.Sort + } + return 0 +} + +type EmoticonListResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Emoticons []*Emoticon `protobuf:"bytes,1,rep,name=emoticons,proto3" json:"emoticons,omitempty"` +} + +func (x *EmoticonListResp) Reset() { + *x = EmoticonListResp{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EmoticonListResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EmoticonListResp) ProtoMessage() {} + +func (x *EmoticonListResp) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EmoticonListResp.ProtoReflect.Descriptor instead. +func (*EmoticonListResp) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{4} +} + +func (x *EmoticonListResp) GetEmoticons() []*Emoticon { + if x != nil { + return x.Emoticons + } + return nil +} + +type SignInReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PhoneNumber string `protobuf:"bytes,1,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"` // 手机号 + Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` // 验证码 + DeviceId int64 `protobuf:"varint,3,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + MasterId int64 `protobuf:"varint,4,opt,name=master_id,json=masterId,proto3" json:"master_id,omitempty"` // 站长id + PushAlia string `protobuf:"bytes,5,opt,name=push_alia,json=pushAlia,proto3" json:"push_alia,omitempty"` // 极光推送-别名 + Nickname string `protobuf:"bytes,6,opt,name=nickname,proto3" json:"nickname,omitempty"` // 昵称 + AvatarUrl string `protobuf:"bytes,7,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像地址 +} + +func (x *SignInReq) Reset() { + *x = SignInReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignInReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignInReq) ProtoMessage() {} + +func (x *SignInReq) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignInReq.ProtoReflect.Descriptor instead. +func (*SignInReq) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{5} +} + +func (x *SignInReq) GetPhoneNumber() string { + if x != nil { + return x.PhoneNumber + } + return "" +} + +func (x *SignInReq) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +func (x *SignInReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *SignInReq) GetMasterId() int64 { + if x != nil { + return x.MasterId + } + return 0 +} + +func (x *SignInReq) GetPushAlia() string { + if x != nil { + return x.PushAlia + } + return "" +} + +func (x *SignInReq) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *SignInReq) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +type SignInResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsNew bool `protobuf:"varint,1,opt,name=is_new,json=isNew,proto3" json:"is_new,omitempty"` // 是否是新用户 + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` // token + MasterId int64 `protobuf:"varint,4,opt,name=master_id,json=masterId,proto3" json:"master_id,omitempty"` // 站长id +} + +func (x *SignInResp) Reset() { + *x = SignInResp{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignInResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignInResp) ProtoMessage() {} + +func (x *SignInResp) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignInResp.ProtoReflect.Descriptor instead. +func (*SignInResp) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{6} +} + +func (x *SignInResp) GetIsNew() bool { + if x != nil { + return x.IsNew + } + return false +} + +func (x *SignInResp) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *SignInResp) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *SignInResp) GetMasterId() int64 { + if x != nil { + return x.MasterId + } + return 0 +} + +type CloudUploadFileReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Dir string `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"` // 目录名 + FileName string `protobuf:"bytes,2,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` // 上传原文件名称 + FileSize string `protobuf:"bytes,3,opt,name=file_size,json=fileSize,proto3" json:"file_size,omitempty"` // 文件大小 +} + +func (x *CloudUploadFileReq) Reset() { + *x = CloudUploadFileReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CloudUploadFileReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloudUploadFileReq) ProtoMessage() {} + +func (x *CloudUploadFileReq) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CloudUploadFileReq.ProtoReflect.Descriptor instead. +func (*CloudUploadFileReq) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{7} +} + +func (x *CloudUploadFileReq) GetDir() string { + if x != nil { + return x.Dir + } + return "" +} + +func (x *CloudUploadFileReq) GetFileName() string { + if x != nil { + return x.FileName + } + return "" +} + +func (x *CloudUploadFileReq) GetFileSize() string { + if x != nil { + return x.FileSize + } + return "" +} + +type CloudUploadFileResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Method string `protobuf:"bytes,1,opt,name=method,proto3" json:"method,omitempty"` // 请求方式 + Host string `protobuf:"bytes,2,opt,name=host,proto3" json:"host,omitempty"` // 域名 + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` // key + Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` // token +} + +func (x *CloudUploadFileResp) Reset() { + *x = CloudUploadFileResp{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CloudUploadFileResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CloudUploadFileResp) ProtoMessage() {} + +func (x *CloudUploadFileResp) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CloudUploadFileResp.ProtoReflect.Descriptor instead. +func (*CloudUploadFileResp) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{8} +} + +func (x *CloudUploadFileResp) GetMethod() string { + if x != nil { + return x.Method + } + return "" +} + +func (x *CloudUploadFileResp) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + +func (x *CloudUploadFileResp) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *CloudUploadFileResp) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + Nickname string `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"` // 昵称 + Sex int32 `protobuf:"varint,3,opt,name=sex,proto3" json:"sex,omitempty"` // 性别 + AvatarUrl string `protobuf:"bytes,4,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像地址 + Extra string `protobuf:"bytes,5,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 + CreateTime int64 `protobuf:"varint,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // 创建时间 + UpdateTime int64 `protobuf:"varint,7,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // 更新时间 + MasterId int64 `protobuf:"varint,8,opt,name=master_id,json=masterId,proto3" json:"master_id,omitempty"` // 站长id + IsAutoAddedFriends int64 `protobuf:"varint,9,opt,name=is_auto_added_friends,json=isAutoAddedFriends,proto3" json:"is_auto_added_friends,omitempty"` // 是否自动被添加好友 + PhoneNumber string `protobuf:"bytes,10,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"` // 手机号 +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{9} +} + +func (x *User) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *User) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *User) GetSex() int32 { + if x != nil { + return x.Sex + } + return 0 +} + +func (x *User) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *User) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +func (x *User) GetCreateTime() int64 { + if x != nil { + return x.CreateTime + } + return 0 +} + +func (x *User) GetUpdateTime() int64 { + if x != nil { + return x.UpdateTime + } + return 0 +} + +func (x *User) GetMasterId() int64 { + if x != nil { + return x.MasterId + } + return 0 +} + +func (x *User) GetIsAutoAddedFriends() int64 { + if x != nil { + return x.IsAutoAddedFriends + } + return 0 +} + +func (x *User) GetPhoneNumber() string { + if x != nil { + return x.PhoneNumber + } + return "" +} + +type GetUserReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + Phone string `protobuf:"bytes,2,opt,name=phone,proto3" json:"phone,omitempty"` // 用户手机号 +} + +func (x *GetUserReq) Reset() { + *x = GetUserReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUserReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUserReq) ProtoMessage() {} + +func (x *GetUserReq) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUserReq.ProtoReflect.Descriptor instead. +func (*GetUserReq) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{10} +} + +func (x *GetUserReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *GetUserReq) GetPhone() string { + if x != nil { + return x.Phone + } + return "" +} + +type GetUserResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // 用户信息 +} + +func (x *GetUserResp) Reset() { + *x = GetUserResp{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUserResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUserResp) ProtoMessage() {} + +func (x *GetUserResp) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUserResp.ProtoReflect.Descriptor instead. +func (*GetUserResp) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{11} +} + +func (x *GetUserResp) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +type UpdateUserReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nickname string `protobuf:"bytes,1,opt,name=nickname,proto3" json:"nickname,omitempty"` // 昵称 + Sex int32 `protobuf:"varint,2,opt,name=sex,proto3" json:"sex,omitempty"` // 性别 + AvatarUrl string `protobuf:"bytes,3,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像地址 + Extra string `protobuf:"bytes,4,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 +} + +func (x *UpdateUserReq) Reset() { + *x = UpdateUserReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateUserReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserReq) ProtoMessage() {} + +func (x *UpdateUserReq) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserReq.ProtoReflect.Descriptor instead. +func (*UpdateUserReq) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateUserReq) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *UpdateUserReq) GetSex() int32 { + if x != nil { + return x.Sex + } + return 0 +} + +func (x *UpdateUserReq) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *UpdateUserReq) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +type SearchUserReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + MasterId int64 `protobuf:"varint,2,opt,name=master_id,json=masterId,proto3" json:"master_id,omitempty"` +} + +func (x *SearchUserReq) Reset() { + *x = SearchUserReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SearchUserReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchUserReq) ProtoMessage() {} + +func (x *SearchUserReq) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchUserReq.ProtoReflect.Descriptor instead. +func (*SearchUserReq) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{13} +} + +func (x *SearchUserReq) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *SearchUserReq) GetMasterId() int64 { + if x != nil { + return x.MasterId + } + return 0 +} + +type SearchUserResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` +} + +func (x *SearchUserResp) Reset() { + *x = SearchUserResp{} + if protoimpl.UnsafeEnabled { + mi := &file_business_ext_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SearchUserResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchUserResp) ProtoMessage() {} + +func (x *SearchUserResp) ProtoReflect() protoreflect.Message { + mi := &file_business_ext_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchUserResp.ProtoReflect.Descriptor instead. +func (*SearchUserResp) Descriptor() ([]byte, []int) { + return file_business_ext_proto_rawDescGZIP(), []int{14} +} + +func (x *SearchUserResp) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +var File_business_ext_proto protoreflect.FileDescriptor + +var file_business_ext_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x01, 0x0a, 0x10, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, + 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x0d, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x22, 0x50, 0x0a, 0x0c, 0x49, 0x73, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x73, 0x52, 0x65, 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x68, 0x6f, + 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x50, 0x68, + 0x6f, 0x6e, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x22, 0x4a, 0x0a, 0x0d, 0x49, 0x73, 0x46, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x66, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x69, 0x73, 0x46, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x22, 0x5f, 0x0a, 0x08, 0x45, 0x6d, 0x6f, 0x74, 0x69, 0x63, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x6d, 0x67, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x67, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6d, + 0x65, 0x6d, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, + 0x6f, 0x72, 0x74, 0x22, 0x3e, 0x0a, 0x10, 0x45, 0x6d, 0x6f, 0x74, 0x69, 0x63, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x09, 0x65, 0x6d, 0x6f, 0x74, 0x69, + 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x6f, 0x74, 0x69, 0x63, 0x6f, 0x6e, 0x52, 0x09, 0x65, 0x6d, 0x6f, 0x74, 0x69, 0x63, + 0x6f, 0x6e, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x52, 0x65, + 0x71, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x73, 0x68, 0x41, 0x6c, 0x69, 0x61, 0x12, + 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x22, 0x6f, 0x0a, 0x0a, 0x53, 0x69, + 0x67, 0x6e, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x6e, + 0x65, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x12, + 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x60, 0x0a, 0x12, 0x43, + 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x64, 0x69, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x69, 0x0a, + 0x13, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb7, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, + 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, + 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x78, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x03, 0x73, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, + 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x12, 0x1f, 0x0a, + 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x15, + 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x66, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x69, 0x73, 0x41, + 0x75, 0x74, 0x6f, 0x41, 0x64, 0x64, 0x65, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x3b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, + 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x22, + 0x2b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1c, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x70, + 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x72, 0x0a, 0x0d, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, + 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x73, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x22, 0x3e, 0x0a, 0x0d, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x22, 0x30, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x1e, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x2a, 0xa4, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x54, 0x5f, 0x47, 0x41, 0x4d, 0x42, 0x4c, 0x45, + 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x52, 0x41, 0x55, 0x44, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x54, 0x5f, 0x48, 0x41, 0x52, 0x41, 0x53, 0x53, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x54, 0x5f, 0x52, 0x55, 0x4d, 0x4f, 0x55, 0x52, 0x10, 0x04, + 0x12, 0x1d, 0x0a, 0x19, 0x4d, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x45, + 0x49, 0x54, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x53, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x05, 0x12, + 0x1a, 0x0a, 0x16, 0x4d, 0x54, 0x5f, 0x56, 0x49, 0x4f, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x4f, 0x46, 0x5f, 0x4d, 0x49, 0x4e, 0x4f, 0x52, 0x53, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4d, + 0x54, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0x07, 0x32, 0x9c, 0x03, 0x0a, 0x0b, 0x42, 0x75, + 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x45, 0x78, 0x74, 0x12, 0x27, 0x0a, 0x06, 0x53, 0x69, 0x67, + 0x6e, 0x49, 0x6e, 0x12, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, + 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x70, + 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, + 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x0a, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x42, 0x0a, 0x0f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, 0x0c, 0x45, 0x6d, 0x6f, 0x74, 0x69, 0x63, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, + 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x69, 0x63, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x09, 0x49, 0x73, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x73, 0x12, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x73, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x73, 0x46, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x30, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x0d, 0x5a, 0x0b, 0x67, 0x69, 0x6d, 0x2f, + 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_business_ext_proto_rawDescOnce sync.Once + file_business_ext_proto_rawDescData = file_business_ext_proto_rawDesc +) + +func file_business_ext_proto_rawDescGZIP() []byte { + file_business_ext_proto_rawDescOnce.Do(func() { + file_business_ext_proto_rawDescData = protoimpl.X.CompressGZIP(file_business_ext_proto_rawDescData) + }) + return file_business_ext_proto_rawDescData +} + +var file_business_ext_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_business_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_business_ext_proto_goTypes = []interface{}{ + (ComplainType)(0), // 0: pb.ComplainType + (*ComplainGroupReq)(nil), // 1: pb.ComplainGroupReq + (*IsFriendsReq)(nil), // 2: pb.IsFriendsReq + (*IsFriendsResp)(nil), // 3: pb.IsFriendsResp + (*Emoticon)(nil), // 4: pb.Emoticon + (*EmoticonListResp)(nil), // 5: pb.EmoticonListResp + (*SignInReq)(nil), // 6: pb.SignInReq + (*SignInResp)(nil), // 7: pb.SignInResp + (*CloudUploadFileReq)(nil), // 8: pb.CloudUploadFileReq + (*CloudUploadFileResp)(nil), // 9: pb.CloudUploadFileResp + (*User)(nil), // 10: pb.User + (*GetUserReq)(nil), // 11: pb.GetUserReq + (*GetUserResp)(nil), // 12: pb.GetUserResp + (*UpdateUserReq)(nil), // 13: pb.UpdateUserReq + (*SearchUserReq)(nil), // 14: pb.SearchUserReq + (*SearchUserResp)(nil), // 15: pb.SearchUserResp + (*Empty)(nil), // 16: pb.Empty +} +var file_business_ext_proto_depIdxs = []int32{ + 0, // 0: pb.ComplainGroupReq.complain_type:type_name -> pb.ComplainType + 10, // 1: pb.IsFriendsResp.user:type_name -> pb.User + 4, // 2: pb.EmoticonListResp.emoticons:type_name -> pb.Emoticon + 10, // 3: pb.GetUserResp.user:type_name -> pb.User + 10, // 4: pb.SearchUserResp.users:type_name -> pb.User + 6, // 5: pb.BusinessExt.SignIn:input_type -> pb.SignInReq + 11, // 6: pb.BusinessExt.GetUser:input_type -> pb.GetUserReq + 13, // 7: pb.BusinessExt.UpdateUser:input_type -> pb.UpdateUserReq + 14, // 8: pb.BusinessExt.SearchUser:input_type -> pb.SearchUserReq + 8, // 9: pb.BusinessExt.CloudUploadFile:input_type -> pb.CloudUploadFileReq + 16, // 10: pb.BusinessExt.EmoticonList:input_type -> pb.Empty + 2, // 11: pb.BusinessExt.IsFriends:input_type -> pb.IsFriendsReq + 1, // 12: pb.BusinessExt.ComplainGroup:input_type -> pb.ComplainGroupReq + 7, // 13: pb.BusinessExt.SignIn:output_type -> pb.SignInResp + 12, // 14: pb.BusinessExt.GetUser:output_type -> pb.GetUserResp + 16, // 15: pb.BusinessExt.UpdateUser:output_type -> pb.Empty + 15, // 16: pb.BusinessExt.SearchUser:output_type -> pb.SearchUserResp + 9, // 17: pb.BusinessExt.CloudUploadFile:output_type -> pb.CloudUploadFileResp + 5, // 18: pb.BusinessExt.EmoticonList:output_type -> pb.EmoticonListResp + 3, // 19: pb.BusinessExt.IsFriends:output_type -> pb.IsFriendsResp + 16, // 20: pb.BusinessExt.ComplainGroup:output_type -> pb.Empty + 13, // [13:21] is the sub-list for method output_type + 5, // [5:13] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_business_ext_proto_init() } +func file_business_ext_proto_init() { + if File_business_ext_proto != nil { + return + } + file_common_ext_proto_init() + if !protoimpl.UnsafeEnabled { + file_business_ext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComplainGroupReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IsFriendsReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IsFriendsResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Emoticon); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EmoticonListResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignInReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignInResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CloudUploadFileReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CloudUploadFileResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUserReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUserResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateUserReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchUserReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_ext_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchUserResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_business_ext_proto_rawDesc, + NumEnums: 1, + NumMessages: 15, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_business_ext_proto_goTypes, + DependencyIndexes: file_business_ext_proto_depIdxs, + EnumInfos: file_business_ext_proto_enumTypes, + MessageInfos: file_business_ext_proto_msgTypes, + }.Build() + File_business_ext_proto = out.File + file_business_ext_proto_rawDesc = nil + file_business_ext_proto_goTypes = nil + file_business_ext_proto_depIdxs = nil +} + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// BusinessExtClient is the client API for BusinessExt service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type BusinessExtClient interface { + // 登录 + SignIn(ctx context.Context, in *SignInReq, opts ...grpc.CallOption) (*SignInResp, error) + // 获取用户信息 + GetUser(ctx context.Context, in *GetUserReq, opts ...grpc.CallOption) (*GetUserResp, error) + // 更新用户信息 + UpdateUser(ctx context.Context, in *UpdateUserReq, opts ...grpc.CallOption) (*Empty, error) + // 搜索用户(这里简单数据库实现,生产环境建议使用ES) + SearchUser(ctx context.Context, in *SearchUserReq, opts ...grpc.CallOption) (*SearchUserResp, error) + // 上传文件至云端 + CloudUploadFile(ctx context.Context, in *CloudUploadFileReq, opts ...grpc.CallOption) (*CloudUploadFileResp, error) + // 获取表情 + EmoticonList(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*EmoticonListResp, error) + // 判断是否为好友关系 + IsFriends(ctx context.Context, in *IsFriendsReq, opts ...grpc.CallOption) (*IsFriendsResp, error) + // 投诉群 + ComplainGroup(ctx context.Context, in *ComplainGroupReq, opts ...grpc.CallOption) (*Empty, error) +} + +type businessExtClient struct { + cc grpc.ClientConnInterface +} + +func NewBusinessExtClient(cc grpc.ClientConnInterface) BusinessExtClient { + return &businessExtClient{cc} +} + +func (c *businessExtClient) SignIn(ctx context.Context, in *SignInReq, opts ...grpc.CallOption) (*SignInResp, error) { + out := new(SignInResp) + err := c.cc.Invoke(ctx, "/pb.BusinessExt/SignIn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessExtClient) GetUser(ctx context.Context, in *GetUserReq, opts ...grpc.CallOption) (*GetUserResp, error) { + out := new(GetUserResp) + err := c.cc.Invoke(ctx, "/pb.BusinessExt/GetUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessExtClient) UpdateUser(ctx context.Context, in *UpdateUserReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.BusinessExt/UpdateUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessExtClient) SearchUser(ctx context.Context, in *SearchUserReq, opts ...grpc.CallOption) (*SearchUserResp, error) { + out := new(SearchUserResp) + err := c.cc.Invoke(ctx, "/pb.BusinessExt/SearchUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessExtClient) CloudUploadFile(ctx context.Context, in *CloudUploadFileReq, opts ...grpc.CallOption) (*CloudUploadFileResp, error) { + out := new(CloudUploadFileResp) + err := c.cc.Invoke(ctx, "/pb.BusinessExt/CloudUploadFile", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessExtClient) EmoticonList(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*EmoticonListResp, error) { + out := new(EmoticonListResp) + err := c.cc.Invoke(ctx, "/pb.BusinessExt/EmoticonList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessExtClient) IsFriends(ctx context.Context, in *IsFriendsReq, opts ...grpc.CallOption) (*IsFriendsResp, error) { + out := new(IsFriendsResp) + err := c.cc.Invoke(ctx, "/pb.BusinessExt/IsFriends", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessExtClient) ComplainGroup(ctx context.Context, in *ComplainGroupReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.BusinessExt/ComplainGroup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BusinessExtServer is the server API for BusinessExt service. +// All implementations must embed UnimplementedBusinessExtServer +// for forward compatibility +type BusinessExtServer interface { + // 登录 + SignIn(context.Context, *SignInReq) (*SignInResp, error) + // 获取用户信息 + GetUser(context.Context, *GetUserReq) (*GetUserResp, error) + // 更新用户信息 + UpdateUser(context.Context, *UpdateUserReq) (*Empty, error) + // 搜索用户(这里简单数据库实现,生产环境建议使用ES) + SearchUser(context.Context, *SearchUserReq) (*SearchUserResp, error) + // 上传文件至云端 + CloudUploadFile(context.Context, *CloudUploadFileReq) (*CloudUploadFileResp, error) + // 获取表情 + EmoticonList(context.Context, *Empty) (*EmoticonListResp, error) + // 判断是否为好友关系 + IsFriends(context.Context, *IsFriendsReq) (*IsFriendsResp, error) + // 投诉群 + ComplainGroup(context.Context, *ComplainGroupReq) (*Empty, error) +} + +// UnimplementedBusinessExtServer must be embedded to have forward compatible implementations. +type UnimplementedBusinessExtServer struct { +} + +func (UnimplementedBusinessExtServer) SignIn(context.Context, *SignInReq) (*SignInResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignIn not implemented") +} +func (UnimplementedBusinessExtServer) GetUser(context.Context, *GetUserReq) (*GetUserResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") +} +func (UnimplementedBusinessExtServer) UpdateUser(context.Context, *UpdateUserReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") +} +func (UnimplementedBusinessExtServer) SearchUser(context.Context, *SearchUserReq) (*SearchUserResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SearchUser not implemented") +} +func (UnimplementedBusinessExtServer) CloudUploadFile(context.Context, *CloudUploadFileReq) (*CloudUploadFileResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method CloudUploadFile not implemented") +} +func (UnimplementedBusinessExtServer) EmoticonList(context.Context, *Empty) (*EmoticonListResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method EmoticonList not implemented") +} +func (UnimplementedBusinessExtServer) IsFriends(context.Context, *IsFriendsReq) (*IsFriendsResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method IsFriends not implemented") +} +func (UnimplementedBusinessExtServer) ComplainGroup(context.Context, *ComplainGroupReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method ComplainGroup not implemented") +} + +func RegisterBusinessExtServer(s grpc.ServiceRegistrar, srv BusinessExtServer) { + s.RegisterService(&BusinessExt_ServiceDesc, srv) +} + +func _BusinessExt_SignIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignInReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessExtServer).SignIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessExt/SignIn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessExtServer).SignIn(ctx, req.(*SignInReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessExt_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetUserReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessExtServer).GetUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessExt/GetUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessExtServer).GetUser(ctx, req.(*GetUserReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessExt_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateUserReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessExtServer).UpdateUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessExt/UpdateUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessExtServer).UpdateUser(ctx, req.(*UpdateUserReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessExt_SearchUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SearchUserReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessExtServer).SearchUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessExt/SearchUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessExtServer).SearchUser(ctx, req.(*SearchUserReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessExt_CloudUploadFile_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CloudUploadFileReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessExtServer).CloudUploadFile(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessExt/CloudUploadFile", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessExtServer).CloudUploadFile(ctx, req.(*CloudUploadFileReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessExt_EmoticonList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessExtServer).EmoticonList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessExt/EmoticonList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessExtServer).EmoticonList(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessExt_IsFriends_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IsFriendsReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessExtServer).IsFriends(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessExt/IsFriends", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessExtServer).IsFriends(ctx, req.(*IsFriendsReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessExt_ComplainGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComplainGroupReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessExtServer).ComplainGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessExt/ComplainGroup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessExtServer).ComplainGroup(ctx, req.(*ComplainGroupReq)) + } + return interceptor(ctx, in, info, handler) +} + +// BusinessExt_ServiceDesc is the grpc.ServiceDesc for BusinessExt service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var BusinessExt_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "pb.BusinessExt", + HandlerType: (*BusinessExtServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "SignIn", + Handler: _BusinessExt_SignIn_Handler, + }, + { + MethodName: "GetUser", + Handler: _BusinessExt_GetUser_Handler, + }, + { + MethodName: "UpdateUser", + Handler: _BusinessExt_UpdateUser_Handler, + }, + { + MethodName: "SearchUser", + Handler: _BusinessExt_SearchUser_Handler, + }, + { + MethodName: "CloudUploadFile", + Handler: _BusinessExt_CloudUploadFile_Handler, + }, + { + MethodName: "EmoticonList", + Handler: _BusinessExt_EmoticonList_Handler, + }, + { + MethodName: "IsFriends", + Handler: _BusinessExt_IsFriends_Handler, + }, + { + MethodName: "ComplainGroup", + Handler: _BusinessExt_ComplainGroup_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "business.ext.proto", +} diff --git a/pkg/pb/im.business.int.pb.go b/pkg/pb/im.business.int.pb.go new file mode 100644 index 0000000..3a3f110 --- /dev/null +++ b/pkg/pb/im.business.int.pb.go @@ -0,0 +1,595 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.0--rc1 +// source: im.business.int.proto + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type MasterAuthReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MasterId string `protobuf:"bytes,1,opt,name=master_id,json=masterId,proto3" json:"master_id,omitempty"` +} + +func (x *MasterAuthReq) Reset() { + *x = MasterAuthReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_int_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MasterAuthReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MasterAuthReq) ProtoMessage() {} + +func (x *MasterAuthReq) ProtoReflect() protoreflect.Message { + mi := &file_business_int_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MasterAuthReq.ProtoReflect.Descriptor instead. +func (*MasterAuthReq) Descriptor() ([]byte, []int) { + return file_business_int_proto_rawDescGZIP(), []int{0} +} + +func (x *MasterAuthReq) GetMasterId() string { + if x != nil { + return x.MasterId + } + return "" +} + +type AuthReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + DeviceId int64 `protobuf:"varint,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *AuthReq) Reset() { + *x = AuthReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_int_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthReq) ProtoMessage() {} + +func (x *AuthReq) ProtoReflect() protoreflect.Message { + mi := &file_business_int_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AuthReq.ProtoReflect.Descriptor instead. +func (*AuthReq) Descriptor() ([]byte, []int) { + return file_business_int_proto_rawDescGZIP(), []int{1} +} + +func (x *AuthReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *AuthReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *AuthReq) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type GetUsersReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserIds map[int64]int32 `protobuf:"bytes,1,rep,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` // 用户id +} + +func (x *GetUsersReq) Reset() { + *x = GetUsersReq{} + if protoimpl.UnsafeEnabled { + mi := &file_business_int_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUsersReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUsersReq) ProtoMessage() {} + +func (x *GetUsersReq) ProtoReflect() protoreflect.Message { + mi := &file_business_int_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUsersReq.ProtoReflect.Descriptor instead. +func (*GetUsersReq) Descriptor() ([]byte, []int) { + return file_business_int_proto_rawDescGZIP(), []int{2} +} + +func (x *GetUsersReq) GetUserIds() map[int64]int32 { + if x != nil { + return x.UserIds + } + return nil +} + +type GetUsersResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users map[int64]*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // 用户信息 +} + +func (x *GetUsersResp) Reset() { + *x = GetUsersResp{} + if protoimpl.UnsafeEnabled { + mi := &file_business_int_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetUsersResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetUsersResp) ProtoMessage() {} + +func (x *GetUsersResp) ProtoReflect() protoreflect.Message { + mi := &file_business_int_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetUsersResp.ProtoReflect.Descriptor instead. +func (*GetUsersResp) Descriptor() ([]byte, []int) { + return file_business_int_proto_rawDescGZIP(), []int{3} +} + +func (x *GetUsersResp) GetUsers() map[int64]*User { + if x != nil { + return x.Users + } + return nil +} + +var File_business_int_proto protoreflect.FileDescriptor + +var file_business_int_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x62, 0x75, 0x73, 0x69, + 0x6e, 0x65, 0x73, 0x73, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2c, + 0x0a, 0x0d, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x07, + 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x82, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x12, 0x37, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, + 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x31, 0x0a, 0x05, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x1a, 0x42, 0x0a, 0x0a, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x70, 0x62, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x32, 0xb4, 0x01, 0x0a, 0x0b, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x74, + 0x12, 0x2a, 0x0a, 0x0a, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x68, 0x12, 0x11, + 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, + 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x04, + 0x41, 0x75, 0x74, 0x68, 0x12, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, + 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, + 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x42, 0x0d, 0x5a, 0x0b, 0x67, 0x69, 0x6d, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_business_int_proto_rawDescOnce sync.Once + file_business_int_proto_rawDescData = file_business_int_proto_rawDesc +) + +func file_business_int_proto_rawDescGZIP() []byte { + file_business_int_proto_rawDescOnce.Do(func() { + file_business_int_proto_rawDescData = protoimpl.X.CompressGZIP(file_business_int_proto_rawDescData) + }) + return file_business_int_proto_rawDescData +} + +var file_business_int_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_business_int_proto_goTypes = []interface{}{ + (*MasterAuthReq)(nil), // 0: pb.MasterAuthReq + (*AuthReq)(nil), // 1: pb.AuthReq + (*GetUsersReq)(nil), // 2: pb.GetUsersReq + (*GetUsersResp)(nil), // 3: pb.GetUsersResp + nil, // 4: pb.GetUsersReq.UserIdsEntry + nil, // 5: pb.GetUsersResp.UsersEntry + (*User)(nil), // 6: pb.User + (*GetUserReq)(nil), // 7: pb.GetUserReq + (*Empty)(nil), // 8: pb.Empty + (*GetUserResp)(nil), // 9: pb.GetUserResp +} +var file_business_int_proto_depIdxs = []int32{ + 4, // 0: pb.GetUsersReq.user_ids:type_name -> pb.GetUsersReq.UserIdsEntry + 5, // 1: pb.GetUsersResp.users:type_name -> pb.GetUsersResp.UsersEntry + 6, // 2: pb.GetUsersResp.UsersEntry.value:type_name -> pb.User + 0, // 3: pb.BusinessInt.MasterAuth:input_type -> pb.MasterAuthReq + 1, // 4: pb.BusinessInt.Auth:input_type -> pb.AuthReq + 7, // 5: pb.BusinessInt.GetUser:input_type -> pb.GetUserReq + 2, // 6: pb.BusinessInt.GetUsers:input_type -> pb.GetUsersReq + 8, // 7: pb.BusinessInt.MasterAuth:output_type -> pb.Empty + 8, // 8: pb.BusinessInt.Auth:output_type -> pb.Empty + 9, // 9: pb.BusinessInt.GetUser:output_type -> pb.GetUserResp + 3, // 10: pb.BusinessInt.GetUsers:output_type -> pb.GetUsersResp + 7, // [7:11] is the sub-list for method output_type + 3, // [3:7] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_business_int_proto_init() } +func file_business_int_proto_init() { + if File_business_int_proto != nil { + return + } + file_common_ext_proto_init() + file_business_ext_proto_init() + if !protoimpl.UnsafeEnabled { + file_business_int_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MasterAuthReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_int_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AuthReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_int_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUsersReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_business_int_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUsersResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_business_int_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_business_int_proto_goTypes, + DependencyIndexes: file_business_int_proto_depIdxs, + MessageInfos: file_business_int_proto_msgTypes, + }.Build() + File_business_int_proto = out.File + file_business_int_proto_rawDesc = nil + file_business_int_proto_goTypes = nil + file_business_int_proto_depIdxs = nil +} + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// BusinessIntClient is the client API for BusinessInt service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type BusinessIntClient interface { + // 站长权限校验 + MasterAuth(ctx context.Context, in *MasterAuthReq, opts ...grpc.CallOption) (*Empty, error) + // 权限校验 + Auth(ctx context.Context, in *AuthReq, opts ...grpc.CallOption) (*Empty, error) + // 批量获取用户信息 + GetUser(ctx context.Context, in *GetUserReq, opts ...grpc.CallOption) (*GetUserResp, error) + // 批量获取用户信息 + GetUsers(ctx context.Context, in *GetUsersReq, opts ...grpc.CallOption) (*GetUsersResp, error) +} + +type businessIntClient struct { + cc grpc.ClientConnInterface +} + +func NewBusinessIntClient(cc grpc.ClientConnInterface) BusinessIntClient { + return &businessIntClient{cc} +} + +func (c *businessIntClient) MasterAuth(ctx context.Context, in *MasterAuthReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.BusinessInt/MasterAuth", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessIntClient) Auth(ctx context.Context, in *AuthReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.BusinessInt/Auth", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessIntClient) GetUser(ctx context.Context, in *GetUserReq, opts ...grpc.CallOption) (*GetUserResp, error) { + out := new(GetUserResp) + err := c.cc.Invoke(ctx, "/pb.BusinessInt/GetUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *businessIntClient) GetUsers(ctx context.Context, in *GetUsersReq, opts ...grpc.CallOption) (*GetUsersResp, error) { + out := new(GetUsersResp) + err := c.cc.Invoke(ctx, "/pb.BusinessInt/GetUsers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BusinessIntServer is the server API for BusinessInt service. +// All implementations must embed UnimplementedBusinessIntServer +// for forward compatibility +type BusinessIntServer interface { + // 站长权限校验 + MasterAuth(context.Context, *MasterAuthReq) (*Empty, error) + // 权限校验 + Auth(context.Context, *AuthReq) (*Empty, error) + // 批量获取用户信息 + GetUser(context.Context, *GetUserReq) (*GetUserResp, error) + // 批量获取用户信息 + GetUsers(context.Context, *GetUsersReq) (*GetUsersResp, error) +} + +// UnimplementedBusinessIntServer must be embedded to have forward compatible implementations. +type UnimplementedBusinessIntServer struct { +} + +func (UnimplementedBusinessIntServer) MasterAuth(context.Context, *MasterAuthReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method MasterAuth not implemented") +} +func (UnimplementedBusinessIntServer) Auth(context.Context, *AuthReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Auth not implemented") +} +func (UnimplementedBusinessIntServer) GetUser(context.Context, *GetUserReq) (*GetUserResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") +} +func (UnimplementedBusinessIntServer) GetUsers(context.Context, *GetUsersReq) (*GetUsersResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") +} + +func RegisterBusinessIntServer(s grpc.ServiceRegistrar, srv BusinessIntServer) { + s.RegisterService(&BusinessInt_ServiceDesc, srv) +} + +func _BusinessInt_MasterAuth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MasterAuthReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessIntServer).MasterAuth(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessInt/MasterAuth", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessIntServer).MasterAuth(ctx, req.(*MasterAuthReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessInt_Auth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessIntServer).Auth(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessInt/Auth", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessIntServer).Auth(ctx, req.(*AuthReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessInt_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetUserReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessIntServer).GetUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessInt/GetUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessIntServer).GetUser(ctx, req.(*GetUserReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _BusinessInt_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetUsersReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BusinessIntServer).GetUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.BusinessInt/GetUsers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BusinessIntServer).GetUsers(ctx, req.(*GetUsersReq)) + } + return interceptor(ctx, in, info, handler) +} + +// BusinessInt_ServiceDesc is the grpc.ServiceDesc for BusinessInt service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var BusinessInt_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "pb.BusinessInt", + HandlerType: (*BusinessIntServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "MasterAuth", + Handler: _BusinessInt_MasterAuth_Handler, + }, + { + MethodName: "Auth", + Handler: _BusinessInt_Auth_Handler, + }, + { + MethodName: "GetUser", + Handler: _BusinessInt_GetUser_Handler, + }, + { + MethodName: "GetUsers", + Handler: _BusinessInt_GetUsers_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "im.business.int.proto", +} diff --git a/pkg/pb/im.common.ext.pb.go b/pkg/pb/im.common.ext.pb.go new file mode 100644 index 0000000..120feaa --- /dev/null +++ b/pkg/pb/im.common.ext.pb.go @@ -0,0 +1,131 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.26.0 +// protoc v3.14.0 +// source: common.ext.proto_back + +package pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_common_ext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_common_ext_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_common_ext_proto_rawDescGZIP(), []int{0} +} + +var File_common_ext_proto protoreflect.FileDescriptor + +var file_common_ext_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, + 0x0d, 0x5a, 0x0b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_common_ext_proto_rawDescOnce sync.Once + file_common_ext_proto_rawDescData = file_common_ext_proto_rawDesc +) + +func file_common_ext_proto_rawDescGZIP() []byte { + file_common_ext_proto_rawDescOnce.Do(func() { + file_common_ext_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_ext_proto_rawDescData) + }) + return file_common_ext_proto_rawDescData +} + +var file_common_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_common_ext_proto_goTypes = []interface{}{ + (*Empty)(nil), // 0: pb.Empty +} +var file_common_ext_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_common_ext_proto_init() } +func file_common_ext_proto_init() { + if File_common_ext_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_common_ext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_common_ext_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_common_ext_proto_goTypes, + DependencyIndexes: file_common_ext_proto_depIdxs, + MessageInfos: file_common_ext_proto_msgTypes, + }.Build() + File_common_ext_proto = out.File + file_common_ext_proto_rawDesc = nil + file_common_ext_proto_goTypes = nil + file_common_ext_proto_depIdxs = nil +} diff --git a/pkg/pb/im.connect.ext.pb.go b/pkg/pb/im.connect.ext.pb.go new file mode 100644 index 0000000..08fca7e --- /dev/null +++ b/pkg/pb/im.connect.ext.pb.go @@ -0,0 +1,2461 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.0--rc1 +// source: connect.ext.proto + +package pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type PackageType int32 + +const ( + PackageType_PT_UNKNOWN PackageType = 0 // 未知 + PackageType_PT_SIGN_IN PackageType = 1 // 设备登录请求 + PackageType_PT_SYNC PackageType = 2 // 消息同步触发 + PackageType_PT_HEARTBEAT PackageType = 3 // 心跳 + PackageType_PT_MESSAGE PackageType = 4 // 消息投递 + PackageType_PT_SUBSCRIBE_ROOM PackageType = 5 // 订阅房间 +) + +// Enum value maps for PackageType. +var ( + PackageType_name = map[int32]string{ + 0: "PT_UNKNOWN", + 1: "PT_SIGN_IN", + 2: "PT_SYNC", + 3: "PT_HEARTBEAT", + 4: "PT_MESSAGE", + 5: "PT_SUBSCRIBE_ROOM", + } + PackageType_value = map[string]int32{ + "PT_UNKNOWN": 0, + "PT_SIGN_IN": 1, + "PT_SYNC": 2, + "PT_HEARTBEAT": 3, + "PT_MESSAGE": 4, + "PT_SUBSCRIBE_ROOM": 5, + } +) + +func (x PackageType) Enum() *PackageType { + p := new(PackageType) + *p = x + return p +} + +func (x PackageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PackageType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[0].Descriptor() +} + +func (PackageType) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[0] +} + +func (x PackageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PackageType.Descriptor instead. +func (PackageType) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{0} +} + +// 消息类型 +type MessageType int32 + +const ( + MessageType_MT_UNKNOWN MessageType = 0 // 未知 + MessageType_MT_TEXT MessageType = 1 // 文本 + MessageType_MT_FACE MessageType = 2 // 表情 + MessageType_MT_VOICE MessageType = 3 // 语音消息 + MessageType_MT_IMAGE MessageType = 4 // 图片 + MessageType_MT_FILE MessageType = 5 // 文件 + MessageType_MT_LOCATION MessageType = 6 // 地理位置 + MessageType_MT_COMMAND MessageType = 7 // 指令推送 + MessageType_MT_CUSTOM MessageType = 8 // 自定义 + MessageType_MT_RECALL MessageType = 9 // 撤回消息 + MessageType_MT_RED_PACKAGE MessageType = 10 // 红包消息 +) + +// Enum value maps for MessageType. +var ( + MessageType_name = map[int32]string{ + 0: "MT_UNKNOWN", + 1: "MT_TEXT", + 2: "MT_FACE", + 3: "MT_VOICE", + 4: "MT_IMAGE", + 5: "MT_FILE", + 6: "MT_LOCATION", + 7: "MT_COMMAND", + 8: "MT_CUSTOM", + 9: "MT_RECALL", + 10: "MT_RED_PACKAGE", + } + MessageType_value = map[string]int32{ + "MT_UNKNOWN": 0, + "MT_TEXT": 1, + "MT_FACE": 2, + "MT_VOICE": 3, + "MT_IMAGE": 4, + "MT_FILE": 5, + "MT_LOCATION": 6, + "MT_COMMAND": 7, + "MT_CUSTOM": 8, + "MT_RECALL": 9, + "MT_RED_PACKAGE": 10, + } +) + +func (x MessageType) Enum() *MessageType { + p := new(MessageType) + *p = x + return p +} + +func (x MessageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MessageType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[1].Descriptor() +} + +func (MessageType) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[1] +} + +func (x MessageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MessageType.Descriptor instead. +func (MessageType) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{1} +} + +// 红包类型 +type RedPacketType int32 + +const ( + RedPacketType_RPT_UNKNOWN RedPacketType = 0 // 未知 + RedPacketType_RPT_FRIEND RedPacketType = 1 // 好友红包 + RedPacketType_RPT_GROUP_NORMAL RedPacketType = 2 // 群组普通红包 + RedPacketType_RPT_GROUP_LUCK RedPacketType = 3 // 群组手气红包 + RedPacketType_RPT_GROUP_SPECIALLY RedPacketType = 4 // 群组专属红包 + RedPacketType_RPT_SYSTEM_FOR RedPacketType = 5 // 系统红包 +) + +// Enum value maps for RedPacketType. +var ( + RedPacketType_name = map[int32]string{ + 0: "RPT_UNKNOWN", + 1: "RPT_FRIEND", + 2: "RPT_GROUP_NORMAL", + 3: "RPT_GROUP_LUCK", + 4: "RPT_GROUP_SPECIALLY", + 5: "RPT_SYSTEM_FOR", + } + RedPacketType_value = map[string]int32{ + "RPT_UNKNOWN": 0, + "RPT_FRIEND": 1, + "RPT_GROUP_NORMAL": 2, + "RPT_GROUP_LUCK": 3, + "RPT_GROUP_SPECIALLY": 4, + "RPT_SYSTEM_FOR": 5, + } +) + +func (x RedPacketType) Enum() *RedPacketType { + p := new(RedPacketType) + *p = x + return p +} + +func (x RedPacketType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RedPacketType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[2].Descriptor() +} + +func (RedPacketType) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[2] +} + +func (x RedPacketType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RedPacketType.Descriptor instead. +func (RedPacketType) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{2} +} + +// 红包消息类型 +type RedPacketMessageType int32 + +const ( + RedPacketMessageType_RMT_UNKNOWN RedPacketMessageType = 0 // 未知 + RedPacketMessageType_RMT_SEND RedPacketMessageType = 1 // 发红包 + RedPacketMessageType_RMT_GRAB RedPacketMessageType = 2 // 抢红包 +) + +// Enum value maps for RedPacketMessageType. +var ( + RedPacketMessageType_name = map[int32]string{ + 0: "RMT_UNKNOWN", + 1: "RMT_SEND", + 2: "RMT_GRAB", + } + RedPacketMessageType_value = map[string]int32{ + "RMT_UNKNOWN": 0, + "RMT_SEND": 1, + "RMT_GRAB": 2, + } +) + +func (x RedPacketMessageType) Enum() *RedPacketMessageType { + p := new(RedPacketMessageType) + *p = x + return p +} + +func (x RedPacketMessageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RedPacketMessageType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[3].Descriptor() +} + +func (RedPacketMessageType) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[3] +} + +func (x RedPacketMessageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RedPacketMessageType.Descriptor instead. +func (RedPacketMessageType) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{3} +} + +// 红包状态类型 +type RedPacketStatusType int32 + +const ( + RedPacketStatusType_RPS_NOT_DRAW RedPacketStatusType = 0 // 未领取 + RedPacketStatusType_RPS_DRAWING RedPacketStatusType = 1 // 领取中 + RedPacketStatusType_RPS_DRAW_OVER RedPacketStatusType = 2 // 领取完 + RedPacketStatusType_RPS_EXPIRE RedPacketStatusType = 3 //已过期 +) + +// Enum value maps for RedPacketStatusType. +var ( + RedPacketStatusType_name = map[int32]string{ + 0: "RPS_NOT_DRAW", + 1: "RPS_DRAWING", + 2: "RPS_DRAW_OVER", + 3: "RPS_EXPIRE", + } + RedPacketStatusType_value = map[string]int32{ + "RPS_NOT_DRAW": 0, + "RPS_DRAWING": 1, + "RPS_DRAW_OVER": 2, + "RPS_EXPIRE": 3, + } +) + +func (x RedPacketStatusType) Enum() *RedPacketStatusType { + p := new(RedPacketStatusType) + *p = x + return p +} + +func (x RedPacketStatusType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RedPacketStatusType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[4].Descriptor() +} + +func (RedPacketStatusType) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[4] +} + +func (x RedPacketStatusType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RedPacketStatusType.Descriptor instead. +func (RedPacketStatusType) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{4} +} + +type ReceiverType int32 + +const ( + ReceiverType_RT_UNKNOWN ReceiverType = 0 // 未知 + ReceiverType_RT_USER ReceiverType = 1 // 用户 + ReceiverType_RT_GROUP ReceiverType = 2 // 群组 + ReceiverType_RT_ROOM ReceiverType = 3 // 房间 +) + +// Enum value maps for ReceiverType. +var ( + ReceiverType_name = map[int32]string{ + 0: "RT_UNKNOWN", + 1: "RT_USER", + 2: "RT_GROUP", + 3: "RT_ROOM", + } + ReceiverType_value = map[string]int32{ + "RT_UNKNOWN": 0, + "RT_USER": 1, + "RT_GROUP": 2, + "RT_ROOM": 3, + } +) + +func (x ReceiverType) Enum() *ReceiverType { + p := new(ReceiverType) + *p = x + return p +} + +func (x ReceiverType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReceiverType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[5].Descriptor() +} + +func (ReceiverType) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[5] +} + +func (x ReceiverType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReceiverType.Descriptor instead. +func (ReceiverType) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{5} +} + +type SenderType int32 + +const ( + SenderType_ST_UNKNOWN SenderType = 0 // 未知的 + SenderType_ST_SYSTEM SenderType = 1 // IM系统 + SenderType_ST_USER SenderType = 2 // 用户 + SenderType_ST_BUSINESS SenderType = 3 // 业务方 +) + +// Enum value maps for SenderType. +var ( + SenderType_name = map[int32]string{ + 0: "ST_UNKNOWN", + 1: "ST_SYSTEM", + 2: "ST_USER", + 3: "ST_BUSINESS", + } + SenderType_value = map[string]int32{ + "ST_UNKNOWN": 0, + "ST_SYSTEM": 1, + "ST_USER": 2, + "ST_BUSINESS": 3, + } +) + +func (x SenderType) Enum() *SenderType { + p := new(SenderType) + *p = x + return p +} + +func (x SenderType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SenderType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[6].Descriptor() +} + +func (SenderType) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[6] +} + +func (x SenderType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SenderType.Descriptor instead. +func (SenderType) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{6} +} + +type MessageStatus int32 + +const ( + MessageStatus_MS_UNKNOWN MessageStatus = 0 // 未知的 + MessageStatus_MS_NORMAL MessageStatus = 1 // 正常的 + MessageStatus_MS_RECALL MessageStatus = 2 // 撤回 +) + +// Enum value maps for MessageStatus. +var ( + MessageStatus_name = map[int32]string{ + 0: "MS_UNKNOWN", + 1: "MS_NORMAL", + 2: "MS_RECALL", + } + MessageStatus_value = map[string]int32{ + "MS_UNKNOWN": 0, + "MS_NORMAL": 1, + "MS_RECALL": 2, + } +) + +func (x MessageStatus) Enum() *MessageStatus { + p := new(MessageStatus) + *p = x + return p +} + +func (x MessageStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MessageStatus) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[7].Descriptor() +} + +func (MessageStatus) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[7] +} + +func (x MessageStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MessageStatus.Descriptor instead. +func (MessageStatus) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{7} +} + +// 群组用户状态 +type GroupUserStatusType int32 + +const ( + GroupUserStatusType_GROUP_USER_STATUS_NORMAL GroupUserStatusType = 0 // 正常 + GroupUserStatusType_GROUP_USER_STATUS_Banned GroupUserStatusType = 1 // 禁言 +) + +// Enum value maps for GroupUserStatusType. +var ( + GroupUserStatusType_name = map[int32]string{ + 0: "GROUP_USER_STATUS_NORMAL", + 1: "GROUP_USER_STATUS_Banned", + } + GroupUserStatusType_value = map[string]int32{ + "GROUP_USER_STATUS_NORMAL": 0, + "GROUP_USER_STATUS_Banned": 1, + } +) + +func (x GroupUserStatusType) Enum() *GroupUserStatusType { + p := new(GroupUserStatusType) + *p = x + return p +} + +func (x GroupUserStatusType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GroupUserStatusType) Descriptor() protoreflect.EnumDescriptor { + return file_connect_ext_proto_enumTypes[8].Descriptor() +} + +func (GroupUserStatusType) Type() protoreflect.EnumType { + return &file_connect_ext_proto_enumTypes[8] +} + +func (x GroupUserStatusType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use GroupUserStatusType.Descriptor instead. +func (GroupUserStatusType) EnumDescriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{8} +} + +// 单条消息投递内容(估算大约100个字节),todo 通知栏提醒 +type Message struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Sender *Sender `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` // 发送者 + ReceiverType ReceiverType `protobuf:"varint,2,opt,name=receiver_type,json=receiverType,proto3,enum=pb.ReceiverType" json:"receiver_type,omitempty"` // 接收者类型,1:user;2:group + ReceiverId int64 `protobuf:"varint,3,opt,name=receiver_id,json=receiverId,proto3" json:"receiver_id,omitempty"` // 用户id或者群组id + ToUserIds []int64 `protobuf:"varint,4,rep,packed,name=to_user_ids,json=toUserIds,proto3" json:"to_user_ids,omitempty"` // 需要@的用户id列表 + MessageType MessageType `protobuf:"varint,5,opt,name=message_type,json=messageType,proto3,enum=pb.MessageType" json:"message_type,omitempty"` // 消息类型 + MessageContent []byte `protobuf:"bytes,6,opt,name=message_content,json=messageContent,proto3" json:"message_content,omitempty"` // 消息内容 + Seq int64 `protobuf:"varint,7,opt,name=seq,proto3" json:"seq,omitempty"` // 用户消息发送序列号 + SendTime int64 `protobuf:"varint,8,opt,name=send_time,json=sendTime,proto3" json:"send_time,omitempty"` // 消息发送时间戳,精确到毫秒 + Status MessageStatus `protobuf:"varint,9,opt,name=status,proto3,enum=pb.MessageStatus" json:"status,omitempty"` // 消息状态 +} + +func (x *Message) Reset() { + *x = Message{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Message) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Message) ProtoMessage() {} + +func (x *Message) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Message.ProtoReflect.Descriptor instead. +func (*Message) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{0} +} + +func (x *Message) GetSender() *Sender { + if x != nil { + return x.Sender + } + return nil +} + +func (x *Message) GetReceiverType() ReceiverType { + if x != nil { + return x.ReceiverType + } + return ReceiverType_RT_UNKNOWN +} + +func (x *Message) GetReceiverId() int64 { + if x != nil { + return x.ReceiverId + } + return 0 +} + +func (x *Message) GetToUserIds() []int64 { + if x != nil { + return x.ToUserIds + } + return nil +} + +func (x *Message) GetMessageType() MessageType { + if x != nil { + return x.MessageType + } + return MessageType_MT_UNKNOWN +} + +func (x *Message) GetMessageContent() []byte { + if x != nil { + return x.MessageContent + } + return nil +} + +func (x *Message) GetSeq() int64 { + if x != nil { + return x.Seq + } + return 0 +} + +func (x *Message) GetSendTime() int64 { + if x != nil { + return x.SendTime + } + return 0 +} + +func (x *Message) GetStatus() MessageStatus { + if x != nil { + return x.Status + } + return MessageStatus_MS_UNKNOWN +} + +type Sender struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SenderType SenderType `protobuf:"varint,1,opt,name=sender_type,json=senderType,proto3,enum=pb.SenderType" json:"sender_type,omitempty"` // 发送者类型,1:系统,2:用户,3:第三方业务系统 + SenderId int64 `protobuf:"varint,2,opt,name=sender_id,json=senderId,proto3" json:"sender_id,omitempty"` // 发送者id + DeviceId int64 `protobuf:"varint,3,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 发送者设备id + AvatarUrl string `protobuf:"bytes,4,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像 + Nickname string `protobuf:"bytes,5,opt,name=nickname,proto3" json:"nickname,omitempty"` // 昵称 + Extra string `protobuf:"bytes,6,opt,name=extra,proto3" json:"extra,omitempty"` // 扩展字段 +} + +func (x *Sender) Reset() { + *x = Sender{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Sender) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Sender) ProtoMessage() {} + +func (x *Sender) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Sender.ProtoReflect.Descriptor instead. +func (*Sender) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{1} +} + +func (x *Sender) GetSenderType() SenderType { + if x != nil { + return x.SenderType + } + return SenderType_ST_UNKNOWN +} + +func (x *Sender) GetSenderId() int64 { + if x != nil { + return x.SenderId + } + return 0 +} + +func (x *Sender) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *Sender) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *Sender) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *Sender) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +// 文本消息 +type Text struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` // 文本消息内容 +} + +func (x *Text) Reset() { + *x = Text{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Text) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Text) ProtoMessage() {} + +func (x *Text) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Text.ProtoReflect.Descriptor instead. +func (*Text) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{2} +} + +func (x *Text) GetText() string { + if x != nil { + return x.Text + } + return "" +} + +// 表情消息 +type Face struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FaceId int64 `protobuf:"varint,1,opt,name=face_id,json=faceId,proto3" json:"face_id,omitempty"` + FaceUrl string `protobuf:"bytes,2,opt,name=face_url,json=faceUrl,proto3" json:"face_url,omitempty"` +} + +func (x *Face) Reset() { + *x = Face{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Face) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Face) ProtoMessage() {} + +func (x *Face) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Face.ProtoReflect.Descriptor instead. +func (*Face) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{3} +} + +func (x *Face) GetFaceId() int64 { + if x != nil { + return x.FaceId + } + return 0 +} + +func (x *Face) GetFaceUrl() string { + if x != nil { + return x.FaceUrl + } + return "" +} + +// 语音消息 +type Voice struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // 语音包id + Size int32 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` // 语音包大小 + Duration int32 `protobuf:"varint,3,opt,name=duration,proto3" json:"duration,omitempty"` // 语音时长 + Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"` // 语音文件URL +} + +func (x *Voice) Reset() { + *x = Voice{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Voice) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Voice) ProtoMessage() {} + +func (x *Voice) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Voice.ProtoReflect.Descriptor instead. +func (*Voice) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{4} +} + +func (x *Voice) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Voice) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *Voice) GetDuration() int32 { + if x != nil { + return x.Duration + } + return 0 +} + +func (x *Voice) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +// 图片消息 +type Image struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // 图片id + Width int32 `protobuf:"varint,2,opt,name=width,proto3" json:"width,omitempty"` // 图片宽度 + Height int32 `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"` // 图片长度 + Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"` // 图片URL + ThumbnailUrl string `protobuf:"bytes,5,opt,name=thumbnail_url,json=thumbnailUrl,proto3" json:"thumbnail_url,omitempty"` // 图片缩略图url +} + +func (x *Image) Reset() { + *x = Image{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Image) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Image) ProtoMessage() {} + +func (x *Image) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Image.ProtoReflect.Descriptor instead. +func (*Image) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{5} +} + +func (x *Image) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Image) GetWidth() int32 { + if x != nil { + return x.Width + } + return 0 +} + +func (x *Image) GetHeight() int32 { + if x != nil { + return x.Height + } + return 0 +} + +func (x *Image) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Image) GetThumbnailUrl() string { + if x != nil { + return x.ThumbnailUrl + } + return "" +} + +// 文件消息 +type File struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int64 `protobuf:"varint,12,opt,name=id,proto3" json:"id,omitempty"` // 文件id + Name string `protobuf:"bytes,13,opt,name=name,proto3" json:"name,omitempty"` // 文件名 + Size int64 `protobuf:"varint,14,opt,name=size,proto3" json:"size,omitempty"` // 文件大小 + Url string `protobuf:"bytes,15,opt,name=url,proto3" json:"url,omitempty"` // 文件url +} + +func (x *File) Reset() { + *x = File{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *File) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*File) ProtoMessage() {} + +func (x *File) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use File.ProtoReflect.Descriptor instead. +func (*File) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{6} +} + +func (x *File) GetId() int64 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *File) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *File) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *File) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +// 地理位置消息 +type Location struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Desc string `protobuf:"bytes,1,opt,name=desc,proto3" json:"desc,omitempty"` // 描述 + Latitude float64 `protobuf:"fixed64,2,opt,name=latitude,proto3" json:"latitude,omitempty"` // 经度 + Longitude float64 `protobuf:"fixed64,3,opt,name=longitude,proto3" json:"longitude,omitempty"` // 纬度 +} + +func (x *Location) Reset() { + *x = Location{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Location) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Location) ProtoMessage() {} + +func (x *Location) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Location.ProtoReflect.Descriptor instead. +func (*Location) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{7} +} + +func (x *Location) GetDesc() string { + if x != nil { + return x.Desc + } + return "" +} + +func (x *Location) GetLatitude() float64 { + if x != nil { + return x.Latitude + } + return 0 +} + +func (x *Location) GetLongitude() float64 { + if x != nil { + return x.Longitude + } + return 0 +} + +// Command 指令推送,1000以下,IM内部用,1000以上,留给业务用 +type Command struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` // 指令码 + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` // 数据内容 +} + +func (x *Command) Reset() { + *x = Command{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Command) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Command) ProtoMessage() {} + +func (x *Command) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Command.ProtoReflect.Descriptor instead. +func (*Command) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{8} +} + +func (x *Command) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *Command) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// 自定义消息 +type Custom struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` // 自定义数据 +} + +func (x *Custom) Reset() { + *x = Custom{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Custom) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Custom) ProtoMessage() {} + +func (x *Custom) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Custom.ProtoReflect.Descriptor instead. +func (*Custom) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{9} +} + +func (x *Custom) GetData() string { + if x != nil { + return x.Data + } + return "" +} + +// 撤回消息 +type RECALL struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RecallSeq int64 `protobuf:"varint,1,opt,name=recall_seq,json=recallSeq,proto3" json:"recall_seq,omitempty"` // 撤回消息seq +} + +func (x *RECALL) Reset() { + *x = RECALL{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RECALL) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RECALL) ProtoMessage() {} + +func (x *RECALL) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RECALL.ProtoReflect.Descriptor instead. +func (*RECALL) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{10} +} + +func (x *RECALL) GetRecallSeq() int64 { + if x != nil { + return x.RecallSeq + } + return 0 +} + +// 红包消息 +type RED_PACKAGE struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RedMessageType RedPacketMessageType `protobuf:"varint,1,opt,name=red_message_type,json=redMessageType,proto3,enum=pb.RedPacketMessageType" json:"red_message_type,omitempty"` // 红包消息类型 + RedPacketType RedPacketType `protobuf:"varint,2,opt,name=red_packet_type,json=redPacketType,proto3,enum=pb.RedPacketType" json:"red_packet_type,omitempty"` // 红包类型 + RedPacketContent string `protobuf:"bytes,3,opt,name=red_packet_content,json=redPacketContent,proto3" json:"red_packet_content,omitempty"` // 红包文字内容 + RedPacketAmount float32 `protobuf:"fixed32,6,opt,name=red_packet_amount,json=redPacketAmount,proto3" json:"red_packet_amount,omitempty"` // 红包金额 + RedPacketNums int32 `protobuf:"varint,5,opt,name=red_packet_nums,json=redPacketNums,proto3" json:"red_packet_nums,omitempty"` // 红包数量 + RedPacketBalanceAmount float32 `protobuf:"fixed32,7,opt,name=red_packet_balance_amount,json=redPacketBalanceAmount,proto3" json:"red_packet_balance_amount,omitempty"` // 红包余额 + ReceivedUserId int64 `protobuf:"varint,8,opt,name=received_user_id,json=receivedUserId,proto3" json:"received_user_id,omitempty"` // 领取用户id + ReceivedUserAmount float32 `protobuf:"fixed32,9,opt,name=received_user_amount,json=receivedUserAmount,proto3" json:"received_user_amount,omitempty"` // 领取用户金额 + ReceivedUserNickname string `protobuf:"bytes,10,opt,name=received_user_nickname,json=receivedUserNickname,proto3" json:"received_user_nickname,omitempty"` // 领取用户昵称 + RedPacketStatusType RedPacketStatusType `protobuf:"varint,11,opt,name=red_packet_status_type,json=redPacketStatusType,proto3,enum=pb.RedPacketStatusType" json:"red_packet_status_type,omitempty"` // 领取状态 + RedPacketId int64 `protobuf:"varint,12,opt,name=red_packet_id,json=redPacketId,proto3" json:"red_packet_id,omitempty"` // 红包id + SendRedPacketUid int64 `protobuf:"varint,13,opt,name=send_red_packet_uid,json=sendRedPacketUid,proto3" json:"send_red_packet_uid,omitempty"` // 红包发送者uid + SendRedPacketNickname string `protobuf:"bytes,14,opt,name=send_red_packet_nickname,json=sendRedPacketNickname,proto3" json:"send_red_packet_nickname,omitempty"` // 红包发送者昵称 + SendRedPacketAvatarUrl string `protobuf:"bytes,15,opt,name=send_red_packet_avatar_url,json=sendRedPacketAvatarUrl,proto3" json:"send_red_packet_avatar_url,omitempty"` // 红包发送者头像 + RedPacketSmallContent string `protobuf:"bytes,16,opt,name=red_packet_small_content,json=redPacketSmallContent,proto3" json:"red_packet_small_content,omitempty"` // 红包小文字内容 + RedPacketCover string `protobuf:"bytes,17,opt,name=red_packet_cover,json=redPacketCover,proto3" json:"red_packet_cover,omitempty"` // 红包封面 +} + +func (x *RED_PACKAGE) Reset() { + *x = RED_PACKAGE{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RED_PACKAGE) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RED_PACKAGE) ProtoMessage() {} + +func (x *RED_PACKAGE) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RED_PACKAGE.ProtoReflect.Descriptor instead. +func (*RED_PACKAGE) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{11} +} + +func (x *RED_PACKAGE) GetRedMessageType() RedPacketMessageType { + if x != nil { + return x.RedMessageType + } + return RedPacketMessageType_RMT_UNKNOWN +} + +func (x *RED_PACKAGE) GetRedPacketType() RedPacketType { + if x != nil { + return x.RedPacketType + } + return RedPacketType_RPT_UNKNOWN +} + +func (x *RED_PACKAGE) GetRedPacketContent() string { + if x != nil { + return x.RedPacketContent + } + return "" +} + +func (x *RED_PACKAGE) GetRedPacketAmount() float32 { + if x != nil { + return x.RedPacketAmount + } + return 0 +} + +func (x *RED_PACKAGE) GetRedPacketNums() int32 { + if x != nil { + return x.RedPacketNums + } + return 0 +} + +func (x *RED_PACKAGE) GetRedPacketBalanceAmount() float32 { + if x != nil { + return x.RedPacketBalanceAmount + } + return 0 +} + +func (x *RED_PACKAGE) GetReceivedUserId() int64 { + if x != nil { + return x.ReceivedUserId + } + return 0 +} + +func (x *RED_PACKAGE) GetReceivedUserAmount() float32 { + if x != nil { + return x.ReceivedUserAmount + } + return 0 +} + +func (x *RED_PACKAGE) GetReceivedUserNickname() string { + if x != nil { + return x.ReceivedUserNickname + } + return "" +} + +func (x *RED_PACKAGE) GetRedPacketStatusType() RedPacketStatusType { + if x != nil { + return x.RedPacketStatusType + } + return RedPacketStatusType_RPS_NOT_DRAW +} + +func (x *RED_PACKAGE) GetRedPacketId() int64 { + if x != nil { + return x.RedPacketId + } + return 0 +} + +func (x *RED_PACKAGE) GetSendRedPacketUid() int64 { + if x != nil { + return x.SendRedPacketUid + } + return 0 +} + +func (x *RED_PACKAGE) GetSendRedPacketNickname() string { + if x != nil { + return x.SendRedPacketNickname + } + return "" +} + +func (x *RED_PACKAGE) GetSendRedPacketAvatarUrl() string { + if x != nil { + return x.SendRedPacketAvatarUrl + } + return "" +} + +func (x *RED_PACKAGE) GetRedPacketSmallContent() string { + if x != nil { + return x.RedPacketSmallContent + } + return "" +} + +func (x *RED_PACKAGE) GetRedPacketCover() string { + if x != nil { + return x.RedPacketCover + } + return "" +} + +// 上行数据 +type Input struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type PackageType `protobuf:"varint,1,opt,name=type,proto3,enum=pb.PackageType" json:"type,omitempty"` // 包的类型 + RequestId int64 `protobuf:"varint,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` // 请求id + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // 数据 +} + +func (x *Input) Reset() { + *x = Input{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Input) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Input) ProtoMessage() {} + +func (x *Input) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Input.ProtoReflect.Descriptor instead. +func (*Input) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{12} +} + +func (x *Input) GetType() PackageType { + if x != nil { + return x.Type + } + return PackageType_PT_UNKNOWN +} + +func (x *Input) GetRequestId() int64 { + if x != nil { + return x.RequestId + } + return 0 +} + +func (x *Input) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// 下行数据 +type Output struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type PackageType `protobuf:"varint,1,opt,name=type,proto3,enum=pb.PackageType" json:"type,omitempty"` // 包的类型 + RequestId int64 `protobuf:"varint,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` // 请求id + Code int32 `protobuf:"varint,3,opt,name=code,proto3" json:"code,omitempty"` // 错误码 + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // 错误信息 + Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` // 数据 +} + +func (x *Output) Reset() { + *x = Output{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Output) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Output) ProtoMessage() {} + +func (x *Output) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Output.ProtoReflect.Descriptor instead. +func (*Output) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{13} +} + +func (x *Output) GetType() PackageType { + if x != nil { + return x.Type + } + return PackageType_PT_UNKNOWN +} + +func (x *Output) GetRequestId() int64 { + if x != nil { + return x.RequestId + } + return 0 +} + +func (x *Output) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *Output) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *Output) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +// 设备登录,package_type:1 +type SignInInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId int64 `protobuf:"varint,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` // 秘钥 +} + +func (x *SignInInput) Reset() { + *x = SignInInput{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignInInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignInInput) ProtoMessage() {} + +func (x *SignInInput) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignInInput.ProtoReflect.Descriptor instead. +func (*SignInInput) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{14} +} + +func (x *SignInInput) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *SignInInput) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *SignInInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +// 消息同步请求,package_type:2 +type SyncInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` // 客户端已经同步的序列号 +} + +func (x *SyncInput) Reset() { + *x = SyncInput{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncInput) ProtoMessage() {} + +func (x *SyncInput) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncInput.ProtoReflect.Descriptor instead. +func (*SyncInput) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{15} +} + +func (x *SyncInput) GetSeq() int64 { + if x != nil { + return x.Seq + } + return 0 +} + +// 消息同步响应,package_type:2 +type SyncOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Messages []*Message `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` // 消息列表 + HasMore bool `protobuf:"varint,2,opt,name=has_more,json=hasMore,proto3" json:"has_more,omitempty"` // 是否有更多数据 +} + +func (x *SyncOutput) Reset() { + *x = SyncOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncOutput) ProtoMessage() {} + +func (x *SyncOutput) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncOutput.ProtoReflect.Descriptor instead. +func (*SyncOutput) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{16} +} + +func (x *SyncOutput) GetMessages() []*Message { + if x != nil { + return x.Messages + } + return nil +} + +func (x *SyncOutput) GetHasMore() bool { + if x != nil { + return x.HasMore + } + return false +} + +// 订阅房间请求 +type SubscribeRoomInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RoomId int64 `protobuf:"varint,1,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` // 房间ID,如果为0,取消房间订阅 + Seq int64 `protobuf:"varint,2,opt,name=seq,proto3" json:"seq,omitempty"` // 消息消息序列号, +} + +func (x *SubscribeRoomInput) Reset() { + *x = SubscribeRoomInput{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeRoomInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeRoomInput) ProtoMessage() {} + +func (x *SubscribeRoomInput) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeRoomInput.ProtoReflect.Descriptor instead. +func (*SubscribeRoomInput) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{17} +} + +func (x *SubscribeRoomInput) GetRoomId() int64 { + if x != nil { + return x.RoomId + } + return 0 +} + +func (x *SubscribeRoomInput) GetSeq() int64 { + if x != nil { + return x.Seq + } + return 0 +} + +// 消息投递,package_type:4 +type MessageSend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message *Message `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` // 消息 +} + +func (x *MessageSend) Reset() { + *x = MessageSend{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageSend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageSend) ProtoMessage() {} + +func (x *MessageSend) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MessageSend.ProtoReflect.Descriptor instead. +func (*MessageSend) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{18} +} + +func (x *MessageSend) GetMessage() *Message { + if x != nil { + return x.Message + } + return nil +} + +// 投递消息回执,package_type:4 +type MessageACK struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceAck int64 `protobuf:"varint,2,opt,name=device_ack,json=deviceAck,proto3" json:"device_ack,omitempty"` // 设备收到消息的确认号 + ReceiveTime int64 `protobuf:"varint,3,opt,name=receive_time,json=receiveTime,proto3" json:"receive_time,omitempty"` // 消息接收时间戳,精确到毫秒 +} + +func (x *MessageACK) Reset() { + *x = MessageACK{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_ext_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageACK) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageACK) ProtoMessage() {} + +func (x *MessageACK) ProtoReflect() protoreflect.Message { + mi := &file_connect_ext_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MessageACK.ProtoReflect.Descriptor instead. +func (*MessageACK) Descriptor() ([]byte, []int) { + return file_connect_ext_proto_rawDescGZIP(), []int{19} +} + +func (x *MessageACK) GetDeviceAck() int64 { + if x != nil { + return x.DeviceAck + } + return 0 +} + +func (x *MessageACK) GetReceiveTime() int64 { + if x != nil { + return x.ReceiveTime + } + return 0 +} + +var File_connect_ext_proto protoreflect.FileDescriptor + +var file_connect_ext_proto_rawDesc = []byte{ + 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0xdc, 0x02, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, + 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1e, 0x0a, 0x0b, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, + 0x32, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x65, 0x71, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x1b, + 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, + 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc4, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x12, 0x2f, 0x0a, 0x0b, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6e, + 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x22, 0x1a, 0x0a, + 0x04, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3a, 0x0a, 0x04, 0x46, 0x61, 0x63, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x06, 0x66, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x61, + 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, + 0x63, 0x65, 0x55, 0x72, 0x6c, 0x22, 0x59, 0x0a, 0x05, 0x56, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, + 0x22, 0x7c, 0x0a, 0x05, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, + 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, + 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x22, 0x50, + 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, + 0x22, 0x58, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x65, 0x73, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, + 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x31, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x1c, 0x0a, + 0x06, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, 0x06, 0x52, + 0x45, 0x43, 0x41, 0x4c, 0x4c, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x5f, + 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x65, 0x63, 0x61, 0x6c, + 0x6c, 0x53, 0x65, 0x71, 0x22, 0xd4, 0x06, 0x0a, 0x0b, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x41, 0x43, + 0x4b, 0x41, 0x47, 0x45, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, + 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0e, 0x72, 0x65, 0x64, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0f, 0x72, 0x65, 0x64, 0x5f, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x72, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x72, 0x65, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, + 0x0f, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x4e, 0x75, 0x6d, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x16, 0x72, 0x65, 0x64, 0x50, 0x61, 0x63, + 0x6b, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x69, + 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x16, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x13, 0x72, 0x65, 0x64, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x22, 0x0a, 0x0d, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x10, 0x73, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x55, 0x69, 0x64, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x64, 0x5f, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x64, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x1a, + 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x16, 0x73, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x37, 0x0a, 0x18, 0x72, 0x65, 0x64, 0x5f, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x64, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x64, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x22, 0x5f, 0x0a, 0x05, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8e, 0x01, 0x0a, + 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x59, 0x0a, + 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x1d, 0x0a, 0x09, 0x53, 0x79, 0x6e, 0x63, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0x50, 0x0a, 0x0a, 0x53, 0x79, 0x6e, 0x63, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x19, + 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x68, 0x61, 0x73, 0x4d, 0x6f, 0x72, 0x65, 0x22, 0x3f, 0x0a, 0x12, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0x34, 0x0a, 0x0b, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x25, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x4e, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x12, 0x1d, + 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x6b, 0x12, 0x21, 0x0a, + 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x2a, 0x73, 0x0a, 0x0b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0e, 0x0a, 0x0a, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x0e, 0x0a, 0x0a, 0x50, 0x54, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x50, 0x54, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, + 0x50, 0x54, 0x5f, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x03, 0x12, 0x0e, + 0x0a, 0x0a, 0x50, 0x54, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x04, 0x12, 0x15, + 0x0a, 0x11, 0x50, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, 0x45, 0x5f, 0x52, + 0x4f, 0x4f, 0x4d, 0x10, 0x05, 0x2a, 0xb3, 0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x54, 0x5f, 0x54, 0x45, 0x58, 0x54, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x54, 0x5f, 0x46, 0x41, 0x43, 0x45, 0x10, 0x02, 0x12, + 0x0c, 0x0a, 0x08, 0x4d, 0x54, 0x5f, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x4d, 0x54, 0x5f, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x4d, + 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x54, 0x5f, 0x4c, + 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x54, 0x5f, + 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x54, 0x5f, + 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x54, 0x5f, 0x52, + 0x45, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x54, 0x5f, 0x52, 0x45, + 0x44, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x41, 0x47, 0x45, 0x10, 0x0a, 0x2a, 0x87, 0x01, 0x0a, 0x0d, + 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, + 0x0b, 0x52, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x52, 0x50, 0x54, 0x5f, 0x46, 0x52, 0x49, 0x45, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x14, + 0x0a, 0x10, 0x52, 0x50, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, + 0x41, 0x4c, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x50, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, + 0x50, 0x5f, 0x4c, 0x55, 0x43, 0x4b, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x50, 0x54, 0x5f, + 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x4c, 0x59, 0x10, + 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x50, 0x54, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, + 0x46, 0x4f, 0x52, 0x10, 0x05, 0x2a, 0x43, 0x0a, 0x14, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, + 0x0b, 0x52, 0x4d, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c, + 0x0a, 0x08, 0x52, 0x4d, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, + 0x52, 0x4d, 0x54, 0x5f, 0x47, 0x52, 0x41, 0x42, 0x10, 0x02, 0x2a, 0x5b, 0x0a, 0x13, 0x52, 0x65, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x50, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x44, 0x52, 0x41, + 0x57, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x50, 0x53, 0x5f, 0x44, 0x52, 0x41, 0x57, 0x49, + 0x4e, 0x47, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x50, 0x53, 0x5f, 0x44, 0x52, 0x41, 0x57, + 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x50, 0x53, 0x5f, 0x45, + 0x58, 0x50, 0x49, 0x52, 0x45, 0x10, 0x03, 0x2a, 0x46, 0x0a, 0x0c, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x54, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x54, 0x5f, 0x55, 0x53, + 0x45, 0x52, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, + 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x54, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x10, 0x03, 0x2a, + 0x49, 0x0a, 0x0a, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, + 0x0a, 0x53, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x53, 0x54, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x54, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x5f, + 0x42, 0x55, 0x53, 0x49, 0x4e, 0x45, 0x53, 0x53, 0x10, 0x03, 0x2a, 0x3d, 0x0a, 0x0d, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, + 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4d, + 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x53, + 0x5f, 0x52, 0x45, 0x43, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x2a, 0x51, 0x0a, 0x13, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1c, 0x0a, 0x18, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x1c, + 0x0a, 0x18, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x10, 0x01, 0x42, 0x0d, 0x5a, 0x0b, + 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_connect_ext_proto_rawDescOnce sync.Once + file_connect_ext_proto_rawDescData = file_connect_ext_proto_rawDesc +) + +func file_connect_ext_proto_rawDescGZIP() []byte { + file_connect_ext_proto_rawDescOnce.Do(func() { + file_connect_ext_proto_rawDescData = protoimpl.X.CompressGZIP(file_connect_ext_proto_rawDescData) + }) + return file_connect_ext_proto_rawDescData +} + +var file_connect_ext_proto_enumTypes = make([]protoimpl.EnumInfo, 9) +var file_connect_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_connect_ext_proto_goTypes = []interface{}{ + (PackageType)(0), // 0: pb.PackageType + (MessageType)(0), // 1: pb.MessageType + (RedPacketType)(0), // 2: pb.RedPacketType + (RedPacketMessageType)(0), // 3: pb.RedPacketMessageType + (RedPacketStatusType)(0), // 4: pb.RedPacketStatusType + (ReceiverType)(0), // 5: pb.ReceiverType + (SenderType)(0), // 6: pb.SenderType + (MessageStatus)(0), // 7: pb.MessageStatus + (GroupUserStatusType)(0), // 8: pb.GroupUserStatusType + (*Message)(nil), // 9: pb.Message + (*Sender)(nil), // 10: pb.Sender + (*Text)(nil), // 11: pb.Text + (*Face)(nil), // 12: pb.Face + (*Voice)(nil), // 13: pb.Voice + (*Image)(nil), // 14: pb.Image + (*File)(nil), // 15: pb.File + (*Location)(nil), // 16: pb.Location + (*Command)(nil), // 17: pb.Command + (*Custom)(nil), // 18: pb.Custom + (*RECALL)(nil), // 19: pb.RECALL + (*RED_PACKAGE)(nil), // 20: pb.RED_PACKAGE + (*Input)(nil), // 21: pb.Input + (*Output)(nil), // 22: pb.Output + (*SignInInput)(nil), // 23: pb.SignInInput + (*SyncInput)(nil), // 24: pb.SyncInput + (*SyncOutput)(nil), // 25: pb.SyncOutput + (*SubscribeRoomInput)(nil), // 26: pb.SubscribeRoomInput + (*MessageSend)(nil), // 27: pb.MessageSend + (*MessageACK)(nil), // 28: pb.MessageACK +} +var file_connect_ext_proto_depIdxs = []int32{ + 10, // 0: pb.Message.sender:type_name -> pb.Sender + 5, // 1: pb.Message.receiver_type:type_name -> pb.ReceiverType + 1, // 2: pb.Message.message_type:type_name -> pb.MessageType + 7, // 3: pb.Message.status:type_name -> pb.MessageStatus + 6, // 4: pb.Sender.sender_type:type_name -> pb.SenderType + 3, // 5: pb.RED_PACKAGE.red_message_type:type_name -> pb.RedPacketMessageType + 2, // 6: pb.RED_PACKAGE.red_packet_type:type_name -> pb.RedPacketType + 4, // 7: pb.RED_PACKAGE.red_packet_status_type:type_name -> pb.RedPacketStatusType + 0, // 8: pb.Input.type:type_name -> pb.PackageType + 0, // 9: pb.Output.type:type_name -> pb.PackageType + 9, // 10: pb.SyncOutput.messages:type_name -> pb.Message + 9, // 11: pb.MessageSend.message:type_name -> pb.Message + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name +} + +func init() { file_connect_ext_proto_init() } +func file_connect_ext_proto_init() { + if File_connect_ext_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_connect_ext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Message); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Sender); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Text); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Face); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Voice); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Image); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*File); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Location); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Command); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Custom); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RECALL); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RED_PACKAGE); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Input); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Output); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignInInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeRoomInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessageSend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_ext_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessageACK); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_connect_ext_proto_rawDesc, + NumEnums: 9, + NumMessages: 20, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_connect_ext_proto_goTypes, + DependencyIndexes: file_connect_ext_proto_depIdxs, + EnumInfos: file_connect_ext_proto_enumTypes, + MessageInfos: file_connect_ext_proto_msgTypes, + }.Build() + File_connect_ext_proto = out.File + file_connect_ext_proto_rawDesc = nil + file_connect_ext_proto_goTypes = nil + file_connect_ext_proto_depIdxs = nil +} diff --git a/pkg/pb/im.connect.int.pb.go b/pkg/pb/im.connect.int.pb.go new file mode 100644 index 0000000..eb72b6d --- /dev/null +++ b/pkg/pb/im.connect.int.pb.go @@ -0,0 +1,395 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.26.0 +// protoc v3.14.0 +// source: connect.int.proto_back + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type DeliverMessageReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId int64 `protobuf:"varint,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + MessageSend *MessageSend `protobuf:"bytes,2,opt,name=message_send,json=messageSend,proto3" json:"message_send,omitempty"` // 数据 +} + +func (x *DeliverMessageReq) Reset() { + *x = DeliverMessageReq{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_int_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeliverMessageReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeliverMessageReq) ProtoMessage() {} + +func (x *DeliverMessageReq) ProtoReflect() protoreflect.Message { + mi := &file_connect_int_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeliverMessageReq.ProtoReflect.Descriptor instead. +func (*DeliverMessageReq) Descriptor() ([]byte, []int) { + return file_connect_int_proto_rawDescGZIP(), []int{0} +} + +func (x *DeliverMessageReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *DeliverMessageReq) GetMessageSend() *MessageSend { + if x != nil { + return x.MessageSend + } + return nil +} + +// 房间推送 +type PushRoomMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RoomId int64 `protobuf:"varint,1,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` // 设备id + MessageSend *MessageSend `protobuf:"bytes,2,opt,name=message_send,json=messageSend,proto3" json:"message_send,omitempty"` // 数据 +} + +func (x *PushRoomMsg) Reset() { + *x = PushRoomMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_int_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushRoomMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushRoomMsg) ProtoMessage() {} + +func (x *PushRoomMsg) ProtoReflect() protoreflect.Message { + mi := &file_connect_int_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushRoomMsg.ProtoReflect.Descriptor instead. +func (*PushRoomMsg) Descriptor() ([]byte, []int) { + return file_connect_int_proto_rawDescGZIP(), []int{1} +} + +func (x *PushRoomMsg) GetRoomId() int64 { + if x != nil { + return x.RoomId + } + return 0 +} + +func (x *PushRoomMsg) GetMessageSend() *MessageSend { + if x != nil { + return x.MessageSend + } + return nil +} + +// 房间推送 +type PushAllMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageSend *MessageSend `protobuf:"bytes,2,opt,name=message_send,json=messageSend,proto3" json:"message_send,omitempty"` // 数据 +} + +func (x *PushAllMsg) Reset() { + *x = PushAllMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_connect_int_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushAllMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushAllMsg) ProtoMessage() {} + +func (x *PushAllMsg) ProtoReflect() protoreflect.Message { + mi := &file_connect_int_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushAllMsg.ProtoReflect.Descriptor instead. +func (*PushAllMsg) Descriptor() ([]byte, []int) { + return file_connect_int_proto_rawDescGZIP(), []int{2} +} + +func (x *PushAllMsg) GetMessageSend() *MessageSend { + if x != nil { + return x.MessageSend + } + return nil +} + +var File_connect_int_proto protoreflect.FileDescriptor + +var file_connect_int_proto_rawDesc = []byte{ + 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x64, 0x0a, 0x11, + 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x32, + 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, + 0x6e, 0x64, 0x22, 0x5a, 0x0a, 0x0b, 0x50, 0x75, 0x73, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x73, + 0x67, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x0c, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6e, + 0x64, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6e, 0x64, 0x22, 0x40, + 0x0a, 0x0a, 0x50, 0x75, 0x73, 0x68, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x12, 0x32, 0x0a, 0x0c, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, + 0x65, 0x6e, 0x64, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6e, 0x64, + 0x32, 0x40, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x12, 0x32, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x42, 0x0d, 0x5a, 0x0b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, + 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_connect_int_proto_rawDescOnce sync.Once + file_connect_int_proto_rawDescData = file_connect_int_proto_rawDesc +) + +func file_connect_int_proto_rawDescGZIP() []byte { + file_connect_int_proto_rawDescOnce.Do(func() { + file_connect_int_proto_rawDescData = protoimpl.X.CompressGZIP(file_connect_int_proto_rawDescData) + }) + return file_connect_int_proto_rawDescData +} + +var file_connect_int_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_connect_int_proto_goTypes = []interface{}{ + (*DeliverMessageReq)(nil), // 0: pb.DeliverMessageReq + (*PushRoomMsg)(nil), // 1: pb.PushRoomMsg + (*PushAllMsg)(nil), // 2: pb.PushAllMsg + (*MessageSend)(nil), // 3: pb.MessageSend + (*Empty)(nil), // 4: pb.Empty +} +var file_connect_int_proto_depIdxs = []int32{ + 3, // 0: pb.DeliverMessageReq.message_send:type_name -> pb.MessageSend + 3, // 1: pb.PushRoomMsg.message_send:type_name -> pb.MessageSend + 3, // 2: pb.PushAllMsg.message_send:type_name -> pb.MessageSend + 0, // 3: pb.ConnectInt.DeliverMessage:input_type -> pb.DeliverMessageReq + 4, // 4: pb.ConnectInt.DeliverMessage:output_type -> pb.Empty + 4, // [4:5] is the sub-list for method output_type + 3, // [3:4] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_connect_int_proto_init() } +func file_connect_int_proto_init() { + if File_connect_int_proto != nil { + return + } + file_common_ext_proto_init() + file_connect_ext_proto_init() + if !protoimpl.UnsafeEnabled { + file_connect_int_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeliverMessageReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_int_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushRoomMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_connect_int_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushAllMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_connect_int_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_connect_int_proto_goTypes, + DependencyIndexes: file_connect_int_proto_depIdxs, + MessageInfos: file_connect_int_proto_msgTypes, + }.Build() + File_connect_int_proto = out.File + file_connect_int_proto_rawDesc = nil + file_connect_int_proto_goTypes = nil + file_connect_int_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated comm +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// ConnectIntClient is the client API for ConnectInt service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ConnectIntClient interface { + // 消息投递 + DeliverMessage(ctx context.Context, in *DeliverMessageReq, opts ...grpc.CallOption) (*Empty, error) +} + +type connectIntClient struct { + cc grpc.ClientConnInterface +} + +func NewConnectIntClient(cc grpc.ClientConnInterface) ConnectIntClient { + return &connectIntClient{cc} +} + +func (c *connectIntClient) DeliverMessage(ctx context.Context, in *DeliverMessageReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.ConnectInt/DeliverMessage", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ConnectIntServer is the server API for ConnectInt service. +type ConnectIntServer interface { + // 消息投递 + DeliverMessage(context.Context, *DeliverMessageReq) (*Empty, error) +} + +// UnimplementedConnectIntServer can be embedded to have forward compatible implementations. +type UnimplementedConnectIntServer struct { +} + +func (*UnimplementedConnectIntServer) DeliverMessage(context.Context, *DeliverMessageReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeliverMessage not implemented") +} + +func RegisterConnectIntServer(s *grpc.Server, srv ConnectIntServer) { + s.RegisterService(&_ConnectInt_serviceDesc, srv) +} + +func _ConnectInt_DeliverMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeliverMessageReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConnectIntServer).DeliverMessage(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.ConnectInt/DeliverMessage", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConnectIntServer).DeliverMessage(ctx, req.(*DeliverMessageReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _ConnectInt_serviceDesc = grpc.ServiceDesc{ + ServiceName: "pb.ConnectInt", + HandlerType: (*ConnectIntServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DeliverMessage", + Handler: _ConnectInt_DeliverMessage_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "connect.int.proto_back", +} diff --git a/pkg/pb/im.logic.ext.pb.go b/pkg/pb/im.logic.ext.pb.go new file mode 100644 index 0000000..70a6ec6 --- /dev/null +++ b/pkg/pb/im.logic.ext.pb.go @@ -0,0 +1,3587 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.0--rc1 +// source: logic.ext.proto + +package pb + +import ( + "context" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoimpl" + "reflect" + "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type MemberType int32 + +const ( + MemberType_GMT_UNKNOWN MemberType = 0 // 未知 + MemberType_GMT_ADMIN MemberType = 1 // 管理员 + MemberType_GMT_MEMBER MemberType = 2 // 成员 +) + +// Enum value maps for MemberType. +var ( + MemberType_name = map[int32]string{ + 0: "GMT_UNKNOWN", + 1: "GMT_ADMIN", + 2: "GMT_MEMBER", + } + MemberType_value = map[string]int32{ + "GMT_UNKNOWN": 0, + "GMT_ADMIN": 1, + "GMT_MEMBER": 2, + } +) + +func (x MemberType) Enum() *MemberType { + p := new(MemberType) + *p = x + return p +} + +func (x MemberType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MemberType) Descriptor() protoreflect.EnumDescriptor { + return file_logic_ext_proto_enumTypes[0].Descriptor() +} + +func (MemberType) Type() protoreflect.EnumType { + return &file_logic_ext_proto_enumTypes[0] +} + +func (x MemberType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MemberType.Descriptor instead. +func (MemberType) EnumDescriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{0} +} + +type RegisterDeviceReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type int32 `protobuf:"varint,2,opt,name=type,proto3" json:"type,omitempty"` // 设备类型 + Brand string `protobuf:"bytes,3,opt,name=brand,proto3" json:"brand,omitempty"` // 厂商 + Model string `protobuf:"bytes,4,opt,name=model,proto3" json:"model,omitempty"` // 机型 + SystemVersion string `protobuf:"bytes,5,opt,name=system_version,json=systemVersion,proto3" json:"system_version,omitempty"` // 系统版本 + SdkVersion string `protobuf:"bytes,6,opt,name=sdk_version,json=sdkVersion,proto3" json:"sdk_version,omitempty"` // sdk版本号 +} + +func (x *RegisterDeviceReq) Reset() { + *x = RegisterDeviceReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterDeviceReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterDeviceReq) ProtoMessage() {} + +func (x *RegisterDeviceReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterDeviceReq.ProtoReflect.Descriptor instead. +func (*RegisterDeviceReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{0} +} + +func (x *RegisterDeviceReq) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *RegisterDeviceReq) GetBrand() string { + if x != nil { + return x.Brand + } + return "" +} + +func (x *RegisterDeviceReq) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *RegisterDeviceReq) GetSystemVersion() string { + if x != nil { + return x.SystemVersion + } + return "" +} + +func (x *RegisterDeviceReq) GetSdkVersion() string { + if x != nil { + return x.SdkVersion + } + return "" +} + +type RegisterDeviceResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId int64 `protobuf:"varint,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id +} + +func (x *RegisterDeviceResp) Reset() { + *x = RegisterDeviceResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterDeviceResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterDeviceResp) ProtoMessage() {} + +func (x *RegisterDeviceResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterDeviceResp.ProtoReflect.Descriptor instead. +func (*RegisterDeviceResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{1} +} + +func (x *RegisterDeviceResp) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +type SendMessageReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ReceiverType ReceiverType `protobuf:"varint,1,opt,name=receiver_type,json=receiverType,proto3,enum=pb.ReceiverType" json:"receiver_type,omitempty"` // 接收者类型,1:user;2:group + ReceiverId int64 `protobuf:"varint,2,opt,name=receiver_id,json=receiverId,proto3" json:"receiver_id,omitempty"` // 用户id或者群组id + ToUserIds []int64 `protobuf:"varint,3,rep,packed,name=to_user_ids,json=toUserIds,proto3" json:"to_user_ids,omitempty"` // 需要@的用户id列表 + MessageType MessageType `protobuf:"varint,4,opt,name=message_type,json=messageType,proto3,enum=pb.MessageType" json:"message_type,omitempty"` // 消息类型 + MessageContent []byte `protobuf:"bytes,5,opt,name=message_content,json=messageContent,proto3" json:"message_content,omitempty"` // 消息内容 + SendTime int64 `protobuf:"varint,6,opt,name=send_time,json=sendTime,proto3" json:"send_time,omitempty"` // 消息发送时间戳,精确到毫秒 + IsPersist bool `protobuf:"varint,7,opt,name=is_persist,json=isPersist,proto3" json:"is_persist,omitempty"` // 是否将消息持久化到数据库 + MessageContentBack string `protobuf:"bytes,8,opt,name=message_content_back,json=messageContentBack,proto3" json:"message_content_back,omitempty"` +} + +func (x *SendMessageReq) Reset() { + *x = SendMessageReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendMessageReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendMessageReq) ProtoMessage() {} + +func (x *SendMessageReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SendMessageReq.ProtoReflect.Descriptor instead. +func (*SendMessageReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{2} +} + +func (x *SendMessageReq) GetReceiverType() ReceiverType { + if x != nil { + return x.ReceiverType + } + return ReceiverType_RT_UNKNOWN +} + +func (x *SendMessageReq) GetReceiverId() int64 { + if x != nil { + return x.ReceiverId + } + return 0 +} + +func (x *SendMessageReq) GetToUserIds() []int64 { + if x != nil { + return x.ToUserIds + } + return nil +} + +func (x *SendMessageReq) GetMessageType() MessageType { + if x != nil { + return x.MessageType + } + return MessageType_MT_UNKNOWN +} + +func (x *SendMessageReq) GetMessageContent() []byte { + if x != nil { + return x.MessageContent + } + return nil +} + +func (x *SendMessageReq) GetSendTime() int64 { + if x != nil { + return x.SendTime + } + return 0 +} + +func (x *SendMessageReq) GetIsPersist() bool { + if x != nil { + return x.IsPersist + } + return false +} + +func (x *SendMessageReq) GetMessageContentBack() string { + if x != nil { + return x.MessageContentBack + } + return "" +} + +type SendMessageResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` // 消息序列号 +} + +func (x *SendMessageResp) Reset() { + *x = SendMessageResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendMessageResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendMessageResp) ProtoMessage() {} + +func (x *SendMessageResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SendMessageResp.ProtoReflect.Descriptor instead. +func (*SendMessageResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{3} +} + +func (x *SendMessageResp) GetSeq() int64 { + if x != nil { + return x.Seq + } + return 0 +} + +type RecallMessageReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ReceiverType ReceiverType `protobuf:"varint,1,opt,name=receiver_type,json=receiverType,proto3,enum=pb.ReceiverType" json:"receiver_type,omitempty"` // 接收者类型,1:user;2:group + ReceiverId int64 `protobuf:"varint,2,opt,name=receiver_id,json=receiverId,proto3" json:"receiver_id,omitempty"` // 用户id或者群组id + ToUserIds []int64 `protobuf:"varint,3,rep,packed,name=to_user_ids,json=toUserIds,proto3" json:"to_user_ids,omitempty"` // 需要@的用户id列表 + MessageType MessageType `protobuf:"varint,4,opt,name=message_type,json=messageType,proto3,enum=pb.MessageType" json:"message_type,omitempty"` // 消息类型 + MessageContent []byte `protobuf:"bytes,5,opt,name=message_content,json=messageContent,proto3" json:"message_content,omitempty"` // 消息内容 + SendTime int64 `protobuf:"varint,6,opt,name=send_time,json=sendTime,proto3" json:"send_time,omitempty"` // 消息发送时间戳,精确到毫秒 + IsPersist bool `protobuf:"varint,7,opt,name=is_persist,json=isPersist,proto3" json:"is_persist,omitempty"` // 是否将消息持久化到数据库 + MessageContentBack string `protobuf:"bytes,8,opt,name=message_content_back,json=messageContentBack,proto3" json:"message_content_back,omitempty"` +} + +func (x *RecallMessageReq) Reset() { + *x = RecallMessageReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RecallMessageReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecallMessageReq) ProtoMessage() {} + +func (x *RecallMessageReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecallMessageReq.ProtoReflect.Descriptor instead. +func (*RecallMessageReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{4} +} + +func (x *RecallMessageReq) GetReceiverType() ReceiverType { + if x != nil { + return x.ReceiverType + } + return ReceiverType_RT_UNKNOWN +} + +func (x *RecallMessageReq) GetReceiverId() int64 { + if x != nil { + return x.ReceiverId + } + return 0 +} + +func (x *RecallMessageReq) GetToUserIds() []int64 { + if x != nil { + return x.ToUserIds + } + return nil +} + +func (x *RecallMessageReq) GetMessageType() MessageType { + if x != nil { + return x.MessageType + } + return MessageType_MT_UNKNOWN +} + +func (x *RecallMessageReq) GetMessageContent() []byte { + if x != nil { + return x.MessageContent + } + return nil +} + +func (x *RecallMessageReq) GetSendTime() int64 { + if x != nil { + return x.SendTime + } + return 0 +} + +func (x *RecallMessageReq) GetIsPersist() bool { + if x != nil { + return x.IsPersist + } + return false +} + +func (x *RecallMessageReq) GetMessageContentBack() string { + if x != nil { + return x.MessageContentBack + } + return "" +} + +type RecallMessageResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` // 消息序列号 +} + +func (x *RecallMessageResp) Reset() { + *x = RecallMessageResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RecallMessageResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecallMessageResp) ProtoMessage() {} + +func (x *RecallMessageResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecallMessageResp.ProtoReflect.Descriptor instead. +func (*RecallMessageResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{5} +} + +func (x *RecallMessageResp) GetSeq() int64 { + if x != nil { + return x.Seq + } + return 0 +} + +type SendRedPacketReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ReceiverType ReceiverType `protobuf:"varint,1,opt,name=receiver_type,json=receiverType,proto3,enum=pb.ReceiverType" json:"receiver_type,omitempty"` // 接收者类型,1:user;2:group + ReceiverId int64 `protobuf:"varint,2,opt,name=receiver_id,json=receiverId,proto3" json:"receiver_id,omitempty"` // 用户id或者群组id + MessageType MessageType `protobuf:"varint,3,opt,name=message_type,json=messageType,proto3,enum=pb.MessageType" json:"message_type,omitempty"` // 消息类型 + MessageContent []byte `protobuf:"bytes,4,opt,name=message_content,json=messageContent,proto3" json:"message_content,omitempty"` // 消息内容 + SendTime int64 `protobuf:"varint,5,opt,name=send_time,json=sendTime,proto3" json:"send_time,omitempty"` // 消息发送时间戳,精确到毫秒 + ToUserIds []int64 `protobuf:"varint,6,rep,packed,name=to_user_ids,json=toUserIds,proto3" json:"to_user_ids,omitempty"` // 红包给到哪些用户(专属红包) + MessageContentBack string `protobuf:"bytes,7,opt,name=message_content_back,json=messageContentBack,proto3" json:"message_content_back,omitempty"` +} + +func (x *SendRedPacketReq) Reset() { + *x = SendRedPacketReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendRedPacketReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendRedPacketReq) ProtoMessage() {} + +func (x *SendRedPacketReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SendRedPacketReq.ProtoReflect.Descriptor instead. +func (*SendRedPacketReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{6} +} + +func (x *SendRedPacketReq) GetReceiverType() ReceiverType { + if x != nil { + return x.ReceiverType + } + return ReceiverType_RT_UNKNOWN +} + +func (x *SendRedPacketReq) GetReceiverId() int64 { + if x != nil { + return x.ReceiverId + } + return 0 +} + +func (x *SendRedPacketReq) GetMessageType() MessageType { + if x != nil { + return x.MessageType + } + return MessageType_MT_UNKNOWN +} + +func (x *SendRedPacketReq) GetMessageContent() []byte { + if x != nil { + return x.MessageContent + } + return nil +} + +func (x *SendRedPacketReq) GetSendTime() int64 { + if x != nil { + return x.SendTime + } + return 0 +} + +func (x *SendRedPacketReq) GetToUserIds() []int64 { + if x != nil { + return x.ToUserIds + } + return nil +} + +func (x *SendRedPacketReq) GetMessageContentBack() string { + if x != nil { + return x.MessageContentBack + } + return "" +} + +type SendRedPacketResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` // 消息序列号 +} + +func (x *SendRedPacketResp) Reset() { + *x = SendRedPacketResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendRedPacketResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendRedPacketResp) ProtoMessage() {} + +func (x *SendRedPacketResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SendRedPacketResp.ProtoReflect.Descriptor instead. +func (*SendRedPacketResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{7} +} + +func (x *SendRedPacketResp) GetSeq() int64 { + if x != nil { + return x.Seq + } + return 0 +} + +type PushRoomReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RoomId int64 `protobuf:"varint,1,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` // 房间id + MessageType MessageType `protobuf:"varint,2,opt,name=message_type,json=messageType,proto3,enum=pb.MessageType" json:"message_type,omitempty"` // 消息类型 + MessageContent []byte `protobuf:"bytes,3,opt,name=message_content,json=messageContent,proto3" json:"message_content,omitempty"` // 消息内容 + SendTime int64 `protobuf:"varint,4,opt,name=send_time,json=sendTime,proto3" json:"send_time,omitempty"` // 消息发送时间戳,精确到毫秒 + IsPersist bool `protobuf:"varint,5,opt,name=is_persist,json=isPersist,proto3" json:"is_persist,omitempty"` // 是否将消息持久化 + IsPriority bool `protobuf:"varint,6,opt,name=is_priority,json=isPriority,proto3" json:"is_priority,omitempty"` // 是否优先推送 +} + +func (x *PushRoomReq) Reset() { + *x = PushRoomReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushRoomReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushRoomReq) ProtoMessage() {} + +func (x *PushRoomReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushRoomReq.ProtoReflect.Descriptor instead. +func (*PushRoomReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{8} +} + +func (x *PushRoomReq) GetRoomId() int64 { + if x != nil { + return x.RoomId + } + return 0 +} + +func (x *PushRoomReq) GetMessageType() MessageType { + if x != nil { + return x.MessageType + } + return MessageType_MT_UNKNOWN +} + +func (x *PushRoomReq) GetMessageContent() []byte { + if x != nil { + return x.MessageContent + } + return nil +} + +func (x *PushRoomReq) GetSendTime() int64 { + if x != nil { + return x.SendTime + } + return 0 +} + +func (x *PushRoomReq) GetIsPersist() bool { + if x != nil { + return x.IsPersist + } + return false +} + +func (x *PushRoomReq) GetIsPriority() bool { + if x != nil { + return x.IsPriority + } + return false +} + +type AddFriendReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId int64 `protobuf:"varint,1,opt,name=friend_id,json=friendId,proto3" json:"friend_id,omitempty"` // 用户id + Remarks string `protobuf:"bytes,2,opt,name=remarks,proto3" json:"remarks,omitempty"` // 备注 + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` // 描述 +} + +func (x *AddFriendReq) Reset() { + *x = AddFriendReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddFriendReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddFriendReq) ProtoMessage() {} + +func (x *AddFriendReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddFriendReq.ProtoReflect.Descriptor instead. +func (*AddFriendReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{9} +} + +func (x *AddFriendReq) GetFriendId() int64 { + if x != nil { + return x.FriendId + } + return 0 +} + +func (x *AddFriendReq) GetRemarks() string { + if x != nil { + return x.Remarks + } + return "" +} + +func (x *AddFriendReq) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type DeleteFriendReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id +} + +func (x *DeleteFriendReq) Reset() { + *x = DeleteFriendReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteFriendReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteFriendReq) ProtoMessage() {} + +func (x *DeleteFriendReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteFriendReq.ProtoReflect.Descriptor instead. +func (*DeleteFriendReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteFriendReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +type AgreeAddFriendReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + Remarks string `protobuf:"bytes,2,opt,name=remarks,proto3" json:"remarks,omitempty"` // 备注 +} + +func (x *AgreeAddFriendReq) Reset() { + *x = AgreeAddFriendReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AgreeAddFriendReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AgreeAddFriendReq) ProtoMessage() {} + +func (x *AgreeAddFriendReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AgreeAddFriendReq.ProtoReflect.Descriptor instead. +func (*AgreeAddFriendReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{11} +} + +func (x *AgreeAddFriendReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *AgreeAddFriendReq) GetRemarks() string { + if x != nil { + return x.Remarks + } + return "" +} + +type SetFriendReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId int64 `protobuf:"varint,1,opt,name=friend_id,json=friendId,proto3" json:"friend_id,omitempty"` // 好友id + Remarks string `protobuf:"bytes,2,opt,name=remarks,proto3" json:"remarks,omitempty"` // 备注 + Extra string `protobuf:"bytes,8,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 +} + +func (x *SetFriendReq) Reset() { + *x = SetFriendReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetFriendReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetFriendReq) ProtoMessage() {} + +func (x *SetFriendReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetFriendReq.ProtoReflect.Descriptor instead. +func (*SetFriendReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{12} +} + +func (x *SetFriendReq) GetFriendId() int64 { + if x != nil { + return x.FriendId + } + return 0 +} + +func (x *SetFriendReq) GetRemarks() string { + if x != nil { + return x.Remarks + } + return "" +} + +func (x *SetFriendReq) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +type SetFriendResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId int64 `protobuf:"varint,1,opt,name=friend_id,json=friendId,proto3" json:"friend_id,omitempty"` // 好友id + Remarks string `protobuf:"bytes,2,opt,name=remarks,proto3" json:"remarks,omitempty"` // 备注 + Extra string `protobuf:"bytes,8,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 +} + +func (x *SetFriendResp) Reset() { + *x = SetFriendResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetFriendResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetFriendResp) ProtoMessage() {} + +func (x *SetFriendResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetFriendResp.ProtoReflect.Descriptor instead. +func (*SetFriendResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{13} +} + +func (x *SetFriendResp) GetFriendId() int64 { + if x != nil { + return x.FriendId + } + return 0 +} + +func (x *SetFriendResp) GetRemarks() string { + if x != nil { + return x.Remarks + } + return "" +} + +func (x *SetFriendResp) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +type Friend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + PhoneNumber string `protobuf:"bytes,2,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"` // 电话号码 + Nickname string `protobuf:"bytes,3,opt,name=nickname,proto3" json:"nickname,omitempty"` // 昵称 + Sex int32 `protobuf:"varint,4,opt,name=sex,proto3" json:"sex,omitempty"` // 性别 + AvatarUrl string `protobuf:"bytes,5,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像地址 + UserExtra string `protobuf:"bytes,6,opt,name=user_extra,json=userExtra,proto3" json:"user_extra,omitempty"` // 用户附加字段 + Remarks string `protobuf:"bytes,7,opt,name=remarks,proto3" json:"remarks,omitempty"` // 备注 + Extra string `protobuf:"bytes,8,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 +} + +func (x *Friend) Reset() { + *x = Friend{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Friend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Friend) ProtoMessage() {} + +func (x *Friend) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Friend.ProtoReflect.Descriptor instead. +func (*Friend) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{14} +} + +func (x *Friend) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *Friend) GetPhoneNumber() string { + if x != nil { + return x.PhoneNumber + } + return "" +} + +func (x *Friend) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *Friend) GetSex() int32 { + if x != nil { + return x.Sex + } + return 0 +} + +func (x *Friend) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *Friend) GetUserExtra() string { + if x != nil { + return x.UserExtra + } + return "" +} + +func (x *Friend) GetRemarks() string { + if x != nil { + return x.Remarks + } + return "" +} + +func (x *Friend) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +type GetFriendsResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Friends []*Friend `protobuf:"bytes,1,rep,name=friends,proto3" json:"friends,omitempty"` +} + +func (x *GetFriendsResp) Reset() { + *x = GetFriendsResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFriendsResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFriendsResp) ProtoMessage() {} + +func (x *GetFriendsResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFriendsResp.ProtoReflect.Descriptor instead. +func (*GetFriendsResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{15} +} + +func (x *GetFriendsResp) GetFriends() []*Friend { + if x != nil { + return x.Friends + } + return nil +} + +type CreateGroupReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // 名称 + AvatarUrl string `protobuf:"bytes,2,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像 + Introduction string `protobuf:"bytes,3,opt,name=introduction,proto3" json:"introduction,omitempty"` // 简介 + Extra string `protobuf:"bytes,4,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 + MemberIds []int64 `protobuf:"varint,5,rep,packed,name=member_ids,json=memberIds,proto3" json:"member_ids,omitempty"` // 群组成员ID列表 +} + +func (x *CreateGroupReq) Reset() { + *x = CreateGroupReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateGroupReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGroupReq) ProtoMessage() {} + +func (x *CreateGroupReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGroupReq.ProtoReflect.Descriptor instead. +func (*CreateGroupReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{16} +} + +func (x *CreateGroupReq) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateGroupReq) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *CreateGroupReq) GetIntroduction() string { + if x != nil { + return x.Introduction + } + return "" +} + +func (x *CreateGroupReq) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +func (x *CreateGroupReq) GetMemberIds() []int64 { + if x != nil { + return x.MemberIds + } + return nil +} + +type CreateGroupResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // 群组id +} + +func (x *CreateGroupResp) Reset() { + *x = CreateGroupResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateGroupResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGroupResp) ProtoMessage() {} + +func (x *CreateGroupResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGroupResp.ProtoReflect.Descriptor instead. +func (*CreateGroupResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{17} +} + +func (x *CreateGroupResp) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +type UpdateGroupReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // 群组id + AvatarUrl string `protobuf:"bytes,2,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像 + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // 名称 + Introduction string `protobuf:"bytes,4,opt,name=introduction,proto3" json:"introduction,omitempty"` // 简介 + Extra string `protobuf:"bytes,5,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 +} + +func (x *UpdateGroupReq) Reset() { + *x = UpdateGroupReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateGroupReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGroupReq) ProtoMessage() {} + +func (x *UpdateGroupReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGroupReq.ProtoReflect.Descriptor instead. +func (*UpdateGroupReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{18} +} + +func (x *UpdateGroupReq) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +func (x *UpdateGroupReq) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *UpdateGroupReq) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateGroupReq) GetIntroduction() string { + if x != nil { + return x.Introduction + } + return "" +} + +func (x *UpdateGroupReq) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +type GetGroupReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` +} + +func (x *GetGroupReq) Reset() { + *x = GetGroupReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetGroupReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGroupReq) ProtoMessage() {} + +func (x *GetGroupReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGroupReq.ProtoReflect.Descriptor instead. +func (*GetGroupReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{19} +} + +func (x *GetGroupReq) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +type GetGroupResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` +} + +func (x *GetGroupResp) Reset() { + *x = GetGroupResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetGroupResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGroupResp) ProtoMessage() {} + +func (x *GetGroupResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGroupResp.ProtoReflect.Descriptor instead. +func (*GetGroupResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{20} +} + +func (x *GetGroupResp) GetGroup() *Group { + if x != nil { + return x.Group + } + return nil +} + +type Group struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // 群组id + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // 名称 + AvatarUrl string `protobuf:"bytes,3,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像 + Introduction string `protobuf:"bytes,4,opt,name=introduction,proto3" json:"introduction,omitempty"` // 简介 + UserMum int32 `protobuf:"varint,5,opt,name=user_mum,json=userMum,proto3" json:"user_mum,omitempty"` // 用户数 + Extra string `protobuf:"bytes,6,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 + CreateTime int64 `protobuf:"varint,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // 创建时间 + UpdateTime int64 `protobuf:"varint,8,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // 更新时间 +} + +func (x *Group) Reset() { + *x = Group{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Group) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Group) ProtoMessage() {} + +func (x *Group) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Group.ProtoReflect.Descriptor instead. +func (*Group) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{21} +} + +func (x *Group) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +func (x *Group) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Group) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *Group) GetIntroduction() string { + if x != nil { + return x.Introduction + } + return "" +} + +func (x *Group) GetUserMum() int32 { + if x != nil { + return x.UserMum + } + return 0 +} + +func (x *Group) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +func (x *Group) GetCreateTime() int64 { + if x != nil { + return x.CreateTime + } + return 0 +} + +func (x *Group) GetUpdateTime() int64 { + if x != nil { + return x.UpdateTime + } + return 0 +} + +type GetGroupsResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Groups []*Group `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` +} + +func (x *GetGroupsResp) Reset() { + *x = GetGroupsResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetGroupsResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGroupsResp) ProtoMessage() {} + +func (x *GetGroupsResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGroupsResp.ProtoReflect.Descriptor instead. +func (*GetGroupsResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{22} +} + +func (x *GetGroupsResp) GetGroups() []*Group { + if x != nil { + return x.Groups + } + return nil +} + +type AddGroupMembersReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // 群组id + UserIds []int64 `protobuf:"varint,2,rep,packed,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` // 用户id列表 +} + +func (x *AddGroupMembersReq) Reset() { + *x = AddGroupMembersReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddGroupMembersReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddGroupMembersReq) ProtoMessage() {} + +func (x *AddGroupMembersReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddGroupMembersReq.ProtoReflect.Descriptor instead. +func (*AddGroupMembersReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{23} +} + +func (x *AddGroupMembersReq) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +func (x *AddGroupMembersReq) GetUserIds() []int64 { + if x != nil { + return x.UserIds + } + return nil +} + +type AddGroupMembersResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserIds []int64 `protobuf:"varint,1,rep,packed,name=user_ids,json=userIds,proto3" json:"user_ids,omitempty"` // 已经在群组的用户id列表 +} + +func (x *AddGroupMembersResp) Reset() { + *x = AddGroupMembersResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddGroupMembersResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddGroupMembersResp) ProtoMessage() {} + +func (x *AddGroupMembersResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddGroupMembersResp.ProtoReflect.Descriptor instead. +func (*AddGroupMembersResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{24} +} + +func (x *AddGroupMembersResp) GetUserIds() []int64 { + if x != nil { + return x.UserIds + } + return nil +} + +type UpdateGroupMemberReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // 群组id + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + MemberType MemberType `protobuf:"varint,3,opt,name=member_type,json=memberType,proto3,enum=pb.MemberType" json:"member_type,omitempty"` // 成员类型 + Remarks string `protobuf:"bytes,4,opt,name=remarks,proto3" json:"remarks,omitempty"` // 备注 + Extra string `protobuf:"bytes,5,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 +} + +func (x *UpdateGroupMemberReq) Reset() { + *x = UpdateGroupMemberReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateGroupMemberReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGroupMemberReq) ProtoMessage() {} + +func (x *UpdateGroupMemberReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGroupMemberReq.ProtoReflect.Descriptor instead. +func (*UpdateGroupMemberReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{25} +} + +func (x *UpdateGroupMemberReq) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +func (x *UpdateGroupMemberReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *UpdateGroupMemberReq) GetMemberType() MemberType { + if x != nil { + return x.MemberType + } + return MemberType_GMT_UNKNOWN +} + +func (x *UpdateGroupMemberReq) GetRemarks() string { + if x != nil { + return x.Remarks + } + return "" +} + +func (x *UpdateGroupMemberReq) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +type DeleteGroupMemberReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` // 群组id + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id +} + +func (x *DeleteGroupMemberReq) Reset() { + *x = DeleteGroupMemberReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteGroupMemberReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGroupMemberReq) ProtoMessage() {} + +func (x *DeleteGroupMemberReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGroupMemberReq.ProtoReflect.Descriptor instead. +func (*DeleteGroupMemberReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{26} +} + +func (x *DeleteGroupMemberReq) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +func (x *DeleteGroupMemberReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +type GetGroupMembersReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GroupId int64 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` +} + +func (x *GetGroupMembersReq) Reset() { + *x = GetGroupMembersReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetGroupMembersReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGroupMembersReq) ProtoMessage() {} + +func (x *GetGroupMembersReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGroupMembersReq.ProtoReflect.Descriptor instead. +func (*GetGroupMembersReq) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{27} +} + +func (x *GetGroupMembersReq) GetGroupId() int64 { + if x != nil { + return x.GroupId + } + return 0 +} + +type GetGroupMembersResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Members []*GroupMember `protobuf:"bytes,1,rep,name=members,proto3" json:"members,omitempty"` +} + +func (x *GetGroupMembersResp) Reset() { + *x = GetGroupMembersResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetGroupMembersResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGroupMembersResp) ProtoMessage() {} + +func (x *GetGroupMembersResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGroupMembersResp.ProtoReflect.Descriptor instead. +func (*GetGroupMembersResp) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{28} +} + +func (x *GetGroupMembersResp) GetMembers() []*GroupMember { + if x != nil { + return x.Members + } + return nil +} + +type GroupMember struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + Nickname string `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"` // 昵称 + Sex int32 `protobuf:"varint,3,opt,name=sex,proto3" json:"sex,omitempty"` // 性别 + AvatarUrl string `protobuf:"bytes,4,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像地址 + UserExtra string `protobuf:"bytes,5,opt,name=user_extra,json=userExtra,proto3" json:"user_extra,omitempty"` // 用户附加字段 + MemberType MemberType `protobuf:"varint,6,opt,name=member_type,json=memberType,proto3,enum=pb.MemberType" json:"member_type,omitempty"` // 成员类型 + Remarks string `protobuf:"bytes,7,opt,name=remarks,proto3" json:"remarks,omitempty"` // 备注 + Extra string `protobuf:"bytes,8,opt,name=extra,proto3" json:"extra,omitempty"` // 群组成员附加字段 +} + +func (x *GroupMember) Reset() { + *x = GroupMember{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_ext_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GroupMember) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupMember) ProtoMessage() {} + +func (x *GroupMember) ProtoReflect() protoreflect.Message { + mi := &file_logic_ext_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupMember.ProtoReflect.Descriptor instead. +func (*GroupMember) Descriptor() ([]byte, []int) { + return file_logic_ext_proto_rawDescGZIP(), []int{29} +} + +func (x *GroupMember) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *GroupMember) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *GroupMember) GetSex() int32 { + if x != nil { + return x.Sex + } + return 0 +} + +func (x *GroupMember) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *GroupMember) GetUserExtra() string { + if x != nil { + return x.UserExtra + } + return "" +} + +func (x *GroupMember) GetMemberType() MemberType { + if x != nil { + return x.MemberType + } + return MemberType_GMT_UNKNOWN +} + +func (x *GroupMember) GetRemarks() string { + if x != nil { + return x.Remarks + } + return "" +} + +func (x *GroupMember) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +var File_logic_ext_proto protoreflect.FileDescriptor + +var file_logic_ext_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x78, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9b, 0x01, 0x0a, 0x11, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x64, + 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1b, + 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0xd3, 0x02, 0x0a, 0x0e, + 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x35, + 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x55, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, + 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x12, + 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x63, + 0x6b, 0x22, 0x23, 0x0a, 0x0f, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0xd5, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x63, 0x61, 0x6c, + 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x35, 0x0a, 0x0d, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x74, 0x6f, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x22, 0x25, + 0x0a, 0x11, 0x52, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0xb6, 0x02, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, + 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x12, 0x35, 0x0a, 0x0d, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x32, 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0b, + 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x14, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x22, 0x25, + 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0xe0, 0x01, 0x0a, 0x0b, 0x50, 0x75, 0x73, 0x68, 0x52, 0x6f, + 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x32, + 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, + 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, + 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x67, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x46, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x46, 0x0a, + 0x11, 0x41, 0x67, 0x72, 0x65, 0x65, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x22, 0x5b, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x46, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x22, 0x5c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x22, 0xe0, 0x01, 0x0a, 0x06, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x68, 0x6f, 0x6e, + 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x73, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, + 0x72, 0x55, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x78, + 0x74, 0x72, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x22, 0x36, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x24, 0x0a, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x52, 0x07, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x22, 0x9c, 0x01, 0x0a, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, + 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x03, 0x52, + 0x09, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x2c, 0x0a, 0x0f, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, + 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x98, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x74, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x22, 0x28, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x2f, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1f, 0x0a, + 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x70, + 0x62, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xec, + 0x01, 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, + 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, + 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, + 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x6d, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x4d, 0x75, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x32, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x21, + 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, + 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x22, 0x4a, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x30, 0x0a, + 0x13, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, + 0xab, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0b, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, 0x72, 0x61, 0x22, 0x4a, 0x0a, + 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, + 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2f, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x29, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xf3, 0x01, 0x0a, + 0x0b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x73, 0x65, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, + 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x78, 0x74, 0x72, + 0x61, 0x12, 0x2f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x2a, 0x3c, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x4d, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x47, 0x4d, 0x54, 0x5f, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x01, + 0x12, 0x0e, 0x0a, 0x0a, 0x47, 0x4d, 0x54, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, + 0x32, 0xd0, 0x07, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x45, 0x78, 0x74, 0x12, 0x3f, 0x0a, + 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, + 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x2e, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3c, 0x0a, 0x0d, 0x52, 0x65, 0x63, 0x61, 0x6c, 0x6c, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, + 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x26, 0x0a, 0x08, 0x50, 0x75, 0x73, 0x68, 0x52, 0x6f, 0x6f, 0x6d, + 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, + 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0d, + 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x14, 0x2e, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x64, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x64, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x09, 0x41, 0x64, + 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, + 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x0a, 0x0e, 0x41, 0x67, 0x72, 0x65, 0x65, 0x41, 0x64, 0x64, + 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x67, 0x72, 0x65, + 0x65, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2e, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x46, + 0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x72, + 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, + 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2b, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x2c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, + 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2d, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x29, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x42, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, + 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x38, 0x0a, 0x11, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x38, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x42, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x42, 0x0d, 0x5a, 0x0b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, + 0x62, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_logic_ext_proto_rawDescOnce sync.Once + file_logic_ext_proto_rawDescData = file_logic_ext_proto_rawDesc +) + +func file_logic_ext_proto_rawDescGZIP() []byte { + file_logic_ext_proto_rawDescOnce.Do(func() { + file_logic_ext_proto_rawDescData = protoimpl.X.CompressGZIP(file_logic_ext_proto_rawDescData) + }) + return file_logic_ext_proto_rawDescData +} + +var file_logic_ext_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_logic_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 30) +var file_logic_ext_proto_goTypes = []interface{}{ + (MemberType)(0), // 0: pb.MemberType + (*RegisterDeviceReq)(nil), // 1: pb.RegisterDeviceReq + (*RegisterDeviceResp)(nil), // 2: pb.RegisterDeviceResp + (*SendMessageReq)(nil), // 3: pb.SendMessageReq + (*SendMessageResp)(nil), // 4: pb.SendMessageResp + (*RecallMessageReq)(nil), // 5: pb.RecallMessageReq + (*RecallMessageResp)(nil), // 6: pb.RecallMessageResp + (*SendRedPacketReq)(nil), // 7: pb.SendRedPacketReq + (*SendRedPacketResp)(nil), // 8: pb.SendRedPacketResp + (*PushRoomReq)(nil), // 9: pb.PushRoomReq + (*AddFriendReq)(nil), // 10: pb.AddFriendReq + (*DeleteFriendReq)(nil), // 11: pb.DeleteFriendReq + (*AgreeAddFriendReq)(nil), // 12: pb.AgreeAddFriendReq + (*SetFriendReq)(nil), // 13: pb.SetFriendReq + (*SetFriendResp)(nil), // 14: pb.SetFriendResp + (*Friend)(nil), // 15: pb.Friend + (*GetFriendsResp)(nil), // 16: pb.GetFriendsResp + (*CreateGroupReq)(nil), // 17: pb.CreateGroupReq + (*CreateGroupResp)(nil), // 18: pb.CreateGroupResp + (*UpdateGroupReq)(nil), // 19: pb.UpdateGroupReq + (*GetGroupReq)(nil), // 20: pb.GetGroupReq + (*GetGroupResp)(nil), // 21: pb.GetGroupResp + (*Group)(nil), // 22: pb.Group + (*GetGroupsResp)(nil), // 23: pb.GetGroupsResp + (*AddGroupMembersReq)(nil), // 24: pb.AddGroupMembersReq + (*AddGroupMembersResp)(nil), // 25: pb.AddGroupMembersResp + (*UpdateGroupMemberReq)(nil), // 26: pb.UpdateGroupMemberReq + (*DeleteGroupMemberReq)(nil), // 27: pb.DeleteGroupMemberReq + (*GetGroupMembersReq)(nil), // 28: pb.GetGroupMembersReq + (*GetGroupMembersResp)(nil), // 29: pb.GetGroupMembersResp + (*GroupMember)(nil), // 30: pb.GroupMember + (ReceiverType)(0), // 31: pb.ReceiverType + (MessageType)(0), // 32: pb.MessageType + (*Empty)(nil), // 33: pb.Empty +} +var file_logic_ext_proto_depIdxs = []int32{ + 31, // 0: pb.SendMessageReq.receiver_type:type_name -> pb.ReceiverType + 32, // 1: pb.SendMessageReq.message_type:type_name -> pb.MessageType + 31, // 2: pb.RecallMessageReq.receiver_type:type_name -> pb.ReceiverType + 32, // 3: pb.RecallMessageReq.message_type:type_name -> pb.MessageType + 31, // 4: pb.SendRedPacketReq.receiver_type:type_name -> pb.ReceiverType + 32, // 5: pb.SendRedPacketReq.message_type:type_name -> pb.MessageType + 32, // 6: pb.PushRoomReq.message_type:type_name -> pb.MessageType + 15, // 7: pb.GetFriendsResp.friends:type_name -> pb.Friend + 22, // 8: pb.GetGroupResp.group:type_name -> pb.Group + 22, // 9: pb.GetGroupsResp.groups:type_name -> pb.Group + 0, // 10: pb.UpdateGroupMemberReq.member_type:type_name -> pb.MemberType + 30, // 11: pb.GetGroupMembersResp.members:type_name -> pb.GroupMember + 0, // 12: pb.GroupMember.member_type:type_name -> pb.MemberType + 1, // 13: pb.LogicExt.RegisterDevice:input_type -> pb.RegisterDeviceReq + 3, // 14: pb.LogicExt.SendMessage:input_type -> pb.SendMessageReq + 5, // 15: pb.LogicExt.RecallMessage:input_type -> pb.RecallMessageReq + 9, // 16: pb.LogicExt.PushRoom:input_type -> pb.PushRoomReq + 7, // 17: pb.LogicExt.SendRedPacket:input_type -> pb.SendRedPacketReq + 10, // 18: pb.LogicExt.AddFriend:input_type -> pb.AddFriendReq + 12, // 19: pb.LogicExt.AgreeAddFriend:input_type -> pb.AgreeAddFriendReq + 11, // 20: pb.LogicExt.DeleteFriend:input_type -> pb.DeleteFriendReq + 13, // 21: pb.LogicExt.SetFriend:input_type -> pb.SetFriendReq + 33, // 22: pb.LogicExt.GetFriends:input_type -> pb.Empty + 17, // 23: pb.LogicExt.CreateGroup:input_type -> pb.CreateGroupReq + 19, // 24: pb.LogicExt.UpdateGroup:input_type -> pb.UpdateGroupReq + 20, // 25: pb.LogicExt.GetGroup:input_type -> pb.GetGroupReq + 33, // 26: pb.LogicExt.GetGroups:input_type -> pb.Empty + 24, // 27: pb.LogicExt.AddGroupMembers:input_type -> pb.AddGroupMembersReq + 26, // 28: pb.LogicExt.UpdateGroupMember:input_type -> pb.UpdateGroupMemberReq + 27, // 29: pb.LogicExt.DeleteGroupMember:input_type -> pb.DeleteGroupMemberReq + 28, // 30: pb.LogicExt.GetGroupMembers:input_type -> pb.GetGroupMembersReq + 2, // 31: pb.LogicExt.RegisterDevice:output_type -> pb.RegisterDeviceResp + 4, // 32: pb.LogicExt.SendMessage:output_type -> pb.SendMessageResp + 6, // 33: pb.LogicExt.RecallMessage:output_type -> pb.RecallMessageResp + 33, // 34: pb.LogicExt.PushRoom:output_type -> pb.Empty + 8, // 35: pb.LogicExt.SendRedPacket:output_type -> pb.SendRedPacketResp + 33, // 36: pb.LogicExt.AddFriend:output_type -> pb.Empty + 33, // 37: pb.LogicExt.AgreeAddFriend:output_type -> pb.Empty + 33, // 38: pb.LogicExt.DeleteFriend:output_type -> pb.Empty + 14, // 39: pb.LogicExt.SetFriend:output_type -> pb.SetFriendResp + 16, // 40: pb.LogicExt.GetFriends:output_type -> pb.GetFriendsResp + 18, // 41: pb.LogicExt.CreateGroup:output_type -> pb.CreateGroupResp + 33, // 42: pb.LogicExt.UpdateGroup:output_type -> pb.Empty + 21, // 43: pb.LogicExt.GetGroup:output_type -> pb.GetGroupResp + 23, // 44: pb.LogicExt.GetGroups:output_type -> pb.GetGroupsResp + 25, // 45: pb.LogicExt.AddGroupMembers:output_type -> pb.AddGroupMembersResp + 33, // 46: pb.LogicExt.UpdateGroupMember:output_type -> pb.Empty + 33, // 47: pb.LogicExt.DeleteGroupMember:output_type -> pb.Empty + 29, // 48: pb.LogicExt.GetGroupMembers:output_type -> pb.GetGroupMembersResp + 31, // [31:49] is the sub-list for method output_type + 13, // [13:31] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name +} + +func init() { file_logic_ext_proto_init() } +func file_logic_ext_proto_init() { + if File_logic_ext_proto != nil { + return + } + file_common_ext_proto_init() + file_connect_ext_proto_init() + if !protoimpl.UnsafeEnabled { + file_logic_ext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterDeviceReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterDeviceResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendMessageReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendMessageResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecallMessageReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecallMessageResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendRedPacketReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SendRedPacketResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushRoomReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddFriendReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteFriendReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AgreeAddFriendReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetFriendReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetFriendResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Friend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFriendsResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateGroupReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateGroupResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateGroupReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetGroupReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetGroupResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Group); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetGroupsResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddGroupMembersReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddGroupMembersResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateGroupMemberReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteGroupMemberReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetGroupMembersReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetGroupMembersResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_ext_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupMember); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_logic_ext_proto_rawDesc, + NumEnums: 1, + NumMessages: 30, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_logic_ext_proto_goTypes, + DependencyIndexes: file_logic_ext_proto_depIdxs, + EnumInfos: file_logic_ext_proto_enumTypes, + MessageInfos: file_logic_ext_proto_msgTypes, + }.Build() + File_logic_ext_proto = out.File + file_logic_ext_proto_rawDesc = nil + file_logic_ext_proto_goTypes = nil + file_logic_ext_proto_depIdxs = nil +} + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// LogicExtClient is the client API for LogicExt service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type LogicExtClient interface { + // 注册设备 + RegisterDevice(ctx context.Context, in *RegisterDeviceReq, opts ...grpc.CallOption) (*RegisterDeviceResp, error) + // 发送消息 + SendMessage(ctx context.Context, in *SendMessageReq, opts ...grpc.CallOption) (*SendMessageResp, error) + // 撤回消息 + RecallMessage(ctx context.Context, in *RecallMessageReq, opts ...grpc.CallOption) (*RecallMessageResp, error) + // 推送消息到房间 + PushRoom(ctx context.Context, in *PushRoomReq, opts ...grpc.CallOption) (*Empty, error) + // 发送红包 + SendRedPacket(ctx context.Context, in *SendRedPacketReq, opts ...grpc.CallOption) (*SendRedPacketResp, error) + // 添加好友 + AddFriend(ctx context.Context, in *AddFriendReq, opts ...grpc.CallOption) (*Empty, error) + // 同意添加好友 + AgreeAddFriend(ctx context.Context, in *AgreeAddFriendReq, opts ...grpc.CallOption) (*Empty, error) + // 删除好友 + DeleteFriend(ctx context.Context, in *DeleteFriendReq, opts ...grpc.CallOption) (*Empty, error) + // 设置好友信息 + SetFriend(ctx context.Context, in *SetFriendReq, opts ...grpc.CallOption) (*SetFriendResp, error) + // 获取好友列表 + GetFriends(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetFriendsResp, error) + // 创建群组 + CreateGroup(ctx context.Context, in *CreateGroupReq, opts ...grpc.CallOption) (*CreateGroupResp, error) + // 更新群组 + UpdateGroup(ctx context.Context, in *UpdateGroupReq, opts ...grpc.CallOption) (*Empty, error) + // 获取群组信息 + GetGroup(ctx context.Context, in *GetGroupReq, opts ...grpc.CallOption) (*GetGroupResp, error) + // 获取用户加入的所有群组 + GetGroups(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetGroupsResp, error) + // 添加群组成员 + AddGroupMembers(ctx context.Context, in *AddGroupMembersReq, opts ...grpc.CallOption) (*AddGroupMembersResp, error) + // 更新群组成员信息 + UpdateGroupMember(ctx context.Context, in *UpdateGroupMemberReq, opts ...grpc.CallOption) (*Empty, error) + // 添加群组成员 + DeleteGroupMember(ctx context.Context, in *DeleteGroupMemberReq, opts ...grpc.CallOption) (*Empty, error) + // 获取群组成员 + GetGroupMembers(ctx context.Context, in *GetGroupMembersReq, opts ...grpc.CallOption) (*GetGroupMembersResp, error) +} + +type logicExtClient struct { + cc grpc.ClientConnInterface +} + +func NewLogicExtClient(cc grpc.ClientConnInterface) LogicExtClient { + return &logicExtClient{cc} +} + +func (c *logicExtClient) RegisterDevice(ctx context.Context, in *RegisterDeviceReq, opts ...grpc.CallOption) (*RegisterDeviceResp, error) { + out := new(RegisterDeviceResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/RegisterDevice", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) SendMessage(ctx context.Context, in *SendMessageReq, opts ...grpc.CallOption) (*SendMessageResp, error) { + out := new(SendMessageResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/SendMessage", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) RecallMessage(ctx context.Context, in *RecallMessageReq, opts ...grpc.CallOption) (*RecallMessageResp, error) { + out := new(RecallMessageResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/RecallMessage", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) PushRoom(ctx context.Context, in *PushRoomReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicExt/PushRoom", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) SendRedPacket(ctx context.Context, in *SendRedPacketReq, opts ...grpc.CallOption) (*SendRedPacketResp, error) { + out := new(SendRedPacketResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/SendRedPacket", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) AddFriend(ctx context.Context, in *AddFriendReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicExt/AddFriend", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) AgreeAddFriend(ctx context.Context, in *AgreeAddFriendReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicExt/AgreeAddFriend", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) DeleteFriend(ctx context.Context, in *DeleteFriendReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicExt/DeleteFriend", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) SetFriend(ctx context.Context, in *SetFriendReq, opts ...grpc.CallOption) (*SetFriendResp, error) { + out := new(SetFriendResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/SetFriend", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) GetFriends(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetFriendsResp, error) { + out := new(GetFriendsResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/GetFriends", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) CreateGroup(ctx context.Context, in *CreateGroupReq, opts ...grpc.CallOption) (*CreateGroupResp, error) { + out := new(CreateGroupResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/CreateGroup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) UpdateGroup(ctx context.Context, in *UpdateGroupReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicExt/UpdateGroup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) GetGroup(ctx context.Context, in *GetGroupReq, opts ...grpc.CallOption) (*GetGroupResp, error) { + out := new(GetGroupResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/GetGroup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) GetGroups(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetGroupsResp, error) { + out := new(GetGroupsResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/GetGroups", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) AddGroupMembers(ctx context.Context, in *AddGroupMembersReq, opts ...grpc.CallOption) (*AddGroupMembersResp, error) { + out := new(AddGroupMembersResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/AddGroupMembers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) UpdateGroupMember(ctx context.Context, in *UpdateGroupMemberReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicExt/UpdateGroupMember", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) DeleteGroupMember(ctx context.Context, in *DeleteGroupMemberReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicExt/DeleteGroupMember", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicExtClient) GetGroupMembers(ctx context.Context, in *GetGroupMembersReq, opts ...grpc.CallOption) (*GetGroupMembersResp, error) { + out := new(GetGroupMembersResp) + err := c.cc.Invoke(ctx, "/pb.LogicExt/GetGroupMembers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// LogicExtServer is the server API for LogicExt service. +// All implementations must embed UnimplementedLogicExtServer +// for forward compatibility +type LogicExtServer interface { + // 注册设备 + RegisterDevice(context.Context, *RegisterDeviceReq) (*RegisterDeviceResp, error) + // 发送消息 + SendMessage(context.Context, *SendMessageReq) (*SendMessageResp, error) + // 撤回消息 + RecallMessage(context.Context, *RecallMessageReq) (*RecallMessageResp, error) + // 推送消息到房间 + PushRoom(context.Context, *PushRoomReq) (*Empty, error) + // 发送红包 + SendRedPacket(context.Context, *SendRedPacketReq) (*SendRedPacketResp, error) + // 添加好友 + AddFriend(context.Context, *AddFriendReq) (*Empty, error) + // 同意添加好友 + AgreeAddFriend(context.Context, *AgreeAddFriendReq) (*Empty, error) + // 删除好友 + DeleteFriend(context.Context, *DeleteFriendReq) (*Empty, error) + // 设置好友信息 + SetFriend(context.Context, *SetFriendReq) (*SetFriendResp, error) + // 获取好友列表 + GetFriends(context.Context, *Empty) (*GetFriendsResp, error) + // 创建群组 + CreateGroup(context.Context, *CreateGroupReq) (*CreateGroupResp, error) + // 更新群组 + UpdateGroup(context.Context, *UpdateGroupReq) (*Empty, error) + // 获取群组信息 + GetGroup(context.Context, *GetGroupReq) (*GetGroupResp, error) + // 获取用户加入的所有群组 + GetGroups(context.Context, *Empty) (*GetGroupsResp, error) + // 添加群组成员 + AddGroupMembers(context.Context, *AddGroupMembersReq) (*AddGroupMembersResp, error) + // 更新群组成员信息 + UpdateGroupMember(context.Context, *UpdateGroupMemberReq) (*Empty, error) + // 添加群组成员 + DeleteGroupMember(context.Context, *DeleteGroupMemberReq) (*Empty, error) + // 获取群组成员 + GetGroupMembers(context.Context, *GetGroupMembersReq) (*GetGroupMembersResp, error) +} + +// UnimplementedLogicExtServer must be embedded to have forward compatible implementations. +type UnimplementedLogicExtServer struct { +} + +func (UnimplementedLogicExtServer) RegisterDevice(context.Context, *RegisterDeviceReq) (*RegisterDeviceResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterDevice not implemented") +} +func (UnimplementedLogicExtServer) SendMessage(context.Context, *SendMessageReq) (*SendMessageResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendMessage not implemented") +} +func (UnimplementedLogicExtServer) RecallMessage(context.Context, *RecallMessageReq) (*RecallMessageResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method RecallMessage not implemented") +} +func (UnimplementedLogicExtServer) PushRoom(context.Context, *PushRoomReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method PushRoom not implemented") +} +func (UnimplementedLogicExtServer) SendRedPacket(context.Context, *SendRedPacketReq) (*SendRedPacketResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendRedPacket not implemented") +} +func (UnimplementedLogicExtServer) AddFriend(context.Context, *AddFriendReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddFriend not implemented") +} +func (UnimplementedLogicExtServer) AgreeAddFriend(context.Context, *AgreeAddFriendReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method AgreeAddFriend not implemented") +} +func (UnimplementedLogicExtServer) DeleteFriend(context.Context, *DeleteFriendReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteFriend not implemented") +} +func (UnimplementedLogicExtServer) SetFriend(context.Context, *SetFriendReq) (*SetFriendResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetFriend not implemented") +} +func (UnimplementedLogicExtServer) GetFriends(context.Context, *Empty) (*GetFriendsResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFriends not implemented") +} +func (UnimplementedLogicExtServer) CreateGroup(context.Context, *CreateGroupReq) (*CreateGroupResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateGroup not implemented") +} +func (UnimplementedLogicExtServer) UpdateGroup(context.Context, *UpdateGroupReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateGroup not implemented") +} +func (UnimplementedLogicExtServer) GetGroup(context.Context, *GetGroupReq) (*GetGroupResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetGroup not implemented") +} +func (UnimplementedLogicExtServer) GetGroups(context.Context, *Empty) (*GetGroupsResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetGroups not implemented") +} +func (UnimplementedLogicExtServer) AddGroupMembers(context.Context, *AddGroupMembersReq) (*AddGroupMembersResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddGroupMembers not implemented") +} +func (UnimplementedLogicExtServer) UpdateGroupMember(context.Context, *UpdateGroupMemberReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateGroupMember not implemented") +} +func (UnimplementedLogicExtServer) DeleteGroupMember(context.Context, *DeleteGroupMemberReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteGroupMember not implemented") +} +func (UnimplementedLogicExtServer) GetGroupMembers(context.Context, *GetGroupMembersReq) (*GetGroupMembersResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetGroupMembers not implemented") +} + +func RegisterLogicExtServer(s grpc.ServiceRegistrar, srv LogicExtServer) { + s.RegisterService(&LogicExt_ServiceDesc, srv) +} + +func _LogicExt_RegisterDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RegisterDeviceReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).RegisterDevice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/RegisterDevice", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).RegisterDevice(ctx, req.(*RegisterDeviceReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_SendMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SendMessageReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).SendMessage(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/SendMessage", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).SendMessage(ctx, req.(*SendMessageReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_RecallMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RecallMessageReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).RecallMessage(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/RecallMessage", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).RecallMessage(ctx, req.(*RecallMessageReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_PushRoom_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PushRoomReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).PushRoom(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/PushRoom", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).PushRoom(ctx, req.(*PushRoomReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_SendRedPacket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SendRedPacketReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).SendRedPacket(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/SendRedPacket", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).SendRedPacket(ctx, req.(*SendRedPacketReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_AddFriend_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddFriendReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).AddFriend(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/AddFriend", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).AddFriend(ctx, req.(*AddFriendReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_AgreeAddFriend_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AgreeAddFriendReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).AgreeAddFriend(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/AgreeAddFriend", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).AgreeAddFriend(ctx, req.(*AgreeAddFriendReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_DeleteFriend_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteFriendReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).DeleteFriend(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/DeleteFriend", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).DeleteFriend(ctx, req.(*DeleteFriendReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_SetFriend_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetFriendReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).SetFriend(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/SetFriend", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).SetFriend(ctx, req.(*SetFriendReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_GetFriends_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).GetFriends(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/GetFriends", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).GetFriends(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_CreateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateGroupReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).CreateGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/CreateGroup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).CreateGroup(ctx, req.(*CreateGroupReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_UpdateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateGroupReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).UpdateGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/UpdateGroup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).UpdateGroup(ctx, req.(*UpdateGroupReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_GetGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetGroupReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).GetGroup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/GetGroup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).GetGroup(ctx, req.(*GetGroupReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_GetGroups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).GetGroups(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/GetGroups", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).GetGroups(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_AddGroupMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddGroupMembersReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).AddGroupMembers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/AddGroupMembers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).AddGroupMembers(ctx, req.(*AddGroupMembersReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_UpdateGroupMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateGroupMemberReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).UpdateGroupMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/UpdateGroupMember", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).UpdateGroupMember(ctx, req.(*UpdateGroupMemberReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_DeleteGroupMember_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteGroupMemberReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).DeleteGroupMember(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/DeleteGroupMember", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).DeleteGroupMember(ctx, req.(*DeleteGroupMemberReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicExt_GetGroupMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetGroupMembersReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicExtServer).GetGroupMembers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicExt/GetGroupMembers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicExtServer).GetGroupMembers(ctx, req.(*GetGroupMembersReq)) + } + return interceptor(ctx, in, info, handler) +} + +// LogicExt_ServiceDesc is the grpc.ServiceDesc for LogicExt service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var LogicExt_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "pb.LogicExt", + HandlerType: (*LogicExtServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "RegisterDevice", + Handler: _LogicExt_RegisterDevice_Handler, + }, + { + MethodName: "SendMessage", + Handler: _LogicExt_SendMessage_Handler, + }, + { + MethodName: "RecallMessage", + Handler: _LogicExt_RecallMessage_Handler, + }, + { + MethodName: "PushRoom", + Handler: _LogicExt_PushRoom_Handler, + }, + { + MethodName: "SendRedPacket", + Handler: _LogicExt_SendRedPacket_Handler, + }, + { + MethodName: "AddFriend", + Handler: _LogicExt_AddFriend_Handler, + }, + { + MethodName: "AgreeAddFriend", + Handler: _LogicExt_AgreeAddFriend_Handler, + }, + { + MethodName: "DeleteFriend", + Handler: _LogicExt_DeleteFriend_Handler, + }, + { + MethodName: "SetFriend", + Handler: _LogicExt_SetFriend_Handler, + }, + { + MethodName: "GetFriends", + Handler: _LogicExt_GetFriends_Handler, + }, + { + MethodName: "CreateGroup", + Handler: _LogicExt_CreateGroup_Handler, + }, + { + MethodName: "UpdateGroup", + Handler: _LogicExt_UpdateGroup_Handler, + }, + { + MethodName: "GetGroup", + Handler: _LogicExt_GetGroup_Handler, + }, + { + MethodName: "GetGroups", + Handler: _LogicExt_GetGroups_Handler, + }, + { + MethodName: "AddGroupMembers", + Handler: _LogicExt_AddGroupMembers_Handler, + }, + { + MethodName: "UpdateGroupMember", + Handler: _LogicExt_UpdateGroupMember_Handler, + }, + { + MethodName: "DeleteGroupMember", + Handler: _LogicExt_DeleteGroupMember_Handler, + }, + { + MethodName: "GetGroupMembers", + Handler: _LogicExt_GetGroupMembers_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "logic.ext.proto", +} diff --git a/pkg/pb/im.logic.int.pb.go b/pkg/pb/im.logic.int.pb.go new file mode 100644 index 0000000..c7e89ed --- /dev/null +++ b/pkg/pb/im.logic.int.pb.go @@ -0,0 +1,1547 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.26.0 +// protoc v3.14.0 +// source: logic.int.proto_back + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ConnSignInReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId int64 `protobuf:"varint,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"` // 秘钥 + ConnAddr string `protobuf:"bytes,4,opt,name=conn_addr,json=connAddr,proto3" json:"conn_addr,omitempty"` // 服务器地址 + ClientAddr string `protobuf:"bytes,5,opt,name=client_addr,json=clientAddr,proto3" json:"client_addr,omitempty"` // 客户端地址 +} + +func (x *ConnSignInReq) Reset() { + *x = ConnSignInReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConnSignInReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConnSignInReq) ProtoMessage() {} + +func (x *ConnSignInReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConnSignInReq.ProtoReflect.Descriptor instead. +func (*ConnSignInReq) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{0} +} + +func (x *ConnSignInReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *ConnSignInReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *ConnSignInReq) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *ConnSignInReq) GetConnAddr() string { + if x != nil { + return x.ConnAddr + } + return "" +} + +func (x *ConnSignInReq) GetClientAddr() string { + if x != nil { + return x.ClientAddr + } + return "" +} + +type SyncReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + DeviceId int64 `protobuf:"varint,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + Seq int64 `protobuf:"varint,3,opt,name=seq,proto3" json:"seq,omitempty"` // 客户端已经同步的序列号 +} + +func (x *SyncReq) Reset() { + *x = SyncReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncReq) ProtoMessage() {} + +func (x *SyncReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncReq.ProtoReflect.Descriptor instead. +func (*SyncReq) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{1} +} + +func (x *SyncReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *SyncReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *SyncReq) GetSeq() int64 { + if x != nil { + return x.Seq + } + return 0 +} + +type SyncResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Messages []*Message `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` // 消息列表 + HasMore bool `protobuf:"varint,2,opt,name=has_more,json=hasMore,proto3" json:"has_more,omitempty"` // 是否有更多数据 +} + +func (x *SyncResp) Reset() { + *x = SyncResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SyncResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SyncResp) ProtoMessage() {} + +func (x *SyncResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SyncResp.ProtoReflect.Descriptor instead. +func (*SyncResp) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{2} +} + +func (x *SyncResp) GetMessages() []*Message { + if x != nil { + return x.Messages + } + return nil +} + +func (x *SyncResp) GetHasMore() bool { + if x != nil { + return x.HasMore + } + return false +} + +type MessageACKReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + DeviceId int64 `protobuf:"varint,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + DeviceAck int64 `protobuf:"varint,3,opt,name=device_ack,json=deviceAck,proto3" json:"device_ack,omitempty"` // 设备收到消息的确认号 + ReceiveTime int64 `protobuf:"varint,4,opt,name=receive_time,json=receiveTime,proto3" json:"receive_time,omitempty"` // 消息接收时间戳,精确到毫秒 +} + +func (x *MessageACKReq) Reset() { + *x = MessageACKReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageACKReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageACKReq) ProtoMessage() {} + +func (x *MessageACKReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MessageACKReq.ProtoReflect.Descriptor instead. +func (*MessageACKReq) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{3} +} + +func (x *MessageACKReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *MessageACKReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *MessageACKReq) GetDeviceAck() int64 { + if x != nil { + return x.DeviceAck + } + return 0 +} + +func (x *MessageACKReq) GetReceiveTime() int64 { + if x != nil { + return x.ReceiveTime + } + return 0 +} + +type OfflineReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + DeviceId int64 `protobuf:"varint,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + ClientAddr string `protobuf:"bytes,3,opt,name=client_addr,json=clientAddr,proto3" json:"client_addr,omitempty"` // 客户端地址 +} + +func (x *OfflineReq) Reset() { + *x = OfflineReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OfflineReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OfflineReq) ProtoMessage() {} + +func (x *OfflineReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OfflineReq.ProtoReflect.Descriptor instead. +func (*OfflineReq) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{4} +} + +func (x *OfflineReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *OfflineReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *OfflineReq) GetClientAddr() string { + if x != nil { + return x.ClientAddr + } + return "" +} + +type SubscribeRoomReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + DeviceId int64 `protobuf:"varint,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + RoomId int64 `protobuf:"varint,3,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` // 房间id + Seq int64 `protobuf:"varint,4,opt,name=seq,proto3" json:"seq,omitempty"` // 消息序列号 + ConnAddr string `protobuf:"bytes,5,opt,name=conn_addr,json=connAddr,proto3" json:"conn_addr,omitempty"` // 服务器地址 +} + +func (x *SubscribeRoomReq) Reset() { + *x = SubscribeRoomReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeRoomReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeRoomReq) ProtoMessage() {} + +func (x *SubscribeRoomReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeRoomReq.ProtoReflect.Descriptor instead. +func (*SubscribeRoomReq) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{5} +} + +func (x *SubscribeRoomReq) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *SubscribeRoomReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *SubscribeRoomReq) GetRoomId() int64 { + if x != nil { + return x.RoomId + } + return 0 +} + +func (x *SubscribeRoomReq) GetSeq() int64 { + if x != nil { + return x.Seq + } + return 0 +} + +func (x *SubscribeRoomReq) GetConnAddr() string { + if x != nil { + return x.ConnAddr + } + return "" +} + +type PushAllReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageType MessageType `protobuf:"varint,1,opt,name=message_type,json=messageType,proto3,enum=pb.MessageType" json:"message_type,omitempty"` // 消息类型 + MessageContent []byte `protobuf:"bytes,2,opt,name=message_content,json=messageContent,proto3" json:"message_content,omitempty"` // 消息内容 + SendTime int64 `protobuf:"varint,3,opt,name=send_time,json=sendTime,proto3" json:"send_time,omitempty"` // 消息发送时间戳,精确到毫秒 +} + +func (x *PushAllReq) Reset() { + *x = PushAllReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushAllReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushAllReq) ProtoMessage() {} + +func (x *PushAllReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushAllReq.ProtoReflect.Descriptor instead. +func (*PushAllReq) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{6} +} + +func (x *PushAllReq) GetMessageType() MessageType { + if x != nil { + return x.MessageType + } + return MessageType_MT_UNKNOWN +} + +func (x *PushAllReq) GetMessageContent() []byte { + if x != nil { + return x.MessageContent + } + return nil +} + +func (x *PushAllReq) GetSendTime() int64 { + if x != nil { + return x.SendTime + } + return 0 +} + +type GetDeviceReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId int64 `protobuf:"varint,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` +} + +func (x *GetDeviceReq) Reset() { + *x = GetDeviceReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetDeviceReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetDeviceReq) ProtoMessage() {} + +func (x *GetDeviceReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetDeviceReq.ProtoReflect.Descriptor instead. +func (*GetDeviceReq) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{7} +} + +func (x *GetDeviceReq) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +type GetDeviceResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Device *Device `protobuf:"bytes,1,opt,name=device,proto3" json:"device,omitempty"` +} + +func (x *GetDeviceResp) Reset() { + *x = GetDeviceResp{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetDeviceResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetDeviceResp) ProtoMessage() {} + +func (x *GetDeviceResp) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetDeviceResp.ProtoReflect.Descriptor instead. +func (*GetDeviceResp) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{8} +} + +func (x *GetDeviceResp) GetDevice() *Device { + if x != nil { + return x.Device + } + return nil +} + +type Device struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeviceId int64 `protobuf:"varint,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // 设备id + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` // 用户id + Type int32 `protobuf:"varint,3,opt,name=type,proto3" json:"type,omitempty"` // 设备类型,1:Android;2:IOS;3:Windows; 4:MacOS;5:Web + Brand string `protobuf:"bytes,4,opt,name=brand,proto3" json:"brand,omitempty"` // 手机厂商 + Model string `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"` // 机型 + SystemVersion string `protobuf:"bytes,6,opt,name=system_version,json=systemVersion,proto3" json:"system_version,omitempty"` // 系统版本 + SdkVersion string `protobuf:"bytes,7,opt,name=sdk_version,json=sdkVersion,proto3" json:"sdk_version,omitempty"` // SDK版本 + Status int32 `protobuf:"varint,8,opt,name=status,proto3" json:"status,omitempty"` // 在线状态,0:不在线;1:在线 + ConnAddr string `protobuf:"bytes,9,opt,name=conn_addr,json=connAddr,proto3" json:"conn_addr,omitempty"` // 服务端连接地址 + ClientAddr string `protobuf:"bytes,10,opt,name=client_addr,json=clientAddr,proto3" json:"client_addr,omitempty"` // 客户端地址 + CreateTime int64 `protobuf:"varint,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` // 创建时间 + UpdateTime int64 `protobuf:"varint,12,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` // 更新时间 +} + +func (x *Device) Reset() { + *x = Device{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Device) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Device) ProtoMessage() {} + +func (x *Device) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Device.ProtoReflect.Descriptor instead. +func (*Device) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{9} +} + +func (x *Device) GetDeviceId() int64 { + if x != nil { + return x.DeviceId + } + return 0 +} + +func (x *Device) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *Device) GetType() int32 { + if x != nil { + return x.Type + } + return 0 +} + +func (x *Device) GetBrand() string { + if x != nil { + return x.Brand + } + return "" +} + +func (x *Device) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *Device) GetSystemVersion() string { + if x != nil { + return x.SystemVersion + } + return "" +} + +func (x *Device) GetSdkVersion() string { + if x != nil { + return x.SdkVersion + } + return "" +} + +func (x *Device) GetStatus() int32 { + if x != nil { + return x.Status + } + return 0 +} + +func (x *Device) GetConnAddr() string { + if x != nil { + return x.ConnAddr + } + return "" +} + +func (x *Device) GetClientAddr() string { + if x != nil { + return x.ClientAddr + } + return "" +} + +func (x *Device) GetCreateTime() int64 { + if x != nil { + return x.CreateTime + } + return 0 +} + +func (x *Device) GetUpdateTime() int64 { + if x != nil { + return x.UpdateTime + } + return 0 +} + +type ServerStopReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ConnAddr string `protobuf:"bytes,1,opt,name=conn_addr,json=connAddr,proto3" json:"conn_addr,omitempty"` +} + +func (x *ServerStopReq) Reset() { + *x = ServerStopReq{} + if protoimpl.UnsafeEnabled { + mi := &file_logic_int_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServerStopReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerStopReq) ProtoMessage() {} + +func (x *ServerStopReq) ProtoReflect() protoreflect.Message { + mi := &file_logic_int_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerStopReq.ProtoReflect.Descriptor instead. +func (*ServerStopReq) Descriptor() ([]byte, []int) { + return file_logic_int_proto_rawDescGZIP(), []int{10} +} + +func (x *ServerStopReq) GetConnAddr() string { + if x != nil { + return x.ConnAddr + } + return "" +} + +var File_logic_int_proto protoreflect.FileDescriptor + +var file_logic_int_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x65, 0x78, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x6c, 0x6f, 0x67, 0x69, + 0x63, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x99, 0x01, 0x0a, 0x0d, + 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1b, 0x0a, + 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, + 0x6e, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x22, 0x51, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x52, + 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x22, 0x4e, 0x0a, 0x08, 0x53, 0x79, + 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x12, 0x27, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4d, 0x6f, 0x72, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0d, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x6b, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, + 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x22, 0x63, 0x0a, 0x0a, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x22, 0x90, 0x01, 0x0a, 0x10, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x17, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, + 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x22, 0x86, 0x01, 0x0a, + 0x0a, 0x50, 0x75, 0x73, 0x68, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x32, 0x0a, 0x0c, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x2b, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x22, 0x33, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x22, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0xde, 0x02, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x62, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x72, 0x61, + 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x2c, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, + 0x6e, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x32, 0xc1, 0x03, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x63, + 0x49, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x49, + 0x6e, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x49, + 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x21, 0x0a, 0x04, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x79, 0x6e, + 0x63, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x0a, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, + 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x43, 0x4b, + 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x24, + 0x0a, 0x07, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x4f, + 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x36, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x53, + 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x26, + 0x0a, 0x08, 0x50, 0x75, 0x73, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, + 0x50, 0x75, 0x73, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x07, 0x50, 0x75, 0x73, 0x68, 0x41, 0x6c, + 0x6c, 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x41, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, + 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x11, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, + 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x0d, 0x5a, 0x0b, 0x67, 0x69, + 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_logic_int_proto_rawDescOnce sync.Once + file_logic_int_proto_rawDescData = file_logic_int_proto_rawDesc +) + +func file_logic_int_proto_rawDescGZIP() []byte { + file_logic_int_proto_rawDescOnce.Do(func() { + file_logic_int_proto_rawDescData = protoimpl.X.CompressGZIP(file_logic_int_proto_rawDescData) + }) + return file_logic_int_proto_rawDescData +} + +var file_logic_int_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_logic_int_proto_goTypes = []interface{}{ + (*ConnSignInReq)(nil), // 0: pb.ConnSignInReq + (*SyncReq)(nil), // 1: pb.SyncReq + (*SyncResp)(nil), // 2: pb.SyncResp + (*MessageACKReq)(nil), // 3: pb.MessageACKReq + (*OfflineReq)(nil), // 4: pb.OfflineReq + (*SubscribeRoomReq)(nil), // 5: pb.SubscribeRoomReq + (*PushAllReq)(nil), // 6: pb.PushAllReq + (*GetDeviceReq)(nil), // 7: pb.GetDeviceReq + (*GetDeviceResp)(nil), // 8: pb.GetDeviceResp + (*Device)(nil), // 9: pb.Device + (*ServerStopReq)(nil), // 10: pb.ServerStopReq + (*Message)(nil), // 11: pb.Message + (MessageType)(0), // 12: pb.MessageType + (*SendMessageReq)(nil), // 13: pb.SendMessageReq + (*PushRoomReq)(nil), // 14: pb.PushRoomReq + (*Empty)(nil), // 15: pb.Empty + (*SendMessageResp)(nil), // 16: pb.SendMessageResp +} +var file_logic_int_proto_depIdxs = []int32{ + 11, // 0: pb.SyncResp.messages:type_name -> pb.Message + 12, // 1: pb.PushAllReq.message_type:type_name -> pb.MessageType + 9, // 2: pb.GetDeviceResp.device:type_name -> pb.Device + 0, // 3: pb.LogicInt.ConnSignIn:input_type -> pb.ConnSignInReq + 1, // 4: pb.LogicInt.Sync:input_type -> pb.SyncReq + 3, // 5: pb.LogicInt.MessageACK:input_type -> pb.MessageACKReq + 4, // 6: pb.LogicInt.Offline:input_type -> pb.OfflineReq + 5, // 7: pb.LogicInt.SubscribeRoom:input_type -> pb.SubscribeRoomReq + 13, // 8: pb.LogicInt.SendMessage:input_type -> pb.SendMessageReq + 14, // 9: pb.LogicInt.PushRoom:input_type -> pb.PushRoomReq + 6, // 10: pb.LogicInt.PushAll:input_type -> pb.PushAllReq + 7, // 11: pb.LogicInt.GetDevice:input_type -> pb.GetDeviceReq + 10, // 12: pb.LogicInt.ServerStop:input_type -> pb.ServerStopReq + 15, // 13: pb.LogicInt.ConnSignIn:output_type -> pb.Empty + 2, // 14: pb.LogicInt.Sync:output_type -> pb.SyncResp + 15, // 15: pb.LogicInt.MessageACK:output_type -> pb.Empty + 15, // 16: pb.LogicInt.Offline:output_type -> pb.Empty + 15, // 17: pb.LogicInt.SubscribeRoom:output_type -> pb.Empty + 16, // 18: pb.LogicInt.SendMessage:output_type -> pb.SendMessageResp + 15, // 19: pb.LogicInt.PushRoom:output_type -> pb.Empty + 15, // 20: pb.LogicInt.PushAll:output_type -> pb.Empty + 8, // 21: pb.LogicInt.GetDevice:output_type -> pb.GetDeviceResp + 15, // 22: pb.LogicInt.ServerStop:output_type -> pb.Empty + 13, // [13:23] is the sub-list for method output_type + 3, // [3:13] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_logic_int_proto_init() } +func file_logic_int_proto_init() { + if File_logic_int_proto != nil { + return + } + file_common_ext_proto_init() + file_connect_ext_proto_init() + file_logic_ext_proto_init() + if !protoimpl.UnsafeEnabled { + file_logic_int_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConnSignInReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SyncResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessageACKReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OfflineReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeRoomReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushAllReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetDeviceReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetDeviceResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Device); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_logic_int_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerStopReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_logic_int_proto_rawDesc, + NumEnums: 0, + NumMessages: 11, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_logic_int_proto_goTypes, + DependencyIndexes: file_logic_int_proto_depIdxs, + MessageInfos: file_logic_int_proto_msgTypes, + }.Build() + File_logic_int_proto = out.File + file_logic_int_proto_rawDesc = nil + file_logic_int_proto_goTypes = nil + file_logic_int_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated comm +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// LogicIntClient is the client API for LogicInt service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type LogicIntClient interface { + // 登录 + ConnSignIn(ctx context.Context, in *ConnSignInReq, opts ...grpc.CallOption) (*Empty, error) + // 消息同步 + Sync(ctx context.Context, in *SyncReq, opts ...grpc.CallOption) (*SyncResp, error) + // 设备收到消息回执 + MessageACK(ctx context.Context, in *MessageACKReq, opts ...grpc.CallOption) (*Empty, error) + // 设备离线 + Offline(ctx context.Context, in *OfflineReq, opts ...grpc.CallOption) (*Empty, error) + // 订阅房间 + SubscribeRoom(ctx context.Context, in *SubscribeRoomReq, opts ...grpc.CallOption) (*Empty, error) + // 发送消息 + SendMessage(ctx context.Context, in *SendMessageReq, opts ...grpc.CallOption) (*SendMessageResp, error) + // 推送消息到房间 + PushRoom(ctx context.Context, in *PushRoomReq, opts ...grpc.CallOption) (*Empty, error) + // 全服推送 + PushAll(ctx context.Context, in *PushAllReq, opts ...grpc.CallOption) (*Empty, error) + // 获取设备信息 + GetDevice(ctx context.Context, in *GetDeviceReq, opts ...grpc.CallOption) (*GetDeviceResp, error) + // 服务停止 + ServerStop(ctx context.Context, in *ServerStopReq, opts ...grpc.CallOption) (*Empty, error) +} + +type logicIntClient struct { + cc grpc.ClientConnInterface +} + +func NewLogicIntClient(cc grpc.ClientConnInterface) LogicIntClient { + return &logicIntClient{cc} +} + +func (c *logicIntClient) ConnSignIn(ctx context.Context, in *ConnSignInReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicInt/ConnSignIn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) Sync(ctx context.Context, in *SyncReq, opts ...grpc.CallOption) (*SyncResp, error) { + out := new(SyncResp) + err := c.cc.Invoke(ctx, "/pb.LogicInt/Sync", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) MessageACK(ctx context.Context, in *MessageACKReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicInt/MessageACK", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) Offline(ctx context.Context, in *OfflineReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicInt/Offline", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) SubscribeRoom(ctx context.Context, in *SubscribeRoomReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicInt/SubscribeRoom", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) SendMessage(ctx context.Context, in *SendMessageReq, opts ...grpc.CallOption) (*SendMessageResp, error) { + out := new(SendMessageResp) + err := c.cc.Invoke(ctx, "/pb.LogicInt/SendMessage", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) PushRoom(ctx context.Context, in *PushRoomReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicInt/PushRoom", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) PushAll(ctx context.Context, in *PushAllReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicInt/PushAll", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) GetDevice(ctx context.Context, in *GetDeviceReq, opts ...grpc.CallOption) (*GetDeviceResp, error) { + out := new(GetDeviceResp) + err := c.cc.Invoke(ctx, "/pb.LogicInt/GetDevice", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logicIntClient) ServerStop(ctx context.Context, in *ServerStopReq, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.LogicInt/ServerStop", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// LogicIntServer is the server API for LogicInt service. +type LogicIntServer interface { + // 登录 + ConnSignIn(context.Context, *ConnSignInReq) (*Empty, error) + // 消息同步 + Sync(context.Context, *SyncReq) (*SyncResp, error) + // 设备收到消息回执 + MessageACK(context.Context, *MessageACKReq) (*Empty, error) + // 设备离线 + Offline(context.Context, *OfflineReq) (*Empty, error) + // 订阅房间 + SubscribeRoom(context.Context, *SubscribeRoomReq) (*Empty, error) + // 发送消息 + SendMessage(context.Context, *SendMessageReq) (*SendMessageResp, error) + // 推送消息到房间 + PushRoom(context.Context, *PushRoomReq) (*Empty, error) + // 全服推送 + PushAll(context.Context, *PushAllReq) (*Empty, error) + // 获取设备信息 + GetDevice(context.Context, *GetDeviceReq) (*GetDeviceResp, error) + // 服务停止 + ServerStop(context.Context, *ServerStopReq) (*Empty, error) +} + +// UnimplementedLogicIntServer can be embedded to have forward compatible implementations. +type UnimplementedLogicIntServer struct { +} + +func (*UnimplementedLogicIntServer) ConnSignIn(context.Context, *ConnSignInReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method ConnSignIn not implemented") +} +func (*UnimplementedLogicIntServer) Sync(context.Context, *SyncReq) (*SyncResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method Sync not implemented") +} +func (*UnimplementedLogicIntServer) MessageACK(context.Context, *MessageACKReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method MessageACK not implemented") +} +func (*UnimplementedLogicIntServer) Offline(context.Context, *OfflineReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method Offline not implemented") +} +func (*UnimplementedLogicIntServer) SubscribeRoom(context.Context, *SubscribeRoomReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubscribeRoom not implemented") +} +func (*UnimplementedLogicIntServer) SendMessage(context.Context, *SendMessageReq) (*SendMessageResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendMessage not implemented") +} +func (*UnimplementedLogicIntServer) PushRoom(context.Context, *PushRoomReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method PushRoom not implemented") +} +func (*UnimplementedLogicIntServer) PushAll(context.Context, *PushAllReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method PushAll not implemented") +} +func (*UnimplementedLogicIntServer) GetDevice(context.Context, *GetDeviceReq) (*GetDeviceResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDevice not implemented") +} +func (*UnimplementedLogicIntServer) ServerStop(context.Context, *ServerStopReq) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method ServerStop not implemented") +} + +func RegisterLogicIntServer(s *grpc.Server, srv LogicIntServer) { + s.RegisterService(&_LogicInt_serviceDesc, srv) +} + +func _LogicInt_ConnSignIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConnSignInReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).ConnSignIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/ConnSignIn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).ConnSignIn(ctx, req.(*ConnSignInReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_Sync_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SyncReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).Sync(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/Sync", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).Sync(ctx, req.(*SyncReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_MessageACK_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MessageACKReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).MessageACK(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/MessageACK", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).MessageACK(ctx, req.(*MessageACKReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_Offline_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OfflineReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).Offline(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/Offline", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).Offline(ctx, req.(*OfflineReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_SubscribeRoom_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SubscribeRoomReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).SubscribeRoom(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/SubscribeRoom", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).SubscribeRoom(ctx, req.(*SubscribeRoomReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_SendMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SendMessageReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).SendMessage(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/SendMessage", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).SendMessage(ctx, req.(*SendMessageReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_PushRoom_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PushRoomReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).PushRoom(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/PushRoom", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).PushRoom(ctx, req.(*PushRoomReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_PushAll_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PushAllReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).PushAll(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/PushAll", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).PushAll(ctx, req.(*PushAllReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_GetDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetDeviceReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).GetDevice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/GetDevice", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).GetDevice(ctx, req.(*GetDeviceReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogicInt_ServerStop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ServerStopReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogicIntServer).ServerStop(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.LogicInt/ServerStop", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogicIntServer).ServerStop(ctx, req.(*ServerStopReq)) + } + return interceptor(ctx, in, info, handler) +} + +var _LogicInt_serviceDesc = grpc.ServiceDesc{ + ServiceName: "pb.LogicInt", + HandlerType: (*LogicIntServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ConnSignIn", + Handler: _LogicInt_ConnSignIn_Handler, + }, + { + MethodName: "Sync", + Handler: _LogicInt_Sync_Handler, + }, + { + MethodName: "MessageACK", + Handler: _LogicInt_MessageACK_Handler, + }, + { + MethodName: "Offline", + Handler: _LogicInt_Offline_Handler, + }, + { + MethodName: "SubscribeRoom", + Handler: _LogicInt_SubscribeRoom_Handler, + }, + { + MethodName: "SendMessage", + Handler: _LogicInt_SendMessage_Handler, + }, + { + MethodName: "PushRoom", + Handler: _LogicInt_PushRoom_Handler, + }, + { + MethodName: "PushAll", + Handler: _LogicInt_PushAll_Handler, + }, + { + MethodName: "GetDevice", + Handler: _LogicInt_GetDevice_Handler, + }, + { + MethodName: "ServerStop", + Handler: _LogicInt_ServerStop_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "logic.int.proto_back", +} diff --git a/pkg/pb/im.push.ext.pb.go b/pkg/pb/im.push.ext.pb.go new file mode 100644 index 0000000..2e7bfd9 --- /dev/null +++ b/pkg/pb/im.push.ext.pb.go @@ -0,0 +1,623 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.0--rc1 +// source: im.push.ext.proto + +package pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type PushCode int32 + +const ( + PushCode_PC_ADD_DEFAULT PushCode = 0 + PushCode_PC_ADD_FRIEND PushCode = 100 // 添加好友请求 + PushCode_PC_AGREE_ADD_FRIEND PushCode = 101 // 同意添加好友 + PushCode_PC_UPDATE_GROUP PushCode = 110 // 更新群组 + PushCode_PC_ADD_GROUP_MEMBERS PushCode = 120 // 添加群组成员 + PushCode_PC_REMOVE_GROUP_MEMBER PushCode = 121 // 移除群组成员 +) + +// Enum value maps for PushCode. +var ( + PushCode_name = map[int32]string{ + 0: "PC_ADD_DEFAULT", + 100: "PC_ADD_FRIEND", + 101: "PC_AGREE_ADD_FRIEND", + 110: "PC_UPDATE_GROUP", + 120: "PC_ADD_GROUP_MEMBERS", + 121: "PC_REMOVE_GROUP_MEMBER", + } + PushCode_value = map[string]int32{ + "PC_ADD_DEFAULT": 0, + "PC_ADD_FRIEND": 100, + "PC_AGREE_ADD_FRIEND": 101, + "PC_UPDATE_GROUP": 110, + "PC_ADD_GROUP_MEMBERS": 120, + "PC_REMOVE_GROUP_MEMBER": 121, + } +) + +func (x PushCode) Enum() *PushCode { + p := new(PushCode) + *p = x + return p +} + +func (x PushCode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PushCode) Descriptor() protoreflect.EnumDescriptor { + return file_push_ext_proto_enumTypes[0].Descriptor() +} + +func (PushCode) Type() protoreflect.EnumType { + return &file_push_ext_proto_enumTypes[0] +} + +func (x PushCode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PushCode.Descriptor instead. +func (PushCode) EnumDescriptor() ([]byte, []int) { + return file_push_ext_proto_rawDescGZIP(), []int{0} +} + +// 推送码 PC_ADD_FRIEND = 100 +type AddFriendPush struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId int64 `protobuf:"varint,1,opt,name=friend_id,json=friendId,proto3" json:"friend_id,omitempty"` // 好友id + Nickname string `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"` // 昵称 + AvatarUrl string `protobuf:"bytes,3,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像 + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` // 描述 +} + +func (x *AddFriendPush) Reset() { + *x = AddFriendPush{} + if protoimpl.UnsafeEnabled { + mi := &file_push_ext_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddFriendPush) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddFriendPush) ProtoMessage() {} + +func (x *AddFriendPush) ProtoReflect() protoreflect.Message { + mi := &file_push_ext_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddFriendPush.ProtoReflect.Descriptor instead. +func (*AddFriendPush) Descriptor() ([]byte, []int) { + return file_push_ext_proto_rawDescGZIP(), []int{0} +} + +func (x *AddFriendPush) GetFriendId() int64 { + if x != nil { + return x.FriendId + } + return 0 +} + +func (x *AddFriendPush) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *AddFriendPush) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *AddFriendPush) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +// 推送码 PC_AGREE_ADD_FRIEND = 101 +type AgreeAddFriendPush struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FriendId int64 `protobuf:"varint,1,opt,name=friend_id,json=friendId,proto3" json:"friend_id,omitempty"` // 好友id + Nickname string `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"` // 昵称 + AvatarUrl string `protobuf:"bytes,3,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 头像 +} + +func (x *AgreeAddFriendPush) Reset() { + *x = AgreeAddFriendPush{} + if protoimpl.UnsafeEnabled { + mi := &file_push_ext_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AgreeAddFriendPush) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AgreeAddFriendPush) ProtoMessage() {} + +func (x *AgreeAddFriendPush) ProtoReflect() protoreflect.Message { + mi := &file_push_ext_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AgreeAddFriendPush.ProtoReflect.Descriptor instead. +func (*AgreeAddFriendPush) Descriptor() ([]byte, []int) { + return file_push_ext_proto_rawDescGZIP(), []int{1} +} + +func (x *AgreeAddFriendPush) GetFriendId() int64 { + if x != nil { + return x.FriendId + } + return 0 +} + +func (x *AgreeAddFriendPush) GetNickname() string { + if x != nil { + return x.Nickname + } + return "" +} + +func (x *AgreeAddFriendPush) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +// 更新群组 PC_UPDATE_GROUP = 110 +type UpdateGroupPush struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OptId int64 `protobuf:"varint,1,opt,name=opt_id,json=optId,proto3" json:"opt_id,omitempty"` // 操作人用户id + OptName string `protobuf:"bytes,2,opt,name=opt_name,json=optName,proto3" json:"opt_name,omitempty"` // 操作人昵称 + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // 群组名称 + AvatarUrl string `protobuf:"bytes,4,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // 群组头像 + Introduction string `protobuf:"bytes,5,opt,name=introduction,proto3" json:"introduction,omitempty"` // 群组简介 + Extra string `protobuf:"bytes,6,opt,name=extra,proto3" json:"extra,omitempty"` // 附加字段 +} + +func (x *UpdateGroupPush) Reset() { + *x = UpdateGroupPush{} + if protoimpl.UnsafeEnabled { + mi := &file_push_ext_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateGroupPush) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGroupPush) ProtoMessage() {} + +func (x *UpdateGroupPush) ProtoReflect() protoreflect.Message { + mi := &file_push_ext_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGroupPush.ProtoReflect.Descriptor instead. +func (*UpdateGroupPush) Descriptor() ([]byte, []int) { + return file_push_ext_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateGroupPush) GetOptId() int64 { + if x != nil { + return x.OptId + } + return 0 +} + +func (x *UpdateGroupPush) GetOptName() string { + if x != nil { + return x.OptName + } + return "" +} + +func (x *UpdateGroupPush) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateGroupPush) GetAvatarUrl() string { + if x != nil { + return x.AvatarUrl + } + return "" +} + +func (x *UpdateGroupPush) GetIntroduction() string { + if x != nil { + return x.Introduction + } + return "" +} + +func (x *UpdateGroupPush) GetExtra() string { + if x != nil { + return x.Extra + } + return "" +} + +// 添加群组成员 PC_AGREE_ADD_GROUPS = 120 +type AddGroupMembersPush struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OptId int64 `protobuf:"varint,1,opt,name=opt_id,json=optId,proto3" json:"opt_id,omitempty"` // 操作人用户id + OptName string `protobuf:"bytes,2,opt,name=opt_name,json=optName,proto3" json:"opt_name,omitempty"` // 操作人昵称 + Members []*GroupMember `protobuf:"bytes,3,rep,name=members,proto3" json:"members,omitempty"` // 群组成员 +} + +func (x *AddGroupMembersPush) Reset() { + *x = AddGroupMembersPush{} + if protoimpl.UnsafeEnabled { + mi := &file_push_ext_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AddGroupMembersPush) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddGroupMembersPush) ProtoMessage() {} + +func (x *AddGroupMembersPush) ProtoReflect() protoreflect.Message { + mi := &file_push_ext_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AddGroupMembersPush.ProtoReflect.Descriptor instead. +func (*AddGroupMembersPush) Descriptor() ([]byte, []int) { + return file_push_ext_proto_rawDescGZIP(), []int{3} +} + +func (x *AddGroupMembersPush) GetOptId() int64 { + if x != nil { + return x.OptId + } + return 0 +} + +func (x *AddGroupMembersPush) GetOptName() string { + if x != nil { + return x.OptName + } + return "" +} + +func (x *AddGroupMembersPush) GetMembers() []*GroupMember { + if x != nil { + return x.Members + } + return nil +} + +// 删除群组成员 PC_REMOVE_GROUP_MEMBER = 121 +type RemoveGroupMemberPush struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OptId int64 `protobuf:"varint,1,opt,name=opt_id,json=optId,proto3" json:"opt_id,omitempty"` // 操作人用户id + OptName string `protobuf:"bytes,2,opt,name=opt_name,json=optName,proto3" json:"opt_name,omitempty"` // 操作人昵称 + DeletedUserId int64 `protobuf:"varint,3,opt,name=deleted_user_id,json=deletedUserId,proto3" json:"deleted_user_id,omitempty"` // 被删除的成员id + DeletedUserName string `protobuf:"bytes,4,opt,name=deleted_user_name,json=deletedUserName,proto3" json:"deleted_user_name,omitempty"` // 被删除的成员昵称 +} + +func (x *RemoveGroupMemberPush) Reset() { + *x = RemoveGroupMemberPush{} + if protoimpl.UnsafeEnabled { + mi := &file_push_ext_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoveGroupMemberPush) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveGroupMemberPush) ProtoMessage() {} + +func (x *RemoveGroupMemberPush) ProtoReflect() protoreflect.Message { + mi := &file_push_ext_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveGroupMemberPush.ProtoReflect.Descriptor instead. +func (*RemoveGroupMemberPush) Descriptor() ([]byte, []int) { + return file_push_ext_proto_rawDescGZIP(), []int{4} +} + +func (x *RemoveGroupMemberPush) GetOptId() int64 { + if x != nil { + return x.OptId + } + return 0 +} + +func (x *RemoveGroupMemberPush) GetOptName() string { + if x != nil { + return x.OptName + } + return "" +} + +func (x *RemoveGroupMemberPush) GetDeletedUserId() int64 { + if x != nil { + return x.DeletedUserId + } + return 0 +} + +func (x *RemoveGroupMemberPush) GetDeletedUserName() string { + if x != nil { + return x.DeletedUserName + } + return "" +} + +var File_push_ext_proto protoreflect.FileDescriptor + +var file_push_ext_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x02, 0x70, 0x62, 0x1a, 0x0f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x2e, 0x65, 0x78, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x89, 0x01, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x50, 0x75, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x6c, 0x0a, 0x12, 0x41, 0x67, 0x72, 0x65, 0x65, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x50, 0x75, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x72, 0x69, 0x65, + 0x6e, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x22, + 0xb0, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x75, 0x73, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x6f, 0x70, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x70, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, + 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x22, 0x72, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x50, 0x75, 0x73, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x70, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6f, 0x70, 0x74, 0x49, 0x64, + 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, + 0x62, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x07, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x50, 0x75, 0x73, 0x68, + 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x6f, 0x70, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x55, 0x73, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x2a, 0x95, 0x01, 0x0a, 0x08, 0x50, 0x75, 0x73, 0x68, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x43, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x44, 0x45, + 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x43, 0x5f, 0x41, 0x44, + 0x44, 0x5f, 0x46, 0x52, 0x49, 0x45, 0x4e, 0x44, 0x10, 0x64, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x43, + 0x5f, 0x41, 0x47, 0x52, 0x45, 0x45, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x46, 0x52, 0x49, 0x45, 0x4e, + 0x44, 0x10, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x43, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x6e, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x43, 0x5f, 0x41, + 0x44, 0x44, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x53, + 0x10, 0x78, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x43, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, + 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x79, 0x42, 0x0d, + 0x5a, 0x0b, 0x67, 0x69, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x2f, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_push_ext_proto_rawDescOnce sync.Once + file_push_ext_proto_rawDescData = file_push_ext_proto_rawDesc +) + +func file_push_ext_proto_rawDescGZIP() []byte { + file_push_ext_proto_rawDescOnce.Do(func() { + file_push_ext_proto_rawDescData = protoimpl.X.CompressGZIP(file_push_ext_proto_rawDescData) + }) + return file_push_ext_proto_rawDescData +} + +var file_push_ext_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_push_ext_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_push_ext_proto_goTypes = []interface{}{ + (PushCode)(0), // 0: pb.PushCode + (*AddFriendPush)(nil), // 1: pb.AddFriendPush + (*AgreeAddFriendPush)(nil), // 2: pb.AgreeAddFriendPush + (*UpdateGroupPush)(nil), // 3: pb.UpdateGroupPush + (*AddGroupMembersPush)(nil), // 4: pb.AddGroupMembersPush + (*RemoveGroupMemberPush)(nil), // 5: pb.RemoveGroupMemberPush + (*GroupMember)(nil), // 6: pb.GroupMember +} +var file_push_ext_proto_depIdxs = []int32{ + 6, // 0: pb.AddGroupMembersPush.members:type_name -> pb.GroupMember + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_push_ext_proto_init() } +func file_push_ext_proto_init() { + if File_push_ext_proto != nil { + return + } + file_logic_ext_proto_init() + if !protoimpl.UnsafeEnabled { + file_push_ext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddFriendPush); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_push_ext_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AgreeAddFriendPush); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_push_ext_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateGroupPush); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_push_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddGroupMembersPush); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_push_ext_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveGroupMemberPush); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_push_ext_proto_rawDesc, + NumEnums: 1, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_push_ext_proto_goTypes, + DependencyIndexes: file_push_ext_proto_depIdxs, + EnumInfos: file_push_ext_proto_enumTypes, + MessageInfos: file_push_ext_proto_msgTypes, + }.Build() + File_push_ext_proto = out.File + file_push_ext_proto_rawDesc = nil + file_push_ext_proto_goTypes = nil + file_push_ext_proto_depIdxs = nil +} diff --git a/pkg/proto/im.business.ext.proto b/pkg/proto/im.business.ext.proto new file mode 100644 index 0000000..ddd1375 --- /dev/null +++ b/pkg/proto/im.business.ext.proto @@ -0,0 +1,128 @@ +syntax = "proto3"; +package pb; +option go_package = "gim/pkg/pb/"; + +import "im.common.ext.proto"; + +service BusinessExt { + // 登录 + rpc SignIn (SignInReq) returns (SignInResp); + // 获取用户信息 + rpc GetUser (GetUserReq) returns (GetUserResp); + // 更新用户信息 + rpc UpdateUser (UpdateUserReq) returns (Empty); + // 搜索用户(这里简单数据库实现,生产环境建议使用ES) + rpc SearchUser (SearchUserReq) returns (SearchUserResp); + // 上传文件至云端 + rpc CloudUploadFile (CloudUploadFileReq) returns (CloudUploadFileResp); + // 获取表情 + rpc EmoticonList (Empty) returns (EmoticonListResp); + // 判断是否为好友关系 + rpc IsFriends (IsFriendsReq) returns (IsFriendsResp); + // 投诉群 + rpc ComplainGroup (ComplainGroupReq) returns (Empty); +} + + +message ComplainGroupReq { + int64 group_id = 1; + ComplainType complain_type = 2; // 投诉类型 + string text = 3; // 投诉内容 + repeated string image_list = 4; // 图片 +} + +// 消息类型 +enum ComplainType { + CT_UNKNOWN = 0; // 未知 + CT_GAMBLE = 1; // 存在赌博行为 + MT_DEFRAUD = 2; // 存在骗钱行为 + MT_HARASS = 3; // 不当信息骚扰 + MT_RUMOUR = 4; // 传播谣言 + MT_COUNTERFEIT_GOODS_INFO = 5; // 发布假冒商品信息 + MT_VIOLATION_OF_MINORS = 6; // 侵犯未成年人权益 + MT_OTHER = 7; // 其他 +} + + +message IsFriendsReq { + string user_phone = 1; + string friend_phone = 2; +} + +message IsFriendsResp { + int64 is_friend = 1; + User user = 2; // 用户信息 +} + +message Emoticon { + string name = 1; // 名称 + string img_url = 2; // 图片地址 + string memo = 3; // 备注 + int32 sort = 4; // 排序 +} +message EmoticonListResp { + repeated Emoticon emoticons = 1; +} +message SignInReq { + string phone_number = 1; // 手机号 + string code = 2; // 验证码 + int64 device_id = 3; // 设备id + int64 master_id = 4; // 站长id + string push_alia = 5; // 极光推送-别名 + string nickname = 6; // 昵称 + string avatar_url = 7; // 头像地址 +} +message SignInResp { + bool is_new = 1; // 是否是新用户 + int64 user_id = 2; // 用户id + string token = 3; // token + int64 master_id = 4; // 站长id +} +message CloudUploadFileReq { + string dir = 1; // 目录名 + string file_name = 2; // 上传原文件名称 + string file_size = 3; // 文件大小 +} +message CloudUploadFileResp { + string method = 1; // 请求方式 + string host = 2; // 域名 + string key = 3; // key + string token = 4; // token +} + +message User { + int64 user_id = 1; // 用户id + string nickname = 2; // 昵称 + int32 sex = 3; // 性别 + string avatar_url = 4; // 头像地址 + string extra = 5; // 附加字段 + int64 create_time = 6; // 创建时间 + int64 update_time = 7; // 更新时间 + int64 master_id = 8; // 站长id + int64 is_auto_added_friends = 9; // 是否自动被添加好友 + string phone_number = 10; // 手机号 +} + +message GetUserReq { + int64 user_id = 1; // 用户id + string phone = 2; // 用户手机号 +} +message GetUserResp { + User user = 1; // 用户信息 +} + +message UpdateUserReq { + string nickname = 1; // 昵称 + int32 sex = 2; // 性别 + string avatar_url = 3; // 头像地址 + string extra = 4; // 附加字段 +} + +message SearchUserReq{ + string key = 1; + int64 master_id = 2; +} +message SearchUserResp{ + repeated User users = 1; +} + diff --git a/pkg/proto/im.business.int.proto b/pkg/proto/im.business.int.proto new file mode 100644 index 0000000..6e8da25 --- /dev/null +++ b/pkg/proto/im.business.int.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; +package pb; +option go_package = "gim/pkg/pb/"; + +import "im.common.ext.proto"; +import "im.business.ext.proto"; + +service BusinessInt { + // 站长权限校验 + rpc MasterAuth (MasterAuthReq) returns (Empty); + // 权限校验 + rpc Auth (AuthReq) returns (Empty); + // 批量获取用户信息 + rpc GetUser (GetUserReq) returns (GetUserResp); + // 批量获取用户信息 + rpc GetUsers (GetUsersReq) returns (GetUsersResp); +} + +message MasterAuthReq { + string master_id = 1; +} + +message AuthReq { + int64 user_id = 1; + int64 device_id = 2; + string token = 3; +} + +message GetUsersReq { + map user_ids = 1; // 用户id +} +message GetUsersResp { + map users = 1; // 用户信息 +} diff --git a/pkg/proto/im.common.ext.proto b/pkg/proto/im.common.ext.proto new file mode 100644 index 0000000..62448cb --- /dev/null +++ b/pkg/proto/im.common.ext.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; +package pb; +option go_package = "gim/pkg/pb/"; + +message Empty{} \ No newline at end of file diff --git a/pkg/proto/im.connect.ext.proto b/pkg/proto/im.connect.ext.proto new file mode 100644 index 0000000..4d7d161 --- /dev/null +++ b/pkg/proto/im.connect.ext.proto @@ -0,0 +1,232 @@ +syntax = "proto3"; +package pb; +option go_package = "gim/pkg/pb/"; + +enum PackageType { + PT_UNKNOWN = 0; // 未知 + PT_SIGN_IN = 1; // 设备登录请求 + PT_SYNC = 2; // 消息同步触发 + PT_HEARTBEAT = 3; // 心跳 + PT_MESSAGE = 4; // 消息投递 + PT_SUBSCRIBE_ROOM = 5; // 订阅房间 +} + +/************************************消息体定义开始************************************/ +// 单条消息投递内容(估算大约100个字节),todo 通知栏提醒 +message Message { + Sender sender = 1; // 发送者 + ReceiverType receiver_type = 2; // 接收者类型,1:user;2:group + int64 receiver_id = 3; // 用户id或者群组id + repeated int64 to_user_ids = 4; // 需要@的用户id列表 + MessageType message_type = 5; // 消息类型 + bytes message_content = 6; // 消息内容 + int64 seq = 7; // 用户消息发送序列号 + int64 send_time = 8; // 消息发送时间戳,精确到毫秒 + MessageStatus status = 9; // 消息状态 +} + +message Sender { + SenderType sender_type = 1; // 发送者类型,1:系统,2:用户,3:第三方业务系统 + int64 sender_id = 2; // 发送者id + int64 device_id = 3; // 发送者设备id + string avatar_url = 4; // 头像 + string nickname = 5; // 昵称 + string extra = 6; // 扩展字段 +} + +// 消息类型 +enum MessageType { + MT_UNKNOWN = 0; // 未知 + MT_TEXT = 1; // 文本 + MT_FACE = 2; // 表情 + MT_VOICE = 3; // 语音消息 + MT_IMAGE = 4; // 图片 + MT_FILE = 5; // 文件 + MT_LOCATION = 6; // 地理位置 + MT_COMMAND = 7; // 指令推送 + MT_CUSTOM = 8; // 自定义 + MT_RECALL = 9; // 撤回消息 + MT_RED_PACKAGE = 10; // 红包消息 +} + +// 红包类型 +enum RedPacketType { + RPT_UNKNOWN = 0; // 未知 + RPT_FRIEND = 1; // 好友红包 + RPT_GROUP_NORMAL = 2; // 群组普通红包 + RPT_GROUP_LUCK = 3; // 群组手气红包 + RPT_GROUP_SPECIALLY = 4; // 群组专属红包 + RPT_SYSTEM_FOR = 5; // 系统红包 +} + +// 红包消息类型 +enum RedPacketMessageType { + RMT_UNKNOWN = 0; // 未知 + RMT_SEND = 1; // 发红包 + RMT_GRAB = 2; // 抢红包 +} + +// 红包状态类型 +enum RedPacketStatusType { + RPS_NOT_DRAW = 0; // 未领取 + RPS_DRAWING = 1; // 领取中 + RPS_DRAW_OVER = 2; // 领取完 + RPS_EXPIRE = 3; //已过期 +} + +// 文本消息 +message Text { + string text = 1; // 文本消息内容 +} + +// 表情消息 +message Face { + int64 face_id = 1; + string face_url = 2; +} + +// 语音消息 +message Voice { + string id = 1; // 语音包id + int32 size = 2; // 语音包大小 + int32 duration = 3; // 语音时长 + string url = 4; // 语音文件URL +} + +// 图片消息 +message Image { + string id = 1; // 图片id + int32 width = 2; // 图片宽度 + int32 height = 3; // 图片长度 + string url = 4; // 图片URL + string thumbnail_url = 5; // 图片缩略图url +} + +// 文件消息 +message File { + int64 id = 12; // 文件id + string name = 13; // 文件名 + int64 size = 14; // 文件大小 + string url = 15; // 文件url +} + +// 地理位置消息 +message Location { + string desc = 1; // 描述 + double latitude = 2; // 经度 + double longitude = 3; // 纬度 +} + +// Command 指令推送,1000以下,IM内部用,1000以上,留给业务用 +message Command { + int32 code = 1; // 指令码 + bytes data = 2; // 数据内容 +} + +// 自定义消息 +message Custom { + string data = 1; // 自定义数据 +} + +// 撤回消息 +message RECALL { + int64 recall_seq = 1; // 撤回消息seq +} + + +// 红包消息 +message RED_PACKAGE { + RedPacketMessageType red_message_type = 1;// 红包消息类型 + RedPacketType red_packet_type = 2; // 红包类型 + string red_packet_content = 3; // 红包文字内容 + float red_packet_amount = 6; // 红包金额 + int32 red_packet_nums = 5; // 红包数量 + float red_packet_balance_amount = 7; // 红包余额 + int64 received_user_id = 8; // 领取用户id + float received_user_amount = 9; // 领取用户金额 + string received_user_nickname = 10; // 领取用户昵称 + RedPacketStatusType red_packet_status_type = 11; // 领取状态 + int64 red_packet_id = 12; // 红包id + int64 send_red_packet_uid = 13; // 红包发送者uid + string send_red_packet_nickname = 14; // 红包发送者昵称 + string send_red_packet_avatar_url = 15; // 红包发送者头像 + string red_packet_small_content = 16; // 红包小文字内容 +} + +/************************************消息体定义结束************************************/ + +// 上行数据 +message Input { + PackageType type = 1; // 包的类型 + int64 request_id = 2; // 请求id + bytes data = 3; // 数据 +} + +// 下行数据 +message Output { + PackageType type = 1; // 包的类型 + int64 request_id = 2; // 请求id + int32 code = 3; // 错误码 + string message = 4; // 错误信息 + bytes data = 5; // 数据 +} + +// 设备登录,package_type:1 +message SignInInput { + int64 device_id = 1; // 设备id + int64 user_id = 2; // 用户id + string token = 3; // 秘钥 +} + +// 消息同步请求,package_type:2 +message SyncInput { + int64 seq = 1; // 客户端已经同步的序列号 +} +// 消息同步响应,package_type:2 +message SyncOutput { + repeated Message messages = 1; // 消息列表 + bool has_more = 2; // 是否有更多数据 +} + +// 订阅房间请求 +message SubscribeRoomInput { + int64 room_id = 1; // 房间ID,如果为0,取消房间订阅 + int64 seq = 2; // 消息消息序列号, +} + +enum ReceiverType { + RT_UNKNOWN = 0; // 未知 + RT_USER = 1; // 用户 + RT_GROUP = 2; // 群组 + RT_ROOM = 3; // 房间 +} + +// 消息投递,package_type:4 +message MessageSend { + Message message = 1; // 消息 +} + +enum SenderType { + ST_UNKNOWN = 0; // 未知的 + ST_SYSTEM = 1; // IM系统 + ST_USER = 2; // 用户 + ST_BUSINESS = 3; // 业务方 +} + +enum MessageStatus { + MS_UNKNOWN = 0; // 未知的 + MS_NORMAL = 1; // 正常的 + MS_RECALL = 2; // 撤回 +} + +// 投递消息回执,package_type:4 +message MessageACK { + int64 device_ack = 2; // 设备收到消息的确认号 + int64 receive_time = 3; // 消息接收时间戳,精确到毫秒 +} + +// 群组用户状态 +enum GroupUserStatusType { + GROUP_USER_STATUS_NORMAL = 0; // 正常 + GROUP_USER_STATUS_Banned = 1; // 禁言 +} \ No newline at end of file diff --git a/pkg/proto/im.connect.int.proto b/pkg/proto/im.connect.int.proto new file mode 100644 index 0000000..454d18c --- /dev/null +++ b/pkg/proto/im.connect.int.proto @@ -0,0 +1,28 @@ +syntax = "proto3"; +package pb; +option go_package = "gim/pkg/pb/"; + +import "im.common.ext.proto"; +import "im.connect.ext.proto"; + +service ConnectInt { + // 消息投递 + rpc DeliverMessage (DeliverMessageReq) returns (Empty); +} + +message DeliverMessageReq { + int64 device_id = 1; // 设备id + MessageSend message_send = 2; // 数据 +} + +// 房间推送 +message PushRoomMsg{ + int64 room_id = 1; // 设备id + MessageSend message_send = 2; // 数据 +} + +// 房间推送 +message PushAllMsg{ + MessageSend message_send = 2; // 数据 +} + diff --git a/pkg/proto/im.logic.ext.proto b/pkg/proto/im.logic.ext.proto new file mode 100644 index 0000000..8a1a89c --- /dev/null +++ b/pkg/proto/im.logic.ext.proto @@ -0,0 +1,238 @@ +syntax = "proto3"; +package pb; +option go_package = "gim/pkg/pb/"; + +import "im.common.ext.proto"; +import "im.connect.ext.proto"; + +service LogicExt { + // 注册设备 + rpc RegisterDevice (RegisterDeviceReq) returns (RegisterDeviceResp); + + // 发送消息 + rpc SendMessage (SendMessageReq) returns (SendMessageResp); + // 撤回消息 + rpc RecallMessage (RecallMessageReq) returns (RecallMessageResp); + // 推送消息到房间 + rpc PushRoom(PushRoomReq)returns(Empty); + + // 发送红包 + rpc SendRedPacket (SendRedPacketReq) returns (SendRedPacketResp); + + // 添加好友 + rpc AddFriend (AddFriendReq) returns (Empty); + // 同意添加好友 + rpc AgreeAddFriend (AgreeAddFriendReq) returns (Empty); + // 删除好友 + rpc DeleteFriend (DeleteFriendReq) returns (Empty); + // 设置好友信息 + rpc SetFriend (SetFriendReq) returns (SetFriendResp); + // 获取好友列表 + rpc GetFriends (Empty) returns (GetFriendsResp); + + // 创建群组 + rpc CreateGroup (CreateGroupReq) returns (CreateGroupResp); + // 更新群组 + rpc UpdateGroup (UpdateGroupReq) returns (Empty); + // 获取群组信息 + rpc GetGroup (GetGroupReq) returns (GetGroupResp); + // 获取用户加入的所有群组 + rpc GetGroups (Empty) returns (GetGroupsResp); + + // 添加群组成员 + rpc AddGroupMembers (AddGroupMembersReq) returns (AddGroupMembersResp); + // 更新群组成员信息 + rpc UpdateGroupMember (UpdateGroupMemberReq) returns (Empty); + // 添加群组成员 + rpc DeleteGroupMember (DeleteGroupMemberReq) returns (Empty); + // 获取群组成员 + rpc GetGroupMembers (GetGroupMembersReq) returns (GetGroupMembersResp); +} + +message RegisterDeviceReq { + int32 type = 2; // 设备类型 + string brand = 3; // 厂商 + string model = 4; // 机型 + string system_version = 5; // 系统版本 + string sdk_version = 6; // sdk版本号 +} +message RegisterDeviceResp { + int64 device_id = 1; // 设备id +} + +message SendMessageReq { + ReceiverType receiver_type = 1; // 接收者类型,1:user;2:group + int64 receiver_id = 2; // 用户id或者群组id + repeated int64 to_user_ids = 3; // 需要@的用户id列表 + MessageType message_type = 4; // 消息类型 + bytes message_content = 5; // 消息内容 + int64 send_time = 6; // 消息发送时间戳,精确到毫秒 + bool is_persist = 7; // 是否将消息持久化到数据库 + string message_content_back = 8; +} +message SendMessageResp { + int64 seq = 1; // 消息序列号 +} + +message RecallMessageReq { + ReceiverType receiver_type = 1; // 接收者类型,1:user;2:group + int64 receiver_id = 2; // 用户id或者群组id + repeated int64 to_user_ids = 3; // 需要@的用户id列表 + MessageType message_type = 4; // 消息类型 + bytes message_content = 5; // 消息内容 + int64 send_time = 6; // 消息发送时间戳,精确到毫秒 + bool is_persist = 7; // 是否将消息持久化到数据库 + string message_content_back = 8; +} +message RecallMessageResp { + int64 seq = 1; // 消息序列号 +} + + +message SendRedPacketReq { + ReceiverType receiver_type = 1; // 接收者类型,1:user;2:group + int64 receiver_id = 2; // 用户id或者群组id + MessageType message_type = 3; // 消息类型 + bytes message_content = 4; // 消息内容 + int64 send_time = 5; // 消息发送时间戳,精确到毫秒 + repeated int64 to_user_ids = 6; // 红包给到哪些用户(专属红包) + string message_content_back = 7; +} +message SendRedPacketResp { + int64 seq = 1; // 消息序列号 +} + +message PushRoomReq{ + int64 room_id = 1; // 房间id + MessageType message_type = 2; // 消息类型 + bytes message_content = 3; // 消息内容 + int64 send_time = 4; // 消息发送时间戳,精确到毫秒 + bool is_persist = 5; // 是否将消息持久化 + bool is_priority = 6; // 是否优先推送 +} + +message AddFriendReq { + int64 friend_id = 1; // 用户id + string remarks = 2; // 备注 + string description = 3; // 描述 +} + +message DeleteFriendReq { + int64 user_id = 1; // 用户id +} + + +message AgreeAddFriendReq { + int64 user_id = 1; // 用户id + string remarks = 2; // 备注 +} + +message SetFriendReq { + int64 friend_id = 1; // 好友id + string remarks = 2; // 备注 + string extra = 8; // 附加字段 +} +message SetFriendResp { + int64 friend_id = 1; // 好友id + string remarks = 2; // 备注 + string extra = 8; // 附加字段 +} + +message Friend { + int64 user_id = 1; // 用户id + string phone_number = 2; // 电话号码 + string nickname = 3; // 昵称 + int32 sex = 4; // 性别 + string avatar_url = 5; // 头像地址 + string user_extra = 6; // 用户附加字段 + string remarks = 7; // 备注 + string extra = 8; // 附加字段 +} +message GetFriendsResp { + repeated Friend friends = 1; +} + +message CreateGroupReq { + string name = 1; // 名称 + string avatar_url = 2; // 头像 + string introduction = 3; // 简介 + string extra = 4; // 附加字段 + repeated int64 member_ids = 5; // 群组成员ID列表 +} +message CreateGroupResp { + int64 group_id = 1; // 群组id +} + +message UpdateGroupReq { + int64 group_id = 1; // 群组id + string avatar_url = 2; // 头像 + string name = 3; // 名称 + string introduction = 4; // 简介 + string extra = 5; // 附加字段 +} + +message GetGroupReq { + int64 group_id = 1; +} +message GetGroupResp { + Group group = 1; +} + +message Group { + int64 group_id = 1; // 群组id + string name = 2; // 名称 + string avatar_url = 3; // 头像 + string introduction = 4; // 简介 + int32 user_mum = 5; // 用户数 + string extra = 6; // 附加字段 + int64 create_time = 7; // 创建时间 + int64 update_time = 8; // 更新时间 +} + +message GetGroupsResp { + repeated Group groups = 1; +} + +message AddGroupMembersReq { + int64 group_id = 1; // 群组id + repeated int64 user_ids = 2; // 用户id列表 +} +message AddGroupMembersResp { + repeated int64 user_ids = 1; // 已经在群组的用户id列表 +} + +enum MemberType { + GMT_UNKNOWN = 0; // 未知 + GMT_ADMIN = 1; // 管理员 + GMT_MEMBER = 2; // 成员 +} + +message UpdateGroupMemberReq { + int64 group_id = 1; // 群组id + int64 user_id = 2; // 用户id + MemberType member_type = 3; // 成员类型 + string remarks = 4; // 备注 + string extra = 5; // 附加字段 +} + +message DeleteGroupMemberReq { + int64 group_id = 1; // 群组id + int64 user_id = 2; // 用户id +} + +message GetGroupMembersReq { + int64 group_id = 1; +} +message GetGroupMembersResp { + repeated GroupMember members = 1; +} +message GroupMember { + int64 user_id = 1; + string nickname = 2; // 昵称 + int32 sex = 3; // 性别 + string avatar_url = 4; // 头像地址 + string user_extra = 5; // 用户附加字段 + MemberType member_type = 6; // 成员类型 + string remarks = 7; // 备注 + string extra = 8; // 群组成员附加字段 +} \ No newline at end of file diff --git a/pkg/proto/im.logic.int.proto b/pkg/proto/im.logic.int.proto new file mode 100644 index 0000000..3a0dd5d --- /dev/null +++ b/pkg/proto/im.logic.int.proto @@ -0,0 +1,102 @@ +syntax = "proto3"; +package pb; +option go_package = "gim/pkg/pb/"; + +import "im.common.ext.proto"; +import "im.connect.ext.proto"; +import "im.logic.ext.proto"; + +service LogicInt { + // 登录 + rpc ConnSignIn (ConnSignInReq) returns (Empty); + // 消息同步 + rpc Sync (SyncReq) returns (SyncResp); + // 设备收到消息回执 + rpc MessageACK (MessageACKReq) returns (Empty); + // 设备离线 + rpc Offline (OfflineReq) returns (Empty); + // 订阅房间 + rpc SubscribeRoom(SubscribeRoomReq)returns(Empty); + // 发送消息 + rpc SendMessage (SendMessageReq) returns (SendMessageResp); + // 推送消息到房间 + rpc PushRoom(PushRoomReq)returns(Empty); + // 全服推送 + rpc PushAll(PushAllReq)returns(Empty); + + // 获取设备信息 + rpc GetDevice (GetDeviceReq) returns (GetDeviceResp); + // 服务停止 + rpc ServerStop (ServerStopReq) returns (Empty); +} + +message ConnSignInReq { + int64 device_id = 1; // 设备id + int64 user_id = 2; // 用户id + string token = 3; // 秘钥 + string conn_addr = 4; // 服务器地址 + string client_addr = 5; // 客户端地址 +} + +message SyncReq { + int64 user_id = 1; // 用户id + int64 device_id = 2; // 设备id + int64 seq = 3; // 客户端已经同步的序列号 +} +message SyncResp { + repeated Message messages = 1; // 消息列表 + bool has_more = 2; // 是否有更多数据 +} + +message MessageACKReq { + int64 user_id = 1; // 用户id + int64 device_id = 2; // 设备id + int64 device_ack = 3; // 设备收到消息的确认号 + int64 receive_time = 4; // 消息接收时间戳,精确到毫秒 +} + +message OfflineReq { + int64 user_id = 1; // 用户id + int64 device_id = 2; // 设备id + string client_addr = 3; // 客户端地址 +} + +message SubscribeRoomReq{ + int64 user_id = 1; // 用户id + int64 device_id = 2; // 设备id + int64 room_id = 3; // 房间id + int64 seq = 4; // 消息序列号 + string conn_addr = 5; // 服务器地址 +} + +message PushAllReq{ + MessageType message_type = 1; // 消息类型 + bytes message_content = 2; // 消息内容 + int64 send_time = 3; // 消息发送时间戳,精确到毫秒 +} + +message GetDeviceReq { + int64 device_id = 1; +} +message GetDeviceResp { + Device device = 1; +} + +message Device { + int64 device_id = 1; // 设备id + int64 user_id = 2; // 用户id + int32 type = 3; // 设备类型,1:Android;2:IOS;3:Windows; 4:MacOS;5:Web + string brand = 4; // 手机厂商 + string model = 5; // 机型 + string system_version = 6; // 系统版本 + string sdk_version = 7; // SDK版本 + int32 status = 8; // 在线状态,0:不在线;1:在线 + string conn_addr = 9; // 服务端连接地址 + string client_addr = 10; // 客户端地址 + int64 create_time = 11; // 创建时间 + int64 update_time = 12; // 更新时间 +} + +message ServerStopReq { + string conn_addr = 1; +} diff --git a/pkg/proto/im.push.ext.proto b/pkg/proto/im.push.ext.proto new file mode 100644 index 0000000..f78e71b --- /dev/null +++ b/pkg/proto/im.push.ext.proto @@ -0,0 +1,58 @@ +syntax = "proto3"; +package pb; +option go_package = "gim/pkg/pb/"; + +import "im.logic.ext.proto"; + +enum PushCode { + PC_ADD_DEFAULT = 0; + + PC_ADD_FRIEND = 100; // 添加好友请求 + PC_AGREE_ADD_FRIEND = 101; // 同意添加好友 + + PC_UPDATE_GROUP = 110; // 更新群组 + + PC_ADD_GROUP_MEMBERS = 120; // 添加群组成员 + PC_REMOVE_GROUP_MEMBER = 121; // 移除群组成员 + +} + +// 推送码 PC_ADD_FRIEND = 100 +message AddFriendPush { + int64 friend_id = 1; // 好友id + string nickname = 2; // 昵称 + string avatar_url = 3; // 头像 + string description = 4; // 描述 +} + +// 推送码 PC_AGREE_ADD_FRIEND = 101 +message AgreeAddFriendPush { + int64 friend_id = 1; // 好友id + string nickname = 2; // 昵称 + string avatar_url = 3; // 头像 +} + +// 更新群组 PC_UPDATE_GROUP = 110 +message UpdateGroupPush { + int64 opt_id = 1; // 操作人用户id + string opt_name = 2; // 操作人昵称 + string name = 3; // 群组名称 + string avatar_url = 4; // 群组头像 + string introduction = 5; // 群组简介 + string extra = 6; // 附加字段 +} + +// 添加群组成员 PC_AGREE_ADD_GROUPS = 120 +message AddGroupMembersPush { + int64 opt_id = 1; // 操作人用户id + string opt_name = 2; // 操作人昵称 + repeated GroupMember members = 3; // 群组成员 +} + +// 删除群组成员 PC_REMOVE_GROUP_MEMBER = 121 +message RemoveGroupMemberPush { + int64 opt_id = 1; // 操作人用户id + string opt_name = 2; // 操作人昵称 + int64 deleted_user_id = 3; // 被删除的成员id + string deleted_user_name = 4; // 被删除的成员昵称 +} diff --git a/static/bat/phone.dat b/static/bat/phone.dat new file mode 100644 index 0000000000000000000000000000000000000000..34bcab7fba2282eddbf95b59d88b39a41ffbb401 GIT binary patch literal 4098913 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

?dM*mjuOMWLfit}FZ+xtOq<&T0Ze-d2z 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

    Z$krU z2#w$!XbkT{6KD#}pgFXF_n;-Tg4Xapd;o2rEwqF7&;dF^C+G}apeuBP?$85zLNDkI zeV{M&gZ?l82EvCh2tI<3VK96GL*P^R42HtzFbuwc;V=S5!YCLGU&0s|3*%rsOn|Ro zB20qG@HKn`Q(!7ggXu5>X2L9(4Rc^F%!B!`02acxum~2z5?Bh$U^%RSm9Pp{!|qVHo!*M1e;+Cd$k^;ZHaOhv5hug=26WP6TYdKJ4ee;3S-a({KjP2J9>m*7_UH!9VbCK+OCfoQDf= z5iSM9gqH*6C7G|lRk#Kz4(3f!DXH^y0mG8QDIpc4hBN`4lQL-`9i)d0kTD>6almz% zATwlvtdI?|Lk`FZxga;>fxM6p@u!cy;8wT|ZVyP_Kylq2a3|aaW#I0BxS#KVvT!fl2lqoccmT@7gHR!0VDV6mhu~qT z2$kRwcoZIk$DuMj5%AEBA@h^)6g&-8;2C%po`b6JJX8xfnLA{D0jfg{coAwsEqDoP z!^`kWz=o6|^Q-V0ybf#LTk-V&>TaG4q^&n0anM`odwY zc`!eqNfKEgvM``T68Sb@bb>_|Ee@!WM3w}UPp~v#dxB*F3lc03h?`gu5Hqg~NSQR7 zRRJ;c>VTMeO+c??t+fF$^SXeeNo0LM+{A`}+Y5xqM%WbaWD?m7Ti`oow!*f6G6h57 z?IJs1XTWut!=mp4Y9|d~SHQpoy94$n*b{Ir!4CnYGX?w@Ff+kV0fmy)_XbQ%%Iphh znP7iFO!zbW0>8p<@H_kg2jC$535Nn=H4X=?NVat(U}#dGqXBgi91A#{;CMjR1SbME zCHN~KR{mr_yCiZdAXfEsKs-O6fwS;8oP&ShU-%Es!v(k)&@WHe)}?@5$tB=&z}X~n zC16Q{s{vz^Mb`qxC6N?==1tK&!F2(Pl0_*4N+gj~0qGK?RwhkA%_NdmBpsv=h#SoS z86i`^gUMQ%1LC%_1nf>CSp&{w56A}D119ANksJZ%6XXoYlpt5Y$^^LsUQUoFpj3jq z0TmPE3uu)fe?VNT02G8mP#B6pQ78t*p#)qX&^&37CE*4r6)-zlbfd^k0jH8k>4411 zmFVVxok`>txD{>-h?#GPJK#>Z3(COVa1WG)d*Qx-EqTL6?++-Qpj<%a1P=rpPf$Lf zN`ePPDg>m<7a|V@G)Wdc955(B#ef0HqDleV5&H1jLFx z1JA;9P!*nsYVZP7hZ^u=z%SQ@I@g3+@DkL9m*Ew76<&ka;f;Wq;Z;-D)qytyh9r@? zP%j{P9o2R9;VpO@8bCv66mT$E>m6te?*`=06&5uK*p!rM8gO?KX%_Hog61ME0@@{I z-h-9_y9$L!tAMJ>IlOg1^(69sK%*q`K|t>$(k7sL5@{PSGC{k5MaiP}0b>$$2soB3 z>KG6+cM6D^I|szfT>|DOWx7JQfS9>^!1iQOkARrDXF$x{D9q> zUj~d#Feczsg0TU`5{wJTkgPsFV0RLk5YQ*VR{=5e#DJK2Qb5c+IUr{KIv{5LCLm^> z5)d;_4Tzbi1;otL17c5^0W)D1%!WBI7v{lySO5zHZc7>J{4Fek#jpgH!ZKJ6D_|w8 z3WzOybrMOM`Wjdp&>-m!>qOQE)Je*0fQ_&THp7;HxcYan6}G{4*a17?`+%#-wsyg8 z*b@-D!w&)Fl1}tvK+yz01*A@}H{fJ~eF04p><@^2@Mn=<;8*x9Aa=dq;g5jW2M+|q z-hD72ZsN~?*ar^<#LR~SVjnyb5Z5{y5c}Y35d-mFXV&#Pyh--At)TsHR%pT z0){6j8c;YH1QrXJn?#BS+?Pa3!1YiPZh%s7V?g}geG`<1o8cC?6>fvu;SRVH?h448 zHPoj}K#FVucL!8Wa8E#$WKr3GvPtCLfX+$ezJSZg=W1Pn`1KA=&u z)`J1v6I2Konc$&-`3W8l*q)$bz_A3C0#YX<*hd12CU`WUT!O~}swa3nU}=KN@B};w zPX+W&$~+y=Bteyc@d=&@hH*af)Ch=o z)m{wPla#3$a6__st$=1punYID3 zr?d-*J*9m>pQNXB2-unw?ikQCiF68xov3p_wItFdAZ3EC0qK)F4BenR^njkw3wlEz z=nMUze?a5p{__AB2p_^A_$XjPay#o|7!04l5co78-uwCthQjAC48DNjFak!xC>R}3 zyLhO^moO%vMN+Y`Fb>AU1o#Rj!X%g+5bOLkd;?QpDolgvFau`7ESMdzD}AWpoPhO7 zgPa@idxCiZmlDhmSd^4m5D*J549Js2z6}_YU{OGW1d9VsCRh@%KYzedSQaoKi7XHJ zH^GX4RS8y#tWsumKwNzdtW{=RK$=ovt@W@0Ho_*@3|rv4fN3Se>RSUYCD;brmDvG1 z1M=Ju%6t#IV0S>LWYM009SMF2h?#$cpI~o5>?!+TKl}{8z_0Kd{0@J>0XP`&Mv1WX zKjBb7hA^_f?r=c-;pqq*g<}CJlh1w}P6WjJtA7Q&lB|9*plWhc?o`0M1g8VGB{&mM zHo@6|qY3^FNR@Qha{&#L$Ugzy68sww^ZXYuB8i+2hjPruk^wRE4FR!mseqXI#(
    umw?j_d6K2a-j11msJ;3*Q;AF^Sw2Fe5>kfOyCC?tr-Z zJptL1MP&oxeYShyKDa+1-sLL?4?uZ%5Gn-3dzB9b#DotA3`!by#emplDh0&fPag@0 zzn?xD5Pv3kEZ{`atsaNU0kMNTq0E!;R6zWV{%NQJ&%m?r98`tpp&GmZ)u9Hw2sNP= zyacu3Wq1W%h1cM9cmwLdn@|_(L49}&-i8Ly5E{Wd&=}r@CeRd`L33yU??Fpw1+C$I z_yF2KTWAOEp#yY;PS6>;Kv(Dn-Ju8cgkI1a`aoak2mN6H41^D15PSq5!(jLXhQO!r z84QKbVHkV?!(jxBgi$aWzJxI_7RJGNm;hhFM3@AV;cNH?rodE~2Gd~%%!FAm8|J`V zmw%02^TwY=$lH9c+bdupM^5PWT>n z!EV?CKfsUh6YPb3upfSgU*K2x4St6|-~b$iKj9D@h9d#-tKv~O2FKw9`~@fB6r6@L za5f&Hz%%eHJO@?bd8h_2Ky|1AFG5YI1usEu zco|-SSK&2y9o~RC@FvuSdQczUg14aoG=xU*4m5^$p$RmFX3!j3zsfCK==>_!AI~h42Dl&2z&~k z!BF@dhQSvw97e#%fOxZUR6y)sqv1;!17l$vjE4#E6-WiaX!$Hn~xQSelJ0PAn@&v>|XLALlt-io`vV2Dm)L>;034- zHQ+_43ANxQs0}Z}EAT432Cu^#PzTLALlt-io`vV2Dm)L>;034-HQ>d7czXGqqYw&tNJT1Qw5cftMcoXVEJ*W?F!Q0RP8bYIh*y`Sa#_%pQ35boY zDKra+O`OmAfE6$ zLl@`@-Jm=4fS%9`dI!Xf_JO|85BkG^fOv2R!iO*jK7x+}Vows!0kQC^fViJm!x~r% z>tH=>fQ_&THp7;Hcq;e~w!${p4m)5cd=I-|H|&8Q;79lg_QF2c4?n{%@GJZl5ckIK z@CO`#gYYLDg2QkGj>55kID9$|C*UtQ38&z6KpeB3fwKW|wEQ=m3y5|82mXcs;5=M_ zi*N}p!xgw15Zl-_NFK3?k?SBOq=M9tCLo^Y(?U8(9}ur`86YEMg3OQwvO+e<4mlua zK#(wQ4uH##R6h)Dh?&!dMF7uKqC>;>H z@Xc@w+!_$O)opM)+yQsOT>;K-YlyY*#nv4n3eJ^a_X%S@ecJ&=>ka|A5#w z2Eai05C*|V@G%UAPhbdq8W3lk_zZ@^=P(SufZ;F#M#3l<4PU|-7z^WIJWPPEU?NO{ z$?!FN15;osOoQn#17^Z3m<@AaF3f}ZumBdqx3CBn!xC5u%V0UIfR(TcR>K-t3+rG# zY=Dih2{ywP_zt$hHrNh3U?+SJyI?o$fgj*U_zCvHKG+XG!!PhF{06_nA8-H;!k=&m z4#N>R3di6$oPfXJB%FfNa0br8-*688fq&sYI3Ez_X1M?t;SyYiD{vLAL5dUq%X1y1 zgjA3k(m+~B2k9XLWQ0tR8L~iD$OhRV2jqlYkQ?$qUdRXep#T(wLQoirKv5_L#i0aT z4<+FSCZ3(COVa1WG)d*ME~AIiZ4P#zwH3h)p-3>Bdg zJOYoxWAHdsh9}@jcq-sX^3Uq01LC6xRRZGk1@vqu7;6iznJ^1x!yK3k^I$$KfQ9faEP}QfPw*~lR6iI!cYW?LNO=~ zCE$7}2{!~ho&2S_6x;|mL20-dZh>3jHn<(`2w0!|v-(cB3(COVa1WG)d*ME~AIb&P zNishGM50*?m7Gyh}oI8=rw;7NE2o`x#$3_KeUuY=D)Rd^n% z!3$6wYQT$76KcUrP#a!`SKw864PJ*gpboql5U;Rxp&rzSx8QAP01crLyaSB`;&|g- zXaY^488n9$@E){;R?s>iKBxIUd;o0%;-jE#p&hh`4gv8|(2mdvItRqeT>@gBuFx$Y zK3m#7AU<2#BOpEs+A|}why(H= z@M%CCet#CQH5qIVh0g;zC(k?%gD+q>jDV2=abQ0RMhC=)D8Ga;Fg73#^~b^ZfcP}! z1o$c-j`=4B#Ah%k!DRRvzJVzLG0#+(2Gd~%%nXS4zGlH}m;-ZR9?XXYun@k5MX(r_ zz*1NS%V7nqgjKK_*1%d=2kT)2Y=lj)8MeT8uobq!cGv+s;d|HxyI~Lf06)S{uow2h ze)t)FfnVV__#OU$18@-jghOx`j=)hk2FKw9w-a$0^)qI55dDw5h}qW@F+Y6k3(g6 zA|TE^`y@OCPeT=W2A+lIpej5M)!+rF4mIFKs0p>;C8!NA!z%%CKfemE!Rzn_)PXml zF4Tki@K!+F&u>EmXb6qq9cT>iLKA2T%>v>?zRjTpyaz3z6|{!;;R9#`ZJ`~s4~U_iALttpXDaRo{b2wM42V+}e+Yx%Bls8w z!zVBVK84R$y9f{8E*Cd1e84NQTl z0deX2L9(4Rc^_K%ARp9?XXYun@k5MX(r_z*1Ni5a)qe9uQ}JSrHIteOVb0 zXMI@}5VyWMAWkf^CLqoyvo;{k`m#=$^#L*A29b@h2{ywP_zt$hHrNh3U}r$w#Pu^Ba=n*&?5HlYOh4I3jwt#pAxgG9+JK-)U19!tcP!{fm`vT%M<$fp!4?uZ%5Gue!@Gw+_ zN&#^{KLU@!V*&A!^f*)wh?D0(0Z#_ROVU#T@nrrqR0*h=%#8O8JPXf3Rd^n%!3$6w zYQT#Du^Kg@7Q6(t;bnLQUWM1-b$BBnew;e+Ce(#`P#@lcx1j+vghm1JTKNt%hIgR} zG=*l+99jg#8on10cX&%^1+C$I_yF2KTWAOEp#yXbh;5@2bcQa_6}mxp=m9;U7xWH@ zeXtMog?`W<2Eai05C*|V@Nq!wgM;A{7y_TdXD}2#hhgvq3=jDK_g}!sfY>WX!D#pr z#=uw@2jgKvK-|w?1;m3p5hf`!IUx3?uLEMQ{0623#GN@6ror@pxYi7q3A11}%z?Qu z59Y%HSQrrd;J2^{76-%~wIm=Oi=`sVU^%RSm9Q!x?u6B_2G+tlSPvUuBW!}ruq7b& z!S7%zY=iBv19k?)efT}>g53eJs(S)rXZ!(vgr8t9?1TLQasT`bzre2nG4pQ$v2FYg zf4~7a7!Vu4pKu5c!x1rq=B@M4$=q2{hT2n9`1~g2{H%7gOVj69`39Gu@__u zh#xsS#(!X%Q$2#h^Hpfa{?o+yJHEMz{$|!_9CD z+zPkB?QjR&33ovmxEt<)vT!fl2lofW!&D9)fbs!xKR*Z+;30SzDnccA1RjOQ;PHUC z(aP`yJPA+1(@+JTfoI`4s0z;q#6wvvAU32I0^-G`dO$p#)(D6n@Wp`tAO8fz23ad0 zp4nash%K{rK+N+pyaKPnYw$X}0d?R_s0;O=en70xTktkCfQA9F!!`}d=Xbtbf2LZ7fZJ;f*gZ9t?IzlJt3|*jWK&*2&=ng%g zC-j2e&jYQkuVBI z2gHN&C5(ZwFb>AU1o#Rj!X%g+5MP+}HGBh8U@A<5=`aIk!Yr5#b6_sagZZ!k7Q(l% z2o}SVfcS2&rLYW^!wOg#5MSxF3Rc4!SPSa{;)}r6!v@$0n_x3+f$v}|Y=i9qaX;^X zo$!4?e0kX}*bRH&2lx?wg1rIpb!PiuKl~gJ-(vO){0hIp@9+m4fP(??{b+x}Avg?2 z0^(cMj>0iG4kzF*I2jQCCvyr;!x=aWf5SQWCm{Z1*rKx_b6AZtK8aM>U`$;30T8AojtEPzfG^N8vGe94f;T@FYAH z5c}8DPz9cWXW==h3eQ8efY=gVfa(G9Tvr2LgqlzbUV_^2GQ0w>!fOHX=)4YZKpl7! z>OwuJ4{yQS&>$cl!G_QX-hsyOE;NCr&~K70Uepe?k6_Rs-3 zLMP}9U7#y;gYM7+dIrQ-K=y*(&Cx zZQHiLd!Db?zw_9geRg(sX5W2xW@mjtB9Is)0ZBnJ;0KZee-I$pmw8iwlpqyI4FW+L zkQSr^=|Kj;npH-S31kLYKvs|qWCuAwPLNBmmXaIf0eL|_kRKEP1wkQD7!(0TK`~Gq zlmI0`DNq`e0cAlsP##nO6+tCX8B_sPK{XHrs)HJ!Ca48!gF2uts0ZqU2B4u}SJ6hG zF=zssf@UBXGzTp}OVCQNy3rc60c}A$&>nOE9YH718FT?%K{wDH^Z-3UFVGwG0ewL~ z!P;PdFaQh$gTP=g1Plekz;G}^uq)C?5CTSl(O?W13&w%*U;>yZ*j02Am<*2Ay*mYwLm<#5C`Cx%y4R#?|1QvrOV5wmDNXx)-umY?EtH5fo2CN0^K&W8f z0bdU`fQ?`i*bKIStzaA24t5CkVey?{7uXH=*VS zcmy7UC*Ub~2A+c#;3aq^*lql4@CLjE@4$QT0el3Xz-RD9urv4-d;{OX5Aaj4TeV-{ zH~0hof-oQTwg8+~Mqy(uzYT=SA=RlAKqy_0fdXNER1eri)kOgD~ z*+6!X1LOp`KyHu+V=oR$u&N{|1xkZ5pe!f{ z%7Y4^BB&(na@nX1s(`AX8VC}CT;l4W2B-;Yf!e}lm$(k73+jRTpaEzI8iB^331}*e zbdj5ZV9*@204+f)&>FM>Z9zN1YF&HK0dxeNKxfbebOqf&chEzy>qbw|3-ktkKwr=g z^algLKrl$KGdLIw0YkwsFdU2kBS8ol1x5>2566J9U>q0^CV+`x5||98fT_YlcLt|{ z>0kz!31)%WU=ElI=7ITweR^*JSO^w@#b60o3YLN8U3-OumkJ_yTER+NAPr!_kw+3KR5smfV}iB8$brQi4<`>QlK;_ zBYbm_%Yt&CJg5LFf=Zw=r~;~jYC>ceIS5n-H9$>J3)BX6KwVG|)ED-<$PGY4&;k*N9*h1z)5gQ zuyQ^P&VaMv95@dyfQ#S~xD2icHcsX$xCX8ZHZJ7`xCw57+u#nk3+@SH-LRJX-~o6D z9)ZW;33v*gf#=|bU>SP}UV+zw9nKr@7Q6%R!3XdWd=lFGD9@k47w{E)1K+_9@Duz3 zzri2y7lirzZ(klDEC>g}g9soZ@C1>BaW2nZz#BvcJ|K!vB8n1673@f(f#@Ixh$(Dv zkz;|_AP$HtSe$quK1cu(0$-3wsOTam21!_z6eI(FAUW^{0U!lPDZF)&Q-RbV5TpTV zK{}8gWDxAQGJ;Hkk1M*&APcLqf@~l=$N_SKTp%~dBkXgL^9q9<@`3!I04N9w34tzg zVNe7V1;qqAisGOIC<#h|(x40|D_n4eSq_v36+lH$2~-AEKvhr;1cBVf*80cZ#sfyST-XbPHvV9*@204+f)&>FN6#<_xO3)+G9pabX#I)Toh3+M{E z3DyR?gC3wK=mmO%KAcNBxc5HJ)B1H-`xFcO3aZ(W>GU^Ey5 z#)5HRJeU9`f=OU9m;$DPX<#~-Ay`G431)%WU=ElI=7ITO0ayqYfyH16SPGVb< zU@zDQ_6znye*hc=hrnTQM9>VtVLXlsHrVx;V870b+t!AU232Sha~OScQxS z;)4VrA@Bu>Kw^*tBo!>H$%Ip`O89}~z#jyF6d)x?1yX}RkOrg$=|FmrK?rqw&nQ?G z%>*)oETqZGl5B#Fjn58pfSe!~$PMyXWmpUp z7py*)03`*hY^4O-MQKn5lm+ELc~AjV1eHK#P(`o?TNP9TL7+OQ0cwI;ptfL@tq!Ow z*x}Rz^+5yB5HtdfK@-pvGy}nc6-#r_0<;9JKx@zjv<2-zd(c6!qv!}afzF@{=nA@l z?w|+g33>_E277}(pfBhL`hx*rAQ&WA4hMrFg0;b+U>FztijFzGr=q{8_WT7!8|Y@EC36^BCr@N0ZYL$upF!aE5Rzk z3VgL-wQdbq3)X>9upVpx8^I>98Eg^k3~mM6z;>_$>;${OZox9P2kZs=1Z#u)!2xg( z90G^I5pWb71INJ$!SZ|(oC2r88E_Vy1Lwg7!LE=O!6m^8{4%%#u7Ydex?snC1Kb3+ zz-@3xu+q2-?t%N@0eA==fydwpcq-Us`I+!2rmpeAT@B{n=zrb(s2mA$LzW&?02M7zof$$&#hzLAEB;WJfS4c_hz;U^xF8;g4-$ZcLOEB?zQPH2DiaAM91?>hASp-&{6KQx4+4ZgE=~%N z5~KpDL7))o5~l%ag$8a(I*=Y@5VE*DX9Sr*W{?GB1=&D$kOSldxrF#Ga&C}Euo|8h z;UV6dZ0dN02&HbHyVM)pb2OSnt@=@9JBx}K`X%u zvo&ZV*dezC?Ld3MPIm{;5p)8bK^MWUNL@iU&>i#uJwY$f8}tEvK|jzR3;+YcATSsV z0YkwsFdU2kBS8ol1xAB0U@RC1#)Ao9BA5gwgDGGtma6>J0B!4APL zgFC@4up8_Fd%-@i9~=M&!69%M905ncF>oB504KpIa2lKu>^J2sI0w#y3*aKS1TKRs z;3~KVt_xNyH^5DB3)~j0b>9JZ1-tCr6YOGjA3PB3H{~IC1RjGY;3;?po`V%M|-;5+yMeu7`%H~0ho3U=bceESCv5Eg_3;Xwot z5qN?~zzcYT$b$W*_<$%NDu@Q6gBTzthy`K`_HD{IATEdp;)4VrA@Bu>Kw^+Yu&;|I z1<8OPNDll#07wB+f>a>2U|%T>1ZhB8kPf5=89+vm31kLYgcb?)+np6;1KB|ikQ3wr zxj`O~7vvL$`6_aLPyiGJg+O6Y1QZ3uKygq)807L?5|jd^K^agMlmq2K1yB)G5@x%| zl|dCy6;uO3pgO1lYJyszwqV}?tpnQpteL+9a9}EBk!63of;9xKW z3!1m7J>N zn)~1ZcnBT|6I`0d;EAB`x@i0}cm|$>7vLp$1zv+U;4OG3YuTanJJ!I1paw;37u=5rHR&B;0gqynr`| z417Qo5LF0qTSWuWK@1QR!~(HF91s`81Mvkbx&$C0@D(hpi9lkI1SAE?fFDRMSl#d! ztPBG{3Xl?{66~a;27w?ANDI;lR#(%541$$UMvw_)23bH>kPT!9IRra{IYBOv8{`qJ zLgoeeKz>j_2z1q^ASfhQX%q%UKv7T(6bB_hNl*%u24w_m-DN>JP##nO6$Lxpl>}?c zl|dCy6;u<7x}yjJ)df3>8lWbq1!@cXU0tmM>VkTpK4<_Mf<~Y*Xd+min}TK_7&Heh z1Uow|K`YQ2v;l1et99)_d(Z)N6c)R~=_FV=cLrTRSI`Y~2R#HUv7Vq8=neV^(OfzA z6|BYe1O34OFc1s^gTWBNYTZyUOt7Xm9E<=XK?oQnShE@p#(=S492hTH-IxF-3f2ZE zfyrPBm0kz!DOick0<*y!Fc-`N^T7hJ5G(?Vg`Mtel}o@ z)&^sN*dPvw3*v$JAOT1Sd_f|?@|+kX0ZBnJ;0KZee-HptfRuvOjZ`2t2n1BB%r^gDRjZs0M;Sbx;G;6s(+Uf!d%Bs0-?W`k(=5 z2pWOLg5|jhXbPHvV9*@204+f)&>FN68iv*Nxh-f1+Jg?Dqp;Q`?gTo6E}$#uCfsp% zGTlKB&=d3my+I$)7xV-D!2lth%f>)32n+^8z)+!=OFRq=2P42p5CTSl(O?W13&w%* zU;>y3CV|O6-)!u!3;1H%mTB)957cX;SO*fm=6|!gbUU>R60SUIl% zE5RzT8ms|p!8#BM)`Ja#<#{961U7>$U@O=Lwu2pDC)fpcgFRp`*a!B51K=Py1P+5E zf>r*b;21a#PJolbWOq_dfz#j&I1A1RRyWRr3*aKS1TKRs;3~KVu7exkCb$J|gFE0Z zxCico2jC%iBv`Y044#0e;2C%hUVxY26?hHa2;baw<1Kgx-h&U|BlrY9gD>DK_$F96 ze+NInPw)%;7OaZ?0e?Z5pZ`{QfUttKlyD$ChyWr2PY?-s0dEi)_z0GbC?G0`2BL!) zf*oK?5DUZxaX?%lrmLdyKzxt@Bm}-75l9S@fTSRqV0rcf$$>uz04YF9kP4&*fglY? z3(|q~AOpw3&;wx3D&up9pnHxK`xLRK9C<25NupQK~M-321P(o!G@z0 z1I0lJP!g09tnauqCYxUw32K4bpbn@D>Is(l z`ht~w1Hq2Hp={U)HPU>(HGKrpMCgBGAAXa!n>HlQtN2ik)Uf@Q2D z=ma{0E}$#u2D*bDpr>HR-b=6}?G5?}cBFklKhPfx00Y4wFc=I0L%}dG9E<=XK?oQH zMuRb6tYGzd92gHKfQeudm<*Nuv)P3NNd1aunvTR^@SU_00Wc7k1CH`oLAf_-2= zH~il3=9V&1gp;@K?oQH zMuRb6EEosIg9%`wV6|=%m<*2AySf1yAxnLfc4;FxhU=dghmVl*# zwZUazIamQ!f>mHOSOeCAbs$u*y0IQ?02{$3uo-LtTfsK49qbV7LcJ600=vN;uovtD z`@sQl5F8Th+Itur0Y||xa2%WfC&4Lj8k`aAcknDY2hM{F;3BvLE`uxJD!3-th_dV8 z2Dk}sf!p8?xC`!q`{03KrSVX(OVcC4&go;pn&%V2Mt(jOtnxn-tgb#6tZKaw>`L-d zuoL%6u*k0ki~L5g$ZrKZoOgmnelJ+$4}y&r`zToCPl84MELh|(f|c`E@J+B^#_xjt ztp5N%!7uO|`~iPKnBV`7%L9Z3;Xrs00Yn6zAQJEb-hv%qWZ(m$fT$oEhz??am>?F2 zEm--)0dYY*5FaEE?3^Y9z911u43Y>|;7LI;;0KZee-HptfRrE=NG;e|4g_gHT96K; z2N^&{kO^c4Sp=(WSwS|C9pnHxK`y~+W^RxN!YtLo(hYlGzlYbg~3t78=fJDf^_C9VvrfU2Mx2m;kX4Nw!* z0<{HexphEYP!H4x4M0QC2s8#wKvU2R1cTZunlYnJHSq` z3+x7agat0od%-@i9~=M&!69%M91-j+9|gw*>!UvoPJol(6gUmefV1EnI1ere*57>* zTmqND6>t??1J}U~a1-1Dx4|877u*B)!2|FRJOYow6T!;oDR>5+gBRc>cm-aAH{dOJ zCk%II@ICmzs*m6k_zb>)uizW_4t@yM27iKI;5YaK{(>-n{%z#}!h&!hykIRQ0*ENs zIrRjQfEVxvk%1400-_2QIU0x#Vt|++7KjbvfVdzYh%Z)*eyg5 zs19m?nxGb_4eEfppdP3X8i0nN5oipWfTo}s2nNkT3&HNbT7p)fHE09cf_9)i=m0u` zPJ;bG=nT4muAm#}4tju|pcm*3`UrNH+ZXf${lNe*5DXIRPIxdF0)~QNg5Bi~2P42p z5CTSl(O?W13&w%*g55Dr029F^Fd0k%Q^7Pa9n1hT1-ogV1!jXeU@n*k=7R-bAy@;`+lUa$}B2M2_iF7iQeNOG|w?`9Gn0r!6_k;OMDuf0cXKEa2{L$ z7r`ZP8C(%Ixg1^v*T8jf1Kb3+z-@2`+y(apE9d**fiT=1#Y6B2JO)p|Q}7Ht2QP#( zF3&H)EASe;0dK)O@E&{sAHgS~t;^wO@CAGY-@te91N;QPz;EzJu+#k)g!%h#i3bP^ z!h!H00*DAaK_tP-*$a4s$iN3g0Z~CT5FNw-F+nU48^i%|K|By2BmfD4FGwUjbaNLc z21!6tkPP^N z1;fB_FhZE_HXjK>z$h>pi~(c8I4~Ye029F^p{d)&WWj3P6fhM`1Jl6_FcZuIv%wrN zSFkJ6JTMOTjX*9IOBV}iBZ|uxC*Wb*5a;%8-iV|Zh~8aRmj_dwVgYHU7GHKd*D8J03L!zLW^js*pI;z@Dw}) z&%q1u61)Ph!5d+ai~JV61Mk5H@DY3hpTQUK6?_wByU5?c5AYNG0>8l@@E3#$6Yu{x z9w4l+#YGMW!h;APBJc!}fEVxvk%5nJ&P9#_qJn53I*0*cf>?wPi(C*C0);^lP!tpc#X$*B5|k3G4VDIFKv_@@ zlm`_+MNkP;22}*B&s9M+5Cp1&8iG}%nxGb_4eEfpg4KIcNb|f>xk4Xam}UcA!1zAPjSnJAzK2Gw1@kf^MKY=mC0yUP2oexi{zo`htF- zKNtW8fBzFbm8EbHH3M56lM(z(TMHECx%!Qm_mx2P?ozunMdeE_%X13Bs$WWw3Zw>s zf>rf2AT3A-(t`|wYW3HT--m$uHP( z6%ecy6cnt|782~(3xgtpB`ykzf#RS9C<#h|(x40|3(5($_wt|us0b>7%Ag9U3aWu1 z!H%Ljr~zt%TA((l1L}f$pgw2-8iGcGHMGW{31|wMfndSfS98z;v=rX#!4bjUbUO-;f#cu= zI0;UH)8LGd+)bi&7Mug;g${1j1#l5u0+$7wtn3Q73a$xO8rQ)Ma1-1Dx4|87SFp-< z58MY2z(c{R-y`rCJONL^Gw>X|5UeJ=1h2qr@CLjE@4$P(8tez~5qtul!56{W;8*Ys zdCTfhULrynr`|417Qo5EVod?0iKB zF+fZZ3&aL-KwJr(kOSldxj=4^2jm6$1nbkx4+?;S zpb#hwih!b^7$^=(fRdmTC=JShvY;F&4=R9)ppsyH^p!ysP!&`IL7+OQ0cwI;ptfLr z^mRa8P!H4x4M0QC2s8#wKvThbXY?EkP^L8ngjzK|8_v=-Y!1pd;u6I)g5t zE9eHggC2tQ(f0(sKyT0o^acGue=q#k1^nw*j2EmRZBWW_RDzjjZS+WTBR3xil zPcyO!_NXDdV2=@U2$nb}$OUqPJRmQ~2l9ggpdctDSe^@mBA_TJCfMGKgA#(}xg;nB zN`o?jMJ@}7%Ag9U3aSZKyg{Hkr~zt%TA((l1L}f$puS*7+5j{JjX-12 z1T+QBKrmsu{1BFh>lz0#r42FQAV3_dEMIH`D2sPZ2kst(&0;7ewNt9*` z7z@UM@xoh|W&)T9CJA;5CW9$LC6{h4saHjEnIeq=YY9j9+(dn zfQ4WYSS(mJmVl*T8CVWh2nAd=R)SSvHCO}I3IQ(hIuHuhgAHJ#V8^}*YzAAvRR61WVm2sd2htKb^A4sL*(!qdn~d<)zLcfeh6PiWv0-v1Rx>s1&IVJjl>`cND7hxKf(S=CkOr@K(K#*DL_iW@|+5!27w?ANGn+6bb^&( zdXPb|f2#l&I|H^{Gb3R2nvD1pa>`m ziU~n3a&b@slmw+fX<>o;D_sVZ1?50_P(f&)Qi&^qN}w{R0;+;)AP7_kH9$>J3)BX6 zKwVG|)CUbfL(m8`7JS@T;wHj4cL8Y%nt@=@9JBx}K`YQ2v=Q37fNeoL&>nOE9YH71 z8FT?%K{vrhvvdbNKu^#M^ag!EU(gTq2Lr%BFbE6=L%>il3=9V&z(^1RMuE{_3>XW> zf$?Ahmq`fZ!i@_4GR0wuy zmVxEMCAVY+SP52v)nE-+3)X>9upVp>=DWxn!6vX7Yyn%rHn1J+06W1h!OD3z*aP;0 zePBO001kpf;4nA>j)G(0I5+`Lf>Yo$I0MdtbKpF<04{<{;Id#R5eJbDToDPgE%0rV2R^__#gpD2z)^zkQgKZNkKBf&buE- z4*Wp?NC8rUR3J471Zf1zb6UY_OFEDqWB?gKCXg9q0a-ydA-}sT$PRLVoFEs-4f24z zARovN3V?#35GV|afTExnC=N=1lAshQ4a$JBpd2UVpQLA!q~|gC?LUXa<5obI<~`1g$`8&<3;x?Ld3bL3kOUJa+`0 zg!67mXQ8J%oGzfNaNjNI2D*bDpeN`hG;oP~gFc`y=m+|P0bn2)1O|g4!Xy`YC>REY zgArgP2mzzOXfOth6-v8f9|y*R31A|a1SW$iU@DjfrVHy`;?OT0N4A!9~=M&!69&1$QfRVkAS1#7&s122v;H~@kznk?cx+T z4bBK7T$-~&0hi{SaKY{3ypYVTx&SVMOM=a=a~WI#SHU%K9ozsn!7Xqb+!1WHsJq}E zxDOtHhu{%-44#0e;F(}^Iz0z3z)SE7yasQ;TksCN2Ok8RsN^H~1U`c=;HzNM+I$1w z!4L2g{1R-|m*3zI_zS{B{FlZ9gazS1cn|?Z1fC!g@B-c-GVlRWKvWP7L>H`_V}O_- z7KjbvfVd!@VACtb2MItz!HUioBm#*+5|9)m1AZVm@CO0H68Dri1xN`}fz%)nq!H5i zX{)qCbcb}TN)Iv!m0WAe2r_}pAPdMUScA<5vV$BTC&(qdbImh1$OH0%d>}t401ARa zpfD%`ih^RGI4A*13PaohmI9?g8Bi9K6Sld;~bYm2hrU?o@uR)aNQEm#La z!FsR(Yy_LYX0Qcp1>3-OutTtZtDRsM*bVl8yvhZmZ=j71<# zM8WpuNt#H4?bM4j-mHo&SU?}rL;+C+E3s%Gy71iXD+Xy|vMQEf`H3x9z&L{CIWB49 zktV)i`AHyzbDiu71v?5~!7`tSG>HWZm;@vhY^!9X@dL?$KWPF4%X13BBBvxxDv+90 zfr4ct4Xe_Ebb=jVdeUSNEMpl-lZiB$1>08^kQHPTtXQ%Owyzw5#mOmHvE%}|K_1fN z6>O_~f}NfGf(0xfSPlyc7N?M4kqfh=2q-F8oMNOY&Z-hZBsZe0Bq#++gEF8jCvn*hU>Dd8_JF-$AJ`8LfP>%=I1G+}qu>}g4o-lR;1oCw z&VaMv95@dyfQ#S~xD2j0b+t!AU22t;(~Y}zVQG34@d}n zK_ZYCBmqf5GT;Z23-+Af9|V9DASFlzQiDK{2BZb)1bZ5v9%KL+K_-w{uqWGDKvs|q zWCu9}d*3rB$R*fE;&OvLg1sf07vvM{<9GQ%0l~g#Sr8NwY|wRKPy`eeZ1i<8P#ly1 zB|#}r8k7-&-8h-Dpd2Ukh2gZX5U?P|VCW9$pDwqbQgBf6^aLj$9c@~%r=770i9+(dnfQ4WYSPYhcrC=FY zE({E(y{`}wyT^trh30O_DzF-?0c*iJ;jBv>3f6-SV52b0rP%~FgDqey*d|yuwu2pD zC)g$YbtSf2DDNWg0eitduwU5h(i{K>!69&12~EP~Ano3a)|c;0Cw}Zh_n24!8^M2{yykeeeK01dqUD@B};s z&%kr=La?dQUV>NPHFyKwf_LCO_y9hFPlC-P_8EKuU%@x<9sB@4!7uO|{1I#}xW6Eb z*S{qmAS?(6!h;APBJc!}1RF)*CG-u@sq_|XI6-9K1EPSaAR34cVt|-J92YPahz;Th zb`KC2!~^j`0+0~+f<%Ii-$)FSfTSQ9@B_(#KL`LRKuW>-=u?5zAP}ShX+b)W9%KL+ zK_xzRCpd=^-N(*+SEd$Dea-h6mSK11oBB%r^3w9l=0;+;)AV{$5VRcXg)C9EzyY|)w zbwFKEPq1rmeb4|j1dTvr!QMV=0-AzmAQ&_UEkH}q3bY1o1bbVsEocYYgASl0=pEB^z+qrG7y(9t z5Wz}g6c`Q0fU#g47!M|ZiC_|#EZ7uGQ@~U(4NMm-t20oB504KpIa2lKeXTdqa z?)lGy3*aKS1TG8q#l0)wD!2x&gB#!`xCL&5JK!$32kwIh;30Sf9)l;~DR>5+gBRc> zcm-Yy_Sfur%cVt|++7KjbvfVdzYhz}BgguoXh0*OHq zkQ5{n3TcWf4?mDx*zB_E4+206kP@U4{N3iMK_EyYJaenk3Ss?)bb=K^dXNER1eri) zkVWX?;$#)9c(bu2JIDcYf?OcCV26_j6a~dVaZm!31f@V} zPzIC*5zF;GQ8VEKF zsi9yaxEcvII;*i@BQ~3Wrl6T%!()PlJZ_v!bI<~`1g$`8!A94#0c}A$&>nOU?02~% z=ma{0E}$#u2D*bDpeN`h*nL!Q&Fz8H!#zM|L=dmOfU<~ z26Mn%Fb~WJ3j`~Kg+h?)J6;49gC$@oSO%7Z6<{S;1y&1oTx-BuunvTR^;wD30dNo;0*Ap7a1q(ykCW9$p zDwqbQgBf5Zm<47FHVSSIm<#5C`CtK92o{0GUc2zFn$Qn063 zs|2e^tA+pXe+0WHSu5Cm-8#W;4?+ctyk4-#8w88IQLxCH1dF^`u*h2ki@a5^$lC;q zyj`%!I|PfoQ?SUp1dF^|u*iD^y9M0~_6ZhwzhIFM2p0LEV37|AkrJsj9R^2)Hg3sL zmK+oO+>+zMT!#~^Iw@3jOHK)S98L@89L@+^9nK22i*tfSJ}-oI16eN!7WtxJkuM2D z-ByfjpTVL*qHxUf{hw_4c>sa;2n4mK7fzl6Zj0i2-Xw& z6?_BV!4JV6=Klo0z;Eye`~_ir{#~CvKv)nCga;9XOYUMG5qN?~zzcW_Bi%JTGD~~} zo4Y28u*?b#83Fq!f^;A~$N(~eOdvDJBG{}iSwS|C9pnHxK`xLRK9C<200luIP#6>e zML{u89F!1F#Z|GC6jD2s5_}v=3!x5Wgfb3gg_jQH1dUtM{g2SbEvX=kb*Lzea;qwl zrZT7^oOP?J3N0L}u_Opo7i?cO1j|@WPz%%sbwFKE57Y+@Kts?7GzLvTQ^974Z3cot zbI<~`1g$`8&<3;x?S#;nI^_1CgD}Z0=?FRrHa4s?=mNTeZlF8pA=qfKo}d@#EyQ;p zhVCPraQo^j*g&#=f{i-s&yoQ`PnTvO7$jKV#9+Z5o(~ahto2aAhBFNlY>f19!Fmuz z2-b}rwX6LD9toM&tmodmypk4hEUyMreGgLm?bQBOJ)l<9p(u2+yjBRLWo;3PY85N z<_i{ZfneWCSSS>As}>3SUE;+;ceiATV2PIs(cF?{!YYU5f<<0Inw7%N6k4@Pu-AlF z3-V&?Se(#Az0*{f<@jXSmfP;McyOWl+Js>KCmAg00#w|Ecy^Q432=K;F$3L{LkP7 zI0;UH)8Gs^3(kS_;DTT^{GyP~RrO2YvJmWA$`zJe6>NazHEE#V3EJE26CqJiij28an_f!H7phzsI@_=2631Rx>s1&Kgn zkOU+J$$%e7F4)D>9|V9DASFlzQiDK{2BZb)1e+EzJ;)%~*Bmkm_VI;Gf_*C?vtY9( zW)bX51X%@}bTOM?vnFO2Y}Ujag8lE#337qlAP>k3@`3!I04N9w3HIt`VZmMnEh1EK z?}Qc=?5o7Zgluj}alr;5lo0Ie#w7)Nt+JG00}M(FHuj*5U{jQr6>Rdoa)M2?US6-B(et!FZJfn-jjWU{knP5p2fws)9|BUQMuR)q_BFPy^Hy>^q^g1RIQ3Td=Qi z)*($@P!H4>?9K58g1r^qP_TIh8VUA3eq+IU#F_}!$<6&=#~4Y!Z_8po8%L`|pBv3w9Ddxv5J!3-MK~}eu72rFIeOOf<+!ESmZ&1 zMIJ0zFg{33k93p zdl6VH*t4%CU@2GzmV*^wC0GSkgEe3+SO-GEdawa(1e?HSumx-d+rW0P1MCF5z;3Vy z>;?P4esDmrIrk2NLxN3zcUbu8rsF#z*c^991)GxYm|(Na9T#j`wiANQ{B}~X`Pohh zHnQ096ufS{Y2D}CDzf?)4lMFv~sVizHY;FW?O#10N6tLL13_8eE~zj zP%sP(2P42p5F%LL#3(Qti~(c8I4~Ye029F^Fj=r3jVWL%m<8Z3_0DvQV@4fdbBT0*bKs*u8nXEq#=&@)025(S zAPwS7hAHp~Obw*={wYj@&tN*tfSK?)%!1i4Cy@U5%!PUI1)|`t0N=w8un{)FkFXiGz)$cqY=vK78*GPPVF&Dl zU9cPWz;Cb@eusU5^yhIu9DsxH2mA?t!6En?4#SZ^`ZszM{()m~98SPV_!qJi`Y)cW zkS&mY+D-|iik&@>e#mk_&OrJd%;iXKNAft5H;}%b&yoCrG|Qp@6of)h7>YnqCDkF=E+ons!$E8Lk*}2wV*cCfx1u+>cgpU8Z>~0&CgnufTnOJG=sAOsTbmGI0w#!^PoAjfb-!3xDYOai{TPz375iU&SJsjNGZHLkop*}2&56Q zE1?avg?4Ziw1=zV8t4EW1L=QCC+G~K54g8ShCcn}_fhXZMt@)39x9)rO! z1RjScU?>cO;ej;n`6P^hr{HOL2A+kH@Ekl3FTjiN61)trz^m{Yybf=`n=mSnMrPlF zx8WTa4e!ExFb2lL`|v>^4fTEqAHl~k4#vX-mA`d*7cd_dz(QCAU&2@LH7tg2UeSg>PXUtcUMl z1AGrZz(&{vKf-3%0zbjeuoZp@q@I&)upNGd9k3I2!EV?CzrkMk9rnR~H~ftKimleU?AKDcf&n!FWeVM-G+nU zes};Lgoof^cmy7W$6zoFfydzq7z)E+I6Mg>;3;@Ikb2dgfoEYPJO|Ii3-BVm1TVuY z@G86pufrSgCX9l&;B9yZM#H=C9*lvp@IHJ1AHqlQF^q%pFaajQB$y0S;1ie{Nd11F z!Zi2{ro#-F37^9(m<@AaF3f{3U_LB>g|G;|gsj_QUtvce z^(gLyU9cPWz;Cb@eh;Mn!+o$H4!}Y91O5!8uEoFL5c~~?1F1{!2pkQh?!JElsUPwf z9ETHd68?oOMgRL&R>%gY1X96e52W799FP-oL2k$sNd1|4As^(20#GoJE~gL_h9XcD zia~KG0VSanln$h9DFbDp9F&I&P!TFYWvBvGp&C?&8c-8z1yUz!ZKwlvp&rx^r0&O4 z;WTIf4WSVS(sSox{XckBbI}6T+bKqP!51I#3|7r_3KahT5FMtc-BDfeX zftGM7Tn4S6bs)`Jyd188E1?avg?4Ziw1=zV8t4EWp%Zk5YvDS$9&Ugx&=tBtceoL5 zf*#NlZiZfP3-k`8scyHzZE!pEfxd7@AkCfY2mRqr7ytv|F1Q=+fqUUT7!*j;>h6aJ z;K4we_w^7w43EI0@E8n+A@Ddn0YhOJ42LIS1Uv;#!!z(KjD+Xld3XU{gqPrDcm-aC z*Wh({1KxyD@D{uc@4#qy7v6(0FgB1@oOmBTfDhp#_!!2)c$feaVG>M+DewtQg->A` zd2@D+Rwiv#Je$2YJ9mclYv9!Qg= zSHMbG1*>5Vtc7o3T_FAYTMysC2KXL+fQ_&zkpA%g2%BLG`~*J-(!aK?@C$5%?eHt? zfSs@lcEg@P`gi;r?1kT9AMA$%a1j20KjE)HnxuLN{tl!$u7?9@j_Z*?nznj0kmk7l zBh0Zt`ucG=A2CU+pM&5{T5LO#e3 z1)v}lg2GS)ib63c4ke%@l!DSw2FgM?C=V5&B259iSt0g3fR)TnE>~4bTO;LO19RH^NQO1A4;E&K$>6I7w&+5&>!xE0Wc8mg1g}!xEJn&L2y4j01v`L@Gv|AkHTXx7>2;(@B|En zVK5w?gc0x*JPpslvoI2#gXiG|coAL-^vk^Q{W81)ufl8aI=lgI!YFtP-iCKzG`tJ% z!5A0|@52Z1A$$}_dpCRx<6t~YfQc{(Cc_l?1f~Yk-VL9^H24gr!wi@SpTjJe4RZpi zKF@`D@CD3=1+Wkn!I$tAd<~1?8(0EMVHqrk6|fRk!RkO-zhw=qg>PXUtPi9KD&N5d z_#S?Mje)d!%qI8|Hp3S934VsH@C$5%?SZt^%&)KmcET>$9Z1t-_P}p}w4Tgf_}xeQ z0%`S_{cr#d!XNM_`~`>LZ#WD`;3)h9$KW`efRpeqWGVh%3bR7CK$<6W3S@^IkP~u2 zZpZ_9As^(20#FbNL18EYMWGlJhZ0aSkd~1t1*M@3l!bCo9x6aZs05V*X~ z4bTO;LO19RH^NQO1A4;E&?}H5v&zaX&>L=r+u(NS1AXBR=m-7bP8a|K;V!rv?ty#Z zJ{Sb|2hx5w55R-)5IhWzz@zXO42B`_I6MJEVHgaDCt(CU1y92>@GOjk=iqsG0bYcc z;AMCPUWM1-b$A2bgi-JoybbRJ(woSm;azwykT$g$17qQR_y9hHkKkh%2jgJ^OoT}= z8K%G|Fcm(9Y490LhZ!&vK8IN_8|J`VmW zr~nnA5>$pNP!*~{^*~zYvL=r+XAV1 z-VS}BFWdqBpg-IR17INB6-f2)Zny{Th5KL-+z$`HgYXbM97t{O5qK0HgTXKa9)~Aj zC=7$)@MIuW>=E!3JPpslvoJD{F8Mil9$pBfHHTk>m*8c11zruLrH@~O*WnF#6Gp*X z@HV^yqv72^x~}(N42*^M;e$YGgCD|2@G*>o@h|}*NNN5xkkY&(kS=FuAf0Eyab10Cq?(aYfd^nI2b|jEuJ{m|T{U?y( zITlFgIvz;pIuS^@dQzBw11X*?CI5>jYaqpw4NeK9vu6*agyjgN2y+HfdU6HQxpE7W zCycgpl^wV}4G=PTC2pYrb&;-tarf?=SgR|glI0w#!^8)E^(;QmB`EUVT z2p7S{a0#@8OW`tT1+C$7xB{+(HqbUOC$lM1J4dd9_HZ>^10A3vbb`)sEnF8!cmC_) z2IvA^p&N9E8{sDC0X+k$xNnADa0~Q?Tj4gi9r{3DxC8nH(hp*PxDy7zK)4I;hI`;% zxDN)w{ekp!`T#r#55dFm2s{dp!QenD$|3MLJOM*t7z~FeVFWw{PX|&Pd+lA=38UaGcpKh<(Sg+T-i7yI42*^M;RE;(K7x;7Tp;E1 zc$feaVG>M+DewtQg->BxAmzqqFdb&VO!ypT!EBflNRK^p9hnzMZSV`24+~%+EP^lL zEBG1~!#A)bkP^QXmcepZ0V`n@tPZ3!uYt9J)bzfEb+8`3gAMRK`~Vwa6Z{xREp9Vx zfuG=K*b2YEHrNio!j3?y8#`ea?1nw?8|;POVIS;=1A){A55gbtC;SD6;BPn#N8l*@ z6G#Pj435JII0^qkmQw$HD=TD!Qy_aFwZR;a6LLXr$OCyHALNGuP%x1G4;F&LPy~uX zF(?itpd^%n(t(ubGEf%EL3yYE6`@ifWoBil0#yU44OWBdPy=d0EvOB3pf1#d`hoQC z=2SQh8bCv61dZWzXaZ+I(?Dv2XF@YL3(kgf;9NKlnnMdXKakqs1#lr;1Q)|4&=M|% z%b*ps4x~1CIa~o(LK|oc?cgeC4_CuAfz$>&Ku72Vo#9%z4z7nApbK;jq-xU*y2Fid z6ZC+da5MCRTcCF!)#qE`Hn<)7Kwr26`ayrV69xoQ8ypCC!QF5V+za=?Ah;hMfCu3r zcsP)1_#^OWAho8)U@!~`q|AIAo`9i&)F(3xhQpIE0-l1W;Td=qM#6J}l)~rX1$Yr& zf|ubHcoklQ*WryoYJ+dWD0mCrhIe2zybJHa7#JH!zq#+j2k;?$1RujV7!MO*B1{UT z(wPiX;1ie%pTacw45q^jm>EdB8hsA4U^dKwxiAmD2&BD`=EDM57)YBdErKuMEBHE) z_FY;WNYiz`fhDjMmcjBsnkTaYR>CS+4QpU+AWe_?7S;vQ6q@z$T_Ek3v;n?{A7CSF zf*)ZsY=NKP=Rn%6X)F8!+h9BV3OisY?1J5}Cy?gJ{04jBci0E};Q$Oftn2le4pI1L&=!$4Xgwh=Uj)1e8R5lGwWHH9;w8Jq=Y z2hwJI=fJse9yEs*a6ViB7s5qwaUiXidkM6JOX0FWN@^=;4VS|ea3!<}q%8&8LOZw$ z+QZdw4RnBx&6afp8bx4fh06E4UZ#gF$dVJOB^EL+~&>0*?mLZj6t?U>E|A!xJzR zhQV-n5=I2l_Kr`%)9?&D3nSqSs z0;$&RhXZgB{(wK>FE|8$!(liQNVV=L`~%0}IGli!@GoR3^Itq!AzL8TjZ+{yx&TuVU2iL<5ft{JaU7#y;gYIx6+yp(KC)^CZ;1=i&x5903JM@9Ra0m2* z{()5M?t}p_5blDz1L^j458Mm)!63Ll&@Gc255R-)5IhWz1kx?{QFsgn!w`5pkkb4F z425AZ9G(oMG>?F%;AwaUo(-h>JQALR=ivo-5nh6q;T3olUJIo9{5re=Z^9^e3*Lrz z0_pZX8s3HX0_g(Bz*u-6K7bG5BlsA`!FZSuNclVwCc$Kw0-wNC_!OqWXD~gGa$^R} zgwJ6X%!WBI7v{kiFhB50rq(Thg|G;|gs5jm18d=1 zSQkk5jrH&yY=H0K2iORk;78aDTLJ|$x$zVH3|rwB*aq9-SJ(kNVOJpCMR&s<_zm{L z@30T{!vQ!5e+1I4;7|Aq4#D4WIFNphkHAs*2adtWuPJ!%@ z19Aq^eIpm-hCGlL@dbT@3XSf!w zgX`f2=mK4#8*~q(w^nb2o1h2ugqxuk+ycD=X}sW8xD9THKF~Li-mASMkcJ8RL4UXt z2EahLEAV8AsC9S4J#a7F2ZP{#cmN)Rhv4Brs?U$Wqwp9Eh9U4cJOM*t7z_`je0~x} zz*F!vJOj_dNO%sOhZh2AJmp1r30{U*;8l1HUWYf}O&AqOqcCs5+wcyIhIa$0P~L+v zFc#j24+3dVfe+y$_!!2)c$feaVG>M+DSIYhW#W8%V=m>tH>6 z2OHq~K>8j00XD)W_z^b47WfH%hOO{RAl)3c!FKo+cEC>91-oGn{04gisSW-P`(QsD zfP;aQj6dK{_zMof-+^@BI1ESNDEtG*;5eLslkhKODfeH@Ss@#o0@)!48b|6*$I#3ttL47zCPJ;%}5E?;aI31e68PF8Ygl2FSoDJu|xq*X)<9F~pXbvsl ze7FEEgp1%}xCC0lrEnRvg4S?3Tme@?8)ysd0%^sGtDrqx4c9;i=m?#lGh7ST1&$Pn z+_)ZYfG*G#xHza0~Q?Tj4gi9r{3DxFeAEsp$v(;Z7I;1K}>X z8}5O7;l4oHr)Ch`4-deD@DMx%qo`R2fwAyDd;lN9 zNANL>gYhr{Cc-3`3{&6}mCS+4QpU+Ahp47VI8c8?_dLb4?n<0*aSZYQkplz7WfH% zhOO`mY=iCaE9?lQeV29y(jqOp0%;wX-GM13qpI%-qwj{Fr!F&~1z;V>M5qwr54#d8df!wEPE{{~W;vy?ag2eQE_kUfxQ zI^}?zkPC7{9>@#%AU_mQ zcnMyHSKw86Es$El>+nWke!Pl@DzJVpM6qdpAK<~^i^@>3H^;`+7U^T1>q(_Lg@GY!^_3&LFtzWkR zzK0)RBW!{nVKZ!jpWx>}dT!YYzrZ%w4!^<<*a^E}H|z=z4?_E3KOBIA zf%Nr1;7|Aq4#D4W7>>ZvKswhyf%MdL435JII2q`Zd3gI5vQ+r*NLI)Orvy?dXNMe+ z6LLZBKuSg)$P4)(KNNt1PzVY`5hxl+X)XrEp#+qKQcxPoKv^gUCZ9 zKvk#))u9H|gj!G=>OkGVQ<>IO59-6Ia2hm#hJn;l8bMX8}13DLb(_2gF$dVJOB^EL+~&>0*?k#8+;4~!w`5Jo`9h+ z42Hv#Fd~rZ&r|R;JOj_dNO%sOhZh3rSMS9@s>Uw`QX70ZkV@wjcr}nt`Wn0*NLBO= zcoRm!Tktl#1Eb+xcn`+FSa=^kfDhrLKuYSzFb>AU1egeuU@}aBPhe^wWy_~94L*bE zFau`7=P(Oq!<;~$OdFgF^WY1Z4+~%+EP^lLEBG1~!#A)5mclYv4l7_Ktb*0B2G+v2 zunyM4cd!AzhaX@gY=R$QGi-sM;AhwhzrZ%w9!PEQSJ(kNVHfO%J@6as4Wzro@30T{ z!vQ!5f54yc7aW4W;V>KtY%dyh<0$+C$KW`efRpeqWU2UHJXs-IpjWYo`4q?wIUpzG zg4~b?@IPb7O0XW(hg0D+XaEhN5j2L=p$VJ;P2o&v24}(9a1NXc=Rxzp(oC9L!1-_i zTnHDz#c&CKLtZiJhl2lRxSp;sW~^DWRDZiU<6cIX3r;ST5r{R1gC?t}p_5blDz z;U2gb?t?*af8b;$Hy(fo;URb!9)U;UF&GR(;PF7ZBRv5_VHgaDCt(CU1y92>@GOjk z=iqsG0bYcc;AMCPUWM1-b$A2bgi-JoybbTbXm}UigE24`-iHt1L-+_jhH)?+CIr$Q zX(CL5$uI>zfvNB*OoPv0dZ2!$Zp?t0@Hxza*)Rv@!aVo_<_FU6-~w0(i{MN63ciNL z@C_`1rLYW^!wOglt6(*(fwk~0tP6C@jV4mQB|@B?gwP4FXZhAn~8nY-vu@H1?M zUtk+-hhJd_?1Wvg8}2h*GZpZ_9As^(20#FbN zLE%8kx*||CkS@6x6c41FF99W?R3Mc_X($6_1A{WPt{jwy3Q!R$1ya^khAL1MszLR@ zx^fY74X6pVpf=Qjx=;`5!>MpupiS9`xdAkUM$i~ehbC|aG=(#vS)hF;&1b>ca1NXc z=RtF50q4U7aABZ#Ce0VY#c&CKM2Fe(%Cjc^n6fSzzO^nzQUH{1%h1!iS(<96r+ec=x1 z2mRqr7ytv|uE6L_%y+{*a4*~kgW!I603L*g;NifYOl~{^kHTXx7>2;(@B|EnVK6+< zER*IZVFWw{Ps1~TikZOA!bo@yo)7HHgn1#5+Te@u61)trz^m{Yybf=`n=mSn+TdI8 zHoOC);azwS#=uy3A3g|7&*bxm@DY3r<6t~YfQc{(Cc~6Ky4QUYNQs{cpTacwERZVy zbeI7%;d7W3NNsR7%z?Qu559o;umBdqBKR_}I+Gh;!Pl@DzJVpM6qdnqSOF^osSU1z z)vyNE!nd#v*28zO0lp8U9dLetjj#!Rgw3!8euAH2EBq2j`=@M!?eHt?fSs@lcEcX{ z4fX~OWr=+L9rnR~H~6a|r$pRLvYY3`gK7`~%0}IGli!@GoSk9P6rO zV$KTL;1tLXIUpzGg4~b?@&-C)V$KKop#T(wLQoirKv5_L#RL5_F_(anPzp*znLwAU z5x6XrgYtot&lR9zU_mD4N`aK&l>^UbzFq~YLbbryOyKH)6iM1+|5#19hPu z)Q3~yG-v<~p%F9=qzgP9n!p**6wZWZa2A{m=fJsv5t$1-51K;@I3F&63*jQT7%qX9 zft007-5sYcxbz2R244Q_`%&=>9qq&CGSe@G*=Fq!Jtt6JR1tg2^xiK7px$bc#=5 zT3~i&_qxwuI?RBX@Hxza*)Rv@!n{DW%+9l4zTYx1m4Z0c_-|G-LMCKgT3%O?1TMqAdqtGAp8M;!e4L*{)WSF1dhT#fl8S)AA{p? z0#3rekfq9h-^vQv;1tLnNcockazZZ14S66hx0DpZ5&Py=d0EvOB3pf1#d`hisIPKDE;0W^e0 z&=^jKCU6Ec4V;z9pEIEuoCRmYIdCqV2hE`coF7QF?gF?FE`p2U5@-pR!e!73TEpdV z1zZVjpe?k6tDrqx4c9;i=m?#lGh7ST!S!$hbb+qW4Z6dPa1-=^o^W#@{c!YxTcCF! z)#qE`Hn<)7Kwr26`ayrV69xoQ8ypCC!QF5V+za=?Ah;hMfCmGUvPG?X2p)z<;8A!C z2E!0|9G-xof$o`@hrw`o5=OvN@H9LF&%#J}E>JWR^Yicmya+GB%kT=k3a`QI@J8VN zOw4b>D0mCrhIe2zybJHa7#Iuh!w2vod;}i{Udkk69E^tvFcBsNT4n-IhAHp~OodNj z8hi%RVFt_$Y{@(*eh#x>Hq3#!f%=(b%!4mrJ}iKRft2P&@Fjc&U&CVf2A055SO&{s z1+0Wsuo~9DTKE>$!Fu>EkP2l3d=EdsM%V;D!e-b4Kf%v|RG+uPFR%@^!>_OdcET>$ z4SNEqKK}-L;dj^v`{4i_gg@X<_$zQEQ#TI5-*6a?z)|=Ij=^y_0Ve~gZu|>bs{VH* zD`bOHAUouMoRAB0LmtQr`5-?O2&4-v2!)_96oI0FRQZcRaVP;Lp;RChN@*wqWuY9D z52U+j1*iy>pfXemq?>tFs0P)c2Gk6sT2~8dLmj9K^#Z9->cgpU8Z>~0fn8OjZZrz) ztrBPqr$ZAs1DXaVWxjQ0pljw^&EPCJ8_t1q;XG&#E#Q2(04{`!;Nn0UOuPhI!liH- zw1U=fIa~o(LYqLESI`#P!Bx;6u7+!%19XH=&^eICSg(ca;Ci?LxHm9E^tvFcBufWS9b< zz*P7Yrom@09cI8x_#9@zY?uRcVIF(|^I-ujghlWrd<9_OdcET>$4SV1>*bBeI zzCfCevL6n>LHGmygumbr{0)cU2polf;20c-6L1p#g)G(nOJP>X7D#vgQy_aF-AQr; z(iEDUkPC7{9>@#%Ab%i@9T$LtPzVY`5hx19pg5F(l7Te(UkXY?87K?opgdH7ickqE z2hvo5Do_=wL3OABHK7*NhB{C;kiA?yiqwPpa4MVz4WJ=3g2r$%qo`R?0nLt{M>)AkBU1uab2hYO`@FKhfFT*SFD!dj*YYn{)Z@`-{ z3f_XZ;T;$a@4|b5wwV{$$H3S?dei@X_y9hHkKkh%2jgKvU}Prdi7*K!!xZ=groyK% z4L*bEf%Ijfg3?e1$_CN}mV@$80V+Zzs0>x0 zDpZ5&f%H^R18PDos2xZ}StpPlsOmyJs1K*YX@OMk4WJ=3g2r$BVpfw1i9HGH4Y@kA3%YJ)fVs7D~>Vb4H1#m&$wkYc_ikYer~NNw=eKx%`x1yV9@hd$63?tp&K zAMS(!Fc9tvq{QD1_rSey9}I%~;Q@FM9)gDh>2e-{N8vFT3`5{?cmjsPFc=<4CHN$a z2&A%j3Z8~%;8_?6&%yKXLLk-W7vUv%8D4=`;Wc<2-hek@R3MFazXfl@J1`pF4WzNr z_h1Z+h4c7llcKQ!Y23;Hp3S934VsH@Jk@&#x~dvzrqgK3ASsU_TsygYXCZ z34g&M_&bos=numYI12y3F*pt<;3WJDS!(<@w zq0HDnLc31eKu*RE26#9cn;Ls0Fp5 z4%CHuP#;c()1Uz~ghtRfkn;I-XaZ+IQ#ccv!C7!NoCD_uQX4!EnnMdXA1;6k;Uc&g zE`gST)CMnw%b*pshRfj!xDwhxTWA+Zj~Q1%d$<~|fez3SIzeZ+7Oo4V2aoIF2IvA^ zp&N9E8{sDC0X+jL%{N0YxCMH{t#BLM4t=06+yVWdKimleU?AKDcf&n!FWeVM4{w9u zes};Lgoof^cmy7W$6zoFfydzq7z)E+I6Mg>;3;@Ike(`^foEYPJO|Ii3-BVm1TVuY z@G86pufrSgCX9l&;B9yZM#H=C9*lvp@IHJ1AHqlQF^mhOXVLM2^nf=3CI-?U=SeUb zrobmK6+VS&f%L5Y8BB*6FcUt9Suh*sz+9LYNKd(6zeS4ZM+w`CC{Q*p)f59=?MOfu@-akG_W=U?XgT9|I}Pn_&z5 z1V6*pK>19}zrZ%w4!^>VK)X!fovW3mYX0}FtdI>(f$V`)C^;Y}8Hq?Q-P!H+{mKThyJ2lWVgVO>HGiU$}p%FBO)1e8R0Zjv03Pn6;LNhoE&W3Z~ zTsRM!Lkl<`E(pAqN$Q1g5nK$HKufq3E`wIk8ZL(`0uN_SaV4~Yw$LuHBNOH-Xb)Gz zHP9ijEwg}gN9Y8d;aa#3u7?|-3v`8Ufi{^8?+!P@P0#~+!p+btP%?8Bw*;DG;^`eo z*M2M92Dd{W=nHp1Kj;s4!T=ZucLmbf?}mHeUbqhi!Ts<6JO~fL!|(_^3Xj2H7y^&O z6EGBp!EksokebX0cnY3|XW&^F3C{&uXL9~|cmZC7m*8c11zv^M;B|Nd-h@$s)MVa* zx8WTa4e!ExFb2lL`|tsL2p&_yXp`0$2!(;7j-lzJ|qtbj$q)mcUY22Fqautb|pt8rHyC_!ic|diXAo zZulGE`#@^=Kfp%V1V09*X6ou@*aAPn&wAU1egeuU@}aBPhe`` z|LZ@)H24gr!wi@SpTjJe4RZqP^F*5G!aVo_=EDM52#erL_zJ!b~M}1LtPayav|7x3CV@!*{R&zK0)RBW!{nVKZ!jpWtWM3ctWM*d9pv{44B$ zov;gb2j*lha1Z121435Kzz=%wG zPQt&CrS^XxWrb{kF`2-pKz7IxNQIjdazSp$6G&AnFXV&#fs{W5pdb{2!cYW?LNO=~ zC7@&=6-p^64P~G#l!Nk60V+Zzs2oUjqY6}oYET_&KuxFxwV@8w4Wx{!2le4pI1L&= zLudqz;dE#cNX2vpG=(#v8Jq=Y!#Qv+oCnRJ1)L8Tz=d!TTnv{$OSlv+3#8m=1+C$7 zxB{+(HqaK@!Bx;ckQ(FFa1C^Tj?f7@!?kc7Tn{%u7w8JzpgY_MH$e~R2{%J8xCMH{ zt#DhQMdluUJM@9Ra0m2*{%~g?W%vLX2zSBVa1Y!I_rV~zA0B`Q;URb!9)U;UF&GR( z;PJr5oN=X3z|cUETybO=42LIS1Uv;#2Rdisc?O<^k?_5TJuoZrRZGluM+XMA7$@mp^z)si|NDEu-hCT2b?1kT9AMA$%a1j0o zq@}L@gumbr{0)cU2polf;20baq$Rvgz)AQQvefx6OjgJSr$Bbd0XYL{)x=zo8}dM2 z$OrkM02G8mP&km*kSqd4p%@g05>OIKL1`!hWdms~xN=Y)DnLc31eKu*RE26#J&;x# zs{u8k7Sx71P#5Y!eK-|P3v{d*HM0RUghtR9P7e&v1a1OnKvOsqng#l00-ptE!#Qv+ zoCnRJ1)L8Tz=d!TTnv{$OSlv+gI3TQE{7`uX`uN^XajAb9b6SiL#yrKYPbeEK*vBD zmF@(c;aa#3u7?|-3v`8U&^?d_NpFOkpa=AXo1qun0=?l@xGj)!<96r+ec=x12mRqr z7ytv|uE4O&5cb`058Mm)!63LF9)JhoA$T~D#^@h`N8vFT3`5{?cmjsPFc=<4mVP?YTFe{MS;B1%! zb73BQ0rO!2EQCeyWgwN{SMW6~hHqdAEQMvT99F=}Kx%`lU^T3PweT&hgZ1zoY=G|r zDK~zAjj#!Rgw3!8euAH2EBq2jZEzcGhhJd_?1Wvg8}`6&us4wIb-%+t*bfKbAp8M; z!e4L*{thh8JfR(iBXAV{fn$NKnZU>4L||6#IC2vHg)DXdi#aP~gHs?oM&@wO}lN*=9WzY&* z!{u-VTnTNUEwl@y^jrn);cB=BIzUJ01fAhpxGs<`=X$sSxbf8lv@H6l%jD+Xl`M`OZ zz%Rgy@DjWXuLM%9dlg=T*WnF#6Gp*X@HV^yqv2h655~Y)cppB158)&D7{&!sagT=y zfmB;2!X%gsQ{WSr3ZKHXK)NG+2Gd~%%!JPa%`K-t8%Xz!Z($v*hwoqmd=EdsM%V;D22u%b zhAr?D{0v*+7uW{d;aAuZNO$a=unTs>9{3IR!tbyT_QQcdYOn|45BL-QffxM6p@_%6Kzg962$i5RRDr62yqN}D z4XQ(pKq}mtPz!299jFWSpnf1F<5V~e8bCv61dZWzXaZ+I(?F`vXF{_;dJsAb&W3Z~ zTsRM!Lkl=Rkk*sA04{`!;Nn1WVrb25RigX`f2=n_a5*flUOQ|r1xceoL5f*#Nl zZiZfP3-pFt;WoG(`aoZ}1NuRKxDy5h_Geao83=d5-Ea@w3-`ewxE~&X2LmlL)5{-% zhXZvoM;?Jk;juuk%twO*LoyfwkHZr%G>~>+9|ptWNf-f7!PD>zJPRWOX%fqGfmYSy z?9ams@FKhfFT*SFD!djLR4w9p9o`7Mnu+;M7zJ;^+wcyIhIipT7!z2NiEwNn{X2di zK7bG5BlsA`!FZSe6JZiehAHp~OodNj8hi%RVFt_$q(AAO!z`E$b6_sagD+q{EP#cu z2)=}`;A>bMIF{)v_y(51QdkDdVFj#&Rj?Y?1X7>FTKE>$!Fu=(Ho*7r18js%fpwYQ zj2~e$Y=NKPXV?nAz&6+pzrqgK3ASsU_TsygYXCZ34aAjWG?U!{0)cU z2polf;20c-6L1p#g)H^|J6Bf72B$!F$N@Pa7vzRKkQeenekc$aow>k*PzVY`5hx19 zpg5F(l28gtLm4Ow<)D0^S0))1pdwU)%1{NWLN%xkHJ~Qcg4$3A>O#H1zDzRe!>Mo@ zG=PTC2pYrb&;~2M|ySuv^u>%tm73@I4?(Xic z_u2FM`|tbNyZ7wu?9AT1yJu&Lf?}XJC;>`>QlK;_1ImJOzyo-K@}L6n0u=>2*Hr?Q zK^0IHR0GvP4Nw!*0=0oRr~~SPdcX(N2Mq)}llX#$pb=;cnt-OD8E6h#fR>;YXbswc zwxAto4?2L3g8j600-Zq@&=vRzFP$I6ZlF8x2R%Sf&Fzx7YD6c`Q0fU#g47!M|ZiC~go^E^%lQ@~U(4NM0!z)Ua;%m#CW z*-n|~f_Y#*SO6A+MPM;l0+xbhf?a(r2P;4TSP25bDzF-?0c*iJ!H(d1umNlYo4{re z1h#;!U>n#jY<6m62iOUM!7i{H>;ZehKCmBz2v*Mrz(H^bgn}?|7#smd!7*?goB$`m zDR3H`0pZ{*I0qs?BsdQ)fQ#S~xD2jl&LkRKEP1wkQD7!(m~hJ~V_7$^=(fRcg@_gxB<24z55P)@J`z&(H`C=V(CFHjLw z0+m4(P*t#z|Eq!Opa!T3YJu9o8`J@HK|SCD>VpQr7c>NoKx5DZGzHBB8{NG*XaQP+ zR-mm~5p1fCv0xk+4<>+#f=x~_2}}l4z*I0zu$ft=gBf5Z zm<48oIbbfB2j+tXg3Yk75G(?V!4j|(ECb8I3J?HRfDd8_JF-$AJ`8fS=%( zP&=KjWPXD`;4g@h@83EuAS!SL(Li(%LkM;v#{{uJY!C;;1@S<9kN_kEiG&Cza$=AK zBn8Ppa*zU~1gSu3kVYutM0NvdK{}8gWB?gKCXgApgDk>xCvsN7%|SMh9pnHxK`xLR zj#iR=X`f=Zw=r~;~jYM?r(0cr}?o@)uV(b|Hw7H`20ZXG_V3+e$M!3tKN zB@KWtXb2h!RzHmei`+!8Z8a5aPn!uAu(@CbYr#4#K`X(=Qf>{}fVQ9=Xb(Doj-V6h z47vz5LUmW*2f7J1G<0|14|;%}pcm*3`Up01a$nF7^algLKrjdl21CG5FboU_Bfv;7 z3XBG0z*sO2j0Y3IM8Ssjn*=6eEj@L{u3(N*{z+5m7%m)j=La+!d z21~$Funa5*D?k8P2?D_?uo|oZYr#6O9&7*`!6vX71c5DJt6&49Zxd`d(CuIc*a?Ec zF0dQy0eitdupfkg1K=Py1VTX=I1G+}qe5Xt??6FNF&z7B4Ho8T6>4eo%u;2yXS9taUmGXsbvEGwq5@YC4MYbqKuiz|#0GH$D|}oK55xxvKthlRBnC-9QjkmtcFLR_qyQ;F zDv%na0d62INC(mju1-B?02x6hkQumxEFde$2C{=3g8d}r1i3(N!OkRkKwgj!svCY%Gg`V31%h)DH$jz)&y@3>Rz@Bfv;7N(gbr-xv+XfU#g47%y0y z31A|a1SW$ig8ieP3Z{YSUmHOSOeCAbznW%AlN;|jbIbl41&NGuoY|r+rbX769j`@g4NG%ut%^v$$JI6 zzp)SO2O;19I4D?|4}nm@B8P#);D}(ihK_<`;5aw|P6~Dd=M*>%&VX=m7MueSAQGGh z7X-T-e-T^)m%$ZqRj@l$*T8jf1Kb3+z-@2`+y(c*eeeK01dqUD@B};s&%kr=0=xvT zz-#aZyan$B%Z+~zK7fzl6ZkAxg7+8j6?_BV!4JVQT7QCH;5YaK{tA`@9HqcNxPYj@ z6+{y(<2O2pA=vv4F+nU48^i%|K|By2BoHi1IUz_SSPpPvkOU+J$v|?D0;B|~1WWKv z4blKNkQSs9EOk6R$N(~eOdzvh?;yB?EP}nlkQHPT?A3$pAcye(`(GfJV9Cuf_lIQ)E8`g(FVX5Gz5)6W6%UN1Bf=-|_=mNR|KhO=wc7J!9dkznJCE(S}$Qm_mx2P;4TSP25bD#6AVT@BWNwO}1s4>o{} zU=!F3f&_bqcMI4Gwt?+n2iOUM!7i{H>=Eo-w-@XK`#}ge01kpfAQXgw!{7)w3XXx} z-~>1cPJz?l3!Sdp+gB#!`xCL&5JK!$3 zCv0;v_wIuS;30Sf9)l;~DR>5+gBOBj8@>duz-#aZyan&Td+-5#1fPVqPMJRoLmhk( zEPL%M_y)cUKi##?5Aaj4UH%1rgFnIvXXU>jO2L0iTtHOd3ZjANAO?sDVu9Eo4u}il zf%qT+NC*;v#2^Vs3X*~3AO%PXQi0SU4R8Z#g%+7q8|grLkO5=_nLuXX4zhr(AREXI za)6v57sw6rfV?0d$PWq#?wM8Qf}oJl$5~QXIOm`UC<=;!;-Ca52}%hUoZ2W2%7C(< z9Pj|1!Z7DsZd+vAXrg-K||0;urfCmnmFHT0-6fboF&Z!+l%I)1!xIcf!3gnV3p7o zv;*xy2hb680-Zq@&=vRzb_BbD?!X`P06jr3&>QpteL+9L4rPBZ01O0!z+l1Csh=TW zC>SPKTOAHY2zJ+KBp3xogE3&NV0U}Qf$?AhmOaW8DG%#JTn@%&pOfU<~ z26F_vex3{Ff%#woSO^w@#b60o3YLN8V1-~8$pK&`2n4IZYOn^Z1?vR6%3TjOfQ?`i z*bIWe7O)j;1KS0=%H08Wf?%)<>;`+lUa$}B2O)x8iyi<6!66U|!oXp01RMp&z;VIK zd;**Vr@(1&MzF!p!@*f_4n%-R!Dd)E4=#X<;1akDu7IoH8n_N_fSceJxDD=ryF#Ed ztol80A3OjL!6V_Ai&lONo`9#|8F&s}fS2GEcn#iwx8NOk4?cj8;1l=^zJRab8~6@> zfS=$O_znJmzaUDXfBWtNq5@YC4MYbqKuiz|#0GIdTo4b$2MItzkO(9ONkCGN3?v6B zKuVAbqy}k#8%PV%f%G5)$Otll%)lLF0a-ydkR9XzIYBO=xRcwH8{`3bK|YWl6aWQ5 zAy60;0YyPEP#ly1B|#}r8k7NLK{?<7JVAL-0eFFmpc1GIs(`8voF|XfKy^?9)C9Fa zZQu>+fV!Zb1E-#SKz+~v_=1L@5oipWfTp0CFvS@Op*d&)T7p)fHE09cf_9)i=pdAJ zMyKouI)Toh3+M{`KsV4G_=6sTrB3w(y+Ci!2lNH~Kz}d*3~fTm;>g5d0;+RAlUtlgbUU>R5rR)7GoQm`W!2v&jBU=3Ic z)`9h41K0>Q39+0fkDEad*aEhKZD2dt0d|65uuHIO(cOYw?(PxnQg*N4?mYb6C)jxA z`vn`YJw&i+3l0eO826xHPhAfQcD))ZSmZFlA|Dnk@)5xz9~CU}F~K4q7cBA#!6Kg& zEb=MABA*s4@)^M*hYJ?@tYDGP3EiC=MLsWB~llhk`|Z zB#d>w^;odTPlV^rlBa@g;+bG=<2iT%UV>NPHFyKwf_LCO_#n7AZ=Zb>>}9b}!W5@T zd=_pv_#)UlSzm=5&eQ*If~78e7wp}xAA)5O{1hxv;TIqM27ka`5T)?Hue*S#z!gLT z(LoF$)G1g@5KEZn6fCyT(m@>Ise`zJy{Z;Zu+)Y4f)zf2Fwj{iAxjboZ=8W#5`!cl zDM$vAgA^boNCi@ZG=j~JMa zf!rVu$P4lb@14u|{GfoaHnElz6uvnqB*b-4SO{}aL}=`wsF2k`F~P$@aiO<^5`ulJ zBq#++gEF8jCwoc_5u|Jn~ABCU{fGf7QCHxst7jtOjRMCGwMqPc-5Yw4cskz|iENLN3bI?+l?0nRUk6H`%tu{i0^HE!&lY@4A)E;yI z9YH718FUe>%w2&W=mxq2f6xQ;1ie6S&_}rA{2%NK`hosn02l}cfx%!17z&07maQ=y zj1Vk4Vk8(PSPH~wFb0eTq_rF*&L$JJ* znP8S+$ zu*k~G}&PQ8>oKBP2Dp@@<*_h{|eSqq7?bp2VDe<996K$u7a%`jU~|qiyT9+$T0g9IQUNCXmtBp@kBCfI2wIY=Q`nNtc@=2U`hJvB%p*h$7s zu&<{D=|FnHb|(YK2r_}pz#U`(SwS|C9pn(KT5^J1AUDVZ@(OnL%Lnp<0-zu$B-pvP zFen0wf?}XJC;>`>Qi2`R(x8lBgVmP>U&hY$gIP!G@i$ zDA+jvl>{4>zp`NeyQ_ezpc<$SYJi%c7N`xpK^?*7F0U)tl=t-nn~L2>u&KT43pTfM z1HmR$_Z5CQ*IEq)n-98?VDn`+7HpF4CW1ZnXe!t(?q-5Ln`kcB!-W=t-B)iZSb|C` z!S3O=7A*avjbPatZ3RoNXeZd$+k+0EqhR;mI|(*VXlKFCxg_o)*e&j^z)!G(bpzdn zI5D)czYrt3&_j6Vpr^3Rx#8AJsN0C0OLyf<>Mq zSme2aMV=?vtPt}Bo3>zqU_E7_U_E7#U_E8AU_E7tU_E82U_E7-U_E8IU_E7pa44gy zB>=1hfx<24qgBEe2djldnS?b$E(dGDIzC!2SilW}-J#kDHi69`2y6jc!8WiR>;OAK zFxUllgFRp`*a!B55O4q-1cyK<2m^<~5pWb71INJ$a1xvXr@TmjoLR?XqB_FJ2LBu*9o^jYxJ)urUCy3pQ5X4Z%jMyD8Xsakm7Ea~s?Ncfmby zA3OjL!6Wb(JP|Cn=c!-`GtZoloJ@n~f(@(nLa@=9UJ5p7)hofWbY2TK`p_G}Mge^* zSc20#!A1dn4?cj8f~Ea@V##OlMX*GmuY!&F`Ax92pYN>mL$EtkKfy2X8~g!(L6oBZ zzU2a<0#^`Cu#AQ1!ZTgayTlMIl_Dk|#S$zNBQ}U5ST;gj!7?b~2|>=+aT38^H%= zKzfh?WCWQ&W?`hOHsLPV%a2(EdvPzTV6PTt6YQuqOzm1bc!| zTCgVwWmu=IU|%l>JOuleCriqM3W7!UVx5YDMXn@RaAwE5P8fo`BX@CQ9WPtXhW27N$Z&=2$n1HeEq2n+^8z)&y@3j)G(0I5+`Lf>Yo$I0M23`+sp3oC6Uc5}XGYz(sHgTn1ObRd5Yl z2RFb?a0}c9cfeh6Pq6=A_rU}35Ih2p!4vQlJOj_c3-A)W0eML{u89FzbhK`FuRke3E!Kv_@@cmPjO z9#jylgkGScV7J^Wfy$r?s0ylq>YxUw32K4bg58$)26aGPVU=??z8>%a^+5yR3mSq( zf;}B*EZC({6VMbi1I?YYFab;ilLWiCoeZXcsbCtI4rYLvU>2AS<_MOZH5beS^T7hJ5G(?V!4j|( zECb8I3J?HRfX+b)W z9%KL+13_AU4b9y2D$@(&_l5Eb5GC<^ag!EU(gTq z2Lr%BFi5Z`;DZHw&^$!2Y?h&dJ#ii;*t6QHT zd8}ZO#|ajBykJj?CkPgKqF|9H36>`_S+K}c1dBXXu*lN{yH=kr*cI9g!Ttrz6zrmX zmSES1vjw}No+H?m)m*`@a_0$_%`#uGE5-$a1zafDMd>2J%SC;8v0xXIO9Z?2TPoPf z%LL1%SuR+f%nHFG2e8gc!SZAR!78v?umqJgU@ce&)`JaTqhJ9y3D#jZgCMX4Yz5l{ zI~8mPJHSp540Z{YRI?lG0eitdupfkg1K=Py1VROSych-!gCpQ5I0lY`6W}B`1x^e0 zQ1T222WP=K5CI~=d2j(-1eXMR0D2i*0apckBzg^87woa=4R90OVx8OIj$lbFcfmcu zGDGeQmKpLuusoTEf~AN&608qC7Hs7wf_0*&f_1cKf_1&;-~}JO6s&i@;-lAsMSde# zg9IQUNCXmtBp@kB29kpmASFlzQiC*t+WwFIYB0 z29ObC0+|KNsc;8b1WTOA3bKLhAP2|^a)I1}Wj^Eqc|ksq9~1xuK_O6Bu(XXLpeQH? ziVOCdRS8fMlmev%D^D3v7L)@Xf+dZ3g7Tn(V4Ls)6+tCX8B`H$TU9|dP#x3|EPJFT zs0C^ZRt#@YN3gBe1@(Xrs4v(?8vtL>5HtdfK@-7>(G)ZjESIJ^XaQP+R)UqMHE09c zf_8#MZVx(uj-ZoZaXN!8peyhbtQ~d(-GM*o0eXU7g4ITE&_}TS>I?dT{$KzYC|Ii- z1O|g4V5sna{tp-qMhLcFBf%&z8jKNazs7=bf|YPQm>^j1o(Lv^$%17%O#xHEG%y{^ z05icXFdNJfx;QyYbHO}erIXh*A1nY1!6L9&upFu-U@2GzmV*@_0IURoV3iQ!Y<)FY z1J;6dU_ICXHiAuHGYA4(z*ewLu#~XvUbOFgR|hAU@bEOM1u3+0=OtxN4o?rgDc=F zxF%S?xDIZBo8T6>4eo%u;2yXS9thSMAA(2VF?a%=3U-2h2A+c#;3aq^*e~O2@J6t- z!?)lacrRG{`2ao&)+9cG&)|z-UHB{b2EKzI;3xP6euF>YFNjj|UuSdyQGqLn2BL!) zASQ?fVuLt>oh9OecpyGVAlP{$AxI=xTTKj-fTV)eSTc}Yu;!Nnqy(uzYLEuFfwUkU zNDndyb}TZ2Odzvh#c&twaAyHo1v?RC6YLb19pn&fzjA_HAUDV(SQpL<@`3!IfM6Rf z2nq?-HVT6xf)%4EC{^o10KLru-~2Xf*tM(f}O0qKt;jI zQwdZCRX|n2%2N$g2Q@%V!OBxhux3+Ru-`#%!78DSVCRjxpdRo6^+5x{+K(@22pWOL zpb2OSnt|q^1!xIcf!3f6Xbakb_Mijk2s(kzpbO{<{6IIs&a~ZuKj;B^f?l9E=mYwK zexN@X00x3VV6b54%pqVX7zTz5)@(+AkzkZy7gVFc7%&!$1LMI2!CJyZFbPZsQ@~U( z4NM0!z)Ua;%m#D7TrdyJ2MfSLum~&`tP3vzOTjX*9IOzm%?E&$AP}qqtHBz|uxC*X;>)-~s32uSg;10M8 z?t%N@0eA==fydwpcnY3@=imi+30{HM;0<^S-hubv1NaC&fzRLz_zJ#(@8Adc34Vd! z;1BoNGe&=A3%4-N&x zz;G}Ej0B^=XfOth1>?YYFab;ilfYy!1xy9gz;rMJ%mlN*Y%mAR1@pjsumCIsi@;*A z1S|#1z;dtx1b~$w5Uc{L!5Xj@tOM)82Cxxq0-He)*aEhKZD2dt0d|65unX)4djxw9 zyBF*O`#}ge01kpfAQXgw!{7)w3XXx}-~>1cPJz?l3ZuI1es>i{KKt z46X>4u5%S!1J}U~a1-1Dx4|877u*x^b47hA9gd~rZr5D&x$2?TrKm{72%lZilL!6GLS>?PBrAQ?ywQh<~o6-X`E zTdQe+n_w@!rUmIhdXNER1eri);105YtRS0U0~}=sIY3U33*;7T0H{15FUSY-g93sL z096na0);^lP*kw7p^AaxpaduhN(nYPQ)y5Jlm+F0hhT#{d4lqw0`LMA1uJtUP#IJK zRY5huM!~8MYJi%c7N`xpK^;&R)B`@CK4<`ZK||0;u!GVVGyzRPGteBg04+f)&>FN6 ztZlRf?Ld3b0dxeNKxfbebOnBb4gA#&bO-*R2k0r-aACbbZ_o$y1^onz+#d`81Hm9L z7z_bJ!7wl!j1a7ejs&B?XfOth1>?YYFab;ilLTv`lfe`)6-)!u!3;1H%mTB)9Kl9E zn+xWF`CtK92o{0GUs8 z*b26R?ShR~w*%}1!C)8I4fcS&U?12ILIis`^Z+<0*t?~N1bhE9RIqnT!vuS`^f2oj z5$x+n!7;(UbzBHcq<_aJz)5floCaq=I5-Q=fd~*O*c(RY!3A&;TmqND6>t??1J}U~ z!G>YH32uSg;10M8?t%N@0eA==2{u&YWAFq#1<$~9!3KDI0bYVv;5B$7Smd|h9e58u zfREr4_zb>)ui%?tgGqh|Kfq7$3;YIuz+Vuh%)dA;AgW;FUb=#4AUcQvVuDy8Hi!e_ zf_Q?BpBWz{00}`NkQgKZNkKA@9HbDeZKMRLKx&W%xPi1F9Y_x{fQ*72!Au~tV0+;X zvIsT`XjYI7WCuAwPLNBmBbXcH0eL|_kRKEP1wkQD7!(og2o?p!Kygq4lmw+fX;21~ z1?2>*4G-W6%7Y5P3seM^KxI$`R28f?s)6dD2B-;Yf!e?u)B$xtJ>UcCg9gACGz5(V z8!EOjXabsoW`ec4=AZ>=30i^HpbcmX+JW|h4OH7fup`(JbON107tj^>fo`BX@CQ8v zn}V$;=mmO%KAfo5yfEm;q*jSztDp1LlHxU_Mv?7J@}!F<1hYf@Om3>2k0_u=x-J zz)Hbp8w>=iz-q8Y$l~1nUJKTN^@2@bxB+Ygn*^Jiax(}5TfkPZO|a?twu2pDCkO_+ z1gq!WU=P>}_JRE%1RMYd!66VT*eFI};4nA>j)G(0I5+`Lf>Yo$I0M4LS#S%I_1&bU@u*k6m ziyTL=Z^acXay-Ez#}_Pe0^$Ghe+2t_B9as)HJ!reIf|wLop)4eEfppdRo6 z^+5yRE7*Yc4M8K&7&HM*1-smB#**fs1!xIc30CITpbcmX+JW|<1Lz1kfzF_dU{`2e zfgk7wx&wdE1M~#FKyT1Tu)lbHK|jzR3;+YcATSsV0Ykws!LFZ&gArgP7zIXyF<>kh z2gZX5g0;GdU=o-Nrhutn8kjEFmFEmF6U-8mHOSR+_%tOe`9dawa(1e?HS5Cpb>t%9}ZZD2dt0d|65unX)4d%#|> zPq03?AB2Dd;2<~zLO~cf432=K!vFJMfaBl@s1#l5u z0++!Ra1~q=tPfrXH^5DB3)}{G1nXaS!9BtD{XTfWM-Rax@EAM+Pr)YxUw32K4bz#G&NtPj=&^?(nk4;lbp&=52N zjX@K^T3u7n3^WHVKugdHv<7WJThLCh8G_mi*8DmM_FK>qbmF7Vpo?H<$gYB&^!x;i z(@n6GUU$K2!(Xt@*h8?r=qcDHdI`32Z^4>qAL0M&AHgE`6D)FnA;g*RXn z5K9IN7I}zZk%tNvd6;04hYJ>YgkX_Jf>DC4JQ|DvW5GBu9!vle!6YylOcAU+Q^7Pa z9n1hT!7MNv%mH)3Ji!j!e6Rp41dG68ummgx%fNE5La^!$04qTtSOr#tHG59|ja-~c!%So1psLO~cf z432=K;21a#PJokwO_+5GoCaq=I5-Q=fd~)@&Vvi!BDe%DgDc=FxCX9+8{j6mCD`0v zx4|877u*wUzwUzv;GyvU{9oWPcp}(jVNby`@Ep7VF9n-W?3G}Xg}nxE1e-_fEqEu` z%J0Dk@DY3hpTQUK6?_BV!4JW9=O_3DeuF>YFNost?^`Y)DsTnS1e+f%I*0*cf>wB9K_H%1i>1f@Fft@|GN=04YH#!D>D=NCVtJT96K;2N^&{ zkO^cKY_d6bkOgD~*+6!X1LOp`KyHvnu>Hyl@`3!I04OL}F$#ggpa>`miV4;Wih~lM zBq#++gEF8jCw~>PAJ7-{1O34OFc1s^gTWBN`ruG73=9V&z(_C(j0R)CSTIho z9UKoPfQeudm<*DZT2v&jBU=3Ic)`9h41K0>Qfz2RDu$;gxU@O=Lwu2pDCkO_+z;3Wduq?Q}U?12I zLcjsR(xMK6Lm(7{fy093BOL)p!7*?goB$`mDR3H`0pWrb<19D_B0wZKFWBL}04{<{ z;4-)(SZ!Pd*T8jf1Kb3+z-_@2((Zt};GST4jQ7C<@DMx#kHHi06g&gZ!3)9K#!K)D zyasQ;TksCN2Oq#k@JX;Te+FN`SMUvd2S311@C*C~e*{Y|{R^Ua{#)V#q5@YC4MYbq zKui!zuvQlv!~tnOE9YH718FT?%fuCTlt{dnM z{6P=U6Z8VTK_Ac;^b@Q$`hx*rAQ%J&gCSrj7zT!e5rWNtJQ9ooqrn(3R;?P4eh?y9 zZ5#jx!66U|!UX#{J`9e4qu>}gE?DFf;3PN&PJ=Tb9GnH`Km>>sY##9Q-~zY^E`iJ7 z3b+ccf$QLgU=xeq1h>F#a0lE4_rQJd06YYb1Zzl-!4vQlJOj_c3-A)W0r#SLAT>w>+yrY#X+b)W9%KL+1$#R< zlVEQLX9n&di(sz_XBF(l;cOtgU~dQK5bW*XoFJEAL%ik&c?266HZRC0*n7wM1sf{1 z04OL}z(Rr*tS~4d*sRt?1)EB{7$^=(fRcjEj$I0r7HopxGN3FdC)jM=9>5cn2NeXH zBf=+_Xx!D z2}Xg@V2ohn#*YQ#z<4kLOazm_WH1Fx1=EB}$@DmHI+y`wf>~fTm;>g5d0;+RAbd!! z$P2+Duox@>OTjX*9IOBVV5Jb^L=FV2z-q7ttQGv7mDhpwV1uyF+4qfLlMvu6*$jff z7O)j;6RhgCgB@Te2nM?ZE5>fH2kZs=zhg` z26qHIf_K3^a34GX4~3Xc}Id}nHf>+=*cmv*oci=tvAXrcN2tI+& z;0yRFG;qrN4SWYbz)$c?u*ko`AMh7Msqk+d7Z4S=f@mN*h#^=Xj0s|a*dPvw3*v$J zAOT1S5(!q%i9r&O6eI)5K?;x(qyniy8o@fO8%PV%f%G5)$Otll%)lLF0a-ydkR9Xz zIYBOv8{`3bK|aCiIX@@>3W7qQuwdP@2q+4Qf#RTqU~Qu$C+i`BhVN$ z0ZlXY?EkP?`tyAXKpbcmX+JW|<1Lz1kfzF_d@PGaf@B`gIci=Br>PrvM6Z8VT zK_9^~aQcFNpg$M@1`3w?G6)O?L%>ilOt889hJz7cBp3xogE3$%7zf6K34+Z{IT1_( zlfe`)6-)!u!3;1H%o5T&ZDTf=1LlHxU_Mv?7J@}!F<2s$a3U`S%fNE50tA4SAP}qq ztHBz<<{w-O)`9h41K0>Qfz2QYYyn#Zn_*!a*e=-YBs;)P5Da#K-GYsCvIp!1`vjYv zWIqT22f#saNU%8n8 z!Fg~2Tm+ZEWpD*t1=j={Pv$zf0d9g@;5N7e?t**ZK6oJ5+!hbPBk&kJ0Z+j*@Ep7V zFTpFp-NoKx5EEu*gk8Ghw>37tKKnAvC_0v;?g{ zYtRO?1?>cj(;jpH9YH71S+HVs5p3SKuD}m;1KkCi63!p=06jr3&>QpteL+9a9}EBk z!5}ag3;{#IFfbg903*RDFdB>jW5GBu9!vle!6YylOcCBX$7?E>CfHPW)4>cd6U+j$ z!5lCb%oD5+&Ib#?La+!d21~$Funa5*D+HUTF956*yq&!W1gpSmum-FJ>%e-jL9p7` z2sVMuAP8&$TfsK49qa%*1#6Dd8_JF-$AJ`8*eWz)^4v90w=B zNpMQ&;B?{B;0y={XNA$uI_E$Hhy>@s1#nTY4toh)23NpU!A?!rz;$o~+yu9T@DwV> zZEy$N1^2*x@BlmnkHBN_M9ASpehQv}=imi+30{HM;0<^S-U;!X$nU`i@DY3hpTQUK z6?_BV!4F}p6Zt3j1%87+;4g?$@!z*x1V88NQGqLnCRBGmiVk9cm>?F24dQ^fARdS> zOirnQ351tU}t40166LhlN04Py`eO#XxaT0+a-$Kxt40lm+F0 z2k;cEr<4a3fETC;DuK$N3aARIf$E?Js0nI;+Q1vs0d+w=-~;Ll5l-7^0DM71&eEj^Io%3(N*{1nZ}B!8|Y@EC36^A|aOZ>fBoB504KpI zA=vr)X>bOF3)bq+f^#4OM1u3+0=Nh+fy>~EU?=md;2O9NZh)KM7Pt-WfV<$HV0pRs z!2|FRJOYmeOKf`ro`PrKId~yhUhYfq3cLnyz+1r*RNjI2-~;#wJ_(lE@fmypU%@x< z9sB@41skLO7x)eS2sXd)Ul66zza=h$C7(nUEHA|sL=$WZ5cn2Ni%9 zs3=%=O(jqnQ~^~%HBcSY05w4^P+PEsB5zO!)CKi`52z0s0AJ7$G!iVus4-{)nu2Da zxnMa|EkH}q3bY1o1WQ$F3)+G9pabYASO!-o&>3_AU4frqnOEIFci<0tfS#Zi=neXS zzMvoI4+emNU=SD#hJc}97#I#l2$oSc5{v?)!5A%e-j z0c-@Dz-ABxwt%f*8`v&b6WsxJf?%)<>;`+lUa$}B2O;19I0z1bP!I+VgCpQ5I0lXj zmJ@gaoCK%9X>bOFgR|fqhyam-9q#ks0=Nh+fy>|uxC*X;>)-~s32uSg;10M8?t%N@ z0eA==fydwpcnY3@=imi+30{HM;EiA>#<$=dcn>~+kKhyd48DM`;2Zc3ehBtk@DuzJ z?A-EOuqOHk`~^`e|NF=VL=_4p)wPW)hz6pA7$7Ey1!99ZATEd}SYB>?kN_kEi9lkI z1SAE?Kyr{murj9vsX%Iw2DpK=ARR~#GJuSN)nO)(8MuQiAgf@9AREXIa)6v5mtbke zxj`O~7vux^K><(@6as}o5y76w7X`&YaZm!31f@V}PzIC*w|${6<7_{fVE&9SPwRUjbM{t zeQ+}f0$adVunlYnJHSp540Z`NgVJuW2kZs=zw|Z}J#Zg901v?<@EAM+Pr)<6`rvc$0=xvTz-#aZyan&Td+R_3*WotoBx^@3IA2Cxxq0-He)*dka( zZ3WxFcCZ8N1i@ez*bVl8y*eWz)@j;R@L({a2%WfC&4Lj zS{Uzq>kJ47X9XYUqjQ4IE*b$M!Fg~2Tm+ZEWpD*t1=oab&L*yd8{j6m1#W{o;4Zi) zSW)kT2jC%i1RjGY;3;?po`V*_MBD;X7z!gLT(LoFl6T||sK^(#6hm8y3f%qT+NC*;v#2^Vs z3X%!2v#HFW&=>Rr{lNgi&in(xATSsV z0YkwsFdU2kBf%)a`rv3V28;#cz<4kLOazm_WH3btimKi{6-)!u!3;1{804%x3(N*{ zz+5m-xZ_;O%m)j=La+!d21~$Funa5*D}*FYF#^C!5C~R*)nE-+3)X@4V1r;gxDjju zn?VrR0=9x}U_00Wb_$i9G6#cQU^mzU_JVz2KL`N_z(H^bgn}?|7#smd!7*?goB$_< zJWiQUfz#j&2nT1uIS>IN!Fg~&u-do?E`iJ73b+ccf$QKun(jHwZYGN3__k@gwasm} zwr$(nZn?E>+qP}nwr$(k+IoL;p7;CT=Sgx;CX>v)xtW=hTi`ahBQ$Vjz6U&H0YU-~gc7U`h6Z7PF9-|53E$mUL3j`WLg9IQUNCXmtB)|_O1<3?EgZ>~nNC8rUR3J4-1JZ(YAU((cGJ;GX zGspt6f@~l=$N_Q+R?oRWZjcA$1^GaJPyiGJg+O6Y1QZ3uKygq4lmw+fX;21~73@MP z2g-vApdzRQDuXJZDyRmk3)T-C0BV4mAQ037wLu+F7t{mw1shio1R8*bpb=;cnt-OD z8E6h#2-daQ60`!XK^xE(v;*xy2hb6860C=}Gw1@kf^MKY=mC0yUZ6MVBUrb4U(gTq z2Lr%BFbE6=L%>ilOt5h>!@&qJ5{v?)!5Acd6U-89 zEW~Uu2h0WYz)-~s32uSg;10M8?t%N@0eA==fydwpcnY3@=imi+30{HM z;0<^Sg26lR9(({F!6)z;d;wp1mrC?u8s|35kSA#WREm$Ymd0!7UfQ?|2VB=&q zgDqey*ao(P9bhNe1$Kiyf|YPD*a!B51K=Py1P+5E;3zmISQ|VJPJol(6gUmefV1En zI1ere_UmvFTmqND6>t??1J}U~a1-1T>|ERicfeh658MY2z(eo|JO)n$yEdMJXW%(_ z0bYVv;5B#y-hyDk%KQ$z2Oq#k@CkedU%*%J4SW}@4gLT>!7uO|`~iQ#Kj2gD|2QE) zNWp5u6YL8l6stlD);z-qHuBR~u!}#eVApCm!7i=vf?Wv_1gnIIf<=x5A`5mDQ3Sgc zi7Hr}Xdt>^-|8_0iyTw1$gu>A99yv8!8jl;hzH_>1RxffnX3A42B3+!l8l{W0+t&9S%l-kzf=U z4aR`6V4PrIJLACwFcC}wlfe`)6-)!u!3@EwZYG!oW`j9kE|>@Ag9TtASR~kY?_#h7 zECtKJaR61WVmfUDq|U^Rao z+yFPhEpQv$0e8VY!TRX$g9qRtcmy7UC*Ub~2A+c#g4Od&@Cv*JZ@^m+4BmnF-~;$5 zSYQ7q@ELpoU%@x<9sB@4!7uPzu#q8uz+dnW_>}*Dn-Cx*@IWXK8iWz-+VBNoK{yZ| zL;w*%BoG-y0Z|1Tbruao2QffQ5KFLuZLvWd5EsM)@ddla5`cst5l9S@06&lvBm@2+ zxnN_}Qh<~o6-W)zfV3bTNDnfAjDn3`%LFomEFde$2C{=3f?WVPK`xLRK9C<2 z5Ug1h1cg9hPy`eete%U3;-Ca52}*&|pbRJr%7OBNU3C>eMNkP;230^+Pz_WE0icFp zXRsy+1hqhIP)D%gXLUh6P#*+=27=W_L(m8`22DUy!MREYgAsz=i;e`Nz-TZAj0NMscrXD>1d{~2)0+&YfT>^_m=0!unP3)}4dw`TGdUN` z6YSn*K3D)2f<<64SOS)UWrE#{E(a^XO0Wv725Z1tunw#T8w9%r-3T^;&0q`I3bujm zf>q`Y!T!VU1iJ*Qjon}m*bDZ7{onvN2o8b6;D})RItq?~k37cnY3@=YmCkAz0*>LPEETSKu{x1KxsQ@D98OAHYZO348`$z*oTz=NtGAet@6g z7x)eSfWP1$@Tu_s0fqn}fd@i?(1KM$7~l)Sf^Zf!rVu$P4m;{KA>Ys^Y0b7CApbcmX+JW|<1Lz1k3H@Ba&Y%nE3c7*rpabOd1?RwdZ~o{9)l;~DR>5+gBRc>cm-Yyc8R_LZ$U742i}7Z z;3N11K7%iUebasg-@te91N;>1V*3StgFoOe_y>F{{{N{EASCcWD4~V>{s|4j0ACOm zgahG01P~EK0+9uKYflsq6+{EkK@1QR!~(HF91vHS98EgSt!8WiR>=5jme<#=l zc7r`&FW3k6g9G3oI0O!ZBj6}F29ARh;3PN&PJ=UoJr_L-&Vlpb0=Nh+fy>|uxC*Wb z_FVKjxB+g0Ti`ah1MY%*;68XD*mKc`;1PHXo`9#|8F&s}fS2HvV72jDu)@D#)my=y z@&ya_JoBAk4V8=< zJPL>kqJijw)nN<}Q?LV!1!99ZATEdp;tN*h1R$Ycdrt%sgCxKYBn8QUKS&NzfRut= z0I5J~kOrg$=|Fmr0b~T3KxW}wGJV%&5iTVavVv?NJIDcYf?Oas$OH0%d>}t40166Q z-A)UE!k`E!3W|Z^paduhN`ca#3@8iAf%2dNs3^>E<*5WJ3te3OQ~^~%HBcP{fEu7C z2o(HXoLZo^(9i9w4yY^GDX0hP3syftpn+f|Y$#a48VU7XoW`IDXbPHv=AZ>=30esj zu(e>9L>pGM1?@n4&;fJ=oj_;M1#|`7KzGms^aQ;?Z_o$y1^qyOFhE%6>Ukg-#Hzty z2p9^6f#Jdn_wf;6Bp4-xbE`&!F<`7_$>;${OZm>r<;3Dq@`@nv102~B|z+rF%90kXOWiIk@Z~~kZf_$~= z6gbVQGb}mFl5^lZxWG0S!6jB*23Le=ZWmXfxED#&S0dYY*5FaEEEKWj@2qb2kB*0Iw zD=H~S2K+&CkOHIxsX%Iw2Ba0NHqwFgAcJ5f%*c{VATz77up}$U2C@s*zH)$^AQ#9D z@_@V`AIJ|1fP#WGqC%iBC<2OtVxTxE0ZM{WptNAEy9_7`%7OBr0;mWofy$r?s4CoY z-*weMbr1k*fSMo>)B?3Z9Z*+z;d;{Rf%+f_Gyn}jBhVN$0Zl zHlQtN2ik)Uf^{@^1f4)<&;@h_-9UHH1M~#F1ncka4f=q-pdaWD27rNJ5Eu-G2*X`} z_fRkl3=P=xIQzi?!7?u$1c$(3a0DC$$G~xL0-OY=z-e#>oCW8=d2j(- z1ed^Na7D0uGFQPha2?zLH^D7%8{7eR!9BrpI^72kz(eo|JQge+))Vj)JOj_c3&HC7 zC3pp1gE!!%Qf@~d1^zRPzV?1^<9g z74rWGR&^nP2SS0+AdFze@C9K(I1nC05bOXWf=D1ThytPtc2c5&=pY7&31SIW&#^%q z5EsM)@r5Ps<@E_bLXZd~21$S)ND7hxe~?_*=OU*7DM2cb8l(YfK{}8gWB?fjD|050 z8Ds%jK{k*bsS2ur>L38r5W>3ytO)`^El?ZO5#GDVbwNE) z9|VC0f}O#Jpb=;cnt-OD8E6h#fR><@u-nx}YtRO?1?@n4&;fJ=oj_;MMR?~TcLm)* zchCd$1ie6S&iUBLU?3O-27@7BC>REYgAu|g7kMNY1xAB0U@RC1#)Ao9 zBA6ujyU3Hl6fhM`1Jl6_FcZuIv%wtUx{Ev)%meem0CuoNs4YP!hF!3wYv ztOBdS8n70u1M9&C!LE&sU=!FZ*vZ`jwt{U!I9HzSV29AjwYZ&NmvGfxb-TeHuovtD z`@sQl5F7%B!4aXL+t*QW3>*h1z)5floCasWS#VBB?joND7r;eu30wwOz*TS!Tn9G< z`}(>GZh_n24!8^Mf&1VAcnBT|R`ZX+6Yvx~1JA(=@DjWNufZF^&hlFj4BmnF-~;#w zK7r5R3-~J7H~%;A9sB@4!7uO|`~iQ#Kj2gK|27x`gajT41wsqg9IQUNCXlK_Cucp_<^K?oq}Y* zA0!7UKuVAbq!#Q)GYv=!(y>i?kO5=_nLuWc1!NWMw>uli4sr7%7Wc*Q~^~%HBcP{ z2-aY0fSMo>)B?2yD{~!C7t{mwL6BfqO9RjlGy;u56XB|RGk81OTQyqf z>Gm~7SP)hi3&w%*U;>y3CV|Od3YZF}3HCcU9n1hT!7MNv%mH%+``VcY=7R--{hL?_ z7J*0Ca@W75stflhpk{6*ba7p zonRN(4fcS&U?12I4uFH;5I78ufTQ3TI1Ww-4_%p0f>Yo$I0McKSKNhk4x9%Uz(sIL z*yT3946cBy;2O9NZh)KM7Pt-W2(et`yWk$U4<3MrLa^KT5qJ!qfT!S@U}x|-cmZC5 zSKu{x1KxsQ@D98OAHYZO348`$1Z%Kg!8h<7`~W|}FYp`u0e`_i;8X4YU4#H3fd@hf z&0N)m24R3N2n)i2@E`(+2qJ;Vg4J^r5EVoN(LoFl6T||sK^zbl!~^j`0+0|S0*OHq z;0Ka|WP-I6e~=uc04YH#kQ$@`X+b)WUa*#u0b~T3KxU8yWChtkc8~+)6s*DK0=YpR zkQd|w`9T3t5EKH11#5#vKv7T(6bB^)yO2tPQlK;_1Ih|^@s|VTK?P6|R05Sj6;Ksa z1JwnqjQ~&s)C7T`mSAPB4eEfppdP3%SZxG>2B0Bm1R8@Tpebkunu8WXpu06{30i^H zpbcm%oQj~0+ky6=1Lz1k2|;e-&Y%nE3c7*r!WdVK9-t@a1$u)%g5AmV1^qyOFaQh$ zgTP=g1Plek1iSkh4n}~HU=$b)#(=S492gHK2oK%O(nK&xnC|YQCJU3@swrTqu+goW z2Br&kUpE8H6zo&8gdq3v*FSeFW4u9cJC+J4-SBX;E-Tf z-C=M990kX~ac}~h1gF4ha7M6tJ`2u)^WXxw2rhxk;0m}3u7T^|2Dk}sf!p8?xC`!q z```h12p)mQ;0bsNo`L7!1$YTw3DyQ*gE!zU2nO%Kd+-5#1fRfX@CAGY-@te91N;QP zz;Eye{00AjPxb$gA_NEtJP-aqwnkUlHO2C@q_Y(59b337qlf{jCE&j<2@0)h?aE(i*N z!h(&=F9M2!VuF>hxUkecB`yI<3j5uXQoH5G-;{5GYhkq@C6hwmQ@n&O6i*vOCljUOLnh zJoo6nzR=t)2@(c6G!POvG!$k#G!iUwW6(sf$V~-{+)S`fH3uy~OVA3m7VP6~1dH63 zCG9|a!6J7MtY94l+eIfo{}V3S}s z+nd1_uoY|r+rbX76YK)J!5(3QEAw8k59|jAz(H^b90o_gQE*I15K)njgA?E+I0a6F zGvF*Z2hM{Fg8fgq2rhxk;0m}Z*uRNu;5xVgZh~7vC->LmHn;=sf_vaTcmN)PN8mAd zBG|R@6g&gZ!3*#byaKPm8}Jqc3z6L!d9BnhJIl%>;|woNZdLs-<9; zO)J4J_13~{cW2c`uwt|o?2y~Bq&?^$*gX1^_ zm=0zLHp_1&m<48oIbbfB2j+tXU?Er}SeX}tC15F729|>rU?o^3*nGy-U=3Ic)`9h4 z1K0>Q2{!$3GuQ&Qf^A?s*df?FyPbkfW84LHgFRp`*a!B51A^`SAUFgLgCpRmU?=4m zI1WyLli-wKlLSwLGvF*Z2hIytj0@l*xCAbPE5ble4fZOy2Cjn}LN>R}O>hg`7XF3Q zsypB=xF?)&tL}pb;30Sf9)l;~DR>5+gBL<`SDu&P6?hHafVUu6sNg>J4!j2+z(?V{ z+vXGa48DM`;G5uu(#GGx5AYNG0>1@I4EqQC1^<9gjsLd^0YU;#u)>D|p+OkIa?kpL zupk@=4kPT!9IY3U3 z3*;88p7VgbAfI4$m>(1X1qCZcAy60;0YyPE!5U+6Py&<$r9f#=29yQmKzUFBR0Nek zWl%-123r+W1JywQs3F+(ToVL>TA((lBiQM#3+jRTAP6)N?5b-B8iB^331|wMf##qE zXbD;gHu%3aXam}UcA!1z06KzBpfl(q*ng|8pd088dVrpS{fF%ZdV@ZoFX#vQg8_p5 z#~%m=fx&|PEgb@ef?;4d7$I1kkzf=U4aR`6!Y%g~ZyXp8CV+`xl3>p_CW9$pDwqbQ z3s&YCU?!LaW`j9`y)Abxm8b4#k9O4#kC+4kd&O4kd-W4y8b8PzIC*hRu&$PBpt@ie zQUItS*ri?*1cF+iws0q|%3KH36-K)y^@J4;^@T$YLBdyu1}teP*vA_QwsB*&X(IfI zr;VEm8628{=E7sQq=gVCzR;3Yt%UV%Rcj%OTh)eDZ9zNG9&`X5K_|f?cV%mlN*Y%mAR1@pjsus{fQy?6`3BCr@N0ZYL$ zupF!aE5Rzk=FzVPYrtBt4y*?oz(%kMYzAAvRPq2&=`vpr7 zaX_$q4hIEGzi>#fYzc=2o1uS1uzCGQ1v}(pg3Y5pF4)BU6N1gwISEdI)8Gs^3(kS_ z-~zY^E(ta>=rXthu7Ydex?uArZh)KM7Pt-W2sQ)sF1QEog9qTDU~@elfydwpcnY2g zr=shsdk$WJm*5q6E!Yj!8}JqcgLmM)VE3XQz(?>2dgvqWpLW3~C7lZ}jgt)HE;Xwot5kvx!1-sdf0-}Ow zAUcQvVuDy8Hi!e_3U>b-55xxvKthlRBnC-jF6aLlIZ$3G>@wO_02KwxH&_W&230^+A*8=PRSi@ZtOp^0B{c+#TvM=g zg@J;?P4esBOB1c$(3a0DC$$G~xL0-OY=z-e#> zoCW8=d2j(-1ed^Na0Ofi*T8jf1Kb3+z-@2`+y(c*eeeK01dqUD@B};s&%kr=0=xvT zz-#aZyamDF9e58ufREr4_$*i(`~tp$Z{R!l0e*sC;5YaK{(^tNr`G@b3IRd_4}=1t zK^Wi*!h&!hJcs}yf=D1ThytR5XdpU>0b+t!AU22t;(~Y}K1cu(3hq|TOC-3vK`*i3 z?jgM-z)x_upk7jtO!(_I_6Ny93c)?l_ELgWg1g=IQiC)gt>Es^ymTNv$N(}5?$+AN z1TqWuy^#fE1=&D$kOSldxj=4^2jm6$Kz>jF6aQ z342^^Y!*g1Y+=<_unlYnJHSq`3+x7agg5RC?gjh6esDkt<92!w90G^I5pWb76WsGU z@3`RdLU<NmXTJMDy+<0{_0*EMBN{|Yq7LvMEX#`(~w8BV-bb`f6FMM=MG6;JdG71abE;0!gIkV8- zt;!k+TaHIfoG7HqHrh2^Kjw$RpS;@(LC?pODXeDnF|V2v^;bg2D&A zX~-)C3Jc4lX-N@btV2;Df_2@MhQpXlr2oW7x3L6|+31uBx3$Gp8 z2)^!9ZG|>&NjqVjLwli^Th&3ZGIs=>1S@lA!D^!mtGWvBTy1m{tYF;*``+jw40dJi z$*Nw0U3I+$yNvq?c8T@{{Xl=guIB-QU48=vyH*DYcKHn!?5Z0gxRFlYP{Adk^@a&9 zgRVE6RU=q3QgEqRy-|Y8{_2eeV+5Co)f+2Vz;S~8@fi;$2<}<8HxWz{>_5n4Fa=Bn z)4+5vLvT;Fy_sMZm@U}ft~rA1W$@+-_9tteVE@17vt)tL(`~a5EE3$@Qg5-~rg?fx z1UCoMTPnDDn%*+OP3rWP3vNoOw?c4}F};<7dwGzzN^tW%z14zyF_5=Lu*ho#i@Z*- z$m<37-X(8?V39Wp7I~B4W|DfF1&h2zu*h2li@Z(v;-hW03&|XI2>Bg$3N;*d2^}1E z3rigK2)7;f3iaH1-zSW6OZE$C+>!%=1w1HBbW08i#T*U`2i?X;gzj$1QNcDoCPZ;d zjti?DP6!tHB-@-4cBjy)(}I6W;f&DMEjcSxb2umDaX2q5bhseAbGRrZakwOeb05Df zTy;yX2*Vw&3KsdAV3Ds27Wsx?k#7nX`IcajZwnUr4omI|7WtlF4dgy}AXrOzD7gH_ z-Xr0=JLJcLwSp&twUnoVOFry96RZ(E7p%#=5G>A1ws|GkzFrHq@f%jX6>ML@g6->_ zU>m;|Y^NUt3;0p6EBupSPY*tWFM>TH_{x%Rf;~_84t{{2;1~EU*vJ2Xzu+J6sq_Cf zAwWpr3HG2P6bKE%2)SL`@daUp#BNDA!A;Qi!VAF;5d=5m+lwez8;m5_#*qbUL{S85 zXi)`gdeK01R>cskb;o2?EWth=Td>G+1Z#|O1q&EYu$CKNu!}7LNC*;v#2^Xq14%(L z;17}ucCDrWDM2cb8l(YfK{}8gWB?fjYlE2tD|}|bT1pndT1r;I_MT0!mXcktmXbrT zmXcGjHkeDWmXcerHke1S$aw{eoKLXG`2~wyK(NRK1&drru*ii$5y2uC6|Bh=6YQEV zF4(1BLa>Hbl5I)})*MQMGJ<`otYDui$CC1b>-6_32(uh23aW9L-hZ#U;ClbP0KxVCdo=|2W^k`22n4l2ZBPf)1@%CE5Cj?s?k(G1 zL&3ee+G`}Z7usudL0Efx6A7!xVOQ2odx&u zRMpn!k9s`>_nuI%r{G@e>GcxaTR6Smg6*`AU<`w`3$3CG2o< zMho^BVGOIr3KnOa;O9OyUby5oo&Y8a1zk}m32q#tH(7AQ1-&VPo3rmt72IGmZ<^rV zlH*Mm+|V*_hTz61dNT$0${25!;KrDFvjz7;7H^JV0q25wf<>Osk_BKPSOgY>C15F7 zCb)4j-g3d3%nHF;%1Xgn$|}KH%4)${${N91%38r%$~wVX%6h?C$_ByZy7xAMO<*(F z0=9x}U_00Wc7k1k%eLz67F-HbZ;#;8IeL2qH#o=JC%CNj-hQEzpKw43bT}wj!484L z;0QPhj)CLggy2T$cqaub#wlay*Gk=*S!_&yDnI;@6~tUJ@^1V3hpKE-Y3Dn>plxj+>$TC zZ}+wQRd6|-yl;X_I^=y9T%IoPhv3p`c|Qf0oyq$pxTICyZ^7la@%{)dHLLemaJh86 ze?lg=%BSxC0YeBbmzNh(aOtN!PjD%!yijZt8iW!0x>de{%fIS{6@vd&vYhN!jxk++=Vsx!`7V zdnp7r@7PPpHmL+RH`z-qxVgz*8ju#G1L;8qkP&18nL!qiRdBP$yljG-Z{=kd+|(y8 zhu~&%c{v3)3(3nR#B<0kxcOgR9>Gn5^YRLAT9cPgaFe{e{DOVFfZ!(Fc?AXAxRBtc zXL^MNi(Eu-Q>eV6f<-PSJaW4zE?DFeg6+Me;06PGr9f%HjV1QV2yS?=S5|OiiM?`y z8%yk!2Nl?+qF`|<3AS-%!TxDh5$yk9Rl)vgRuk->W_6*1j{*h=OB`wlw;gH<_J1%? zu>XU#gk)}2ZK1bD{Caf+H%i&7E4VShUOmB$QugW#4IP45)j)8gl)Z++REI`_eY~*{ z)h%fv*aN_(pc!ZmT7Z^0kz!31)%WU=ElI=7ITO0ayqY zfyH16SPGVbQfz4nG*b26R?O+Gk33h?qU=P>}_JRH2 z05}K^fy3YkI0}w||uxC*X;>)-~s32uSg;ErJ9 zWbT4{;68W&9)d^UF?a%=f@k14cmZC5SKu{x1KxsQ@D98OAHYZO348`$z*q1MdAgBdugF2uts0Zo`*0m7?8i0nN5oj#fgWo2gsbJk7 z%|LU(o(Z=Qte#tfR)Y1gv<7VitFg9%RZBb2Ua)<25bW4Hf=+_%qBH0Mx`J+?JLmy= zf?l9E=p)zzf>qnaoW`LPsmSD9p8_WT7!8|Y@ED-FxF9eIgVz5N8-@&C|8CVWh zfR$hsSPj;IwO}1s4>o{}U=!F3wt%f*8`utZfSq6$*bVl8yVUeS9;h!^KVuMR02+cuf^{!822DUy&92#&=qtOtPOStJwQ*;OR#IKH|PWU3N|vNALtJT2-cbgf<1 z2iyhszi_zr%6 zpWqkx4gP??;2-b_`u}`|03m?~LV?gA4DbbEK{yZ|L;w*%BoG-y0Z~CT5FNw-F+nU4 z8^i%|K|By2BmfCPB9Is)0e&DUNCx~ta*zU~1gSu3kOrg$=|Fmr0b~T3KxU8yWChtk zc8~+)1i3(NkO$-i`9OY902Bm;Kw(e>6a~dVaZm!31f@V}PzIC*)B?3Z9Z(n41NA`=XaE|5MxZfh0-AzmpgCv(T7p)fHE09cf_9)i z=m0u`PM|aB0=j~3pgZURdV*e{H|PWUf_|Vs7yt%>L0~W#0)~QNU^o~7MuJgbG#CTM zf^lFxm;fe%NnkRV0;Ym#U^2AS=770i9+(dnfQ4X@V0TT6!4j|(ECb8I z3c*HWt`zLK4zLsK0=vN; zuovtD`@sRh4(A{^1P%*!3XXuI;21a#P6&2?coLiv?AT9(GvF*Z2hM{F;3BvLE`uwA z-F{yM*95ysz7B4Ho8T6>4eo%u;GSUj&-cLt@DMx#kHHi06g&gZ!3)7|wqJr*;5B#y z-hyDk%JUAq2Oq#k!Txc40-wPb@D+Rm-@y;?6Z`_d1sl!s2mA&9fKP+}w+R740uO`& zp#>WQ69)K#upk@=4abRa#*05S@;i%cLh$O5v0Y#=+x0dj&| zf(>WN4f24zARovN3V?#35GV|a2sRq3s9?2G3={_?KuJ&vlm=x$Sx^p?7i^g0H`5YnQMYTPz%%sbwFKE57Y-ipn)*PPvc}7f<~Y*XabsoW}rD} z0a}7qpfzX%+JbhVJ?H>Bf=-|_=pxwIp01!9=ni^-o}d@#4f=q-pdaWD27rNJ5Eu-G zfT3U*7!F2&kzf=U4aR`6U>q0^CV+`x5||98fT>^_m=0!unP3)}4d#HkU>=wc7J!9d z5m*eCfTds=SPoWzm0%TE4c36QU>#TwHh_&_6W9#4fURH~*ba7ponRN(4fcS&U?12I z4uFH;5I78u2-ZJ%6dVJ`!3l5@oC2r88E_Vy1Lwg7a1mSrm%$Zq6qaB7-O(Du@Q6gBTzthy`MU zI3O;F2jYVSAR$Nu5`!eb4XI}dEl3B_gA5=e$OJNjEFi03 zb851I>>!6=lWTHAgBdu3sx<4KwVG|)CWO=O=4;Q8iGck zF=zssf@YvOXd&2HZV6g})}Re&3)%@bt*JfeAlR&^j-V6h47z}>pd088dI(m}JwY$f z8}tEvK|jzR3;+YcATSsV0YkwsFdU2kBf%&z8jKNIxgq*v!8pMtos9<*z(g=futqc) zOaW8DG{L5rO$Rf;OfU<~26Mn%Fb~WJ3k1tzv=A%;iv>HJCBh;%i)|@b29|>rU?o^3 zSnFO5)_}EO9as-GfQ?`i*bKG^HgRt&*ao(P9bhNe1$KiyV6R{YxKFUFZa+8x4uV61 zUGs;*5y55)9tFq1ad1MgIff^}DR3H`0cQo9YSmbDel_$Dj zbLe8QDyCqcip8qff<=x4;tHClqWNEfP5+56*kqpsf+c@QDA+upM1tj)NG#awp(KJO zk?<2NPEwFeu$e*rAh}?(hf)YO!ziU-=_yjNDz#uaDAItmAf0f~6*awJDUULMj35)p z46=Z%AREXIa)6v5mtdKfa)Ue|FUTiYG4czR%BcV-D7cqBd4<@fuwVg;fTExnC=N=1 zlAshQ4a$JBpd2UVN} zu{teS&a^Xv<*GU>SoW%Og5^v*FIcLp3xZ{1yC_&Two8KL#kwq5hN~-rWw^R3Sca=> zf@MFu4sHmRSM8=?dDU(SmQL+9xFc9zwY!3)Q@aQ5g9m~|eh40c$AU$EB3R_7;2C%> zSjM&&g6-lZcqJ@$lha=dmdEUkV41|;3YJMMSg7O@h`kdmlh}Jhz6nymia9PhzVi|R-V`(4u}ilf%qT+NGMpAl|&#hNCNyoQjkorJ3W7p9Ham# z1-oZU1yX}FAT3A-(t`{jBgh0YgDfB`$Of{593Usi1#*KtATP)V@`D1PASeV1gCd|P zC@yo7oxmi>2WFumKUNTs01p5DxfN;2C55o1_MA1!E#X4 z1c8F(vZw`WgF2uts0ZqUAkaXtR2U6GBf*ZMF=zssf@YvOXdzgfmY@}A4cZ8nN2o1m z2igl(nH@k!&i#uJwY$QG8FX&eL!E(5A+8E1WVg85DWr? z!4NPM3$pUil{^2tmP0$qRQM8OI+2}}l4 z1PeG7Oas%w48iir%oHqF%q%b)%n=H@ea&UbJi#(@%m)j=La+!d7Ay_O60j631Ixh* z!6L5|Ec?eQuo|oZYX!>(vJR{V8^A`vve|4BEU(CBumx-d+XOq(?O+GkDcDKb1$Kiy zf}N(lU?12I4uFH;5I78u2zE}73U)~x6D%ppac}~h1g8W`rE(ga0cXKEa9()tQmI@J ztm-a;OW-oN0nF0O&=;0Cw}ZV7fp-3E8SU2qTF2M@qQ@JO(0{xNtWSVo|y;F(|< zfu0MN5$J_r8G&93mJ#TcU>Sj43ziY+jbIsp-U^lxC|Iz_?*t3@9()ii@<+iUe-bS6 zXTc(W5iIgo!6JVXEb@23BL5I9@=x$fu*km!i~L8h$bSWk{7uV9h$2^KlOV4o@=Smc6&MJ~jW!faDS zusB5pD^D@O0u~o+UnK;KTvD)&O9{4%(t`ETmjPu#IZz%{02M(cP#IJKRY5gS9Rz?H zpe6_ewLoo92h;`iKz$Gd8i0nN5oipWfTp0CU?XsvgBGAAXa!n>HlQtN2ik)Upd;u6 zI)g5tE9eHggC3wK=mmO%KAC0QnQ&rjGO=yj zwr$(CZQHhuyUx0Kt5T__`t<*G_ik8b^B%#q)_Vo_)ZHhzW9@#H91uKz!9ihRKt1*${&W}| z5nMbuD)=5eCV0%f;{ga59`J;)ARyy;yD}u-Oy9%y>>w-t~y8&*3TY|>`ybbPvyMhM;ya(=s2ZDzXdZ3vku3`!) zc;!&StAIa+W=R;qzY5Er!U<&p)(I~-P6XD8C^%pw!S`Tf5Cud9(Li(%1H=TeKy2^_ zhy&t+cpyGV01|>kATdY+k_zr;o(v=x+)+FQNC{Gb)Pg&K{|VB7v>=_}e!1yE29ObC z0+~S;@E6DmvVrU%2gnI>f!rVu_#5N}`9OY9KyZiif}jxi2NVWH1b6T*3W|Z^g1c&$ z03|^wP#Tm0Wd-+6kIP_ODGsn`B__VQ*AO?{gy6^{S!a~s$fNnw7{PJI3XVLECF2E0o*=Xg7~*vzm;@#Z-qsYsk*5mY z=V^lXdAi`)k!A=^@R?v1m@PPY=Lnu1X|CYek>&|b=lNiP;CYu83XZ%;aOA~;&)^cl zXK<jXz$&!0AcjbM}D$eUTRMR4S; zf+r!`COAv8U2tpr4#D}Bor0$&+9jk6n7U}U;CYw!2yU$3D>!enPjHTCzuG0Q z$KVNgD!8`!8F((ZlKBOADY)MF6?hHa2(B)E3*HH?e|`@>2p$Ofqu@-=C&Br;&w}%Q zUj*l@z6#DzeG{CA{4O}__yha|zXa#C0yX@dc?&E!gBL__&NHas++Z*e9E1>@!3!xk zD;r91t}?XX+*cUE`RA}890(60fQTRxhzz2Ds301M4q||qAQp%X{s3`6To4b$7yM31 zAo!hK}WV!^MiB!b@{Nd>=Uk_mp1B^Ug*N+I|?m{M@$R3NqB_u!vG{2RRw<`TTO5Qv%27~J8KC3ptYvp5ld<(uf+IH(9J#6BZ;G1uw-kK!wgRm|8^PCVThLDMHQyd| z03AUm!2vr9zUsONzHGV*zMi`YzEipjzEgS#zCn6|UV^vYTky~O2);jDFjesTVj7q(_!Te%%oO}4ngwPH9^HM8;6c>q3LbHNp5Wox=d;cN!K1P-6g&d_ zBCwc0EfGAr`%=NBwq;$V5{Jg z%Qmnb>;O9je|^6T>=yiy`yRnV`s@|_rT;#`0~75Rd=DNFyz)W8H_;)%H`-yrx84zO zls_F4e0LugyonQne|}PMKr%^E`W>R61WVmfUDpdxGuO) z*9~wJ+yb}39dH-i1NXrL@KA7HwMXDFcmkdZ?nw3wJO?kpOYjQ37Tj0u4R{OQf%o8p z;7xo4p9Cl7XYd7l72Ij<8~6@>fS-c<#r*<-8vR}p7z6=9K`_Cy9t0PB4~7tY4~7(c z4~Al$(1P!;FoGvd2n)gqzCFW(2!bCV5kVvn8AJh5K{OB@!~iitED#&~0pftTARdSh z5`cst5lAffDVjv^!z!uZr*SgDkHO@EAA>0bKjKmfe)^>noJmeC_$m6Q;9PDR!B76Q zARR~#GJuRA6UZ$1L7fHs1+ogBhc27o*|o9@o?R=4;JNB@3eIoj3P2F$$8rmvt}Bn= zdGY=hJk?!Z!IOOD6MU!S7kp(F5PXdl6x{c+kl@_TKZ394!h-u=77^U{vZ&x*oy7!S z#>EBSDJ2Bo<|PG>Emlf!r}WZ-_qmMVd5+4mq@3U`=;c{bL2%ZnqTsJ}DhZyty0YNw z@L$2x?o<){bB_!;K*aZSTGKZ2NQ&Z0sA}=OcH!WO$JlIRKcw$)4+7WjlVMl zw@S|x+%7yzaFg+D!Hvjs1h*Z}72Li&PjIXBe8G_y2>$s(!I2jUj=WfKoF%NYRPZL2 z368uRtPmV|rI0h=09S$4U=3Ic)`9h41K0>Qfz4nG*b26R?O+Gk33h?qU=P?U_&(hS z_Jaf9AUFgLgCpQ5I0lXjzPnF=li(CM4bFhG;2by)E`W>R61WVmfUDpdxDIZBo8T6> z4eo%u;2yXS9)O475qJ!qfTx0U=FbE_qn-=Sb-xgtD|jh5pYTfX%tx;U&yMs)aHis| z;7r9k!8wQbf>-_^IL=4GD}NH4h4?IZqhAEiyYyA?w!R6Tcj>#}U;O|-1>Y&ZKtRod z@07rT@01{dFaDr{@1|ga@15X+@01XN@4=9QZ=z6wzi$c+!houi+qTnyE zBJrolg5Pmb1gCRU!ABZRa5_g9oIWuGAA3x}Nf%3SI>#2A2!9Ap=Qx7XIj-O|j0fU_ z1Rxod2Lr%B!7Vj|z+f;$a0|;&FboU_BLp|=j0B^=Xu-`f zW58H24vZJvQZoTe6xRl!7{L1(7!-ISLlD&;H?x~CAdlm8StmoU=3Ic z)`9h4gWx*7jbM}DYQxQ7i{Ki?t%7R{w+XID+zxgKt|Z(Ec7feskKiswd%-@zeZ%&H z1A;q%9R!C2|LQO}BKTKFS?8GGGSP8xLhuZ~Ck0Ojd`j?iz^4Tlj?M_44*0C#sfW)A zo<#UOf4U&Ji^xTANpR1Q%Yr+WToK%9>-rR?w^ z0*DAAfyf{Vhzg>C=pcsR`j(g=7KqI{e}Fh3uHXuscpyGV01|>kATdY+k_xW3Nd}UG z6d)x?1yT#HHTn~z0ck-xkRD_J89^q&)km2@7QyNKm*7gLtRNf64sw8;AeZ1etK1+D z_#5N}`2<%wek>Fk^jRp5PX(G6vOjE)AWSR-?h0o9mUI@p&s_xXb63HUy9tim zU2xWcX;MC|PI5m0;PK`c-Q=_lo$o&LI?k_m2HUJC+gTP?H8LA7ITZGwNbUGQnzA^7Jz1!n?xf!%^LfqTGSun+792LxvV4}wGBFgPOU z33jWn2)_E-WrhWpR3ci=034U%o z7yR6KA^5rRQt)%*mEimRwcz{x4S#wovPB$^@+QNpM!}v*1kN z7olIk2lZbCX9B+o&IEoJ9Ono434RHV9H{BRw9qo(S7AU{!9%Wv1K|aa+!X;t6g+5EB*B@$$RG-c3ZjANAO?sDVu9G; z55cuGaRj$k#0Bv{e2_p`7(z#p5F`SL1wYx6fTV&Om68c=9!f5_=_}CY$tv``cs?++`)B;K>{_37)Yrv*1Y>vj}c)`b+S1oLL386J-f`bTg}dSSu!T15o6 zq!$(3l3q-3MOksdb!a67*M^nkPo-E=T5#ktf?M0m3a(x&CwLR(1vkxC5Zrm7qTouo zN`hCeEO^|fe+Ab%RuMdG)PI78Tc-*HNf@?2p3LYD(mf+U6+JXbt z5j-D#UBN?3)e}7KQ+>g8rws(J+)!}6Xd}V%(Ki+xxe4nu72NXJOmNF%bHOc-Ed;kb zwiMiS*h+BAV{5@Jk8K3EJhm0w^4Lyr%VT@NEsq@pNA3tZ369)ZaO5tatKi7p1V`>J z_~$(YNA4-O*|eA7JEgbacGy0Gn`rwAZhq|t`V0Qm0KqrfK*7Hn#5#iozchz{pQ0*nNsz-TZAj1~OO9S6pP34-6|6Tu`f8B76F!89;k@N0brmgQpVol2U>#TwHh_&_li)nkX0Qcp z6}&&&z;>_$>;$_6r~GcgdA2=ZFW3k63og_g00#w^84n3=3pgyexO7BtgY{9C9217c zQpz6}76;&jur~lF1?ON-34SS@7Mx8zBRH3PR&d+IIl;Ny^MZ4^7X)_^xhOc7dr9#A zToxSpir~ms1xLOnIP!JDk#7i&d{c1bTi~|fP23S2`L5u|_xRI&!I2*bj{Hz?7;3|TT{OJ?;EO=XA zz*q1Md>355@dNx6Tu<@~1ZwtsoxmW7;2jGJf(b4Q2L~ZQNWqs@D8Z3K3oh)35nLV& zD>&;IPH=fJyx{U+1i^X8h=TKnkp$-tBMUAMMiE>dj4HT17)@}dD>{e)VuDy8w%|?( ze}Fh3uHfDX@j!gRdA|f8q2NqlB9K^cCNK#|DtKhzWFWcVOkfI-Qg9|P6-X^O6Zj`c zBRCV77NiqAK5crCLGVzh89^q&9aJ)dEP^w5e+k0_a&cK%k_}`BIY3U33*;7@3Csij z26;g~kRKEP1wkS34=5}=j;b9iBDmj9Q6X+LEh#3f5BO7YVNk%562i%VB_)Lx0ZU2= zSp!g7C>ww>LXZHI75um;2g(b+yDJF3yDJKQ0#p)wcUKmCcmFH6O|y#NyZb-E&yA{r z2M?(xc-)ohpoZXqN@@xo=cJb4VL)nwI)Xoytqbab`hv%1X#g66MuJBOX)Jj3k0zig zXeJ~L_!_sl;H|e{NlU@^U@O7*U~9qmU>m{rU|YfWU^~J0V0*#$Ueu5k8`?F+#;5Pb! zg4^E*32vhwEVzw+h~PH*p@N&{hY4=bA1*lZ2rv?i0;9ngFcyphu9Vs^HH_rV0LrWxC*xM`j5Acx0yFuUcja{=j6m;NC2Az+5m7%m)j= zLa+!d21~$F!5?ui1IvY70To%}m@X9*`$Jr^k&-O0C-;M4T+_QR*;Lh87g(vZ} zWBUYmsNOHQhxP%%J?;()j&n$u7O?VR!F_v1h4#BaO5}O zt>CNWo!~=$4?YO)Gx-sG68!Ve;0yRFxXa}?@E!aBKfy1dNNnwMpyt03SeOv7B#2Na z06~RF0SG3zoEsd303ksr5L$2ZCDUaa2Ynd;4*atVWid$8d30(MiN2?EQ!pL zD8l1_B~gWw0f;6933#?d7gh!=i6QvsF+nWBFV@)L55aHPID+4>aRt9&;|YGl#uxmC zO(6IUn^5o@Hj&^rY+_+*!0R}P;7ue2$pmjAIY=RRTPZ;*!5d8t{uCTJjo_cB1?fO~ zkO5>A961xnEO?)@fWJUi!TX#|@R4Q*IRqbaPLK=a7921S_*-ylMG3Y7+BKv_@@lm`_+MZs-Jl|W_i zui!7EtAPJNRZtC77u?=d1JneyKyAUTRCNTmTh#^i1h-Pv2Ms_&&+G&JKXqbBXTjsibP+sSOIN{z&vX+! zT1$7q@0}ikJFWEuy+Ci!2lN&E{^}?A{nZ}~5d4lC2nK<{f?tS3z)&zu@P#y7@MSYX z@C7hZ@R&2B1fQnSg0rb(z*sO&@E9-S!2~c-a5i-km@GI?I|WP?oJpPrrVAcnZ-(HE z>r609aQ=BVm?L<|zPW<;aGu~12i=Pn1Bq-V!?a3MDR#`ONA-{ ze_AGZ0K?^A1?#L7T+O=*tOjeqTCfhR2OGdf!S&CZ1XnU|7F_$>;${O zZm&Z>O|Uj%0Yzk+Xq^L5|B55bA> zQ*a{u0)blmPK3aMk3ERsBMl0I2|mE!AcWup3@LbjLJ8hPXu(?#BY4Ncf^dQlCp?HC z_>dzCPK`){6Dl%@A~S6ab4pN@6XvrYzKML_d(M!_w`nFO~KXBOOYokehi^yA7B%~nTn=@kD{62glaB0 zatpy5Z7Dc%E7oZ(coS^|M{X-Pay!A1+Y64|L2#kCBj^M=gD#*e=mxrj9-t@a1$u)% zpfBhL`hx*rAQ%J&gCSrj7zT!e5nv=3B{&gAgE3$%7$-RC#)Ao9qTqC%1SShk%qd{1 z;8dLkrh^$^rrj!I5_hj=V>3Q5*+!o;K*nA(^4MwE>FP&@P zI=CUYyUtB;3)~hwGUpv|S7;YmkL7#dzTiFuPAA=`?yAM4D&jinr@m%nz zq%Xir!I57H-ow}6jo`>{1@GZI@Lq7758xyCBzWgP3x3Ca0bjv4@E!aBKfx~$sO9fC zfk6<#FT|iAnBaG1a1a87WSvkTGzh~wVL>>-{Q<&*2p}Se1R{edAS#FkqJtQMdn3dI zu|RC_2Z#gWf_NZ4NB|NF?(mQZBnC+Y_i9KgxF<$3kX&$|iWGu7MWh6&1b41TE%@hu zf;1p4NC(n`3?L)O1Tupxg46jgkQHPD*+CAF6XXK9K_2k8;BF*&K|YWl6aWQ5A@C0< zEI56N2u_Wnf)lD3C=N=1lAshQ4a$JBpd2VK`0P{=oGcXu_min4_~cd=eEs|@_yDU2 z-k<*j_hzXoc%Q2YK5^9r?|coxk!uQ$TuX4|+JYn35gfU$;K=m^N3PF04FpGS$e$X4 z#-Isk3YvlDpap0NT7lMr_ooeL3)+G9pabX#I)Toh3+O615xRlypaRKeHA zG%#K8xtIZFf>~fTm;>etjyw;{2MfSL!N;`-ECx%!Qm_mx7ktsK04u>N!6$b$SOeCA zbznW%05%G~2RE@~v*6U&B6y=)1*gU~!FS4b!AG$}@FDLMoX)!h-zmEV--CMu@8Mp- zk@pFXykBtS1A-$T6dd`G;K+wr=ZN6QN5L_09Gn0r!6|SWoB?OSIdEQZ^T!2n5nKY7 z!4<)cFIT}ea2?zLHwE`&yajH9JK!$3C%A#;K6n5gf=A%7;N5rvo`PrKId}nHf>+=* zcmv*oci=tv06v0G;4}CFzJhPyyWj)-0e*sCAW*B{>jVZtKu{121P396J%N;m3<*Mk z&>##53&Mf$AOeU8A_;CIiwvTGs301M4q||qAQp%X{t#3*6DVjL5La+V)_5R3e@eiT zgo3ZtMEohS;J&FzKvKb7TayXy+L|1s5PU(V6ntE%Kx*(ONF#V#X+b){`A226;g~kRKEfT-RL?6axQ%!k`E!3W|Z^ zpadu>xHi5NC=JShvY;F&4=R9)pc1GoxO@4(pbGd8R0Y*Qbx;G;1hqhI!F|ZUv=Zac)>rPAozSu1e3sIFa=Bn)4+7W-MMFgnS%Ru&l3FI#B9Oc!siI?7Cu+- zw-xgQe=ad!aA)!bf;);Y6dZXGSPYhcrC=FY4pxAbU=>&`cn{ZrwO}1s4>o{}U=!F3 zwt%gI4{#exwu2pDC)fpc3;xv}uovtD`vvdw0hSzO$suqU905lKM?MCQgA?E+I0a6F zGvF*Z2hM{F;3BvLE`uxJD!2x&gB#$c;A`U+xDD=ryMiyRd*Hs{tK|WB2p)mQ;ECW1 z@+o)*o`VqaB7-O(Du^by=Wuio1H=Te zKy1MskN*I1KwJU2C{=3AScKLa)UhJZ;%({1NlJ#P!JRX|A4}RdyE$WML{u8 z9F!0|rd&x-3X}$AKv}`*Tn>~66+lH$2~-CEf-2xYP*w2tTn$tQH9$>J3)BX6KwVG| z)E9CFTu2Q-L(m8`22DUy&D&sm25mrF&XW>f$?Ah zm3-OumkKAd_C_1yTKl?7wi-K@yLE~02~B|z+u6I zWF7%W!7*?goB$`mDR3H`0cQnY&*#8-Z~~l z1JMP4EFS~J1hE9~b8PSjhy&t+cpyGV01|>kAhF)zXbPHv=AZ>=30i^Hpbcm%c%R#W_Mijk2s(kz zpbO{X{$KzYDEN9F1O|g4U?>y3CV|Od3YaSRi@9lFI+!8&qr9157MLygTf8}7E|@3y8@l;|Kjm8h z7J@}!vEZ-#mVl*Tncy$@mV*^wrQi<$SAo@Fjo?oL*MfCmz2HyzHh_&_li+>cEcheA zEnq9yCirW??O+GkDfs)rU0^rZBRKM2!DBk@6Fl70e!*ip9S}Sq=Rv_^Ivo-`rqf}; zV>%rXJf_o8!DBid6Fd^salw&K2#$PGaO6{hBcB!=`HbMmX9Y(-CphwX!I3Wrj(kyY zOL#T2C{=3AScKLa)UhJZ;%({1NlJ#P!JRn{y+Z( zC=7~#qM#Tk4oZNMpcE)AxbdY7C=1Gg@}Pp?hMtO`5~vLR1yuy!ga3i5pc<$SYJi%c z7N`yCfV!X_s1F)|hM*B>44QzZpc!Z`_)cj7T7p)fHE09cf_9)i=m0tjzW6(V&cgrO zzd%>e4Ri-RKu^#M^cLKf)Ccqh{RB5k_6Gw5U(W-h?dy5OU@A$SjO3QmMug12>BaQ^v@;H>Oj!IAF?j(lHmJC5EI3d5L~!o(so=cmGr=2uE_laYfS0WE3cLnyz+3Q6aOC&k1NaC&fzN`E;tTi+ zz6n0A@8AdcDflRUfk5qkF9{5S2u`S=AQ%V^LI_UPkRTKY4Z?u1Ae`Xz2@fKGh#(S( z45EOjAR34cVt|++7Kjc00C7NE5D&x$2|z-@19~I^i9r&O6eI)5K?;x(qynkIpCAoL z3(|q~AOpw3-}9U1=&D$kOSldxdabpk{jd^JebMfATP)#czBcipa3Wc3W0w> zVZmde6ahs+F;E)g%_?wymU?3O-27@7BC>REY3;tGU1Q-cM3I330G#CTM zf^lFxm;fe%NnkRVBKY&4sbCtI4rYLvU>2AS=770^KYf}9=7R-bAy_2%xE6yYU@2Gz zmV*^wrQk28Rtf&TX|>=Fl-7W?g1@&~2i6PztZ4(-2sVMuU<=p^wt?+n2iOUAf!%_) zz6b0D`@nv102~B|z+u6keH{Tu!7*?goB$`mDZ$Bd8k_-V!8vdqTmTorC2$#B5qt`+ zf@|P9xB+g0Ti`ahBlry71^2*x@BlmnkHBNWWveIPDR>5+gBRc>cm-aAH{dOJ2i}7Z z;3N11K7%jdEBFS!3$By-0e*sCAW-|?>jVZtKu{121P37mr$$H+3WNq>Kv)nCga;8o zL=Z{vK1T*oKvWP7L>F8LjR9hUSRgj|LvX1i4u}ilf%qT+NC*;v#2^VsD*V6x2P6k6 zKuVAbqy~S2G$1WVC%8PA9%KL+K_-w{@JY!6{sLJ+HjrKLKIZ^AK`xLRaqXXzD{J;JObOv1nUv*tUH_#pQ06hiA=>>X&KA*h1z)8WMn4JQr!5MHC zoCD{<1#l5u0+$7+^A&IvTm#p^4Z+8LQ}D6h61?-b1t-EC!O449@JDd>zbCL=!gCrAN3P>(E)1E?bt~(`2 z1yT!+{HNfbrvYg}I*=Y@02x6h!5hsCvVgxpR*+3_F(*4qa)6v57sw6r2u|?7L0*s# z44QzZpc!ZmT7Z_I6=)6G zfVQ9=Xb(Doj-V6hEVx5#7tj@S1KmLn&=d3my+I$)SMbLg{Xl;(01O0!z+f;03fiv*9xwpj4k zYfA)=*tS&g91zO{kJ!H)tN<$o&mgc0tOjcY&n>tXtOM(X6#-+EZ2%j=Cc%?xZ3bHe zPiwVR@a$UK1P@lW9qa%*1xMZ`c=(syf=6rFBRKM2!9U+8c($+of+HUgJdn#l!5cj! zcyg}8EIA^0IJKkTnBZ~MjtdTW0-O~5^HYL%<1{$KpUw*2=s9p6TmTorC2(2rwyuDy zg12>zb*>Bkruc^7uZ(YkTm0#^;4g^pfV+afGQKBx)}H(P>4D(cb{?|ik>HgdgC~MF z`jmB^3I4eFId~yB@=L*A&A$S#1@F%r@D{uS@4*M~5qtul!58oqd;{OX5AYNG0)aaI z-k-oA2nY&-f#4tn2nj-g&>##53&Mf$AcEi%7m+2A1kbw^S#Zin5uChH1%K8ZO>nA4 z7o5&91fP_cg6Ca|B{*_y!5^ppA^79;ID$Xkk1Ke5fOvu<#~1ua`mih<&S=MgIbN`g|LG$Arb2ik)Upd;u6I)g5ttKf}x1KmLn&=d3$e5AcWAJA9uk@gcjJt-9L^B?qPCFaDS5Hf+L?09OtCqU!4-%Pv*4X9wui5_hvaO zxSz~9!5cjg zVe||<2QR=&@Cv*JZ@^pd4!jrqh0zD_5qtul!58oqd;{OX5Aaj)d+-+s)amzFEqJ*2KR_H17sL}hvVDAz03;NW2E<7O5(^%zK8fHl>XQl{c0QTl zf#{P99{oOr;4$h`3Ld^bmEb||Q-ePR&nJ~em>FN&N-KEO`gDRvtxpd!2tLw`g141P z@E&Fsykl7eZ|g6?+sZ0vY0EAJBl>uczIZz%{02M(cP#OFSst7JG z{|BmqYM?r(0cwI;pf;!j>I$C1rXHvd8i0nN5oipWfTo}sXfAkk_ZFZfXa!n>HlQtN z2ik)UprhbAhfbg~=mNTeZlF8pA-JZZC+G!wgFc|I;BEC2T&>X`3;+YcAi+Rm@POHI7jfjOLGNJr8H0Qyi4<0X94RhUw;1=F% z;5xVgZh~9jHn;=sf_vb;;15F{fQR4_cnqEhZaaPoo`L7!1$ZgALH`wa4c>sa;2n4m zK7fzl6ZkB+FT@w{6?_BV!4JVF=5Jzy*#Rc&|e2@Sn1c^XmkOU+J z$v|?D0;B|~Kx*(ONCVP>bRa#*05XD1AT!7!xMlV)kQHPD*+CAF6XXK9K_2io$P4m; z{Gb3R2nvCJKw(e>6cyZ(UJMimB|u3~3X}$AKv}^p;N?Jh!EMJCKt;igV!A-{h zf-2xY!HwEgK{Zfa@ZhmEKuu5!)CP4xT~H6y2Ms_&&l{23Lrh;igu7E#H2QvgurZyAI0<#6r zP&Nn51@pjsus}E;FbnWPum~&$OTbdF3@isLz)G+RtOjeqTCfhR2OGdf!B3=3U^CbP zwt{V7JJ;?P4esDnWC3+AX0*Ap7a8&T!eGD82C%{Q?3Y-RKz*%q( zoEJQb(FJf3TmqND6>t??1J}U~a8q#2$t`dj+yQsNJ#Zg901v?<@K|td&lB(zJOj_c z3-A)W09x!^GtQm`bY;PDeu2_6X{HGle3@JI-01dra3 zR`BQz=>(77kY4a6G6;^GQSi7BnFL49EI4u&!J{|)B{*_c!I85G9&91I;K(@yN6slY zaxTGiU>~UqJq=8nBa6S zE;yY_2#!-yaO6@fDJ`@N9Z>(nlCmr*CpdC>!I3Knj$Dy-DhZBU8T<>Xu+D!hsVeyA z)dWYbE;w=x{!~-&{?rm2xwhaZe;rU4)C2WF1JDpO0*yfv&{S}au^DJCIPcd&a3-fE zXa!n>HlVHG+(kRkUhuQ71Lz1kfzF@{=nA@l?w|+gDR_L*UZA(&!Fl?CzMvoI4+aPx z_;er`1O^N4k2C}f1;fB_FanGOqrhk|28?AJyg+c| zg@XIZEE3#LX0hN7DoX_SlUXXbpUg7BT}_q??kBTCaF>;pg8Rv=65RP@wcyBW1V>&g zxWmjk!Tn^`3*OcSun}wmn+0!T3)m`n%EfJ9JJ=z3KE$1Z=S;wA+ z_k}nB4uV7AFgOB^f@9z~H~~%y?l^G@oEF@_5+3+|Wl0=yL59px2x4c-Xe zjkkg$zXR_DANvRJQScf3Bsh6L3+^ZLMQ~z%72Hqeo8Xi3UGV<=5Zq7Zr{I1vzXb1C zpsv4v9$0WcnIMAu$pjU=hrtB*lL;<3atOiu98&PEh7!C#p+OkI8x0G>f$$&#hzKHq z$RG-c3Ze- z-1wUcqy~S2G$1WV2hxKKAS1{mxD7fp$O8TXSwS|C9pnHxK`xM6a5Hxv@HfZ{@`3z< z+q(;Zf}jxiM{rYkVNe7V72HN&OmItjal!5HB?Pz8mlS-Yr3AOpmlhnbjNmrqi!uYo7zTjF1M}V3~)QvX)idJ+d*(Hx1-=(ZYRM%?<_cS z7r{U8Dmee#O>pGyg7eQk1m~Z73Xa@MaOB>Cf8IxMiv;(sSqzp4?l7}daBr4nf^V7Sg73ib{f1mA;e1>dLZ1mA<}1xMZ>IL=1FzuF}D?%pi8pUf7)&yB5u@8xZR zH@aQ$j_m+D!7i{H>;ZehKCmAg00+S#a9D7EfFs~2I0lY`6T<5RDt4U&rv&#{I1SDS z?#ysjaNqcIg8Rmw2N%Faa0y%%+}ZvLxGK2+{58S-=dTNoqiQ#92<|q26Wju~1^2PP z1MY%*;J)C<4+KYkC^+&X!9DyR3*PxBg17Zl@UNZ;{?&8A`}{)iMqdhL11cn62|)tz zTJSl21Kxsn;63;NK7vo+Gx!3&3hwCg4SWYbz)$cC1nTztSAjtg5EKLh!9fTR5`+Sw zK^PELaQ~KYAUud5xC>205D7#EQG^Qty<(z*XdpU>A-D%lOb|=(B^q0Br;$GdZ!3=A zS5jQTDHc!g)f->%t0aNofC&Zfd?LZub7H~I=Olukt4RevpOXoGJ|`Fad`=V6kX7(_GT8(V|B_wsC@VPx zk0+B;@OU!0KyHvn`2YAnf`^gG3-Spb^(8+jAb4n(f`YeI2>c^>Hwp{hXc179b&7%F zg71_Ppd=^-N`o?>EGP%cg9@Oc;B>A8DuaJP74RRZ3aWwXpa!TZ_!QI_M!6o|of=l!b1efR=3f{v;f=l#`S<(bF1q1PIH4whiC~i8ou3S*fT@COPNoU2IhiiF zo@9pLI+>Y*>ttpLu9KN9xK3t{;0lwug6m}F39gfwFF4==un;T~{Hw)a30Ml2f#qNY zSSbVv7~yJ_P&1LRS_rK|W6(9i$^fhtTyL{Zcpk9MdZA|kHn7e{;c>vqn*^`CS@5%W z3)l*_f$d-i*a>!l-Cz&cEBIl)PjJ`7{emCn2LwOf4}wGBu;BN_5y9OTj|%Secua6- z#p8lYKqtUS!LO22;50ZRxKMKzoCD_t=d~_?i-LPdUK0G4xh(jtcSZ2~>#E@Q*EMim za97D2f?rZM!7ag^Id2P2=R4poxCico2Z9soq2MEZBsk7v!H4ri@XkLK+>PxScrLi- z-V4F~{ay<0o%Kp^FSyr&JN3O0+_~$ma5spqjdz0k*S#0qJL?1ZD7XvOC-7NtU#u^J zH}O?)@5gU~JEVOFKLoG*Q*g%Y7YNk-_maRM2nZ@Trxy$a2O$J!`9ccL@`VzdKMW1R zfUqDO2oEBFh#(S(EI8*GMR1#DR1ghB2QffQ5DUZxe}Fh3uHffSJP;ow00{*@e-eSj zf}cN0KvKaqz{x;z!OyxBf*(yOK`M|M{0Y*4v>+WwFF0TZ!TX#MWD@+$%q)0Uvw*(@ zKmD?TY#_Vfea-=L3LYyjm*C7vZjeWCPUdfr7vux^1!tcM2+kuF1cd~T%l8i`Ec}1` zLr_$3)~FaL4oV0f&99{3-6$pa=cNUg=*xhzpd2U+}S@Sf{t( zFEaXozJljN><9XT0jx7n@DzuG1b?hC7z_bJ!7wl!i~u9SC@>m~0b{{9Fdj?*6Tu`f z8B76F!89-(%m6b5Pv$ra%m#A=f3P_h%mecU&knf&EEF7Pk>G?{43>bUg421K;K<7b zC*}&lKVK<$KFw8vH?dmq`C0?k3N8<>6I>o#FStCoL2!9+qu}!3Cc)*w&4SB=TLhN} zw+b!~ZWCM{+%7os4#AOkf?Z&@;9u<#ywSaaBkvQu_5Fgken4=I;z7YT^&xN=91#LV z)b)H690SL}3Bk{eli(CMEtC%U`5ACl@H6ThI1es>i{KKt46cBy;2O9NZh)KM7Pt-W z2r&Ylb$7u%a9?nK;{kXG9)ZW;iQxRkQ}7Ht2QR=&!FiHb;5B#y-hy}FJ@^1V3eFmR z0-puvwZ4F_;2Zc3ehAKD{RF=R2MpBXHv)qof-`SHK`;;;ga9E0=i)+v&>)Q9OjlSC zPH^5YJcs}yf=D2;;K)%xR1ghB7rcoWg7cy=K`am(`~l(!&Wpwc@j!f#Kyc)Qf-{qe zKw^*tBn8Ppa*zU~6r6)i1yT$CcIi)$Mra%GHB(xUPUsR=OVWc3!tj7~G79elkO^c4 zSp?U~`~|XtY#_VfEJO~$L-OVXxj=5gIift^Z;)5;Ch`fc?a9xQ0)i`x3W7r5A5d8E zuZjrXjiQ3nrx+*>N`R7rPf97l_h4yIM(}AW3(5(;B+3gel2;I1Ay83p@xPMb!hU7J zwFmzSu2`rdxDw+(!G-;*f@?FX39c}yF1T+`4Nw!*0<}RMP#4q#^+5yBP;jr#MxZfh zBDmX6Q_xIsug>P61!xIcf!2cGUu{5J!SBI#f?t2_K?nZS5p)8bK^MVq*sh?P;7xP~ zJwQ*;3-lKJhV3Kxo!b}m1N{Ym`7%K82NVOrAi*D)3>N%N#1Jr4@OK=;z;G}Ej1*j~ z7$vxzGFou?Vobm~F?4^860kz!31)%WU=EloxD+r?@QpTK@U|8RzMB>bE`uxri@_4XKVK@iRI&^#7o3${0ak)l zU^Q3+)`E3lJ=g#?f=ysE*aEhKZD2dt0d|62V7K7z4ST>|un+792f#sa2pk4Sz)`{Z z`D5TXH~~(AQ{Xf>1I~hT;Jo0n%mr`}TmqND6>t??1J}U~a8qzUnOlNSZCI(3aA5K!ize)y@gA^boNCi@ZKS3IhR&eBWf|D*i$N(~eOoCU=46=Z~ zSSKsU2C{=3AScKLa)UhJZ;%({1NlJ#P!JRX|A4}v2q+4Qf#RS9C<#h|(x40|3(A4= zpaQ4}DuK$v|Hpp@Rlt9sDySy-om(B$05w4^!LQ@mg5TYBKwVG|)CUa&??yw=2s8#w zKvTh)fo7mNXaQP+R-iR#1KJAS)pnr0;KxM=&=GV3ok17S6?6mLK@ZRq^a8y>AJ7-{ z1O34OFc1s^g9Se!hk&7A7#I#lfRTcqY@@(vFb0ej{D2(?#)Ao9BA5gwgDGGtm%e-j zL2xt5MzBe6gVAQNMR0r5R>93o+XOf3Y!}=DwL@@A)=t6gM7spH3hfr$K(j}11I=Er zPjIWye!)!%2Lv}#90Z31w{aW>M+7%*92MNOaZGTd$#KCwUQV#&q~Lxsrvz`}wBSvg z5ghrf;9s2+9QnN9$QJ}hz9_h#%q7A7WG)LXZCwFZ!8LFl+yFPhEpQv$0e1!GZSH~l z-~o6D9)ZW;33v*gf#-s=PcOhr@Cv*JZ@^pd4!j2+z(>J(^-til;6{Njf*TILf^XnE z_#rsY{}cQIfqMP^Q(zDT1O>rBa1a871ff7^5C((=;Xrs00Yn6mKx7a_@JvHdSrQFI z2QffQ5DUcqA5HfdrZ*FYVYp4P#nyJW-rBZp+ithEZQHi(?$)+#+wOPI^Y!|79+PA; znat#UlX)@$aRs|4ibqO(!Ky9+DG5nQL`q`8ZnFFYyM0R{*iBYa!JeEX6YT6H7wn{@ z5bViGO2KxTO0ZEpe~=oa0ck-xkRD_J89^qHS+K8cX8~D3Hjo|U069S}kQ?Lyc?Ii( z`9OY902Bm;Kw(e>6a~dValxL+lo0HhOi96>$&?c8nM`THp2?IE?3qki!Jf&K6YQBx zdBI9pL9k~s6+tD|sSK(Jw$rMh8mKNHcV9;h!^2^)Zhf)&0I zXe|66{{xx|b`;G(bI<~`1g$`8&<3;x?F2j0_JUoJ0ze1Q5p)8bK^M>!bOYT%55evk zdxBn|H|PWU3U7{Nkq$AWQS zJeVL@6z)VY2}}l41dI5c3Z@Abt2Q0X05icXFk7%<%n@u~b6GSG%m*8m#R~R5aZunlYnJHSq`O9&rDIqwF0z+SKq><57$2pj+h!6Biu%lR-k0*-=X;J8rB zt$YHU1gF4ha7GAnE1w1Dz1Tm+ZEWpD*t1=j?tjqBhBxCw57+kze79dH-i1NXrL zAzd7m`5|}&9)l;~DR>5+gBRc>cm-aAH{h*M!tL}ODep=706q#+-8!F0`Ao_ep|@M~ zRe0#|4SW|Y=O2O{*H7>Z{04u(Ul45h|1(^9!GR~Z>8HF9Af(`Co$^8nZn7yaG>d#l z2_v|fvb?Y$oDfFu0(;?sFNgplf=D1ThytR5Xdt?9IJk0-0b+t!AU22t;(~Y}K1cu( zfLeQjiQJ2Pr^GkP7&N)F2H=3(|q~AOpw zHlQtN2ik)G&;fJ=oj_;M1#|`7KzGnX$Q?=zpeN`BdV@Zoui*Y{d;LIvFaQh$gM=J< zzrY&|hJc}97#I#lfRSJn7!AeEZDHx`Too{}U=!F3 zwg^_{tzetrCIa%dgB@U}5TMzIyj@^7*dvT|i}ng`@*;1a-~wH|{UA_quc3KC-~c!% zxOdIGL*Ott0*-=Xf_skS9S0}CNpMPV5x?GPa0Z+e+%qEY95^qyXHDJ(!QD-G7r`ZP z8C(HZ!8LFl+yFPhEy2yd;oSyzz+G@paI?O6_rU}3kaZq`$AX(l!+S!?Q^C!f;XM=F zoFU$G!ObV*y$~$tmx68eN^tXUc&`OFHHY^`aC3%uZ-qS$??`zMK7fzl6Zj0ifUn>i z_zr#uR*awE7x)eSfWLy97{m*<;@?)mfd@i>kb(;U^Fo2pzz2j8Tu7J~7K8)gfiH+4 zxVSGbqTnLRyhtpHEV!^SFN)xz#k{D3ix%^u2`*O6i!Qi`GB1YUV%5Buf{QxyVhL8% z*n*WO4u}ilf%qT+NC*;v#J~?E5rX?_Ur7ZQFykc?TnvntT)5$oLU6$_UP>XA0%p8a z!UhL_A)ebjwXn>slSXi1HeOo6a!v=*gA5=e$OJNjEFde$2C@sq+}?8tfo@+pg=sD& zm(ai=xA4>eML{u8T(FB?31OGJFqRbT z3Rw!27VPR*hLp0x2X`4PC+u-3FD!JMR}dDtl!}7oTuHE;D+_*ZQ5C_*p{ii{R1@4h zZ(em!L$ICJ6s$b8Ky6S*aP!4^bxElw*!8)-V0Xt2Kto}6Z9DY!TpZ7Od6H z5v(1~6|6na6Rg$E2MYvi&kF@>&x=S|43-Ek&cRy>mVxD9h2Wl#c`Lyxuo|oZYr#6f z?swLM4Pc{S_dA=wX2I@>wt%f*8`utZ2<`*8-cGO!>=rENJz%e3_h0)2yCd5#Siu4X z_gP^t2pkaH$2+`(g8OiZcSvv_0r3tC?qed}5n-51IV!mCdU(eK_e~S;xZpm&;++uO zH($Jyg8M#*cS^9FPYagw8NqTsE4Z(>c;^Jm`Mh8`Ul7i@MHdCj`I2BcUluIqE5c`Y zcCHF8PR6??6aK zEx2J^?~UL_fxWka8#eXc32ui}x1gy4cbypV#6 z=6Y^Ex6zl&qr{PDqa}DuFqjXIKi&`;eoGUSM><26OoiiATo#oq6*eiqJiij zhG0D1Rx0=Zcy z56BDh3AWSxpa3Wc3JI2TVNe7VWu0Q6I4Hq7B|#}r8k7<2xXOZZpuEs2w5qNGs0b>7 z%Ag9U3aWwXpa!TZ)O0!50=0$7K1!(r>IzX@Nw`@| zQ^Cb+dCdgtgUto&RxJeUgDnN?gRKPXgRKSYgKY%sux$l5pzpO4+!P;Pd%+FpdjX&W z=mR#oZ?Snp1YD}YGFt@em0N`|uJLaZ0v)ys)*W^T)^~OaX{EIR^?o-Bv+@^{)fMT96ZfA-Fgh@1$Ve>XhK(WW3XYb*nRii<9xr3NB8@J14lXAMZT404{<{;4-)Zt_m(5 z$-5@FSR?N`xFNU~y}g^@7Pt-WfV<$HVCA__$^*f@RPH?#hB!PTub<$TV9)e^gFoOe2)63qI>CV_9Chs{1PCeIcPXKSpAMmgvS9=tA%jC0 zA%;U(VSz(9p}9kNVX%X*V1Jt_lkpM>E>6ZvELetqf_uZrOCnf4NrfgZ zB^m1^2PuTUZc$3%yhAF%MGblWtdm->@su1E-u9@ zB)BLPudv|aNxUM03pMeI3N8x8D<-%&8Lzlt&xA_|E>6ZPDOf(GKxt40lm+Dk%eg$L z04jn?pt9iJru3=^?&U|Xs^H#L^r{K&)k3ej;NArEY6$KvEw85FUf}X-3GTf=ueRV` z^785k?p;N%F6-12+{D%}ROWl=l9Hg69CKnKtfbP{Y(yR%@s=ptCoU0KwPMcqLU!FJIT^b%~0 zzPDfl@qGjvn(r&vsC_@7ksH46FC2FmAgp&7DA?%#Ai*{tEJSvTh6whYWT;>d8;616 zV1!^#PDX-JU^MHD0b>PwUN=q{=Nk5S!ObV*O%MvYl!?L&moiDP-ZWWo^T~Kqgsl!! z1?wr(1UC<`H(luBHlHEb82wBz3(N*{z+5m7%m)j=La+!d21~$Funa5*E5J&y3akce zz*?{ltOpywMz9HN23x>ZunlYnJHSq`3+x7az+SKq><57$2pj+h!69%M905ncF>oB5 z04KpIa2lKeXTdpe9$Wwy!6k4RTme_XHECVlLV%DU6bLQYu%HhJ1HyuEAUyB|5kN!`2}BlboG}WB3ZjANAO?sDVu9Eo4u~sQ znd5=@AOT1S5`o0P4YWCWQ&W{?GB1=&D$ zkOSlttTu9i+#nCg3-W>dpa3Wc3W36c4gMAZML{u89FzbhK`BrglmTT0D|0ze9#jAo zK_yTbQ~^~%HBeo!daeO#f?A+9r~~SPdV-B^*9Q$iL)K{o8iOXFDQG6xsC0AC0<;9J zKx@HjqYY>a+JW{U0CWHyK_}1|bP=o%b_Lx)chCd$1ie6S&qgVz2}(1;?P4eh?^FwFH3!;2=08SS-Y0a0DC$$G~xL z0-OY=z-e$su#k+i;2by)E`W=I1$$fqm%$Zq6?4tf;>Qi<9{ySe(pX!FCaB&A;Oc4m=P7gan~LXy60FfUqE( zUd5kwN~a3X^!AS#Fkq6>B|Vt|++7KjbvfVdzYhz}Bggo0I6BEcF-V&Dgo zfTV)eb27o|Ik{l9nnJL8PAS+)NhMf}kUvNb(g+p^lvc19p>%=;=cET21dH3r2r>z_ zRc66Lak7A{AREXIa)6v57sw6rfV_gmBjppUVEI7-P!JRXg+UQe6chu+1q(VVK}tzb z3X~Qs9;u9AaaLtPIZz%{02Kw>suHLSs(`AX8mJCx2o~~G6Vw8=1uI4!P#4q#^+5yB z5HtdfK@-qaurfCT%|Q#$Qm}K;O0W{P25kguEp0(N&|a{(uK>_Nu!htTbYf9wQo4Yy zpd088dI;8@dxBn|H|PWUf_|Vs7yt%>L4qCWU@!y>1;fB_FanGOqrhk|MzAuE1>?YY zFab;ilfYy!1xy9gz;rMJ%mlN*Y%mAR1@pjsut2bGz7Q+|i@_4G6f6VF1&ifd0ak)l zf`uKf25Z1tunw#T8^A`e32X*i1l#FWuuZU|*ba7poq}Boc7fes57-O#3DyVqgFp}j z4uFH;5I78ufTQ3TI1WyLli(CM4bFhG;2by)E`W>R61WVmfUDpdxDIZBo8T6>4eo%u z;2yXS9)O475qJ!qfT!RYcn)5Gm*5q64c>sa;GJLrvG2hL@DY3hpTQUK6?_BV!4JV2 z(ogUU{04u(U%?uZn{LYx9C#oE2q{?9YbX#J_<%4VEC>g}178pUL}t40167W(?XyyC<2Ot zVxTxE0ZM{WptN8uvkWK;%7OBr0;mWofy$r?s4CbmY&B3F)BrU>El?ZO0d+w=P+zbz zHvkPmBhVN$0ZlXY?Ed~4SZUtI{HlQtN2ik)G&;fJ=odoMCok17S6?6mLK@ZRq z^b#!Qzc=V3SgY#``hosn02l}cfx&{ErXi#Z1;YfZ=iy)k7zsv!(O?W13&w%*V1i(O z^(TT!g0=9;U<#NDrU~|oKOM{vti#R(vjn@2%?5M8Trf|tf2Z>W`{TNRl!agsSj;+0 z1p9Zf6f6VF!3x2CcUFQ`V6|XPYmH#n`L%*wThAOr{rLJ8JW zLIWQV280FSKzQH_B7le>5{L|k zATjU*NkCGN3?v6BKuVAb_=D6S4M+>pf%G5)$S7DWRwj@cWC2-0Hjo|U069S}kXx|e zt~`Q8aODO0Kz>jF6aRaCHOv0|V&C;>_ec3h=MDGka97D!f>lyaav zizVkTpK4>6VnHz#eps`@p+XOTP%|LU| z0<;9JKx@zjv=wZp?Ld1F06Ktm~0b{{9Fdj?*6Tu`f8B7r@;BzXN2Br%&U6{lSFcZuY z++2CyY{3Fh=YY9jo?t0TLlZg-3GRU9bhNe1$Kiyg2lM*1^d8$5D0<< z3#>f=4uV7Au;4yo4eo%u;2yXS9)O47k&wfMCO!sFz*F!HJO?kpOYjQ325-Py@D98O zAHYZO348`$z*q1MdqaB7-O(Du@Q63q#!biXm7rVzMZfV6QpE25~@K5D&x$2|z-S2qYG)ZTJZn z+)k5#q=M}|8AuLNfRrE=@CT^{JBl=dl{qa)2hxKKAS1{GGJ`B2t6&AoMoM;&1LOp` zKyHvnu!7|U`9OY902Bm;Kw(e>6cu*3sw*bUb0`ipd088dVrpw7w8T8fWDv~=nn>ffnX3A42FQAU>FzcYXW`LPs7MKm@fVp5Em=6|!gbUU>R5rR)CdY z6<7_{2=-reEm#NEgAHIK*aS9%Enq9y2DXD8U?R61WVmfUDpdxDIZBo8T6>4eo%u;2yXS9)O47 z5qJ!qfT!RYcn)5Gm*5q64c>sa;2n4mK7fzl6Zj0ifUn>i_zr%6pWqkx4gP??AlQa~ zZ9X{gKnM^LgaV;~4+sOof^Z-_@C6Y-L=Xu?7VH&|C?G0`2BL!)ASQ?fVuLs!E{F%> zg9IQUNCXlCKad0@1<62ikOHIxsenI74bp(LARR~#GJuRA6UYp*fUF=J$PRLVoFEs- z4f24zARovN3V?#35GV|afTExnC=N;p_S#NKPzsa=Wk6X_4wMHKKt)gqR0dT*RZtC7 z2Q@%VPz%%sbwFKE57Y+@Kts?7GzLvTQ_u`F2Q5HL&bU zV3}YMiOazXuoA2Ss|BmNHDE1R2iAiPf<<+11e*klP2CK(fURH~*ba7ponV(>!IQhe z9X|058ES!6uP- z4c>sa;2n4mK7fzl6Zj0i2sRnTSMUvd2S311@C*C~f52Z5Y~#N zfG{8|2q*kM{}1p55kN!`2}A}_Kvcozi;D)L3pR0F3=k8<5^Nfx*dPvw3*v$Jg3UXZ z03;M_lDb47G4KOPKvIwlBnK%#N{~vhg875gAPqQSH zY#_T}N16lVWKk}`CS}SE@_@X8`%y3CV|Od3YZF}f$3ldm zOTjX*9IOB;ZehKCmAIf*^1J z90Z5JVQ>T-1;@Z~Z~~kJr@(1&2Al=wz%utC6!;1akDu7IoH8n_N_fScf!V8ds( z!5zVdU+;o@;68XD*y!y;@JO(s!^hx>U?Y!D!87n2yZ|o+8<=|qUV}H_tzgagonU2t z4?cj8;1l=^z6e&ruY!#oe*@nI8-D#E*s=cvzXUtd-{24UE7$=B+w>2?fd@i>kb=$D z5(w>(t>m#J;(qu zf=nPY$O5v0Y#=+x0dj&|AUDVZ@`8LIKPUhSfYxUw32K4bpbn@D>Vf*80cZ#sfyST-XbPHv=AZ>=DcBp$ ztw3wg2DAn3Kzk4XI)IL#lVER-cLrTRSI`Y~2R%Sf&3-OutTug*a>!l-Cz&c3-*EiAP@wB1A@Jwe-Io3hrtnW6dVJ`!3l5@oD!@Lo(5;Y zS#S=V2N%Faa0y%nR|M;WSHU%K9ozsn!7Xqb+yQsNJ;D0meeeK01dqUD@B};s&%kr= zLa;vg61)Ph!5i=vyaVsS2k;Sm5^N@f&)^IA3ci8w;0O2#eu3ZMk6^9tF9^2zUrKP` zfe;`h2n9j|9}q^cJ{T5+1L1)$hyWsjNFXwZ0-_4m2cv=LAO?sDVu9Eo4u}ilf%t;W z9gzSe1c^Xm;0Ka`q#zkc4pIo#2UCJnz#pUrX+T<#4x|SeKt{p(U?z|mWC2-0Hjo|U z069S}kXx`mm6cwxw76ZjW2~ZN00;NG2P!^N}ELb0G0-AzmpgCv(T7p)fHE09c z3f2ePf%YH(bO0SeC(s#m0bM~i!TMl#&;#@Yy+Ci!2lNH~Kz}d*31;fB_ zFanGOqXg@Nqrn(37K{Vq!2~c7Oaha^6v6u7R4@%p2Q$D-Fbm8EbHH3M56l;=`7IEv z?<^FosV@@j*I}_>4QYw+|NkGsPSY~Mu58N%tArJT<+Bp30;|CquokQX>%j)F5o{8y zHa3GTU@O=LwhLC~9fBR;POuB?273fMuDxI%*bf3hkYG6<00+S#a2OmB+Plv`9RRiB8^{iFfSe$gV8zG{@_@V`AILA*cy|F%5EKH1K@m_C6a&RU z2~bk7VfRv?G$;egf^widr~oR0N}#e}Q#n-uRY5gS9n=6dK`l^Qu$E8<)D!l-Cz&c3-*EiAW*P|6a)@{gWwQ2432=K z;21a#P6*aEPJ&b5G&lp!f^*;m%is#Q3a)|cf>qrOa1-1Dx4|93YU3`r z2kwIh;GtmM>JfMho`9#|nP6?>Id}nHf>+=*cmv*oci=tvAXu3{f=}Qx_yWFyZ{R!l z0e*sC;5YaK{(@jz|Lr|E@IVL<5`+Sw1?z)8APfi#!h!I>7eoLNK_n1au-b?MqJn53 zI*0*cf>kATjU*NkCGNOtAS1l7kc=B}fJQL28f&qy_0fdco#7 z$pA8fOdvDJ0K9C<200luIP*||}WQu^Ipcp6)N`R7} z6etbKfU<(kFjEec2Ngg?Pzh89RX|lx4OACwc9a^RCa48!gF2uts0ZqU2B4u}vo|yX zjX@L86f^_PK?~3lv;wUKoBW{-Xbakb_83_QY(AN;pd088dVrpw7w8T8 zfWDxgVDriJ2Lr%BFbE6=L%>il3=9V&1nVgy!6+~qi~(c8I4~Ye029F^Fd0k%Q^7Pa z9n1hT!7MNv%mH)3JTMOTjX*9IOB;wBjAP52nz(H_GusLuJgCpQ5I0lY`6W}B`1x|xA zg0;G{;GAIfa~@m(7r`ZP8C(HZ!8O5Z<2twjZh~9jHn;=sf_vaTcp%ukJrBVn@K~@} zr=F1V6g&gZ!3*#byb|np@HKb?-hy}FJ@^1Vf=}Qx_##-rz6w_OZ{RzNevtAL`~tth zAMjVO41;a^H`P^e;DHbzBnSmU10N6ugazRQn-(cN@C6Y-L=Xu?22ns%5Di2ZtUbp7 zF+nU48^i%|K|By2BmfBoo8c-ENDTZy5|9)m1Ia-OkP@U4Y^p1NkQ$@`X+b)W9%KL+ zK_-w{u%40yWChtkc927`zYsY=F2NdYZo&QoVf*80cZ#sfyST-XbPHv=AZ>=30i^HpbcmX+JW|heU3Z;bO0SeC(s#m0bM~i z&>i#;ta^KbUZ6MV1NsV9jDDcMU==<93W z-@!OA9!vle!6YylOaW8DG{HU=KOM{fGr=q{8_WT71*@NVU_MwN*mvX?f<=P0@Wo(> zV4u8SD)_q3*)Idj!3wYvtP(8e)nJWaIjh2H^p!98#vJP@o_ zAA(2VF?b@_Ti8#*Gw>X|058ES@EW`UZ^1huz#Z~?@Bw@TpTK9q8p#*%6?_BV!4JXO z*iY~a{04u(Ul45jzpa7;4}<_A1wU8jP#`q$5v(%9fUqDO2oHQg1Q1cMdX5AlgD4;> zhz6pA7$7Ey1!49>f_xx9C;$qALZC1x0*ZoSpg1T2 zN`g|LG$;egf^widr~oR0N}w{R0;+;)pgO1lYJyszHmC#Yf_k7nXdu|-v>|8&8iOXF zsbH7EW`bQRo0HN4v=kP(KG;gIhTR&p0c}A$!7c^uK>+9=SYPf4ItkW=JA*EuE9eHg z3qGzGJp}7AJwY$f8}t$EoyWeQpJ4BV_6GyNKrl$K7ZL}9Az-Lr84d%(!3Z!Ci~^&< z7%&!$1LMI2!Adw0Oaha^6fhM`6RgbB1uNkUFq1{Iz-%xF%mwqne6Rp41dG68utcz( zE(Oa3JBsCCgn#Dc7UB= z7uXHW8gSA0ZxKbg4NGya0Z+O=fHVz0bB%^z-4en zuyb)0Tm#p^4R90O0=K~(a2MPY>^c8^@BlmnkHBNW9#%gAPX&9x^$a`*FThLi3cLny zz+3PRyayk^NAO9oJNnPy3-}7Yf$xIdr2i1?p86*#zXThJ_znIDc7T6DupR$Wf&&kP z03ij-ITQ#Dd_Wk%o^ON&;RJiI5FYrlC<2HGB7w*t3WzFL3{^A`9mD`JK`am(!~t7P_6_ZAxH!g13!=iBn8Ppa*#r}?BeTEf>gjCqy}j~T96K;2N^&{kO^c4SwL2h z4P*y7Ku(YgtYJ)nUE~qD1G3tW` zg1;+jL(m8`7VMClfTp0CVEHr$Erh`?pO!*#hgL#!ht{AC>$DXrxN2z!+JgYWa_#^+ zf=-|_=mNTeZo*rab9c}K^aQ;G+eL3u`jFBW^aK6D0Aak#c_0`B27@7BC>REYgArgP z7$w*#7!AgNv0xk+FH~^Fm;fdUR`Zj1Tm+ZEWpD*t1=qlJ za0A=~x4><1M|kU+@m+8a+y@T?YrPM_Bf)CpF?a%=f@k14cmZC5SKu{xBjk4TB)!Nw-Cf$Sg$$O&?R+#nCg z3-W>df{jfS00luIP#6>eML{u89Fzbh1sj_v1xkZ5pe!f{%7Y4^BB%r^3pTh=1ylvq zKy^?9)C9FaZBPf)6>J2d9;go*fQFzEXbhTwrl1*U4q6CBV(9|X60`!XK^xE(v;*xy z0O%lCAM6M^fzF@{=nA?CcHX;#9-t@aC0I}C4f=q-pdaWjSQ8xp27*C?ov*=Q2p9^6 zf#HG;*^B@q1?wrJz-Ylv(-<%oj059^mad*B2zDiz2quBaU<#Nj*x8vTSnHh*W`LPs z7MKm@fVp5Em=6|!gi{O$FERq`AWpD*t1=j?dd+j>70d9g@;IFF2i}7Z;3N11K7%jdEBFS!gCF20_$62!{sw=*Ul459 zzjcBG4}<_AK`0PfnBfk`2ZRA(K{yZ|_<{%^B8UVcgD4;>hz6ny{oLMTfS4c_hz;U^ zxI$^SRXh+MBoH>aMF~M7kQn%ZB*HIu1D+Hl6PmislYA0PvDr8i0m^)pH}z7&HM*K{L=Cv;ZwZE8&GJYHQ(~LmSW*v;*xy0O$ZZ z3T<8CJAuxii(vKK6?6mLg`94y9-t@a1$u)%pfBhr>~fp;2Lr%B!J5q=Fc=I0L%}dG zT(H_0AuMn?j|8K@XfOth1>?YYFab;ilLXtvWH1Fx1=GNEFayj4v%qXHNBA5}Wu6P> zf%#woSST!UD=z|z!4j|(EEDPl*UHPm3a}Ea0;|CquokQnlDM6&2OEUyE@dOw1U7>$ zU@O=rSb4USvP0Ewf&&kP03ksr5E}S^Fd!@lC)foxJn#h(KtvD;L4!~(HF91s`81MxuukWjFTa3YWx_<l|M)= z*l%tc!44-aNC(n`41!&RGlEQl{YYgN>=!l*$O^K7>>vlo337qlAP>kZ40FFJ`9OY9 z02Bm;1p5IhEZA`s0YyPEP+YLWmjERNtDjP!G$;egf^widr~oPoR*XuZGN=Nof@*?Q zU3E|c)C9FaZNW}K9Z(n41NA`z&=52NjX@L8RIpap3^WHVKugdHv<7WJThI=)7wiB7 zKnKtfbON107tj@S1KmLnp|WcmJwY$f8}tEv1-lgV1O34OFc1t9to;lIL%>il3=9{n zA&med!6-0Vu>Y%L1Z&S@!8pOX-gqzpOazkzEBs_I1xyue@6!a!XF8YxW`bE@HkbqE zf_Y#*SRl-C*SdvZ5m*eCfTds=ST0!MSAdm*6?K(h|3z1WHDE1R2iAiPU?bQhBy=rd zvtYLaTLkNaTfsKLdiQp)1MCF51p8~f8|(plS!bVMeQ-Yr1VP{cI0z1b!{7)w3XTcZ z2akgj;3PN&PJ=VxEI0?wgA0Q7!HeJ$xD2j7vLp$1zv+U;4OG3SgU&vK7fzl6Zj0ifUklzl5gNU_#xOC z{0V-6-{24U3xe(Ww^eZ9fe;|1V68V42n~Ed7!VeO1L1)$hyWrARvVE(WDo^J1<^os z5Cg;nu|RCWdP*D+7sLbcK?0BvBm#+nA4md{f@B~$NC8rURKOpk25CTA!Tvv|1L;8q zkP&18nL!qi6=Vb11-p;S0dj&|AUDVZ@`8LIKPUhS3PJ9lc_C036ahs+F~R<;7Y8Lk zNl*%u7VJKy3@8iAf%2dNs0b>7%Ag9UDp+k)1JywdP!rSwwLu+F7t{mw1-o5p02+cu zpfP9ynu2DaIcNb|3O8Lnw*sv}8_*WC1MNWo=m0u`PJ-Qpb_QKQSI`Y~2R%Sf&kImU{$KzY2nK<{U&m z)_}EOonXCtJ=g#?3U;yDBv?P)47LbX;akBrupR6Wte$s*U0^rZBiJtX3f5uwf&Cy5 z1c3wKAUFgLgCl~K@F+M2j)N26Bse8lA3P1t2>$Mzo(1OwJIm(+=* zcmv*oci=tv06v0GLayYh)z9Dy_zJ#(@8Adc34Vd!;E#|rg>wE2g6;j65*&CS1PBR2 zfzZGQgb~`gGKU4>KzQH_B7le>5{L|7dQJcm zfLeQjiQJ2PuSwuFNSxD&P-NgET@Sw{lvL4x|SeKt|!MTR9WR46=Z%AREXI za)6v57sxGGG4g=CARovN3V?#35GV|afTBWJ*XoLa;-Ca52}%ieQc8m|pe!f{$_tlW zZBzgiK_yTbQ~^~%HBcSY05t{cDYZatPzTfn^+0{l05k-RKx5DZGzHB-bI<~`1g$`8 z&<3;>tm@i<_83_AT|qa{9rOS_K`+o7^Z|WAKhPfx00Y4wFc=I0Lj`L{ z!@zLCy2A)C5{v?)!5Acd6U+j$1#7f(z+5m-us%2+ zEC36^BCr@N0ZYL$upF!aE5RzT8ms|p!8))WYycaM?i%o`PrKxscSY z`~tiLufS{YMzAyZ7Q6%R!3XdWd;*`r7w{E)6OJZTF}{Nz;3xP6euF>YF9^2pUp~Qs z2SR|5AQT7El?ZO0d)ln;;jejg9e}>XapLACc>$hYKKihGteBg z5G-)CrQqvUZpEV3ENUazk+v1A!rKXUn%WC?$N_@o(?PJEb|j^fU^#aNT|igCa_%Nr z&fP%|7WEWt^In4OqBrOR`htF-KNtW8fB_!U?m&_#)5Hz zm3cgvAhdP$JP}L+lfe|hLae8PX@Z4MPZunVb_SRUW`WsY4wx%g3Fm?NU;$VN77147 z#iT3&O9iWhWrCfr;$_6 zdkbkd*aP;0ePBNb6znb0AaDR21c$(3a0DC$$G~xLLa-MAPl8k6v|z6mo&jgUIdC3a z02jd}!H)DYxB{+%Yv4M#0d9g@;5N7;Sefq%i(QcFJz>0iBkaClubn;s55Xhw7(5Z| zd_5KHNS_Hdy7U~p058ES@EW`UZ^1k89()jNNb4i`1U`c=;4AnBz6&7eoLNK_n1au+h>eAS#FkqJtP9 zCWr-MgE$~AhzH_>1RxVkTpK4<_M3f2c3305tQK@-pv zGy}~+3(yj@0<8rLYiR@8f_9)i2oS7WbpRa&D^DlT8FUdWkfST;2D*bD!vFCi{KKtELf=96>t??6D(HkI=BIDf?I-Z zejD5Ycfmcut`hgb1HtO&A$SBHgD2oAcm|#ecBy;;UV>MG#mT$|Z@^o@y5~Fa9()k& z3i%Oy0-wPb!J5`r@C|$iKfq7$3;Y)Bg7yde6>O)$0{_LT1qU7o0YZXMf_1CVzz2i@ zVL>>-T3vYH3nGAsAQFfSqJXF%8i+2~Gnp75CWr-MgE)fC;1n0c1MxuukWjFh{}X}4 zzz-x5Y(}Z1AQ?ywQh<~ol`t*5{)hVu_Sh#iNCVP>bRa#*05XD1g3aWd8Ds%jK{mmr zbj~i=j8Zv3PLK=a26;eU!KyBwV27L^6cFqv3W7p{O)XUz6cKFNsG^{lVAE?CXPpwD zBq#++gEF8jCYxUw32K4bf>lBtP#4q#^#z*+ ztASv1;fB_FanGOqrhk| z28;#cz<4kLOcZPe%Sm7|m;$B>Hecm5FdfVQGX|&Ibzwo4Ir$ zSR`1%77MobC4$Y-x)dxEY);GNV1;1QX08OQz-q7ttOe`9dawa(1e?HSutl))Yz5oE zcCZ8N1iJ(~(%oQ>U`MeR>;wBjAP52nz(H^b90o@OE8$UaOt8Hl2PeQua0;9TXTVu- z4x9%Uz(sHgTn1ObRd5Yl2RFb?a7(axFK>f8;4Zia?t=&5A$SBHgD2oAcm|$>7vLp$ z1zv+U;4OG3*gTx?!3XdWd;*`r7r|zp{0hE-@8E}EbAJ8=zrb(s2mA%Wg8pq49C#oE z2nj-g(7*?T0bxNn5FYq~2p}Se1R{edAS#FkqJtP9CWs|;j-tOAv4yb?aX?%U55xxv zKthlRBnEyUiD0cRDM$vAgA^boNCo^sYQfHF8jw~9a%D~j(t`{jBgh0YgDfB`$Of_t zHos^NkQ3wrxj`O~7vvMHR`Y`bprBy&TnH2fMLi#uJwY$f8}t#Zh4%&hKz}d*3 z1;YgEgTuiHFcORcqrn(37K{Vq!2~c7Oaha^6fhM`1Jl6_FcZuIv%wrN7t90m!2+-l zECP$c62U?;mI@Zgu?#E+D_CbGSOr#tHDE1RCtPqrBkREiun}wmo52>a6>J0B!4AR7 zyc6sKy9EoO*#q{1ePBNb1VP|{5Y`2#926{I=8*8p9mQe6c6tOH1;@Z~Z~~kJrv$5w z)8Gs^3(kS_-~zY^E`iJ7ieM$Y3a)|cg4M`z$%%#KzaX?&QxGP~i5MPMzQWAiK zAQ4Cm{Dd#AEX9p1Urhfq@*JyJt-N4iZ17jg3Tk8 z31kLYKvs|qWCuAwPLNBmsfuz7Hg{GYkQd|w`9T3t5EKH1K@m_?ure0|#X$*B5|jd^ zK^agMlmq33ZEk*~3ZNpW1S*3npem>as)HJ!rjRqTa;^nxgF2uts3#0^#i$P&fQFzE zXe^v_D>ng6K{L=Cv;ZwZE6^IW0c{1V=XRhy2ml>GN6-m$23ev7lSvorhb?lXIK zAQ%J&gCSrj7$#Wr8xBT*kzf=U4aR`6U>q0^`~=GqHUap9iC_|#45omoU>cYXW(byg zYbKZlW`j9`<+z&*=7ITOfnXWQ77CW;D*!A4i@_4G6a<20U^!R;R)ST6m1i|r1J;6d zU_ICXHiAuHGuR?nYP+pq8`utZfSq6$*bVjwcK+E5g1|no9~=M&!69%M905ncF>qY4 zBX|Ow1gF4ha0Z+O=fHVz0R#(H&lkZZa2Z?yA>b;w2Cjn};3l{QZi74EF1QEog9qRt zcmy5`mj3PucnY3@=imi+30{HMf~8@61KxsA@J_H^`5t@#AHgT^8GHd>!8gHL%Xjbt z`~<(iZ^2HCf52bClK6!=@(*D_IKj?H;Xwot5kvwWATo#|SY%HS6+{EkK@1QR!~(HF z91s`8170A$V0|zFNC*;v#2^Vs3X*~3AO-Li?3nt1l)x9H0;xe7kQSr^=|KjNQLxis zCXg9q0a-ydkR9XzIYBO=o%@B&4f24zARovN3V?#35GV|a2=+r?6chu+K?zV2lmewe z8Bi9K6Bf8Kmj@Lff%c#S=mq0^{J;d@4<>?1LJe2u$zTeY z3Z{YSU@Ag9TtA2mp(~Vz2}(6|6l6f@NSiSOHdoRbaIc=yrJx zSSwg1tP`wltOpywMz9HN23x>ZunlYnI|Ms#>;${OZmrz=5CKF4kp!y^4-gqd0iGZ#hz6pA7$7EyC0N^t z4dQ^fARh1n@j(KR5F`SLK@yM@Bm>Do3g8WVKuX{XQVG`TQiC)gEl3B_gA5=e$OJNj zEFde$2C{=3AScKLa)UgAo#OI>e1iSL<_85pK~M-321P(oPz)3YB|u3~3X}$AKv_@@ zlm`_+MNmnwR#zER0aZaYP#x3&H9;*<8`J@HK|N3(Gyn}jBhVN$0ZlDd8_6Ymj!h1mw*a!B51K=Py1P+5E;Hc0ek|G}i$H573 z5}X33!5LwNTm39J2hI!i+^h>A7+eIGz-4d+gn+By8n`Z4nQwrb;1;+I?tr`C9=H!4 zfQN#=EAu1p7(4+_!87n2yZ|r3EASe;0dGMlcn98t58xyC1U`c=f*pdd;2Zc3et@6g z7x)eSfWIKju>@gad#E9>f_xx9C;$qALV_K^!k`E!3W|Z^padu>tapd0lwkW_ z8k7NLK{-$!R1mD6Rs@wmWl#lF1=WOu?g&-~H3Tb0O~Hy$3)E&-9j4S}N)N1Jl6_FcZuY>@V!uU=ElI=7ITO0ayqEz#?Ir`%8VX zVE@rC0ZTz3SSHxQ%fSk;608EN!5Xj@tOM)82Cxxq0-M1WuoY|r+rbX7Q?TmY1$Kiy zf{mcq3xdEtuwSs%4}gQ<5I78ufTQ3TI1WyLlR{@Vz~B@(4bFhG;2by)E`VTgQLuw@ zNwEF846c9>a1~qw*TD^N6Wju~1>3|Oa96PUxd-lp2Z9yjA$SBHgD2prU;{axf#=`_ zcnMyC*We9!3ql3k`a8j{`QL*N;3N11K7%jdEBFS!gCBz3Y5oMiz;D5BVg7)>Ak6W9 zv%(7YATb;W4@Lzvu*!@t z*xg?OkWjFN6M@7aiC{MxNkKA@9Hao=z(=sVq?AnY1*t%4kVdc@pR^zyNDnfAj35)p z46+Dz;Ie{jAUntba)MkSH^>9>f_xx9C;$qALZGl<)msD<1;qqA1jRuKP!f~^r9l}` z7L)_!K?P6|R05Sj6;Ksa1JywdP!rSwwLu-ho~6_U^+0{l05k-RKx5DZGzHBBYc|b6 z3&C1%OVCQNd+OGp4QLD63AR>y&;fJ=oj_;M1#|`7KzGms^aQ;?Z_o$y1^oouul`^F z7zhS|!C(j&3WkByVdBV=5`h}ej7J!911cQs<61WVmfDmw1 z2$xI+y9Ta<8{j6m1#Sy9-R|50cfmbyU$Cb206YYbz+=H`?1^9p<*8t8)uizW_4t@w$)SuuN_znJmzaY$s ze`|#W;Xru7b~yrw2qFOw5E(=fY`;7~R1ghB2QdUYIx#^k5F5l1tn0-E@qibI4-$Zc zAQ4Cml7OVb-sC!h$v|?D0(b)-!P8p{rv$zr6-W)z2-RHVv>+Ww4>Ev^Ad}#iLThCP zSwL2hP1x_2$u9Uh=r33s8vq7^L13_84QU7%3Wf>x zF5Yl30*nNsz-TZAj0NMsc;F}4J7N=nKbQz6fyrPBm0kz!31)%WU=ElI=7ITO z0ayqEz#_01ECEYFAXo;LgB4&USOr#tHDE1R2iAiPU?bQBHiIpKz2&zRYy;cD4zLsK z0=vN;uonag_HOAuupb-%2f-n57#smd!7;&Justr=JC7&8NpK3B24}!oa1NXY7eKIJ zo45!rfy>|u2odbH+^gUkxDIZBn}WR$dkfqKcfeh658MY21bajFA$SBH3lH2=;wRuK zcm|$>7vLp$1zv+U;H_}NMGgh;zZt;3?v6BfVW`1+Xtisz95xgg-Ee> z6a&RU2~ZN00;NG2P!^OE?7fNdpaQ4}DuK$N3aARIf$E?Js0nHb_BudqPzTf%Z1jFT zP#-h^4M8Kp-V|sInt-OD8E6h#2sWa=C1?d&gEpWoXb0MZ4xpo8ga12$&Y+86d)gIr z1KmLn!QQ0k33>_kc1&;32lN%}F!cld1$&`m02l}cfx&`}@E-z(f?;4d7y(8KtzxLL zjS{Scqrn(37K{VqfghLv{J})QUU-=VCW9$pDwqbQgBf5Zm?hW?T(iL(Fc-`d>{!eP z3&27U02T>W!o^^TU2n5T(aje9zz3-O zumkJ_yTER+2kZqwU?12I4uFH;5I78ufTQ3TI4(T!Rns~FPJ&b5v|yP7&w#UnW#Kyq z&VvhrB^3+?7r`ZPS+Lcw2-coMz*TS!Tn9J6O>hg`26w<+a1Y!E55Pn42s{Q)z*F!H zJO?kpOYjQ325-Py5DMOb_uzwI{o*6|1U`c=;4AnBzJnj&C-^1Unf5pM1O9?Ar~WMy z7K8)gK?D#{ux=hnuv4xFhzz0tPY@ME1JOYY5EH}_ENfzH5C_Bs@qibI4-$ZcAQ4Cm zl7OTj8AuLN0B_&}QUYI)O0Z;-sX-c$7Ni5|K?aZ!WCEE%7QvEjW(CVpQLA!q~|gC?LUXeL-z+vcDJXbD<@)}Re&3)+G9 zpo3sNr6cGhSenz$pbO{1C15EC1j_`=s=XYn5bWo8C0GSkgEe3+SO?aF4PYbK1U7>$V5?v` zez$?`UT-6|AWr1INJ$a1xvXr@1ipeDlvE(KU>!6w)qUY5C&&eIgFGNF$S1UMABf2h3J9StPC-ye zsN(*WE)0r*qM#Tk4oZNMpcE(#$_U$CL0~W#0)~QNU^o~d40n4v5{v?) z!5A&jxb@tDm`oHJf>Y9p(98 z0ayqEz#_rcS}a%}TmqJYK(Guf2P?ozunMdOYrtBt4y*?oz(%kMYzAAvR;`+lUJwNKf&JhBI0z1b!{7)w3XXx}-~>1cPJz?l3^)tUf%D)32nH9yCBfSB zWpD+AfUDpdxDIZBo8T6>4eo%u;2yXS9)O475qJ!qfT!RYcn)5Gm*5q64c>saAQZe4 z?9Bfjd;lN8C-5130bjv4@E!aBKfy2X8~g!(L6|fD$`clZ1K~jg!BR&?1d)IThzz0t zPvM2j&=?g&6D((AbPz+Z^ocP+ED#&S0dYY*;05A?1R$YcSuPWS#2^Vs3X*~3AO-LS zKEgwnlrp7YDKULPDv%na0ci!><#ZsuU|B9RfQ%rMV2Ly{gDfB`$Of{593UsiC0LHl z+#rvT$Q_HkARovN3V?#35GX8I8qXr2C@3aaM$O`&1SkngfzqH1C=1Gg@}PoXdr=Wo z0+m4(P!&`I)j&<%74Jp{Wd=m~m(-k=ZY3;KcnU;r2h z1_^d8Iv5NAL%}e?ek+HA5rSR3jRd2>XfQ^wv*=hb4vYtWU;^+56Tu`f8B76F!89-( z%m6dNEHE3)0dv7T!S-uDSO6A+0I&!w21~$F!D=-SEEDVqE(a^XO0Wv725Z1tunw#T z8w9K8jbIbl47Px+U>n#Db_jMgxD)IWtjxQ?9a1~qw*TD_JBHskJ1dDu| zW$u8x;2yXS9)O47kzkP@gC~MTe#$b>z;o~dyacbnYrz7(0dGMlcn98t4}#U|N8zxm zu}@6-48DM`f^FiPU<-c-KLjiMPw)%;27d(G)?X0j?7t~t1&bU`u*l&B3mAcAB7#W3 z14I@gM^WLU08bDVL<7-53=k8<0kATdY+l7eI)IY_ecJeF*N`o?>EGP%cg9@OcU^mW{KxI%xuwT!rpc<$SYJi%8 z#i<2qgF2uts3+Kd)dvkgL(m8`7OYyDfTp0CFyB2HXbxHkb_833R-iR#1KNUipgrgS zI)YAumANzM0=j~3pgZURdV*e{H|QhS4)z88Kz}d*31;Yd@^KdW%j0B^= zXfOth1>?YY;3rt~n*jX5L@)_V22;RPFbzxxGla~EbWCT0SztDp1LlHxV7^e+t-e5L z?ywL9u*@Q`7%TxxK_FNLmV*^wC0HfcMpuJ1U@ce&)`JaTBiIBsgDqgIu+i<#Hn3fI zNPHFyKw3SMr!Xef9G z-U~MT^#k|_K7r4I4LAJ)zJhN;y7-Fx9sB@4!7uO|`~iPKm~;Q)gazS1cn|?Z1d)IT zhzz0tPY@ME1JOYY5EH}#u|XUV7sLZzAifaI)kXr45F`SLK@yM@Bm>Do3g8WVKuX{X zQi0SU4M+>pf%G7QP{EZsBgh0YgDirFMx2Jr3bKLhAP2|^a)I0+kI>0&D=)|g@`D1P zASeV1gCd|PCz1hjYJysz zHmD=`x_Yh)>Vf*80cZ#s32j`Gmd2n7XbPHv=AZ>=30i^Hpp9VXy0)MlXb(Doj-V6h z47z}>f}P^J33jUN4tju|pcm*3`hdQmALtJT2)2oVV31&^xWQlu7z&1g;a~(9DcIR> zlwhas(O?W13&w%*f}O+t1UvUm0RCVim?YSFelnN>rh;i;I+y`wf>~fTm?PMyxaJD> z6{>lHeaLA(SO6A+0I&!w21~$F!6F9=_BE?zU^!R;R)SSvHCO}I3Rc2(f<<1>lnr2` zVBehD1U7>$U@O=LwhI<{hhRnB$*f&qw_qFH!<4;(EgS^)f&DCVK(NX@C>#r`K6nTm z21meAa10y=C%{Q?3Y-RKz*%q(oCg;`Ft`XVfy>|u2mx2YHEX|058ES@EW`UZ$T({2i}7Z;3N11K7%jdEBFS!gCF20_yvB0 zKj1G2bN*lZ2@Ar3@E`(+2qFOw5E(=Po**iS2BL!)ASQ?fVuLs!E{F%bKzxt@Bm{{- zVvqzR1<62ikOFuEACMCGf>abRa#*05XD1AT!7UvVv?NJIDcYf?Oas$OH0% zd>}t401ARapfD%`ih^RGI4A*1f>NL~C3_AT|qa{9rOS_K`+o7^Z|WAKhPfx00Y4wFc=I0 zL%}dG9E<=X!6+~qi~(c8IKkg#IT#Q8zy#nACW1*|GMECUf@xqnm;q*jSztDp1LlHx zU_MwNF;76WA=Ia*0N_fUSaUYa7@Oc7UB=7uYS>CiV#9+(!2bK@LH}QipxQRfqk| zIv{wutsfMu7>5K~{V=nR2({c=M};D8;bY*q@XpOTA?$Mdev(@Yn7kHHi06g&gZ!3*#byaKNUJCtw0TV{m{R%7o3tFiYi^8tJWp9HI@ z&w|y)7a_#`yYyA?@D#oYh1`_yg0GwMLn!L-Q>g7`{Sy2fehYyPe}uOVe}y22Fc<#C z2@Ar3@E`(+2qFOw5E(=Po?F24dQ^fAf90Pn!G@K!4g{~U`j&4 zG7BXVEKO5lW+f3UQBqRDG7BXWET>a)!4g2F5Ns3Pf<^WbEJamH!6N$#7CDt*DUVVM z7CDVzsgu$Qwuy9t4QWmfG6<91c;k%17KcpC$_%oAtb&c2&L-Gs=j_5Iw^j}ztV2$r zo@)TP1b>Iz!cB)f!Y7BkLb|9zK4FtXej$lly@0U7EmKhF;ZR7h)eD0npr~M*CC}!Vu_ z(oC?(%>|3xLhy03S_&QxtptnHTBz-&v|&nH!6LU4EOL9nB6kq1gdK%~ZmmvC=`4h} zDP05`^WPP86Ksfncfqni^bly;?7e`#g1tb|Pq4`S!2mE2 z3<86}5HJ)B1H-`x!FtL_FiNnVGFq^nGDfgoFjfe4t#_Od&5h?DFC29669OG32-Z{l z1&cfpOcE^eWWgd&5z4r=rV18$nqX^97pxD?5bWK7nS#B!FiWt9jk5)NEI&uEC(?6; zP3}45Ji(s#&KF*}DGLO9y1P)Y$Fl)~J=k0%lynay7YnxaC19ywWeyaq%*()X!OFZs zuw7m$SeaJ|R_4{rS|eC{UMpCuTPIjMTrXIw+aOr0+bCG8+ay?f-Yi&q-Xd6g-YQso z-X@fBLnXHh-`vBQ9YP#8Wv9^0VHeBn76!N}dxT65dxaSeLBd_P`aWTUo3dZ98=nK< zpfKItaU24N1-l110*-=X;5aw|P704*oKxU5I3w6?*ID7TTjrc#H(BQeyZ^etlwhI1 zTjnCTB-mSimj!!S?22ITqlF0eYT;GE-h#X)*o%AD1$&w9hG4J7-4yJ-+FOFXo_Sla z$ae&bd{?l@_kAi#o5L$%nZs-0mctvNu{&^Y1wS_>R7mfpyb~(LEOHFN+I&pG zntCk3dP;1;`b8YUI#FD~x>Y>E*76dpU&I%zTO|;z?<5o~P9nh~Ck9Cbi<4BaILSbA zmPrA;1zXrhuz)EAYvI0vJv~STQVaHoAPrN}3ido99Y_x{fQ%rMV5?^aSwL2h4P*y7 zKu*CPbmRiLK_0>0qt6TS3HH8le!4Jj2PFqN@K3G`z|NVEtdQ(xsI$ANo zx?XWmf>|X6>)oZ8Ra&qlF7@XZA4Da{4zDJ=wBtEFH)rIlcN z(OR&rw-KxlwiT?Wv=gikwihgN2f-qD6fANl!6J7SEOHmYB6k%mayQUju*f|GYuG&n z>nXjM(wixLKwoC{6RcnKXUYJk3=}NRAi;o2Kgh%cwWh@v6#sfbv0r-Q7U=o-NrU;hVW2#`8j;0Bg zMP#~QS&U`~mIh>|V7ZTG36{}iwqVIj<_MOqXRcsLqUH&fpMSn!DW(?)mU4fgV4pM% z5G-r-BEizvFBU9)^b*06gfA5=6L_Ftxu%y17J0c~aaIVn)=I&0-LDcXBmHW@(qgX> zEQ9x2!8W>1u!5}z8w4BGxe;svo52>a6>J0B!49w!>;k*N9>KqsBD>)|w`X|051j0w)#p~<`Uk%7A#BZ z8^IFHz7;G9ZKz-=Ro@BqytVLq!3y>Pd<37sXYd7l1>XeA5c^%Qt^WW&1xsD~OR!9{ zzlBt8qkn|L?%L)r2y^k@l&~Ni2oEBFh#(U10FedjJ5hiqhzg>C=pY7&31WfRAdX;T zA>x8~f{kJD5^Tspe8ENtBoOT1|Ad15`=3a#K?sQj`>#KVVB-ps3U;nbCfKQZlI5T-k16w14W zGYMV}nT7RkRu-YZLslWHo0UzlfZ2u3Zb}YewnI*#r9&>3$qn)dgWasW!bOLC!cP}D zKg$#lmb*q$5EK#)xG9B&+YUv9FAhb8SUy5AA%jD4p_D@j!Qzwzr36bgTw1WUT1K$G zQ&zCdz~ux_7rDG(S&=IUA?}}}ih{N0NXZ7>}|@H zg1rdVO0ahoTMPD*R~y0J1Z*qVi+k+^dy}iZV6Vk>5bQ0sj)J`i)=99)odt{BMX<Yie{opvkZWYG^Kfy-N zP7rKNslQ;OUMC7Rkadz^LsBOTr`-6}DT0k(ohsOf)@g#RK3$0AmYE^gbCQ{YJ#3r> zW`j9`J)N5i=7ITwJ+E6J*y;-fdtMhHOww+ITO>4by=k#f%uQJ$%yCne3O1-FP#P)PoXjf0?k`q@HDE1R2iAiPU?bQBHiIpK-2rU{+rW0P1MCF5 zz;3Vy>=o?hCbOd1?RwdZ~+8^i{O%A z4^=J;wqI93h+qfhD!2x&gB#!`xCL&5JK!$32kwIh;Gtl}cmy7UC*Ub~2A+c#g6+;r z@Cv*JZv?B}w;)uo8|Qc6J@^1V3U-tJ348`$z*q21uz#|?gCF20_yvB0Kj1G2bLn54 zupk@=4f!rVu$P4m;{Gb3R z2nvD1pa>`mih<&w1SkngfzqH1C=1Gg@}L5!2r7ZfpbDr8s)6dD2B-;Yf!d%Bs0-?W z`k(=52pWOLpb2OSnt|q^1!xIcf!3f6Xbakb_Mijk2s(kzpbO{DC~*FPGJ0b{{9Fdq1U3BVsr1d{|C zJTMtd0aL*=FdfVQGr=q{8_W@G?7>_x56lM(z(T=>E(Cx@U@=$%mI^k!ArLGB%fSk; z608EN!5Xj@tP`xv>%j)F5o`jR1uOFwuoY|r+rbXO24L(2yTER+2kZqwU?12I4uFG# z{SF=ihrtnW6dV(*>W+gG;3PN&P75|fd*D8J03L!z;4ydto`PrKxnOJ zfS4ebV0|z)hy&t+c)$z92MItzkO(9etPdsuNkKA@9Hao=zz3uRz95xg^_&`{0ck-x zkRD_J89^qH8DtTx4`v0~Kz5J=pSQ%6SRY5gSU9hUF0cwI;pf;!@SefgBdZ0dN02+cu zpfP9ynu2D6mAN@+0a}7qpfzX%+JbhVJ?J1^3hu9nR z0euC#N9!lpU4MTt01O0!z+f;$un{jq!7wl!i~u9SC@>m~0b{{9!F~tF13xeU_=AaH z5||98fT>`bU_E6zm;q)Ab_iyH*QU{vck$ ztffo|WXdwZ{#ITt*jg(Di@Z{>$g70^pZ~DT8kSir*hbe0wypJo-Q#Z%?6!TQV39Wo z7J0K^Yi$wi59_TgvrVwJv7Kdh2-c!@3bybruv@Tg?GY^UUcpum60FSo1p6m_zhLD# zAlNP+6fE)~!A7$j7VP1}5y2uK6)f^G!6F|QEbAB3~4&%$EdP>#|^xuLxG=5Wyl}WtnS&MZPXrX!D3HFz<2Z$`# z|I1N;r(ltzf@mN*hyh}PSRgit1LA^szzf6&2|z-S2qXqc1lygYAQ?z5*nXt|-oQt& z|JG9iUyur<25CTAkWR2a>(he_g8fII5o8jq#xjE}AS=sc1KB|i!T$Zv337qlAP>k3 z@`3!I04N9w30A_wpa>`miV0R@#X$+d_M#+HN`ca#3@8iA33gD*g9@OcU?U$Yfy$r? zs0ylq>Y#>TLn&&4TA((l1L}f$g6&0p!A4Lt5Ny0eLzZbISa)bF*pQ4Spebkunu8XC zwS<67T?#K@{K#qJn53I*0*cf>qI4A*1f>NL~C+6Tu|G+WcfNMeujy(58ZEU^Qfz4nG*b26R z?O+Gk33h?qU=P>}g1|no9~=M&!69%M905ncF>oB504KpIa2lKeXTdpe9$Wyy;3BvL zE`uu|1Y8Bzz;$o~+yuA4ZEy$N1^2*x@BlmnkHBN_1Uv=Lz;o~dyacbnYw!lV1)<;_ zcn>~+kKmK=|MMU41$+hHz<2Ni`~<(iZ}12F1!1oK+g4Z*4ul60KtvD;c!0=)JwJ>B zJV8_t4MYbqKuiz|#0GIdT)`g7#RFa-K1cu(fma*zUe10RqQ_<~d* zHAo}aEv^AQQ+8vVg20n_$oMvV$BTC&&eIgFGNF$OrO+0-zu$1PX&9 zpeQH?ih~lMBq$|V+b9jnfU<(USym2|7wq|J1yB)G0+m4(!Cp763aWwXpoU=YCf5YD z1p61JHdE>d_PTLhP*1SjBlST8&`_}aB#l60&_u8#Buzmx&>XZ7EK5d9&}bBh`MT;4d#Hkg14JB z56l-Vy~zTwP_PU$0fM!SMPM;l0+xb6una5*E5J&yO0cXitHBzu7OVs7!3MAqYyz9X z7QyOyE7%6MgB@Te*adcjJzy^g66|f1ePBO001kpf;4nA>j)G(0I5+`Lf>Yo$I0Mdt zbKpF<0D{3qa0y%nS3n533a)|c;0Cw}Zh_n24!8^Mf&1VAcnBVW$KVNg3Z8-I;01UI zUV+!(4R{Me!8`CCd;lN8C-5130bjv4@E!aBKfy2X8~g!(L6~d*+E`c+4ul60KtvD; zc!0+AHgnZ zQVRA1?F&+Y)F2H=3(^Vp7i4;nL9i>Cj35)p46=Z%AREXIa)6v57sw6rfV?0d$S>H% zNdZt06as~X|KEQXtP+Ycs~9K_N`R7r?O-WTTCl1s1ImJOf^DKas32IuDuPO&vS7ui z0;+;)g8dy_9n=tPqcuS-P#e?%bwNE)A2a|BK_kJgni_*9pebl3Sk{;3pap0NT7lM} zjbPVoZ3Vl)YsZxKg5{IxAXwy%g5{IxB-nLbXTkExbP+6{Ojp5*+D)*?-35!>L-2K} zW_k+k9C`^Bxi_==2o||7Q~H7af<+!6*xL;Q!5}ag3;{#IFfbg903*RD!LABMgE3$% z7zf4!KQICKgNa}gm<*jcZWw;pT&8^I>98EgSt!8WiR>=5i4X(!kPc7r`& zF9-trzS6C1Zga;8oL=Z`^yJHU!8AJh| zAS#FkqJtP9CWs|iJ;w%dKwJ$d z$J8JVNDI<|^dJMs2r_}pAd6s+8nS|HAUntbatfAOGZ)AW@_@V`pJ2T^KPUhSf;OB#F2S;q>=taTJ%YXIzgMt#_JhDaupb-%2f-n5Sg<4jM+D0c zaFi*>gy$}qz;VHH2%He?>l-J9a4sLnDZ#dW8k_-V!8veVu$zbrAXu>5lZ%4gdR!9h z_T;i)HyT$!2)N2J*T8kb($d}lH^D7%8{7eR!98#vJOB>`%UJSAutX(~1@K&&U*ii5eyayk^NAL-J244ibmHrC8f$!i4 z_z8XqcIW#W`~iPKm>d6=2@Ar3@E`(+2qFOw5E(=Po**iS2BL!)ASQ?fVuLs!E{G@C zb5So4A0z+?K_ZYCBmqf5GLRgk0N%g{qy)Yo6-W)zfV3c;U>VZVgA5=e$OJNjEFi03 zN!YT1>>!6=X^3)yTp+h#36AoBydWRQ4+?;Sg5`NDBv_dX3zpZY2q-F8=C@*krA{gi zN`R7rrHLyAN(;7D8Nsr{l?CNMdBO6Q61C(H9;*<8`J@H zK|N3(G!SeP4M8Kps--b#0-AzmpgCv(T7p)B)nRMU2DAn3Kzq;ubOfD1XTcIubrG!0 zT?IQ9-9UHH1M~#FKyT0o^c5`mRX@Sris}yrfPr8T7z~Dhp^_m=0!unP8S+wJ{sa0dv7TFdr-c3qb%_1QrWc z8%w}a5D1omeAT@I$a%7C*r+@EiOAe?gd=|JDi%!h!H0f?)L=5kvwW zATo#oJV8_t4MYbq1nYw_K`am(!~ty*vVg208^{iFfSe!~$PMxc)(7)~d>}t401ARa zpfD%`ih^Q-wTas)HJ!Ca5J?AFK`P zfV!X_s1F)|hM*B>44Md5=BA(-XbxI{mY@}A4cdUVpq*gpR@#FOpd;u6I)g5tE9eHg zgC2tQ!JeQO=neXSzMvoI4+emNV31&aa4;AGhJs;WI2Zv&f>B^J7$aC891F&Q@xTvE z0RCVim;@$+DT39;R4@%p2Q$D-!8+_LFdNJPbHO~p`rv%904xLnU=dghmVl)o5G)g{ z)h!1rz)G+RtOjeqTCfhR2O9+I-5Z&*NwB`NS+Jj*ErPYot%6nEHsSy4AHfdO4#6sF zr(l(^ORzY*!5**|1c7~EKR5smfYo$I0MdtbKpF<0D{3q za0y%nS3n53Dp>to1J}U~!4B?Crrcu6ZEy$N1^2*x!D{0HcnBVW$KZ)z#ds>%MxTM_ z;01Uo*b#gMUV}H_EeHkgzg}g9soZhy*-9WWk;_MFE~5Du@Q6gBTzthy`MUI3O;F2fRRhkN_kEi9lkI1SA#y zAO8%JgA~9U_<)qa7o-BIK^nmlAfyH9Kzfh?WCWQ&W{?GB1=&D$kOSltY=}`VkQ?Ly zc|ksq9~1xuK_O5W6ahsAJKV)UaZm!31f@V}PzID0tfI<+@`63;tN<#4N}w{RBG_o3 zs-POE4r+j!pcbeN>VUeSo?tszA2a|BK_k!@GyzRPGteBg5bR@fEkP^L8ngjzK|8@d zNY@^803AUm!M0pLnUjUp5W`WsY4wwt( zf%#woSO@|H`=sC^uox@>OFrU?o^3*f$DSgEe3+SO?aF4PYbK1U7>$f_?OG zE7%6MgB@Te*adcjJzy^g66`CA`@nv102~B|z+rF%90kX~alt;zcmkXRr@(1&2Al=w zz11Pk`Pwu|5rxD2j<5O5V-1J}U~a1-1Dx4|877u*B)!2|FRJOYme`=Zau-XU(@4$QTL9kEMeFUEb`>@?-@CAGY--JN-1)T5T2ly%27XW_= zRo%w{e}g~ZF9>t{-!frAI3d)n6&^$Y5kVy20V0Daz*Dd<2}T9cm=ztw05L%<5L+1O zb}$Zz3*rGU5MQu*P9WH45EBaay}v{tF-QWEf@B~$NCCVBi|hkZ0$-3yuo_D(*r7}V z(t>m#J;)%~S{XqmkQrnFS%t~&pkxEt1^dKd4v-V%5-gugZjcA$1^GaJPyiGJg+O6Y zM6f(3ML{u89FzbhK`BrglmTTyIl&Tflm`_+MNkP;230^+Pz_WEH3UoBQWMkywLu+F z7t{mwK?BebG!iTiOk>alGzHB-bI<~`1g$`8&_=KvIBh{Y&>nOE9YH718FT?%K{vs^ zd)poK06jr3&>QpteL+9a9}Ey|#KJ%@2n+^8z)&y@3%j)F5o`jR!4|L;Yy;cD4#B=$yc6sKyTKl?7X*QQU_Uqj z4hmKqhrnTQ1RMp&z;SQ_oCK%9X>bOd1?RwdZ~+8^i{KKt46X>)2SdPBa80mN_jSQO z@q9zDQ^8Ge3)}{Gz+J)W`5w40SPOpu9)d@LoxUD}C*Ub~2A&I6&o97B@Cv*JZ@^m+ z3f_VD-~;#wK7r5R3-~J7N#+~)4t{{2;Fn-!{tfpf%G5)$Otll%pi+kpFYnDvVrU%2gnI>f!rVu$P4lb)>HC> z0-zu$1PX&9peQH?ih~k@9h8!w6etbKfU=+*C=V)tilCBU=Y-0j3aARIf$E?Js0nI; z+MteLWv&bAf%>2UXeihjsS#)lnt-ODnPA^|Y7Sa}mY@}A4cdUVpdDxrI)IL#6X*=O zfUck$=ni^-o}d@#4f=q-pdaWD27rNJ5Eu-GfT3U*7!F2&kzf=U4aR`6U>q0^{J;d@ z4<>?1U^18jrh;i;I+y`wf>~fTm;>g5d0;+RAlSFm7lHt=2rLFmz)}zhmVxD9g}g1|no9~=M&!69%M z905lK`_la}a2%WfC&4Lj8k_-V!8veVu-do)g26>_30wwOKnS=Bu7T@2 zdkATdY+l7eI)x!~a>!6w+m$&d$OUqPJRmQ~2l9ggpdctDSRX75ih!b^ z7$^=(2v(kwpcE(#$_RGeC=1Gg@}L5!2r7ZfpbDr8stI6h6m09Q1lwq9X0;J)t+t?@U< z1j~#Bqrhk|28;#czcYXW`LPs7MKm@fVp5Em=6|! zg&+Vd0*i%}u~p_JU?~U$%fNE50;~k9z-q8YnCK#}1?#|iumNlYo4{tU1#AV|gs3j^ zcCZ8N1iQd)um|h~L13R?2X4P`$VEN?4uV7AFgOB^f@9#gV6}PzoD^&mr@(1&2Al=w zg!--+=fMRK3@(C8f{&Y5Cj5&K@boW1OvfA2*HK~h6JHNXb=X31>rz=5CKF4k%Z7uRp-bcitzvT zA4;Nu=pY7&31WfRAdX;z7UP0=AU;R{5`sh^F-QWEf@FeCrIH+^04YH#kQ$@`X+b)W z9%K+~SY<|#31kLYKvs|qWCuAwPLNBm$zF1UJRmQ~2l9ggpdcs&3WFko%}Y}h6a&RU z2~ZN00;NG2P!^OEY_w^4Pyti~l|W^|`ZTM6s-POE4r+j!pcbeN>VUeS9;go*fQFzE zXbhTwrl1*UE?5U>3(yj@0RV#tYW1JONAulLR|$ zCW9$pDwqbQgBf6^U}*`n1nZ-p4d#HkV4h&z_w&I5!SVqXf<<7lVBPLZz*4YGusF-X z3Kp#ds{~7>SPj;IwSpaubznW%05*b6U^CbPwt{V7yI{YAJHSq`3+x7az+SKq><0(H zL2w8h21meAa10y=C%{Q?3Y-RKz*%q(oCg=cMQ{mR23NpUa1C4sH^5DB3)}{Gz+G?; z+y@W9L+}VZ22a3K@C-Z$FThLi3cLnyz+3PRyayk^NAL-J7A*Jj3-}7Yf$!i4_z8Z2 z-{24UE7&Z={{+jG4RHTII1o^QFjXdpU>0b&X^9Yid_W_XA#*j#XNKwJ;}4n9-t@a1$u)%pfBhL`U`dq4gdqeATSsV0YkwsFdU2kBL%w# zM}g5`3>XW>f$?Ahm34x6<{S;1y+MKf}Q+p!8))WYycYty9PIb&0q`I3bujmU3-*Ei-~c!X4uQkq2skR(HFyjh2PeQua0;9TXTVu-4xAUP&KJN%a0y%nR|NY~ zu7YdeI=BID3U(L01#W{o;4Zia?t=&5A$SBH3)YPA1Uv=Lz;o~dyacbnYw!lV1@FLn z@Bw@Tp9D*b`V78+uizW_E?Av^fS=$O_znJmzu+GT@Zi5V4g>^&KwuCA1QjezE0|#U zNWnn}5E6s}p#{rh3;`+lUcut*6KtpZh17oU2f#sa2pkq{Sg@_0fT!S@V4FV|?A&+(UV>NPHFyKwf_LCO_y9hF zPvA570=|N8;5+yMeu7`%H~0hof`1^u!~Z^)0|7xG5EujjK|wGO9E1QNK`0O!gaKhe zI1pa2J5mG?5kvx!K@<=bL<7-53=k8<0Do3Xl?{ z0;xe7kQSr^=|KjN5o7|HK^Bk|WCPhj4v-V%0=YpRkQd|w`9T3t5EKH1K@m_C6a&RU z2~ZN00;NG2P!^N}(@@mw$u%m)j=La+!d7VP_4BG^$~D%i8=GO!%104u>Nuo|oZYr#6O zUa+ce02{$3uo-LtTfsK49qa%*1$#)|1$KiyU@zDQ_Jaf9AUFgL3-&;MM6knh6dVJ` z!3l5@oC2r88E{sx_kwfaJh%WZf=l2sxB{+%Yv8&NJcKTg8^S98V1EfS=%(5W+|P4gP??;GfXO*C)WE|KLDC5C{YYL4-!V8=N-$N_SKTp+h#@7;Mo zUXTyu2L(VuPzV$TMLNL~CEVTELn}DXE8E6h#fR>;YXbswcw!&f`xgBT^ zI)IL#6X*=OfUck$=q^|@OApW!^a8y>AJ7-{1O34OFi^0DjzM5B7y^cZVPH5I0Y-vR zV6^c6_8%}7j05Ar1TYay0+YcMFjYw5f25{?>0kz!31)%WU=ElI=7ITwT`3E|La+!d z21~$Funa5*E5J%&g0J%`uo|oZYr#6O9&7*`!6vX-DC8q=0b9W~upR6GJHaln8|(pl zg#-S4-Us%B1K=Py1P+5E;3zl-jtka)cmkXRr@(1&2Al=wz1TomjYyd>CHc^O<` z(N#*Wf$QJ~xCw57+d?>hobQ0U;2yXS9)O475qJ!qfTx08gU`To@B+L9ufS{Y2D}CD zzfS-aL-e2H1_yhiee;~l)|F&`REY zgArgP7zIXyF<>kh2gZX5U?P|VCW9$pDwqbQgBf6^VCVBJFdNJPbHO|?A1nY1!6L92 zECEZwGO!%104u>Nuo|oZYr#6O9&7*`!6vX7Yyn%rHn3f=^LYo@33h?qU=P>}_JRH2 z05~YvHFyXd21meAa10y=C%{Q?3Y-?!2GrGk2Amb{`X`Wc;JlF9uX8~t>TwZV0++!R za8rBaKUyOLa6UQX-E(Xgcj@|gc0lmh6Uk3cn|?Z6fANi5E(=f z>=;HBEOInTqJtP9CWr-M3wG$@fVdzYh%ea3Ng!A?5`sh^F-RgkWH`zp6nopU|Bjjg(9K!#pM!g za;MyaB|u3~3X}$AghhVk zvV!HkmjmTN1yB)G5-ujtR+T{&P!&`Y)+W?C)dlORsUcXid`(ab)CP4xUE%-vKZ51$ z)E6xKr~zmwSo&Eb!H#@m&;&FU?8r9*%|Q#$Qm_QMR-mXW>33i~y3wBs0fQeudm@HUk^%O7_Oas%w3@{VS z0<*y!Fc-`N^T7hJ5G(?V!4j|(ECb8I3a}Ea0;|CquokQX>%j)FQ3&maa2wnKcfmbyA3OjL!6Wb(JONL^Gw>X| z058ES@EW`UZ^1k89(({F!6)z;d;wpS0);W4q||q zAQp%X;()jy9*8g4?_dIu5F`SLK@yNuuwL?HAUQ|@Qi4<d31e?^Nq+l~(lmewe z8Bi9K1LZ*lP!UuDl|dE3=BcO(s)6dD2B-;Yf!czN@2&&tf_k7nXaE|5MxZfhBG?$` zrl6TH&JXl%4qAYgpcQBh+JLs89cT|afR3OO=nT4muAm#}4tju|pcm*3`hdQmALtJT zfPr8T7%bSp^C4g;7zT!e5nv=31xAB0U@RC1#)Ao9BA5gwgDGGtm*u(ZQa9ps5?GxanU~x`?)8Gs^3(kS_ z-~zY^E`iH}jZe7(t_t=Ra1C4+?1B7-U=QRs!7XrGu<=B91be%=E7)uizW_4t{{2;1~EU#EPTHf52bx4+MDj-#QKi1c5+c5CjAT!9Z{j0)zyi zKxhyKgazS1cn|?Z1d%{w5Cud9(Li(%1H=TeKx_~P#0Bv{e2@Sn1c^Xm;hq1HN&=FC zWFR?60aAigAT>w>(h4>vBAsAE2GR?b>YqWdVFeil8#0hdu*Ck%f{hf&B3Sl*R@TWT z*l>yLf}M3aKu(Yg_UXTyu2L(Vu!7@V%fx@5&C@NV0axqXGlmI0`DNtHa+f0Cf zWk6X_4wMHKKt;joQwdZSZ0}V-RlzcystLA>>VoAF)etQ0r>0<8I<*Ar(6236Mg_exN@X00x3VU@#a0 zhJs;WxM26^5rQ3-k%Hwdj{>6wOAj6+SRU+H!S2T61Z(9RFWAj|f?%&y69pT^Hi?qS zf(^KvB3RP(RKfN>O|XR6>4N1X&k!u~OiE_4&TPRppCg=)sWV|NCG!NU*nGh@Um#e; z77A9eMS@jqv0#mjO9ZRfQr1}pmJ4=RRtUD$O2M{TCD>tEE!YuTBiPMhtzZ>fC)np& zFIb!nV54B4Vv}H-Z)VXJ!H)A*!9LD5!2)g{HwkY+rW;I}h)%&V9l5{y?ybJrpe9Bf&O*ELg>!2v)JD;F(~Np9@yi7vQB}`+6l< zeO?RpyzvIS1@FLn@Bw@TpTKAE1$-6C`X`xh;5+yMeu7`%H~0hof`1^u^Zz0{5D)|c zfk6-u6a)joK?o31$n5JJ3WNq>Kv)nCga;8oL=Xu?76$mpQ9x7>4MYbqgl2x_m>?F2 z4dQ^f!WO@BJP;ow00}`NkQgKZNkKA@9Ham#K`M|MqycF`I*?vC=WCb&WCWQ&W{?GB z1=&D$kOSldxj=4^2jm6$Kz>j_2ozTpD+mgK!k`E!D!lNYq8KO+N`R7}lrYP$TpE-C zWkESmUa+gX0;mWofy$r?s0ylq>YxUwDcD`27N`yCfV!X_s1F)|hM*B>EZB{x31|wM zf##qEXbD<@)}Re&E7)DD9cT|afR3OO=nT4muAm#}4tju|pcm*3`hdQmALtJTfPsR| zls*Uy21CG5FboU_Bfv;73XB$P>g+LKEEp%)eAMH?1QtyMlfYy!1xyuep6zL1I+y`w z3O0xTEWxI)pDox-;By4q`&_|h)t(3D3pStm0oCW8=d2j(-6f9r#61WVmfUDpdxDIZBo8T6>E!c6s1MY%*;68W& z9)d^UF?a%=3YJ6l3_J%fz)SE7yasQ;TksCN2Oq#k@CkedU%*%J4SWYbz)!*Q>wbaX z;1Bo<{(%55{@codfFKYE41$25AQ%V^LV%DU6bKE%fUtsngW*7U5CKF4kw9b+1w;kW zKy=~%^Z$UDAQp%X;t1AS7#G9?@j(KRP_P!oL?AIp0+NDcAUQ}OSbJtlN>Wjh8l(Yf zK{}8gWB?gKCXg9q0a*oWAk7A{gB&0y$OUqPJRmQ~2l5NnZd?Eq1cg9hPy`eO#RO}< zE)Ghts3a%_N`o?>tYDj$qoh2j04jn?pt4{s+f_hSPz_WUto^wLs43VNR}0hzbwFLg zj&nUwA2a|BK_kIV(Z-+&XbPHv=7ODdEd*<cPqhKwp)WXENTndf%c$-U|V$* zEbprm=nT3Dwu`Qy8|V&t2)21oN_v6bLe#K&aP0&7f_|Vs7yt%>L13`(+y52v5HM7j z?jsKa!@&q4rcW&!2}Xg@Uj)G%?eYwZM32+je z671_fEoAmz${BDLoD=L6Jr6E`i{O%A2lFzx0n)?EYF!3}Uzuyg(vxDD=ryFz3C z+3$h-f_=aT;30Sf9t&2nC*Ub~CfLDz4qgaW)tBHEcn#iww}PFi_zr%6pWv6!+GmIU27d(07yT>PH~3Gmj~w9Te{dim2m}IyAcAck6a)jo z1^c8SKu8b@gcj^zh5=zgI1pa2du9X>5kvx!K@<=bL=&ur(LoHsj(kiIOR%cO7OXyT zKwJ+u!SIfSRBds153Xx}YAY z4;p}m!d4%-5oipWfTo}sXbxI{mY@}AEu8m}+km#99cT|afR3P(V0VempbO|Ky!4T~ zf$pFO=m~lWcKhlL`hdQmALuUx_BX2mU?3O-27@7BC>SQh^_vd|Bfv;73XBG0z*sO2 zj0Y3IL@)_V7P9-DP61QFG%y{^05icXFdNJPa|Jte^T2$t04xNHz+$ijECtKJa>1^_ z6=0=cM}C!H*Vk&W2CNnAdtV3EgAHJ#VCVBDuo-LtTfsK49qa%*!7i{{uo~_Gd%-@i z9~=M&!69%M905m#J^mX!29ARh;3PN&PJ=VxEI0?w3qyV63*aKS1TKRs;3~KVu7exk zreI&wEpQv$0e8VYa34GX55XhwSg;HK33v*gf#=`_cnMyC*We9!E7%?B9e58ufREr4 z_zb>)uizW_F4&#_2lxqof#2W{_zV7l0I&Xw<3KRbwFKE57Y+@Kts?7GzLvTQ^9@*n}Oz_ z1!xIcf!3f6Xbakb_QL0&`gS^ij-ZpUCYTm=23$V5?x~#x}4W>;OB#F0dQy0eitduwN+R58VN95F7%B!4Ys290SL}32;)d zLw5?C7H<0Q^b9x)&Vlpbf?!wEMM^FSb`UOuE8wbN`??0M3rqdJZh)JDovXLNZEy$N z6>Jyxz~nnrpTQUK6?_BV z!4L2g`~trPy9WP&zu+GT@cO@X90&*kfxsXL2rAgO6AT0gAwWnF3WNq>Kv)nCgcs}@ zi~u5nNFXwZ0-}OwAUcQvVhVQWj|F0bI3O;FC#3S1ReX>DBm{{-V!^J#Bp@kB29kpm zASFlzQiC)gtzcJNI*=Y@02x6hkQrnFSwS|CU9j^x2gnI>f!rVu$P4m;{Gb3RDA+Yv zNU%FVVM>aCqM#Tk4oZNMpcE)ASe?s&vY;F&4=R9)pc1GIs(`A3U4zv?bx;G;1hqhI zPzTfn^+0{Wu9OC#A!sDn@o7v+6VMbi1I-1ymRo?9ENUfKoYs`I0c}A$&>nOE9YH71 z8FT?%K{wDH^Z-3UFVGwG0euDg2K#~jU;r2h27$p~2p9^6f#HH3gb{+Bej~vsFdB>j zW5GBu9!vle!6YylOc89SQz@B7$#gJ-MKi%HFk5);|Ak?WFwQfz4nG*b26R?O+GkDQxz2-UW7p zJzy``2lj&l;2<~z4hzG4osWQ{;21a#PJol(6gUmefV09`U*~h+Jh%WZf=l2sxB{+% zYv8)j#@G11ra5K*||OCqr-vXIEfi2|YuE&V#t zKy)F5Und5LDdh1bu|RC0yx%I0kl61lu3*)O2jUBP{h|aQp)l8Pl?Wsjs`VUeS z9;go*fQFzEXe`*3(gZXG%>+9kn}ZghC1?d&gEpY8U{_o_&>nOE9YH718FT?%K{wDH z^Z-3UFVGwG5$yWv3;GFm5%mWHz(B#S(?MV`7y^cZVPH5I0Y-vRf*r%rg55X9fU#hl zV3+xLFhQ^z(L^u_Oa@cHRKc$IX<)iw_n#SHCYS|ggE?R>m58MY2z(eo|JQnPLKLJk#JA0pj=imi+DcH&O z3cLny1iKvGf_LD(U?1=U_y|6M&)|z-w}P+W8~6@>fS-arC;S4x!5_iC+`r%-2=JEY zA0edwp${kw_P_6eKw#ltK$QdmK|wGO9E1QNK`0O!gb^P4fMJDmfrM}%yb!~eL;w+m z<9_8xATo#oqJn53I*0*cf>3&;wxf$Sg$$O&?R+#nCg3-W>dpa3Wc3W36) z2q+4Qf#RS9C<#h|(x40|3(A4=paQ4}DuK$N3aARIf$E?Js0nI;+Mo`o3+jRTpaEzI z8iB^331|wMf##qEXbD<@)}Re&3)+G9pabX#I)Toh3+M{Ef$pFO=m~m(-k=ZY3;Kcn zU;r2h27$p~2p9^6f#F~T7zsv!(O?W13&w%*f{h=X049P-U^18jrh;i;I+y`wf>~fT zm;>g5d0;+R02YEpV6k9hoR@&5U>R5rR)CdY6<7_{fVE&9SPwRUjbIbl47Px+U>n#D zc7UB=7uXH&VloSja$C} zE`m$oGPnY+3O4Nh8n_N_fSceJxGmUl^*i9M@c;4e;J)x&nF;|P2sTyhLt%@b2KJHA z*)Mtwo(KUGspP3(Q^h_5&xO8zs~6yJV0zJhPyJNN;9f?wb__yhh5$9%WWKM>&Eerz=5CKFKtj>`@WEMpMQ9(4}m#;>25Cg;nu|RCWj&mHrb`e*wPZ5uG z;tT2gcaZ=j6r%W&M8bTJ#6nY#B*Gw%q=E%Z29gUFIfY;WQ-V|=HAn-}f^;CgV39Kj z7BC~oBv>^v3s%D{AS=iQvV$BTr(ho^7sw6rfV?0d$PWsDf}jv6ELg>gfTExnC=N=1 zlAshQ4a$JBf*p-=f>pjes36#PQ4v%El|dCy6;uP&1)IyF2B-;Yf!d%Bs0-?W`k(=5 zDA-&UjX-121T+QBKy%Onv;?gLo8h6gV0CT-+JbhVJ?H>Bf=-|_=mNS5HkU;=&>i#u zJq4T7pcm*3`hdQmALuVwod#TwHh_(S%|@~bYzAAvR% z_yj%+)BILnz*q21=;IfC7wqHw06)Pm@EiOAe}yQ1^M4?~`~OND2q>)aMS?{ad%o&i#@D5dcK@n0Y{NCVP> zbRa#*05XD1AhTe(#90J;w9X2$f$V~fVaWk<3if243*;7T#6cdASFm@7e8Ox0I*?xo z;a?&OfP#X(DHH;Q1$&z)0*VUu>QM|77i^}Q5}+g~1xkZ5pe!f{%7Y4^qF`_Il|W@s z1ylvqKy^?9)C9FaZBPf)1@%CE&;T?P?ESP6XbhTwrl1*U4qAYgpp{?~*|i33KwH7y zM%#h*g1sSj5Nyh|j)J{Kb`tC>=nT4muAm#}4tju|g3TM>3-ktkKwr=g^algLKrjdl z7HpQeAz&yN28M$XU?dm?MuRb6tYGimcYXW`LPs7MKm@ zfVp5Em=6{Rb`TbVMPM;lBG@c^OTjX*9IOB$ zf}QGH1v~4uf$d-i*a>!l-Ga5Z>;ZehKCmAg00#v-u@8a6;0QPhjtO@19~W$*zY~HT zgp=SDI1SE#vx3bDb`G2e7r;eu30xNJjJg7@f@|P9xB+g0Ti`ah1MUj;HQfXE!2|FR zJOYow6Yvx~1J8vk{{QG-fS2GEcn#hNZT-q`!8`C?$QM$JK7fycMgAlN^NT(Ui~Qza zgpnR!!8h<7`~W|Nw|?bc;J1+5m;3>L!9Nh-!++~I5Kyqa2LgdX5D-+bss;nWK?o2M zgaV;K7-6@sSXdAaga;7>+eJhnkv}Yv1p7FVK@_2ij}uj}0~JlM%10OMXv7d~Uoiz+ zITnZw;()jy9*7ST2v&`RAQ4C`*bwq0AgN%Jq9hY+w0m;FW`;>2*hu!2l%x`D8uQeG zO-PeGV^f=vjMQLqVNGJ(v3jgij+vI;g!Pd1QUu!+rc2sRH)PLNBm zG5fg%n>qgw3HCQhg@r_#b0A<5;k5s&prS%^Us6o4|GOzJ z1oI^&1pAwtl7hu4C0Lx&g0-BK0cAlsP##nO6+tCX8B_sP1)KM>8mJCxfSRBds153X zx}YAYFIZba1JDpO0*yfv&=fQS%|Q#$Qm{6eR-iR#1KNUipgrgSI)YB1vtVs9T|igR z4Ri-RKu^#M^ag!EU%}c6`hosn02l}c2{xnVU@!y>1;fB_!CE{#xMSe?^Sl8%z}lw<%I1Mp4wM%xSFHl5C}i^IMkP?0MO7%NN=Y?Js#8*flA1ypAEy?m4eEfp zpq^kEZuLO}7BvKoKx1KxkK6<_73?@Sqog@#!J?Lww4$UnC2c@k!BWfGu}*uzjz$L- zbp)MQ)ERVPQCH9nbQkP;?*V!WmZ{rIutdb(g562_2$m|@SFjA^euCW``U{o_JwULV z!$84iMII#Bbj^c>k5P1dh6pw_^iW}e9}hB2usM*23pR!F2w|sRG*Yl>mPZM}{N|$t zi#$fC;!DN~7I~atk;e-bd4gb(CkhsMl3Hn&FD=>O1Xtx(QmonU|Qvt9`8XFJ>=?DyCxEVB6zg^PaW&4P7OY!R%x zVXI)>I@<(mjo&U(he0fS(cU zo%*a`FX`vNd2j(-6s*PLl3=^IEZDpG6~W%Aud>cH!Cum@gBya?=cZuoB)7nA;dXRY z{tmb+jPfP-gykOhg@Yasgs&bCS?3Y!JQgg@6V`bu)QhNz^7;d)_FK#ibp`f zHV-6(_a%V^dz1|Vf`VWmI0ykkf>0nd2m`_jHlIv5LA@v%|0URbG7*HTz9gbx^T|XK z7Wo~q6#*jOfW0(&pHWMC!w$_i8fCp*yPoTg*Lt~~@*GVJT%4r2#Ih|mU(+jrK41z_@DA>L-2^J?a>ttb3R>A(5J{!m`*gwnX z5bRIqa|+*`_MS_yf4a{tqz7%Ag9U3aWwXpa!T3YJu9I4yX(2f%>2UXb2jC#-Isk z3YvlDpap0NT7lM}4QLD6f%c#S=mXW>f$?Ahmml4n9oU-DeI=@gIr_COUDgcI!F*}{Vef_1G%6fC_Vl3=ewkp=6tjRK;w zC>n?kVhGmi7!$-2?C+Lh3)Vdy2gDVuJu{wQoyhSiNg!CGWkQfhu(ry?AcNE1=}i*U;*Hssu{1HmA{syY}95iI>|C>REYgArh)V4IH;?6Z#+ zru$DZ28ajtvzjWUy9P#f>o4{tU1#AV|z;>_$>;${OZmbOd1?Rwd!M`253*aKS1TKRsf`6HHSHU%K9ozsn z!7Xqb+yQsNJ#Zg901v?<@L2G@FzyL>3Z8-I;01UIUV+!(4R|Z~ej@h{yayk^NAOAT zjl=FU_yWFyZ{WM&8=2h?@Du!Eo!{UO_$&A>B=-*l`11eGDd#{y!Rj0c1O`DsP!LS8 zfWbis5E6s}p#|T4=E8umARGt}A_%_M%tZu|Kx7aFL>2rKwTlL#gBTzthy`MUI3O;F z2jUC!)r32}O{C-ge z!QaeXMvzJHKU*%d;O|H-3&;wxf$Sg$$O&?R+#nCg3-W>dpa3Wc3W36)2q+4Qf#RS9 zC<#h|(x40|3(A4=paQ4}DuK$N3aARIf$E?Js0nI;+Mo`o3+jRTpaEzI8iB^331|wM zf##qEXbD<@)}Re&3)+G9pabX#I)Toh3+M{Ef$pFO=qdQ#QrAoH-FdFJ;QM@CAHjFS zxxRw$_jLUP-@)hl3%=*t4G?^%wi_t;envM)@LhFou;4R8+z>Dn3+#U=o-Nrhuu!SRZGa;GaC*biwCuxEWw3m<48oIbbfB2j&a@-P|n@ z{2RSn=ok5;u?Q>%OTbdF3@isLz)G+RtQJQ5U#m4>Em#NEgAHIK*aS9%EnutQTZ!E^ zupR6GJHaln8|(pl!9K8G@b4+^05}K^fy3YkI0}w|^Jf@|P9xB+g0Ti`ah1MUj`b<*7f_rU}35Ih2p!4vQlJOj@K-{0+C zfS2GEcn#iwx8NOk4?cj8g3qsWpTKAE1$+hHz<2Ni`~<(iZ^6#GKj1I;2LgQkZyg5$ zfy3m5}NOfTZ->2!q3ce@Q zg%f;_stYezyik*Rm3F~d|Qf3CipfPmt3%`DTUx0LtIM1u7Xs8Zwzs%1>ex&(g?l{ z#HAH1ayr2xrxz@82Eig{6fANk!6IiCEOHjXB4-sWayG%YoVe_Q?-O@9Ku(Yg_ zUXTyu2L(Vu!DnB)LV{19c7+9>AMT0>J`LLy6@0R^D<=57ZdY9JN!PA~;B&uSNx`Ru zyHbKr9e1S#pQ`Q3fU=+*C=V)til7px461;tg3mm6)dZif?y3tuP2JTHe4e?hDcIg? z3AS==!DpVkI)Z)Vx`NLtcl89@s=nY;J6r?M5Htdf1)m4vnt-OD8E6h#fR=)9&T_2; z-}>ZQ3%+H^wGn(fl4~pY<|Efm@U2F!z2F;*TnE9on7NLEZzyw}1m95RI|CvJ-1TTa|m zp`6Dw;ho2H!RN`i8G_G~aWe&F{7lK8C zZYv)mI%I0#w`_mo{U>2_&gc6T=01^ZiV3UWZX(2tP(=pD#7Q;xYdH)6V?bm zPsXhklqnIwtrJFhtQXFCYyca1I`LQ^~Ie7=LMhf;x2%T;1akj_}mqD1zZ(; z5{tXWI@blC`r>YYo8Xq{UGkOV3FSl7Wu7U zk>3fv56Hb2EY1hPB7YQo*N^)oSme)wMgAgK1dAM9u*fk4iyTw1$gu>A99yu+aRiGT zSMYf zQNgZ)VuJ62bj1bVTk1*(zUR@E6nwv@D<$||MORv|t;z^?HI)_YA}S}?g;rj$Yp{Y~ z*I-2!RTAv#uFRq;f^A+^u*lT}y9TQZb`91L>>8{o_;C}i7N`yCfV!X_s1F)|hM*B> zEci}#*F>nKzq;ubOfCQyDmC|E}$#u2D%G& z?eqXW1-s&Uf!?4G=nMLR{$KzYDEK56HwX+CeEO>!0)`4cWyK8x!@&qJQn0N?fzg8R z*>__EpJ3p|3O=vEjT3zDzZ(xGfQeudm<*C4x_naZAB6uw3woH*N)3DOk()D#04hR|`H*#;p;2ev4Zx_>>j5PVjj$ zZoS|$Ufc%3=gGK@g3pt2n*^UH<2DOE^~G%gTfsKL=gGM3g3pt2J6N<+@Od(B7uYRW z#rA-`f;EEe1N#M^C*uwXK2OFS6nvhHJ0$o#8FyH)t&RvjPsSY;e4dOu#-ihb&y#T{ z1Pgdl@Od)sl;HDZ+-Yz|usCN0pC{waf%AgTlW`XWpC{uk3O-N9T@rkrjJquOJQ;UI z@Od)ss^Ifv+%>`H$++u+&y#UC1fM74ZVEn6#@!Npo{YOK*jaZ6+y(c*eeeK01dqUD z@B};+e4dPZCipxV_gt_m<%M8Z%1gnnrdNW`lX0&FpC{wq2tH57y%l_(jC&{eJQ??1 zSQ20O06q%)e90%_w#R4TtH&3?j~a7d1wTg2eG>|Md>3r1AFT6JupY5r;J4t%R=7Wc z^(FlU|5zu$_y79-oZts*xPXG64ci40tUoTW;D=(lARs6R27-eSf>k4=VEt&Jgv9>i zgchtCVL({H4+C-G1V7fyg%@n65d=RT#6=W3`pqK=)jc8$evFulB82oMQ3b1EG{O4g zq6^ku7X!ouu|RAP2gC*OKzxt@BozD*JeLS07W`N|mqhSm@mx}2rzS#l$%M-u$pt?a z&!rIjSUi_f@MG~@D&eh1YQZ9>0ciz`oKCRF=>?0NL9oaf1&f?Xu*jJOi=0KU$XNxS zA?dOSJ`K`k7kq}K%OUs-NtaXbNslg<;74S*+=3sz;qnOfbCXx_8Imra5G09^U$Dpp zKtWJQ@MAq(VZo0FaYaB;P)xYs7Zn%$2oYBTloaghE(J=1GN3Fd2g-vApdzRQDht+0 zQ3X^Lti!RI;PW?Jb-_9%YY5f_SyQn7%37edU>%Ni1Y5bTU{AUA1V5nO)ffEuch^9$ zXWE8>A9L**34VOHYb^M&+pdY=hljhSg0%@Z6Z~*&*Icm3Ed-0)Qn1La1dH67b=n9P zxvgN4+X)uAJ?nH3Y^#obQ6TN2lVE*PodxT+>LU2jg08DzeOuiG>%i(R_;GfwhhW`R zJq7Fb>LpljS8u^K?;}_zS6|`({a=FhZS@yyrvn5(?#~SrtUiN;hkh4>1&cgHu*gFN zKVroV1H%PB^2Lo1{KywKQt%^R+$h11d~u^G86(){W5GBu9!vle1&cgMu*j1Ii#$cJ z$WvJ~O|Zz*!3;1{_@m(@ZkFH&n7G-3AC}_gfVo06|1LZa%oqIl6t_Ug;1?|vZ1Y8| zvskdmO9VgQ#VrNPz;dtxtOTpTYOn^Z6|7%xo!}F|+|GrW1c~)+dU{}g! z!Dm&uErN9~ZWVksl-nlwlqa`cus-@7U?i_zr%6pWqkx4gP??g7r%O0|9>gSK>fG5J<4+=fEHc2nvFM;2;DD z2||I;AdFzu2n)i2@E`(+C|JK$BoG-y0Z~CT5FNw-F+nU4Td->|4u}ilf%qT+NC*;v z#2^Vs3X*~3AO%PXQi0SU4M+>pf%G5)$Otll%peQM3bKLhAP2|^a)I0+56BDhf&8EV zCHb* z&;#@Yy#%{&^ag!EU(gTq2Lr%BFbE6=L%>il3=9V&z(_C(j0R)CSTGKZ2NS?VFbPZ+ z?00Yqm0kz!31)%WU=Elo*l)@_Fdr-c3&A46`aKteC15F729^sJc?DPrR)N)E z4Ok1-f%RYm*eFT- z6|A}V7&s12fRo@9I1SE#v)~*!FW7I&1#l5u0++!Ra1~qw*TD^N6Wju~!5wfH+ynQ) z1Mm<$0*?jDIe8-3W7t!{zSC!dWwSgNESu$pU^yo*1DeXB&m# ze6elYHk&kPn>23R*p1!BXl&cIZQHhO8~;B0@4Z%5*0l!DyfbI!J9B3CyyG;>Gr^gY z=YlK05M24C;L5KASAH$H@*BaG-wLk$PH^S-f-8RzT=}Em%AW*R{w%oi7r~Xk3aMClgN&IhjO)b25nqr)!c3 z&dDSd9PLO3l7kc=B}gSW5RzJO^d${Q3(|q~f-7fWNJhaqnM{InGMNSEWU>g($z&Cr zlgTDHCzD-pP9}%ooJ>x^OV0&zgFGNF$OrO+0-zu$1bz|%{W=B}7MznQA~+}Wv*5%_ zQNcNxVuEur#RYGc5`tU!i{PBhuZ;Rl@ZaZ>pp@V=%kP4NE~NzrOUelT%U>3h6P#u# zFF4IoL2#O-qTt#85Ik2U!Idiu&dF2}oRg_4I44t0a89PW;L0@wSN>CQ<(h)yF||N# z!IkR>u3T4e<$8iE*B4y5f#B6?C^#O|2s9R)W@!SN3eL&=B{(P3OmI%7x!{~k3&A;= zmV$FKtpw*}S_{s}v=LmnEodjWa(ls*I|#1aQE=r>f-C;h=Uy4~G_~Oh`Ak0PYG`0=OqQCv#tLn&pAuoXkVP1s@5{$vhUElX)WS z3e5gga8Bl#;EA6L&dIzGoRfJexbiEec`Z1^@&>#G@4$QT0el3Xz-RCUd3WOG%lL-UDf^Z-_h#&;|lL?9lB7w*t3WzEMdYB1{2BL!) zLZBC#pqL;Qhz;ThfqrR%;(~Y}zTiDPf#94>LXb#s&?PZLk_ZmNBn8Ppa*zU~6g+z> zkQ$@`X+b)W9%K-llgS7&fy{!>h_ZmJAREXo_*5i^;4_e%49O+<3?#SUbCNtDui*2j ze1gxT@(VtXDj@hQr64FI_;lqb!6#;gK@q{{T0aXu$tf!MoUIrrF1Upy1fRwI0)7R* zfs%q7Rto$MN(*jk8Bi9K1LZ*lP*L#e`~fNnUW>}0ir{sx3aSa7t2(G5{6GH;YJysV z3)U9A5$Xuu2z3Sjny3frg9e}>Xe9WzLu1ecGzEWwW`Zj>7yLV=h2Y;QEd~EhX(jk~ zN^3^75&S!)t>9&~6Z|`+z2M&|9R%O>?&=2$n1HeEb&>>9FAR*A7OweGVYyd-qKz}kp zLxn&WF+szGK*usc!vzOsMhK4Cj1-)c86^Zdx(OOBI43hka2#c<;GE1j!8w`nf^#wx z1m|QX3eL$)5}cEnEI21KMQ~1Ls^H4g1XrFexbh6aIhmP)b2768hiYaE&dJOHa|O>n z56lM(z(T=GUnIEAiv<^4BDl><1-E&b;5IK8{-6I5+~$>nceYi6_p#N2_oy{sEm#NE zgAIcBv5jC8*ep0Fvqf-DW~<}WG)EK$y^ki-?#)WgDc=FxCX9+8{nqkX513ou-k&K zKi>g&1z)heCpfcopHUA4C!HP&PE|b;0-X*8J!aGs!HKD-f-_Xlgg|#jLC*zOejx<< zH41vkkXM4^Rj&mHx84YjLB17S@SPCoEj;MG-~`tP!3oKaf)iYy1h@G!_#!y3^;K{d z>zm*d<#)mB{zGtZE7;fnRxn8LsNjOz971sAkcG)pwWX_n}M(=0Irr&(eOt{e-*7F;=w;L33YSB@vR za(uy+69}%HP;li$f-5H$oV`pUI46@-a84$f;G9fy!8w@}f^#w{1y7txa84$*;517b zMx_;eT{Im?4>Ev^AQQ+8vVg208^|s=CzAu@1i3(NkO$-i`9OY902CDbE3%N_pPWAl z{>fQb@K4Snf|D~p3;yj{RPfKqV#4s`+Ix!&{t;S2aCqPs!FQ#94U7upTYeLKSGuI& zyV9iu=VX2td{?@(;Jeag1mBe|EBMZJIl(!Z@`5W@U{poHmH!Z2xsu?@l^Ie+aOJ9k zD_0X-xjLvJII{Am;K)i%Pz%%sbp)qb>VkTLb29Y>r&$^>q@m!yb&Wt{&;&FEe}QJ8 zIcNb|f>wg#D6K&o!D*JZg3~PR1gBZr3r@3i038L--U<8-{t=wg=`46_bP=2y>MA() z(@k({s5|H(I5pH$a3ZLe;H}YHaJHw9;55s>f`cx71;<+YF{HoXoXh}*3q1P`0C08!Ks*uf-`251gByq3%>9&Mev1} zse%uXX@U=s=}a>N%oKc1I}6MPbHH3M56lM(z(TMHECx%!Qm_mx2P?ozunMdOYrtB; zr`GGhdawa(1e?HSumx-d+rW0P1MCF5z;3Vy>;?P4esBOB1c$(3a0DC$$G~xL0-OY= zz-htPWX=fsbEy2Y;A=AH1YeUmFZi0w1;N*3E(*RTb4lS<^4c@Om)D*PzB>0p z@CCq^g4_HGyasOsH{&gMCwML1gAan&;v@J3J_|n2{37_2?<@EQz6(AH`~iY}`)^1P z2o6FBE*Mg979tb~4Z?u1ARGt}B7le>5{L|?F24dQ^fARdSh5`cst z5l9S@fTSQ9NDfkflpqyI4bp(LARR~#GJuRA6UYp*fUF=J$PRLVoFEs-4f24zARovN z3V?#35cmlc21Nuvq5resXZDK56$GE$Rs??tKFh5n_zbo(r~;}AKFh5JstZ1+ zts(eK_)o#7yEQ>AP+RcXR~^BpPjv;Kebp0u_En!z4M0QC2s8#w1fSP66`VQw3p4}G zK?~3lv;wU`8_*WC6Z~tUJ?H>Bf==LX!9O(q0i8h?&{gnnkZyw8+#U1)JwY$f8}tGH zg1(?1=r8!xXaE=}__Sw`;85{kMhy`HeccBQ6`Um=CV1lEf=`V`fRTd#VviDh(`2;Z zzv^QIe<_Rw;{^Z39xwP0{sh6dbtVe_gFi{|U6{#&XP*M5f@y;1nl5;*8DJ)u1!jXe zV6NaVg?V5;SO6A+MPM;l0+xbhU^!R;R)ST6x6f+9Us7wpTCfhR2OGdf!CPz-*bKIS zt%AQ;w+a4Gwu2pDC)fpc3;u@P1NMS_f-~c!%_)|V4_%l5Wj)0?r`;$2aj)N26 zBsc|5gEQbPI0w#y3*aKS1TKRs;3~KVu7exkCb$J|gFE0ZxCico2jC%i1RjGY;3;?p zo`VrcTC5bXPZLxMnX5CVh*p+IO5 z280y`1}cXG;Xwot5kwNI1SXCQqJXF%8i+3Va%coLX?@ zG$5_u%ISnLfu^PxTsebKCom)xVxHzWi8N@I}iaf-g4yEcgOxQNfoniwVBw zSzPdg)g{0$;8*Y)C@J_c>Qdl$P#Tm0Wd%oZ%7OBNGdUGNMdAPXA5ckf@TM}TA~=Cl z6;urfL5S2Xam{`-Yo3|uSI*oo34Z4@KQ(6N$}OnzrjDCGw1@kf^MKY=mC0yUV^{l zdJFyn>Ld7@@n6B;dVK|-74#GQMc*F`5d38~5DWr?g>!*N6o-JJU>F!K_$mGofciJ!xj2GN{!vw*-H%tVRz+}P6kST)m8&d^`J*Ei`drTJ`2$=z9f>~fT zm;>et?kQrP;L7s_XGInWPKGQLoG@7g7K0^VDOd)UgB4(<;LOP?!If7FPP42L-1xPE zm$goCPG-H}72F^=&9YJO*4QMt&6@>R-Xgg2R>76G39h_daOE9>H{DLbm3IlQyj$?P z?-5*iui(o21XtcKc;W-#AUFgLgCm0b-#7}6f#cu=I4OAFI0a4%Uehz+EI0?wgA3rI z;63URxGZ>UTme@FZ{BO*I=BID3SRmx!Rvk-+yQq5*SQDog9m~)-9zvQJQlp2pMa-= zcm8LBcgW|0KY|zFC3pp1gExX(_!hha@4*M~QSjFI1U`c=;4Anhcq4oVKR~b_|Ls3P zAh_V2Ed&S&LV?gA3jqf_(O>=_(Mq`cz;ePc(WuDJaJ;d$3+ssO-(9zYa|278I?ltZj+KxsRYlST5#nw zf_IX%f(xb--1zi@n~?!z1eri)kVSCitRNf6E_ffy0dfldw#o%^gFGNF$OrO+0-zu$ z1b!0cCDnIIVNgWa5g78ba5aFUf_rZ$Cb;*8;(~i`C?R6H^HYpB|$0hJ17mx z2tJ`I3(A4=paQ5UIL7t|s3iEglFFcp;9Oi)P)+dTB-KF;!QYjC3R?nStThFvS!#jW zpbn@D>Vf*80ca>VbJ9p~=A^OU5JD5d(S@dr`b%&cp_$-VOLM`omKK7;3@rr*6fr()`9hc&qX(YjbIbl z47Px+U>n#j_|V${b_)Kxu?y@5d%#|>59}9wEFS;|1@|d;2pkri9yucT7vfRDKRJ(q zaISEcN&1u0uLeGG+;GE!Jk>>^1xghvw=|#Z{y#y``Uc?o_shF#Re{x_!sL9!M|8<3jW16pPyy>0`UauG6rQj8OCAiLO!M~T^2>!kNR&c}Kf%k$Z{vf#V9~t$D zQJ)3R{zY)(zY3oCo8a~OE_f||2yT3^U~&JytRTTdf`br@3MqKKLJ3~e&>#$>!U|r~ zaDtl}UhrB(U`Rv|N$}?$S#ZOm2%b2q;H?o&aKY$;Kgt+_KgyVbCypg}bz%$t1a*D$ z|64w;;5{Lp;Lkn2;4j|*)oEFi1k=dH4V>>vloDL5yb3*-iQKwiO5pXCGj zK><)uaG<&n_z4sSMFgjUe+ETCF;HA^47&vQ1^fzr6P%+i2}*(AL21F;u#Di1P*!jY z%L!gYdBJrm2;P_#1#gW%1g~->!ELTA_=Bq=IOtLpR1=(&sV+DtQ$ui0=1;*nnVL*f zOYrQqK^;(6aJO3ZKz+e)+i3tA3hwi&5oj#9U#upeso?Ig{sPSezfGpO;EuLh2p0nV zVzm^i1bPXvf2vnJFA`G4!hb5?r5un;NG-4f=+^a68jtcBe*ZG z&Y+9nF1)&eZi0If>kfJdj=uC19ERy7I49FvaB`-P;K0nkg41Gs1*dEJ367Ta7o1ER zAUJ+DQ1HEpL0~W#0)~QNU^o~7MuJgbG#CTMf^lFxm;fe%NnkRV0;Ym#U^59|jAz(H^b90o_gQE&_#7kt;_1ULy!fz#j&I1A2!^WXxwDEJo1 zC2$#B0aw8_a2?zLH^D7%TX6L54!A2gdUsE781FuKAUMnSP;lPwk>I@FWAH?9%UKw801Nu&emK?aZ!WCEE%7LXNW1K9s0jW5l|W@s1ylvqKy^?<@G<0(HLBYr1A#fNR0Y||xa2%WfC&4Lj zTJZKc1I~hT;5@hhE`m$oGPnY+3f|7wz;$o~+yuA4ZEy$N1^2*xp;e%-`v>45cmy7U zC*Ub~2A+c#;HBU;zXGqp8^Is$TksCN7kuP?03X38!GGdD3qA(FfUn>i_zr%6V8Q>J zD+mM!Aq0PLAqDRnp+IO5M)1?PkpiRysX%Iw2BZb)Kzfh?WE7m=$OJNj zEFde$2C{=3AScKLatrRiB@f68@`3!I04N9wfuBHOP(*NFF+YQ%pcp6)N`PO$ui!UO z5|k3$56thNwBTM}$_VcDrL5pSUdjnC0{zL97u=sr1;M?(R21AH%pZdLlc^-Qa%E6O zaOJ9kD_0ZTpGXJ?oXz^;9g%E z2=4Wzq2OL$8VT<8rLo{%Uz!N+Po}Bh%71}og8P$c&X5+MC1?d&gEpY8;AOQF99(Y? zI)IL#6Zjka13H5)peyJmI2+$xaQ9q2Ku^#M^ag#vzk+A)3;KcnOfvus1cSg}Fa!(* z!@zJb0*n-#-XFz~(Sn;XM(~Cj3&shacs!T@CW1*|vf#%7rhut}qyE#tbT9+V1hc?w zFbB*P{CvSY!4DD42MfSLum~&`Jl7Ji6f6VF1wXK`LhvWJQt%>HF={nf1J;6dU_ICX zHVS?MVw2#4n+0!;EnutQg>D1e1<$nu>;$_6e>%GbKT@%WA$!3-M(qa&z(H^b90o_g zQNc|;29ARh;3PN&PJ=VxEI0?w3tsmN;3BvLE`uxJD!2x&gB#$c;OnBdz-@2`+y(c* zeeeK01dqUD@B};s&%kr=0=xvTz-#aZyan&Td+-5#1fRfX@CAGY-@td_|M_PSEX039 zf?F24dQ^fARdSh5`ct) zuQ4V9i9r&O6eI)5K?;x(qyni0--Ss7(t>m#J;(quf=nPY$O5to?pP)p$PRLVoFJFr zZf$adJRmQ~2l5N<#HIi!2nvCpKw(e>{0xeMVxYL-8&4&`FW^`38z>1%f!{%CPzID0 zyq(K|@}L5!2>t+-KxI$`R0Y)p_qcY%_(+)nW(vNII}6MPbHH3M56lM(z(T=oUIZ3{C15F7CV0~= z2P?ozunMde+~zf4Em#NEgAIcBmW^N&*bKISt%56W1KYt4uoLVOyxZ&sd%#|>59}BG zcjEv!2o8b6;0QPhj)CLg1ULy!fz#lO;6Ev61^)#&C-|s5FSzj+1aJ9^f_JS;g16XZ z!EL@G_%Oc;u7T^|2Dk}sf!p8?xGVVRz6b7u2jC%iB)IX9!4vRQaO0l|Ua#kZSNR2a z30{HM;0<^S-huam;|(9cN5Na;6Zj0ifUn>i_zr%6U?Kmj69j?_?!zqv2nj-g&>##5 z3&IKhD8maraw7=-1S1N*`yUBJ22ns%5Di2ZoDhg1I5QAaaOX3zKy1OmfH)v7hzH_> z1Rxi{KtYvVv?NJIDcY z3T|^QkQ?L?ybbe$d?3Hzltlr-%PJ^%s}>Uc!Tlt7_QIeD_!$%h#XxaT0{jAg1-}Vi zdPz_U{0>TkGJ;bdWkESm9#jAo1^2S@2dE@?%U2ehFsTBnf@*@dVRcYLSRUxk=ug2- zttogz)dICa9Z(n41NA`z&=52NjRkM{CZH+!3p4}GK?~3lv;wU`8^L{9v<2-zd(Z)N z1f9U&;2+Q#bOBvKH_#pQ06jr3&>Qpt|AM}tALuVQ0XTpm1Hm9L7z_bJ!7wl!j1YW@ zdn7|f3BCm|njvGrSTGKZ2NS?V!PlQBF=R5B0;Ym#U^ zun+792f#sa2pk4Sz)^4v90w=BNpK3B24}!oa1NXY7r;eu30wwOz*TS!Tn9J6O>hg` z26w<+a1Y!E55Pn42s{Q)z*F!HJO?kpOYjQ325-Py@D98OAHYZO348`$z*q1Md3 zuu%W~Jq!ZDK?o2MgaV;K7!VeO1K~jg5D`QIkwFv?6+{EkK@1QR!~(HF91s`81Mxuu zkPsvSi9r&O6eI)5K?;x(qyniy8ju#G1L;8qkP&18nL!qi6=Vb1K@N};2Nk1;s#dPy+k{eg(gQlAsj$9h3%TKv_@@lm`_+Meqlx1S*3n zpem>as)HKfPf!!o0<}RMP#4q#^+5yB5HtdfK@-pv`~{kU=AZ>=30i^HpbcmX+JW|< z1Lz1kfxp2&pfl(Kx`J+?JLmy=f?l9E=mY)*eL+9a9}EBk!5}ag3;{#IFfbg903*RD zFdB>jW5GBu9!vle!6YylOaW8DG%y{^05icXFdNJPbHO|?A1nY1!6L92ECEZwGO!%1 z04u>Nuo|oZYr#6O9&7*`!6vX7Yyn%rHn1J+06W1hup8_Fd%-@i9~=M&!69%M905nc zF>oB504KpIa2lKeXTdpe9$Wwy!6k4RTme_XHEX|058ES@EW`UZ^1k89(({F!6)z;d;wphz6pA7$7Ey1!99ZATEdp;)4VrAxH!ggCrm+NCuLF6d)x? z1yX}FAT3A-(t`{jBgh0YgDfB`$Of{593Usi1#*KtATP)V@`D1PASeWW0);^l@G~e1 zih<&w1o#E~3Vs76K`HP%C=JShvY;F&4=R9);15sXapLACZH+!3p4}GK?~3lv;wU`8_*WC1MNWv&=GV3e}jKOXV3+71>Hb* z&;#@Yy+Ci!2mA~A3hq0iALtJTfPr8T7%cco*AOri3%j)F5o`jR!4|L;Yy;cD4zLsK0=vN;uovtD`@sQl5F7%B!4Ys290SL}32+je0;jt+-KxI$`R0Y*Qbx;HR32K5`pf;!j>VkTpK4<_Mf<~Y* zXabsozd$q49JBx}K`YQ2v;l2FJJ23<03AUm@HhAebOv2OSI`Y~2R%Sf&@Ag9TtASOgY>C15F729|>rU?o@uR)aNQEm#NEgAHIK*aS9%Enq9y2DXD8 zU?%_yj(K zFW@Wq2EKzIAXr$=e?V{$0)zyiKxhyKgazS1cn|?Z1d%{w5Cud9(Li(%1H=TeKx_~P z#0Bv{e2@Sn1c^XmkOU+J$v|?D0;B|~Kx&W%qy_0fdXNER1eri)kOgD~*+6!X1LOp` zKyHu+C;{hJz7cBp3xogE3&N;3xRTf$?C1;HT;) zf=OU9m;$DPX<)kGY|jiZ6U+j$!5lCb%meem0<(A#b60o3YLN8U;?N6wO??L z;s?M%a0nb0+zbOd1?Rwd!7t{xAb6E83SRmphFoTv zE8r@)2Cjn};3l{QZi74EuHc2<1NQ|l{ej>O{t!G8yvmOSZ^I{o8~;@BMtH`M=Yl7G z0bYVv;5B#y-hy}FJ@^1V3SRmr@LBL$d=b1$d1ZayL(C^#0#N< zNd>>`DH%u(Qh<~omEhN>rUq$1TEXv}N(a(|3?L)O1TupxAS=iQvV$BTC&&eIgFGNF z$S3%VK0hb`3W7r5C&4RN7!(0NgQB1qC=N=1U%;>6H^FBGB|$0hJ17mxfU=+*C=V)t zih@`04^RnI230^+Pz_WEHNc;sCa48!gF2uts0ZqU2B0Bm1R4uIlW78)g1XY? zEkP^L8ngjzK|9bMbO0SeC&5R--{2q68FUf+33dhDKzGms^aQ;?Z^4V`1O5el1^0E| z5A+8Ez(6nv3u12rv?i0;9ngFcyph`M1p&LNi38LbR&~Qco9HS!Trf36Fhrz!Trgk5Zp6NN=BsusRdU~Be-%}!Trgk z6I?Jo$RM~snT&$_lgT8wKbg#edwt0wxIdY!Ld4i=ST@1^$z&J&Ycz-8-^)1#|EA6* z_}6G|!TrhP5!|0lUcm+Pf&7B|lPSQEf}jxi2^0oJz|Wv4C{44kklmw*&zfS0PP#TmG{JO5Ppd2XAG!;Na@CT>_DuXJZDyRmkgBpU{{3oah zYJu9Ij^I}*)dlrHeb4|j6ug}qfyST-XbS!U%|LU|Lhzo@60{Qh-lf){4QLD6f%c#S z=m|~=?<_H>;k*N9e>!KtS#S=V2N%Fa za0y%nSHM+adElAN}+u#nk3+{pYLdL+v55Pn42s{Q)gt38%pMq!L zId}nH3ckbp3cLnyz+3PRyayk^NAL-J7P>-w}Zoj2p}Se1R{edAS#FkqJtP9CWr-MgE%0r;7>3fhz}Bggdh<} z43dDPAQ?z5cm-2{lpqyI4bp(LARR~#GJuRA6UYp*fUF=J$PRLVoFEs-E%@Wk1M-4= zAU`M|cz-Sk3W1+MVNgWyJEwjIML{u89F!3Jil|?}ui!UO5|k2r{`@;A4a$JBpq$|M zTa^bDKt=F};P;hO68yrf%7Wi`RRvT9)j)Mn1N;eUf?A-q;9r_`KwVG|)CUbfL(m8` z22DUy;s5Xd0?h=!N31z$A$aq)1g!+WfvYuWBlvw}Z9zN1b=rdtpd;u6{uVs@KcF+{ z0=j~3g5NdP9rOS_1%Cv+KySfK?F0S=eL+9aUlHP;C^!a=gA?E+ zI0a6FGvKVyI8g8$I1es>i{KKtEIbd)bp>1n*T8jf1Kbq6Z`=a6!5wfH+ynQ)1Mm<$ z0*}EH@Dw})&%q1u61)Ph!5i=vyaVsS2k;Sm0-wPb@D+Rm-@y+MEYg45CkO-wAp{>6 zAweh*8iWC11>boL2f~90AR>qaB7-O(Du@Q63w~jG3=k8<0)IAu{C)Bt~inxGb_4eEfppdP3%_(*908iGckF=zssg1XZ7 zyl=Dwtw3wg2DAn3Kzq;ubOfD*yb1KT_iykI=nT4muAm#}4tju|pqG$1P`Nkg1O5el zK|jzR3;+YcATU_)F*pPa1;fB_FanGOqrhk|28 zS_CT305icXFdNJPbHO|?A1nY11@9Y+z+$ijECtKJacJka1a~F#a0lEKyfyBD```h12p)mQ;0bsN zo`L6rb22Z$OYjQ325-Py@D98OAHYZO348`$z*q1Md3AUfg}27%y$gDxRJNWp2A zP=eDep@njRcuW}KMF3$1$6CS(o;|$aoJ<74IhlxziUcAHt{g>h<*0&lGSLLj6&=J7 zoRf(uI42WJa84$+;G9ex!LgROf^#zQ1gA&h3;GuC>=VVd{o;W2)1yX}FAT3BI=wGm)^!nc|%m6ZiOdvDJ0W@G~e1iV6O7ih~k@_l;k`ui!V~ zMW9YePzwAGN`o?>EGP%cg9@Oc;1>P?DuK$N3aARIf$E?J_!HCwwLoo92h;`iKz+~v zGz5)6W5FA$31|xb0?j~k&;qmstw3wgM(}ak7PJHHK?lJHT1U_c{0;sAok17DpI}$e z4Ri-RKu^#M^ag#vzo4(+KL!0je=qF~4S|_{= zOuQa!VAMvzZQdlf;AX+?*&=vrY-PwcuwC%PJHSq`OYpLGgFS*9wioOJ`@sRh1rG{d z=pjZOX4DaI6dVJ`!3n{i=}E!OIK`;bj5@=pvqJg6=XH)D=Y?j0Ar}O<=c3^4bBSp# zGwO=qre0;#HHKVgnj7FIqizWiJO$5~ z<~c)NfR}=s@d~_V)En>?yaVsS2k;Sm65O88fWwhyO1Zaoqq`4hQXr5 z4VE;piv|f^<=}$XG=$)tKcwJAgc7{Up&1fJaGkJ%mmW^=M;RVO5L_ps;AKS;Dg_oA zS@1%m2wp@~!7Yp?xN>yC?TI0H;+TSWwpfgcErbuPf^k4x5Kr*L@dYn5f#4P<6x^^x zOp{pf3MK(bK{CNDOfI-i3WlT<+|*Qp8=qS6)=0xNX&I7E@FLQK41(v%2r>y?R%XGK zvj|@Itb(^jHo>c$UGTDU2(Fw{@G9pLTsgPkf_VftKCj@7kWcVj`I)AG;DQAOFTIf9 zIzKV0Fhhzk&Cj5y;HDN6+|=TNn_5C}!+v3!Uj?`4H^I#)$*5A`cfpM>Ex2GA!4sEd zR5`(IE)OaQZgWM!Yw-s|DhaMrS#VRU2wp^0!F8$$UPN`ljjthiu0I)7Q}A517*d;Q z>M*1(s3*8ieZd={f#7v-D7a1|!5>Ov!Fy&C!R=|vG=B*`h?)s*VRNQw!89!y(h9T| zJaHSrTcaignX8XW|$X-C0xbz+*o1vm8{Ms*h4!Y&Ny%8+h?3w9U0&>jrwDR>dR z1TUgDL;5h}U%|`jD|iw87}8(x#vH(?fnbo}&wa4qg$@zCh@pZD4ij8(IHN`|WTfD^ zMuE|S=NiK_V+9u+$Efj)njrYYoyd?$f+wCV_~V`;xZqU5%bLbC(-}2Ga0_QLY8IF+ zcqf@7xXxU`d&@k*1?LN%eF4)fWYi+T?O7~%LoH#NrGn>L29^t+cm-G~c=uZ+Yz%yr ztQKYm{+O>3P6vjp72L3Of@fdPkPU(tu~G2SH!);0L$-jeU>n#Dc7UB=7uXH%o%YrLk5nTByL#_#~d|hzm8-gp}6g=@Q!3A#%enk3? z;HRGN3QYnJJKq!h`15_i&q_ZK{2cT{!H-ct5<&z%<;TLKz+6uRPyAHyGuO`;@?3D` z7lJFl6uk6Tf-Aok{5bX-p-iCQTfq%`CwN)!g{y(z_#ePWVMt)eCt+a#pM~84d=cIU z@D+R$Jo|U>0|blu->4uETyW(Of-8pf!rVu$P4m;{Gb3RD0C03P9g9UC=7~# zpM@uZiHi!}2*p5gPy+k{eg(gQlAsj$9h3%TKv_@@lo!4Pa=8^iMeqlx1S*3npem>a zs)HKB@ffQ7C#VT(f!d%Bs0-?W`k(=5D71{J%8fu{&;&FEe}QJ8IcNb|f>uKAK;_n; z4QLD6f%c#S=m(20QxbiKNuhk z2&~{hh71yd2Zju0$Ph48I2u`_h6!b(2*ZUtk%SRoBp4;+3`{dx_!^jIjIcT|`&c1s z0ON%F0gM-1d4kX|Fl3@IF@Q;6vJfm#a0-|z#12d|4NMnG1%}KJdIT_2@I~fXV7B0E z-E#zAK%NWcf%#woSO^w@#ey%4F9A!zGQn5TmxC2xC0GSkgEe5S;Opw^zzXR+9yTER+2kZs=zX|051iHYF>fY z;0<^S-hubv1NaC&fzRLz_zJ#(@8Aar7VW?G1cBfn1PBR2fzTif2n)i2@E`(+2qJ;V zf|GJlKvWP7L1e3sIA#tGc6fhM`1Jl6_FcZuIv%wrNSI8Tv zJP*tV3&29K2rLFmz*4XbEEg&UDz5-5!78vCtO0AmI-eZ zUQZ-SE;-v$46_#yZVKUnntenbQb{y7j_@R@lC!6(}x1)tA{5?Ta0p9wAa z6g`aKiNi8YI1pZNP9_3FB7#UDGKd1Af@mN*hyh}PSRgit1LA^sAU;R{5(>UNn@I3g z*~Ee`ASVGynI;)Sk_*1Nn*yX{npA@CJf;@>R8$&}7Ni5|K?aZ!WCEE%7LZj47wF3( z8^{iFfSe!~$PMySy@B=}=gVKT@J}Lvs3T*;yE(gkk3ZNqR15^T)K^0IHR1>`P>YxVr6VwE? zKy6S5)CKiGeIaGw*`)@cA!q~|gC?LU_zN@x%|Q#n+ovUH1zLkPpe<+z+Jg?DBj_af z$+Ew}KcF+{0=j~3pgZURdV*ep|N8Y7{CBJm_!smA{Xl=ga}5yur*a?|1O^NKb2!l-Cz&c z3-*Ei-~c!X4uQkq2sjFkf#cu=I0;UH)8Gs^3(kS_-~zY^E`iJ73b+ccf$QJ~xCw57 z+u#nkE4&S)NA7|9-~o6D9)ZWg{J>mK81huO92oKpJQu13hP(hT!7K0@ya8{)JMbQS z03U@hfoBXq3GD)l_zb>)uizW_4t{`OG5(u9NN~a6!q7m$5FjK71ww-`AS?(6!h;AP zqOdbiITDBrqJXF%8i)>JfS4c_h%NZDhy&t+cpyGV01|>kLY=_IObn8Mq(Zd7sAM2H zNC8rUR3J4-1JZ(YAiaEO=`)0ZqYQpc!ZmT7Z_I z6=)6GfVQBW&^fTm?Li075p)87gMUD0&_(bu*cEgG-9Zn~6Z8^%==BDDz`vj`=m+|P z0bn2)1O|g4f*Upz3-=^FE zHiAvU+Q7}t&0q`ID)_$eHn1J+06T?*f!m$Cz;3Vy>;?P4esBOB1c$(3!3{eCj)G(0 zI5+`Lf>Yo$I0McKZu2>C9$XN7tM?+fB=~;rWpG6(A6Vt9;2O9t_}=jia1-1Dx4|87 z7u*wk$N9eSFz}%~01pL!7LUMV@B};s&%kr=0=xvTz-z&K-5c;0yaVsS2k;Sm0-wPb z@Kx}J`Ubv(AA&!EU@`wg5C|@~Jt06y5DJ7Ayl;d7VL><$9z*~UK_n0vL;(@w{+Akx z1R{edAS#FkqJtP9CWr-U3i|?G9@PT1K^;&R)C2WF1JDpO0%rv$oz8*t-~zY^E`iJ7 z3b+ccfr0V7FgTW9m6buu56>B&c0Y-vRV6@;q_r`#+U>q1PxW~T_$@-1L1*ao(P9bhNe1$KiyV6Wi4ZXehW4uFH; z5I78ufTQ3TI4(R7{DD0IPJ&b5G&lp!f^*98EgSt!8XAeq3wd>Lp#7u zuuE|0Xt&^G(H^i@a13c5*w3f~g6BFYIDK>o92T5eIs%Rg&LbTI#|5X4PJok)Iwd$U zby{#{=?pjv&N0n-!QrI~f-_VX!6imr23G`EzAAW4uYv1=TX+N96z&9Wn%n}n!5zU1 zy(@U#?+I?|eZj}z1Mm<$0*}EH@Dw})&%q1uQt)}gEAU$IDa0G_7Q6%R!3XdWd;*`r z7w{E)1K+_95G=ueOAi9UK?o2MgaV;K7!VeO1K~jg5D`QIkwFv?6+{EkK@1QR#1ec? z5*x%3eA*lr!~^j`0+0|S5`4y(7$gBnK{AkB@V=1(qy(uzYLG_o*F;*74x|SeKt_-W zWCmG4R*(&32RT4akPGAnc|cx}599|0KtWIl`~(VvBH(9G6chu+K?(2+_!ayHN`g}0 zcTgIX0cAlsP##nO6~P~%5~vKSfU2Mxs19m?KS51U3)B{z2CpMHR9si^yR_FM>Z9zN1zmD63 z4xl6G1pWs9fX<)`=nA@l?w|+g33`Fvpbz*L^acGuf5FG#05A{?0)xSj077aT4h6%& za4-Ul6#SUgC@>m~0b{{9!Oa*CCV+`x5||98fT>^_m=0zLK2@6uW`WsY4wwt(f%#wo zSO^vgg;Hy4ECx%!Qm_mx2P?ozunMdOYXqMJt_ADBdawa(1e?HSumx-d+XRQiwu2pD zC)fpcgFRp`*a!B51K=Py1P+5E;3zl-j)N26BseAb#N#wL1I~hT;5@hhE`m$oGPol6 zl=v#R2Cjn};HKc6{}#9n?tr`Co{%zdyWu`~03L!z;IZJR^PYgG;2C%hUVxY26?hHa zfVYC%{0{t&rn?Nwq6xz=j2PHhm>4K3D0VA$V_}t401ARapfD%`{6SGr3={_?KuJ&vlm=x4 z`x00dlmq2K1yB(LfJ&e;r~;~jKu`@-2Q@%VPz%%sbwFKE57Y+@Kts?7GzLvTQ_u`F z2Q5HL&su{1Hm9L z7z_bJ!7wl!i~u9SC=dchgE3&NV9&a7U_6)rCW1*|GMECUf@xqnm;q*jSztDp1LlHx zU_Mv?7J@}!F$e`qz*4XbEC(yVO0dd-^CfUKSOeCAbzr? z*ao(P9bhNe1$KiyV6R|b0{4Oa-~c!X!oeYM7#smd!7;(U1Re(`z)5floCasWS#S=V z2N8mO3A_Lsaf_({$1n?jV&=+u7tPjCGJ&Sn42+@YX?EVXuR9f<^WcEOL6mB4-dRvbSK7GYS?t zlVFiE3l`Z&u*klGMb08vY#=Y#py_2 zQ>f=ufLg+M2epNp4(bS>9Mlzj;t2JGFbDO8RL!bt=menqT zJ)gURZlF8p0eXU7pf~6P`htGK7!RGRzhDa=4-h^$DFcPQ4h9LK&U>Q4!V)KCh+u0O z4;6Mhn}!Kq&Zgmln}ZQxq+rVvk0K=mj27&qW58H2PAKBU886u36ND>H%0$8DGMxk_ z3$~i@6ycjQ3}mWc<3Xkg;ZDkQp}vC|LPiHO1sjbrOX%*T%oZ&2955Hm1M|TGun;T) zi$N$@B3K{SrC^yb$*H2t1sm(JLI`wHRtk|0RtYwWWVK+UNY)6}BYLf1-Er3m7I{6` z05*a!!A6m60-M>iMX*sMTLl|evP~H7ynNX%*eH@6f{h~CDcDf-U4o4w*)0S(Lq+xo zHi~4gV53O(2{wvkzcA6+=YU}2yAQG{92^pC6v<(5giS}mF~K4qC*_1-89PbJDZwhq zX~C+^8E_Vy1Lr{mxFA^Vy$CLW%Yv;3bOl@m*T8jf1Kb3+z-@2`+!ewSseJB%`@%FQ z-=z>L#A$)exK5jyK2QdYI2eAZO zWI49b#Yu@HEOQW7xaA<8U<(At7sfg%?t(49n?SID2?bjTH<4iL=Oz}yot={iy`6q3 z9)j(hRB(4vk_l@aBo{1l3ie4U?8&H2sRZk!;VIY(o2dm`1~H9beLT_%q0Y|fgh&To zg00V(UWny?2rYU%?`05iD|6!6N$!7CD<>k+Tc- z+C2xz337qlAdg_pDlf$_5pl=6agbg2L;f&fqnR2J;;DxfL|1l2%wPy^HyteZ_OP#e?{Y_)>Apq^l>4Ad8F zQGf=5&EelruqpQ&3DyQ13$}9;!5UFh!5UgK!J1xk(1J}Z1#8`{1UsrVXd_tUwxAto z4>|~TijE)%bON10Fz5ohf^MKY=pk61dxBn|H|PWUf_|Vs7yt%>L4rMz27@7BC>REY zgArgP7zIMWXu)pE7{MNuW5GBu9!vle!6YylOcCq}IaRQS-ZU^B%m6dNEWxrd8_WT7 z!92kVVZLBJ9~KDKhjXD|FZ34))?IM1U@!DT1?#A}M6iC9O9kt8xJ9t6-g2wh7k5WV>M9Y<39N zWo4&eJ$ZHs*7;<&U~??&5$unSy@Cy+-Y3|E1N#M=AK-vs!}$*iHu^qXu)*?&1RL9a zSg@h!M+6&%eH0u6$Ax{)0PPdPC_4e@v_Sim>ntzeNO1&jPnu*mNP>k0osu*e?;i~LEj$e-Egi(tKmz6#c4 zz6sV+z6;h;ehAi5ehSu7ehJo6ehb!8{s`7m{tDJoT+;sgPbLa*1yMmX5FNw-ZXhOz z1!4=fQh6K@7sL}fIIrR23%1a?J4hhd+JXrM8=9I(uyM7CK@!0Z_W(&jGLRgk5NzCW zO2HNoOeJ`y)7d?RZVpm|G=hyXPAk~()pUX_0qG^!a*F8%J1T=^U@R%Y#JGV!6xV{3W|Z^padu>Sl^XWptN9JU&?^8f_0B6 zCs^N=@}Pq7z?p@wqF_e_2-f4J68lsJRRlX%Rl)kn1hT0bs19m?nu49Z7Adts9Z(n4 z1NA`z!TQNG1dTvr&;&FE%|LU|0<;9Jgo*kdAEmYM+(8>5mV>s!IS1_oo3pXKU^{mZ zT%8i@DA+`iLBa-S=T1Tc2b~3*?<-ia`M$acHs4oQ!RGtwCfHnF-36QPtA}9oef1P< zzOP<_{U_X8u=&3FkkS|Q1O34OFc1s^gTW9m6but=PSoLo&5}AousKmj3N|O|D8Z&V z4H0ZA)X~CUS6%WL!RACAE7+W<;{@AzJSh{vL@-IP$yz51c8V#2MV>0y*{6Z&f(4ub zW(v2Rx#?zs*@Df9I!CZMQRfOaC+a-G=0u$j76^9uLa<1%ofnf53YG{Kd8uHLmkGA> za={|65G>$IQdW_&TCknh2)|P(&ufKj4%P|f9jq4~IoKd1bAAhN6izxRVZufSn}l4> zrpNPHFyKwf=KWV zyayk^NAL-J24BEe@C|$iKfq7$3;YIuz+d2!?%#cn0$f2<5Di2JF@PJ031WfRAP$HN z;(_?U9V7q=K_ZYCBmo{EDM$vAgA^boNCiAWYLEt`1?hknNDndqZ;%mW0-1pi@C8{w zR^SJ+f$Sg$$O&?R+#nCg3-W>dpa3Wc3W36)2=E6*K`~GqlmI0`DNq`e0cAlsP##nO z6+r-~1S*3npehIi)j)Mn1JneyKy6S5)CKiGeb4|j1dTvr&;&FE%|LU|0<;9JKx@zj zv<2-1`}NlzbO0Se5a=Y>56sRW7<2($K{vsEa&`wj1p9&66Z8VT1^a>72lNH~Kz}em zuphhw!5}ag3;{z0>!30W32AS=770i9+(dnfQ4X@u*q8=*^5D_U_TI+fTds=ST0zv`xRg%SOr!KHbwaw z!Ft`V1?#|iutBi8u@QuUO<*(F0=9x}U_00Wb_#a8cY)nt57-O#f&JhBI0(YQA;Id# zVQ>T-1;@Z~Z~~kJr@(1&MzCge7Mug;K?JxU*dH$!!6k4RTme@Fi+l}S2RFb?a0}c9 zcfeh658M~*Z=VO?A$SBHgD2oAcm|$>7vQB}e{j75ufZGe7DR$~g8fnU9(({F!6(7y zl=}?6fUn>i_zr%6pMotf@(cV1e+2ti?Jscg`j-*~xPqu48i)>J05=d*ur*dIyT7x#AEocYYgASl02m+lzXAlg!fUck$ z=ni^-o}d@#4f=q-pdaWD27rNJ5Eu-G2v*KR!7wl!i~u9SC=dchgE3&NV9$+lU_6)r zCW1*|GMECUf@xs7V0oSaW`bE@HkbqEf_Y#*SO6A+MPM-q1xvtEuna5*E5J&yO0d#c z4c36QU>#TwHh_&F3~U0M1^b}i0=9x}U_00Wc7k1keIV`zd%#}7-W=@%`@sQl5QKw6 z;4nA>j)G(0I5+`Lf>Yo$I0MdtbKpFP02jbTa0y%nSHM+p4O|B|z)f%q+y-~RU2spZ zFM;>L1Mm<$0*}EH@Dw})&%q1u61)Ph!5i>au$B@D-hubv1NaC&fzRLz_zJ!W_Br?+ z`~W|}FYp`u0e^u@`hRhv09V1jBSi(#Ky<-A^3-)Zu0dj&|AUDVZ@(T9NGatwg3V?#35GV|a0Dn*v6cemj6$d3iNl*%u24z55 zP!5y_6+lH004jmXpbDr80zoxU9n=u)0b3K)60B5fgF2uts0ZqU2B0BmB-r!0F=zss zf@YvOXaQP+R-iR#1KNUipgrgSI)Wh333LX*po?JNzPf^LpgZURdJ6XV>IHg(KAQ?4+emNU=SD#hJc}97#I#l2=?3<2}XesFdB>jW5GBu9!vle!6YylOaW8DG%y{^ z05icXFk7&qn*-*8d0;+R02YEpU@-^T-1;@Z~Z~~kJr@(1&2Al=w zzE`W>R61Xf_OSuBBf@|P9xB+g0Ti`ah1MUj;M7js=g9qRtcmy7UC*Ub~2A&I+ z=NI55cm-aAH{dOZ1ng47@l zNDI;dFOVK&0Nx-Y$OJM2AK(kJfULj|WCPhj4v-V%0=YpRkQd|w`9T3tP_SB82owfI zfIlb-ih<&w1Skng3HI-0X;21~1?50_!T$KI04jn2Pzh8P>>t-EpehIi)dc%Ts5+x z-|28L0*nNsKnNHO#(=S492gHKfQeudm<*tRMas zuvM^5;M)Z2*uPz{PU$-Y8&k7Wu%mVf7I3#>L7z z!4bipbw|N5a2%WfC&4Lj8k_-V!8yU6Hs?WvV81;tfQy1XNiGTY__|EW6~Wr_Rd9`c zt_${QbpzZ4x4><12iyhsz^ssM@D@aZ zci=tv06v0G;4}ClSmpl;zJc%H2ly#i(ftCy!5{D!xOnsZ2e^W$AR34cVgNS~6T||s zK^zbl!~^kxJ4gT$f3|nV4>AC6kP&18 znSl@R1zA8=;0LmS>>vlo337qlAP>k3@`3!I04N9wfx@5&@CQXfF;E(-(DuXJZDhLGCKy^?9)C9FaZBPf)1@%CE&;T?9jX-121T+QBKy%On zv;?g{YtRO?1?@n4&;fJ=L7)@p41z%y&=qt8-9Zn~6Z8VTK_9{9X6Xz1f&O3s7zhS| z!C(j&3WkB= z0!Rm81kR9XzIYBOv8{`3bK|YWl6aWQ5Ay60;0sf#UC{5I-oA72kL_cpdn}k8iOW+ zO?S`~Gy}~+3(yj@0rO_Sq06jr3&>Qpt zeL+9a9}Ey|o~40c5Eu-GfT3U*7!F2&kzkZyb2^29(O?W13&w%*U;>y3CV|O=z1##ggDqgIV52g(3D#$OyI_MlcYvK>7uXHrT`~toTHazni_zr#u^P=h$KLs0} z`3w98e+2u4{R><&@%;z5f~X)Ghz?=^HxLuV0kATdY+JU~*A z3?v6BKuVAbcnbElCpAa|(t>or3#11bfH%kpG70t_DKqc^z90+83j9DekR9XzIYBOv z8{`3bK|YWl6aWQ5Ay8Pb2|bDce^3+@1I0lJP!f~^r9l}`7L)_!K?P6|1PHeNP9;zo zQ~^~%pkPb9s@j0R)CSTGKZ2NS?VFbPZsQ@~U(4NM0!z)Ua;%m#D7TrdyJ z2MfSLum~&$pJ0B!49w! z>;k*N9Kuiz| z#0GIdTo4b$2ksyNNC*;v#2^Xq07(U#r6(Ck4pM-WAeCSf_;`ZUAPq<(@6as}o z5#SGsf?}Y!VDrh85Ntk~l7dYmQ%bNoXG#k;!%P`Al?CP4r#$;q5G>CXK>(-(DuXJZ zDhLGCKy^?9)C9FaZBPf)1@%CE&;T?9jRcz>r?FtA(L}IIZVH+SRvOI(n_Z`cU{~4_ zv|^vuf(2{?+Onw~XfN2|9Y9AAB-kzJ1Uj=RSonYbA5yx4ZlF8p0eXU7pf~6P`htF- zKNtW8frU?o@uR)aNQEm$Ym{PXL<2Cxx?flXjD*aEhKZD6}#6WZ?pJHaln8|)Em zuKT^D>;wD30dP>Tat;@)SPrr2uwa*S1RND?e*R;E&7yx?uvzp^2sVrUNx^2(KPA}C zr@~0_?hy`MUI3O;F2jT;FkU+2kPY4o$#2^Xq z07*eIkQ}4{DFv&3semU)4bp(LARX`m=|KkIE&RX!1;_+410TUk%$JlbAgf@P>_}t4AXt?sC|DaT1PX&9z#kL^#XxaT0+a-$1Zyd!K^agM zlmq2K1yB(LfJ&gUV9%&3f?Y*b5D2P)>YxUwDOkp8f!d&sV9$-Zpq^m&t3GG|8iGck zF=zssf@XqcwK-@3T7p)fHE09cf_9)i=pa}QJAxq433LX*pbO{0942FQAU>FzCV+`xl3;~7 z8B76F1#5%Tz;rMJ%mlN*Y%mAR1@pjs!P?*gun;T)i$N$@0+xbhV7Xw$yF#$4z7nhg ztHBzu7OVs7!3MAqgn>0y*h1z)5floCasWS#S=V7p(q72v)}~2zDoOV0%h_yW8XEZ{5fTCm7(z+1s0M}l{3dM{X>KY)+mlVFiQgD-6Q3ci8w z;0O2#eu3ZM5BLjQeE*#*3UCEcK{OB@!~kv}CWr-MgE$~AhzH^eR$}gg6>kEN5F`SL zK@!1^@(`>HlL~g1lY!(Qg4`c(`K@N~puobv+f!u7$1M-4=AU`Mo3W7qQFen221zWePC@3b_x?ROV2~bk7 zRl`aNmc!DZ3@8iA3AS^2PytjF?4$vLovRY4461;tAP`g&Y_+E9pa!T3YJu9I4yX(2 zf%>31dTvr&;&FE%|LU|0<;9J1Y1w4HE09cf_9)i=m0u`AkYbP7Hko#V9*70 z1>Hb*&;#@Yy+Ci!N3a#I`htF-KNtW8f9s@j0R)CSTGKZ z7p!JZ022jUy>60Vi`GpBQ@~Wgj+zFhgBf6^V6A%=m<{HDxq>Z+HxJAgtcEWD3&A3= zSg;(1f+b+7U@Pt|BW1Z@tLd!(E5RzT8mtlQ@U>taSPwRUjUY_0{A>c7!4|>JzE!Zo z+y=IT9bhNe1$KiyU@zDw*yCcqU}bm!90cLu5I78ufTQ3TI1Ww-_SiWIPJz>cUGf=l z7Mv5TZkz`Zg2lN2E(*5j;U#bxTme_XHE

    !8h<7`~W|}FYp`u0e^u@ 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 gaVsKK>A^UU;x&XWA-GcLj3xZ34>zb|w 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­t?^(2m?&6hP6CrzG)1u2 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�aO%RawWl= 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.~g]1eR-]VO"), + Iv: []byte("ZV`7<5X]/2brS@sz"), + } + + var text = `{"uid":"82","applyOrder":"821607392542143106","db":{"db_host":"119.23.182.117","db_port":"3306","db_name":"fnuoos_template","db_username":"root","db_password":"Fnuo123com@"}}` + result, err := aesCrypt.Encrypt([]byte(text)) + if err != nil { + fmt.Println(err) + return + } + + pass64 := base64.StdEncoding.EncodeToString(result) + fmt.Println(pass64) +} + +func TestAesCrypt_Decrypt(t *testing.T) { + var aesCrypt = utils.AesCrypt{ + Key: []byte("e{&[^Ft(.~g]1eR-]VO"), + Iv: []byte("ZV`7<5X]/2brS@sz"), + } + + pass64 := "JD0RXX1YbZPWKeNiVKsq0jQ1Bfnbln3fIMcmJkovU5gUCf329y9ZdqECWe4OKpoOk25/hPNaBH9VwellhIQhpw==" + bytesPass, err := base64.StdEncoding.DecodeString(pass64) + if err != nil { + fmt.Println(err) + return + } + + plainText, err := aesCrypt.Decrypt(bytesPass) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(string(plainText)) +} + +func Test_Vi(t *testing.T) { + fmt.Println("123") + fmt.Println([]byte("ZV`7<5X]/2brS@sz")) +} diff --git a/test/toke_test.go b/test/toke_test.go new file mode 100644 index 0000000..f37d853 --- /dev/null +++ b/test/toke_test.go @@ -0,0 +1,35 @@ +package test + +import ( + "applet/app/db" + "applet/app/lib/taoke" + "applet/app/svc" + "fmt" + "testing" +) + +func TestBrandList(t *testing.T) { + tkBrandStruct, err := taoke.BrandList("1", "20") + if err != nil { + t.Error(err) + } + for _, brandStruct := range *tkBrandStruct { + fmt.Println(brandStruct) + } + +} + +func TestSuperCategory(t *testing.T) { + category, err := taoke.SuperCategory() + if err != nil { + t.Error(err) + } + for _, brandStruct := range *category { + fmt.Println(brandStruct) + } +} + +func TestAddBrandDB(t *testing.T) { + engine := db.DBs["123456"] + svc.AddBrandDB(engine) +} diff --git a/test/zhimeng_api.go b/test/zhimeng_api.go new file mode 100644 index 0000000..3cfb347 --- /dev/null +++ b/test/zhimeng_api.go @@ -0,0 +1,156 @@ +package test + +import ( + "fmt" + "github.com/gocolly/colly" + "github.com/gocolly/colly/extensions" + "github.com/tidwall/gjson" + "net/http" + "regexp" + "strings" +) + +/* +目前可用接口 +[商品查询]https://www.showdoc.com.cn/59349170678610?page_id=339616554551473 +[商品详情]https://www.showdoc.com.cn/59349170678610?page_id=339687047645094 + +*/ + +// Response is SDK Response +type Response struct { + Msg string `json:"msg"` + Success int `json:"success"` + Data interface{} `json:"data"` +} + +func main() { + // // JD + // postData := map[string]string{"keyword": "联想", "p": "1", "size": "10"} + // fmt.Println(postData["time"]) + // res, _ := zm.Send("jd", "getgoods", postData) + // fmt.Println(string(res)) + // p := Response{} + // json.Unmarshal(res, &p) + // fmt.Println(p) + // // VIP + // postData = map[string]string{"keyword": "联想", "p": "1", "size": "10", "order": "0"} + // fmt.Println(postData["time"]) + // res, _ = zm.Send("wph", "seach_goods", postData) + // fmt.Println(string(res)) + // p = Response{} + // json.Unmarshal(res, &p) + // fmt.Println(p) + // // PDD + // postData = map[string]string{"keyword": "联想", "p": "1", "size": "10", "sort": "goods_price asc"} + // res, _ = zm.Send("pdd", "getgoods", postData) + // fmt.Println(string(res)) + // p = Response{} + // json.Unmarshal(res, &p) + // fmt.Println(p) + for i := 0; i < 1000; i++ { + fmt.Println(i) + scrapPDD() + } +} + +func scrapJD() { + c := colly.NewCollector(func(collector *colly.Collector) { + extensions.RandomUserAgent(collector) + }) + c.OnResponse(func(r *colly.Response) { + re, _ := regexp.Compile(`[(]//[^\s]*[)]`) + body := r.Body + fmt.Println(string(body)) + urls := re.FindAllString(string(body), -1) + fmt.Println(urls) + for _, url := range urls { + url = strip(url, "()") + url = "https:" + url + fmt.Println(url) + } + }) + c.Visit("https://wqsitem.jd.com/detail/100008309360_d100008309360_normal.html") +} + +func scrapPDD() { + var cookies = []*http.Cookie{} + var mapcookies = make(map[string]string) + url := fmt.Sprintf("https://mobile.yangkeduo.com/goods.html?goods_id=%s", "156632692649") + cs := "api_uid=CiHUKl9DZKpL6QBVK4qWAg==; _nano_fp=Xpdbl0PyX5Pxn0TynT_DTGXbst0kz5cjzGAQDnBR; ua=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20Win64%3B%20x64)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F84.0.4147.135%20Safari%2F537.36; webp=1; quick_entrance_click_record=20200824%2C1; PDDAccessToken=XRC6FNX7FRBL6AJRMRBRN4CDG2PZXO3YJZYHFUA4O2PLDAWVYXHA1125821; pdd_user_id=9622705741400; pdd_user_uin=F27EAZ4V5S7EGEVMCJI2P7RFLE_GEXDA; chat_config={'host_whitelist':['.yangkeduo.com','.pinduoduo.com','.10010.com/queen/tencent/pinduoduo-fill.html','.ha.10086.cn/pay/card-sale!toforward.action','wap.ha.10086.cn','m.10010.com']}; pdd_vds=gaLMNqmfGfyYEpyYiZGWopaCicNHbXGWtDNcOZnWLqiDNfLHOXnZaqtCLDiX" + csList := strings.Split(cs, ";") + for _, c := range csList { + s := strings.Trim(c, " ") + sList := strings.SplitN(s, "=", 2) + + mapcookies[sList[len(sList)-len(sList)]] = sList[(len(sList) - len(sList) + 1)] + + } + fmt.Println(mapcookies) + for key, value := range mapcookies { + if key == "ua" { + continue + } + cookies = append(cookies, &http.Cookie{Name: key, Value: value}) + } + c := colly.NewCollector( + colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"), + ) + + c.OnResponse(func(r *colly.Response) { + re, _ := regexp.Compile(`window.rawData=.*}`) + body := r.Body + fmt.Println(string(body)) + result := re.FindString(string(body)) + // fmt.Println(result) + result = strings.SplitN(result, "=", 2)[1] + // fmt.Println(result) + value := gjson.Get(result, "store.initDataObj.goods.detailGallery") + // fmt.Println(value) + list := value.Array() + imageList := []string{} + for _, v := range list { + nv := gjson.Get(v.String(), "url") + imageList = append(imageList, nv.String()) + } + fmt.Println(imageList) + ck := c.Cookies("https://mobile.yangkeduo.com") + fmt.Println(ck) + cookies = ck + }) + + c.SetCookies("https://mobile.yangkeduo.com", cookies) + + c.Visit(url) +} + +func strip(ss string, charss string) string { + s, chars := []rune(ss), []rune(charss) + length := len(s) + max := len(s) - 1 + l, r := true, true //标记当左端或者右端找到正常字符后就停止继续寻找 + start, end := 0, max + tmpEnd := 0 + charset := make(map[rune]bool) //创建字符集,也就是唯一的字符,方便后面判断是否存在 + for i := 0; i < len(chars); i++ { + charset[chars[i]] = true + } + for i := 0; i < length; i++ { + if _, exist := charset[s[i]]; l && !exist { + start = i + l = false + } + tmpEnd = max - i + if _, exist := charset[s[tmpEnd]]; r && !exist { + end = tmpEnd + r = false + } + if !l && !r { + break + } + } + if l && r { // 如果左端和右端都没找到正常字符,那么表示该字符串没有正常字符 + return "" + } + return string(s[start : end+1]) +} diff --git a/tmp/%s.log b/tmp/%s.log new file mode 100644 index 0000000..e69de29 diff --git a/tmp/debug.log b/tmp/debug.log new file mode 100644 index 0000000..53d1f7b --- /dev/null +++ b/tmp/debug.log @@ -0,0 +1,117 @@ +2024-09-10 17:32:40.069 error e/msg.go:94 not found master_id in DBs {"app": "applet"} +applet/app/e.OutErr + E:/go_api/community_team/app/e/msg.go:94 +applet/app/mw.DB + E:/go_api/community_team/app/mw/mw_db.go:23 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.Cors + E:/go_api/community_team/app/mw/mw_cors.go:28 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1 + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/recovery.go:102 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +github.com/gin-gonic/gin.LoggerWithConfig.func1 + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/logger.go:240 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.ChangeHeader + E:/go_api/community_team/app/mw/mw_change_header.go:17 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +github.com/gin-gonic/gin.(*Engine).handleHTTPRequest + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:620 +github.com/gin-gonic/gin.(*Engine).ServeHTTP + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:576 +net/http.serverHandler.ServeHTTP + C:/Users/Administrator/go/go1.19/src/net/http/server.go:2947 +net/http.(*conn).serve + C:/Users/Administrator/go/go1.19/src/net/http/server.go:1991 +2024-09-10 17:51:04.914 warn mw/mw_auth_jwt.go:76 redigo: nil returned {"app": "applet"} +2024-09-10 17:52:04.095 warn mw/mw_auth_jwt.go:76 redigo: nil returned {"app": "applet"} +2024-09-10 17:52:04.176 error e/msg.go:92 已收藏: +applet/app/svc.StoreAddLike [svc_store.go:114] +applet/app/hdl.StoreAddLike [hdl_store.go:26] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +applet/app/mw.AuthJWT [mw_auth_jwt.go:78] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Context).Next[context.go:175] +github.com/gin-gonic/gin.(*Context).Next[context.go:172] +github.com/gin-gonic/gin.(*Engine).ServeHTTP[gin.go:578] +net/http.serverHandler.ServeHTTP[server.go:2948] +net/http.(*conn).serve [server.go:1992] +runtime.goexit [asm_amd64.s:1595] {"app": "applet"} +applet/app/e.OutErr + E:/go_api/community_team/app/e/msg.go:92 +applet/app/svc.StoreAddLike + E:/go_api/community_team/app/svc/svc_store.go:114 +applet/app/hdl.StoreAddLike + E:/go_api/community_team/app/hdl/hdl_store.go:25 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.NOCACHE + E:/go_api/community_team/app/mw/mw_auth_jwt.go:120 +applet/app/mw.AuthJWT + E:/go_api/community_team/app/mw/mw_auth_jwt.go:77 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.Checker + E:/go_api/community_team/app/mw/mw_checker.go:21 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.CheckSign + E:/go_api/community_team/app/mw/mw_check_sign.go:19 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.CheckBody + E:/go_api/community_team/app/mw/mw_check_sign.go:36 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.DB + E:/go_api/community_team/app/mw/mw_db.go:127 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.Cors + E:/go_api/community_team/app/mw/mw_cors.go:28 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1 + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/recovery.go:102 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +github.com/gin-gonic/gin.LoggerWithConfig.func1 + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/logger.go:240 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +applet/app/mw.ChangeHeader + E:/go_api/community_team/app/mw/mw_change_header.go:17 +github.com/gin-gonic/gin.(*Context).Next + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/context.go:174 +github.com/gin-gonic/gin.(*Engine).handleHTTPRequest + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:620 +github.com/gin-gonic/gin.(*Engine).ServeHTTP + C:/Users/Administrator/go/pkg/mod/github.com/gin-gonic/gin@v1.9.1/gin.go:576 +net/http.serverHandler.ServeHTTP + C:/Users/Administrator/go/go1.19/src/net/http/server.go:2947 +net/http.(*conn).serve + C:/Users/Administrator/go/go1.19/src/net/http/server.go:1991 +2024-09-10 17:52:18.709 warn mw/mw_auth_jwt.go:76 redigo: nil returned {"app": "applet"} +2024-09-10 17:56:46.996 warn mw/mw_auth_jwt.go:76 redigo: nil returned {"app": "applet"} diff --git a/tmp/fnuoos_test1.log b/tmp/fnuoos_test1.log new file mode 100644 index 0000000..e8cda5d --- /dev/null +++ b/tmp/fnuoos_test1.log @@ -0,0 +1,143 @@ +[xorm] [info] 2024/09/10 17:32:59.486092 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_over_time] - 77.3368ms +[xorm] [info] 2024/09/10 17:32:59.616835 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 26.3208ms +[xorm] [info] 2024/09/10 17:32:59.746133 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 25.7758ms +[xorm] [info] 2024/09/10 17:32:59.797069 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [domain_setting] - 25.0253ms +[xorm] [info] 2024/09/10 17:32:59.979580 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [h5_api_secret_key] - 25.4213ms +[xorm] [info] 2024/09/10 17:33:00.107999 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [app_api_secret_key] - 24.7247ms +[xorm] [info] 2024/09/10 17:33:00.236988 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [applet_api_secret_key] - 24.8378ms +[xorm] [info] 2024/09/10 17:33:00.368939 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [integral_prec] - 25.0915ms +[xorm] [info] 2024/09/10 17:33:00.500176 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [fan_order_commission_prec] - 26.3397ms +[xorm] [info] 2024/09/10 17:33:00.628995 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [area_order_commission_prec] - 25.6141ms +[xorm] [info] 2024/09/10 17:33:00.759837 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [commission_prec] - 25.9936ms +[xorm] [info] 2024/09/10 17:33:00.887471 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [price_prec] - 25.0652ms +[xorm] [info] 2024/09/10 17:33:01.016885 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ds_check] - 25.0571ms +[xorm] [info] 2024/09/10 17:33:01.146098 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 24.9584ms +[xorm] [info] 2024/09/10 17:33:01.196993 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [app_user_default_avatar] - 25.3196ms +[xorm] [info] 2024/09/10 17:33:01.325158 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [order_virtual_coin_type] - 24.93ms +[xorm] [info] 2024/09/10 17:33:01.454961 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [order_virtual_coin_name] - 25.964ms +[xorm] [info] 2024/09/10 17:33:01.585012 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [h5_applet_must_sign] - 26.182ms +[xorm] [info] 2024/09/10 17:33:01.713940 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [android_must_sign] - 25.2669ms +[xorm] [info] 2024/09/10 17:33:01.844281 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 26.5598ms +[xorm] [info] 2024/09/10 17:33:01.895517 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [sms_type] - 25.2051ms +[xorm] [info] 2024/09/10 17:36:13.644164 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 25.428ms +[xorm] [info] 2024/09/10 17:36:13.752887 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 30.5294ms +[xorm] [info] 2024/09/10 17:36:14.124590 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 25.8156ms +[xorm] [info] 2024/09/10 17:36:14.308237 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 25.1972ms +[xorm] [info] 2024/09/10 17:36:14.364255 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [0] - 29.192ms +[xorm] [info] 2024/09/10 17:36:14.392264 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [0] - 27.4359ms +[xorm] [info] 2024/09/10 17:36:14.405749 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` ORDER BY `level_weight` ASC LIMIT 1 [] - 13.3223ms +[xorm] [info] 2024/09/10 17:36:14.419416 [SQL] *,sqrt( ( (( 0.000000 - longitude)*PI()*12656*cos((( 0.000000 +latitude)/2)*PI()/180)/180) * (( 0.000000 - longitude)*PI()*12656*cos (((0.000000+latitude)/2)*PI()/180)/180) ) + ( ((0.000000-latitude)*PI()*12656/180) * ((0.000000-latitude)*PI()*12656/180) ) ) AS km%!(EXTRA string= *,sqrt( ( (( 0.000000 - longitude)*PI()*12656*cos((( 0.000000 +latitude)/2)*PI()/180)/180) * (( 0.000000 - longitude)*PI()*12656*cos (((0.000000+latitude)/2)*PI()/180)/180) ) + ( ((0.000000-latitude)*PI()*12656/180) * ((0.000000-latitude)*PI()*12656/180) ) ) AS km, string=state=1 and store_type=0, string= order by fan desc,km asc,id asc limit 0,10) [] - 13.1602ms +[xorm] [info] 2024/09/10 17:37:34.498668 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 31.2861ms +[xorm] [info] 2024/09/10 17:37:34.632387 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 29.1701ms +[xorm] [info] 2024/09/10 17:37:35.004766 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 29.6891ms +[xorm] [info] 2024/09/10 17:37:35.191158 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 30.6765ms +[xorm] [info] 2024/09/10 17:37:35.249729 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [0] - 32.6192ms +[xorm] [info] 2024/09/10 17:37:35.281418 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [0] - 30.9454ms +[xorm] [info] 2024/09/10 17:37:35.297403 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` ORDER BY `level_weight` ASC LIMIT 1 [] - 15.9041ms +[xorm] [info] 2024/09/10 17:37:35.312910 [SQL] *,sqrt( ( (( 0.000000 - longitude)*PI()*12656*cos((( 0.000000 +latitude)/2)*PI()/180)/180) * (( 0.000000 - longitude)*PI()*12656*cos (((0.000000+latitude)/2)*PI()/180)/180) ) + ( ((0.000000-latitude)*PI()*12656/180) * ((0.000000-latitude)*PI()*12656/180) ) ) AS km%!(EXTRA string= *,sqrt( ( (( 0.000000 - longitude)*PI()*12656*cos((( 0.000000 +latitude)/2)*PI()/180)/180) * (( 0.000000 - longitude)*PI()*12656*cos (((0.000000+latitude)/2)*PI()/180)/180) ) + ( ((0.000000-latitude)*PI()*12656/180) * ((0.000000-latitude)*PI()*12656/180) ) ) AS km, string=1=1 and store_type=0, string= order by fan desc,km asc,id asc limit 0,10) [] - 15.3149ms +[xorm] [info] 2024/09/10 17:38:19.153465 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 26.3129ms +[xorm] [info] 2024/09/10 17:38:19.278001 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 24.5095ms +[xorm] [info] 2024/09/10 17:38:19.719927 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 24.5028ms +[xorm] [info] 2024/09/10 17:38:19.929033 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 24.3421ms +[xorm] [info] 2024/09/10 17:38:19.988169 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [0] - 28.1304ms +[xorm] [info] 2024/09/10 17:38:20.015412 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [0] - 26.4244ms +[xorm] [info] 2024/09/10 17:38:20.028954 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` ORDER BY `level_weight` ASC LIMIT 1 [] - 13.4627ms +[xorm] [info] 2024/09/10 17:38:20.041175 [SQL] select *,sqrt( ( (( 0.000000 - longitude)*PI()*12656*cos((( 0.000000 +latitude)/2)*PI()/180)/180) * (( 0.000000 - longitude)*PI()*12656*cos (((0.000000+latitude)/2)*PI()/180)/180) ) + ( ((0.000000-latitude)*PI()*12656/180) * ((0.000000-latitude)*PI()*12656/180) ) ) AS km from community_team_store where %%!(EXTRA string=1=1 and store_type=0, string= order by fan desc,km asc,id asc limit 0,10) [] - 12.1559ms +[xorm] [info] 2024/09/10 17:38:54.435191 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 27.0543ms +[xorm] [info] 2024/09/10 17:38:54.594032 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 27.6193ms +[xorm] [info] 2024/09/10 17:38:55.032286 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 26.3296ms +[xorm] [info] 2024/09/10 17:38:55.247411 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 29.0248ms +[xorm] [info] 2024/09/10 17:38:55.308986 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [0] - 29.927ms +[xorm] [info] 2024/09/10 17:38:55.337616 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [0] - 28.0888ms +[xorm] [info] 2024/09/10 17:38:55.350548 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` ORDER BY `level_weight` ASC LIMIT 1 [] - 12.4737ms +[xorm] [info] 2024/09/10 17:38:55.363713 [SQL] select *,sqrt( ( (( 0.000000 - longitude)*PI()*12656*cos((( 0.000000 +latitude)/2)*PI()/180)/180) * (( 0.000000 - longitude)*PI()*12656*cos (((0.000000+latitude)/2)*PI()/180)/180) ) + ( ((0.000000-latitude)*PI()*12656/180) * ((0.000000-latitude)*PI()*12656/180) ) ) AS km from community_team_store where 1=1 and store_type=0 order by fan desc,km asc,id asc limit 0,10 [] - 12.5016ms +[xorm] [info] 2024/09/10 17:41:42.224631 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 84.2585ms +[xorm] [info] 2024/09/10 17:41:42.341773 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 28.2414ms +[xorm] [info] 2024/09/10 17:41:42.754657 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 28.2839ms +[xorm] [info] 2024/09/10 17:41:42.957347 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 27.3814ms +[xorm] [info] 2024/09/10 17:41:43.021233 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [0] - 34.3021ms +[xorm] [info] 2024/09/10 17:41:43.049810 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [0] - 28.2015ms +[xorm] [info] 2024/09/10 17:41:43.064926 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` ORDER BY `level_weight` ASC LIMIT 1 [] - 14.3899ms +[xorm] [info] 2024/09/10 17:41:43.078787 [SQL] select *,sqrt( ( (( 0.000000 - lng)*PI()*12656*cos((( 0.000000 +lat)/2)*PI()/180)/180) * (( 0.000000 - lng)*PI()*12656*cos (((0.000000+lat)/2)*PI()/180)/180) ) + ( ((0.000000-lat)*PI()*12656/180) * ((0.000000-lat)*PI()*12656/180) ) ) AS km from community_team_store where 1=1 and store_type=0 order by fan desc,km asc,id asc limit 0,10 [] - 13.4718ms +[xorm] [info] 2024/09/10 17:41:43.107809 [SQL] SELECT count(*) FROM `community_team_store_like` WHERE (uid=? and store_id=?) [0 1] - 28.0164ms +[xorm] [info] 2024/09/10 17:51:04.140876 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 72.6837ms +[xorm] [info] 2024/09/10 17:51:04.274379 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 24.6158ms +[xorm] [info] 2024/09/10 17:51:04.647425 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 23.3636ms +[xorm] [info] 2024/09/10 17:51:04.831082 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 23.514ms +[xorm] [info] 2024/09/10 17:51:04.887746 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 25.938ms +[xorm] [info] 2024/09/10 17:51:04.940916 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 25.3962ms +[xorm] [info] 2024/09/10 17:51:04.965324 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 23.839ms +[xorm] [info] 2024/09/10 17:51:04.989429 [SQL] SELECT count(*) FROM `community_team_store_like` WHERE (uid=? and store_id=?) [21702 1] - 23.836ms +[xorm] [info] 2024/09/10 17:51:05.016448 [SQL] INSERT INTO `community_team_store_like` (`uid`,`store_id`,`time`) VALUES (?,?,?) [21702 1 2024-09-10 17:51:04] - 26.8114ms +[xorm] [info] 2024/09/10 17:52:03.415731 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 76.8606ms +[xorm] [info] 2024/09/10 17:52:03.512774 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 23.8462ms +[xorm] [info] 2024/09/10 17:52:03.851991 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 24.1043ms +[xorm] [info] 2024/09/10 17:52:04.021451 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 25.6734ms +[xorm] [info] 2024/09/10 17:52:04.071451 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 25.7739ms +[xorm] [info] 2024/09/10 17:52:04.124469 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 28.0341ms +[xorm] [info] 2024/09/10 17:52:04.150607 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 25.8393ms +[xorm] [info] 2024/09/10 17:52:04.176358 [SQL] SELECT count(*) FROM `community_team_store_like` WHERE (uid=? and store_id=?) [21702 1] - 25.2831ms +[xorm] [info] 2024/09/10 17:52:17.948485 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 25.0861ms +[xorm] [info] 2024/09/10 17:52:18.059950 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 28.1273ms +[xorm] [info] 2024/09/10 17:52:18.440279 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 25.8548ms +[xorm] [info] 2024/09/10 17:52:18.628580 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 24.3929ms +[xorm] [info] 2024/09/10 17:52:18.681993 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 26.6699ms +[xorm] [info] 2024/09/10 17:52:18.750233 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 40.6161ms +[xorm] [info] 2024/09/10 17:52:18.776628 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 25.8741ms +[xorm] [info] 2024/09/10 17:52:18.804358 [SQL] DELETE FROM `community_team_store_like` WHERE (uid=? and store_id=?) [21702 1] - 26.7071ms +[xorm] [info] 2024/09/10 17:56:46.240958 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 74.7636ms +[xorm] [info] 2024/09/10 17:56:46.367919 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 23.8104ms +[xorm] [info] 2024/09/10 17:56:46.730424 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 24.2406ms +[xorm] [info] 2024/09/10 17:56:46.917286 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 23.6049ms +[xorm] [info] 2024/09/10 17:56:46.970354 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 26.9739ms +[xorm] [info] 2024/09/10 17:56:47.025192 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 28.3315ms +[xorm] [info] 2024/09/10 17:56:47.051058 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 24.8302ms +[xorm] [info] 2024/09/10 17:56:47.076308 [SQL] SELECT count(*) FROM `community_team_store_like` WHERE (uid=? and store_id=?) [21702 1] - 24.7682ms +[xorm] [info] 2024/09/10 17:56:47.105259 [SQL] INSERT INTO `community_team_store_like` (`uid`,`store_id`,`time`) VALUES (?,?,?) [21702 1 2024-09-10 17:56:47] - 27.5973ms +[xorm] [info] 2024/09/10 17:57:16.946116 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 75.4489ms +[xorm] [info] 2024/09/10 17:57:17.060578 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 24.3978ms +[xorm] [info] 2024/09/10 17:57:17.487845 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 25.7349ms +[xorm] [info] 2024/09/10 17:57:17.695217 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 26.8809ms +[xorm] [info] 2024/09/10 17:57:17.750967 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 25.5242ms +[xorm] [info] 2024/09/10 17:57:17.778795 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 27.2128ms +[xorm] [info] 2024/09/10 17:57:17.807510 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 28.1799ms +[xorm] [info] 2024/09/10 17:57:17.820805 [SQL] cts.*,sqrt( ( (( 0.000000 - cts.lng)*PI()*12656*cos((( 0.000000 +cts.lat)/2)*PI()/180)/180) * (( 0.000000 - cts.lng)*PI()*12656*cos (((0.000000+cts.lat)/2)*PI()/180)/180) ) + ( ((0.000000-cts.lat)*PI()*12656/180) * ((0.000000-cts.lat)*PI()*12656/180) ) ) AS km%!(EXTRA string= cts.*,sqrt( ( (( 0.000000 - cts.lng)*PI()*12656*cos((( 0.000000 +cts.lat)/2)*PI()/180)/180) * (( 0.000000 - cts.lng)*PI()*12656*cos (((0.000000+cts.lat)/2)*PI()/180)/180) ) + ( ((0.000000-cts.lat)*PI()*12656/180) * ((0.000000-cts.lat)*PI()*12656/180) ) ) AS km, string=cts.state=1 and cts.store_type=0, string= order by km asc,cts.id asc limit 0,10) [] - 13.0062ms +[xorm] [info] 2024/09/10 17:58:22.716709 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 82.8724ms +[xorm] [info] 2024/09/10 17:58:22.846455 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 24.762ms +[xorm] [info] 2024/09/10 17:58:23.205608 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 24.0369ms +[xorm] [info] 2024/09/10 17:58:23.384225 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 24.2112ms +[xorm] [info] 2024/09/10 17:58:23.435979 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 25.9218ms +[xorm] [info] 2024/09/10 17:58:23.463472 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 26.7224ms +[xorm] [info] 2024/09/10 17:58:23.489342 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 25.3204ms +[xorm] [info] 2024/09/10 17:58:23.502275 [SQL] select cts.*,sqrt( ( (( 0.000000 - cts.lng)*PI()*12656*cos((( 0.000000 +cts.lat)/2)*PI()/180)/180) * (( 0.000000 - cts.lng)*PI()*12656*cos (((0.000000+cts.lat)/2)*PI()/180)/180) ) + ( ((0.000000-cts.lat)*PI()*12656/180) * ((0.000000-cts.lat)*PI()*12656/180) ) ) AS km from community_team_store_like ctsl + left join community_team_store cts on ctsl.store_id=cts.id +where %%!(EXTRA string=cts.state=1 and cts.store_type=0, string= order by km asc,cts.id asc limit 0,10) [] - 12.2003ms +[xorm] [info] 2024/09/10 18:01:58.384084 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 32.4447ms +[xorm] [info] 2024/09/10 18:01:58.498645 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 28.0723ms +[xorm] [info] 2024/09/10 18:01:58.908508 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 27.7609ms +[xorm] [info] 2024/09/10 18:01:59.106495 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 28.5754ms +[xorm] [info] 2024/09/10 18:01:59.165041 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 28.6049ms +[xorm] [info] 2024/09/10 18:01:59.196566 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 30.541ms +[xorm] [info] 2024/09/10 18:01:59.275137 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 78.0543ms +[xorm] [info] 2024/09/10 18:01:59.291005 [SQL] select cts.*,sqrt( ( (( 0.000000 - cts.lng)*PI()*12656*cos((( 0.000000 +cts.lat)/2)*PI()/180)/180) * (( 0.000000 - cts.lng)*PI()*12656*cos (((0.000000+cts.lat)/2)*PI()/180)/180) ) + ( ((0.000000-cts.lat)*PI()*12656/180) * ((0.000000-cts.lat)*PI()*12656/180) ) ) AS km from community_team_store_like ctsl + left join community_team_store cts on ctsl.store_id=cts.id +where cts.state=1 and cts.store_type=0 order by km asc,cts.id asc limit 0,10 [] - 15.8679ms +[xorm] [info] 2024/09/10 18:01:59.319371 [SQL] SELECT count(*) FROM `community_team_store_like` WHERE (uid=? and store_id=?) [21702 1] - 28.1047ms +[xorm] [info] 2024/09/10 18:02:26.713249 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 83.0263ms +[xorm] [info] 2024/09/10 18:02:26.820089 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 26.6028ms +[xorm] [info] 2024/09/10 18:02:27.180302 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 29.5648ms +[xorm] [info] 2024/09/10 18:02:27.357571 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 26.7639ms +[xorm] [info] 2024/09/10 18:02:27.412199 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 29.4528ms +[xorm] [info] 2024/09/10 18:02:27.442438 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 30.1022ms +[xorm] [info] 2024/09/10 18:02:27.470979 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 27.9176ms +[xorm] [info] 2024/09/10 18:02:27.486361 [SQL] select *,sqrt( ( (( 0.000000 - lng)*PI()*12656*cos((( 0.000000 +lat)/2)*PI()/180)/180) * (( 0.000000 - lng)*PI()*12656*cos (((0.000000+lat)/2)*PI()/180)/180) ) + ( ((0.000000-lat)*PI()*12656/180) * ((0.000000-lat)*PI()*12656/180) ) ) AS km from community_team_store where 1=1 and store_type=0 order by km asc,id asc limit 0,10 [] - 15.0313ms +[xorm] [info] 2024/09/10 18:02:27.514004 [SQL] SELECT count(*) FROM `community_team_store_like` WHERE (uid=? and store_id=?) [21702 1] - 27.5698ms +[xorm] [info] 2024/09/10 18:02:31.568879 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_station] - 27.8287ms +[xorm] [info] 2024/09/10 18:02:31.671836 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [close_app_version] - 26.8652ms +[xorm] [info] 2024/09/10 18:02:32.037538 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [is_show_point] - 27.5254ms +[xorm] [info] 2024/09/10 18:02:32.215664 [SQL] SELECT `key`, `val`, `memo` FROM `sys_cfg` WHERE (`key`=?) LIMIT 1 [ios_must_sign] - 27.9365ms +[xorm] [info] 2024/09/10 18:02:32.268915 [SQL] SELECT `uid`, `username`, `password`, `passcode`, `email`, `phone`, `nickname`, `level`, `is_store`, `invite_total`, `level_arrive_at`, `level_expire_at`, `create_at`, `update_at`, `last_login_at`, `delete_at`, `state`, `last_login_ip`, `register_ip`, `is_fake`, `is_marketer`, `can_change_lv`, `is_pop`, `is_not_add_moments`, `zone`, `sale_phone`, `platform`, `import_fin_total`, `fin_total` FROM `user` WHERE (uid = ?) LIMIT 1 [21702] - 28.1739ms +[xorm] [info] 2024/09/10 18:02:32.300649 [SQL] SELECT `uid`, `arkid_uid`, `parent_uid`, `arkid_token`, `avatar_url`, `custom_invite_code`, `invite_code`, `gender`, `birthday`, `acc_wx_id`, `acc_wx_openid`, `acc_taobao_nickname`, `acc_taobao_auth_time`, `acc_taobao_share_id`, `acc_taobao_self_id`, `acc_jd_self_id`, `acc_jd_share_id`, `acc_jd_free_id`, `acc_jd_cloud_id`, `acc_suning_self_id`, `acc_suning_share_id`, `acc_suning_free_id`, `acc_pdd_self_id`, `acc_pdd_cloud_id`, `acc_pdd_share_id`, `acc_pdd_free_id`, `acc_pdd_bind`, `acc_vip_self_id`, `acc_vip_share_id`, `acc_vip_free_id`, `acc_kaola_self_id`, `acc_kaola_share_id`, `acc_kaola_free_id`, `acc_duomai_share_id`, `acc_alipay`, `acc_alipay_real_name`, `cert_time`, `cert_name`, `cert_num`, `cert_state`, `fin_commission`, `fin_valid`, `fin_invalid`, `fin_self_order_count`, `fin_self_order_count_done`, `fin_self_rebate`, `fin_total`, `lat`, `lng`, `memo`, `qq`, `is_new`, `is_verify`, `is_ordered`, `from_way`, `hid_order`, `hid_contact`, `new_msg_notice`, `wx_account`, `wx_qrcode`, `third_party_taobao_oid`, `third_party_taobao_sid`, `third_party_taobao_acctoken`, `third_party_taobao_authcode`, `third_party_apple_token`, `third_party_qq_access_token`, `third_party_qq_expires_in`, `third_party_qq_openid`, `third_party_qq_unionid`, `third_party_wechat_expires_in`, `third_party_wechat_openid`, `third_party_wechat_unionid`, `third_party_wechat_mini_openid`, `third_party_wechat_h5_openid`, `free_remain_time`, `free_cumulative_time`, `second_free_remain_time`, `second_free_cumulative_time`, `third_free_remain_time`, `third_free_cumulative_time`, `is_delete`, `update_at`, `is_set`, `is_old`, `run_verify_time`, `task_id`, `task_type` FROM `user_profile` WHERE (uid = ?) LIMIT 1 [21702] - 29.8459ms +[xorm] [info] 2024/09/10 18:02:32.329124 [SQL] SELECT `id`, `benefit_ids`, `level_name`, `level_weight`, `level_update_condition`, `auto_audit`, `auto_update`, `level_date`, `is_use`, `choosable_num`, `before_hide`, `label`, `memo`, `css_set`, `create_at` FROM `user_level` WHERE (id = ?) LIMIT 1 [1] - 27.9698ms +[xorm] [info] 2024/09/10 18:02:32.343202 [SQL] select *,sqrt( ( (( 0.000000 - lng)*PI()*12656*cos((( 0.000000 +lat)/2)*PI()/180)/180) * (( 0.000000 - lng)*PI()*12656*cos (((0.000000+lat)/2)*PI()/180)/180) ) + ( ((0.000000-lat)*PI()*12656/180) * ((0.000000-lat)*PI()*12656/180) ) ) AS km from community_team_store where 1=1 and store_type=0 order by fan desc,km asc,id asc limit 0,10 [] - 13.7449ms +[xorm] [info] 2024/09/10 18:02:32.372189 [SQL] SELECT count(*) FROM `community_team_store_like` WHERE (uid=? and store_id=?) [21702 1] - 28.5323ms diff --git a/tmp/init_es.log b/tmp/init_es.log new file mode 100644 index 0000000..74831b0 --- /dev/null +++ b/tmp/init_es.log @@ -0,0 +1,16 @@ +[2024-09-04 14:06:39] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-06 11:25:58] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-06 11:26:17] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-06 12:02:45] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:27:08] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:36:10] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:37:01] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:37:30] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:37:57] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:38:51] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:39:50] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:53:05] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:57:38] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:57:45] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 17:58:46] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} +[2024-09-10 18:01:29] {"Url":"http://120.55.48.175:9200","User":"elastic","Pwd":"fnuo123"} diff --git a/tmp/init_rabbit_mq.log b/tmp/init_rabbit_mq.log new file mode 100644 index 0000000..1ce9a9f --- /dev/null +++ b/tmp/init_rabbit_mq.log @@ -0,0 +1,16 @@ +[2024-09-04 14:06:38] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-06 11:25:56] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-06 11:26:16] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-06 12:02:44] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:27:07] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:36:09] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:37:00] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:37:29] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:37:56] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:38:50] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:39:48] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:53:04] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:57:37] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:57:44] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 17:58:45] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} +[2024-09-10 18:01:27] {"Host":"116.62.62.35","Port":"5672","User":"zhios","Pwd":"ZHIoscnfnuo123"} diff --git a/tmp/zyos_website.log b/tmp/zyos_website.log new file mode 100644 index 0000000..8db1976 --- /dev/null +++ b/tmp/zyos_website.log @@ -0,0 +1,4114 @@ +[xorm] [info] 2024/09/04 14:06:39.634502 PING DATABASE mysql +[xorm] [info] 2024/09/04 14:06:39.681132 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 29.7724ms +[xorm] [info] 2024/09/04 14:06:39.714212 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 32.1402ms +[xorm] [info] 2024/09/04 14:08:39.874569 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.2046ms +[xorm] [info] 2024/09/04 14:10:39.880692 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6087ms +[xorm] [info] 2024/09/04 14:12:39.890534 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6474ms +[xorm] [info] 2024/09/04 14:14:39.874136 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3066ms +[xorm] [info] 2024/09/04 14:16:39.883677 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0992ms +[xorm] [info] 2024/09/04 14:18:39.881295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6501ms +[xorm] [info] 2024/09/04 14:20:39.878442 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.2507ms +[xorm] [info] 2024/09/04 14:22:39.875662 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5246ms +[xorm] [info] 2024/09/04 14:24:39.870345 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8048ms +[xorm] [info] 2024/09/04 14:26:40.389020 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 593.3738ms +[xorm] [info] 2024/09/04 14:28:39.868954 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.0707ms +[xorm] [info] 2024/09/04 14:30:39.890162 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.5297ms +[xorm] [info] 2024/09/04 14:32:39.896992 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.7577ms +[xorm] [info] 2024/09/04 14:34:39.874163 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.2453ms +[xorm] [info] 2024/09/04 14:36:39.869162 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6345ms +[xorm] [info] 2024/09/04 14:38:39.874146 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.9829ms +[xorm] [info] 2024/09/04 14:40:39.856592 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.1776ms +[xorm] [info] 2024/09/04 14:42:39.908245 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 108.3505ms +[xorm] [info] 2024/09/04 14:44:39.878023 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.9644ms +[xorm] [info] 2024/09/04 14:46:39.891775 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.1738ms +[xorm] [info] 2024/09/04 14:48:39.870981 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1105ms +[xorm] [info] 2024/09/04 14:50:39.875844 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8436ms +[xorm] [info] 2024/09/04 14:52:39.878946 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8153ms +[xorm] [info] 2024/09/04 14:54:39.889559 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7501ms +[xorm] [info] 2024/09/04 14:56:39.881548 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9209ms +[xorm] [info] 2024/09/04 14:58:39.865860 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5434ms +[xorm] [info] 2024/09/04 15:00:39.864965 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7691ms +[xorm] [info] 2024/09/04 15:02:39.889051 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.5769ms +[xorm] [info] 2024/09/04 15:04:39.884951 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.3613ms +[xorm] [info] 2024/09/04 15:06:39.891480 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.1283ms +[xorm] [info] 2024/09/04 15:08:39.863754 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.1479ms +[xorm] [info] 2024/09/04 15:10:39.877971 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2755ms +[xorm] [info] 2024/09/04 15:12:39.876609 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8039ms +[xorm] [info] 2024/09/04 15:14:39.866597 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.536ms +[xorm] [info] 2024/09/04 15:16:39.864349 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7292ms +[xorm] [info] 2024/09/04 15:18:39.892737 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7444ms +[xorm] [info] 2024/09/04 15:20:39.897968 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.5844ms +[xorm] [info] 2024/09/04 15:22:39.876118 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4926ms +[xorm] [info] 2024/09/04 15:24:39.886053 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6584ms +[xorm] [info] 2024/09/04 15:26:39.878297 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1035ms +[xorm] [info] 2024/09/04 15:28:39.880746 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0153ms +[xorm] [info] 2024/09/04 15:30:39.880317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0672ms +[xorm] [info] 2024/09/04 15:32:39.871896 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9136ms +[xorm] [info] 2024/09/04 15:34:39.872466 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8301ms +[xorm] [info] 2024/09/04 15:36:39.867993 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0817ms +[xorm] [info] 2024/09/04 15:38:39.903502 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1283ms +[xorm] [info] 2024/09/04 15:40:39.875080 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6677ms +[xorm] [info] 2024/09/04 15:42:39.940723 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 141.6801ms +[xorm] [info] 2024/09/04 15:44:39.876718 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2331ms +[xorm] [info] 2024/09/04 15:46:39.871264 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5587ms +[xorm] [info] 2024/09/04 15:48:39.872087 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8098ms +[xorm] [info] 2024/09/04 15:50:39.876810 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1461ms +[xorm] [info] 2024/09/04 15:52:39.874403 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9065ms +[xorm] [info] 2024/09/04 15:54:39.884649 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9393ms +[xorm] [info] 2024/09/04 15:56:39.864288 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1596ms +[xorm] [info] 2024/09/04 15:58:39.882256 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.678ms +[xorm] [info] 2024/09/04 16:00:39.917395 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 113.8808ms +[xorm] [info] 2024/09/04 16:02:39.862580 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8911ms +[xorm] [info] 2024/09/04 16:04:39.875050 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.615ms +[xorm] [info] 2024/09/04 16:06:39.873592 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5517ms +[xorm] [info] 2024/09/04 16:08:39.879287 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8278ms +[xorm] [info] 2024/09/04 16:10:39.877485 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3239ms +[xorm] [info] 2024/09/04 16:12:39.895590 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.4767ms +[xorm] [info] 2024/09/04 16:14:39.876852 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5546ms +[xorm] [info] 2024/09/04 16:16:39.874772 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4798ms +[xorm] [info] 2024/09/04 16:18:39.869487 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5535ms +[xorm] [info] 2024/09/04 16:20:39.874486 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0775ms +[xorm] [info] 2024/09/04 16:22:39.866642 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1052ms +[xorm] [info] 2024/09/04 16:24:39.866774 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2232ms +[xorm] [info] 2024/09/04 16:26:39.888472 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1887ms +[xorm] [info] 2024/09/04 16:28:39.884758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.2579ms +[xorm] [info] 2024/09/04 16:30:39.892761 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2519ms +[xorm] [info] 2024/09/04 16:32:39.867120 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7269ms +[xorm] [info] 2024/09/04 16:34:39.927612 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 126.3313ms +[xorm] [info] 2024/09/04 16:36:39.878849 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.0059ms +[xorm] [info] 2024/09/04 16:38:39.879964 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5092ms +[xorm] [info] 2024/09/04 16:40:39.889664 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1549ms +[xorm] [info] 2024/09/04 16:42:39.864942 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3457ms +[xorm] [info] 2024/09/04 16:44:39.883416 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.866ms +[xorm] [info] 2024/09/04 16:46:39.878210 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6849ms +[xorm] [info] 2024/09/04 16:48:39.874998 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3959ms +[xorm] [info] 2024/09/04 16:50:39.887288 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5371ms +[xorm] [info] 2024/09/04 16:52:39.888324 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9855ms +[xorm] [info] 2024/09/04 16:54:39.898345 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 103.1534ms +[xorm] [info] 2024/09/04 16:56:39.872972 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5342ms +[xorm] [info] 2024/09/04 16:58:39.886187 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4821ms +[xorm] [info] 2024/09/04 17:00:39.889597 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 97.7258ms +[xorm] [info] 2024/09/04 17:02:39.885511 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.8988ms +[xorm] [info] 2024/09/04 17:04:39.881721 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2456ms +[xorm] [info] 2024/09/04 17:06:39.868976 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.9986ms +[xorm] [info] 2024/09/04 17:08:39.895725 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.6245ms +[xorm] [info] 2024/09/04 17:10:39.895505 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.9404ms +[xorm] [info] 2024/09/04 17:12:39.876542 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7617ms +[xorm] [info] 2024/09/04 17:14:39.884293 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0332ms +[xorm] [info] 2024/09/04 17:16:39.888629 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4162ms +[xorm] [info] 2024/09/04 17:18:39.877606 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7243ms +[xorm] [info] 2024/09/04 17:20:39.884674 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1586ms +[xorm] [info] 2024/09/04 17:22:39.886604 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.1661ms +[xorm] [info] 2024/09/04 17:24:39.893775 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 98.4437ms +[xorm] [info] 2024/09/04 17:26:39.915689 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 117.4633ms +[xorm] [info] 2024/09/04 17:28:39.866954 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.793ms +[xorm] [info] 2024/09/04 17:30:39.874209 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2409ms +[xorm] [info] 2024/09/04 17:32:39.859857 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7114ms +[xorm] [info] 2024/09/04 17:34:39.888796 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 100.5572ms +[xorm] [info] 2024/09/04 17:36:39.880223 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.9047ms +[xorm] [info] 2024/09/04 17:38:39.888181 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6979ms +[xorm] [info] 2024/09/04 17:40:39.890852 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6304ms +[xorm] [info] 2024/09/04 17:42:39.922902 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 122.6685ms +[xorm] [info] 2024/09/04 17:44:39.860292 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.4639ms +[xorm] [info] 2024/09/04 17:46:39.872743 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5786ms +[xorm] [info] 2024/09/04 17:48:39.865792 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7493ms +[xorm] [info] 2024/09/04 17:50:39.879196 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1292ms +[xorm] [info] 2024/09/04 17:52:39.864121 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5169ms +[xorm] [info] 2024/09/04 17:54:39.873138 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8837ms +[xorm] [info] 2024/09/04 17:56:39.883653 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3929ms +[xorm] [info] 2024/09/04 17:58:39.870428 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4442ms +[xorm] [info] 2024/09/04 18:00:39.875189 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8706ms +[xorm] [info] 2024/09/04 18:02:39.867482 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4402ms +[xorm] [info] 2024/09/04 18:04:39.873517 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0811ms +[xorm] [info] 2024/09/04 18:06:39.869754 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2041ms +[xorm] [info] 2024/09/04 18:08:39.873995 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.169ms +[xorm] [info] 2024/09/04 18:10:39.871054 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7264ms +[xorm] [info] 2024/09/04 18:12:39.873105 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7547ms +[xorm] [info] 2024/09/04 18:14:39.890569 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.0508ms +[xorm] [info] 2024/09/04 18:16:39.876185 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6814ms +[xorm] [info] 2024/09/04 18:18:39.858326 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.0222ms +[xorm] [info] 2024/09/04 18:20:39.877638 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9562ms +[xorm] [info] 2024/09/04 18:22:39.888043 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.5427ms +[xorm] [info] 2024/09/04 18:24:39.859350 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 65.543ms +[xorm] [info] 2024/09/04 18:26:39.883299 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2228ms +[xorm] [info] 2024/09/04 18:28:39.865508 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.9045ms +[xorm] [info] 2024/09/04 18:30:39.877127 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8372ms +[xorm] [info] 2024/09/04 18:32:39.872695 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6714ms +[xorm] [info] 2024/09/04 18:34:39.869593 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1626ms +[xorm] [info] 2024/09/04 18:36:39.869905 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9922ms +[xorm] [info] 2024/09/04 18:38:39.864722 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4042ms +[xorm] [info] 2024/09/04 18:40:39.886934 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5635ms +[xorm] [info] 2024/09/04 18:42:39.881943 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0844ms +[xorm] [info] 2024/09/04 18:44:39.861939 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5395ms +[xorm] [info] 2024/09/04 18:46:39.868627 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5169ms +[xorm] [info] 2024/09/04 18:48:39.873834 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2659ms +[xorm] [info] 2024/09/04 18:50:39.878266 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.697ms +[xorm] [info] 2024/09/04 18:52:39.878210 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8665ms +[xorm] [info] 2024/09/04 18:54:39.869872 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3527ms +[xorm] [info] 2024/09/04 18:56:39.880886 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5117ms +[xorm] [info] 2024/09/04 18:58:39.870779 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3595ms +[xorm] [info] 2024/09/04 19:00:39.885122 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.5173ms +[xorm] [info] 2024/09/04 19:02:39.872055 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.747ms +[xorm] [info] 2024/09/04 19:04:39.885423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1277ms +[xorm] [info] 2024/09/04 19:06:39.873638 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9676ms +[xorm] [info] 2024/09/04 19:08:39.863543 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.8089ms +[xorm] [info] 2024/09/04 19:10:39.874634 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8524ms +[xorm] [info] 2024/09/04 19:12:39.876464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1062ms +[xorm] [info] 2024/09/04 19:14:39.863368 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7702ms +[xorm] [info] 2024/09/04 19:16:39.875466 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3384ms +[xorm] [info] 2024/09/04 19:18:39.871877 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.636ms +[xorm] [info] 2024/09/04 19:20:39.876666 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3842ms +[xorm] [info] 2024/09/04 19:22:39.867842 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5728ms +[xorm] [info] 2024/09/04 19:24:39.878893 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.065ms +[xorm] [info] 2024/09/04 19:26:39.875431 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8465ms +[xorm] [info] 2024/09/04 19:28:39.893566 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 97.7518ms +[xorm] [info] 2024/09/04 19:30:39.877295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7238ms +[xorm] [info] 2024/09/04 19:32:39.863166 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7105ms +[xorm] [info] 2024/09/04 19:34:39.878739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.726ms +[xorm] [info] 2024/09/04 19:36:39.865449 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6653ms +[xorm] [info] 2024/09/04 19:38:39.875943 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3738ms +[xorm] [info] 2024/09/04 19:40:39.881425 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8177ms +[xorm] [info] 2024/09/04 19:42:39.873735 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6591ms +[xorm] [info] 2024/09/04 19:44:39.886993 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.247ms +[xorm] [info] 2024/09/04 19:46:39.873296 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9461ms +[xorm] [info] 2024/09/04 19:48:39.890281 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.2159ms +[xorm] [info] 2024/09/04 19:50:39.876766 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3615ms +[xorm] [info] 2024/09/04 19:52:39.870685 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7881ms +[xorm] [info] 2024/09/04 19:54:39.879843 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8186ms +[xorm] [info] 2024/09/04 19:56:39.887897 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.8828ms +[xorm] [info] 2024/09/04 19:58:39.871308 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1714ms +[xorm] [info] 2024/09/04 20:00:39.876710 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6469ms +[xorm] [info] 2024/09/04 20:02:39.868095 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0042ms +[xorm] [info] 2024/09/04 20:04:39.873596 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6732ms +[xorm] [info] 2024/09/04 20:06:39.891091 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8917ms +[xorm] [info] 2024/09/04 20:08:39.887660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.624ms +[xorm] [info] 2024/09/04 20:10:39.855203 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.5025ms +[xorm] [info] 2024/09/04 20:12:39.888308 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.978ms +[xorm] [info] 2024/09/04 20:14:39.872892 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2582ms +[xorm] [info] 2024/09/04 20:16:39.879360 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9205ms +[xorm] [info] 2024/09/04 20:18:39.894046 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1802ms +[xorm] [info] 2024/09/04 20:20:39.871384 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9988ms +[xorm] [info] 2024/09/04 20:22:39.879007 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1077ms +[xorm] [info] 2024/09/04 20:24:39.867322 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1982ms +[xorm] [info] 2024/09/04 20:26:39.882546 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1968ms +[xorm] [info] 2024/09/04 20:28:39.870331 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4103ms +[xorm] [info] 2024/09/04 20:30:39.872811 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4386ms +[xorm] [info] 2024/09/04 20:32:39.874184 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3574ms +[xorm] [info] 2024/09/04 20:34:39.878481 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7796ms +[xorm] [info] 2024/09/04 20:36:39.874071 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4489ms +[xorm] [info] 2024/09/04 20:38:39.881193 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1923ms +[xorm] [info] 2024/09/04 20:40:39.880662 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3652ms +[xorm] [info] 2024/09/04 20:42:39.878904 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.8897ms +[xorm] [info] 2024/09/04 20:44:39.882741 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2349ms +[xorm] [info] 2024/09/04 20:46:39.863096 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.8922ms +[xorm] [info] 2024/09/04 20:48:39.883131 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7058ms +[xorm] [info] 2024/09/04 20:50:39.874744 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2612ms +[xorm] [info] 2024/09/04 20:52:39.874159 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6746ms +[xorm] [info] 2024/09/04 20:54:39.884416 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.7339ms +[xorm] [info] 2024/09/04 20:56:39.865203 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4225ms +[xorm] [info] 2024/09/04 20:58:39.873807 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4554ms +[xorm] [info] 2024/09/04 21:00:39.878392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.4782ms +[xorm] [info] 2024/09/04 21:02:39.881183 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6839ms +[xorm] [info] 2024/09/04 21:04:39.881572 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.5504ms +[xorm] [info] 2024/09/04 21:06:39.873357 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3665ms +[xorm] [info] 2024/09/04 21:08:39.884250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8109ms +[xorm] [info] 2024/09/04 21:10:39.876317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8423ms +[xorm] [info] 2024/09/04 21:12:39.858864 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.6345ms +[xorm] [info] 2024/09/04 21:14:39.871100 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6236ms +[xorm] [info] 2024/09/04 21:16:39.868099 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1286ms +[xorm] [info] 2024/09/04 21:18:39.864576 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9247ms +[xorm] [info] 2024/09/04 21:20:39.886557 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2236ms +[xorm] [info] 2024/09/04 21:22:39.861256 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.3714ms +[xorm] [info] 2024/09/04 21:24:39.873071 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9324ms +[xorm] [info] 2024/09/04 21:26:39.874062 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1057ms +[xorm] [info] 2024/09/04 21:28:39.887894 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2509ms +[xorm] [info] 2024/09/04 21:30:39.868814 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5462ms +[xorm] [info] 2024/09/04 21:32:39.869872 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.7098ms +[xorm] [info] 2024/09/04 21:34:39.861947 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.9256ms +[xorm] [info] 2024/09/04 21:36:39.867464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.3443ms +[xorm] [info] 2024/09/04 21:38:39.863106 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6143ms +[xorm] [info] 2024/09/04 21:40:39.860826 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5253ms +[xorm] [info] 2024/09/04 21:42:39.866237 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3166ms +[xorm] [info] 2024/09/04 21:44:39.863350 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0858ms +[xorm] [info] 2024/09/04 21:46:39.875885 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7888ms +[xorm] [info] 2024/09/04 21:48:39.875005 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.348ms +[xorm] [info] 2024/09/04 21:50:39.888845 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8898ms +[xorm] [info] 2024/09/04 21:52:39.872054 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1123ms +[xorm] [info] 2024/09/04 21:54:39.868814 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0273ms +[xorm] [info] 2024/09/04 21:56:39.880470 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.444ms +[xorm] [info] 2024/09/04 21:58:39.882322 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.4533ms +[xorm] [info] 2024/09/04 22:00:39.891464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6292ms +[xorm] [info] 2024/09/04 22:02:39.874273 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8607ms +[xorm] [info] 2024/09/04 22:04:39.877477 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6821ms +[xorm] [info] 2024/09/04 22:06:39.866878 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0979ms +[xorm] [info] 2024/09/04 22:08:39.882058 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7273ms +[xorm] [info] 2024/09/04 22:10:39.869030 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1662ms +[xorm] [info] 2024/09/04 22:12:39.879387 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9627ms +[xorm] [info] 2024/09/04 22:14:39.888250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.3966ms +[xorm] [info] 2024/09/04 22:16:39.871046 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4154ms +[xorm] [info] 2024/09/04 22:18:39.886703 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.242ms +[xorm] [info] 2024/09/04 22:20:39.868917 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8335ms +[xorm] [info] 2024/09/04 22:22:39.874430 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5695ms +[xorm] [info] 2024/09/04 22:24:39.885564 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0873ms +[xorm] [info] 2024/09/04 22:26:39.876991 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.5171ms +[xorm] [info] 2024/09/04 22:28:39.876581 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.8523ms +[xorm] [info] 2024/09/04 22:30:39.861710 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.7019ms +[xorm] [info] 2024/09/04 22:32:39.862793 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.2266ms +[xorm] [info] 2024/09/04 22:34:39.856311 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.9835ms +[xorm] [info] 2024/09/04 22:36:39.870538 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1122ms +[xorm] [info] 2024/09/04 22:38:39.873347 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6686ms +[xorm] [info] 2024/09/04 22:40:39.867965 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9954ms +[xorm] [info] 2024/09/04 22:42:39.867210 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3558ms +[xorm] [info] 2024/09/04 22:44:39.866135 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0506ms +[xorm] [info] 2024/09/04 22:46:39.874229 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.404ms +[xorm] [info] 2024/09/04 22:48:39.866283 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.2662ms +[xorm] [info] 2024/09/04 22:50:39.875548 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.2991ms +[xorm] [info] 2024/09/04 22:52:39.862081 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.613ms +[xorm] [info] 2024/09/04 22:54:39.872557 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9145ms +[xorm] [info] 2024/09/04 22:56:39.875042 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.9395ms +[xorm] [info] 2024/09/04 22:58:39.888120 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7746ms +[xorm] [info] 2024/09/04 23:00:39.865486 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3985ms +[xorm] [info] 2024/09/04 23:02:39.890547 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2535ms +[xorm] [info] 2024/09/04 23:04:39.874337 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2438ms +[xorm] [info] 2024/09/04 23:06:39.883333 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0316ms +[xorm] [info] 2024/09/04 23:08:39.888892 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6351ms +[xorm] [info] 2024/09/04 23:10:39.885963 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0494ms +[xorm] [info] 2024/09/04 23:12:39.868969 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0243ms +[xorm] [info] 2024/09/04 23:14:39.868872 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3739ms +[xorm] [info] 2024/09/04 23:16:39.867969 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8811ms +[xorm] [info] 2024/09/04 23:18:39.870936 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0686ms +[xorm] [info] 2024/09/04 23:20:39.862883 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4625ms +[xorm] [info] 2024/09/04 23:22:39.869069 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4997ms +[xorm] [info] 2024/09/04 23:24:39.882443 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9499ms +[xorm] [info] 2024/09/04 23:26:39.877625 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0863ms +[xorm] [info] 2024/09/04 23:28:39.878556 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1871ms +[xorm] [info] 2024/09/04 23:30:39.866943 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8174ms +[xorm] [info] 2024/09/04 23:32:39.894127 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4589ms +[xorm] [info] 2024/09/04 23:34:39.867809 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5041ms +[xorm] [info] 2024/09/04 23:36:39.867762 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5546ms +[xorm] [info] 2024/09/04 23:38:39.875785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1145ms +[xorm] [info] 2024/09/04 23:40:39.871167 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.917ms +[xorm] [info] 2024/09/04 23:42:39.880447 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7212ms +[xorm] [info] 2024/09/04 23:44:39.872135 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6915ms +[xorm] [info] 2024/09/04 23:46:39.870353 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9626ms +[xorm] [info] 2024/09/04 23:48:39.889045 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9479ms +[xorm] [info] 2024/09/04 23:50:39.863098 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3127ms +[xorm] [info] 2024/09/04 23:52:39.862895 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6198ms +[xorm] [info] 2024/09/04 23:54:39.872548 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1594ms +[xorm] [info] 2024/09/04 23:56:39.863344 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7809ms +[xorm] [info] 2024/09/04 23:58:39.864808 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6592ms +[xorm] [info] 2024/09/05 00:00:39.875457 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0438ms +[xorm] [info] 2024/09/05 00:02:39.871085 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0875ms +[xorm] [info] 2024/09/05 00:04:39.874933 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7325ms +[xorm] [info] 2024/09/05 00:06:39.868041 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7543ms +[xorm] [info] 2024/09/05 00:08:39.867682 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9324ms +[xorm] [info] 2024/09/05 00:10:39.878987 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0914ms +[xorm] [info] 2024/09/05 00:12:39.882299 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4886ms +[xorm] [info] 2024/09/05 00:14:39.873147 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7711ms +[xorm] [info] 2024/09/05 00:16:39.885597 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1454ms +[xorm] [info] 2024/09/05 00:18:39.888180 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7877ms +[xorm] [info] 2024/09/05 00:20:39.891426 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.1234ms +[xorm] [info] 2024/09/05 00:22:39.874594 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4545ms +[xorm] [info] 2024/09/05 00:24:39.869593 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.301ms +[xorm] [info] 2024/09/05 00:26:39.890832 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3465ms +[xorm] [info] 2024/09/05 00:28:39.884576 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9719ms +[xorm] [info] 2024/09/05 00:30:39.890190 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.0237ms +[xorm] [info] 2024/09/05 00:32:39.892374 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.1772ms +[xorm] [info] 2024/09/05 00:34:39.878728 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2419ms +[xorm] [info] 2024/09/05 00:36:39.873909 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8899ms +[xorm] [info] 2024/09/05 00:38:39.888430 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8026ms +[xorm] [info] 2024/09/05 00:40:39.872363 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.2104ms +[xorm] [info] 2024/09/05 00:42:39.869011 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8565ms +[xorm] [info] 2024/09/05 00:44:39.866515 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5204ms +[xorm] [info] 2024/09/05 00:46:39.872882 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8125ms +[xorm] [info] 2024/09/05 00:48:39.872112 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.2979ms +[xorm] [info] 2024/09/05 00:50:39.872143 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5263ms +[xorm] [info] 2024/09/05 00:52:39.869235 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1287ms +[xorm] [info] 2024/09/05 00:54:39.877584 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.729ms +[xorm] [info] 2024/09/05 00:56:39.883620 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9704ms +[xorm] [info] 2024/09/05 00:58:39.858450 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.8675ms +[xorm] [info] 2024/09/05 01:00:39.862180 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6925ms +[xorm] [info] 2024/09/05 01:02:39.925834 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 130.4318ms +[xorm] [info] 2024/09/05 01:04:39.880769 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6178ms +[xorm] [info] 2024/09/05 01:06:39.873090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2665ms +[xorm] [info] 2024/09/05 01:08:39.891757 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1108ms +[xorm] [info] 2024/09/05 01:10:39.889326 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.0529ms +[xorm] [info] 2024/09/05 01:12:39.865674 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8389ms +[xorm] [info] 2024/09/05 01:14:39.880110 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4159ms +[xorm] [info] 2024/09/05 01:16:39.859243 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.357ms +[xorm] [info] 2024/09/05 01:18:39.881054 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0767ms +[xorm] [info] 2024/09/05 01:20:39.864949 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6723ms +[xorm] [info] 2024/09/05 01:22:39.863861 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6489ms +[xorm] [info] 2024/09/05 01:24:39.881382 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1709ms +[xorm] [info] 2024/09/05 01:26:39.874319 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.073ms +[xorm] [info] 2024/09/05 01:28:39.886743 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6744ms +[xorm] [info] 2024/09/05 01:30:39.886768 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9768ms +[xorm] [info] 2024/09/05 01:32:39.879281 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0496ms +[xorm] [info] 2024/09/05 01:34:39.875816 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1883ms +[xorm] [info] 2024/09/05 01:36:39.875505 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0237ms +[xorm] [info] 2024/09/05 01:38:39.867131 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3379ms +[xorm] [info] 2024/09/05 01:40:39.872600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1412ms +[xorm] [info] 2024/09/05 01:42:39.873520 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9974ms +[xorm] [info] 2024/09/05 01:44:39.877810 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7131ms +[xorm] [info] 2024/09/05 01:46:39.871276 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1951ms +[xorm] [info] 2024/09/05 01:48:39.878283 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7192ms +[xorm] [info] 2024/09/05 01:50:39.865536 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5998ms +[xorm] [info] 2024/09/05 01:52:39.871373 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8861ms +[xorm] [info] 2024/09/05 01:54:39.878646 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5618ms +[xorm] [info] 2024/09/05 01:56:39.862954 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0404ms +[xorm] [info] 2024/09/05 01:58:39.869218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1662ms +[xorm] [info] 2024/09/05 02:00:39.893217 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0802ms +[xorm] [info] 2024/09/05 02:02:39.878757 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2512ms +[xorm] [info] 2024/09/05 02:04:39.871752 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3854ms +[xorm] [info] 2024/09/05 02:06:39.873210 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5572ms +[xorm] [info] 2024/09/05 02:08:39.886729 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4378ms +[xorm] [info] 2024/09/05 02:10:39.880003 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0144ms +[xorm] [info] 2024/09/05 02:12:39.866785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8428ms +[xorm] [info] 2024/09/05 02:14:39.871068 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7548ms +[xorm] [info] 2024/09/05 02:16:39.871878 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4925ms +[xorm] [info] 2024/09/05 02:18:39.877181 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7139ms +[xorm] [info] 2024/09/05 02:20:39.871683 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9557ms +[xorm] [info] 2024/09/05 02:22:39.867053 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2108ms +[xorm] [info] 2024/09/05 02:24:39.870772 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8052ms +[xorm] [info] 2024/09/05 02:26:39.889874 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.6228ms +[xorm] [info] 2024/09/05 02:28:39.876864 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6859ms +[xorm] [info] 2024/09/05 02:30:39.887868 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.971ms +[xorm] [info] 2024/09/05 02:32:39.883899 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9962ms +[xorm] [info] 2024/09/05 02:34:39.876745 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.094ms +[xorm] [info] 2024/09/05 02:36:39.870592 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.6337ms +[xorm] [info] 2024/09/05 02:38:39.892775 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4692ms +[xorm] [info] 2024/09/05 02:40:39.889684 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2854ms +[xorm] [info] 2024/09/05 02:42:39.878913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0914ms +[xorm] [info] 2024/09/05 02:44:39.866731 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1434ms +[xorm] [info] 2024/09/05 02:46:39.879118 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4ms +[xorm] [info] 2024/09/05 02:48:39.870592 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5019ms +[xorm] [info] 2024/09/05 02:50:39.868494 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8926ms +[xorm] [info] 2024/09/05 02:52:39.882750 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3228ms +[xorm] [info] 2024/09/05 02:54:39.875290 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9196ms +[xorm] [info] 2024/09/05 02:56:39.869842 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4484ms +[xorm] [info] 2024/09/05 02:58:39.859363 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7718ms +[xorm] [info] 2024/09/05 03:00:39.888043 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3221ms +[xorm] [info] 2024/09/05 03:02:39.882198 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.55ms +[xorm] [info] 2024/09/05 03:04:39.885307 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.55ms +[xorm] [info] 2024/09/05 03:06:39.876565 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9194ms +[xorm] [info] 2024/09/05 03:08:39.871407 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6948ms +[xorm] [info] 2024/09/05 03:10:39.867068 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.68ms +[xorm] [info] 2024/09/05 03:12:39.862547 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0613ms +[xorm] [info] 2024/09/05 03:14:39.867476 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9717ms +[xorm] [info] 2024/09/05 03:16:39.872075 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.2459ms +[xorm] [info] 2024/09/05 03:18:39.879455 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0482ms +[xorm] [info] 2024/09/05 03:20:39.872527 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2184ms +[xorm] [info] 2024/09/05 03:22:39.874284 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2958ms +[xorm] [info] 2024/09/05 03:24:39.866291 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6461ms +[xorm] [info] 2024/09/05 03:26:39.873576 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0061ms +[xorm] [info] 2024/09/05 03:28:39.867233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7936ms +[xorm] [info] 2024/09/05 03:30:39.865968 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3495ms +[xorm] [info] 2024/09/05 03:32:39.877663 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7471ms +[xorm] [info] 2024/09/05 03:34:39.866747 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5211ms +[xorm] [info] 2024/09/05 03:36:39.891001 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2425ms +[xorm] [info] 2024/09/05 03:38:39.880204 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.6551ms +[xorm] [info] 2024/09/05 03:40:39.868258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6276ms +[xorm] [info] 2024/09/05 03:42:39.892504 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7217ms +[xorm] [info] 2024/09/05 03:44:39.889649 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.277ms +[xorm] [info] 2024/09/05 03:46:39.869873 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3658ms +[xorm] [info] 2024/09/05 03:48:39.883672 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7525ms +[xorm] [info] 2024/09/05 03:50:39.872507 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5827ms +[xorm] [info] 2024/09/05 03:52:39.861879 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1499ms +[xorm] [info] 2024/09/05 03:54:39.876992 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2851ms +[xorm] [info] 2024/09/05 03:56:39.891072 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2904ms +[xorm] [info] 2024/09/05 03:58:39.888080 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0941ms +[xorm] [info] 2024/09/05 04:00:39.884982 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0784ms +[xorm] [info] 2024/09/05 04:02:39.874483 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3317ms +[xorm] [info] 2024/09/05 04:04:39.875066 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.098ms +[xorm] [info] 2024/09/05 04:06:39.880187 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4617ms +[xorm] [info] 2024/09/05 04:08:39.882355 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6378ms +[xorm] [info] 2024/09/05 04:10:39.882766 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8274ms +[xorm] [info] 2024/09/05 04:12:39.863220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 65.0255ms +[xorm] [info] 2024/09/05 04:14:39.869740 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0256ms +[xorm] [info] 2024/09/05 04:16:39.884595 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7811ms +[xorm] [info] 2024/09/05 04:18:39.880079 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9566ms +[xorm] [info] 2024/09/05 04:20:39.878035 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.484ms +[xorm] [info] 2024/09/05 04:22:39.882515 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.331ms +[xorm] [info] 2024/09/05 04:24:39.886804 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6268ms +[xorm] [info] 2024/09/05 04:26:39.879282 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.104ms +[xorm] [info] 2024/09/05 04:28:39.862433 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8706ms +[xorm] [info] 2024/09/05 04:30:39.873626 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9949ms +[xorm] [info] 2024/09/05 04:32:39.872737 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2344ms +[xorm] [info] 2024/09/05 04:34:39.886699 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.9859ms +[xorm] [info] 2024/09/05 04:36:39.889635 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2684ms +[xorm] [info] 2024/09/05 04:38:39.861875 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5578ms +[xorm] [info] 2024/09/05 04:40:39.875476 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4474ms +[xorm] [info] 2024/09/05 04:42:39.863465 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.813ms +[xorm] [info] 2024/09/05 04:44:39.877472 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5005ms +[xorm] [info] 2024/09/05 04:46:39.867423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1481ms +[xorm] [info] 2024/09/05 04:48:39.879217 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.0135ms +[xorm] [info] 2024/09/05 04:50:39.861476 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2732ms +[xorm] [info] 2024/09/05 04:52:39.888170 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6607ms +[xorm] [info] 2024/09/05 04:54:39.859702 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.7659ms +[xorm] [info] 2024/09/05 04:56:39.872018 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7209ms +[xorm] [info] 2024/09/05 04:58:39.872090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7541ms +[xorm] [info] 2024/09/05 05:00:39.890543 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8779ms +[xorm] [info] 2024/09/05 05:02:39.878626 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7125ms +[xorm] [info] 2024/09/05 05:04:39.869468 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8745ms +[xorm] [info] 2024/09/05 05:06:39.878622 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4607ms +[xorm] [info] 2024/09/05 05:08:39.866401 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3344ms +[xorm] [info] 2024/09/05 05:10:39.864761 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5164ms +[xorm] [info] 2024/09/05 05:12:39.871188 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5543ms +[xorm] [info] 2024/09/05 05:14:39.885345 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8805ms +[xorm] [info] 2024/09/05 05:16:39.889177 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.4068ms +[xorm] [info] 2024/09/05 05:18:39.877440 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5882ms +[xorm] [info] 2024/09/05 05:20:39.879336 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4444ms +[xorm] [info] 2024/09/05 05:22:39.871238 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0752ms +[xorm] [info] 2024/09/05 05:24:39.899960 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.2536ms +[xorm] [info] 2024/09/05 05:26:39.868154 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9076ms +[xorm] [info] 2024/09/05 05:28:39.865523 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0965ms +[xorm] [info] 2024/09/05 05:30:39.863630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.763ms +[xorm] [info] 2024/09/05 05:32:39.872849 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1523ms +[xorm] [info] 2024/09/05 05:34:39.893039 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.092ms +[xorm] [info] 2024/09/05 05:36:39.884464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8166ms +[xorm] [info] 2024/09/05 05:38:39.878529 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5213ms +[xorm] [info] 2024/09/05 05:40:39.893363 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5438ms +[xorm] [info] 2024/09/05 05:42:39.873695 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3635ms +[xorm] [info] 2024/09/05 05:44:39.866594 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4528ms +[xorm] [info] 2024/09/05 05:46:39.871660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8046ms +[xorm] [info] 2024/09/05 05:48:39.874708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8891ms +[xorm] [info] 2024/09/05 05:50:39.881436 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.779ms +[xorm] [info] 2024/09/05 05:52:39.885747 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4464ms +[xorm] [info] 2024/09/05 05:54:39.880872 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7651ms +[xorm] [info] 2024/09/05 05:56:39.859067 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.5082ms +[xorm] [info] 2024/09/05 05:58:39.864896 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.5659ms +[xorm] [info] 2024/09/05 06:00:39.878787 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1873ms +[xorm] [info] 2024/09/05 06:02:39.868633 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0936ms +[xorm] [info] 2024/09/05 06:04:39.876372 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4738ms +[xorm] [info] 2024/09/05 06:06:39.883238 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6592ms +[xorm] [info] 2024/09/05 06:08:39.865886 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7674ms +[xorm] [info] 2024/09/05 06:10:39.864117 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.982ms +[xorm] [info] 2024/09/05 06:12:39.888522 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2362ms +[xorm] [info] 2024/09/05 06:14:39.884714 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5956ms +[xorm] [info] 2024/09/05 06:16:39.882417 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.4488ms +[xorm] [info] 2024/09/05 06:18:39.865793 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.0606ms +[xorm] [info] 2024/09/05 06:20:39.873949 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8189ms +[xorm] [info] 2024/09/05 06:22:39.873664 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1693ms +[xorm] [info] 2024/09/05 06:24:39.873917 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3757ms +[xorm] [info] 2024/09/05 06:26:39.879231 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8217ms +[xorm] [info] 2024/09/05 06:28:39.895507 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.5601ms +[xorm] [info] 2024/09/05 06:30:39.871613 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8866ms +[xorm] [info] 2024/09/05 06:32:39.871913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.5295ms +[xorm] [info] 2024/09/05 06:34:39.870625 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2813ms +[xorm] [info] 2024/09/05 06:36:39.865702 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3027ms +[xorm] [info] 2024/09/05 06:38:39.864560 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7282ms +[xorm] [info] 2024/09/05 06:40:39.871415 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.152ms +[xorm] [info] 2024/09/05 06:42:39.886709 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9711ms +[xorm] [info] 2024/09/05 06:44:39.878910 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.2017ms +[xorm] [info] 2024/09/05 06:46:39.876288 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9844ms +[xorm] [info] 2024/09/05 06:48:39.864946 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5928ms +[xorm] [info] 2024/09/05 06:50:39.878548 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.619ms +[xorm] [info] 2024/09/05 06:52:39.887055 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5315ms +[xorm] [info] 2024/09/05 06:54:39.860137 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.7078ms +[xorm] [info] 2024/09/05 06:56:39.867104 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8316ms +[xorm] [info] 2024/09/05 06:58:39.872818 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9904ms +[xorm] [info] 2024/09/05 07:00:39.881855 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7093ms +[xorm] [info] 2024/09/05 07:02:39.874211 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8689ms +[xorm] [info] 2024/09/05 07:04:39.869712 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.12ms +[xorm] [info] 2024/09/05 07:06:39.874509 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0958ms +[xorm] [info] 2024/09/05 07:08:39.877617 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.7214ms +[xorm] [info] 2024/09/05 07:10:39.890374 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3221ms +[xorm] [info] 2024/09/05 07:12:39.873093 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.217ms +[xorm] [info] 2024/09/05 07:14:39.872102 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6962ms +[xorm] [info] 2024/09/05 07:16:39.873904 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6989ms +[xorm] [info] 2024/09/05 07:18:39.863428 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7758ms +[xorm] [info] 2024/09/05 07:20:39.876285 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5637ms +[xorm] [info] 2024/09/05 07:22:39.878091 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6022ms +[xorm] [info] 2024/09/05 07:24:39.874140 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6961ms +[xorm] [info] 2024/09/05 07:26:39.872952 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3905ms +[xorm] [info] 2024/09/05 07:28:39.861791 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0842ms +[xorm] [info] 2024/09/05 07:30:39.866915 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0466ms +[xorm] [info] 2024/09/05 07:32:39.877986 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9943ms +[xorm] [info] 2024/09/05 07:34:39.877974 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4437ms +[xorm] [info] 2024/09/05 07:36:39.884652 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3883ms +[xorm] [info] 2024/09/05 07:38:39.859445 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 65.6473ms +[xorm] [info] 2024/09/05 07:40:39.874307 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1766ms +[xorm] [info] 2024/09/05 07:42:39.885366 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9897ms +[xorm] [info] 2024/09/05 07:44:39.863895 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2689ms +[xorm] [info] 2024/09/05 07:46:39.886811 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3263ms +[xorm] [info] 2024/09/05 07:48:39.879908 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0971ms +[xorm] [info] 2024/09/05 07:50:39.881337 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7886ms +[xorm] [info] 2024/09/05 07:52:39.873431 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.191ms +[xorm] [info] 2024/09/05 07:54:39.882542 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8251ms +[xorm] [info] 2024/09/05 07:56:39.862275 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7103ms +[xorm] [info] 2024/09/05 07:58:39.875071 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4812ms +[xorm] [info] 2024/09/05 08:00:39.892390 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.478ms +[xorm] [info] 2024/09/05 08:02:39.876808 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1197ms +[xorm] [info] 2024/09/05 08:04:39.886866 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.822ms +[xorm] [info] 2024/09/05 08:06:39.861506 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.1783ms +[xorm] [info] 2024/09/05 08:08:39.883168 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7466ms +[xorm] [info] 2024/09/05 08:10:39.873391 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1624ms +[xorm] [info] 2024/09/05 08:12:39.883136 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.8494ms +[xorm] [info] 2024/09/05 08:14:39.869600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1404ms +[xorm] [info] 2024/09/05 08:16:39.870655 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0408ms +[xorm] [info] 2024/09/05 08:18:39.875294 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.419ms +[xorm] [info] 2024/09/05 08:20:39.870423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.664ms +[xorm] [info] 2024/09/05 08:22:39.878938 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4853ms +[xorm] [info] 2024/09/05 08:24:39.867331 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8575ms +[xorm] [info] 2024/09/05 08:26:39.862628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4102ms +[xorm] [info] 2024/09/05 08:28:39.864775 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4509ms +[xorm] [info] 2024/09/05 08:30:39.884810 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9217ms +[xorm] [info] 2024/09/05 08:32:39.866044 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.5924ms +[xorm] [info] 2024/09/05 08:34:39.877163 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3092ms +[xorm] [info] 2024/09/05 08:36:39.882082 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7048ms +[xorm] [info] 2024/09/05 08:38:39.868112 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.61ms +[xorm] [info] 2024/09/05 08:40:39.881479 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7507ms +[xorm] [info] 2024/09/05 08:42:39.865627 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4462ms +[xorm] [info] 2024/09/05 08:44:39.951900 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 153.6384ms +[xorm] [info] 2024/09/05 08:46:39.884801 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9072ms +[xorm] [info] 2024/09/05 08:48:39.872422 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8281ms +[xorm] [info] 2024/09/05 08:50:39.871789 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.8776ms +[xorm] [info] 2024/09/05 08:52:39.865141 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8997ms +[xorm] [info] 2024/09/05 08:54:39.861558 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4741ms +[xorm] [info] 2024/09/05 08:56:39.873595 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6482ms +[xorm] [info] 2024/09/05 08:58:39.887942 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6101ms +[xorm] [info] 2024/09/05 09:00:40.745497 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 951.9692ms +[xorm] [info] 2024/09/05 09:02:40.701599 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 908.1204ms +[xorm] [info] 2024/09/05 09:04:40.643794 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 842.9505ms +[xorm] [info] 2024/09/05 09:06:40.747211 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 944.9517ms +[xorm] [info] 2024/09/05 09:08:40.387933 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 589.433ms +[xorm] [info] 2024/09/05 09:10:39.858351 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 64.5824ms +[xorm] [info] 2024/09/05 09:12:39.875699 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7478ms +[xorm] [info] 2024/09/05 09:14:39.880264 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3ms +[xorm] [info] 2024/09/05 09:16:39.893941 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.6695ms +[xorm] [info] 2024/09/05 09:18:39.876037 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7359ms +[xorm] [info] 2024/09/05 09:20:39.873528 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.092ms +[xorm] [info] 2024/09/05 09:22:39.881474 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8172ms +[xorm] [info] 2024/09/05 09:24:39.890379 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7048ms +[xorm] [info] 2024/09/05 09:26:39.878167 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7574ms +[xorm] [info] 2024/09/05 09:28:39.859498 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7171ms +[xorm] [info] 2024/09/05 09:30:39.885164 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2744ms +[xorm] [info] 2024/09/05 09:32:39.880844 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3003ms +[xorm] [info] 2024/09/05 09:34:39.875006 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8208ms +[xorm] [info] 2024/09/05 09:36:39.872624 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8828ms +[xorm] [info] 2024/09/05 09:38:39.888344 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0441ms +[xorm] [info] 2024/09/05 09:40:39.872194 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3741ms +[xorm] [info] 2024/09/05 09:42:39.863258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6514ms +[xorm] [info] 2024/09/05 09:44:39.887460 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.6145ms +[xorm] [info] 2024/09/05 09:46:39.873606 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8234ms +[xorm] [info] 2024/09/05 09:48:39.872596 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.3047ms +[xorm] [info] 2024/09/05 09:50:39.879266 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0815ms +[xorm] [info] 2024/09/05 09:52:39.869560 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5354ms +[xorm] [info] 2024/09/05 09:54:39.861856 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.727ms +[xorm] [info] 2024/09/05 09:56:39.868207 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.323ms +[xorm] [info] 2024/09/05 09:58:39.915165 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 121.6968ms +[xorm] [info] 2024/09/05 10:00:39.879119 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7244ms +[xorm] [info] 2024/09/05 10:02:39.879536 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0966ms +[xorm] [info] 2024/09/05 10:04:39.865414 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.1159ms +[xorm] [info] 2024/09/05 10:06:39.869047 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.624ms +[xorm] [info] 2024/09/05 10:08:39.865903 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7847ms +[xorm] [info] 2024/09/05 10:10:39.878587 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.276ms +[xorm] [info] 2024/09/05 10:12:39.884948 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6666ms +[xorm] [info] 2024/09/05 10:14:39.891650 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1561ms +[xorm] [info] 2024/09/05 10:16:39.885466 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7304ms +[xorm] [info] 2024/09/05 10:18:39.871869 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7013ms +[xorm] [info] 2024/09/05 10:20:39.872327 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.205ms +[xorm] [info] 2024/09/05 10:22:39.872242 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4735ms +[xorm] [info] 2024/09/05 10:24:39.888555 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5273ms +[xorm] [info] 2024/09/05 10:26:39.865063 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8102ms +[xorm] [info] 2024/09/05 10:28:39.877304 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6148ms +[xorm] [info] 2024/09/05 10:30:39.903231 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 109.4405ms +[xorm] [info] 2024/09/05 10:32:39.872485 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7867ms +[xorm] [info] 2024/09/05 10:34:39.868280 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7439ms +[xorm] [info] 2024/09/05 10:36:39.862123 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2707ms +[xorm] [info] 2024/09/05 10:38:39.885195 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5969ms +[xorm] [info] 2024/09/05 10:40:39.862232 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2997ms +[xorm] [info] 2024/09/05 10:42:39.882197 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5874ms +[xorm] [info] 2024/09/05 10:44:39.878217 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5695ms +[xorm] [info] 2024/09/05 10:46:39.873422 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.0487ms +[xorm] [info] 2024/09/05 10:48:39.869325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7628ms +[xorm] [info] 2024/09/05 10:50:39.883094 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.1618ms +[xorm] [info] 2024/09/05 10:52:39.864925 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7526ms +[xorm] [info] 2024/09/05 10:54:39.902288 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 103.0997ms +[xorm] [info] 2024/09/05 10:56:39.864398 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2555ms +[xorm] [info] 2024/09/05 10:58:39.892283 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.5102ms +[xorm] [info] 2024/09/05 11:00:40.457176 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 654.5893ms +[xorm] [info] 2024/09/05 11:02:39.869406 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1079ms +[xorm] [info] 2024/09/05 11:04:39.857234 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 65.504ms +[xorm] [info] 2024/09/05 11:06:39.864606 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.106ms +[xorm] [info] 2024/09/05 11:08:39.869160 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.423ms +[xorm] [info] 2024/09/05 11:10:39.873467 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2837ms +[xorm] [info] 2024/09/05 11:12:39.867671 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.3394ms +[xorm] [info] 2024/09/05 11:14:39.999301 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 197.0685ms +[xorm] [info] 2024/09/05 11:16:39.874233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2741ms +[xorm] [info] 2024/09/05 11:18:39.862607 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2312ms +[xorm] [info] 2024/09/05 11:20:39.884450 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4061ms +[xorm] [info] 2024/09/05 11:22:39.874600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.911ms +[xorm] [info] 2024/09/05 11:24:39.882700 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.305ms +[xorm] [info] 2024/09/05 11:26:39.883394 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.1848ms +[xorm] [info] 2024/09/05 11:28:39.890767 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.4485ms +[xorm] [info] 2024/09/05 11:30:39.873154 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5662ms +[xorm] [info] 2024/09/05 11:32:39.870743 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7771ms +[xorm] [info] 2024/09/05 11:34:39.866360 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8206ms +[xorm] [info] 2024/09/05 11:36:39.883259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1769ms +[xorm] [info] 2024/09/05 11:38:39.879554 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2269ms +[xorm] [info] 2024/09/05 11:40:39.876700 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2264ms +[xorm] [info] 2024/09/05 11:42:39.862583 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7975ms +[xorm] [info] 2024/09/05 11:44:39.867137 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6422ms +[xorm] [info] 2024/09/05 11:46:39.861173 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2426ms +[xorm] [info] 2024/09/05 11:48:39.868658 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7876ms +[xorm] [info] 2024/09/05 11:50:39.869660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8141ms +[xorm] [info] 2024/09/05 11:52:39.875575 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7189ms +[xorm] [info] 2024/09/05 11:54:39.879020 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1712ms +[xorm] [info] 2024/09/05 11:56:39.868720 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3729ms +[xorm] [info] 2024/09/05 11:58:39.879277 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2463ms +[xorm] [info] 2024/09/05 12:00:39.866386 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7212ms +[xorm] [info] 2024/09/05 12:02:39.878664 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9189ms +[xorm] [info] 2024/09/05 12:04:39.885070 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8185ms +[xorm] [info] 2024/09/05 12:06:39.892682 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.8538ms +[xorm] [info] 2024/09/05 12:08:39.883768 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.3851ms +[xorm] [info] 2024/09/05 12:10:39.875537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.802ms +[xorm] [info] 2024/09/05 12:12:39.869985 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4758ms +[xorm] [info] 2024/09/05 12:14:39.873445 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4851ms +[xorm] [info] 2024/09/05 12:16:39.870080 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4042ms +[xorm] [info] 2024/09/05 12:18:39.981656 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 181.9707ms +[xorm] [info] 2024/09/05 12:20:39.875777 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0867ms +[xorm] [info] 2024/09/05 12:22:39.875816 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3663ms +[xorm] [info] 2024/09/05 12:24:39.872577 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5903ms +[xorm] [info] 2024/09/05 12:26:39.873533 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5471ms +[xorm] [info] 2024/09/05 12:28:39.865118 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.302ms +[xorm] [info] 2024/09/05 12:30:39.902306 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 102.9569ms +[xorm] [info] 2024/09/05 12:32:39.863392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.455ms +[xorm] [info] 2024/09/05 12:34:39.952632 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 159.0467ms +[xorm] [info] 2024/09/05 12:36:39.870801 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8001ms +[xorm] [info] 2024/09/05 12:38:39.867915 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3722ms +[xorm] [info] 2024/09/05 12:40:39.875184 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0627ms +[xorm] [info] 2024/09/05 12:42:39.882732 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1765ms +[xorm] [info] 2024/09/05 12:44:39.874519 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8475ms +[xorm] [info] 2024/09/05 12:46:39.885597 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9375ms +[xorm] [info] 2024/09/05 12:48:39.869413 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3681ms +[xorm] [info] 2024/09/05 12:50:39.870180 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2737ms +[xorm] [info] 2024/09/05 12:52:39.884604 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.5015ms +[xorm] [info] 2024/09/05 12:54:39.898173 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 100.0434ms +[xorm] [info] 2024/09/05 12:56:39.870551 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.288ms +[xorm] [info] 2024/09/05 12:58:39.871784 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5147ms +[xorm] [info] 2024/09/05 13:00:39.880325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9101ms +[xorm] [info] 2024/09/05 13:02:39.867839 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2045ms +[xorm] [info] 2024/09/05 13:04:39.873077 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0645ms +[xorm] [info] 2024/09/05 13:06:39.880928 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7954ms +[xorm] [info] 2024/09/05 13:08:39.875173 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2349ms +[xorm] [info] 2024/09/05 13:10:39.893727 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.6592ms +[xorm] [info] 2024/09/05 13:12:39.890630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3386ms +[xorm] [info] 2024/09/05 13:14:39.872216 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3555ms +[xorm] [info] 2024/09/05 13:16:39.885736 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4387ms +[xorm] [info] 2024/09/05 13:18:39.869064 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8739ms +[xorm] [info] 2024/09/05 13:20:39.879417 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6944ms +[xorm] [info] 2024/09/05 13:22:39.867142 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2399ms +[xorm] [info] 2024/09/05 13:24:39.883285 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.1946ms +[xorm] [info] 2024/09/05 13:26:39.864940 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2532ms +[xorm] [info] 2024/09/05 13:28:39.878513 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8548ms +[xorm] [info] 2024/09/05 13:30:39.873857 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0073ms +[xorm] [info] 2024/09/05 13:32:39.885246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7134ms +[xorm] [info] 2024/09/05 13:34:39.888805 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.6877ms +[xorm] [info] 2024/09/05 13:36:39.888584 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.2104ms +[xorm] [info] 2024/09/05 13:38:39.871564 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6604ms +[xorm] [info] 2024/09/05 13:40:39.865990 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0326ms +[xorm] [info] 2024/09/05 13:42:39.867708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4944ms +[xorm] [info] 2024/09/05 13:44:39.877369 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0159ms +[xorm] [info] 2024/09/05 13:46:39.881716 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7037ms +[xorm] [info] 2024/09/05 13:48:39.884763 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8729ms +[xorm] [info] 2024/09/05 13:50:39.878527 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9869ms +[xorm] [info] 2024/09/05 13:52:40.065389 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 265.4285ms +[xorm] [info] 2024/09/05 13:54:39.943655 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 145.0693ms +[xorm] [info] 2024/09/05 13:56:39.875030 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0633ms +[xorm] [info] 2024/09/05 13:58:39.869803 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8684ms +[xorm] [info] 2024/09/05 14:00:39.869572 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8295ms +[xorm] [info] 2024/09/05 14:02:39.873914 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3982ms +[xorm] [info] 2024/09/05 14:04:39.891588 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.4054ms +[xorm] [info] 2024/09/05 14:06:39.890888 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.2865ms +[xorm] [info] 2024/09/05 14:08:39.866450 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0608ms +[xorm] [info] 2024/09/05 14:10:39.866828 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7212ms +[xorm] [info] 2024/09/05 14:12:39.878295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6291ms +[xorm] [info] 2024/09/05 14:14:39.870815 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5886ms +[xorm] [info] 2024/09/05 14:16:39.881576 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6768ms +[xorm] [info] 2024/09/05 14:18:39.876365 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4371ms +[xorm] [info] 2024/09/05 14:20:39.895046 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.5448ms +[xorm] [info] 2024/09/05 14:22:40.365473 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 570.052ms +[xorm] [info] 2024/09/05 14:24:39.880822 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5446ms +[xorm] [info] 2024/09/05 14:26:39.868529 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7818ms +[xorm] [info] 2024/09/05 14:28:39.882404 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1515ms +[xorm] [info] 2024/09/05 14:30:39.860964 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.0566ms +[xorm] [info] 2024/09/05 14:32:39.876567 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2133ms +[xorm] [info] 2024/09/05 14:34:39.873145 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4685ms +[xorm] [info] 2024/09/05 14:36:39.882159 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6187ms +[xorm] [info] 2024/09/05 14:38:39.870412 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4942ms +[xorm] [info] 2024/09/05 14:40:39.881145 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5035ms +[xorm] [info] 2024/09/05 14:42:39.864237 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0331ms +[xorm] [info] 2024/09/05 14:44:39.898779 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 98.0729ms +[xorm] [info] 2024/09/05 14:46:39.891004 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5029ms +[xorm] [info] 2024/09/05 14:48:39.874798 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1115ms +[xorm] [info] 2024/09/05 14:50:39.866919 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3149ms +[xorm] [info] 2024/09/05 14:52:39.877222 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.056ms +[xorm] [info] 2024/09/05 14:54:39.886423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4435ms +[xorm] [info] 2024/09/05 14:56:39.883903 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5493ms +[xorm] [info] 2024/09/05 14:58:39.876477 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8493ms +[xorm] [info] 2024/09/05 15:00:40.127362 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 246.1263ms +[xorm] [info] 2024/09/05 15:02:39.882336 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6482ms +[xorm] [info] 2024/09/05 15:04:39.891433 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.0972ms +[xorm] [info] 2024/09/05 15:06:39.874035 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.8812ms +[xorm] [info] 2024/09/05 15:08:39.937503 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 135.8246ms +[xorm] [info] 2024/09/05 15:10:39.891421 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2484ms +[xorm] [info] 2024/09/05 15:12:39.874656 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9896ms +[xorm] [info] 2024/09/05 15:14:39.892368 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5409ms +[xorm] [info] 2024/09/05 15:16:39.873086 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1038ms +[xorm] [info] 2024/09/05 15:18:39.874570 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2995ms +[xorm] [info] 2024/09/05 15:20:39.871928 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4165ms +[xorm] [info] 2024/09/05 15:22:39.899415 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 109.93ms +[xorm] [info] 2024/09/05 15:24:39.876063 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.063ms +[xorm] [info] 2024/09/05 15:26:39.870426 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4092ms +[xorm] [info] 2024/09/05 15:28:39.887999 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1736ms +[xorm] [info] 2024/09/05 15:30:39.883502 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.448ms +[xorm] [info] 2024/09/05 15:32:39.869710 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.706ms +[xorm] [info] 2024/09/05 15:34:39.893446 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5228ms +[xorm] [info] 2024/09/05 15:36:39.868628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0836ms +[xorm] [info] 2024/09/05 15:38:39.880120 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1801ms +[xorm] [info] 2024/09/05 15:40:39.877085 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.259ms +[xorm] [info] 2024/09/05 15:42:39.886121 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0773ms +[xorm] [info] 2024/09/05 15:44:39.872874 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5765ms +[xorm] [info] 2024/09/05 15:46:39.876258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1834ms +[xorm] [info] 2024/09/05 15:48:39.889537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2157ms +[xorm] [info] 2024/09/05 15:50:39.888088 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.1188ms +[xorm] [info] 2024/09/05 15:52:39.886539 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.136ms +[xorm] [info] 2024/09/05 15:54:39.872751 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5625ms +[xorm] [info] 2024/09/05 15:56:39.889985 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.0348ms +[xorm] [info] 2024/09/05 15:58:39.872980 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5403ms +[xorm] [info] 2024/09/05 16:00:39.876076 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9649ms +[xorm] [info] 2024/09/05 16:02:39.889867 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3408ms +[xorm] [info] 2024/09/05 16:04:39.873590 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4586ms +[xorm] [info] 2024/09/05 16:06:39.864240 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5679ms +[xorm] [info] 2024/09/05 16:08:39.874179 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.452ms +[xorm] [info] 2024/09/05 16:10:39.857017 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.3102ms +[xorm] [info] 2024/09/05 16:12:39.872793 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.659ms +[xorm] [info] 2024/09/05 16:14:39.905740 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 116.4223ms +[xorm] [info] 2024/09/05 16:16:40.389818 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 588.9868ms +[xorm] [info] 2024/09/05 16:18:39.876368 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1711ms +[xorm] [info] 2024/09/05 16:20:39.868735 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9572ms +[xorm] [info] 2024/09/05 16:22:39.868672 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9761ms +[xorm] [info] 2024/09/05 16:24:39.877160 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3056ms +[xorm] [info] 2024/09/05 16:26:39.873603 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0723ms +[xorm] [info] 2024/09/05 16:28:39.880738 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3189ms +[xorm] [info] 2024/09/05 16:30:39.871036 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0324ms +[xorm] [info] 2024/09/05 16:32:39.872630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3667ms +[xorm] [info] 2024/09/05 16:34:39.869016 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4433ms +[xorm] [info] 2024/09/05 16:36:39.893090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5598ms +[xorm] [info] 2024/09/05 16:38:39.881200 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0795ms +[xorm] [info] 2024/09/05 16:40:39.886145 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0474ms +[xorm] [info] 2024/09/05 16:42:39.890604 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8168ms +[xorm] [info] 2024/09/05 16:44:39.877832 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.0585ms +[xorm] [info] 2024/09/05 16:46:39.876464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8551ms +[xorm] [info] 2024/09/05 16:48:39.872748 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9574ms +[xorm] [info] 2024/09/05 16:50:39.861248 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.8423ms +[xorm] [info] 2024/09/05 16:52:39.888657 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.4223ms +[xorm] [info] 2024/09/05 16:54:39.886282 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3331ms +[xorm] [info] 2024/09/05 16:56:39.868014 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3325ms +[xorm] [info] 2024/09/05 16:58:41.460665 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 1.6704042s +[xorm] [info] 2024/09/05 17:00:39.865681 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8679ms +[xorm] [info] 2024/09/05 17:02:39.876006 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1168ms +[xorm] [info] 2024/09/05 17:04:39.870527 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.3956ms +[xorm] [info] 2024/09/05 17:06:39.859004 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7652ms +[xorm] [info] 2024/09/05 17:08:39.869535 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9102ms +[xorm] [info] 2024/09/05 17:10:39.877627 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3356ms +[xorm] [info] 2024/09/05 17:12:39.878137 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.6524ms +[xorm] [info] 2024/09/05 17:14:39.885642 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6584ms +[xorm] [info] 2024/09/05 17:16:39.888782 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.8396ms +[xorm] [info] 2024/09/05 17:18:39.878827 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1686ms +[xorm] [info] 2024/09/05 17:20:39.880509 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2639ms +[xorm] [info] 2024/09/05 17:22:39.870104 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9002ms +[xorm] [info] 2024/09/05 17:24:39.887640 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9637ms +[xorm] [info] 2024/09/05 17:26:39.872581 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8122ms +[xorm] [info] 2024/09/05 17:28:39.863594 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.3128ms +[xorm] [info] 2024/09/05 17:30:39.875385 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8895ms +[xorm] [info] 2024/09/05 17:32:39.868761 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2059ms +[xorm] [info] 2024/09/05 17:34:39.873469 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2896ms +[xorm] [info] 2024/09/05 17:36:39.875652 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4393ms +[xorm] [info] 2024/09/05 17:38:39.872840 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3033ms +[xorm] [info] 2024/09/05 17:40:39.872230 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1151ms +[xorm] [info] 2024/09/05 17:42:39.877550 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2251ms +[xorm] [info] 2024/09/05 17:44:39.898049 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 98.3659ms +[xorm] [info] 2024/09/05 17:46:39.883956 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.4958ms +[xorm] [info] 2024/09/05 17:48:39.872898 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2161ms +[xorm] [info] 2024/09/05 17:50:39.865199 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6525ms +[xorm] [info] 2024/09/05 17:52:39.879706 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7933ms +[xorm] [info] 2024/09/05 17:54:39.868736 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.6767ms +[xorm] [info] 2024/09/05 17:56:39.882147 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5058ms +[xorm] [info] 2024/09/05 17:58:39.875826 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3059ms +[xorm] [info] 2024/09/05 18:00:39.878735 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6186ms +[xorm] [info] 2024/09/05 18:02:39.894535 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.1318ms +[xorm] [info] 2024/09/05 18:04:39.875662 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0926ms +[xorm] [info] 2024/09/05 18:06:39.893081 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 102.5524ms +[xorm] [info] 2024/09/05 18:08:39.861927 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1699ms +[xorm] [info] 2024/09/05 18:10:39.889879 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.4854ms +[xorm] [info] 2024/09/05 18:12:39.878461 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6344ms +[xorm] [info] 2024/09/05 18:14:39.857054 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.2124ms +[xorm] [info] 2024/09/05 18:16:39.891096 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.4033ms +[xorm] [info] 2024/09/05 18:18:39.879996 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7453ms +[xorm] [info] 2024/09/05 18:20:39.871306 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7553ms +[xorm] [info] 2024/09/05 18:22:39.875627 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6858ms +[xorm] [info] 2024/09/05 18:24:39.870643 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7344ms +[xorm] [info] 2024/09/05 18:26:39.894415 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1203ms +[xorm] [info] 2024/09/05 18:28:39.873502 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3927ms +[xorm] [info] 2024/09/05 18:30:39.872931 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9612ms +[xorm] [info] 2024/09/05 18:32:39.887520 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.0017ms +[xorm] [info] 2024/09/05 18:34:39.874274 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2144ms +[xorm] [info] 2024/09/05 18:36:39.878309 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8087ms +[xorm] [info] 2024/09/05 18:38:39.876104 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2158ms +[xorm] [info] 2024/09/05 18:40:39.873438 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8499ms +[xorm] [info] 2024/09/05 18:42:39.873478 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2842ms +[xorm] [info] 2024/09/05 18:44:39.879403 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2608ms +[xorm] [info] 2024/09/05 18:46:39.871266 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5641ms +[xorm] [info] 2024/09/05 18:48:39.882732 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8591ms +[xorm] [info] 2024/09/05 18:50:39.884167 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9711ms +[xorm] [info] 2024/09/05 18:52:39.859697 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.8729ms +[xorm] [info] 2024/09/05 18:54:39.880950 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.6297ms +[xorm] [info] 2024/09/05 18:56:39.877227 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5812ms +[xorm] [info] 2024/09/05 18:58:39.868425 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6135ms +[xorm] [info] 2024/09/05 19:00:39.879731 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5426ms +[xorm] [info] 2024/09/05 19:02:39.871065 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1882ms +[xorm] [info] 2024/09/05 19:04:39.875278 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7727ms +[xorm] [info] 2024/09/05 19:06:39.879003 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9012ms +[xorm] [info] 2024/09/05 19:08:39.870650 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.9143ms +[xorm] [info] 2024/09/05 19:10:39.860865 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6661ms +[xorm] [info] 2024/09/05 19:12:39.872474 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3504ms +[xorm] [info] 2024/09/05 19:14:39.872694 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6523ms +[xorm] [info] 2024/09/05 19:16:39.874739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4001ms +[xorm] [info] 2024/09/05 19:18:39.870256 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9038ms +[xorm] [info] 2024/09/05 19:20:39.878765 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7974ms +[xorm] [info] 2024/09/05 19:22:39.892207 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2793ms +[xorm] [info] 2024/09/05 19:24:39.864924 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3171ms +[xorm] [info] 2024/09/05 19:26:39.872917 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3642ms +[xorm] [info] 2024/09/05 19:28:39.885076 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6891ms +[xorm] [info] 2024/09/05 19:30:39.880512 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.973ms +[xorm] [info] 2024/09/05 19:32:39.874645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9521ms +[xorm] [info] 2024/09/05 19:34:39.864713 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.173ms +[xorm] [info] 2024/09/05 19:36:39.869346 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7984ms +[xorm] [info] 2024/09/05 19:38:39.880255 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3602ms +[xorm] [info] 2024/09/05 19:40:39.874219 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8465ms +[xorm] [info] 2024/09/05 19:42:39.873168 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4057ms +[xorm] [info] 2024/09/05 19:44:39.867165 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.8731ms +[xorm] [info] 2024/09/05 19:46:39.872121 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1276ms +[xorm] [info] 2024/09/05 19:48:39.871593 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6709ms +[xorm] [info] 2024/09/05 19:50:39.869204 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6726ms +[xorm] [info] 2024/09/05 19:52:39.877303 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.9098ms +[xorm] [info] 2024/09/05 19:54:39.866164 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4974ms +[xorm] [info] 2024/09/05 19:56:39.887214 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5494ms +[xorm] [info] 2024/09/05 19:58:39.871800 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2216ms +[xorm] [info] 2024/09/05 20:00:39.861161 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0943ms +[xorm] [info] 2024/09/05 20:02:39.893082 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9371ms +[xorm] [info] 2024/09/05 20:04:39.890409 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.667ms +[xorm] [info] 2024/09/05 20:06:39.866394 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6574ms +[xorm] [info] 2024/09/05 20:08:39.876115 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9424ms +[xorm] [info] 2024/09/05 20:10:39.876657 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8076ms +[xorm] [info] 2024/09/05 20:12:39.872788 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.505ms +[xorm] [info] 2024/09/05 20:14:39.878599 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1303ms +[xorm] [info] 2024/09/05 20:16:39.880222 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5374ms +[xorm] [info] 2024/09/05 20:18:39.872689 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0996ms +[xorm] [info] 2024/09/05 20:20:39.873637 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.743ms +[xorm] [info] 2024/09/05 20:22:39.893023 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.7312ms +[xorm] [info] 2024/09/05 20:24:39.876160 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2695ms +[xorm] [info] 2024/09/05 20:26:39.873599 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3395ms +[xorm] [info] 2024/09/05 20:28:39.863996 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.2975ms +[xorm] [info] 2024/09/05 20:30:39.873860 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9724ms +[xorm] [info] 2024/09/05 20:32:39.871821 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3207ms +[xorm] [info] 2024/09/05 20:34:39.873667 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6525ms +[xorm] [info] 2024/09/05 20:36:39.872964 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1365ms +[xorm] [info] 2024/09/05 20:38:39.885471 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8004ms +[xorm] [info] 2024/09/05 20:40:39.875641 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5147ms +[xorm] [info] 2024/09/05 20:42:39.877218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7249ms +[xorm] [info] 2024/09/05 20:44:39.870392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.118ms +[xorm] [info] 2024/09/05 20:46:39.879064 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.5294ms +[xorm] [info] 2024/09/05 20:48:39.866596 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.2698ms +[xorm] [info] 2024/09/05 20:50:39.872837 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.284ms +[xorm] [info] 2024/09/05 20:52:39.877304 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5047ms +[xorm] [info] 2024/09/05 20:54:39.869303 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2991ms +[xorm] [info] 2024/09/05 20:56:39.888881 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9226ms +[xorm] [info] 2024/09/05 20:58:39.864340 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7964ms +[xorm] [info] 2024/09/05 21:00:39.891110 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8311ms +[xorm] [info] 2024/09/05 21:02:39.889835 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1362ms +[xorm] [info] 2024/09/05 21:04:39.878574 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.647ms +[xorm] [info] 2024/09/05 21:06:39.859938 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2714ms +[xorm] [info] 2024/09/05 21:08:39.868287 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.0225ms +[xorm] [info] 2024/09/05 21:10:39.874992 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0115ms +[xorm] [info] 2024/09/05 21:12:39.894916 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.8271ms +[xorm] [info] 2024/09/05 21:14:39.870810 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9703ms +[xorm] [info] 2024/09/05 21:16:39.868826 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8817ms +[xorm] [info] 2024/09/05 21:18:39.883948 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5569ms +[xorm] [info] 2024/09/05 21:20:39.888053 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6237ms +[xorm] [info] 2024/09/05 21:22:39.884788 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4488ms +[xorm] [info] 2024/09/05 21:24:39.877913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0598ms +[xorm] [info] 2024/09/05 21:26:39.881501 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3095ms +[xorm] [info] 2024/09/05 21:28:39.889112 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.9262ms +[xorm] [info] 2024/09/05 21:30:39.874677 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7537ms +[xorm] [info] 2024/09/05 21:32:39.884748 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2382ms +[xorm] [info] 2024/09/05 21:34:39.884046 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4511ms +[xorm] [info] 2024/09/05 21:36:39.867078 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9429ms +[xorm] [info] 2024/09/05 21:38:39.879228 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3706ms +[xorm] [info] 2024/09/05 21:40:39.868918 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2246ms +[xorm] [info] 2024/09/05 21:42:39.881479 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.023ms +[xorm] [info] 2024/09/05 21:44:39.880078 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0531ms +[xorm] [info] 2024/09/05 21:46:39.866379 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9117ms +[xorm] [info] 2024/09/05 21:48:39.880458 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7634ms +[xorm] [info] 2024/09/05 21:50:39.875261 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9743ms +[xorm] [info] 2024/09/05 21:52:39.870923 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1066ms +[xorm] [info] 2024/09/05 21:54:39.864148 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.4034ms +[xorm] [info] 2024/09/05 21:56:39.874670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2485ms +[xorm] [info] 2024/09/05 21:58:39.882288 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.2838ms +[xorm] [info] 2024/09/05 22:00:39.877242 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0167ms +[xorm] [info] 2024/09/05 22:02:39.874359 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7603ms +[xorm] [info] 2024/09/05 22:04:39.868390 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6877ms +[xorm] [info] 2024/09/05 22:06:39.878266 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8003ms +[xorm] [info] 2024/09/05 22:08:39.872658 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0799ms +[xorm] [info] 2024/09/05 22:10:39.865162 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1661ms +[xorm] [info] 2024/09/05 22:12:39.865285 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.3942ms +[xorm] [info] 2024/09/05 22:14:39.871714 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.15ms +[xorm] [info] 2024/09/05 22:16:39.875648 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9621ms +[xorm] [info] 2024/09/05 22:18:39.879187 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3075ms +[xorm] [info] 2024/09/05 22:20:39.884279 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.2688ms +[xorm] [info] 2024/09/05 22:22:39.868399 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.426ms +[xorm] [info] 2024/09/05 22:24:39.867319 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0527ms +[xorm] [info] 2024/09/05 22:26:39.879605 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.524ms +[xorm] [info] 2024/09/05 22:28:39.865555 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8443ms +[xorm] [info] 2024/09/05 22:30:39.872986 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3272ms +[xorm] [info] 2024/09/05 22:32:39.871702 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2296ms +[xorm] [info] 2024/09/05 22:34:39.877351 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.839ms +[xorm] [info] 2024/09/05 22:36:39.872129 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4093ms +[xorm] [info] 2024/09/05 22:38:39.888580 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.182ms +[xorm] [info] 2024/09/05 22:40:39.876467 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6385ms +[xorm] [info] 2024/09/05 22:42:39.876089 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0008ms +[xorm] [info] 2024/09/05 22:44:39.879237 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.0961ms +[xorm] [info] 2024/09/05 22:46:39.875516 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.539ms +[xorm] [info] 2024/09/05 22:48:39.876181 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3377ms +[xorm] [info] 2024/09/05 22:50:39.873216 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7566ms +[xorm] [info] 2024/09/05 22:52:39.875257 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.386ms +[xorm] [info] 2024/09/05 22:54:39.886598 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2771ms +[xorm] [info] 2024/09/05 22:56:39.873351 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.114ms +[xorm] [info] 2024/09/05 22:58:39.884603 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.7544ms +[xorm] [info] 2024/09/05 23:00:39.882548 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3205ms +[xorm] [info] 2024/09/05 23:02:39.874522 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9078ms +[xorm] [info] 2024/09/05 23:04:39.889384 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2535ms +[xorm] [info] 2024/09/05 23:06:39.867011 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9348ms +[xorm] [info] 2024/09/05 23:08:39.877343 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4019ms +[xorm] [info] 2024/09/05 23:10:39.885850 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5757ms +[xorm] [info] 2024/09/05 23:12:39.864709 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4573ms +[xorm] [info] 2024/09/05 23:14:39.880207 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4539ms +[xorm] [info] 2024/09/05 23:16:39.860889 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6268ms +[xorm] [info] 2024/09/05 23:18:39.887530 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5554ms +[xorm] [info] 2024/09/05 23:20:39.877961 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5139ms +[xorm] [info] 2024/09/05 23:22:39.873387 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8457ms +[xorm] [info] 2024/09/05 23:24:39.864849 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2254ms +[xorm] [info] 2024/09/05 23:26:39.885882 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9822ms +[xorm] [info] 2024/09/05 23:28:39.865128 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.285ms +[xorm] [info] 2024/09/05 23:30:39.871306 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0512ms +[xorm] [info] 2024/09/05 23:32:39.864778 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7093ms +[xorm] [info] 2024/09/05 23:34:39.867672 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0119ms +[xorm] [info] 2024/09/05 23:36:39.874848 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.175ms +[xorm] [info] 2024/09/05 23:38:39.862710 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7973ms +[xorm] [info] 2024/09/05 23:40:39.882126 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1486ms +[xorm] [info] 2024/09/05 23:42:39.866926 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.4325ms +[xorm] [info] 2024/09/05 23:44:39.881354 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2477ms +[xorm] [info] 2024/09/05 23:46:39.885758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6939ms +[xorm] [info] 2024/09/05 23:48:39.866978 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0099ms +[xorm] [info] 2024/09/05 23:50:39.886941 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7424ms +[xorm] [info] 2024/09/05 23:52:39.894401 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5367ms +[xorm] [info] 2024/09/05 23:54:39.869789 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.133ms +[xorm] [info] 2024/09/05 23:56:39.878218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.31ms +[xorm] [info] 2024/09/05 23:58:39.872755 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0977ms +[xorm] [info] 2024/09/06 00:00:39.873903 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9617ms +[xorm] [info] 2024/09/06 00:02:39.885071 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2837ms +[xorm] [info] 2024/09/06 00:04:39.877630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9763ms +[xorm] [info] 2024/09/06 00:06:39.886787 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.6681ms +[xorm] [info] 2024/09/06 00:08:39.861885 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.7788ms +[xorm] [info] 2024/09/06 00:10:39.867399 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.67ms +[xorm] [info] 2024/09/06 00:12:39.872798 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2948ms +[xorm] [info] 2024/09/06 00:14:39.887295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7322ms +[xorm] [info] 2024/09/06 00:16:39.880483 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.966ms +[xorm] [info] 2024/09/06 00:18:39.887546 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7923ms +[xorm] [info] 2024/09/06 00:20:39.873822 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7278ms +[xorm] [info] 2024/09/06 00:22:39.877539 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8868ms +[xorm] [info] 2024/09/06 00:24:39.869764 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.363ms +[xorm] [info] 2024/09/06 00:26:39.880737 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7441ms +[xorm] [info] 2024/09/06 00:28:39.861213 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 65.8924ms +[xorm] [info] 2024/09/06 00:30:39.867348 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8006ms +[xorm] [info] 2024/09/06 00:32:39.871386 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.9465ms +[xorm] [info] 2024/09/06 00:34:39.872908 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9474ms +[xorm] [info] 2024/09/06 00:36:39.888628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4388ms +[xorm] [info] 2024/09/06 00:38:39.867022 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1974ms +[xorm] [info] 2024/09/06 00:40:39.886132 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2651ms +[xorm] [info] 2024/09/06 00:42:39.883845 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.6779ms +[xorm] [info] 2024/09/06 00:44:39.867076 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9841ms +[xorm] [info] 2024/09/06 00:46:39.875537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.463ms +[xorm] [info] 2024/09/06 00:48:39.880354 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5658ms +[xorm] [info] 2024/09/06 00:50:39.873090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1489ms +[xorm] [info] 2024/09/06 00:52:39.880317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3584ms +[xorm] [info] 2024/09/06 00:54:39.869686 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7869ms +[xorm] [info] 2024/09/06 00:56:39.882896 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7305ms +[xorm] [info] 2024/09/06 00:58:39.867584 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6276ms +[xorm] [info] 2024/09/06 01:00:39.888966 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.3311ms +[xorm] [info] 2024/09/06 01:02:39.873348 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7782ms +[xorm] [info] 2024/09/06 01:04:39.882952 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.9825ms +[xorm] [info] 2024/09/06 01:06:39.879700 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.086ms +[xorm] [info] 2024/09/06 01:08:39.871845 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8851ms +[xorm] [info] 2024/09/06 01:10:39.888755 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5948ms +[xorm] [info] 2024/09/06 01:12:39.873378 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6483ms +[xorm] [info] 2024/09/06 01:14:39.875804 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2829ms +[xorm] [info] 2024/09/06 01:16:39.891780 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8121ms +[xorm] [info] 2024/09/06 01:18:39.871416 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.8271ms +[xorm] [info] 2024/09/06 01:20:39.877947 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6087ms +[xorm] [info] 2024/09/06 01:22:39.867637 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9788ms +[xorm] [info] 2024/09/06 01:24:39.868438 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6892ms +[xorm] [info] 2024/09/06 01:26:39.875482 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3293ms +[xorm] [info] 2024/09/06 01:28:39.886423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6521ms +[xorm] [info] 2024/09/06 01:30:39.864329 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9348ms +[xorm] [info] 2024/09/06 01:32:39.874856 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8178ms +[xorm] [info] 2024/09/06 01:34:39.863805 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.6734ms +[xorm] [info] 2024/09/06 01:36:39.892064 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 101.8519ms +[xorm] [info] 2024/09/06 01:38:39.864965 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5717ms +[xorm] [info] 2024/09/06 01:40:39.870187 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.635ms +[xorm] [info] 2024/09/06 01:42:39.861232 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.2349ms +[xorm] [info] 2024/09/06 01:44:39.894873 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0264ms +[xorm] [info] 2024/09/06 01:46:39.874714 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.465ms +[xorm] [info] 2024/09/06 01:48:39.865905 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6199ms +[xorm] [info] 2024/09/06 01:50:39.878413 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.79ms +[xorm] [info] 2024/09/06 01:52:39.875159 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7972ms +[xorm] [info] 2024/09/06 01:54:39.876235 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9191ms +[xorm] [info] 2024/09/06 01:56:39.875946 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6814ms +[xorm] [info] 2024/09/06 01:58:39.877808 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9702ms +[xorm] [info] 2024/09/06 02:00:39.880346 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.067ms +[xorm] [info] 2024/09/06 02:02:39.877509 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8444ms +[xorm] [info] 2024/09/06 02:04:39.861112 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2259ms +[xorm] [info] 2024/09/06 02:06:39.873921 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7719ms +[xorm] [info] 2024/09/06 02:08:39.875824 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3749ms +[xorm] [info] 2024/09/06 02:10:39.884633 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.8991ms +[xorm] [info] 2024/09/06 02:12:39.868251 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.5422ms +[xorm] [info] 2024/09/06 02:14:39.879753 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1865ms +[xorm] [info] 2024/09/06 02:16:39.886974 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.453ms +[xorm] [info] 2024/09/06 02:18:39.885502 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5666ms +[xorm] [info] 2024/09/06 02:20:39.888377 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2896ms +[xorm] [info] 2024/09/06 02:22:39.892686 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3795ms +[xorm] [info] 2024/09/06 02:24:39.873811 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5315ms +[xorm] [info] 2024/09/06 02:26:39.877644 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2704ms +[xorm] [info] 2024/09/06 02:28:39.876015 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.886ms +[xorm] [info] 2024/09/06 02:30:39.868264 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8891ms +[xorm] [info] 2024/09/06 02:32:39.881756 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8701ms +[xorm] [info] 2024/09/06 02:34:39.862790 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.4783ms +[xorm] [info] 2024/09/06 02:36:39.878263 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.185ms +[xorm] [info] 2024/09/06 02:38:39.890680 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9805ms +[xorm] [info] 2024/09/06 02:40:39.880850 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1797ms +[xorm] [info] 2024/09/06 02:42:39.863185 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1116ms +[xorm] [info] 2024/09/06 02:44:39.862483 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.421ms +[xorm] [info] 2024/09/06 02:46:39.866865 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5802ms +[xorm] [info] 2024/09/06 02:48:39.872142 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4743ms +[xorm] [info] 2024/09/06 02:50:39.872833 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7712ms +[xorm] [info] 2024/09/06 02:52:39.864223 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.4688ms +[xorm] [info] 2024/09/06 02:54:39.862164 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2013ms +[xorm] [info] 2024/09/06 02:56:39.874414 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.291ms +[xorm] [info] 2024/09/06 02:58:39.864209 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7379ms +[xorm] [info] 2024/09/06 03:00:39.869904 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3727ms +[xorm] [info] 2024/09/06 03:02:39.877440 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9149ms +[xorm] [info] 2024/09/06 03:04:39.862746 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4012ms +[xorm] [info] 2024/09/06 03:06:39.872497 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5104ms +[xorm] [info] 2024/09/06 03:08:39.887281 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5474ms +[xorm] [info] 2024/09/06 03:10:39.865335 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2314ms +[xorm] [info] 2024/09/06 03:12:39.887835 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7552ms +[xorm] [info] 2024/09/06 03:14:39.878581 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.3357ms +[xorm] [info] 2024/09/06 03:16:39.883825 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1752ms +[xorm] [info] 2024/09/06 03:18:39.876302 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8359ms +[xorm] [info] 2024/09/06 03:20:39.875557 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3029ms +[xorm] [info] 2024/09/06 03:22:39.877544 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6229ms +[xorm] [info] 2024/09/06 03:24:39.876066 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4864ms +[xorm] [info] 2024/09/06 03:26:39.870321 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5416ms +[xorm] [info] 2024/09/06 03:28:39.868763 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7631ms +[xorm] [info] 2024/09/06 03:30:39.884067 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.478ms +[xorm] [info] 2024/09/06 03:32:39.876016 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.426ms +[xorm] [info] 2024/09/06 03:34:39.892274 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0577ms +[xorm] [info] 2024/09/06 03:36:39.873938 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6374ms +[xorm] [info] 2024/09/06 03:38:39.892391 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1431ms +[xorm] [info] 2024/09/06 03:40:39.883785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3322ms +[xorm] [info] 2024/09/06 03:42:39.865600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5654ms +[xorm] [info] 2024/09/06 03:44:39.864516 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4062ms +[xorm] [info] 2024/09/06 03:46:39.875215 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0093ms +[xorm] [info] 2024/09/06 03:48:39.879268 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4597ms +[xorm] [info] 2024/09/06 03:50:39.879758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3103ms +[xorm] [info] 2024/09/06 03:52:39.886250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.9097ms +[xorm] [info] 2024/09/06 03:54:39.888495 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0519ms +[xorm] [info] 2024/09/06 03:56:39.882241 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.5974ms +[xorm] [info] 2024/09/06 03:58:39.869004 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.912ms +[xorm] [info] 2024/09/06 04:00:39.884482 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.2455ms +[xorm] [info] 2024/09/06 04:02:39.884278 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.8282ms +[xorm] [info] 2024/09/06 04:04:39.880432 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.4384ms +[xorm] [info] 2024/09/06 04:06:39.881954 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3623ms +[xorm] [info] 2024/09/06 04:08:39.872136 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8821ms +[xorm] [info] 2024/09/06 04:10:39.872277 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9827ms +[xorm] [info] 2024/09/06 04:12:39.888184 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.0321ms +[xorm] [info] 2024/09/06 04:14:39.872427 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7889ms +[xorm] [info] 2024/09/06 04:16:39.877039 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3371ms +[xorm] [info] 2024/09/06 04:18:39.876527 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0473ms +[xorm] [info] 2024/09/06 04:20:39.867281 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0198ms +[xorm] [info] 2024/09/06 04:22:39.884033 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1212ms +[xorm] [info] 2024/09/06 04:24:39.877693 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3116ms +[xorm] [info] 2024/09/06 04:26:39.876889 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.0949ms +[xorm] [info] 2024/09/06 04:28:39.866726 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1681ms +[xorm] [info] 2024/09/06 04:30:39.870892 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5129ms +[xorm] [info] 2024/09/06 04:32:39.869253 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7089ms +[xorm] [info] 2024/09/06 04:34:39.874233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4086ms +[xorm] [info] 2024/09/06 04:36:39.883236 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.3319ms +[xorm] [info] 2024/09/06 04:38:39.877257 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2217ms +[xorm] [info] 2024/09/06 04:40:39.865750 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.2092ms +[xorm] [info] 2024/09/06 04:42:39.868185 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7942ms +[xorm] [info] 2024/09/06 04:44:39.877543 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1318ms +[xorm] [info] 2024/09/06 04:46:39.887696 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.5307ms +[xorm] [info] 2024/09/06 04:48:39.884707 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.654ms +[xorm] [info] 2024/09/06 04:50:39.867531 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4079ms +[xorm] [info] 2024/09/06 04:52:39.876977 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3784ms +[xorm] [info] 2024/09/06 04:54:39.869042 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8083ms +[xorm] [info] 2024/09/06 04:56:39.870557 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5997ms +[xorm] [info] 2024/09/06 04:58:39.868758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9942ms +[xorm] [info] 2024/09/06 05:00:39.861435 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2066ms +[xorm] [info] 2024/09/06 05:02:39.882352 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2992ms +[xorm] [info] 2024/09/06 05:04:39.883749 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5533ms +[xorm] [info] 2024/09/06 05:06:39.890175 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.3587ms +[xorm] [info] 2024/09/06 05:08:39.879942 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6293ms +[xorm] [info] 2024/09/06 05:10:39.876756 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2661ms +[xorm] [info] 2024/09/06 05:12:39.871073 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3209ms +[xorm] [info] 2024/09/06 05:14:39.865543 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.8109ms +[xorm] [info] 2024/09/06 05:16:39.876295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1536ms +[xorm] [info] 2024/09/06 05:18:39.867683 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9608ms +[xorm] [info] 2024/09/06 05:20:39.877268 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3468ms +[xorm] [info] 2024/09/06 05:22:39.892356 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5872ms +[xorm] [info] 2024/09/06 05:24:39.876707 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6609ms +[xorm] [info] 2024/09/06 05:26:39.884617 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6286ms +[xorm] [info] 2024/09/06 05:28:39.874882 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4146ms +[xorm] [info] 2024/09/06 05:30:39.884095 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1477ms +[xorm] [info] 2024/09/06 05:32:39.861177 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.476ms +[xorm] [info] 2024/09/06 05:34:39.881039 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7535ms +[xorm] [info] 2024/09/06 05:36:39.882043 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9ms +[xorm] [info] 2024/09/06 05:38:39.876681 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5742ms +[xorm] [info] 2024/09/06 05:40:39.862944 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9428ms +[xorm] [info] 2024/09/06 05:42:39.872632 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6699ms +[xorm] [info] 2024/09/06 05:44:39.882439 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8514ms +[xorm] [info] 2024/09/06 05:46:39.879778 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0477ms +[xorm] [info] 2024/09/06 05:48:39.876991 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0674ms +[xorm] [info] 2024/09/06 05:50:39.894270 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.7327ms +[xorm] [info] 2024/09/06 05:52:39.863074 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.313ms +[xorm] [info] 2024/09/06 05:54:39.873372 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0181ms +[xorm] [info] 2024/09/06 05:56:39.868411 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3045ms +[xorm] [info] 2024/09/06 05:58:39.875762 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2404ms +[xorm] [info] 2024/09/06 06:00:39.876189 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9323ms +[xorm] [info] 2024/09/06 06:02:39.875822 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1911ms +[xorm] [info] 2024/09/06 06:04:39.865426 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9593ms +[xorm] [info] 2024/09/06 06:06:39.861514 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3154ms +[xorm] [info] 2024/09/06 06:08:39.868198 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6804ms +[xorm] [info] 2024/09/06 06:10:39.879809 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6746ms +[xorm] [info] 2024/09/06 06:12:39.866283 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6631ms +[xorm] [info] 2024/09/06 06:14:39.875478 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0755ms +[xorm] [info] 2024/09/06 06:16:39.879375 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3759ms +[xorm] [info] 2024/09/06 06:18:39.882244 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7057ms +[xorm] [info] 2024/09/06 06:20:39.875578 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2151ms +[xorm] [info] 2024/09/06 06:22:39.859102 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.6084ms +[xorm] [info] 2024/09/06 06:24:39.867239 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0664ms +[xorm] [info] 2024/09/06 06:26:39.870303 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3326ms +[xorm] [info] 2024/09/06 06:28:39.893741 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6537ms +[xorm] [info] 2024/09/06 06:30:39.885372 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4756ms +[xorm] [info] 2024/09/06 06:32:39.887767 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7011ms +[xorm] [info] 2024/09/06 06:34:39.865785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7444ms +[xorm] [info] 2024/09/06 06:36:39.887458 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.216ms +[xorm] [info] 2024/09/06 06:38:39.880220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8434ms +[xorm] [info] 2024/09/06 06:40:39.864920 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7602ms +[xorm] [info] 2024/09/06 06:42:39.858041 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.7516ms +[xorm] [info] 2024/09/06 06:44:39.883625 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6523ms +[xorm] [info] 2024/09/06 06:46:39.874240 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7497ms +[xorm] [info] 2024/09/06 06:48:39.862291 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1569ms +[xorm] [info] 2024/09/06 06:50:39.871539 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2468ms +[xorm] [info] 2024/09/06 06:52:39.865494 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4539ms +[xorm] [info] 2024/09/06 06:54:39.880301 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5834ms +[xorm] [info] 2024/09/06 06:56:39.865863 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5683ms +[xorm] [info] 2024/09/06 06:58:39.890026 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6699ms +[xorm] [info] 2024/09/06 07:00:39.884503 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5981ms +[xorm] [info] 2024/09/06 07:02:39.864546 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1826ms +[xorm] [info] 2024/09/06 07:04:39.875787 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2252ms +[xorm] [info] 2024/09/06 07:06:39.889586 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6731ms +[xorm] [info] 2024/09/06 07:08:39.882243 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2214ms +[xorm] [info] 2024/09/06 07:10:39.873094 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4525ms +[xorm] [info] 2024/09/06 07:12:39.872049 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5883ms +[xorm] [info] 2024/09/06 07:14:39.870528 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8708ms +[xorm] [info] 2024/09/06 07:16:39.871006 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2562ms +[xorm] [info] 2024/09/06 07:18:39.876763 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.889ms +[xorm] [info] 2024/09/06 07:20:39.869462 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1103ms +[xorm] [info] 2024/09/06 07:22:39.869024 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.0677ms +[xorm] [info] 2024/09/06 07:24:39.872430 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1211ms +[xorm] [info] 2024/09/06 07:26:39.886995 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.299ms +[xorm] [info] 2024/09/06 07:28:39.877442 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2747ms +[xorm] [info] 2024/09/06 07:30:39.881280 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0557ms +[xorm] [info] 2024/09/06 07:32:39.876283 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8504ms +[xorm] [info] 2024/09/06 07:34:39.861661 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7561ms +[xorm] [info] 2024/09/06 07:36:39.884004 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7842ms +[xorm] [info] 2024/09/06 07:38:39.876107 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.284ms +[xorm] [info] 2024/09/06 07:40:39.883514 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7647ms +[xorm] [info] 2024/09/06 07:42:39.882286 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5297ms +[xorm] [info] 2024/09/06 07:44:39.870563 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1868ms +[xorm] [info] 2024/09/06 07:46:39.869550 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.9325ms +[xorm] [info] 2024/09/06 07:48:39.869974 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7232ms +[xorm] [info] 2024/09/06 07:50:39.877943 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1182ms +[xorm] [info] 2024/09/06 07:52:39.877515 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5592ms +[xorm] [info] 2024/09/06 07:54:39.873951 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.8954ms +[xorm] [info] 2024/09/06 07:56:39.868754 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0974ms +[xorm] [info] 2024/09/06 07:58:39.879103 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9378ms +[xorm] [info] 2024/09/06 08:00:39.865492 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7778ms +[xorm] [info] 2024/09/06 08:02:39.884519 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7152ms +[xorm] [info] 2024/09/06 08:04:39.881548 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.8197ms +[xorm] [info] 2024/09/06 08:06:39.864585 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1344ms +[xorm] [info] 2024/09/06 08:08:39.879277 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5147ms +[xorm] [info] 2024/09/06 08:10:39.861448 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0597ms +[xorm] [info] 2024/09/06 08:12:39.886546 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9439ms +[xorm] [info] 2024/09/06 08:14:39.876168 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.0887ms +[xorm] [info] 2024/09/06 08:16:39.864968 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5395ms +[xorm] [info] 2024/09/06 08:18:39.879913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8763ms +[xorm] [info] 2024/09/06 08:20:39.871986 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7254ms +[xorm] [info] 2024/09/06 08:22:39.887837 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1521ms +[xorm] [info] 2024/09/06 08:24:39.882802 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3474ms +[xorm] [info] 2024/09/06 08:26:39.864866 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1433ms +[xorm] [info] 2024/09/06 08:28:39.882392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.7702ms +[xorm] [info] 2024/09/06 08:30:39.884185 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7043ms +[xorm] [info] 2024/09/06 08:32:39.878803 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8072ms +[xorm] [info] 2024/09/06 08:34:39.887811 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1308ms +[xorm] [info] 2024/09/06 08:36:39.887364 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7564ms +[xorm] [info] 2024/09/06 08:38:39.870742 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9084ms +[xorm] [info] 2024/09/06 08:40:39.875349 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8454ms +[xorm] [info] 2024/09/06 08:42:39.894490 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.726ms +[xorm] [info] 2024/09/06 08:44:39.874265 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5452ms +[xorm] [info] 2024/09/06 08:46:39.866196 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8579ms +[xorm] [info] 2024/09/06 08:48:39.882663 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9603ms +[xorm] [info] 2024/09/06 08:50:39.871841 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5661ms +[xorm] [info] 2024/09/06 08:52:39.889824 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1974ms +[xorm] [info] 2024/09/06 08:54:39.875172 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.283ms +[xorm] [info] 2024/09/06 08:56:39.867170 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6621ms +[xorm] [info] 2024/09/06 08:58:39.883022 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6875ms +[xorm] [info] 2024/09/06 09:00:40.729338 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 930.282ms +[xorm] [info] 2024/09/06 09:02:40.530566 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 742.6573ms +[xorm] [info] 2024/09/06 09:04:40.103342 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 314.2978ms +[xorm] [info] 2024/09/06 09:06:40.715566 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 919.1043ms +[xorm] [info] 2024/09/06 09:08:40.702908 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 913.1865ms +[xorm] [info] 2024/09/06 09:10:39.892310 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.7584ms +[xorm] [info] 2024/09/06 09:12:39.863505 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4967ms +[xorm] [info] 2024/09/06 09:14:39.908247 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 104.6577ms +[xorm] [info] 2024/09/06 09:16:39.868210 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0796ms +[xorm] [info] 2024/09/06 09:18:39.867572 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5652ms +[xorm] [info] 2024/09/06 09:20:39.867882 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2564ms +[xorm] [info] 2024/09/06 09:22:39.877522 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7888ms +[xorm] [info] 2024/09/06 09:24:39.873785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0127ms +[xorm] [info] 2024/09/06 09:26:39.867816 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8885ms +[xorm] [info] 2024/09/06 09:28:39.898275 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 108.0078ms +[xorm] [info] 2024/09/06 09:30:39.900958 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 103.9524ms +[xorm] [info] 2024/09/06 09:32:39.866615 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6458ms +[xorm] [info] 2024/09/06 09:34:39.873955 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0044ms +[xorm] [info] 2024/09/06 09:36:39.897904 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 103.1179ms +[xorm] [info] 2024/09/06 09:38:39.993470 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 196.696ms +[xorm] [info] 2024/09/06 09:40:39.891672 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.0924ms +[xorm] [info] 2024/09/06 09:42:39.938879 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 134.1949ms +[xorm] [info] 2024/09/06 09:44:39.863374 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1411ms +[xorm] [info] 2024/09/06 09:46:39.870145 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.1851ms +[xorm] [info] 2024/09/06 09:48:39.872586 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.343ms +[xorm] [info] 2024/09/06 09:50:39.877442 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3883ms +[xorm] [info] 2024/09/06 09:52:39.934321 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 144.2851ms +[xorm] [info] 2024/09/06 09:54:39.866084 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.1074ms +[xorm] [info] 2024/09/06 09:56:39.878249 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.197ms +[xorm] [info] 2024/09/06 09:58:39.886083 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1673ms +[xorm] [info] 2024/09/06 10:00:39.861314 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0968ms +[xorm] [info] 2024/09/06 10:02:39.882237 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0859ms +[xorm] [info] 2024/09/06 10:04:39.923135 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 102.9048ms +[xorm] [info] 2024/09/06 10:06:39.877342 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6243ms +[xorm] [info] 2024/09/06 10:08:40.362430 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 553.3379ms +[xorm] [info] 2024/09/06 10:10:39.876808 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9064ms +[xorm] [info] 2024/09/06 10:12:39.881469 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2882ms +[xorm] [info] 2024/09/06 10:14:39.878619 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3324ms +[xorm] [info] 2024/09/06 10:16:39.880328 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6295ms +[xorm] [info] 2024/09/06 10:18:39.885776 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7775ms +[xorm] [info] 2024/09/06 10:20:39.883713 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4699ms +[xorm] [info] 2024/09/06 10:22:39.871770 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0363ms +[xorm] [info] 2024/09/06 10:24:39.876893 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3113ms +[xorm] [info] 2024/09/06 10:26:39.882199 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.867ms +[xorm] [info] 2024/09/06 10:28:39.942541 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 142.1067ms +[xorm] [info] 2024/09/06 10:30:39.946366 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 130.1774ms +[xorm] [info] 2024/09/06 10:32:39.876341 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1641ms +[xorm] [info] 2024/09/06 10:34:39.867905 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1026ms +[xorm] [info] 2024/09/06 10:36:40.011447 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 205.3324ms +[xorm] [info] 2024/09/06 10:38:39.891042 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2861ms +[xorm] [info] 2024/09/06 10:40:39.879723 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7208ms +[xorm] [info] 2024/09/06 10:42:39.871608 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6214ms +[xorm] [info] 2024/09/06 10:44:39.863832 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6592ms +[xorm] [info] 2024/09/06 10:46:39.922267 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 122.9285ms +[xorm] [info] 2024/09/06 10:48:39.873494 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4819ms +[xorm] [info] 2024/09/06 10:50:39.889975 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.825ms +[xorm] [info] 2024/09/06 10:52:39.878574 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7637ms +[xorm] [info] 2024/09/06 10:54:39.878822 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.0801ms +[xorm] [info] 2024/09/06 10:56:39.865479 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0837ms +[xorm] [info] 2024/09/06 10:58:39.878493 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0732ms +[xorm] [info] 2024/09/06 11:00:39.865028 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8053ms +[xorm] [info] 2024/09/06 11:02:39.882793 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3648ms +[xorm] [info] 2024/09/06 11:04:39.868105 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6167ms +[xorm] [info] 2024/09/06 11:06:39.880079 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0616ms +[xorm] [info] 2024/09/06 11:08:39.878478 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6553ms +[xorm] [info] 2024/09/06 11:10:39.870657 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.2154ms +[xorm] [info] 2024/09/06 11:12:39.864189 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.052ms +[xorm] [info] 2024/09/06 11:14:39.878957 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9852ms +[xorm] [info] 2024/09/06 11:16:39.884239 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1254ms +[xorm] [info] 2024/09/06 11:18:39.877274 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6525ms +[xorm] [info] 2024/09/06 11:20:39.876454 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6101ms +[xorm] [info] 2024/09/06 11:22:39.939738 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 138.8642ms +[xorm] [info] 2024/09/06 11:24:39.883678 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2568ms +[xorm] [info] 2024/09/06 11:25:58.236399 PING DATABASE mysql +[xorm] [info] 2024/09/06 11:25:58.283254 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 27.5557ms +[xorm] [info] 2024/09/06 11:25:58.311042 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 27.6825ms +[xorm] [info] 2024/09/06 11:26:17.724449 PING DATABASE mysql +[xorm] [info] 2024/09/06 11:26:17.759039 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 23.2572ms +[xorm] [info] 2024/09/06 11:26:17.783722 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 24.6837ms +[xorm] [info] 2024/09/06 11:28:17.948262 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7207ms +[xorm] [info] 2024/09/06 11:30:17.923161 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9661ms +[xorm] [info] 2024/09/06 11:32:17.949124 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.1445ms +[xorm] [info] 2024/09/06 11:34:17.928079 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1955ms +[xorm] [info] 2024/09/06 11:36:17.927225 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9142ms +[xorm] [info] 2024/09/06 11:38:17.942965 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2405ms +[xorm] [info] 2024/09/06 11:40:17.937180 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0359ms +[xorm] [info] 2024/09/06 11:42:17.933889 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4557ms +[xorm] [info] 2024/09/06 11:44:17.957141 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9345ms +[xorm] [info] 2024/09/06 11:46:17.932398 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0316ms +[xorm] [info] 2024/09/06 11:48:17.929211 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3839ms +[xorm] [info] 2024/09/06 11:50:17.929927 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7666ms +[xorm] [info] 2024/09/06 11:52:17.949158 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4345ms +[xorm] [info] 2024/09/06 11:54:17.924424 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.846ms +[xorm] [info] 2024/09/06 11:56:17.928456 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.9514ms +[xorm] [info] 2024/09/06 11:58:17.936476 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2125ms +[xorm] [info] 2024/09/06 12:00:17.939065 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3786ms +[xorm] [info] 2024/09/06 12:02:18.123667 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 271.0161ms +[xorm] [info] 2024/09/06 12:02:46.071841 PING DATABASE mysql +[xorm] [info] 2024/09/06 12:02:46.113977 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 27.6923ms +[xorm] [info] 2024/09/06 12:02:46.143164 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 28.5928ms +[xorm] [info] 2024/09/06 12:04:46.278575 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4528ms +[xorm] [info] 2024/09/06 12:06:46.290969 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8649ms +[xorm] [info] 2024/09/06 12:08:46.294796 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.4095ms +[xorm] [info] 2024/09/06 12:10:46.303022 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.3835ms +[xorm] [info] 2024/09/06 12:12:46.290898 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9988ms +[xorm] [info] 2024/09/06 12:14:46.298580 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5989ms +[xorm] [info] 2024/09/06 12:16:46.299123 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.4425ms +[xorm] [info] 2024/09/06 12:18:46.290057 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0545ms +[xorm] [info] 2024/09/06 12:20:46.310116 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 98.3481ms +[xorm] [info] 2024/09/06 12:22:46.303953 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2751ms +[xorm] [info] 2024/09/06 12:24:46.287279 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1132ms +[xorm] [info] 2024/09/06 12:26:46.287003 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4761ms +[xorm] [info] 2024/09/06 12:28:46.293515 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7318ms +[xorm] [info] 2024/09/06 12:30:46.288470 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4502ms +[xorm] [info] 2024/09/06 12:32:46.276647 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9488ms +[xorm] [info] 2024/09/06 12:34:46.284558 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0939ms +[xorm] [info] 2024/09/06 12:36:46.287064 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2387ms +[xorm] [info] 2024/09/06 12:38:46.302216 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.4705ms +[xorm] [info] 2024/09/06 12:40:46.287871 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9814ms +[xorm] [info] 2024/09/06 12:42:46.289257 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4207ms +[xorm] [info] 2024/09/06 12:44:46.289847 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0908ms +[xorm] [info] 2024/09/06 12:46:46.296621 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3967ms +[xorm] [info] 2024/09/06 12:48:46.293524 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2523ms +[xorm] [info] 2024/09/06 12:50:46.291559 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5231ms +[xorm] [info] 2024/09/06 12:52:46.278090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3374ms +[xorm] [info] 2024/09/06 12:54:46.277206 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5833ms +[xorm] [info] 2024/09/06 12:56:46.292247 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2694ms +[xorm] [info] 2024/09/06 12:58:46.301206 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8752ms +[xorm] [info] 2024/09/06 13:00:46.290586 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8523ms +[xorm] [info] 2024/09/06 13:02:46.283732 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.8753ms +[xorm] [info] 2024/09/06 13:04:46.289223 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4411ms +[xorm] [info] 2024/09/06 13:06:46.281806 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0447ms +[xorm] [info] 2024/09/06 13:08:46.282860 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2343ms +[xorm] [info] 2024/09/06 13:10:46.289551 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8923ms +[xorm] [info] 2024/09/06 13:12:46.296501 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2265ms +[xorm] [info] 2024/09/06 13:14:46.287113 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1428ms +[xorm] [info] 2024/09/06 13:16:46.277147 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1524ms +[xorm] [info] 2024/09/06 13:18:46.283401 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7485ms +[xorm] [info] 2024/09/06 13:20:46.275697 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4611ms +[xorm] [info] 2024/09/06 13:22:46.284026 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7231ms +[xorm] [info] 2024/09/06 13:24:46.287361 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0175ms +[xorm] [info] 2024/09/06 13:26:46.303470 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1038ms +[xorm] [info] 2024/09/06 13:28:46.290857 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7565ms +[xorm] [info] 2024/09/06 13:30:46.288937 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9919ms +[xorm] [info] 2024/09/06 13:32:46.292736 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4385ms +[xorm] [info] 2024/09/06 13:34:46.288530 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8666ms +[xorm] [info] 2024/09/06 13:36:46.308704 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.9059ms +[xorm] [info] 2024/09/06 13:38:46.288233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1551ms +[xorm] [info] 2024/09/06 13:40:46.308126 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.752ms +[xorm] [info] 2024/09/06 13:42:46.279931 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8032ms +[xorm] [info] 2024/09/06 13:44:46.339992 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 114.3283ms +[xorm] [info] 2024/09/06 13:46:46.285101 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0457ms +[xorm] [info] 2024/09/06 13:48:46.288119 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7048ms +[xorm] [info] 2024/09/06 13:50:46.286684 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6876ms +[xorm] [info] 2024/09/06 13:52:46.278715 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8843ms +[xorm] [info] 2024/09/06 13:54:46.280234 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7011ms +[xorm] [info] 2024/09/06 13:56:46.286186 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3712ms +[xorm] [info] 2024/09/06 13:58:46.296379 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8386ms +[xorm] [info] 2024/09/06 14:00:46.284093 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9315ms +[xorm] [info] 2024/09/06 14:02:46.282752 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9208ms +[xorm] [info] 2024/09/06 14:04:46.307762 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.3014ms +[xorm] [info] 2024/09/06 14:06:46.283340 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4023ms +[xorm] [info] 2024/09/06 14:08:46.301765 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1492ms +[xorm] [info] 2024/09/06 14:10:46.291264 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.991ms +[xorm] [info] 2024/09/06 14:12:46.280687 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2933ms +[xorm] [info] 2024/09/06 14:14:46.282387 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.6351ms +[xorm] [info] 2024/09/06 14:16:46.294838 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0637ms +[xorm] [info] 2024/09/06 14:18:46.286278 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4498ms +[xorm] [info] 2024/09/06 14:20:46.295233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7518ms +[xorm] [info] 2024/09/06 14:22:46.296810 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6365ms +[xorm] [info] 2024/09/06 14:24:46.291716 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6495ms +[xorm] [info] 2024/09/06 14:26:46.284544 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3132ms +[xorm] [info] 2024/09/06 14:28:46.307292 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.2675ms +[xorm] [info] 2024/09/06 14:30:46.307708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2565ms +[xorm] [info] 2024/09/06 14:32:46.302248 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8233ms +[xorm] [info] 2024/09/06 14:34:46.286621 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5897ms +[xorm] [info] 2024/09/06 14:36:46.289275 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8213ms +[xorm] [info] 2024/09/06 14:38:46.290251 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5313ms +[xorm] [info] 2024/09/06 14:40:46.292707 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6259ms +[xorm] [info] 2024/09/06 14:42:46.300002 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.2735ms +[xorm] [info] 2024/09/06 14:44:46.299584 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.8321ms +[xorm] [info] 2024/09/06 14:46:46.317091 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4487ms +[xorm] [info] 2024/09/06 14:48:46.306633 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.261ms +[xorm] [info] 2024/09/06 14:50:46.321861 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 114.9124ms +[xorm] [info] 2024/09/06 14:52:46.289175 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0553ms +[xorm] [info] 2024/09/06 14:54:46.303197 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.986ms +[xorm] [info] 2024/09/06 14:56:46.299233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1014ms +[xorm] [info] 2024/09/06 14:58:46.910836 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 707.0528ms +[xorm] [info] 2024/09/06 15:00:46.286619 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.5249ms +[xorm] [info] 2024/09/06 15:02:46.285256 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8655ms +[xorm] [info] 2024/09/06 15:04:46.298085 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.2058ms +[xorm] [info] 2024/09/06 15:06:46.279123 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9257ms +[xorm] [info] 2024/09/06 15:08:46.313065 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.1267ms +[xorm] [info] 2024/09/06 15:10:46.287348 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3732ms +[xorm] [info] 2024/09/06 15:12:46.287410 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.3508ms +[xorm] [info] 2024/09/06 15:14:46.398258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 181.8646ms +[xorm] [info] 2024/09/06 15:16:46.309062 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.0883ms +[xorm] [info] 2024/09/06 15:18:46.288867 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8772ms +[xorm] [info] 2024/09/06 15:20:46.279220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5792ms +[xorm] [info] 2024/09/06 15:22:46.293540 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2614ms +[xorm] [info] 2024/09/06 15:24:46.301848 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5051ms +[xorm] [info] 2024/09/06 15:26:46.281867 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1396ms +[xorm] [info] 2024/09/06 15:28:46.296742 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.6269ms +[xorm] [info] 2024/09/06 15:30:46.301337 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1415ms +[xorm] [info] 2024/09/06 15:32:46.289240 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8521ms +[xorm] [info] 2024/09/06 15:34:46.313861 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 100.1598ms +[xorm] [info] 2024/09/06 15:36:46.287403 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6654ms +[xorm] [info] 2024/09/06 15:38:46.295255 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4321ms +[xorm] [info] 2024/09/06 15:40:46.291707 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1083ms +[xorm] [info] 2024/09/06 15:42:46.303311 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3646ms +[xorm] [info] 2024/09/06 15:44:46.290246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.828ms +[xorm] [info] 2024/09/06 15:46:46.287863 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4915ms +[xorm] [info] 2024/09/06 15:48:46.295806 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6237ms +[xorm] [info] 2024/09/06 15:50:46.288703 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.314ms +[xorm] [info] 2024/09/06 15:52:46.319611 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 103.1549ms +[xorm] [info] 2024/09/06 15:54:46.295218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3021ms +[xorm] [info] 2024/09/06 15:56:46.289152 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7721ms +[xorm] [info] 2024/09/06 15:58:46.305165 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1786ms +[xorm] [info] 2024/09/06 16:00:46.298711 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1349ms +[xorm] [info] 2024/09/06 16:02:46.280764 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.815ms +[xorm] [info] 2024/09/06 16:04:46.285013 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9556ms +[xorm] [info] 2024/09/06 16:06:46.282220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.9543ms +[xorm] [info] 2024/09/06 16:08:46.303318 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0386ms +[xorm] [info] 2024/09/06 16:10:46.289807 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1545ms +[xorm] [info] 2024/09/06 16:12:46.308642 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 100.6927ms +[xorm] [info] 2024/09/06 16:14:46.293953 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.9087ms +[xorm] [info] 2024/09/06 16:16:46.283049 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6676ms +[xorm] [info] 2024/09/06 16:18:46.510762 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 293.5263ms +[xorm] [info] 2024/09/06 16:20:46.310741 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.2783ms +[xorm] [info] 2024/09/06 16:22:46.302726 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1149ms +[xorm] [info] 2024/09/06 16:24:46.281311 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2288ms +[xorm] [info] 2024/09/06 16:26:46.287445 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.509ms +[xorm] [info] 2024/09/06 16:28:46.280503 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7274ms +[xorm] [info] 2024/09/06 16:30:46.289546 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1336ms +[xorm] [info] 2024/09/06 16:32:46.284031 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2606ms +[xorm] [info] 2024/09/06 16:34:46.295671 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7089ms +[xorm] [info] 2024/09/06 16:36:46.306324 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.8387ms +[xorm] [info] 2024/09/06 16:38:46.294994 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6135ms +[xorm] [info] 2024/09/06 16:40:46.295332 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4745ms +[xorm] [info] 2024/09/06 16:42:46.286843 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7609ms +[xorm] [info] 2024/09/06 16:44:46.284175 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0451ms +[xorm] [info] 2024/09/06 16:46:46.294159 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.388ms +[xorm] [info] 2024/09/06 16:48:46.295479 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7986ms +[xorm] [info] 2024/09/06 16:50:46.307931 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0242ms +[xorm] [info] 2024/09/06 16:52:46.275497 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.8688ms +[xorm] [info] 2024/09/06 16:54:46.277724 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7656ms +[xorm] [info] 2024/09/06 16:56:46.299551 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9021ms +[xorm] [info] 2024/09/06 16:58:46.301736 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.5428ms +[xorm] [info] 2024/09/06 17:00:46.301708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.999ms +[xorm] [info] 2024/09/06 17:02:46.288958 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2951ms +[xorm] [info] 2024/09/06 17:04:46.312742 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.3627ms +[xorm] [info] 2024/09/06 17:06:46.298992 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.7583ms +[xorm] [info] 2024/09/06 17:08:46.291878 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0568ms +[xorm] [info] 2024/09/06 17:10:46.284257 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2045ms +[xorm] [info] 2024/09/06 17:12:46.287368 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.994ms +[xorm] [info] 2024/09/06 17:14:46.287594 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0565ms +[xorm] [info] 2024/09/06 17:16:46.291780 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4956ms +[xorm] [info] 2024/09/06 17:18:46.295246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1243ms +[xorm] [info] 2024/09/06 17:20:46.300114 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0787ms +[xorm] [info] 2024/09/06 17:22:46.297224 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4135ms +[xorm] [info] 2024/09/06 17:24:46.283812 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0288ms +[xorm] [info] 2024/09/06 17:26:46.295648 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2345ms +[xorm] [info] 2024/09/06 17:28:46.279886 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6879ms +[xorm] [info] 2024/09/06 17:30:46.283393 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4417ms +[xorm] [info] 2024/09/06 17:32:46.305151 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.2122ms +[xorm] [info] 2024/09/06 17:34:46.299226 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5147ms +[xorm] [info] 2024/09/06 17:36:46.287110 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0404ms +[xorm] [info] 2024/09/06 17:38:46.277183 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1954ms +[xorm] [info] 2024/09/06 17:40:46.300429 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.4349ms +[xorm] [info] 2024/09/06 17:42:46.285883 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4505ms +[xorm] [info] 2024/09/06 17:44:46.307628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7798ms +[xorm] [info] 2024/09/06 17:46:46.283093 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6266ms +[xorm] [info] 2024/09/06 17:48:46.273923 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7041ms +[xorm] [info] 2024/09/06 17:50:46.282222 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7126ms +[xorm] [info] 2024/09/06 17:52:46.285645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4224ms +[xorm] [info] 2024/09/06 17:54:46.561493 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 352.7313ms +[xorm] [info] 2024/09/06 17:56:46.293799 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6816ms +[xorm] [info] 2024/09/06 17:58:46.285671 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5818ms +[xorm] [info] 2024/09/06 18:00:46.287401 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.0215ms +[xorm] [info] 2024/09/06 18:02:46.292509 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4415ms +[xorm] [info] 2024/09/06 18:04:46.364339 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 152.3314ms +[xorm] [info] 2024/09/06 18:06:46.298928 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.953ms +[xorm] [info] 2024/09/06 18:08:46.320417 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 107.9638ms +[xorm] [info] 2024/09/06 18:10:46.286764 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6094ms +[xorm] [info] 2024/09/06 18:12:46.281652 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1021ms +[xorm] [info] 2024/09/06 18:14:46.285114 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.9405ms +[xorm] [info] 2024/09/06 18:16:46.295132 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5561ms +[xorm] [info] 2024/09/06 18:18:46.294683 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1173ms +[xorm] [info] 2024/09/06 18:20:46.284310 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4965ms +[xorm] [info] 2024/09/06 18:22:46.295250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4831ms +[xorm] [info] 2024/09/06 18:24:46.292960 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.0579ms +[xorm] [info] 2024/09/06 18:26:46.296595 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.178ms +[xorm] [info] 2024/09/06 18:28:46.278676 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.53ms +[xorm] [info] 2024/09/06 18:30:46.292188 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7694ms +[xorm] [info] 2024/09/06 18:32:46.277637 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9069ms +[xorm] [info] 2024/09/06 18:34:46.297550 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.5555ms +[xorm] [info] 2024/09/06 18:36:46.287915 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.984ms +[xorm] [info] 2024/09/06 18:38:46.303143 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 97.9187ms +[xorm] [info] 2024/09/06 18:40:46.285429 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9053ms +[xorm] [info] 2024/09/06 18:42:46.302974 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1514ms +[xorm] [info] 2024/09/06 18:44:46.291916 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.912ms +[xorm] [info] 2024/09/06 18:46:46.286286 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7388ms +[xorm] [info] 2024/09/06 18:48:46.297960 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1663ms +[xorm] [info] 2024/09/06 18:50:46.285670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4037ms +[xorm] [info] 2024/09/06 18:52:46.298464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1231ms +[xorm] [info] 2024/09/06 18:54:46.309325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.1626ms +[xorm] [info] 2024/09/06 18:56:46.286089 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9919ms +[xorm] [info] 2024/09/06 18:58:46.274058 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.92ms +[xorm] [info] 2024/09/06 19:00:46.290951 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1409ms +[xorm] [info] 2024/09/06 19:02:46.305624 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.3136ms +[xorm] [info] 2024/09/06 19:04:46.280094 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1129ms +[xorm] [info] 2024/09/06 19:06:46.286613 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3177ms +[xorm] [info] 2024/09/06 19:08:46.278545 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0728ms +[xorm] [info] 2024/09/06 19:10:46.279005 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5154ms +[xorm] [info] 2024/09/06 19:12:46.291026 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.239ms +[xorm] [info] 2024/09/06 19:14:46.281279 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2133ms +[xorm] [info] 2024/09/06 19:16:46.288496 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1537ms +[xorm] [info] 2024/09/06 19:18:46.302392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.7821ms +[xorm] [info] 2024/09/06 19:20:46.290062 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.372ms +[xorm] [info] 2024/09/06 19:22:46.308670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.01ms +[xorm] [info] 2024/09/06 19:24:46.317347 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 100.5213ms +[xorm] [info] 2024/09/06 19:26:46.299955 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.9709ms +[xorm] [info] 2024/09/06 19:28:46.299300 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4752ms +[xorm] [info] 2024/09/06 19:30:46.293424 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2547ms +[xorm] [info] 2024/09/06 19:32:46.283719 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7853ms +[xorm] [info] 2024/09/06 19:34:46.296907 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8722ms +[xorm] [info] 2024/09/06 19:36:46.285792 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5138ms +[xorm] [info] 2024/09/06 19:38:46.286035 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0677ms +[xorm] [info] 2024/09/06 19:40:46.282591 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8561ms +[xorm] [info] 2024/09/06 19:42:46.285422 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.708ms +[xorm] [info] 2024/09/06 19:44:46.285690 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6738ms +[xorm] [info] 2024/09/06 19:46:46.278432 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7485ms +[xorm] [info] 2024/09/06 19:48:46.296491 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0848ms +[xorm] [info] 2024/09/06 19:50:46.293968 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.0504ms +[xorm] [info] 2024/09/06 19:52:46.280856 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7695ms +[xorm] [info] 2024/09/06 19:54:46.289145 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8468ms +[xorm] [info] 2024/09/06 19:56:46.283208 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7822ms +[xorm] [info] 2024/09/06 19:58:46.277516 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5718ms +[xorm] [info] 2024/09/06 20:00:46.289645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.03ms +[xorm] [info] 2024/09/06 20:02:46.296648 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3331ms +[xorm] [info] 2024/09/06 20:04:46.280839 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2367ms +[xorm] [info] 2024/09/06 20:06:46.282365 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5141ms +[xorm] [info] 2024/09/06 20:08:46.297797 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8023ms +[xorm] [info] 2024/09/06 20:10:46.295455 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5338ms +[xorm] [info] 2024/09/06 20:12:46.288525 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.103ms +[xorm] [info] 2024/09/06 20:14:46.289904 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6913ms +[xorm] [info] 2024/09/06 20:16:46.287755 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8086ms +[xorm] [info] 2024/09/06 20:18:46.286553 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0903ms +[xorm] [info] 2024/09/06 20:20:46.290194 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1252ms +[xorm] [info] 2024/09/06 20:22:46.304480 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.733ms +[xorm] [info] 2024/09/06 20:24:46.291192 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0825ms +[xorm] [info] 2024/09/06 20:26:46.294362 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3182ms +[xorm] [info] 2024/09/06 20:28:46.281513 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1788ms +[xorm] [info] 2024/09/06 20:30:46.293388 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2598ms +[xorm] [info] 2024/09/06 20:32:46.288491 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1067ms +[xorm] [info] 2024/09/06 20:34:46.283676 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9604ms +[xorm] [info] 2024/09/06 20:36:46.299179 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2772ms +[xorm] [info] 2024/09/06 20:38:46.300190 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0797ms +[xorm] [info] 2024/09/06 20:40:46.293854 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.422ms +[xorm] [info] 2024/09/06 20:42:46.275815 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.82ms +[xorm] [info] 2024/09/06 20:44:46.290595 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1056ms +[xorm] [info] 2024/09/06 20:46:46.289810 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2767ms +[xorm] [info] 2024/09/06 20:48:46.283022 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9347ms +[xorm] [info] 2024/09/06 20:50:46.303543 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.3779ms +[xorm] [info] 2024/09/06 20:52:46.296946 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.6266ms +[xorm] [info] 2024/09/06 20:54:46.291418 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2643ms +[xorm] [info] 2024/09/06 20:56:46.290798 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.005ms +[xorm] [info] 2024/09/06 20:58:46.290131 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0271ms +[xorm] [info] 2024/09/06 21:00:46.295023 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8473ms +[xorm] [info] 2024/09/06 21:02:46.292631 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2841ms +[xorm] [info] 2024/09/06 21:04:46.281943 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9835ms +[xorm] [info] 2024/09/06 21:06:46.285577 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7973ms +[xorm] [info] 2024/09/06 21:08:46.288481 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.0009ms +[xorm] [info] 2024/09/06 21:10:46.305678 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4515ms +[xorm] [info] 2024/09/06 21:12:46.294821 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.198ms +[xorm] [info] 2024/09/06 21:14:46.284443 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8526ms +[xorm] [info] 2024/09/06 21:16:46.287551 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8983ms +[xorm] [info] 2024/09/06 21:18:46.301407 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4447ms +[xorm] [info] 2024/09/06 21:20:46.293462 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2554ms +[xorm] [info] 2024/09/06 21:22:46.318433 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 100.5582ms +[xorm] [info] 2024/09/06 21:24:46.297757 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1796ms +[xorm] [info] 2024/09/06 21:26:46.287017 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1216ms +[xorm] [info] 2024/09/06 21:28:46.280107 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.1468ms +[xorm] [info] 2024/09/06 21:30:46.281631 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1272ms +[xorm] [info] 2024/09/06 21:32:46.291980 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.955ms +[xorm] [info] 2024/09/06 21:34:46.284431 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.2528ms +[xorm] [info] 2024/09/06 21:36:46.291055 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2453ms +[xorm] [info] 2024/09/06 21:38:46.282242 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6013ms +[xorm] [info] 2024/09/06 21:40:46.281478 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8647ms +[xorm] [info] 2024/09/06 21:42:46.295470 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3661ms +[xorm] [info] 2024/09/06 21:44:46.289378 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1287ms +[xorm] [info] 2024/09/06 21:46:46.283072 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2017ms +[xorm] [info] 2024/09/06 21:48:46.300752 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4625ms +[xorm] [info] 2024/09/06 21:50:46.287332 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2937ms +[xorm] [info] 2024/09/06 21:52:46.296705 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0007ms +[xorm] [info] 2024/09/06 21:54:46.289063 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.2833ms +[xorm] [info] 2024/09/06 21:56:46.283673 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2595ms +[xorm] [info] 2024/09/06 21:58:46.278321 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9521ms +[xorm] [info] 2024/09/06 22:00:46.282767 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.9416ms +[xorm] [info] 2024/09/06 22:02:46.285918 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2797ms +[xorm] [info] 2024/09/06 22:04:46.287889 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7797ms +[xorm] [info] 2024/09/06 22:06:46.281935 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7466ms +[xorm] [info] 2024/09/06 22:08:46.286906 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.293ms +[xorm] [info] 2024/09/06 22:10:46.291813 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3878ms +[xorm] [info] 2024/09/06 22:12:46.280596 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0701ms +[xorm] [info] 2024/09/06 22:14:46.292696 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6697ms +[xorm] [info] 2024/09/06 22:16:46.279272 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9531ms +[xorm] [info] 2024/09/06 22:18:46.299094 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9315ms +[xorm] [info] 2024/09/06 22:20:46.291288 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.857ms +[xorm] [info] 2024/09/06 22:22:46.294306 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8834ms +[xorm] [info] 2024/09/06 22:24:46.293864 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.765ms +[xorm] [info] 2024/09/06 22:26:46.287970 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.4041ms +[xorm] [info] 2024/09/06 22:28:46.288876 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1044ms +[xorm] [info] 2024/09/06 22:30:46.290405 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0561ms +[xorm] [info] 2024/09/06 22:32:46.278152 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.0237ms +[xorm] [info] 2024/09/06 22:34:46.285630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3929ms +[xorm] [info] 2024/09/06 22:36:46.279639 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8415ms +[xorm] [info] 2024/09/06 22:38:46.289031 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2809ms +[xorm] [info] 2024/09/06 22:40:46.286168 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2276ms +[xorm] [info] 2024/09/06 22:42:46.296852 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5447ms +[xorm] [info] 2024/09/06 22:44:46.293976 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7933ms +[xorm] [info] 2024/09/06 22:46:46.293630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6435ms +[xorm] [info] 2024/09/06 22:48:46.288368 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6552ms +[xorm] [info] 2024/09/06 22:50:46.280566 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1274ms +[xorm] [info] 2024/09/06 22:52:46.276890 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1876ms +[xorm] [info] 2024/09/06 22:54:46.299171 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.7065ms +[xorm] [info] 2024/09/06 22:56:46.293495 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.0923ms +[xorm] [info] 2024/09/06 22:58:46.293541 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0586ms +[xorm] [info] 2024/09/06 23:00:46.282551 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6103ms +[xorm] [info] 2024/09/06 23:02:46.275704 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3579ms +[xorm] [info] 2024/09/06 23:04:46.281774 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.997ms +[xorm] [info] 2024/09/06 23:06:46.296942 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9762ms +[xorm] [info] 2024/09/06 23:08:46.284923 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5853ms +[xorm] [info] 2024/09/06 23:10:46.292614 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7581ms +[xorm] [info] 2024/09/06 23:12:46.289829 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.8887ms +[xorm] [info] 2024/09/06 23:14:46.275315 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3466ms +[xorm] [info] 2024/09/06 23:16:46.273660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3614ms +[xorm] [info] 2024/09/06 23:18:46.303908 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3688ms +[xorm] [info] 2024/09/06 23:20:46.283576 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3566ms +[xorm] [info] 2024/09/06 23:22:46.285699 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5674ms +[xorm] [info] 2024/09/06 23:24:46.290834 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9503ms +[xorm] [info] 2024/09/06 23:26:46.279650 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3224ms +[xorm] [info] 2024/09/06 23:28:46.291054 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.9483ms +[xorm] [info] 2024/09/06 23:30:46.287640 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5218ms +[xorm] [info] 2024/09/06 23:32:46.289346 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8295ms +[xorm] [info] 2024/09/06 23:34:46.284200 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.8163ms +[xorm] [info] 2024/09/06 23:36:46.291648 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1824ms +[xorm] [info] 2024/09/06 23:38:46.271784 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.2066ms +[xorm] [info] 2024/09/06 23:40:46.277918 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 65.9167ms +[xorm] [info] 2024/09/06 23:42:46.281231 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.7446ms +[xorm] [info] 2024/09/06 23:44:46.304099 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6001ms +[xorm] [info] 2024/09/06 23:46:46.291246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3897ms +[xorm] [info] 2024/09/06 23:48:46.294308 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.4969ms +[xorm] [info] 2024/09/06 23:50:46.282561 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5267ms +[xorm] [info] 2024/09/06 23:52:46.289068 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3279ms +[xorm] [info] 2024/09/06 23:54:46.283908 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.034ms +[xorm] [info] 2024/09/06 23:56:46.290716 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8465ms +[xorm] [info] 2024/09/06 23:58:46.297063 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8696ms +[xorm] [info] 2024/09/07 00:00:46.298166 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9858ms +[xorm] [info] 2024/09/07 00:02:46.290320 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3141ms +[xorm] [info] 2024/09/07 00:04:46.288663 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7561ms +[xorm] [info] 2024/09/07 00:06:46.288781 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6918ms +[xorm] [info] 2024/09/07 00:08:46.287965 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7146ms +[xorm] [info] 2024/09/07 00:10:46.279791 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5156ms +[xorm] [info] 2024/09/07 00:12:46.299940 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0006ms +[xorm] [info] 2024/09/07 00:14:46.282472 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.9531ms +[xorm] [info] 2024/09/07 00:16:46.281185 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2067ms +[xorm] [info] 2024/09/07 00:18:46.287489 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9127ms +[xorm] [info] 2024/09/07 00:20:46.281934 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3504ms +[xorm] [info] 2024/09/07 00:22:46.300834 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.112ms +[xorm] [info] 2024/09/07 00:24:46.280877 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0673ms +[xorm] [info] 2024/09/07 00:26:46.277999 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.1757ms +[xorm] [info] 2024/09/07 00:28:46.276676 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6723ms +[xorm] [info] 2024/09/07 00:30:46.300429 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5478ms +[xorm] [info] 2024/09/07 00:32:46.285390 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4353ms +[xorm] [info] 2024/09/07 00:34:46.292166 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9223ms +[xorm] [info] 2024/09/07 00:36:46.294364 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3749ms +[xorm] [info] 2024/09/07 00:38:46.288682 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0063ms +[xorm] [info] 2024/09/07 00:40:46.291951 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8397ms +[xorm] [info] 2024/09/07 00:42:46.297943 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1739ms +[xorm] [info] 2024/09/07 00:44:46.276805 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9579ms +[xorm] [info] 2024/09/07 00:46:46.282406 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3574ms +[xorm] [info] 2024/09/07 00:48:46.289001 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3374ms +[xorm] [info] 2024/09/07 00:50:46.287951 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4827ms +[xorm] [info] 2024/09/07 00:52:46.300198 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9007ms +[xorm] [info] 2024/09/07 00:54:46.285617 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.4814ms +[xorm] [info] 2024/09/07 00:56:46.297724 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.309ms +[xorm] [info] 2024/09/07 00:58:46.296101 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.0964ms +[xorm] [info] 2024/09/07 01:00:46.289032 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1365ms +[xorm] [info] 2024/09/07 01:02:46.289317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4567ms +[xorm] [info] 2024/09/07 01:04:46.291697 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0476ms +[xorm] [info] 2024/09/07 01:06:46.301928 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5704ms +[xorm] [info] 2024/09/07 01:08:46.293083 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.9873ms +[xorm] [info] 2024/09/07 01:10:46.291511 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6769ms +[xorm] [info] 2024/09/07 01:12:46.296263 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8139ms +[xorm] [info] 2024/09/07 01:14:46.282156 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7971ms +[xorm] [info] 2024/09/07 01:16:46.279743 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6712ms +[xorm] [info] 2024/09/07 01:18:46.284653 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7333ms +[xorm] [info] 2024/09/07 01:20:46.296478 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4003ms +[xorm] [info] 2024/09/07 01:22:46.303623 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3189ms +[xorm] [info] 2024/09/07 01:24:46.275679 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4974ms +[xorm] [info] 2024/09/07 01:26:46.278687 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0777ms +[xorm] [info] 2024/09/07 01:28:46.289184 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2995ms +[xorm] [info] 2024/09/07 01:30:46.284600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9926ms +[xorm] [info] 2024/09/07 01:32:46.275846 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.244ms +[xorm] [info] 2024/09/07 01:34:46.284619 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3805ms +[xorm] [info] 2024/09/07 01:36:46.291790 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2076ms +[xorm] [info] 2024/09/07 01:38:46.298045 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.511ms +[xorm] [info] 2024/09/07 01:40:46.281490 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9101ms +[xorm] [info] 2024/09/07 01:42:46.278092 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8172ms +[xorm] [info] 2024/09/07 01:44:46.286989 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.022ms +[xorm] [info] 2024/09/07 01:46:46.298326 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.2585ms +[xorm] [info] 2024/09/07 01:48:46.286603 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1743ms +[xorm] [info] 2024/09/07 01:50:46.293457 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.081ms +[xorm] [info] 2024/09/07 01:52:46.285859 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8305ms +[xorm] [info] 2024/09/07 01:54:46.287098 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9894ms +[xorm] [info] 2024/09/07 01:56:46.280940 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.832ms +[xorm] [info] 2024/09/07 01:58:46.290928 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6079ms +[xorm] [info] 2024/09/07 02:00:46.276502 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7213ms +[xorm] [info] 2024/09/07 02:02:46.287508 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4891ms +[xorm] [info] 2024/09/07 02:04:46.290147 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6036ms +[xorm] [info] 2024/09/07 02:06:46.278240 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9225ms +[xorm] [info] 2024/09/07 02:08:46.293033 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9471ms +[xorm] [info] 2024/09/07 02:10:46.299341 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7669ms +[xorm] [info] 2024/09/07 02:12:46.289737 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1994ms +[xorm] [info] 2024/09/07 02:14:46.283173 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4483ms +[xorm] [info] 2024/09/07 02:16:46.289231 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8912ms +[xorm] [info] 2024/09/07 02:18:46.277428 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2689ms +[xorm] [info] 2024/09/07 02:20:46.298566 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.7665ms +[xorm] [info] 2024/09/07 02:22:46.279713 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4611ms +[xorm] [info] 2024/09/07 02:24:46.276076 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.748ms +[xorm] [info] 2024/09/07 02:26:46.276200 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1509ms +[xorm] [info] 2024/09/07 02:28:46.295918 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.577ms +[xorm] [info] 2024/09/07 02:30:46.285557 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6602ms +[xorm] [info] 2024/09/07 02:32:46.293007 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6287ms +[xorm] [info] 2024/09/07 02:34:46.295137 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8239ms +[xorm] [info] 2024/09/07 02:36:46.279668 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5397ms +[xorm] [info] 2024/09/07 02:38:46.296336 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.828ms +[xorm] [info] 2024/09/07 02:40:46.275179 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7288ms +[xorm] [info] 2024/09/07 02:42:46.279269 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6791ms +[xorm] [info] 2024/09/07 02:44:46.295105 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1562ms +[xorm] [info] 2024/09/07 02:46:46.288899 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7266ms +[xorm] [info] 2024/09/07 02:48:46.285671 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3712ms +[xorm] [info] 2024/09/07 02:50:46.296170 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1569ms +[xorm] [info] 2024/09/07 02:52:46.297442 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7505ms +[xorm] [info] 2024/09/07 02:54:46.303688 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.8207ms +[xorm] [info] 2024/09/07 02:56:46.293354 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.11ms +[xorm] [info] 2024/09/07 02:58:46.274462 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9854ms +[xorm] [info] 2024/09/07 03:00:46.279317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0253ms +[xorm] [info] 2024/09/07 03:02:46.287493 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0913ms +[xorm] [info] 2024/09/07 03:04:46.305368 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.2131ms +[xorm] [info] 2024/09/07 03:06:46.283220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6785ms +[xorm] [info] 2024/09/07 03:08:46.277564 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6897ms +[xorm] [info] 2024/09/07 03:10:46.302661 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.5717ms +[xorm] [info] 2024/09/07 03:12:46.293529 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0492ms +[xorm] [info] 2024/09/07 03:14:46.286921 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1152ms +[xorm] [info] 2024/09/07 03:16:46.299319 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5703ms +[xorm] [info] 2024/09/07 03:18:46.282843 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5375ms +[xorm] [info] 2024/09/07 03:20:46.305304 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2387ms +[xorm] [info] 2024/09/07 03:22:46.281245 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5313ms +[xorm] [info] 2024/09/07 03:24:46.306186 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9917ms +[xorm] [info] 2024/09/07 03:26:46.296106 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7992ms +[xorm] [info] 2024/09/07 03:28:46.279720 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6464ms +[xorm] [info] 2024/09/07 03:30:46.286048 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0329ms +[xorm] [info] 2024/09/07 03:32:46.301226 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1313ms +[xorm] [info] 2024/09/07 03:34:46.292335 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2182ms +[xorm] [info] 2024/09/07 03:36:46.295716 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8812ms +[xorm] [info] 2024/09/07 03:38:46.298977 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3022ms +[xorm] [info] 2024/09/07 03:40:46.297954 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3532ms +[xorm] [info] 2024/09/07 03:42:46.279191 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1566ms +[xorm] [info] 2024/09/07 03:44:46.287583 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8547ms +[xorm] [info] 2024/09/07 03:46:46.299001 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0082ms +[xorm] [info] 2024/09/07 03:48:46.279516 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3073ms +[xorm] [info] 2024/09/07 03:50:46.281306 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3263ms +[xorm] [info] 2024/09/07 03:52:46.274244 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7081ms +[xorm] [info] 2024/09/07 03:54:46.302570 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3737ms +[xorm] [info] 2024/09/07 03:56:46.283317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.947ms +[xorm] [info] 2024/09/07 03:58:46.299223 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.036ms +[xorm] [info] 2024/09/07 04:00:46.283107 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8423ms +[xorm] [info] 2024/09/07 04:02:46.286108 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8546ms +[xorm] [info] 2024/09/07 04:04:46.300880 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5055ms +[xorm] [info] 2024/09/07 04:06:46.286881 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8966ms +[xorm] [info] 2024/09/07 04:08:46.293742 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2358ms +[xorm] [info] 2024/09/07 04:10:46.284085 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4195ms +[xorm] [info] 2024/09/07 04:12:46.297079 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7912ms +[xorm] [info] 2024/09/07 04:14:46.304259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.9179ms +[xorm] [info] 2024/09/07 04:16:46.288471 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3979ms +[xorm] [info] 2024/09/07 04:18:46.301410 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5744ms +[xorm] [info] 2024/09/07 04:20:46.304081 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1006ms +[xorm] [info] 2024/09/07 04:22:46.277493 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5425ms +[xorm] [info] 2024/09/07 04:24:46.292178 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0855ms +[xorm] [info] 2024/09/07 04:26:46.292040 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.4958ms +[xorm] [info] 2024/09/07 04:28:46.296008 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2706ms +[xorm] [info] 2024/09/07 04:30:46.287846 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.666ms +[xorm] [info] 2024/09/07 04:32:46.279258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2862ms +[xorm] [info] 2024/09/07 04:34:46.280217 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6855ms +[xorm] [info] 2024/09/07 04:36:46.301116 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1173ms +[xorm] [info] 2024/09/07 04:38:46.278628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5533ms +[xorm] [info] 2024/09/07 04:40:46.290085 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9451ms +[xorm] [info] 2024/09/07 04:42:46.287488 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3986ms +[xorm] [info] 2024/09/07 04:44:46.293630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1775ms +[xorm] [info] 2024/09/07 04:46:46.306786 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.5179ms +[xorm] [info] 2024/09/07 04:48:46.298971 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7672ms +[xorm] [info] 2024/09/07 04:50:46.279707 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.0315ms +[xorm] [info] 2024/09/07 04:52:46.291513 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1929ms +[xorm] [info] 2024/09/07 04:54:46.285266 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2573ms +[xorm] [info] 2024/09/07 04:56:46.294533 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3234ms +[xorm] [info] 2024/09/07 04:58:46.279453 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3227ms +[xorm] [info] 2024/09/07 05:00:46.291193 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5519ms +[xorm] [info] 2024/09/07 05:02:46.292215 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.655ms +[xorm] [info] 2024/09/07 05:04:46.300431 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.9958ms +[xorm] [info] 2024/09/07 05:06:46.275488 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3259ms +[xorm] [info] 2024/09/07 05:08:46.286811 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3664ms +[xorm] [info] 2024/09/07 05:10:46.281374 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8726ms +[xorm] [info] 2024/09/07 05:12:46.279934 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2547ms +[xorm] [info] 2024/09/07 05:14:46.296197 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7247ms +[xorm] [info] 2024/09/07 05:16:46.297338 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5137ms +[xorm] [info] 2024/09/07 05:18:46.308021 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.1037ms +[xorm] [info] 2024/09/07 05:20:46.270582 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.9044ms +[xorm] [info] 2024/09/07 05:22:46.295183 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5392ms +[xorm] [info] 2024/09/07 05:24:46.285776 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.622ms +[xorm] [info] 2024/09/07 05:26:46.296175 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3131ms +[xorm] [info] 2024/09/07 05:28:46.293235 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1261ms +[xorm] [info] 2024/09/07 05:30:46.284686 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1711ms +[xorm] [info] 2024/09/07 05:32:46.277811 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1043ms +[xorm] [info] 2024/09/07 05:34:46.286117 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8175ms +[xorm] [info] 2024/09/07 05:36:46.277336 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8211ms +[xorm] [info] 2024/09/07 05:38:46.286060 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1242ms +[xorm] [info] 2024/09/07 05:40:46.299202 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6651ms +[xorm] [info] 2024/09/07 05:42:46.296246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.84ms +[xorm] [info] 2024/09/07 05:44:46.286083 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9829ms +[xorm] [info] 2024/09/07 05:46:46.291458 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8155ms +[xorm] [info] 2024/09/07 05:48:46.275173 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.2429ms +[xorm] [info] 2024/09/07 05:50:46.300625 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.6453ms +[xorm] [info] 2024/09/07 05:52:46.292691 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1496ms +[xorm] [info] 2024/09/07 05:54:46.285766 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.8681ms +[xorm] [info] 2024/09/07 05:56:46.278476 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.5138ms +[xorm] [info] 2024/09/07 05:58:46.293926 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1475ms +[xorm] [info] 2024/09/07 06:00:46.274104 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7023ms +[xorm] [info] 2024/09/07 06:02:46.283536 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.598ms +[xorm] [info] 2024/09/07 06:04:46.288282 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5885ms +[xorm] [info] 2024/09/07 06:06:46.292553 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5222ms +[xorm] [info] 2024/09/07 06:08:46.279840 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5833ms +[xorm] [info] 2024/09/07 06:10:46.288636 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6078ms +[xorm] [info] 2024/09/07 06:12:46.287271 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4617ms +[xorm] [info] 2024/09/07 06:14:46.302296 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7586ms +[xorm] [info] 2024/09/07 06:16:46.290490 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8192ms +[xorm] [info] 2024/09/07 06:18:46.284932 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3044ms +[xorm] [info] 2024/09/07 06:20:46.285171 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5277ms +[xorm] [info] 2024/09/07 06:22:46.295441 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.7251ms +[xorm] [info] 2024/09/07 06:24:46.290892 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.781ms +[xorm] [info] 2024/09/07 06:26:46.285181 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0201ms +[xorm] [info] 2024/09/07 06:28:46.292644 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8176ms +[xorm] [info] 2024/09/07 06:30:46.293481 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5568ms +[xorm] [info] 2024/09/07 06:32:46.305088 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5571ms +[xorm] [info] 2024/09/07 06:34:46.290722 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3427ms +[xorm] [info] 2024/09/07 06:36:46.291696 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5115ms +[xorm] [info] 2024/09/07 06:38:46.293125 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2446ms +[xorm] [info] 2024/09/07 06:40:46.287964 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6933ms +[xorm] [info] 2024/09/07 06:42:46.293548 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6427ms +[xorm] [info] 2024/09/07 06:44:46.277669 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3483ms +[xorm] [info] 2024/09/07 06:46:46.296884 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1459ms +[xorm] [info] 2024/09/07 06:48:46.301518 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0605ms +[xorm] [info] 2024/09/07 06:50:46.300203 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4566ms +[xorm] [info] 2024/09/07 06:52:46.283841 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5131ms +[xorm] [info] 2024/09/07 06:54:46.283181 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0589ms +[xorm] [info] 2024/09/07 06:56:46.288802 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3167ms +[xorm] [info] 2024/09/07 06:58:46.293758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7071ms +[xorm] [info] 2024/09/07 07:00:46.277821 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4176ms +[xorm] [info] 2024/09/07 07:02:46.295105 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0124ms +[xorm] [info] 2024/09/07 07:04:46.274981 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1979ms +[xorm] [info] 2024/09/07 07:06:46.299073 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.732ms +[xorm] [info] 2024/09/07 07:08:46.270898 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.0489ms +[xorm] [info] 2024/09/07 07:10:46.291304 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5819ms +[xorm] [info] 2024/09/07 07:12:46.282613 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1247ms +[xorm] [info] 2024/09/07 07:14:46.293896 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4387ms +[xorm] [info] 2024/09/07 07:16:46.285742 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2512ms +[xorm] [info] 2024/09/07 07:18:46.279853 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7066ms +[xorm] [info] 2024/09/07 07:20:46.290050 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4669ms +[xorm] [info] 2024/09/07 07:22:46.293662 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.753ms +[xorm] [info] 2024/09/07 07:24:46.287028 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0116ms +[xorm] [info] 2024/09/07 07:26:46.282886 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.702ms +[xorm] [info] 2024/09/07 07:28:46.272489 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.6398ms +[xorm] [info] 2024/09/07 07:30:46.295182 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1028ms +[xorm] [info] 2024/09/07 07:32:46.285314 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8996ms +[xorm] [info] 2024/09/07 07:34:46.286299 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4878ms +[xorm] [info] 2024/09/07 07:36:46.297520 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3927ms +[xorm] [info] 2024/09/07 07:38:46.299528 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9844ms +[xorm] [info] 2024/09/07 07:40:46.293683 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8803ms +[xorm] [info] 2024/09/07 07:42:46.295664 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7905ms +[xorm] [info] 2024/09/07 07:44:46.282207 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4194ms +[xorm] [info] 2024/09/07 07:46:46.294736 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9593ms +[xorm] [info] 2024/09/07 07:48:46.302738 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0043ms +[xorm] [info] 2024/09/07 07:50:46.274565 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.0089ms +[xorm] [info] 2024/09/07 07:52:46.287358 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.6478ms +[xorm] [info] 2024/09/07 07:54:46.297164 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.9586ms +[xorm] [info] 2024/09/07 07:56:46.281682 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.698ms +[xorm] [info] 2024/09/07 07:58:46.287592 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9ms +[xorm] [info] 2024/09/07 08:00:46.291587 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4138ms +[xorm] [info] 2024/09/07 08:02:46.282322 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.4258ms +[xorm] [info] 2024/09/07 08:04:46.288276 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7468ms +[xorm] [info] 2024/09/07 08:06:46.291870 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8604ms +[xorm] [info] 2024/09/07 08:08:46.278251 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7422ms +[xorm] [info] 2024/09/07 08:10:46.283273 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4381ms +[xorm] [info] 2024/09/07 08:12:46.289291 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2975ms +[xorm] [info] 2024/09/07 08:14:46.279791 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1883ms +[xorm] [info] 2024/09/07 08:16:46.306899 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.8184ms +[xorm] [info] 2024/09/07 08:18:46.284250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9525ms +[xorm] [info] 2024/09/07 08:20:46.287331 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6924ms +[xorm] [info] 2024/09/07 08:22:46.292436 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2699ms +[xorm] [info] 2024/09/07 08:24:46.285265 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2628ms +[xorm] [info] 2024/09/07 08:26:46.288528 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5032ms +[xorm] [info] 2024/09/07 08:28:46.294574 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6258ms +[xorm] [info] 2024/09/07 08:30:46.294735 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.6513ms +[xorm] [info] 2024/09/07 08:32:46.294705 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2729ms +[xorm] [info] 2024/09/07 08:34:46.295052 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5627ms +[xorm] [info] 2024/09/07 08:36:46.284007 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4469ms +[xorm] [info] 2024/09/07 08:38:46.283350 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4765ms +[xorm] [info] 2024/09/07 08:40:46.288396 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7356ms +[xorm] [info] 2024/09/07 08:42:46.299408 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3516ms +[xorm] [info] 2024/09/07 08:44:46.282095 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1966ms +[xorm] [info] 2024/09/07 08:46:46.285961 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2599ms +[xorm] [info] 2024/09/07 08:48:46.280917 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4823ms +[xorm] [info] 2024/09/07 08:50:46.296974 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8423ms +[xorm] [info] 2024/09/07 08:52:46.280671 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6737ms +[xorm] [info] 2024/09/07 08:54:46.286205 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9884ms +[xorm] [info] 2024/09/07 08:56:46.296524 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.512ms +[xorm] [info] 2024/09/07 08:58:46.302258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4735ms +[xorm] [info] 2024/09/07 09:00:46.293457 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0615ms +[xorm] [info] 2024/09/07 09:02:46.292092 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.2767ms +[xorm] [info] 2024/09/07 09:04:46.295576 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0816ms +[xorm] [info] 2024/09/07 09:06:46.284066 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7584ms +[xorm] [info] 2024/09/07 09:08:46.287944 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8411ms +[xorm] [info] 2024/09/07 09:10:46.271992 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7531ms +[xorm] [info] 2024/09/07 09:12:46.298962 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4337ms +[xorm] [info] 2024/09/07 09:14:46.291248 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1095ms +[xorm] [info] 2024/09/07 09:16:46.297366 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8453ms +[xorm] [info] 2024/09/07 09:18:46.294580 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2675ms +[xorm] [info] 2024/09/07 09:20:46.280133 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5575ms +[xorm] [info] 2024/09/07 09:22:46.276544 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6564ms +[xorm] [info] 2024/09/07 09:24:46.275781 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7643ms +[xorm] [info] 2024/09/07 09:26:46.286170 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2616ms +[xorm] [info] 2024/09/07 09:28:46.300101 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6635ms +[xorm] [info] 2024/09/07 09:30:46.275987 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.1175ms +[xorm] [info] 2024/09/07 09:32:46.283417 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.9827ms +[xorm] [info] 2024/09/07 09:34:46.279283 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3926ms +[xorm] [info] 2024/09/07 09:36:46.307036 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5925ms +[xorm] [info] 2024/09/07 09:38:46.293392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.0498ms +[xorm] [info] 2024/09/07 09:40:46.272960 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.4562ms +[xorm] [info] 2024/09/07 09:42:46.301250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.865ms +[xorm] [info] 2024/09/07 09:44:46.280936 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0475ms +[xorm] [info] 2024/09/07 09:46:46.288805 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7077ms +[xorm] [info] 2024/09/07 09:48:46.283009 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8211ms +[xorm] [info] 2024/09/07 09:50:46.292256 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6861ms +[xorm] [info] 2024/09/07 09:52:46.287003 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3844ms +[xorm] [info] 2024/09/07 09:54:46.285245 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9091ms +[xorm] [info] 2024/09/07 09:56:46.281723 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4751ms +[xorm] [info] 2024/09/07 09:58:46.285833 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7006ms +[xorm] [info] 2024/09/07 10:00:46.286273 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1832ms +[xorm] [info] 2024/09/07 10:02:46.297339 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9904ms +[xorm] [info] 2024/09/07 10:04:46.285205 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5293ms +[xorm] [info] 2024/09/07 10:06:46.284844 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.029ms +[xorm] [info] 2024/09/07 10:08:46.292262 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3222ms +[xorm] [info] 2024/09/07 10:10:46.287196 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2318ms +[xorm] [info] 2024/09/07 10:12:46.285618 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7015ms +[xorm] [info] 2024/09/07 10:14:46.287995 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2572ms +[xorm] [info] 2024/09/07 10:16:46.294331 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0657ms +[xorm] [info] 2024/09/07 10:18:46.284053 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.958ms +[xorm] [info] 2024/09/07 10:20:46.299830 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.5747ms +[xorm] [info] 2024/09/07 10:22:46.288682 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5054ms +[xorm] [info] 2024/09/07 10:24:46.293509 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8911ms +[xorm] [info] 2024/09/07 10:26:46.278493 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1205ms +[xorm] [info] 2024/09/07 10:28:46.285673 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.598ms +[xorm] [info] 2024/09/07 10:30:46.300159 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6466ms +[xorm] [info] 2024/09/07 10:32:46.291587 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6345ms +[xorm] [info] 2024/09/07 10:34:46.274776 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9493ms +[xorm] [info] 2024/09/07 10:36:46.288447 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1989ms +[xorm] [info] 2024/09/07 10:38:46.288280 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5521ms +[xorm] [info] 2024/09/07 10:40:46.299250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.1739ms +[xorm] [info] 2024/09/07 10:42:46.278801 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6861ms +[xorm] [info] 2024/09/07 10:44:46.286572 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9094ms +[xorm] [info] 2024/09/07 10:46:46.293166 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1033ms +[xorm] [info] 2024/09/07 10:48:46.299746 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8463ms +[xorm] [info] 2024/09/07 10:50:46.303299 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8908ms +[xorm] [info] 2024/09/07 10:52:46.297325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9266ms +[xorm] [info] 2024/09/07 10:54:46.287180 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5199ms +[xorm] [info] 2024/09/07 10:56:46.287750 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9491ms +[xorm] [info] 2024/09/07 10:58:46.291250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5842ms +[xorm] [info] 2024/09/07 11:00:46.299816 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6358ms +[xorm] [info] 2024/09/07 11:02:46.285121 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9445ms +[xorm] [info] 2024/09/07 11:04:46.280720 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.16ms +[xorm] [info] 2024/09/07 11:06:46.292246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.5702ms +[xorm] [info] 2024/09/07 11:08:46.289521 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9207ms +[xorm] [info] 2024/09/07 11:10:46.280801 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7921ms +[xorm] [info] 2024/09/07 11:12:46.294079 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4051ms +[xorm] [info] 2024/09/07 11:14:46.290610 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7541ms +[xorm] [info] 2024/09/07 11:16:46.305085 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7767ms +[xorm] [info] 2024/09/07 11:18:46.275068 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7457ms +[xorm] [info] 2024/09/07 11:20:46.301088 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.5271ms +[xorm] [info] 2024/09/07 11:22:46.291372 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6168ms +[xorm] [info] 2024/09/07 11:24:46.290055 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8211ms +[xorm] [info] 2024/09/07 11:26:46.274505 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3944ms +[xorm] [info] 2024/09/07 11:28:46.286860 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3815ms +[xorm] [info] 2024/09/07 11:30:46.290540 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7259ms +[xorm] [info] 2024/09/07 11:32:46.289217 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7322ms +[xorm] [info] 2024/09/07 11:34:46.282210 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7984ms +[xorm] [info] 2024/09/07 11:36:46.294991 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8417ms +[xorm] [info] 2024/09/07 11:38:46.285080 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1379ms +[xorm] [info] 2024/09/07 11:40:46.290093 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8668ms +[xorm] [info] 2024/09/07 11:42:46.279173 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1177ms +[xorm] [info] 2024/09/07 11:44:46.289920 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6552ms +[xorm] [info] 2024/09/07 11:46:46.287178 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5262ms +[xorm] [info] 2024/09/07 11:48:46.285707 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7281ms +[xorm] [info] 2024/09/07 11:50:46.307783 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.4465ms +[xorm] [info] 2024/09/07 11:52:46.289265 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4305ms +[xorm] [info] 2024/09/07 11:54:46.290797 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7279ms +[xorm] [info] 2024/09/07 11:56:46.276997 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5824ms +[xorm] [info] 2024/09/07 11:58:46.293796 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0415ms +[xorm] [info] 2024/09/07 12:00:46.276709 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9875ms +[xorm] [info] 2024/09/07 12:02:46.294623 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3677ms +[xorm] [info] 2024/09/07 12:04:46.286612 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4374ms +[xorm] [info] 2024/09/07 12:06:46.294362 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0519ms +[xorm] [info] 2024/09/07 12:08:46.292600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1845ms +[xorm] [info] 2024/09/07 12:10:46.275922 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.2922ms +[xorm] [info] 2024/09/07 12:12:46.304608 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0446ms +[xorm] [info] 2024/09/07 12:14:46.301882 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7146ms +[xorm] [info] 2024/09/07 12:16:46.293146 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7245ms +[xorm] [info] 2024/09/07 12:18:46.285275 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.7801ms +[xorm] [info] 2024/09/07 12:20:46.303286 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4393ms +[xorm] [info] 2024/09/07 12:22:46.282212 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7592ms +[xorm] [info] 2024/09/07 12:24:46.295302 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8255ms +[xorm] [info] 2024/09/07 12:26:46.276358 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3827ms +[xorm] [info] 2024/09/07 12:28:46.282077 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7529ms +[xorm] [info] 2024/09/07 12:30:46.282386 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7521ms +[xorm] [info] 2024/09/07 12:32:46.280739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3279ms +[xorm] [info] 2024/09/07 12:34:46.307268 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.3543ms +[xorm] [info] 2024/09/07 12:36:46.303710 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8439ms +[xorm] [info] 2024/09/07 12:38:46.288720 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8955ms +[xorm] [info] 2024/09/07 12:40:46.285864 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3737ms +[xorm] [info] 2024/09/07 12:42:46.275401 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9721ms +[xorm] [info] 2024/09/07 12:44:46.292361 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3748ms +[xorm] [info] 2024/09/07 12:46:46.296510 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5414ms +[xorm] [info] 2024/09/07 12:48:46.299054 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2755ms +[xorm] [info] 2024/09/07 12:50:46.279547 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1347ms +[xorm] [info] 2024/09/07 12:52:46.294776 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3781ms +[xorm] [info] 2024/09/07 12:54:46.296806 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1572ms +[xorm] [info] 2024/09/07 12:56:46.289490 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.2195ms +[xorm] [info] 2024/09/07 12:58:46.289885 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3564ms +[xorm] [info] 2024/09/07 13:00:46.294785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1533ms +[xorm] [info] 2024/09/07 13:02:46.291948 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9026ms +[xorm] [info] 2024/09/07 13:04:46.285853 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0695ms +[xorm] [info] 2024/09/07 13:06:46.274465 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5595ms +[xorm] [info] 2024/09/07 13:08:46.298220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.0613ms +[xorm] [info] 2024/09/07 13:10:46.305128 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6505ms +[xorm] [info] 2024/09/07 13:12:46.285474 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5271ms +[xorm] [info] 2024/09/07 13:14:46.289289 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3899ms +[xorm] [info] 2024/09/07 13:16:46.281246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8986ms +[xorm] [info] 2024/09/07 13:18:46.285660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.059ms +[xorm] [info] 2024/09/07 13:20:46.288919 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7165ms +[xorm] [info] 2024/09/07 13:22:46.299039 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1001ms +[xorm] [info] 2024/09/07 13:24:46.293172 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9561ms +[xorm] [info] 2024/09/07 13:26:46.291719 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8588ms +[xorm] [info] 2024/09/07 13:28:46.294571 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7258ms +[xorm] [info] 2024/09/07 13:30:46.284396 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.967ms +[xorm] [info] 2024/09/07 13:32:46.287375 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4104ms +[xorm] [info] 2024/09/07 13:34:46.289962 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.558ms +[xorm] [info] 2024/09/07 13:36:46.276387 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.039ms +[xorm] [info] 2024/09/07 13:38:46.275962 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0947ms +[xorm] [info] 2024/09/07 13:40:46.285701 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.724ms +[xorm] [info] 2024/09/07 13:42:46.303176 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0603ms +[xorm] [info] 2024/09/07 13:44:46.289238 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1978ms +[xorm] [info] 2024/09/07 13:46:46.284041 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8172ms +[xorm] [info] 2024/09/07 13:48:46.298966 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8678ms +[xorm] [info] 2024/09/07 13:50:46.304359 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7758ms +[xorm] [info] 2024/09/07 13:52:46.285276 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.425ms +[xorm] [info] 2024/09/07 13:54:46.278115 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3125ms +[xorm] [info] 2024/09/07 13:56:46.288054 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4067ms +[xorm] [info] 2024/09/07 13:58:46.285996 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9067ms +[xorm] [info] 2024/09/07 14:00:46.301637 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.3971ms +[xorm] [info] 2024/09/07 14:02:46.278494 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.1042ms +[xorm] [info] 2024/09/07 14:04:46.272454 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5599ms +[xorm] [info] 2024/09/07 14:06:46.301696 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.1102ms +[xorm] [info] 2024/09/07 14:08:46.298748 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.7571ms +[xorm] [info] 2024/09/07 14:10:46.280541 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6207ms +[xorm] [info] 2024/09/07 14:12:46.286730 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5932ms +[xorm] [info] 2024/09/07 14:14:46.286630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.865ms +[xorm] [info] 2024/09/07 14:16:46.302813 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.9232ms +[xorm] [info] 2024/09/07 14:18:46.305916 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 97.2761ms +[xorm] [info] 2024/09/07 14:20:46.294601 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3521ms +[xorm] [info] 2024/09/07 14:22:46.282620 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2495ms +[xorm] [info] 2024/09/07 14:24:46.289300 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5894ms +[xorm] [info] 2024/09/07 14:26:46.292241 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5184ms +[xorm] [info] 2024/09/07 14:28:46.304527 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5677ms +[xorm] [info] 2024/09/07 14:30:46.280014 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.8514ms +[xorm] [info] 2024/09/07 14:32:46.299190 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.852ms +[xorm] [info] 2024/09/07 14:34:46.282058 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.967ms +[xorm] [info] 2024/09/07 14:36:46.294176 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6667ms +[xorm] [info] 2024/09/07 14:38:46.291942 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.129ms +[xorm] [info] 2024/09/07 14:40:46.282178 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2261ms +[xorm] [info] 2024/09/07 14:42:46.294779 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2363ms +[xorm] [info] 2024/09/07 14:44:46.284564 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.553ms +[xorm] [info] 2024/09/07 14:46:46.289977 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1459ms +[xorm] [info] 2024/09/07 14:48:46.301169 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8543ms +[xorm] [info] 2024/09/07 14:50:46.272120 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.7783ms +[xorm] [info] 2024/09/07 14:52:46.286693 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6389ms +[xorm] [info] 2024/09/07 14:54:46.276794 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.297ms +[xorm] [info] 2024/09/07 14:56:46.303693 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.3334ms +[xorm] [info] 2024/09/07 14:58:46.275068 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9506ms +[xorm] [info] 2024/09/07 15:00:46.276813 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7158ms +[xorm] [info] 2024/09/07 15:02:46.286573 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8503ms +[xorm] [info] 2024/09/07 15:04:46.271431 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.6985ms +[xorm] [info] 2024/09/07 15:06:46.280736 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8441ms +[xorm] [info] 2024/09/07 15:08:46.284255 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.668ms +[xorm] [info] 2024/09/07 15:10:46.292293 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4113ms +[xorm] [info] 2024/09/07 15:12:46.288920 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.021ms +[xorm] [info] 2024/09/07 15:14:46.287711 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9447ms +[xorm] [info] 2024/09/07 15:16:46.291040 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2261ms +[xorm] [info] 2024/09/07 15:18:46.287882 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0189ms +[xorm] [info] 2024/09/07 15:20:46.277688 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2457ms +[xorm] [info] 2024/09/07 15:22:46.294717 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8217ms +[xorm] [info] 2024/09/07 15:24:46.276414 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.6716ms +[xorm] [info] 2024/09/07 15:26:46.291949 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1783ms +[xorm] [info] 2024/09/07 15:28:46.277921 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4395ms +[xorm] [info] 2024/09/07 15:30:46.281366 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3265ms +[xorm] [info] 2024/09/07 15:32:46.284447 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2142ms +[xorm] [info] 2024/09/07 15:34:46.278000 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4166ms +[xorm] [info] 2024/09/07 15:36:46.286844 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8183ms +[xorm] [info] 2024/09/07 15:38:46.294488 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.3304ms +[xorm] [info] 2024/09/07 15:40:46.280385 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9046ms +[xorm] [info] 2024/09/07 15:42:46.291624 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1722ms +[xorm] [info] 2024/09/07 15:44:46.293461 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5287ms +[xorm] [info] 2024/09/07 15:46:46.286931 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6583ms +[xorm] [info] 2024/09/07 15:48:46.290416 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6921ms +[xorm] [info] 2024/09/07 15:50:46.277480 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7311ms +[xorm] [info] 2024/09/07 15:52:46.286800 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6705ms +[xorm] [info] 2024/09/07 15:54:46.286668 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7202ms +[xorm] [info] 2024/09/07 15:56:46.287892 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1514ms +[xorm] [info] 2024/09/07 15:58:46.305811 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.221ms +[xorm] [info] 2024/09/07 16:00:46.300259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4038ms +[xorm] [info] 2024/09/07 16:02:46.306325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1551ms +[xorm] [info] 2024/09/07 16:04:46.298991 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9372ms +[xorm] [info] 2024/09/07 16:06:46.299131 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.5598ms +[xorm] [info] 2024/09/07 16:08:46.275691 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.6892ms +[xorm] [info] 2024/09/07 16:10:46.283623 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4247ms +[xorm] [info] 2024/09/07 16:12:46.276577 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3173ms +[xorm] [info] 2024/09/07 16:14:46.283663 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7586ms +[xorm] [info] 2024/09/07 16:16:46.293291 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5203ms +[xorm] [info] 2024/09/07 16:18:46.293458 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2529ms +[xorm] [info] 2024/09/07 16:20:46.292998 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.927ms +[xorm] [info] 2024/09/07 16:22:46.289732 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6231ms +[xorm] [info] 2024/09/07 16:24:46.289649 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6071ms +[xorm] [info] 2024/09/07 16:26:46.281503 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6601ms +[xorm] [info] 2024/09/07 16:28:46.299119 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3506ms +[xorm] [info] 2024/09/07 16:30:46.281335 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0763ms +[xorm] [info] 2024/09/07 16:32:46.284597 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7204ms +[xorm] [info] 2024/09/07 16:34:46.286893 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3309ms +[xorm] [info] 2024/09/07 16:36:46.281411 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3514ms +[xorm] [info] 2024/09/07 16:38:46.275295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3575ms +[xorm] [info] 2024/09/07 16:40:46.327792 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 119.8978ms +[xorm] [info] 2024/09/07 16:42:46.293226 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3011ms +[xorm] [info] 2024/09/07 16:44:46.284156 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3298ms +[xorm] [info] 2024/09/07 16:46:46.295416 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5957ms +[xorm] [info] 2024/09/07 16:48:46.283696 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1556ms +[xorm] [info] 2024/09/07 16:50:46.299613 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0741ms +[xorm] [info] 2024/09/07 16:52:46.287772 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0416ms +[xorm] [info] 2024/09/07 16:54:46.293194 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0113ms +[xorm] [info] 2024/09/07 16:56:46.300010 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.3946ms +[xorm] [info] 2024/09/07 16:58:46.287886 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5542ms +[xorm] [info] 2024/09/07 17:00:46.289680 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3877ms +[xorm] [info] 2024/09/07 17:02:46.276218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.681ms +[xorm] [info] 2024/09/07 17:04:46.289655 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0843ms +[xorm] [info] 2024/09/07 17:06:46.294968 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1806ms +[xorm] [info] 2024/09/07 17:08:46.281118 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1487ms +[xorm] [info] 2024/09/07 17:10:46.281602 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5477ms +[xorm] [info] 2024/09/07 17:12:46.292766 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3312ms +[xorm] [info] 2024/09/07 17:14:46.274753 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.9941ms +[xorm] [info] 2024/09/07 17:16:46.296668 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4607ms +[xorm] [info] 2024/09/07 17:18:46.294312 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1667ms +[xorm] [info] 2024/09/07 17:20:46.296628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.7386ms +[xorm] [info] 2024/09/07 17:22:46.287750 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.985ms +[xorm] [info] 2024/09/07 17:24:46.290854 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6779ms +[xorm] [info] 2024/09/07 17:26:46.276257 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6539ms +[xorm] [info] 2024/09/07 17:28:46.286517 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1073ms +[xorm] [info] 2024/09/07 17:30:46.305820 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.0352ms +[xorm] [info] 2024/09/07 17:32:46.308924 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.0747ms +[xorm] [info] 2024/09/07 17:34:46.277202 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1675ms +[xorm] [info] 2024/09/07 17:36:46.289923 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3869ms +[xorm] [info] 2024/09/07 17:38:46.273348 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.0788ms +[xorm] [info] 2024/09/07 17:40:46.273483 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.8982ms +[xorm] [info] 2024/09/07 17:42:46.292864 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6456ms +[xorm] [info] 2024/09/07 17:44:46.299007 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9445ms +[xorm] [info] 2024/09/07 17:46:46.304406 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.9496ms +[xorm] [info] 2024/09/07 17:48:46.282069 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.1451ms +[xorm] [info] 2024/09/07 17:50:46.298964 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1087ms +[xorm] [info] 2024/09/07 17:52:46.292472 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.3086ms +[xorm] [info] 2024/09/07 17:54:46.284579 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3405ms +[xorm] [info] 2024/09/07 17:56:46.290749 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8685ms +[xorm] [info] 2024/09/07 17:58:46.283463 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.9607ms +[xorm] [info] 2024/09/07 18:00:46.277334 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4654ms +[xorm] [info] 2024/09/07 18:02:46.288752 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9807ms +[xorm] [info] 2024/09/07 18:04:46.299653 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5513ms +[xorm] [info] 2024/09/07 18:06:46.301058 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3233ms +[xorm] [info] 2024/09/07 18:08:46.273938 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.825ms +[xorm] [info] 2024/09/07 18:10:46.297678 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2795ms +[xorm] [info] 2024/09/07 18:12:46.294562 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9568ms +[xorm] [info] 2024/09/07 18:14:46.288925 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.4926ms +[xorm] [info] 2024/09/07 18:16:46.292234 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8471ms +[xorm] [info] 2024/09/07 18:18:46.287360 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2601ms +[xorm] [info] 2024/09/07 18:20:46.283401 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.897ms +[xorm] [info] 2024/09/07 18:22:46.283039 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6766ms +[xorm] [info] 2024/09/07 18:24:46.296638 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4606ms +[xorm] [info] 2024/09/07 18:26:46.296885 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6178ms +[xorm] [info] 2024/09/07 18:28:46.293776 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0082ms +[xorm] [info] 2024/09/07 18:30:46.296988 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6457ms +[xorm] [info] 2024/09/07 18:32:46.287895 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8098ms +[xorm] [info] 2024/09/07 18:34:46.283397 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5386ms +[xorm] [info] 2024/09/07 18:36:46.294985 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2793ms +[xorm] [info] 2024/09/07 18:38:46.300377 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2686ms +[xorm] [info] 2024/09/07 18:40:46.277805 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0821ms +[xorm] [info] 2024/09/07 18:42:46.299378 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3597ms +[xorm] [info] 2024/09/07 18:44:46.293925 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3142ms +[xorm] [info] 2024/09/07 18:46:46.308000 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.7041ms +[xorm] [info] 2024/09/07 18:48:46.286773 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2173ms +[xorm] [info] 2024/09/07 18:50:46.282812 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3683ms +[xorm] [info] 2024/09/07 18:52:46.284229 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7576ms +[xorm] [info] 2024/09/07 18:54:46.302674 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8397ms +[xorm] [info] 2024/09/07 18:56:46.279641 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6418ms +[xorm] [info] 2024/09/07 18:58:46.295342 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2389ms +[xorm] [info] 2024/09/07 19:00:46.293568 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7922ms +[xorm] [info] 2024/09/07 19:02:46.283650 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3923ms +[xorm] [info] 2024/09/07 19:04:46.300891 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.321ms +[xorm] [info] 2024/09/07 19:06:46.303814 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.729ms +[xorm] [info] 2024/09/07 19:08:46.283163 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.979ms +[xorm] [info] 2024/09/07 19:10:46.287089 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.933ms +[xorm] [info] 2024/09/07 19:12:46.277959 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0346ms +[xorm] [info] 2024/09/07 19:14:46.300405 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6639ms +[xorm] [info] 2024/09/07 19:16:46.288026 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0411ms +[xorm] [info] 2024/09/07 19:18:46.294610 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2759ms +[xorm] [info] 2024/09/07 19:20:46.283518 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9299ms +[xorm] [info] 2024/09/07 19:22:46.286090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5732ms +[xorm] [info] 2024/09/07 19:24:46.286337 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1181ms +[xorm] [info] 2024/09/07 19:26:46.288666 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4375ms +[xorm] [info] 2024/09/07 19:28:46.289635 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9806ms +[xorm] [info] 2024/09/07 19:30:46.283215 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4138ms +[xorm] [info] 2024/09/07 19:32:46.287969 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3143ms +[xorm] [info] 2024/09/07 19:34:46.295422 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9187ms +[xorm] [info] 2024/09/07 19:36:46.288182 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.284ms +[xorm] [info] 2024/09/07 19:38:46.278381 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1616ms +[xorm] [info] 2024/09/07 19:40:46.291358 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7825ms +[xorm] [info] 2024/09/07 19:42:46.288330 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7948ms +[xorm] [info] 2024/09/07 19:44:46.292318 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3171ms +[xorm] [info] 2024/09/07 19:46:46.285315 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5358ms +[xorm] [info] 2024/09/07 19:48:46.291047 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0646ms +[xorm] [info] 2024/09/07 19:50:46.293901 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1068ms +[xorm] [info] 2024/09/07 19:52:46.289926 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5297ms +[xorm] [info] 2024/09/07 19:54:46.301945 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.8986ms +[xorm] [info] 2024/09/07 19:56:46.291170 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1167ms +[xorm] [info] 2024/09/07 19:58:46.290527 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5762ms +[xorm] [info] 2024/09/07 20:00:46.285935 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1573ms +[xorm] [info] 2024/09/07 20:02:46.288097 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7708ms +[xorm] [info] 2024/09/07 20:04:46.290010 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4149ms +[xorm] [info] 2024/09/07 20:06:46.290287 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0636ms +[xorm] [info] 2024/09/07 20:08:46.281337 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7102ms +[xorm] [info] 2024/09/07 20:10:46.309301 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 98.1672ms +[xorm] [info] 2024/09/07 20:12:46.275196 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.846ms +[xorm] [info] 2024/09/07 20:14:46.279739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.8717ms +[xorm] [info] 2024/09/07 20:16:46.304896 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6972ms +[xorm] [info] 2024/09/07 20:18:46.298627 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.0726ms +[xorm] [info] 2024/09/07 20:20:46.282784 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5546ms +[xorm] [info] 2024/09/07 20:22:46.293647 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4162ms +[xorm] [info] 2024/09/07 20:24:46.300965 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.5687ms +[xorm] [info] 2024/09/07 20:26:46.294652 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.3323ms +[xorm] [info] 2024/09/07 20:28:46.287471 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9374ms +[xorm] [info] 2024/09/07 20:30:46.300279 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5039ms +[xorm] [info] 2024/09/07 20:32:46.284956 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9458ms +[xorm] [info] 2024/09/07 20:34:46.288020 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.938ms +[xorm] [info] 2024/09/07 20:36:46.276433 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7907ms +[xorm] [info] 2024/09/07 20:38:46.284870 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4365ms +[xorm] [info] 2024/09/07 20:40:46.290175 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8993ms +[xorm] [info] 2024/09/07 20:42:46.296579 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9013ms +[xorm] [info] 2024/09/07 20:44:46.289887 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0056ms +[xorm] [info] 2024/09/07 20:46:46.296310 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3598ms +[xorm] [info] 2024/09/07 20:48:46.291966 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.884ms +[xorm] [info] 2024/09/07 20:50:46.308723 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7533ms +[xorm] [info] 2024/09/07 20:52:46.285684 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.4866ms +[xorm] [info] 2024/09/07 20:54:46.281529 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3851ms +[xorm] [info] 2024/09/07 20:56:46.288497 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8068ms +[xorm] [info] 2024/09/07 20:58:46.288174 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3654ms +[xorm] [info] 2024/09/07 21:00:46.290284 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6482ms +[xorm] [info] 2024/09/07 21:02:46.287767 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3963ms +[xorm] [info] 2024/09/07 21:04:46.298747 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4919ms +[xorm] [info] 2024/09/07 21:06:46.296824 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2764ms +[xorm] [info] 2024/09/07 21:08:46.290954 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6815ms +[xorm] [info] 2024/09/07 21:10:46.298779 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6368ms +[xorm] [info] 2024/09/07 21:12:46.287040 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7045ms +[xorm] [info] 2024/09/07 21:14:46.304958 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.336ms +[xorm] [info] 2024/09/07 21:16:46.273803 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.1771ms +[xorm] [info] 2024/09/07 21:18:46.294739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.885ms +[xorm] [info] 2024/09/07 21:20:46.288979 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4921ms +[xorm] [info] 2024/09/07 21:22:46.296841 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1055ms +[xorm] [info] 2024/09/07 21:24:46.291018 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.12ms +[xorm] [info] 2024/09/07 21:26:46.286677 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9475ms +[xorm] [info] 2024/09/07 21:28:46.297622 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9679ms +[xorm] [info] 2024/09/07 21:30:46.292162 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1547ms +[xorm] [info] 2024/09/07 21:32:46.280918 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1417ms +[xorm] [info] 2024/09/07 21:34:46.290539 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3856ms +[xorm] [info] 2024/09/07 21:36:46.288983 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2323ms +[xorm] [info] 2024/09/07 21:38:46.290389 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1655ms +[xorm] [info] 2024/09/07 21:40:46.293520 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.6029ms +[xorm] [info] 2024/09/07 21:42:46.283906 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2757ms +[xorm] [info] 2024/09/07 21:44:46.277095 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6248ms +[xorm] [info] 2024/09/07 21:46:46.300265 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6901ms +[xorm] [info] 2024/09/07 21:48:46.292645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.6337ms +[xorm] [info] 2024/09/07 21:50:46.270967 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.8874ms +[xorm] [info] 2024/09/07 21:52:46.278172 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2329ms +[xorm] [info] 2024/09/07 21:54:46.292400 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.6684ms +[xorm] [info] 2024/09/07 21:56:46.276142 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.3581ms +[xorm] [info] 2024/09/07 21:58:46.296925 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.4801ms +[xorm] [info] 2024/09/07 22:00:46.280920 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9703ms +[xorm] [info] 2024/09/07 22:02:46.288993 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7127ms +[xorm] [info] 2024/09/07 22:04:46.288653 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1121ms +[xorm] [info] 2024/09/07 22:06:46.292399 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1176ms +[xorm] [info] 2024/09/07 22:08:46.294411 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1999ms +[xorm] [info] 2024/09/07 22:10:46.287429 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5314ms +[xorm] [info] 2024/09/07 22:12:46.294526 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2963ms +[xorm] [info] 2024/09/07 22:14:46.282004 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1624ms +[xorm] [info] 2024/09/07 22:16:46.287990 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9796ms +[xorm] [info] 2024/09/07 22:18:46.292593 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9526ms +[xorm] [info] 2024/09/07 22:20:46.303987 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.8554ms +[xorm] [info] 2024/09/07 22:22:46.286246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8989ms +[xorm] [info] 2024/09/07 22:24:46.281173 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6618ms +[xorm] [info] 2024/09/07 22:26:46.278000 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6873ms +[xorm] [info] 2024/09/07 22:28:46.307181 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5638ms +[xorm] [info] 2024/09/07 22:30:46.292777 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6381ms +[xorm] [info] 2024/09/07 22:32:46.294545 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4094ms +[xorm] [info] 2024/09/07 22:34:46.291767 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6141ms +[xorm] [info] 2024/09/07 22:36:46.293521 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9678ms +[xorm] [info] 2024/09/07 22:38:46.289573 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4433ms +[xorm] [info] 2024/09/07 22:40:46.296965 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7081ms +[xorm] [info] 2024/09/07 22:42:46.297216 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3925ms +[xorm] [info] 2024/09/07 22:44:46.286240 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8823ms +[xorm] [info] 2024/09/07 22:46:46.282867 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1139ms +[xorm] [info] 2024/09/07 22:48:46.285712 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7701ms +[xorm] [info] 2024/09/07 22:50:46.302788 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1344ms +[xorm] [info] 2024/09/07 22:52:46.304664 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5238ms +[xorm] [info] 2024/09/07 22:54:46.299218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.8367ms +[xorm] [info] 2024/09/07 22:56:46.277300 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7727ms +[xorm] [info] 2024/09/07 22:58:46.289576 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6458ms +[xorm] [info] 2024/09/07 23:00:46.291693 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2247ms +[xorm] [info] 2024/09/07 23:02:46.307395 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8744ms +[xorm] [info] 2024/09/07 23:04:46.296492 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8436ms +[xorm] [info] 2024/09/07 23:06:46.305327 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3594ms +[xorm] [info] 2024/09/07 23:08:46.301008 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6742ms +[xorm] [info] 2024/09/07 23:10:46.287764 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5725ms +[xorm] [info] 2024/09/07 23:12:46.290604 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2638ms +[xorm] [info] 2024/09/07 23:14:46.295163 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6953ms +[xorm] [info] 2024/09/07 23:16:46.270784 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.2954ms +[xorm] [info] 2024/09/07 23:18:46.291356 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9889ms +[xorm] [info] 2024/09/07 23:20:46.275541 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.5086ms +[xorm] [info] 2024/09/07 23:22:46.279219 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1895ms +[xorm] [info] 2024/09/07 23:24:46.284918 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5835ms +[xorm] [info] 2024/09/07 23:26:46.305967 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2921ms +[xorm] [info] 2024/09/07 23:28:46.278739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.9606ms +[xorm] [info] 2024/09/07 23:30:46.304402 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2387ms +[xorm] [info] 2024/09/07 23:32:46.290147 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9454ms +[xorm] [info] 2024/09/07 23:34:46.302552 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.439ms +[xorm] [info] 2024/09/07 23:36:46.294701 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5183ms +[xorm] [info] 2024/09/07 23:38:46.305838 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6238ms +[xorm] [info] 2024/09/07 23:40:46.291613 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6528ms +[xorm] [info] 2024/09/07 23:42:46.295622 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.425ms +[xorm] [info] 2024/09/07 23:44:46.285482 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0507ms +[xorm] [info] 2024/09/07 23:46:46.283699 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1995ms +[xorm] [info] 2024/09/07 23:48:46.279052 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3417ms +[xorm] [info] 2024/09/07 23:50:46.282402 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1777ms +[xorm] [info] 2024/09/07 23:52:46.284846 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7083ms +[xorm] [info] 2024/09/07 23:54:46.304661 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7505ms +[xorm] [info] 2024/09/07 23:56:46.308435 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5545ms +[xorm] [info] 2024/09/07 23:58:46.274683 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.217ms +[xorm] [info] 2024/09/08 00:00:46.277794 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.7926ms +[xorm] [info] 2024/09/08 00:02:46.279064 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.1614ms +[xorm] [info] 2024/09/08 00:04:46.284257 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6189ms +[xorm] [info] 2024/09/08 00:06:46.282645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8904ms +[xorm] [info] 2024/09/08 00:08:46.292016 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5786ms +[xorm] [info] 2024/09/08 00:10:46.281236 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1584ms +[xorm] [info] 2024/09/08 00:12:46.275721 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4739ms +[xorm] [info] 2024/09/08 00:14:46.283712 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2581ms +[xorm] [info] 2024/09/08 00:16:46.279728 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2559ms +[xorm] [info] 2024/09/08 00:18:46.292751 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5234ms +[xorm] [info] 2024/09/08 00:20:46.275030 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.977ms +[xorm] [info] 2024/09/08 00:22:46.290646 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7826ms +[xorm] [info] 2024/09/08 00:24:46.302025 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0535ms +[xorm] [info] 2024/09/08 00:26:46.311096 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.3801ms +[xorm] [info] 2024/09/08 00:28:46.307983 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.0124ms +[xorm] [info] 2024/09/08 00:30:46.278981 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5579ms +[xorm] [info] 2024/09/08 00:32:46.281233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6647ms +[xorm] [info] 2024/09/08 00:34:46.287338 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0424ms +[xorm] [info] 2024/09/08 00:36:46.293555 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9933ms +[xorm] [info] 2024/09/08 00:38:46.288875 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6442ms +[xorm] [info] 2024/09/08 00:40:46.288629 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0079ms +[xorm] [info] 2024/09/08 00:42:46.303060 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6038ms +[xorm] [info] 2024/09/08 00:44:46.283624 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1184ms +[xorm] [info] 2024/09/08 00:46:46.292792 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5624ms +[xorm] [info] 2024/09/08 00:48:46.287960 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7941ms +[xorm] [info] 2024/09/08 00:50:46.297392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0137ms +[xorm] [info] 2024/09/08 00:52:46.301844 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7922ms +[xorm] [info] 2024/09/08 00:54:46.293980 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8016ms +[xorm] [info] 2024/09/08 00:56:46.285526 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1263ms +[xorm] [info] 2024/09/08 00:58:46.283255 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.2593ms +[xorm] [info] 2024/09/08 01:00:46.303857 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9369ms +[xorm] [info] 2024/09/08 01:02:46.291008 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2784ms +[xorm] [info] 2024/09/08 01:04:46.279790 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7994ms +[xorm] [info] 2024/09/08 01:06:46.290121 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1741ms +[xorm] [info] 2024/09/08 01:08:46.300945 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9759ms +[xorm] [info] 2024/09/08 01:10:46.297087 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4268ms +[xorm] [info] 2024/09/08 01:12:46.293618 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8339ms +[xorm] [info] 2024/09/08 01:14:46.297447 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.0993ms +[xorm] [info] 2024/09/08 01:16:46.305345 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.3653ms +[xorm] [info] 2024/09/08 01:18:46.293896 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8203ms +[xorm] [info] 2024/09/08 01:20:46.297028 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9998ms +[xorm] [info] 2024/09/08 01:22:46.287739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5673ms +[xorm] [info] 2024/09/08 01:24:46.295754 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7507ms +[xorm] [info] 2024/09/08 01:26:46.280517 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.6117ms +[xorm] [info] 2024/09/08 01:28:46.292718 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9364ms +[xorm] [info] 2024/09/08 01:30:46.290558 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5091ms +[xorm] [info] 2024/09/08 01:32:46.306190 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1954ms +[xorm] [info] 2024/09/08 01:34:46.283812 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.8415ms +[xorm] [info] 2024/09/08 01:36:46.277190 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6656ms +[xorm] [info] 2024/09/08 01:38:46.283361 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7295ms +[xorm] [info] 2024/09/08 01:40:46.294399 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2428ms +[xorm] [info] 2024/09/08 01:42:46.278115 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9533ms +[xorm] [info] 2024/09/08 01:44:46.286364 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1483ms +[xorm] [info] 2024/09/08 01:46:46.280213 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2145ms +[xorm] [info] 2024/09/08 01:48:46.274694 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.522ms +[xorm] [info] 2024/09/08 01:50:46.270973 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.1357ms +[xorm] [info] 2024/09/08 01:52:46.294949 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.184ms +[xorm] [info] 2024/09/08 01:54:46.289324 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2075ms +[xorm] [info] 2024/09/08 01:56:46.296589 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4336ms +[xorm] [info] 2024/09/08 01:58:46.289617 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8531ms +[xorm] [info] 2024/09/08 02:00:46.305074 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.3645ms +[xorm] [info] 2024/09/08 02:02:46.276947 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4931ms +[xorm] [info] 2024/09/08 02:04:46.291438 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3931ms +[xorm] [info] 2024/09/08 02:06:46.275182 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.702ms +[xorm] [info] 2024/09/08 02:08:46.293372 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2031ms +[xorm] [info] 2024/09/08 02:10:46.287047 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8901ms +[xorm] [info] 2024/09/08 02:12:46.286590 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7979ms +[xorm] [info] 2024/09/08 02:14:46.291028 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6825ms +[xorm] [info] 2024/09/08 02:16:46.281994 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2416ms +[xorm] [info] 2024/09/08 02:18:46.291062 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.898ms +[xorm] [info] 2024/09/08 02:20:46.290207 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7546ms +[xorm] [info] 2024/09/08 02:22:46.271758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.8859ms +[xorm] [info] 2024/09/08 02:24:46.280792 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3264ms +[xorm] [info] 2024/09/08 02:26:46.283547 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5239ms +[xorm] [info] 2024/09/08 02:28:46.284319 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4885ms +[xorm] [info] 2024/09/08 02:30:46.296933 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8874ms +[xorm] [info] 2024/09/08 02:32:46.300220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2687ms +[xorm] [info] 2024/09/08 02:34:46.284779 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4263ms +[xorm] [info] 2024/09/08 02:36:46.289241 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.266ms +[xorm] [info] 2024/09/08 02:38:46.278781 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.6628ms +[xorm] [info] 2024/09/08 02:40:46.292866 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.3316ms +[xorm] [info] 2024/09/08 02:42:46.282863 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7621ms +[xorm] [info] 2024/09/08 02:44:46.294601 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8143ms +[xorm] [info] 2024/09/08 02:46:46.287785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5132ms +[xorm] [info] 2024/09/08 02:48:46.301196 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7715ms +[xorm] [info] 2024/09/08 02:50:46.278406 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2276ms +[xorm] [info] 2024/09/08 02:52:46.281768 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0916ms +[xorm] [info] 2024/09/08 02:54:46.288830 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3547ms +[xorm] [info] 2024/09/08 02:56:46.291325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6085ms +[xorm] [info] 2024/09/08 02:58:46.301051 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.6254ms +[xorm] [info] 2024/09/08 03:00:46.290423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7514ms +[xorm] [info] 2024/09/08 03:02:46.275873 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.3498ms +[xorm] [info] 2024/09/08 03:04:46.293957 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.524ms +[xorm] [info] 2024/09/08 03:06:46.297207 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0734ms +[xorm] [info] 2024/09/08 03:08:46.274707 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5866ms +[xorm] [info] 2024/09/08 03:10:46.289456 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9489ms +[xorm] [info] 2024/09/08 03:12:46.294436 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5403ms +[xorm] [info] 2024/09/08 03:14:46.301592 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.015ms +[xorm] [info] 2024/09/08 03:16:46.283359 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3409ms +[xorm] [info] 2024/09/08 03:18:46.290859 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5742ms +[xorm] [info] 2024/09/08 03:20:46.285482 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2333ms +[xorm] [info] 2024/09/08 03:22:46.292055 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1205ms +[xorm] [info] 2024/09/08 03:24:46.293364 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7756ms +[xorm] [info] 2024/09/08 03:26:46.284648 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7839ms +[xorm] [info] 2024/09/08 03:28:46.296512 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0779ms +[xorm] [info] 2024/09/08 03:30:46.273183 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0953ms +[xorm] [info] 2024/09/08 03:32:46.294279 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4054ms +[xorm] [info] 2024/09/08 03:34:46.288634 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0254ms +[xorm] [info] 2024/09/08 03:36:46.297893 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2656ms +[xorm] [info] 2024/09/08 03:38:46.291544 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4489ms +[xorm] [info] 2024/09/08 03:40:46.297465 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8002ms +[xorm] [info] 2024/09/08 03:42:46.292358 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7942ms +[xorm] [info] 2024/09/08 03:44:46.289295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8309ms +[xorm] [info] 2024/09/08 03:46:46.277712 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8092ms +[xorm] [info] 2024/09/08 03:48:46.291689 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9764ms +[xorm] [info] 2024/09/08 03:50:46.295590 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1107ms +[xorm] [info] 2024/09/08 03:52:46.289641 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7462ms +[xorm] [info] 2024/09/08 03:54:46.274829 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.6252ms +[xorm] [info] 2024/09/08 03:56:46.294962 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.7529ms +[xorm] [info] 2024/09/08 03:58:46.298830 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1116ms +[xorm] [info] 2024/09/08 04:00:46.297579 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3118ms +[xorm] [info] 2024/09/08 04:02:46.285108 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7686ms +[xorm] [info] 2024/09/08 04:04:46.293378 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4865ms +[xorm] [info] 2024/09/08 04:06:46.282902 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5566ms +[xorm] [info] 2024/09/08 04:08:46.277716 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.245ms +[xorm] [info] 2024/09/08 04:10:46.292762 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5186ms +[xorm] [info] 2024/09/08 04:12:46.303897 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5943ms +[xorm] [info] 2024/09/08 04:14:46.296431 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1484ms +[xorm] [info] 2024/09/08 04:16:46.282053 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9077ms +[xorm] [info] 2024/09/08 04:18:46.283155 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.63ms +[xorm] [info] 2024/09/08 04:20:46.282697 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5598ms +[xorm] [info] 2024/09/08 04:22:46.284944 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4793ms +[xorm] [info] 2024/09/08 04:24:46.272998 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.6349ms +[xorm] [info] 2024/09/08 04:26:46.278255 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3626ms +[xorm] [info] 2024/09/08 04:28:46.277172 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5814ms +[xorm] [info] 2024/09/08 04:30:46.293279 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.455ms +[xorm] [info] 2024/09/08 04:32:46.288472 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9395ms +[xorm] [info] 2024/09/08 04:34:46.278915 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0481ms +[xorm] [info] 2024/09/08 04:36:46.276821 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.9458ms +[xorm] [info] 2024/09/08 04:38:46.307354 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5779ms +[xorm] [info] 2024/09/08 04:40:46.278946 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0212ms +[xorm] [info] 2024/09/08 04:42:46.286299 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9883ms +[xorm] [info] 2024/09/08 04:44:46.304550 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.4624ms +[xorm] [info] 2024/09/08 04:46:46.293537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0958ms +[xorm] [info] 2024/09/08 04:48:46.272370 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.3449ms +[xorm] [info] 2024/09/08 04:50:46.280521 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.9888ms +[xorm] [info] 2024/09/08 04:52:46.284766 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1495ms +[xorm] [info] 2024/09/08 04:54:46.286277 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3486ms +[xorm] [info] 2024/09/08 04:56:46.298673 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.9595ms +[xorm] [info] 2024/09/08 04:58:46.288850 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6534ms +[xorm] [info] 2024/09/08 05:00:46.282764 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9745ms +[xorm] [info] 2024/09/08 05:02:46.287662 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5699ms +[xorm] [info] 2024/09/08 05:04:46.290249 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.145ms +[xorm] [info] 2024/09/08 05:06:46.286606 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1811ms +[xorm] [info] 2024/09/08 05:08:46.286645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5714ms +[xorm] [info] 2024/09/08 05:10:46.287593 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3455ms +[xorm] [info] 2024/09/08 05:12:46.298821 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.5923ms +[xorm] [info] 2024/09/08 05:14:46.279928 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2444ms +[xorm] [info] 2024/09/08 05:16:46.280363 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8158ms +[xorm] [info] 2024/09/08 05:18:46.299900 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.7896ms +[xorm] [info] 2024/09/08 05:20:46.282986 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0672ms +[xorm] [info] 2024/09/08 05:22:46.297646 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3138ms +[xorm] [info] 2024/09/08 05:24:46.282791 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5073ms +[xorm] [info] 2024/09/08 05:26:46.295557 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6613ms +[xorm] [info] 2024/09/08 05:28:46.283608 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4846ms +[xorm] [info] 2024/09/08 05:30:46.281477 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7625ms +[xorm] [info] 2024/09/08 05:32:46.290250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1106ms +[xorm] [info] 2024/09/08 05:34:46.290880 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5445ms +[xorm] [info] 2024/09/08 05:36:46.301000 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7931ms +[xorm] [info] 2024/09/08 05:38:46.288434 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6876ms +[xorm] [info] 2024/09/08 05:40:46.308274 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0156ms +[xorm] [info] 2024/09/08 05:42:46.293967 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.808ms +[xorm] [info] 2024/09/08 05:44:46.290362 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4576ms +[xorm] [info] 2024/09/08 05:46:46.299169 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1731ms +[xorm] [info] 2024/09/08 05:48:46.295318 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6259ms +[xorm] [info] 2024/09/08 05:50:46.273335 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.575ms +[xorm] [info] 2024/09/08 05:52:46.294528 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2235ms +[xorm] [info] 2024/09/08 05:54:46.285421 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.268ms +[xorm] [info] 2024/09/08 05:56:46.287193 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6926ms +[xorm] [info] 2024/09/08 05:58:46.300871 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1624ms +[xorm] [info] 2024/09/08 06:00:46.276021 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6257ms +[xorm] [info] 2024/09/08 06:02:46.290510 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6114ms +[xorm] [info] 2024/09/08 06:04:46.298809 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8835ms +[xorm] [info] 2024/09/08 06:06:46.286642 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7468ms +[xorm] [info] 2024/09/08 06:08:46.291558 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6745ms +[xorm] [info] 2024/09/08 06:10:46.297869 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.9987ms +[xorm] [info] 2024/09/08 06:12:46.300830 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1228ms +[xorm] [info] 2024/09/08 06:14:46.279995 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.8203ms +[xorm] [info] 2024/09/08 06:16:46.294295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.1849ms +[xorm] [info] 2024/09/08 06:18:46.291227 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3468ms +[xorm] [info] 2024/09/08 06:20:46.301522 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4926ms +[xorm] [info] 2024/09/08 06:22:46.290547 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1475ms +[xorm] [info] 2024/09/08 06:24:46.286195 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.5651ms +[xorm] [info] 2024/09/08 06:26:46.280454 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.883ms +[xorm] [info] 2024/09/08 06:28:46.276370 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0159ms +[xorm] [info] 2024/09/08 06:30:46.289451 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6762ms +[xorm] [info] 2024/09/08 06:32:46.293063 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4071ms +[xorm] [info] 2024/09/08 06:34:46.299988 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.5744ms +[xorm] [info] 2024/09/08 06:36:46.276804 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7984ms +[xorm] [info] 2024/09/08 06:38:46.285995 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2802ms +[xorm] [info] 2024/09/08 06:40:46.301340 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.9018ms +[xorm] [info] 2024/09/08 06:42:46.275536 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4127ms +[xorm] [info] 2024/09/08 06:44:46.276216 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9878ms +[xorm] [info] 2024/09/08 06:46:46.287770 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2391ms +[xorm] [info] 2024/09/08 06:48:46.279456 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3688ms +[xorm] [info] 2024/09/08 06:50:46.297410 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9997ms +[xorm] [info] 2024/09/08 06:52:46.279301 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.58ms +[xorm] [info] 2024/09/08 06:54:46.285942 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1932ms +[xorm] [info] 2024/09/08 06:56:46.289976 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7533ms +[xorm] [info] 2024/09/08 06:58:46.299100 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5703ms +[xorm] [info] 2024/09/08 07:00:46.279945 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.781ms +[xorm] [info] 2024/09/08 07:02:46.280739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1789ms +[xorm] [info] 2024/09/08 07:04:46.297802 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2175ms +[xorm] [info] 2024/09/08 07:06:46.287269 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1276ms +[xorm] [info] 2024/09/08 07:08:46.292250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5022ms +[xorm] [info] 2024/09/08 07:10:46.296741 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9426ms +[xorm] [info] 2024/09/08 07:12:46.281000 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7205ms +[xorm] [info] 2024/09/08 07:14:46.288294 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0541ms +[xorm] [info] 2024/09/08 07:16:46.307838 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3ms +[xorm] [info] 2024/09/08 07:18:46.280521 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.689ms +[xorm] [info] 2024/09/08 07:20:46.287132 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6976ms +[xorm] [info] 2024/09/08 07:22:46.274631 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6298ms +[xorm] [info] 2024/09/08 07:24:46.283490 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3027ms +[xorm] [info] 2024/09/08 07:26:46.272788 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.4146ms +[xorm] [info] 2024/09/08 07:28:46.284990 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8792ms +[xorm] [info] 2024/09/08 07:30:46.281828 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5699ms +[xorm] [info] 2024/09/08 07:32:46.283755 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2258ms +[xorm] [info] 2024/09/08 07:34:46.295412 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6783ms +[xorm] [info] 2024/09/08 07:36:46.293270 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0546ms +[xorm] [info] 2024/09/08 07:38:46.298936 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.5934ms +[xorm] [info] 2024/09/08 07:40:46.277594 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8579ms +[xorm] [info] 2024/09/08 07:42:46.288616 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4317ms +[xorm] [info] 2024/09/08 07:44:46.292920 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4959ms +[xorm] [info] 2024/09/08 07:46:46.296571 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7664ms +[xorm] [info] 2024/09/08 07:48:46.287422 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6306ms +[xorm] [info] 2024/09/08 07:50:46.294444 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.001ms +[xorm] [info] 2024/09/08 07:52:46.275259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.289ms +[xorm] [info] 2024/09/08 07:54:46.287393 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0811ms +[xorm] [info] 2024/09/08 07:56:46.298991 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9979ms +[xorm] [info] 2024/09/08 07:58:46.280331 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0161ms +[xorm] [info] 2024/09/08 08:00:46.283710 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4433ms +[xorm] [info] 2024/09/08 08:02:46.300160 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.0559ms +[xorm] [info] 2024/09/08 08:04:46.276028 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2262ms +[xorm] [info] 2024/09/08 08:06:46.294292 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0197ms +[xorm] [info] 2024/09/08 08:08:46.283517 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0643ms +[xorm] [info] 2024/09/08 08:10:46.292663 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0767ms +[xorm] [info] 2024/09/08 08:12:46.304294 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6328ms +[xorm] [info] 2024/09/08 08:14:46.300861 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4466ms +[xorm] [info] 2024/09/08 08:16:46.282972 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.926ms +[xorm] [info] 2024/09/08 08:18:46.287558 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1008ms +[xorm] [info] 2024/09/08 08:20:46.280428 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9485ms +[xorm] [info] 2024/09/08 08:22:46.284506 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2427ms +[xorm] [info] 2024/09/08 08:24:46.278753 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3065ms +[xorm] [info] 2024/09/08 08:26:46.280396 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.6857ms +[xorm] [info] 2024/09/08 08:28:46.281867 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3309ms +[xorm] [info] 2024/09/08 08:30:46.288494 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1955ms +[xorm] [info] 2024/09/08 08:32:46.285341 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3486ms +[xorm] [info] 2024/09/08 08:34:46.300744 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6551ms +[xorm] [info] 2024/09/08 08:36:46.277610 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6732ms +[xorm] [info] 2024/09/08 08:38:46.299510 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3616ms +[xorm] [info] 2024/09/08 08:40:46.299830 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0195ms +[xorm] [info] 2024/09/08 08:42:46.289151 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6162ms +[xorm] [info] 2024/09/08 08:44:46.283488 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7471ms +[xorm] [info] 2024/09/08 08:46:46.277625 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2001ms +[xorm] [info] 2024/09/08 08:48:46.297490 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.2236ms +[xorm] [info] 2024/09/08 08:50:46.289566 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.744ms +[xorm] [info] 2024/09/08 08:52:46.286228 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3686ms +[xorm] [info] 2024/09/08 08:54:46.289276 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7639ms +[xorm] [info] 2024/09/08 08:56:46.289943 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8028ms +[xorm] [info] 2024/09/08 08:58:46.283913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1884ms +[xorm] [info] 2024/09/08 09:00:46.290505 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3518ms +[xorm] [info] 2024/09/08 09:02:46.279191 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8045ms +[xorm] [info] 2024/09/08 09:04:46.281290 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5561ms +[xorm] [info] 2024/09/08 09:06:46.286380 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5646ms +[xorm] [info] 2024/09/08 09:08:46.276627 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0216ms +[xorm] [info] 2024/09/08 09:10:46.288567 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1899ms +[xorm] [info] 2024/09/08 09:12:46.283828 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8682ms +[xorm] [info] 2024/09/08 09:14:46.293406 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.073ms +[xorm] [info] 2024/09/08 09:16:46.300356 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5474ms +[xorm] [info] 2024/09/08 09:18:46.295421 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5667ms +[xorm] [info] 2024/09/08 09:20:46.298948 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.311ms +[xorm] [info] 2024/09/08 09:22:46.276379 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8792ms +[xorm] [info] 2024/09/08 09:24:46.292570 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7725ms +[xorm] [info] 2024/09/08 09:26:46.281538 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3556ms +[xorm] [info] 2024/09/08 09:28:46.283219 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8466ms +[xorm] [info] 2024/09/08 09:30:46.286088 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3362ms +[xorm] [info] 2024/09/08 09:32:46.282979 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3654ms +[xorm] [info] 2024/09/08 09:34:46.282971 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4791ms +[xorm] [info] 2024/09/08 09:36:46.289326 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3826ms +[xorm] [info] 2024/09/08 09:38:46.295117 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9989ms +[xorm] [info] 2024/09/08 09:40:46.289370 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.5737ms +[xorm] [info] 2024/09/08 09:42:46.293881 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9347ms +[xorm] [info] 2024/09/08 09:44:46.300279 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9753ms +[xorm] [info] 2024/09/08 09:46:46.298877 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2483ms +[xorm] [info] 2024/09/08 09:48:46.291824 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7298ms +[xorm] [info] 2024/09/08 09:50:46.297929 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1344ms +[xorm] [info] 2024/09/08 09:52:46.290351 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.454ms +[xorm] [info] 2024/09/08 09:54:46.288134 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9365ms +[xorm] [info] 2024/09/08 09:56:46.301513 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9644ms +[xorm] [info] 2024/09/08 09:58:46.293489 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3319ms +[xorm] [info] 2024/09/08 10:00:46.291171 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2027ms +[xorm] [info] 2024/09/08 10:02:46.289284 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0024ms +[xorm] [info] 2024/09/08 10:04:46.292057 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3944ms +[xorm] [info] 2024/09/08 10:06:46.284283 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8154ms +[xorm] [info] 2024/09/08 10:08:46.293814 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8054ms +[xorm] [info] 2024/09/08 10:10:46.293518 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.8779ms +[xorm] [info] 2024/09/08 10:12:46.305090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7151ms +[xorm] [info] 2024/09/08 10:14:46.288151 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4672ms +[xorm] [info] 2024/09/08 10:16:46.281227 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4632ms +[xorm] [info] 2024/09/08 10:18:46.284323 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4529ms +[xorm] [info] 2024/09/08 10:20:46.288883 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6594ms +[xorm] [info] 2024/09/08 10:22:46.293909 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7943ms +[xorm] [info] 2024/09/08 10:24:46.283505 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.812ms +[xorm] [info] 2024/09/08 10:26:46.297479 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4865ms +[xorm] [info] 2024/09/08 10:28:46.277760 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.4234ms +[xorm] [info] 2024/09/08 10:30:46.294594 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8277ms +[xorm] [info] 2024/09/08 10:32:46.284059 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.2779ms +[xorm] [info] 2024/09/08 10:34:46.299470 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3577ms +[xorm] [info] 2024/09/08 10:36:46.306025 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0712ms +[xorm] [info] 2024/09/08 10:38:46.291439 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.007ms +[xorm] [info] 2024/09/08 10:40:46.285064 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0869ms +[xorm] [info] 2024/09/08 10:42:46.311753 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.0553ms +[xorm] [info] 2024/09/08 10:44:46.276020 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9645ms +[xorm] [info] 2024/09/08 10:46:46.293193 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.6707ms +[xorm] [info] 2024/09/08 10:48:46.291095 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1218ms +[xorm] [info] 2024/09/08 10:50:46.284030 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6957ms +[xorm] [info] 2024/09/08 10:52:46.278669 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1506ms +[xorm] [info] 2024/09/08 10:54:46.304272 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5957ms +[xorm] [info] 2024/09/08 10:56:46.292894 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6149ms +[xorm] [info] 2024/09/08 10:58:46.277479 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.6968ms +[xorm] [info] 2024/09/08 11:00:46.288750 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0583ms +[xorm] [info] 2024/09/08 11:02:46.282797 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5066ms +[xorm] [info] 2024/09/08 11:04:46.282279 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8232ms +[xorm] [info] 2024/09/08 11:06:46.287809 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.064ms +[xorm] [info] 2024/09/08 11:08:46.294328 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6872ms +[xorm] [info] 2024/09/08 11:10:46.300772 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6218ms +[xorm] [info] 2024/09/08 11:12:46.283430 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.234ms +[xorm] [info] 2024/09/08 11:14:46.290203 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8656ms +[xorm] [info] 2024/09/08 11:16:46.290627 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7405ms +[xorm] [info] 2024/09/08 11:18:46.287722 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.628ms +[xorm] [info] 2024/09/08 11:20:46.288810 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.713ms +[xorm] [info] 2024/09/08 11:22:46.301906 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6632ms +[xorm] [info] 2024/09/08 11:24:46.291747 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.074ms +[xorm] [info] 2024/09/08 11:26:46.290463 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0599ms +[xorm] [info] 2024/09/08 11:28:46.274790 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8087ms +[xorm] [info] 2024/09/08 11:30:46.297989 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7941ms +[xorm] [info] 2024/09/08 11:32:46.290823 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8095ms +[xorm] [info] 2024/09/08 11:34:46.284363 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9638ms +[xorm] [info] 2024/09/08 11:36:46.283796 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7238ms +[xorm] [info] 2024/09/08 11:38:46.279448 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3552ms +[xorm] [info] 2024/09/08 11:40:46.284556 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.6898ms +[xorm] [info] 2024/09/08 11:42:46.281142 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3365ms +[xorm] [info] 2024/09/08 11:44:46.284715 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.0791ms +[xorm] [info] 2024/09/08 11:46:46.278941 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4063ms +[xorm] [info] 2024/09/08 11:48:46.297791 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.5862ms +[xorm] [info] 2024/09/08 11:50:46.293232 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5638ms +[xorm] [info] 2024/09/08 11:52:46.307270 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.3536ms +[xorm] [info] 2024/09/08 11:54:46.281663 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.672ms +[xorm] [info] 2024/09/08 11:56:46.289044 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1966ms +[xorm] [info] 2024/09/08 11:58:46.277280 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0192ms +[xorm] [info] 2024/09/08 12:00:46.282554 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7077ms +[xorm] [info] 2024/09/08 12:02:46.279425 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1799ms +[xorm] [info] 2024/09/08 12:04:46.300305 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3698ms +[xorm] [info] 2024/09/08 12:06:46.279715 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.2805ms +[xorm] [info] 2024/09/08 12:08:46.294086 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6609ms +[xorm] [info] 2024/09/08 12:10:46.291359 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.2895ms +[xorm] [info] 2024/09/08 12:12:46.291633 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0576ms +[xorm] [info] 2024/09/08 12:14:46.273394 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5299ms +[xorm] [info] 2024/09/08 12:16:46.277378 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6112ms +[xorm] [info] 2024/09/08 12:18:46.297818 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2683ms +[xorm] [info] 2024/09/08 12:20:46.282270 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8753ms +[xorm] [info] 2024/09/08 12:22:46.284368 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5084ms +[xorm] [info] 2024/09/08 12:24:46.295612 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8059ms +[xorm] [info] 2024/09/08 12:26:46.282700 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5322ms +[xorm] [info] 2024/09/08 12:28:46.299928 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5477ms +[xorm] [info] 2024/09/08 12:30:46.293270 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4938ms +[xorm] [info] 2024/09/08 12:32:46.292401 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4413ms +[xorm] [info] 2024/09/08 12:34:46.279638 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.2598ms +[xorm] [info] 2024/09/08 12:36:46.295246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2874ms +[xorm] [info] 2024/09/08 12:38:46.299978 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9764ms +[xorm] [info] 2024/09/08 12:40:46.286871 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0901ms +[xorm] [info] 2024/09/08 12:42:46.293859 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.267ms +[xorm] [info] 2024/09/08 12:44:46.306604 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.193ms +[xorm] [info] 2024/09/08 12:46:46.298060 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7238ms +[xorm] [info] 2024/09/08 12:48:46.302353 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2931ms +[xorm] [info] 2024/09/08 12:50:46.287510 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1374ms +[xorm] [info] 2024/09/08 12:52:46.278571 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5741ms +[xorm] [info] 2024/09/08 12:54:46.278591 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1699ms +[xorm] [info] 2024/09/08 12:56:46.295934 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1038ms +[xorm] [info] 2024/09/08 12:58:46.277549 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.3266ms +[xorm] [info] 2024/09/08 13:00:46.303756 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1941ms +[xorm] [info] 2024/09/08 13:02:46.297404 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4249ms +[xorm] [info] 2024/09/08 13:04:46.284347 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3376ms +[xorm] [info] 2024/09/08 13:06:46.292940 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1791ms +[xorm] [info] 2024/09/08 13:08:46.288087 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9684ms +[xorm] [info] 2024/09/08 13:10:46.296374 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0495ms +[xorm] [info] 2024/09/08 13:12:46.280244 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.4591ms +[xorm] [info] 2024/09/08 13:14:46.291844 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4819ms +[xorm] [info] 2024/09/08 13:16:46.281660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1287ms +[xorm] [info] 2024/09/08 13:18:46.284246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.08ms +[xorm] [info] 2024/09/08 13:20:46.290945 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3292ms +[xorm] [info] 2024/09/08 13:22:46.274270 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.4845ms +[xorm] [info] 2024/09/08 13:24:46.304337 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 97.0012ms +[xorm] [info] 2024/09/08 13:26:46.285926 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8737ms +[xorm] [info] 2024/09/08 13:28:46.283769 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6456ms +[xorm] [info] 2024/09/08 13:30:46.281835 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2855ms +[xorm] [info] 2024/09/08 13:32:46.305049 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6611ms +[xorm] [info] 2024/09/08 13:34:46.281269 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1498ms +[xorm] [info] 2024/09/08 13:36:46.294017 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2569ms +[xorm] [info] 2024/09/08 13:38:46.283383 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5373ms +[xorm] [info] 2024/09/08 13:40:46.300708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5153ms +[xorm] [info] 2024/09/08 13:42:46.282488 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2014ms +[xorm] [info] 2024/09/08 13:44:46.291853 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0659ms +[xorm] [info] 2024/09/08 13:46:46.299675 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1431ms +[xorm] [info] 2024/09/08 13:48:46.295895 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0217ms +[xorm] [info] 2024/09/08 13:50:46.307194 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9122ms +[xorm] [info] 2024/09/08 13:52:46.289434 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.4459ms +[xorm] [info] 2024/09/08 13:54:46.286585 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2713ms +[xorm] [info] 2024/09/08 13:56:46.291447 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2334ms +[xorm] [info] 2024/09/08 13:58:46.278086 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3165ms +[xorm] [info] 2024/09/08 14:00:46.301369 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8051ms +[xorm] [info] 2024/09/08 14:02:46.309417 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.1472ms +[xorm] [info] 2024/09/08 14:04:46.285002 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9549ms +[xorm] [info] 2024/09/08 14:06:46.290374 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.8115ms +[xorm] [info] 2024/09/08 14:08:46.293536 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.394ms +[xorm] [info] 2024/09/08 14:10:46.323861 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 112.9935ms +[xorm] [info] 2024/09/08 14:12:46.284818 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.9291ms +[xorm] [info] 2024/09/08 14:14:46.298264 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8341ms +[xorm] [info] 2024/09/08 14:16:46.294853 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9676ms +[xorm] [info] 2024/09/08 14:18:46.298776 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3333ms +[xorm] [info] 2024/09/08 14:20:46.289913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8672ms +[xorm] [info] 2024/09/08 14:22:46.302108 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0451ms +[xorm] [info] 2024/09/08 14:24:46.287592 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.475ms +[xorm] [info] 2024/09/08 14:26:46.300040 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.7835ms +[xorm] [info] 2024/09/08 14:28:46.296567 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9273ms +[xorm] [info] 2024/09/08 14:30:46.289149 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6172ms +[xorm] [info] 2024/09/08 14:32:46.292052 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0629ms +[xorm] [info] 2024/09/08 14:34:46.290060 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5958ms +[xorm] [info] 2024/09/08 14:36:46.290467 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.872ms +[xorm] [info] 2024/09/08 14:38:46.275130 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.4824ms +[xorm] [info] 2024/09/08 14:40:46.287431 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9101ms +[xorm] [info] 2024/09/08 14:42:46.291899 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1441ms +[xorm] [info] 2024/09/08 14:44:46.294049 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1642ms +[xorm] [info] 2024/09/08 14:46:46.305974 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9909ms +[xorm] [info] 2024/09/08 14:48:46.287124 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.952ms +[xorm] [info] 2024/09/08 14:50:46.299972 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.1199ms +[xorm] [info] 2024/09/08 14:52:46.299702 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5426ms +[xorm] [info] 2024/09/08 14:54:46.293233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8692ms +[xorm] [info] 2024/09/08 14:56:46.302962 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2942ms +[xorm] [info] 2024/09/08 14:58:46.286451 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3943ms +[xorm] [info] 2024/09/08 15:00:46.300670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6973ms +[xorm] [info] 2024/09/08 15:02:46.301015 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4745ms +[xorm] [info] 2024/09/08 15:04:46.276877 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8522ms +[xorm] [info] 2024/09/08 15:06:46.294884 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2765ms +[xorm] [info] 2024/09/08 15:08:46.294009 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5792ms +[xorm] [info] 2024/09/08 15:10:46.298703 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4448ms +[xorm] [info] 2024/09/08 15:12:46.286405 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.457ms +[xorm] [info] 2024/09/08 15:14:46.278650 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2757ms +[xorm] [info] 2024/09/08 15:16:46.290448 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6979ms +[xorm] [info] 2024/09/08 15:18:46.275611 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3878ms +[xorm] [info] 2024/09/08 15:20:46.283826 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4154ms +[xorm] [info] 2024/09/08 15:22:46.292336 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7143ms +[xorm] [info] 2024/09/08 15:24:46.287271 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9407ms +[xorm] [info] 2024/09/08 15:26:46.295969 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3917ms +[xorm] [info] 2024/09/08 15:28:46.281176 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7296ms +[xorm] [info] 2024/09/08 15:30:46.288924 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5363ms +[xorm] [info] 2024/09/08 15:32:46.279711 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6163ms +[xorm] [info] 2024/09/08 15:34:46.280153 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2589ms +[xorm] [info] 2024/09/08 15:36:46.285676 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3882ms +[xorm] [info] 2024/09/08 15:38:46.306301 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.4889ms +[xorm] [info] 2024/09/08 15:40:46.284064 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1156ms +[xorm] [info] 2024/09/08 15:42:46.295719 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.514ms +[xorm] [info] 2024/09/08 15:44:46.283739 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2066ms +[xorm] [info] 2024/09/08 15:46:46.283574 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3844ms +[xorm] [info] 2024/09/08 15:48:46.296367 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1537ms +[xorm] [info] 2024/09/08 15:50:46.292283 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7807ms +[xorm] [info] 2024/09/08 15:52:46.290854 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7997ms +[xorm] [info] 2024/09/08 15:54:46.276003 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2362ms +[xorm] [info] 2024/09/08 15:56:46.285622 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5945ms +[xorm] [info] 2024/09/08 15:58:46.301664 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3959ms +[xorm] [info] 2024/09/08 16:00:46.299651 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.128ms +[xorm] [info] 2024/09/08 16:02:46.286846 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2178ms +[xorm] [info] 2024/09/08 16:04:46.283161 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0593ms +[xorm] [info] 2024/09/08 16:06:46.290075 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0444ms +[xorm] [info] 2024/09/08 16:08:46.283266 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9681ms +[xorm] [info] 2024/09/08 16:10:46.292161 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9221ms +[xorm] [info] 2024/09/08 16:12:46.283012 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.136ms +[xorm] [info] 2024/09/08 16:14:46.289666 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.976ms +[xorm] [info] 2024/09/08 16:16:46.288362 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9197ms +[xorm] [info] 2024/09/08 16:18:46.298061 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9702ms +[xorm] [info] 2024/09/08 16:20:46.292207 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4033ms +[xorm] [info] 2024/09/08 16:22:46.300731 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9077ms +[xorm] [info] 2024/09/08 16:24:46.288933 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5085ms +[xorm] [info] 2024/09/08 16:26:46.287494 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7234ms +[xorm] [info] 2024/09/08 16:28:46.288516 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6027ms +[xorm] [info] 2024/09/08 16:30:46.276678 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7667ms +[xorm] [info] 2024/09/08 16:32:46.298674 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2958ms +[xorm] [info] 2024/09/08 16:34:46.275663 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5054ms +[xorm] [info] 2024/09/08 16:36:46.288647 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3726ms +[xorm] [info] 2024/09/08 16:38:46.296025 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6269ms +[xorm] [info] 2024/09/08 16:40:46.280537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9094ms +[xorm] [info] 2024/09/08 16:42:46.284021 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6066ms +[xorm] [info] 2024/09/08 16:44:46.288726 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1501ms +[xorm] [info] 2024/09/08 16:46:46.307896 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5466ms +[xorm] [info] 2024/09/08 16:48:46.286834 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1562ms +[xorm] [info] 2024/09/08 16:50:46.281758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0967ms +[xorm] [info] 2024/09/08 16:52:46.282561 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2775ms +[xorm] [info] 2024/09/08 16:54:46.299215 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0845ms +[xorm] [info] 2024/09/08 16:56:46.290480 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3237ms +[xorm] [info] 2024/09/08 16:58:46.272000 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.0955ms +[xorm] [info] 2024/09/08 17:00:46.294673 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7057ms +[xorm] [info] 2024/09/08 17:02:46.283067 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6964ms +[xorm] [info] 2024/09/08 17:04:46.278159 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5471ms +[xorm] [info] 2024/09/08 17:06:46.280384 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7492ms +[xorm] [info] 2024/09/08 17:08:46.293692 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.4284ms +[xorm] [info] 2024/09/08 17:10:46.294642 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0899ms +[xorm] [info] 2024/09/08 17:12:46.283427 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6183ms +[xorm] [info] 2024/09/08 17:14:46.302101 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7114ms +[xorm] [info] 2024/09/08 17:16:46.284438 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6765ms +[xorm] [info] 2024/09/08 17:18:46.296539 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0685ms +[xorm] [info] 2024/09/08 17:20:46.297026 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.7137ms +[xorm] [info] 2024/09/08 17:22:46.283017 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4352ms +[xorm] [info] 2024/09/08 17:24:46.277057 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7956ms +[xorm] [info] 2024/09/08 17:26:46.286437 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9705ms +[xorm] [info] 2024/09/08 17:28:46.278651 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8514ms +[xorm] [info] 2024/09/08 17:30:46.295550 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0025ms +[xorm] [info] 2024/09/08 17:32:46.297915 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.8862ms +[xorm] [info] 2024/09/08 17:34:46.291936 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0233ms +[xorm] [info] 2024/09/08 17:36:46.290534 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8423ms +[xorm] [info] 2024/09/08 17:38:46.286622 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0745ms +[xorm] [info] 2024/09/08 17:40:46.293885 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2948ms +[xorm] [info] 2024/09/08 17:42:46.282760 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1025ms +[xorm] [info] 2024/09/08 17:44:46.300274 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7728ms +[xorm] [info] 2024/09/08 17:46:46.284341 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0271ms +[xorm] [info] 2024/09/08 17:48:46.304747 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0859ms +[xorm] [info] 2024/09/08 17:50:46.278468 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7457ms +[xorm] [info] 2024/09/08 17:52:46.277277 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2594ms +[xorm] [info] 2024/09/08 17:54:46.283558 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9328ms +[xorm] [info] 2024/09/08 17:56:46.302967 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2489ms +[xorm] [info] 2024/09/08 17:58:46.295948 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0935ms +[xorm] [info] 2024/09/08 18:00:46.299127 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9385ms +[xorm] [info] 2024/09/08 18:02:46.302315 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.8269ms +[xorm] [info] 2024/09/08 18:04:46.282786 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4873ms +[xorm] [info] 2024/09/08 18:06:46.285366 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3959ms +[xorm] [info] 2024/09/08 18:08:46.281265 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.07ms +[xorm] [info] 2024/09/08 18:10:46.288340 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1234ms +[xorm] [info] 2024/09/08 18:12:46.294906 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2667ms +[xorm] [info] 2024/09/08 18:14:46.285484 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4817ms +[xorm] [info] 2024/09/08 18:16:46.289282 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0535ms +[xorm] [info] 2024/09/08 18:18:46.301705 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7943ms +[xorm] [info] 2024/09/08 18:20:46.284704 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.311ms +[xorm] [info] 2024/09/08 18:22:46.286347 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3526ms +[xorm] [info] 2024/09/08 18:24:46.290093 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7093ms +[xorm] [info] 2024/09/08 18:26:46.293694 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1868ms +[xorm] [info] 2024/09/08 18:28:46.282749 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2503ms +[xorm] [info] 2024/09/08 18:30:46.303150 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5768ms +[xorm] [info] 2024/09/08 18:32:46.289711 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3393ms +[xorm] [info] 2024/09/08 18:34:46.279585 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5327ms +[xorm] [info] 2024/09/08 18:36:46.283913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3231ms +[xorm] [info] 2024/09/08 18:38:46.303583 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.7517ms +[xorm] [info] 2024/09/08 18:40:46.294361 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.0848ms +[xorm] [info] 2024/09/08 18:42:46.300747 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3658ms +[xorm] [info] 2024/09/08 18:44:46.279573 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4522ms +[xorm] [info] 2024/09/08 18:46:46.292169 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2267ms +[xorm] [info] 2024/09/08 18:48:46.299437 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1249ms +[xorm] [info] 2024/09/08 18:50:46.301015 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4904ms +[xorm] [info] 2024/09/08 18:52:46.292692 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6706ms +[xorm] [info] 2024/09/08 18:54:46.287275 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4997ms +[xorm] [info] 2024/09/08 18:56:46.296008 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3656ms +[xorm] [info] 2024/09/08 18:58:46.281866 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0008ms +[xorm] [info] 2024/09/08 19:00:46.302989 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.7186ms +[xorm] [info] 2024/09/08 19:02:46.293417 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7629ms +[xorm] [info] 2024/09/08 19:04:46.303949 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6729ms +[xorm] [info] 2024/09/08 19:06:46.301896 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6814ms +[xorm] [info] 2024/09/08 19:08:46.285813 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.58ms +[xorm] [info] 2024/09/08 19:10:46.293711 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5268ms +[xorm] [info] 2024/09/08 19:12:46.295388 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.9555ms +[xorm] [info] 2024/09/08 19:14:46.289156 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5498ms +[xorm] [info] 2024/09/08 19:16:46.291352 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4655ms +[xorm] [info] 2024/09/08 19:18:46.296449 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3409ms +[xorm] [info] 2024/09/08 19:20:46.284881 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.414ms +[xorm] [info] 2024/09/08 19:22:46.305721 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4515ms +[xorm] [info] 2024/09/08 19:24:46.287350 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7615ms +[xorm] [info] 2024/09/08 19:26:46.284008 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5328ms +[xorm] [info] 2024/09/08 19:28:46.281400 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9114ms +[xorm] [info] 2024/09/08 19:30:46.287388 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4092ms +[xorm] [info] 2024/09/08 19:32:46.286895 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6346ms +[xorm] [info] 2024/09/08 19:34:46.287163 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4057ms +[xorm] [info] 2024/09/08 19:36:46.298553 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.9269ms +[xorm] [info] 2024/09/08 19:38:46.279275 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3593ms +[xorm] [info] 2024/09/08 19:40:46.289999 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1907ms +[xorm] [info] 2024/09/08 19:42:46.277628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4396ms +[xorm] [info] 2024/09/08 19:44:46.304356 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8313ms +[xorm] [info] 2024/09/08 19:46:46.292529 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8751ms +[xorm] [info] 2024/09/08 19:48:46.286465 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1333ms +[xorm] [info] 2024/09/08 19:50:46.302692 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6132ms +[xorm] [info] 2024/09/08 19:52:46.302750 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3448ms +[xorm] [info] 2024/09/08 19:54:46.279949 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9955ms +[xorm] [info] 2024/09/08 19:56:46.288415 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3866ms +[xorm] [info] 2024/09/08 19:58:46.290844 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7621ms +[xorm] [info] 2024/09/08 20:00:46.288984 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8017ms +[xorm] [info] 2024/09/08 20:02:46.280360 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.593ms +[xorm] [info] 2024/09/08 20:04:46.282303 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1391ms +[xorm] [info] 2024/09/08 20:06:46.276489 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1111ms +[xorm] [info] 2024/09/08 20:08:46.294724 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.545ms +[xorm] [info] 2024/09/08 20:10:46.300480 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1999ms +[xorm] [info] 2024/09/08 20:12:46.286020 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5414ms +[xorm] [info] 2024/09/08 20:14:46.292648 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6007ms +[xorm] [info] 2024/09/08 20:16:46.287326 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7335ms +[xorm] [info] 2024/09/08 20:18:46.294269 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4151ms +[xorm] [info] 2024/09/08 20:20:46.288660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3623ms +[xorm] [info] 2024/09/08 20:22:46.296262 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8162ms +[xorm] [info] 2024/09/08 20:24:46.299259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0116ms +[xorm] [info] 2024/09/08 20:26:46.280814 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7195ms +[xorm] [info] 2024/09/08 20:28:46.293540 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3791ms +[xorm] [info] 2024/09/08 20:30:46.305319 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7934ms +[xorm] [info] 2024/09/08 20:32:46.287335 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5376ms +[xorm] [info] 2024/09/08 20:34:46.287850 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7642ms +[xorm] [info] 2024/09/08 20:36:46.282708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.268ms +[xorm] [info] 2024/09/08 20:38:46.280196 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0482ms +[xorm] [info] 2024/09/08 20:40:46.295261 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9782ms +[xorm] [info] 2024/09/08 20:42:46.294988 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2376ms +[xorm] [info] 2024/09/08 20:44:46.295003 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9899ms +[xorm] [info] 2024/09/08 20:46:46.288566 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3045ms +[xorm] [info] 2024/09/08 20:48:46.282482 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0387ms +[xorm] [info] 2024/09/08 20:50:46.293763 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1677ms +[xorm] [info] 2024/09/08 20:52:46.305091 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1874ms +[xorm] [info] 2024/09/08 20:54:46.284272 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4587ms +[xorm] [info] 2024/09/08 20:56:46.282233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.722ms +[xorm] [info] 2024/09/08 20:58:46.296767 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2967ms +[xorm] [info] 2024/09/08 21:00:46.303567 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1182ms +[xorm] [info] 2024/09/08 21:02:46.295542 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2975ms +[xorm] [info] 2024/09/08 21:04:46.303653 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5486ms +[xorm] [info] 2024/09/08 21:06:46.287687 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3516ms +[xorm] [info] 2024/09/08 21:08:46.292651 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.3852ms +[xorm] [info] 2024/09/08 21:10:46.286053 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3104ms +[xorm] [info] 2024/09/08 21:12:46.288222 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2344ms +[xorm] [info] 2024/09/08 21:14:46.297380 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6798ms +[xorm] [info] 2024/09/08 21:16:46.296902 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2014ms +[xorm] [info] 2024/09/08 21:18:46.293103 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.045ms +[xorm] [info] 2024/09/08 21:20:46.283721 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5304ms +[xorm] [info] 2024/09/08 21:22:46.284388 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2578ms +[xorm] [info] 2024/09/08 21:24:46.276620 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7225ms +[xorm] [info] 2024/09/08 21:26:46.285111 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.462ms +[xorm] [info] 2024/09/08 21:28:46.284981 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5496ms +[xorm] [info] 2024/09/08 21:30:46.293246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.9823ms +[xorm] [info] 2024/09/08 21:32:46.296786 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6262ms +[xorm] [info] 2024/09/08 21:34:46.289600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9294ms +[xorm] [info] 2024/09/08 21:36:46.292692 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.8307ms +[xorm] [info] 2024/09/08 21:38:46.286824 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8789ms +[xorm] [info] 2024/09/08 21:40:46.287414 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6359ms +[xorm] [info] 2024/09/08 21:42:46.298879 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9763ms +[xorm] [info] 2024/09/08 21:44:46.296036 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5822ms +[xorm] [info] 2024/09/08 21:46:46.279929 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7886ms +[xorm] [info] 2024/09/08 21:48:46.278046 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5921ms +[xorm] [info] 2024/09/08 21:50:46.286983 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3733ms +[xorm] [info] 2024/09/08 21:52:46.277985 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5849ms +[xorm] [info] 2024/09/08 21:54:46.288278 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3584ms +[xorm] [info] 2024/09/08 21:56:46.278660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5674ms +[xorm] [info] 2024/09/08 21:58:46.288668 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1927ms +[xorm] [info] 2024/09/08 22:00:46.286381 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6732ms +[xorm] [info] 2024/09/08 22:02:46.287576 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8908ms +[xorm] [info] 2024/09/08 22:04:46.295493 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5329ms +[xorm] [info] 2024/09/08 22:06:46.280421 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3197ms +[xorm] [info] 2024/09/08 22:08:46.289392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1446ms +[xorm] [info] 2024/09/08 22:10:46.278457 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.426ms +[xorm] [info] 2024/09/08 22:12:46.288714 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5469ms +[xorm] [info] 2024/09/08 22:14:46.287726 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4178ms +[xorm] [info] 2024/09/08 22:16:46.279603 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.834ms +[xorm] [info] 2024/09/08 22:18:46.298339 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7804ms +[xorm] [info] 2024/09/08 22:20:46.287609 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8061ms +[xorm] [info] 2024/09/08 22:22:46.292824 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4107ms +[xorm] [info] 2024/09/08 22:24:46.288790 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9424ms +[xorm] [info] 2024/09/08 22:26:46.290215 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0445ms +[xorm] [info] 2024/09/08 22:28:46.299202 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0748ms +[xorm] [info] 2024/09/08 22:30:46.277840 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2045ms +[xorm] [info] 2024/09/08 22:32:46.299131 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.454ms +[xorm] [info] 2024/09/08 22:34:46.293811 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6249ms +[xorm] [info] 2024/09/08 22:36:46.284451 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8252ms +[xorm] [info] 2024/09/08 22:38:46.289145 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0834ms +[xorm] [info] 2024/09/08 22:40:46.288769 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5128ms +[xorm] [info] 2024/09/08 22:42:46.296671 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4912ms +[xorm] [info] 2024/09/08 22:44:46.308623 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.7133ms +[xorm] [info] 2024/09/08 22:46:46.275141 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3649ms +[xorm] [info] 2024/09/08 22:48:46.297807 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4946ms +[xorm] [info] 2024/09/08 22:50:46.305477 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3809ms +[xorm] [info] 2024/09/08 22:52:46.288916 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9284ms +[xorm] [info] 2024/09/08 22:54:46.285065 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2642ms +[xorm] [info] 2024/09/08 22:56:46.292217 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7144ms +[xorm] [info] 2024/09/08 22:58:46.291662 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2321ms +[xorm] [info] 2024/09/08 23:00:46.289625 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0205ms +[xorm] [info] 2024/09/08 23:02:46.293566 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7786ms +[xorm] [info] 2024/09/08 23:04:46.293763 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3089ms +[xorm] [info] 2024/09/08 23:06:46.277486 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8707ms +[xorm] [info] 2024/09/08 23:08:46.272869 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.5027ms +[xorm] [info] 2024/09/08 23:10:46.288107 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7684ms +[xorm] [info] 2024/09/08 23:12:46.289730 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4393ms +[xorm] [info] 2024/09/08 23:14:46.298717 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7032ms +[xorm] [info] 2024/09/08 23:16:46.289346 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9577ms +[xorm] [info] 2024/09/08 23:18:46.304373 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9145ms +[xorm] [info] 2024/09/08 23:20:46.276012 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6051ms +[xorm] [info] 2024/09/08 23:22:46.290353 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.246ms +[xorm] [info] 2024/09/08 23:24:46.293763 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6185ms +[xorm] [info] 2024/09/08 23:26:46.295832 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3992ms +[xorm] [info] 2024/09/08 23:28:46.303407 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0095ms +[xorm] [info] 2024/09/08 23:30:46.287436 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2021ms +[xorm] [info] 2024/09/08 23:32:46.285485 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8824ms +[xorm] [info] 2024/09/08 23:34:46.279227 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0056ms +[xorm] [info] 2024/09/08 23:36:46.290373 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.4316ms +[xorm] [info] 2024/09/08 23:38:46.276002 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2864ms +[xorm] [info] 2024/09/08 23:40:46.291504 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5611ms +[xorm] [info] 2024/09/08 23:42:46.291427 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4165ms +[xorm] [info] 2024/09/08 23:44:46.296325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1017ms +[xorm] [info] 2024/09/08 23:46:46.276769 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3866ms +[xorm] [info] 2024/09/08 23:48:46.295819 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.3653ms +[xorm] [info] 2024/09/08 23:50:46.282747 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4749ms +[xorm] [info] 2024/09/08 23:52:46.291250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8969ms +[xorm] [info] 2024/09/08 23:54:46.288342 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2767ms +[xorm] [info] 2024/09/08 23:56:46.270652 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5676ms +[xorm] [info] 2024/09/08 23:58:46.290085 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1581ms +[xorm] [info] 2024/09/09 00:00:46.285389 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0955ms +[xorm] [info] 2024/09/09 00:02:46.294668 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3004ms +[xorm] [info] 2024/09/09 00:04:46.277755 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2864ms +[xorm] [info] 2024/09/09 00:06:46.289734 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5127ms +[xorm] [info] 2024/09/09 00:08:46.282664 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.909ms +[xorm] [info] 2024/09/09 00:10:46.293325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.4877ms +[xorm] [info] 2024/09/09 00:12:46.283015 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.28ms +[xorm] [info] 2024/09/09 00:14:46.288059 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7375ms +[xorm] [info] 2024/09/09 00:16:46.294369 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2051ms +[xorm] [info] 2024/09/09 00:18:46.295327 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.193ms +[xorm] [info] 2024/09/09 00:20:46.290933 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1436ms +[xorm] [info] 2024/09/09 00:22:46.302844 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7769ms +[xorm] [info] 2024/09/09 00:24:46.286643 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6033ms +[xorm] [info] 2024/09/09 00:26:46.292934 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0049ms +[xorm] [info] 2024/09/09 00:28:46.271254 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.9487ms +[xorm] [info] 2024/09/09 00:30:46.284361 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7237ms +[xorm] [info] 2024/09/09 00:32:46.287894 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1261ms +[xorm] [info] 2024/09/09 00:34:46.296562 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3769ms +[xorm] [info] 2024/09/09 00:36:46.275974 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6728ms +[xorm] [info] 2024/09/09 00:38:46.276770 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9315ms +[xorm] [info] 2024/09/09 00:40:46.284359 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7193ms +[xorm] [info] 2024/09/09 00:42:46.282422 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0561ms +[xorm] [info] 2024/09/09 00:44:46.288262 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8195ms +[xorm] [info] 2024/09/09 00:46:46.283267 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8212ms +[xorm] [info] 2024/09/09 00:48:46.293542 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9517ms +[xorm] [info] 2024/09/09 00:50:46.276131 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.8347ms +[xorm] [info] 2024/09/09 00:52:46.287396 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9317ms +[xorm] [info] 2024/09/09 00:54:46.278916 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4966ms +[xorm] [info] 2024/09/09 00:56:46.295743 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7339ms +[xorm] [info] 2024/09/09 00:58:46.280380 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0507ms +[xorm] [info] 2024/09/09 01:00:46.280388 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0249ms +[xorm] [info] 2024/09/09 01:02:46.286708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3841ms +[xorm] [info] 2024/09/09 01:04:46.279988 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7918ms +[xorm] [info] 2024/09/09 01:06:46.289831 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8598ms +[xorm] [info] 2024/09/09 01:08:46.281248 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0801ms +[xorm] [info] 2024/09/09 01:10:46.286793 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2841ms +[xorm] [info] 2024/09/09 01:12:46.282679 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7754ms +[xorm] [info] 2024/09/09 01:14:46.277795 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7854ms +[xorm] [info] 2024/09/09 01:16:46.286786 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1036ms +[xorm] [info] 2024/09/09 01:18:46.286212 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.055ms +[xorm] [info] 2024/09/09 01:20:46.284256 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9471ms +[xorm] [info] 2024/09/09 01:22:46.299905 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6238ms +[xorm] [info] 2024/09/09 01:24:46.293782 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6223ms +[xorm] [info] 2024/09/09 01:26:46.291808 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8349ms +[xorm] [info] 2024/09/09 01:28:46.292433 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8378ms +[xorm] [info] 2024/09/09 01:30:46.292699 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5292ms +[xorm] [info] 2024/09/09 01:32:46.285179 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8875ms +[xorm] [info] 2024/09/09 01:34:46.301946 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7445ms +[xorm] [info] 2024/09/09 01:36:46.292891 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8061ms +[xorm] [info] 2024/09/09 01:38:46.285074 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2078ms +[xorm] [info] 2024/09/09 01:40:46.288069 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.877ms +[xorm] [info] 2024/09/09 01:42:46.300214 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.5197ms +[xorm] [info] 2024/09/09 01:44:46.277510 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5782ms +[xorm] [info] 2024/09/09 01:46:46.284643 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8762ms +[xorm] [info] 2024/09/09 01:48:46.299642 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1646ms +[xorm] [info] 2024/09/09 01:50:46.305009 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9404ms +[xorm] [info] 2024/09/09 01:52:46.302715 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.3157ms +[xorm] [info] 2024/09/09 01:54:46.303406 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4363ms +[xorm] [info] 2024/09/09 01:56:46.291413 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.1765ms +[xorm] [info] 2024/09/09 01:58:46.283143 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6759ms +[xorm] [info] 2024/09/09 02:00:46.291052 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0517ms +[xorm] [info] 2024/09/09 02:02:46.282758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9216ms +[xorm] [info] 2024/09/09 02:04:46.291496 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.962ms +[xorm] [info] 2024/09/09 02:06:46.299904 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.6194ms +[xorm] [info] 2024/09/09 02:08:46.275028 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.1978ms +[xorm] [info] 2024/09/09 02:10:46.299374 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.4567ms +[xorm] [info] 2024/09/09 02:12:46.282586 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8727ms +[xorm] [info] 2024/09/09 02:14:46.283666 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1501ms +[xorm] [info] 2024/09/09 02:16:46.288138 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.3757ms +[xorm] [info] 2024/09/09 02:18:46.304084 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9811ms +[xorm] [info] 2024/09/09 02:20:46.283986 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3967ms +[xorm] [info] 2024/09/09 02:22:46.285814 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.2317ms +[xorm] [info] 2024/09/09 02:24:46.275600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0956ms +[xorm] [info] 2024/09/09 02:26:46.283393 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.7924ms +[xorm] [info] 2024/09/09 02:28:46.287277 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7006ms +[xorm] [info] 2024/09/09 02:30:46.286687 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8922ms +[xorm] [info] 2024/09/09 02:32:46.289757 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.387ms +[xorm] [info] 2024/09/09 02:34:46.285871 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3248ms +[xorm] [info] 2024/09/09 02:36:46.285464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4412ms +[xorm] [info] 2024/09/09 02:38:46.301119 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.8376ms +[xorm] [info] 2024/09/09 02:40:46.288066 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6807ms +[xorm] [info] 2024/09/09 02:42:46.295861 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8817ms +[xorm] [info] 2024/09/09 02:44:46.287970 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3017ms +[xorm] [info] 2024/09/09 02:46:46.278764 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5674ms +[xorm] [info] 2024/09/09 02:48:46.289070 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3039ms +[xorm] [info] 2024/09/09 02:50:46.291796 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1677ms +[xorm] [info] 2024/09/09 02:52:46.290080 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.5664ms +[xorm] [info] 2024/09/09 02:54:46.284678 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8469ms +[xorm] [info] 2024/09/09 02:56:46.282512 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1795ms +[xorm] [info] 2024/09/09 02:58:46.281517 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.837ms +[xorm] [info] 2024/09/09 03:00:46.282374 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5682ms +[xorm] [info] 2024/09/09 03:02:46.299476 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9884ms +[xorm] [info] 2024/09/09 03:04:46.293026 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8041ms +[xorm] [info] 2024/09/09 03:06:46.282203 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4825ms +[xorm] [info] 2024/09/09 03:08:46.282883 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4964ms +[xorm] [info] 2024/09/09 03:10:46.279313 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1004ms +[xorm] [info] 2024/09/09 03:12:46.279626 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6357ms +[xorm] [info] 2024/09/09 03:14:46.298148 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.442ms +[xorm] [info] 2024/09/09 03:16:46.288023 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7706ms +[xorm] [info] 2024/09/09 03:18:46.290392 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1571ms +[xorm] [info] 2024/09/09 03:20:46.292038 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8567ms +[xorm] [info] 2024/09/09 03:22:46.280685 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5182ms +[xorm] [info] 2024/09/09 03:24:46.286640 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.536ms +[xorm] [info] 2024/09/09 03:26:46.287949 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7073ms +[xorm] [info] 2024/09/09 03:28:46.298214 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.4333ms +[xorm] [info] 2024/09/09 03:30:46.294191 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.3804ms +[xorm] [info] 2024/09/09 03:32:46.291373 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.5442ms +[xorm] [info] 2024/09/09 03:34:46.295162 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6109ms +[xorm] [info] 2024/09/09 03:36:46.285556 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7783ms +[xorm] [info] 2024/09/09 03:38:46.288082 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7461ms +[xorm] [info] 2024/09/09 03:40:46.280740 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.748ms +[xorm] [info] 2024/09/09 03:42:46.293604 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.5966ms +[xorm] [info] 2024/09/09 03:44:46.287294 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0968ms +[xorm] [info] 2024/09/09 03:46:46.286232 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5148ms +[xorm] [info] 2024/09/09 03:48:46.279317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.7714ms +[xorm] [info] 2024/09/09 03:50:46.277515 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.9947ms +[xorm] [info] 2024/09/09 03:52:46.270259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.828ms +[xorm] [info] 2024/09/09 03:54:46.284685 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6973ms +[xorm] [info] 2024/09/09 03:56:46.280899 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9586ms +[xorm] [info] 2024/09/09 03:58:46.291947 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2094ms +[xorm] [info] 2024/09/09 04:00:46.301645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2782ms +[xorm] [info] 2024/09/09 04:02:46.307123 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5679ms +[xorm] [info] 2024/09/09 04:04:46.294778 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8872ms +[xorm] [info] 2024/09/09 04:06:46.287317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0147ms +[xorm] [info] 2024/09/09 04:08:46.275813 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2413ms +[xorm] [info] 2024/09/09 04:10:46.287451 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1576ms +[xorm] [info] 2024/09/09 04:12:46.293602 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5283ms +[xorm] [info] 2024/09/09 04:14:46.276572 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3137ms +[xorm] [info] 2024/09/09 04:16:46.284101 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3541ms +[xorm] [info] 2024/09/09 04:18:46.299695 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2169ms +[xorm] [info] 2024/09/09 04:20:46.278569 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0361ms +[xorm] [info] 2024/09/09 04:22:46.293250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8989ms +[xorm] [info] 2024/09/09 04:24:46.294143 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8147ms +[xorm] [info] 2024/09/09 04:26:46.277194 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5005ms +[xorm] [info] 2024/09/09 04:28:46.288816 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1528ms +[xorm] [info] 2024/09/09 04:30:46.293430 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6894ms +[xorm] [info] 2024/09/09 04:32:46.299718 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9007ms +[xorm] [info] 2024/09/09 04:34:46.291316 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0353ms +[xorm] [info] 2024/09/09 04:36:46.288822 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8036ms +[xorm] [info] 2024/09/09 04:38:46.281597 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1203ms +[xorm] [info] 2024/09/09 04:40:46.288370 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0624ms +[xorm] [info] 2024/09/09 04:42:46.302954 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9881ms +[xorm] [info] 2024/09/09 04:44:46.283096 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6332ms +[xorm] [info] 2024/09/09 04:46:46.302001 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1011ms +[xorm] [info] 2024/09/09 04:48:46.297442 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3891ms +[xorm] [info] 2024/09/09 04:50:46.278509 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6836ms +[xorm] [info] 2024/09/09 04:52:46.299638 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7169ms +[xorm] [info] 2024/09/09 04:54:46.300100 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.2169ms +[xorm] [info] 2024/09/09 04:56:46.284995 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9013ms +[xorm] [info] 2024/09/09 04:58:46.286017 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.1449ms +[xorm] [info] 2024/09/09 05:00:46.285604 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4911ms +[xorm] [info] 2024/09/09 05:02:46.305386 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3644ms +[xorm] [info] 2024/09/09 05:04:46.283743 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1618ms +[xorm] [info] 2024/09/09 05:06:46.305347 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2048ms +[xorm] [info] 2024/09/09 05:08:46.286106 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4676ms +[xorm] [info] 2024/09/09 05:10:46.277391 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3088ms +[xorm] [info] 2024/09/09 05:12:46.286611 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5209ms +[xorm] [info] 2024/09/09 05:14:46.278818 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1331ms +[xorm] [info] 2024/09/09 05:16:46.285600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1295ms +[xorm] [info] 2024/09/09 05:18:46.305670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.9923ms +[xorm] [info] 2024/09/09 05:20:46.299537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7369ms +[xorm] [info] 2024/09/09 05:22:46.290590 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.602ms +[xorm] [info] 2024/09/09 05:24:46.285955 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.5544ms +[xorm] [info] 2024/09/09 05:26:46.290323 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6624ms +[xorm] [info] 2024/09/09 05:28:46.282244 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3575ms +[xorm] [info] 2024/09/09 05:30:46.290255 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8156ms +[xorm] [info] 2024/09/09 05:32:46.289712 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3526ms +[xorm] [info] 2024/09/09 05:34:46.305366 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9381ms +[xorm] [info] 2024/09/09 05:36:46.281356 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.2061ms +[xorm] [info] 2024/09/09 05:38:46.290239 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7715ms +[xorm] [info] 2024/09/09 05:40:46.285991 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2552ms +[xorm] [info] 2024/09/09 05:42:46.291401 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1173ms +[xorm] [info] 2024/09/09 05:44:46.300360 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.6568ms +[xorm] [info] 2024/09/09 05:46:46.308598 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.577ms +[xorm] [info] 2024/09/09 05:48:46.288860 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6937ms +[xorm] [info] 2024/09/09 05:50:46.287434 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.4751ms +[xorm] [info] 2024/09/09 05:52:46.279379 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8478ms +[xorm] [info] 2024/09/09 05:54:46.294093 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2974ms +[xorm] [info] 2024/09/09 05:56:46.281678 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8742ms +[xorm] [info] 2024/09/09 05:58:46.293216 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.2309ms +[xorm] [info] 2024/09/09 06:00:46.293457 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.3582ms +[xorm] [info] 2024/09/09 06:02:46.293936 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4722ms +[xorm] [info] 2024/09/09 06:04:46.297523 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.792ms +[xorm] [info] 2024/09/09 06:06:46.277727 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2661ms +[xorm] [info] 2024/09/09 06:08:46.291082 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0971ms +[xorm] [info] 2024/09/09 06:10:46.295967 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8977ms +[xorm] [info] 2024/09/09 06:12:46.281644 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8654ms +[xorm] [info] 2024/09/09 06:14:46.285858 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8735ms +[xorm] [info] 2024/09/09 06:16:46.273167 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.2704ms +[xorm] [info] 2024/09/09 06:18:46.293021 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.891ms +[xorm] [info] 2024/09/09 06:20:46.299516 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.3926ms +[xorm] [info] 2024/09/09 06:22:46.276597 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0131ms +[xorm] [info] 2024/09/09 06:24:46.304612 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.8605ms +[xorm] [info] 2024/09/09 06:26:46.300903 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6766ms +[xorm] [info] 2024/09/09 06:28:46.283653 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6103ms +[xorm] [info] 2024/09/09 06:30:46.298905 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.8277ms +[xorm] [info] 2024/09/09 06:32:46.283612 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7491ms +[xorm] [info] 2024/09/09 06:34:46.291732 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7262ms +[xorm] [info] 2024/09/09 06:36:46.281814 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4555ms +[xorm] [info] 2024/09/09 06:38:46.289398 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9849ms +[xorm] [info] 2024/09/09 06:40:46.297889 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4809ms +[xorm] [info] 2024/09/09 06:42:46.286766 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7613ms +[xorm] [info] 2024/09/09 06:44:46.293948 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7989ms +[xorm] [info] 2024/09/09 06:46:46.301419 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9422ms +[xorm] [info] 2024/09/09 06:48:46.309015 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1761ms +[xorm] [info] 2024/09/09 06:50:46.304341 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2499ms +[xorm] [info] 2024/09/09 06:52:46.282803 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3397ms +[xorm] [info] 2024/09/09 06:54:46.288022 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6858ms +[xorm] [info] 2024/09/09 06:56:46.294536 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8507ms +[xorm] [info] 2024/09/09 06:58:46.281788 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9807ms +[xorm] [info] 2024/09/09 07:00:46.300002 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3249ms +[xorm] [info] 2024/09/09 07:02:46.303014 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9245ms +[xorm] [info] 2024/09/09 07:04:46.297443 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6676ms +[xorm] [info] 2024/09/09 07:06:46.296498 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3565ms +[xorm] [info] 2024/09/09 07:08:46.303830 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.2042ms +[xorm] [info] 2024/09/09 07:10:46.292793 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8237ms +[xorm] [info] 2024/09/09 07:12:46.288830 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9577ms +[xorm] [info] 2024/09/09 07:14:46.286136 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8706ms +[xorm] [info] 2024/09/09 07:16:46.286048 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1027ms +[xorm] [info] 2024/09/09 07:18:46.281708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.8244ms +[xorm] [info] 2024/09/09 07:20:46.282393 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.735ms +[xorm] [info] 2024/09/09 07:22:46.282363 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0676ms +[xorm] [info] 2024/09/09 07:24:46.292234 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2341ms +[xorm] [info] 2024/09/09 07:26:46.278764 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.469ms +[xorm] [info] 2024/09/09 07:28:46.295866 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.206ms +[xorm] [info] 2024/09/09 07:30:46.290528 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1909ms +[xorm] [info] 2024/09/09 07:32:46.278355 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6622ms +[xorm] [info] 2024/09/09 07:34:46.285610 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.5175ms +[xorm] [info] 2024/09/09 07:36:46.288553 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4885ms +[xorm] [info] 2024/09/09 07:38:46.277197 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4447ms +[xorm] [info] 2024/09/09 07:40:46.299653 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2492ms +[xorm] [info] 2024/09/09 07:42:46.285872 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4516ms +[xorm] [info] 2024/09/09 07:44:46.307105 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.3547ms +[xorm] [info] 2024/09/09 07:46:46.291659 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1336ms +[xorm] [info] 2024/09/09 07:48:46.287667 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6828ms +[xorm] [info] 2024/09/09 07:50:46.278959 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0535ms +[xorm] [info] 2024/09/09 07:52:46.292113 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.195ms +[xorm] [info] 2024/09/09 07:54:46.274999 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3998ms +[xorm] [info] 2024/09/09 07:56:46.306399 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9308ms +[xorm] [info] 2024/09/09 07:58:46.290251 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1406ms +[xorm] [info] 2024/09/09 08:00:46.314422 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 107.0191ms +[xorm] [info] 2024/09/09 08:02:46.287164 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0441ms +[xorm] [info] 2024/09/09 08:04:46.284067 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5511ms +[xorm] [info] 2024/09/09 08:06:46.283412 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.0244ms +[xorm] [info] 2024/09/09 08:08:46.286656 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2852ms +[xorm] [info] 2024/09/09 08:10:46.295451 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7177ms +[xorm] [info] 2024/09/09 08:12:46.303535 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5015ms +[xorm] [info] 2024/09/09 08:14:46.300745 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2899ms +[xorm] [info] 2024/09/09 08:16:46.296670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4992ms +[xorm] [info] 2024/09/09 08:18:46.299581 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9015ms +[xorm] [info] 2024/09/09 08:20:46.286232 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2153ms +[xorm] [info] 2024/09/09 08:22:46.288198 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8464ms +[xorm] [info] 2024/09/09 08:24:46.305259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.3609ms +[xorm] [info] 2024/09/09 08:26:46.298237 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2572ms +[xorm] [info] 2024/09/09 08:28:46.306396 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7923ms +[xorm] [info] 2024/09/09 08:30:46.303032 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.8399ms +[xorm] [info] 2024/09/09 08:32:46.299336 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.6156ms +[xorm] [info] 2024/09/09 08:34:46.301188 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.38ms +[xorm] [info] 2024/09/09 08:36:46.297040 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.428ms +[xorm] [info] 2024/09/09 08:38:46.295148 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.6238ms +[xorm] [info] 2024/09/09 08:40:46.293134 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6401ms +[xorm] [info] 2024/09/09 08:42:46.289537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0858ms +[xorm] [info] 2024/09/09 08:44:47.555323 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 1.3424816s +[xorm] [info] 2024/09/09 08:46:46.780387 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 573.6253ms +[xorm] [info] 2024/09/09 08:48:47.193857 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 977.0486ms +[xorm] [info] 2024/09/09 08:50:47.201236 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 983.8668ms +[xorm] [info] 2024/09/09 08:52:47.169509 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 953.6793ms +[xorm] [info] 2024/09/09 08:54:47.161670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 954.4751ms +[xorm] [info] 2024/09/09 08:56:46.274152 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.0838ms +[xorm] [info] 2024/09/09 08:58:46.291271 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2802ms +[xorm] [info] 2024/09/09 09:00:46.302032 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.573ms +[xorm] [info] 2024/09/09 09:02:46.294129 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8774ms +[xorm] [info] 2024/09/09 09:04:46.290892 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6001ms +[xorm] [info] 2024/09/09 09:06:46.281910 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.365ms +[xorm] [info] 2024/09/09 09:08:46.299025 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.0286ms +[xorm] [info] 2024/09/09 09:10:46.291377 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9956ms +[xorm] [info] 2024/09/09 09:12:46.295199 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3321ms +[xorm] [info] 2024/09/09 09:14:46.283243 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4972ms +[xorm] [info] 2024/09/09 09:16:46.277723 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8261ms +[xorm] [info] 2024/09/09 09:18:46.288046 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.9192ms +[xorm] [info] 2024/09/09 09:20:46.284649 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7419ms +[xorm] [info] 2024/09/09 09:22:46.287024 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.1898ms +[xorm] [info] 2024/09/09 09:24:46.292259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.9697ms +[xorm] [info] 2024/09/09 09:26:46.286530 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5297ms +[xorm] [info] 2024/09/09 09:28:46.289784 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2377ms +[xorm] [info] 2024/09/09 09:30:46.300302 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8569ms +[xorm] [info] 2024/09/09 09:32:46.306345 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.5761ms +[xorm] [info] 2024/09/09 09:34:46.293466 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6845ms +[xorm] [info] 2024/09/09 09:36:46.298196 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8631ms +[xorm] [info] 2024/09/09 09:38:46.307261 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1684ms +[xorm] [info] 2024/09/09 09:40:46.297567 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0787ms +[xorm] [info] 2024/09/09 09:42:46.283462 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0468ms +[xorm] [info] 2024/09/09 09:44:46.279288 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.5851ms +[xorm] [info] 2024/09/09 09:46:46.293913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.6915ms +[xorm] [info] 2024/09/09 09:48:46.295273 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9415ms +[xorm] [info] 2024/09/09 09:50:46.350136 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 134.0497ms +[xorm] [info] 2024/09/09 09:52:46.292909 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7485ms +[xorm] [info] 2024/09/09 09:54:46.292486 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.5542ms +[xorm] [info] 2024/09/09 09:56:46.288499 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4725ms +[xorm] [info] 2024/09/09 09:58:46.290044 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.066ms +[xorm] [info] 2024/09/09 10:00:46.293231 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1071ms +[xorm] [info] 2024/09/09 10:02:46.297327 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.8049ms +[xorm] [info] 2024/09/09 10:04:46.282728 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.4905ms +[xorm] [info] 2024/09/09 10:06:46.292136 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1212ms +[xorm] [info] 2024/09/09 10:08:46.289184 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6513ms +[xorm] [info] 2024/09/09 10:10:46.290334 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9561ms +[xorm] [info] 2024/09/09 10:12:46.288245 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8444ms +[xorm] [info] 2024/09/09 10:14:46.278565 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1297ms +[xorm] [info] 2024/09/09 10:16:46.281088 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6443ms +[xorm] [info] 2024/09/09 10:18:46.297145 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5093ms +[xorm] [info] 2024/09/09 10:20:46.283019 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6135ms +[xorm] [info] 2024/09/09 10:22:46.488890 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 273.7162ms +[xorm] [info] 2024/09/09 10:24:46.287124 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1919ms +[xorm] [info] 2024/09/09 10:26:46.295641 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9685ms +[xorm] [info] 2024/09/09 10:28:46.299518 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.5875ms +[xorm] [info] 2024/09/09 10:30:46.316021 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 108.3441ms +[xorm] [info] 2024/09/09 10:32:46.299295 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3226ms +[xorm] [info] 2024/09/09 10:34:46.296016 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6ms +[xorm] [info] 2024/09/09 10:36:46.290747 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.27ms +[xorm] [info] 2024/09/09 10:38:46.290708 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7441ms +[xorm] [info] 2024/09/09 10:40:46.306416 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1426ms +[xorm] [info] 2024/09/09 10:42:46.287449 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0036ms +[xorm] [info] 2024/09/09 10:44:46.297877 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2436ms +[xorm] [info] 2024/09/09 10:46:46.294263 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3221ms +[xorm] [info] 2024/09/09 10:48:46.304670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6916ms +[xorm] [info] 2024/09/09 10:50:46.280991 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.3304ms +[xorm] [info] 2024/09/09 10:52:46.284642 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4958ms +[xorm] [info] 2024/09/09 10:54:46.282067 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1868ms +[xorm] [info] 2024/09/09 10:56:46.307837 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.6123ms +[xorm] [info] 2024/09/09 10:58:46.281057 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5496ms +[xorm] [info] 2024/09/09 11:00:46.305093 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.7077ms +[xorm] [info] 2024/09/09 11:02:46.275353 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.3011ms +[xorm] [info] 2024/09/09 11:04:46.300528 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.3172ms +[xorm] [info] 2024/09/09 11:06:46.277278 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7554ms +[xorm] [info] 2024/09/09 11:08:46.288491 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6824ms +[xorm] [info] 2024/09/09 11:10:46.296985 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9977ms +[xorm] [info] 2024/09/09 11:12:46.285907 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0485ms +[xorm] [info] 2024/09/09 11:14:46.305257 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.3747ms +[xorm] [info] 2024/09/09 11:16:46.305858 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.4709ms +[xorm] [info] 2024/09/09 11:18:46.298823 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3063ms +[xorm] [info] 2024/09/09 11:20:46.299658 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3024ms +[xorm] [info] 2024/09/09 11:22:46.296699 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7702ms +[xorm] [info] 2024/09/09 11:24:46.285533 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6475ms +[xorm] [info] 2024/09/09 11:26:46.299951 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.6684ms +[xorm] [info] 2024/09/09 11:28:46.315760 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 101.3529ms +[xorm] [info] 2024/09/09 11:30:46.296762 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4135ms +[xorm] [info] 2024/09/09 11:32:46.287587 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3977ms +[xorm] [info] 2024/09/09 11:34:46.286368 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4152ms +[xorm] [info] 2024/09/09 11:36:46.295676 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5279ms +[xorm] [info] 2024/09/09 11:38:46.286426 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1576ms +[xorm] [info] 2024/09/09 11:40:46.295082 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7834ms +[xorm] [info] 2024/09/09 11:42:46.284304 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7237ms +[xorm] [info] 2024/09/09 11:44:46.299577 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1452ms +[xorm] [info] 2024/09/09 11:46:46.283900 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8992ms +[xorm] [info] 2024/09/09 11:48:46.300149 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.2302ms +[xorm] [info] 2024/09/09 11:50:46.282540 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5107ms +[xorm] [info] 2024/09/09 11:52:46.304033 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.8766ms +[xorm] [info] 2024/09/09 11:54:46.302945 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2342ms +[xorm] [info] 2024/09/09 11:56:46.313082 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.5857ms +[xorm] [info] 2024/09/09 11:58:46.288853 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9392ms +[xorm] [info] 2024/09/09 12:00:46.282512 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0206ms +[xorm] [info] 2024/09/09 12:02:46.304663 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.6722ms +[xorm] [info] 2024/09/09 12:04:46.290704 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.3806ms +[xorm] [info] 2024/09/09 12:06:46.319989 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 115.3884ms +[xorm] [info] 2024/09/09 12:08:46.294477 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.7157ms +[xorm] [info] 2024/09/09 12:10:46.293114 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.3335ms +[xorm] [info] 2024/09/09 12:12:46.285443 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.692ms +[xorm] [info] 2024/09/09 12:14:46.301629 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3814ms +[xorm] [info] 2024/09/09 12:16:46.290007 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5101ms +[xorm] [info] 2024/09/09 12:18:46.278212 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9148ms +[xorm] [info] 2024/09/09 12:20:46.293861 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1644ms +[xorm] [info] 2024/09/09 12:22:46.297385 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9763ms +[xorm] [info] 2024/09/09 12:24:46.284913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.865ms +[xorm] [info] 2024/09/09 12:26:46.306639 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.2288ms +[xorm] [info] 2024/09/09 12:28:46.302184 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.2846ms +[xorm] [info] 2024/09/09 12:30:46.279555 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2897ms +[xorm] [info] 2024/09/09 12:32:46.297258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3558ms +[xorm] [info] 2024/09/09 12:34:46.271176 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.7668ms +[xorm] [info] 2024/09/09 12:36:46.281958 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7994ms +[xorm] [info] 2024/09/09 12:38:46.281820 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8704ms +[xorm] [info] 2024/09/09 12:40:46.303459 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.4031ms +[xorm] [info] 2024/09/09 12:42:46.290593 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9801ms +[xorm] [info] 2024/09/09 12:44:46.307992 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.9784ms +[xorm] [info] 2024/09/09 12:46:46.292444 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6647ms +[xorm] [info] 2024/09/09 12:48:46.292258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6568ms +[xorm] [info] 2024/09/09 12:50:46.297779 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3108ms +[xorm] [info] 2024/09/09 12:52:46.289395 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8436ms +[xorm] [info] 2024/09/09 12:54:46.302530 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5457ms +[xorm] [info] 2024/09/09 12:56:46.300396 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3473ms +[xorm] [info] 2024/09/09 12:58:46.294185 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1487ms +[xorm] [info] 2024/09/09 13:00:46.288876 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8182ms +[xorm] [info] 2024/09/09 13:02:46.284198 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8062ms +[xorm] [info] 2024/09/09 13:04:46.293645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.7983ms +[xorm] [info] 2024/09/09 13:06:46.281375 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2015ms +[xorm] [info] 2024/09/09 13:08:46.297530 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3169ms +[xorm] [info] 2024/09/09 13:10:46.288553 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7507ms +[xorm] [info] 2024/09/09 13:12:46.301356 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6822ms +[xorm] [info] 2024/09/09 13:14:46.277458 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.1401ms +[xorm] [info] 2024/09/09 13:16:46.302661 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.8711ms +[xorm] [info] 2024/09/09 13:18:46.285922 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6286ms +[xorm] [info] 2024/09/09 13:20:46.293001 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7857ms +[xorm] [info] 2024/09/09 13:22:46.298920 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.074ms +[xorm] [info] 2024/09/09 13:24:46.276815 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.708ms +[xorm] [info] 2024/09/09 13:26:46.291327 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5596ms +[xorm] [info] 2024/09/09 13:28:46.303168 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1703ms +[xorm] [info] 2024/09/09 13:30:46.302570 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.7123ms +[xorm] [info] 2024/09/09 13:32:46.278766 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.2199ms +[xorm] [info] 2024/09/09 13:34:46.279307 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4859ms +[xorm] [info] 2024/09/09 13:36:46.283030 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2655ms +[xorm] [info] 2024/09/09 13:38:46.282516 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.6266ms +[xorm] [info] 2024/09/09 13:40:46.304907 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.9507ms +[xorm] [info] 2024/09/09 13:42:46.294699 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.5116ms +[xorm] [info] 2024/09/09 13:44:46.303946 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9594ms +[xorm] [info] 2024/09/09 13:46:46.290182 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4617ms +[xorm] [info] 2024/09/09 13:48:46.292314 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3198ms +[xorm] [info] 2024/09/09 13:50:46.281280 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8983ms +[xorm] [info] 2024/09/09 13:52:46.285446 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.5527ms +[xorm] [info] 2024/09/09 13:54:46.291213 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7929ms +[xorm] [info] 2024/09/09 13:56:46.305059 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4652ms +[xorm] [info] 2024/09/09 13:58:46.306223 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.3105ms +[xorm] [info] 2024/09/09 14:00:46.277903 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.6077ms +[xorm] [info] 2024/09/09 14:02:46.279375 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.96ms +[xorm] [info] 2024/09/09 14:04:46.288884 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0437ms +[xorm] [info] 2024/09/09 14:06:46.302726 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2856ms +[xorm] [info] 2024/09/10 17:27:08.718509 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:27:08.766299 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 30.8596ms +[xorm] [info] 2024/09/10 17:27:08.798457 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 32.0378ms +[xorm] [info] 2024/09/10 17:29:08.950717 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.0691ms +[xorm] [info] 2024/09/10 17:31:08.941628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.1538ms +[xorm] [info] 2024/09/10 17:33:08.942793 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3773ms +[xorm] [info] 2024/09/10 17:35:08.958464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8558ms +[xorm] [info] 2024/09/10 17:36:10.646796 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:36:10.690174 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 28.7829ms +[xorm] [info] 2024/09/10 17:36:10.719040 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 28.7851ms +[xorm] [info] 2024/09/10 17:37:01.708064 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:37:01.750748 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 27.6791ms +[xorm] [info] 2024/09/10 17:37:01.779711 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 28.2275ms +[xorm] [info] 2024/09/10 17:37:30.627009 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:37:30.664248 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 24.9573ms +[xorm] [info] 2024/09/10 17:37:30.690537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 26.1768ms +[xorm] [info] 2024/09/10 17:37:58.162805 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:37:58.206988 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 30.1509ms +[xorm] [info] 2024/09/10 17:37:58.235833 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 28.7564ms +[xorm] [info] 2024/09/10 17:38:51.678923 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:38:51.717935 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 26.1153ms +[xorm] [info] 2024/09/10 17:38:51.743899 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 25.8738ms +[xorm] [info] 2024/09/10 17:39:50.299776 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:39:50.338455 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 25.9781ms +[xorm] [info] 2024/09/10 17:39:50.364785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 26.1933ms +[xorm] [info] 2024/09/10 17:41:50.514744 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5853ms +[xorm] [info] 2024/09/10 17:43:50.521084 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9879ms +[xorm] [info] 2024/09/10 17:45:50.520816 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4083ms +[xorm] [info] 2024/09/10 17:47:50.513366 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.0124ms +[xorm] [info] 2024/09/10 17:49:50.520165 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.544ms +[xorm] [info] 2024/09/10 17:51:50.526256 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0049ms +[xorm] [info] 2024/09/10 17:53:05.754352 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:53:05.790414 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 24.1167ms +[xorm] [info] 2024/09/10 17:53:05.815420 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 23.6204ms +[xorm] [info] 2024/09/10 17:55:05.960130 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3665ms +[xorm] [info] 2024/09/10 17:57:05.977336 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3599ms +[xorm] [info] 2024/09/10 17:57:38.911884 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:57:38.960342 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 27.3889ms +[xorm] [info] 2024/09/10 17:57:38.998086 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 36.7491ms +[xorm] [info] 2024/09/10 17:57:45.741739 PING DATABASE mysql +[xorm] [info] 2024/09/10 17:57:45.783765 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 27.9896ms +[xorm] [info] 2024/09/10 17:57:45.812027 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 27.8551ms +[xorm] [info] 2024/09/10 18:01:29.450610 PING DATABASE mysql +[xorm] [info] 2024/09/10 18:01:29.489170 [SQL] SELECT `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA`=? and `TABLE_NAME`=? [zyos_website db_mapping] - 25.781ms +[xorm] [info] 2024/09/10 18:01:29.515899 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 26.3824ms +[xorm] [info] 2024/09/10 18:03:29.683600 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.3806ms +[xorm] [info] 2024/09/10 18:05:29.666988 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7838ms +[xorm] [info] 2024/09/10 18:07:29.670670 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.9216ms +[xorm] [info] 2024/09/10 18:09:29.685587 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7932ms +[xorm] [info] 2024/09/10 18:11:29.675790 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7063ms +[xorm] [info] 2024/09/10 18:13:29.679316 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.3618ms +[xorm] [info] 2024/09/10 18:15:29.684281 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9188ms +[xorm] [info] 2024/09/10 18:17:29.676738 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6738ms +[xorm] [info] 2024/09/10 18:19:29.671047 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.8543ms +[xorm] [info] 2024/09/10 18:21:29.932246 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 333.7601ms +[xorm] [info] 2024/09/10 18:23:29.765119 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 178.2569ms +[xorm] [info] 2024/09/10 18:25:30.401742 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 801.8299ms +[xorm] [info] 2024/09/10 18:27:29.684780 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.7083ms +[xorm] [info] 2024/09/10 18:29:29.688972 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4614ms +[xorm] [info] 2024/09/10 18:31:29.678818 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7854ms +[xorm] [info] 2024/09/10 18:33:29.677505 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8177ms +[xorm] [info] 2024/09/10 18:35:29.670872 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9823ms +[xorm] [info] 2024/09/10 18:37:29.673448 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7057ms +[xorm] [info] 2024/09/10 18:39:29.665168 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3048ms +[xorm] [info] 2024/09/10 18:41:30.056124 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 465.0612ms +[xorm] [info] 2024/09/10 18:43:29.669746 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.3528ms +[xorm] [info] 2024/09/10 18:45:29.700451 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.1013ms +[xorm] [info] 2024/09/10 18:47:29.684515 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.2556ms +[xorm] [info] 2024/09/10 18:49:29.670163 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9287ms +[xorm] [info] 2024/09/10 18:51:29.691794 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.3477ms +[xorm] [info] 2024/09/10 18:53:29.669912 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4855ms +[xorm] [info] 2024/09/10 18:55:29.686365 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.5884ms +[xorm] [info] 2024/09/10 18:57:29.676162 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6037ms +[xorm] [info] 2024/09/10 18:59:29.677371 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7876ms +[xorm] [info] 2024/09/10 19:01:29.684586 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1684ms +[xorm] [info] 2024/09/10 19:03:29.666985 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8424ms +[xorm] [info] 2024/09/10 19:05:29.685803 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.8866ms +[xorm] [info] 2024/09/10 19:07:29.678730 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1895ms +[xorm] [info] 2024/09/10 19:09:29.679329 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1563ms +[xorm] [info] 2024/09/10 19:11:29.684049 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8263ms +[xorm] [info] 2024/09/10 19:13:29.655210 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.5803ms +[xorm] [info] 2024/09/10 19:15:29.665257 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.9464ms +[xorm] [info] 2024/09/10 19:17:29.673016 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5886ms +[xorm] [info] 2024/09/10 19:19:29.687210 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.0414ms +[xorm] [info] 2024/09/10 19:21:29.691226 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.3069ms +[xorm] [info] 2024/09/10 19:23:29.686221 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.513ms +[xorm] [info] 2024/09/10 19:25:29.683828 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.9975ms +[xorm] [info] 2024/09/10 19:27:29.670134 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.963ms +[xorm] [info] 2024/09/10 19:29:29.679426 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9521ms +[xorm] [info] 2024/09/10 19:31:29.666743 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2709ms +[xorm] [info] 2024/09/10 19:33:29.670220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7659ms +[xorm] [info] 2024/09/10 19:35:29.668598 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2124ms +[xorm] [info] 2024/09/10 19:37:29.676977 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6231ms +[xorm] [info] 2024/09/10 19:39:29.686437 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9835ms +[xorm] [info] 2024/09/10 19:41:29.670263 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.8957ms +[xorm] [info] 2024/09/10 19:43:29.662306 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1497ms +[xorm] [info] 2024/09/10 19:45:29.670487 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9799ms +[xorm] [info] 2024/09/10 19:47:29.666695 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9117ms +[xorm] [info] 2024/09/10 19:49:29.662488 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7848ms +[xorm] [info] 2024/09/10 19:51:29.676986 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.8438ms +[xorm] [info] 2024/09/10 19:53:29.675153 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0578ms +[xorm] [info] 2024/09/10 19:55:29.667805 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1971ms +[xorm] [info] 2024/09/10 19:57:29.667809 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3671ms +[xorm] [info] 2024/09/10 19:59:29.686389 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.12ms +[xorm] [info] 2024/09/10 20:01:29.677785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7852ms +[xorm] [info] 2024/09/10 20:03:29.668425 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2682ms +[xorm] [info] 2024/09/10 20:05:29.662292 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7847ms +[xorm] [info] 2024/09/10 20:07:29.675920 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1053ms +[xorm] [info] 2024/09/10 20:09:29.686396 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.8041ms +[xorm] [info] 2024/09/10 20:11:29.687806 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.9215ms +[xorm] [info] 2024/09/10 20:13:29.665771 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7054ms +[xorm] [info] 2024/09/10 20:15:29.660113 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.5979ms +[xorm] [info] 2024/09/10 20:17:29.670728 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2381ms +[xorm] [info] 2024/09/10 20:19:29.688164 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.816ms +[xorm] [info] 2024/09/10 20:21:29.666276 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9433ms +[xorm] [info] 2024/09/10 20:23:29.682833 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.745ms +[xorm] [info] 2024/09/10 20:25:29.680467 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9932ms +[xorm] [info] 2024/09/10 20:27:29.672102 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8033ms +[xorm] [info] 2024/09/10 20:29:29.670550 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8433ms +[xorm] [info] 2024/09/10 20:31:29.673716 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.26ms +[xorm] [info] 2024/09/10 20:33:29.678909 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3062ms +[xorm] [info] 2024/09/10 20:35:29.675561 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5661ms +[xorm] [info] 2024/09/10 20:37:29.680517 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.621ms +[xorm] [info] 2024/09/10 20:39:29.677537 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.832ms +[xorm] [info] 2024/09/10 20:41:29.707329 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 107.1759ms +[xorm] [info] 2024/09/10 20:43:29.675734 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.783ms +[xorm] [info] 2024/09/10 20:45:29.674172 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6026ms +[xorm] [info] 2024/09/10 20:47:29.673423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7191ms +[xorm] [info] 2024/09/10 20:49:29.683890 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5843ms +[xorm] [info] 2024/09/10 20:51:29.682299 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.1077ms +[xorm] [info] 2024/09/10 20:53:29.668666 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7873ms +[xorm] [info] 2024/09/10 20:55:29.677163 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.4708ms +[xorm] [info] 2024/09/10 20:57:29.681944 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.5954ms +[xorm] [info] 2024/09/10 20:59:29.679725 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.0588ms +[xorm] [info] 2024/09/10 21:01:29.674852 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9465ms +[xorm] [info] 2024/09/10 21:03:29.672379 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5999ms +[xorm] [info] 2024/09/10 21:05:29.674104 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8502ms +[xorm] [info] 2024/09/10 21:07:29.683010 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.0092ms +[xorm] [info] 2024/09/10 21:09:29.672948 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8291ms +[xorm] [info] 2024/09/10 21:11:29.663187 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1023ms +[xorm] [info] 2024/09/10 21:13:29.695179 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 97.5637ms +[xorm] [info] 2024/09/10 21:15:29.679875 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.055ms +[xorm] [info] 2024/09/10 21:17:29.680861 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8519ms +[xorm] [info] 2024/09/10 21:19:29.674420 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0854ms +[xorm] [info] 2024/09/10 21:21:29.655151 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 66.6848ms +[xorm] [info] 2024/09/10 21:23:29.670911 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4908ms +[xorm] [info] 2024/09/10 21:25:29.681415 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.8778ms +[xorm] [info] 2024/09/10 21:27:29.675705 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2438ms +[xorm] [info] 2024/09/10 21:29:29.669529 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.7254ms +[xorm] [info] 2024/09/10 21:31:29.667313 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8516ms +[xorm] [info] 2024/09/10 21:33:29.679486 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1019ms +[xorm] [info] 2024/09/10 21:35:29.669255 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4273ms +[xorm] [info] 2024/09/10 21:37:29.665276 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7371ms +[xorm] [info] 2024/09/10 21:39:29.668693 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8577ms +[xorm] [info] 2024/09/10 21:41:29.678523 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1718ms +[xorm] [info] 2024/09/10 21:43:29.670713 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9117ms +[xorm] [info] 2024/09/10 21:45:29.668667 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4079ms +[xorm] [info] 2024/09/10 21:47:29.682812 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.1155ms +[xorm] [info] 2024/09/10 21:49:29.684580 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.1565ms +[xorm] [info] 2024/09/10 21:51:29.682075 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7193ms +[xorm] [info] 2024/09/10 21:53:29.667002 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.8422ms +[xorm] [info] 2024/09/10 21:55:29.662985 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.3008ms +[xorm] [info] 2024/09/10 21:57:29.674965 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0067ms +[xorm] [info] 2024/09/10 21:59:29.699411 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 103.6952ms +[xorm] [info] 2024/09/10 22:01:29.662476 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.6151ms +[xorm] [info] 2024/09/10 22:03:29.665878 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1278ms +[xorm] [info] 2024/09/10 22:05:29.667063 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.0269ms +[xorm] [info] 2024/09/10 22:07:29.677852 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4316ms +[xorm] [info] 2024/09/10 22:09:29.670564 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4261ms +[xorm] [info] 2024/09/10 22:11:29.661913 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8774ms +[xorm] [info] 2024/09/10 22:13:29.671330 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1475ms +[xorm] [info] 2024/09/10 22:15:29.679565 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8016ms +[xorm] [info] 2024/09/10 22:17:29.693071 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.6543ms +[xorm] [info] 2024/09/10 22:19:29.674102 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1232ms +[xorm] [info] 2024/09/10 22:21:29.665952 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.9085ms +[xorm] [info] 2024/09/10 22:23:29.677981 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.9226ms +[xorm] [info] 2024/09/10 22:25:29.675307 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5683ms +[xorm] [info] 2024/09/10 22:27:29.662105 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0449ms +[xorm] [info] 2024/09/10 22:29:29.673660 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.5541ms +[xorm] [info] 2024/09/10 22:31:29.679563 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8281ms +[xorm] [info] 2024/09/10 22:33:29.691800 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8792ms +[xorm] [info] 2024/09/10 22:35:29.675831 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1349ms +[xorm] [info] 2024/09/10 22:37:29.672357 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0177ms +[xorm] [info] 2024/09/10 22:39:29.675826 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.2907ms +[xorm] [info] 2024/09/10 22:41:29.686119 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.704ms +[xorm] [info] 2024/09/10 22:43:29.666617 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.8778ms +[xorm] [info] 2024/09/10 22:45:29.688399 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7409ms +[xorm] [info] 2024/09/10 22:47:29.680867 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.2678ms +[xorm] [info] 2024/09/10 22:49:29.674324 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3773ms +[xorm] [info] 2024/09/10 22:51:29.686456 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7115ms +[xorm] [info] 2024/09/10 22:53:29.671990 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.0725ms +[xorm] [info] 2024/09/10 22:55:29.671162 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6374ms +[xorm] [info] 2024/09/10 22:57:29.683160 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 94.806ms +[xorm] [info] 2024/09/10 22:59:29.719160 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 128.8416ms +[xorm] [info] 2024/09/10 23:01:29.672535 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.6146ms +[xorm] [info] 2024/09/10 23:03:29.669565 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.448ms +[xorm] [info] 2024/09/10 23:05:29.670464 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8202ms +[xorm] [info] 2024/09/10 23:07:29.674697 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6152ms +[xorm] [info] 2024/09/10 23:09:29.689102 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.8448ms +[xorm] [info] 2024/09/10 23:11:29.671498 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.7532ms +[xorm] [info] 2024/09/10 23:13:29.665558 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1924ms +[xorm] [info] 2024/09/10 23:15:29.674858 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.4043ms +[xorm] [info] 2024/09/10 23:17:29.685421 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.1163ms +[xorm] [info] 2024/09/10 23:19:29.689362 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.8015ms +[xorm] [info] 2024/09/10 23:21:29.669073 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4938ms +[xorm] [info] 2024/09/10 23:23:29.674059 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3078ms +[xorm] [info] 2024/09/10 23:25:29.673785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.857ms +[xorm] [info] 2024/09/10 23:27:29.666780 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.638ms +[xorm] [info] 2024/09/10 23:29:29.685624 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.6824ms +[xorm] [info] 2024/09/10 23:31:29.670079 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5862ms +[xorm] [info] 2024/09/10 23:33:29.693346 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.4696ms +[xorm] [info] 2024/09/10 23:35:29.675367 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4525ms +[xorm] [info] 2024/09/10 23:37:29.665056 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6564ms +[xorm] [info] 2024/09/10 23:39:29.683466 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9459ms +[xorm] [info] 2024/09/10 23:41:29.673337 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.1349ms +[xorm] [info] 2024/09/10 23:43:29.669858 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1015ms +[xorm] [info] 2024/09/10 23:45:29.673540 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.1182ms +[xorm] [info] 2024/09/10 23:47:29.672409 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9137ms +[xorm] [info] 2024/09/10 23:49:29.680760 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6427ms +[xorm] [info] 2024/09/10 23:51:29.668748 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.3853ms +[xorm] [info] 2024/09/10 23:53:29.672967 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1194ms +[xorm] [info] 2024/09/10 23:55:29.671562 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.3522ms +[xorm] [info] 2024/09/10 23:57:29.685669 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8946ms +[xorm] [info] 2024/09/10 23:59:29.690139 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 99.8521ms +[xorm] [info] 2024/09/11 00:01:29.662127 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5211ms +[xorm] [info] 2024/09/11 00:03:29.666911 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9601ms +[xorm] [info] 2024/09/11 00:05:29.668211 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.4578ms +[xorm] [info] 2024/09/11 00:07:29.689056 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.4785ms +[xorm] [info] 2024/09/11 00:09:29.685789 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4958ms +[xorm] [info] 2024/09/11 00:11:29.668218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4412ms +[xorm] [info] 2024/09/11 00:13:29.671163 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8217ms +[xorm] [info] 2024/09/11 00:15:29.667391 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.849ms +[xorm] [info] 2024/09/11 00:17:29.675807 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4575ms +[xorm] [info] 2024/09/11 00:19:29.669099 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.6397ms +[xorm] [info] 2024/09/11 00:21:29.667466 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1094ms +[xorm] [info] 2024/09/11 00:23:29.679040 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.9444ms +[xorm] [info] 2024/09/11 00:25:29.682626 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.1733ms +[xorm] [info] 2024/09/11 00:27:29.684059 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.0533ms +[xorm] [info] 2024/09/11 00:29:29.669612 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.6874ms +[xorm] [info] 2024/09/11 00:31:29.674794 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.9945ms +[xorm] [info] 2024/09/11 00:33:29.675867 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.736ms +[xorm] [info] 2024/09/11 00:35:29.671731 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.56ms +[xorm] [info] 2024/09/11 00:37:29.668057 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.3259ms +[xorm] [info] 2024/09/11 00:39:29.675423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7472ms +[xorm] [info] 2024/09/11 00:41:29.654657 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.5221ms +[xorm] [info] 2024/09/11 00:43:29.668114 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5009ms +[xorm] [info] 2024/09/11 00:45:29.666762 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5307ms +[xorm] [info] 2024/09/11 00:47:29.675318 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1331ms +[xorm] [info] 2024/09/11 00:49:29.676086 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4797ms +[xorm] [info] 2024/09/11 00:51:29.681218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.6846ms +[xorm] [info] 2024/09/11 00:53:29.668669 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.486ms +[xorm] [info] 2024/09/11 00:55:29.678023 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.3929ms +[xorm] [info] 2024/09/11 00:57:29.671179 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8941ms +[xorm] [info] 2024/09/11 00:59:29.686360 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.6847ms +[xorm] [info] 2024/09/11 01:01:29.671247 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2222ms +[xorm] [info] 2024/09/11 01:03:29.676217 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.448ms +[xorm] [info] 2024/09/11 01:05:29.673364 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.5229ms +[xorm] [info] 2024/09/11 01:07:29.663940 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1464ms +[xorm] [info] 2024/09/11 01:09:29.675049 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4818ms +[xorm] [info] 2024/09/11 01:11:29.690194 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.9735ms +[xorm] [info] 2024/09/11 01:13:29.690602 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2024ms +[xorm] [info] 2024/09/11 01:15:29.662425 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5375ms +[xorm] [info] 2024/09/11 01:17:29.673307 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2697ms +[xorm] [info] 2024/09/11 01:19:29.677866 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7407ms +[xorm] [info] 2024/09/11 01:21:29.677885 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.2426ms +[xorm] [info] 2024/09/11 01:23:29.671710 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.0606ms +[xorm] [info] 2024/09/11 01:25:29.672005 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5729ms +[xorm] [info] 2024/09/11 01:27:29.674984 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9269ms +[xorm] [info] 2024/09/11 01:29:29.681743 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5296ms +[xorm] [info] 2024/09/11 01:31:29.673277 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5591ms +[xorm] [info] 2024/09/11 01:33:29.666851 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0737ms +[xorm] [info] 2024/09/11 01:35:29.668628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.2599ms +[xorm] [info] 2024/09/11 01:37:29.671636 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8558ms +[xorm] [info] 2024/09/11 01:39:29.668620 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0858ms +[xorm] [info] 2024/09/11 01:41:29.669792 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.805ms +[xorm] [info] 2024/09/11 01:43:29.679259 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5808ms +[xorm] [info] 2024/09/11 01:45:29.675002 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.707ms +[xorm] [info] 2024/09/11 01:47:29.673186 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.7593ms +[xorm] [info] 2024/09/11 01:49:29.671233 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8084ms +[xorm] [info] 2024/09/11 01:51:29.691284 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6422ms +[xorm] [info] 2024/09/11 01:53:29.664855 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.0943ms +[xorm] [info] 2024/09/11 01:55:29.669380 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0278ms +[xorm] [info] 2024/09/11 01:57:29.665145 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7851ms +[xorm] [info] 2024/09/11 01:59:29.686249 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6046ms +[xorm] [info] 2024/09/11 02:01:29.684925 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3648ms +[xorm] [info] 2024/09/11 02:03:29.671752 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3905ms +[xorm] [info] 2024/09/11 02:05:29.691218 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.4048ms +[xorm] [info] 2024/09/11 02:07:29.674446 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0188ms +[xorm] [info] 2024/09/11 02:09:29.691377 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4056ms +[xorm] [info] 2024/09/11 02:11:29.674130 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.9224ms +[xorm] [info] 2024/09/11 02:13:29.677346 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0768ms +[xorm] [info] 2024/09/11 02:15:29.687281 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9052ms +[xorm] [info] 2024/09/11 02:17:29.677237 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9859ms +[xorm] [info] 2024/09/11 02:19:29.674772 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1041ms +[xorm] [info] 2024/09/11 02:21:29.667309 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0087ms +[xorm] [info] 2024/09/11 02:23:29.678220 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.512ms +[xorm] [info] 2024/09/11 02:25:29.691098 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.9456ms +[xorm] [info] 2024/09/11 02:27:29.685445 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.7448ms +[xorm] [info] 2024/09/11 02:29:29.670723 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2322ms +[xorm] [info] 2024/09/11 02:31:29.668832 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8234ms +[xorm] [info] 2024/09/11 02:33:29.677305 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.055ms +[xorm] [info] 2024/09/11 02:35:29.668525 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5296ms +[xorm] [info] 2024/09/11 02:37:29.674647 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 81.177ms +[xorm] [info] 2024/09/11 02:39:29.677675 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0832ms +[xorm] [info] 2024/09/11 02:41:29.668026 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5302ms +[xorm] [info] 2024/09/11 02:43:29.682872 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.2356ms +[xorm] [info] 2024/09/11 02:45:29.662651 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.8461ms +[xorm] [info] 2024/09/11 02:47:29.674717 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.404ms +[xorm] [info] 2024/09/11 02:49:29.665784 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.4407ms +[xorm] [info] 2024/09/11 02:51:29.673567 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3929ms +[xorm] [info] 2024/09/11 02:53:29.669461 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.1916ms +[xorm] [info] 2024/09/11 02:55:29.670198 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.7632ms +[xorm] [info] 2024/09/11 02:57:29.668156 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5736ms +[xorm] [info] 2024/09/11 02:59:29.672625 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.7195ms +[xorm] [info] 2024/09/11 03:01:29.664209 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.702ms +[xorm] [info] 2024/09/11 03:03:29.678502 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2691ms +[xorm] [info] 2024/09/11 03:05:29.665493 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.6905ms +[xorm] [info] 2024/09/11 03:07:29.679534 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9103ms +[xorm] [info] 2024/09/11 03:09:29.678325 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0164ms +[xorm] [info] 2024/09/11 03:11:29.671797 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.9255ms +[xorm] [info] 2024/09/11 03:13:29.674121 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3091ms +[xorm] [info] 2024/09/11 03:15:29.679033 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5939ms +[xorm] [info] 2024/09/11 03:17:29.692784 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.8529ms +[xorm] [info] 2024/09/11 03:19:29.684931 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.726ms +[xorm] [info] 2024/09/11 03:21:29.668826 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7552ms +[xorm] [info] 2024/09/11 03:23:29.677825 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.1627ms +[xorm] [info] 2024/09/11 03:25:29.680417 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.6016ms +[xorm] [info] 2024/09/11 03:27:29.681418 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7523ms +[xorm] [info] 2024/09/11 03:29:29.692125 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.6642ms +[xorm] [info] 2024/09/11 03:31:29.669548 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.3164ms +[xorm] [info] 2024/09/11 03:33:29.680675 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.916ms +[xorm] [info] 2024/09/11 03:35:29.692415 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.7828ms +[xorm] [info] 2024/09/11 03:37:29.672317 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.4281ms +[xorm] [info] 2024/09/11 03:39:29.671653 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1123ms +[xorm] [info] 2024/09/11 03:41:29.660875 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.5915ms +[xorm] [info] 2024/09/11 03:43:29.680078 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7075ms +[xorm] [info] 2024/09/11 03:45:29.672016 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1007ms +[xorm] [info] 2024/09/11 03:47:29.672331 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0725ms +[xorm] [info] 2024/09/11 03:49:29.673918 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1684ms +[xorm] [info] 2024/09/11 03:51:29.678448 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.0136ms +[xorm] [info] 2024/09/11 03:53:29.678599 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.156ms +[xorm] [info] 2024/09/11 03:55:29.680056 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4681ms +[xorm] [info] 2024/09/11 03:57:29.678120 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.4702ms +[xorm] [info] 2024/09/11 03:59:29.686493 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 98.516ms +[xorm] [info] 2024/09/11 04:01:29.679009 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1024ms +[xorm] [info] 2024/09/11 04:03:29.676620 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8612ms +[xorm] [info] 2024/09/11 04:05:29.679549 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.1029ms +[xorm] [info] 2024/09/11 04:07:29.664630 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0502ms +[xorm] [info] 2024/09/11 04:09:29.673875 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.729ms +[xorm] [info] 2024/09/11 04:11:29.668730 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5479ms +[xorm] [info] 2024/09/11 04:13:29.673885 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.4817ms +[xorm] [info] 2024/09/11 04:15:29.680758 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7293ms +[xorm] [info] 2024/09/11 04:17:29.669050 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.8993ms +[xorm] [info] 2024/09/11 04:19:29.682132 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.5806ms +[xorm] [info] 2024/09/11 04:21:29.679033 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.6563ms +[xorm] [info] 2024/09/11 04:23:29.672236 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.944ms +[xorm] [info] 2024/09/11 04:25:29.687359 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.3642ms +[xorm] [info] 2024/09/11 04:27:29.665825 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.2589ms +[xorm] [info] 2024/09/11 04:29:29.691634 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.101ms +[xorm] [info] 2024/09/11 04:31:29.679607 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6772ms +[xorm] [info] 2024/09/11 04:33:29.666601 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.7929ms +[xorm] [info] 2024/09/11 04:35:29.684816 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.4002ms +[xorm] [info] 2024/09/11 04:37:29.684976 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.8682ms +[xorm] [info] 2024/09/11 04:39:29.667384 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0534ms +[xorm] [info] 2024/09/11 04:41:29.678610 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9505ms +[xorm] [info] 2024/09/11 04:43:29.685354 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2498ms +[xorm] [info] 2024/09/11 04:45:29.684863 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.8656ms +[xorm] [info] 2024/09/11 04:47:29.665016 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 67.2445ms +[xorm] [info] 2024/09/11 04:49:29.665349 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2012ms +[xorm] [info] 2024/09/11 04:51:29.680960 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.3202ms +[xorm] [info] 2024/09/11 04:53:29.673658 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1685ms +[xorm] [info] 2024/09/11 04:55:29.672516 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.822ms +[xorm] [info] 2024/09/11 04:57:29.669789 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4716ms +[xorm] [info] 2024/09/11 04:59:29.672740 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3823ms +[xorm] [info] 2024/09/11 05:01:29.663319 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.9965ms +[xorm] [info] 2024/09/11 05:03:29.659418 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.48ms +[xorm] [info] 2024/09/11 05:05:29.665423 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.9542ms +[xorm] [info] 2024/09/11 05:07:29.672147 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8854ms +[xorm] [info] 2024/09/11 05:09:29.666391 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2089ms +[xorm] [info] 2024/09/11 05:11:29.671299 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.435ms +[xorm] [info] 2024/09/11 05:13:29.698088 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 100.69ms +[xorm] [info] 2024/09/11 05:15:29.662217 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.4592ms +[xorm] [info] 2024/09/11 05:17:29.665827 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.8771ms +[xorm] [info] 2024/09/11 05:19:29.670624 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0317ms +[xorm] [info] 2024/09/11 05:21:29.682091 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.4238ms +[xorm] [info] 2024/09/11 05:23:29.687090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.67ms +[xorm] [info] 2024/09/11 05:25:29.674380 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.0555ms +[xorm] [info] 2024/09/11 05:27:29.666603 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.2615ms +[xorm] [info] 2024/09/11 05:29:29.670243 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.1728ms +[xorm] [info] 2024/09/11 05:31:29.670212 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.7401ms +[xorm] [info] 2024/09/11 05:33:29.675323 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 85.2034ms +[xorm] [info] 2024/09/11 05:35:29.677165 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.6755ms +[xorm] [info] 2024/09/11 05:37:29.679324 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.9701ms +[xorm] [info] 2024/09/11 05:39:29.668007 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5001ms +[xorm] [info] 2024/09/11 05:41:29.668064 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4671ms +[xorm] [info] 2024/09/11 05:43:29.685121 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.9523ms +[xorm] [info] 2024/09/11 05:45:29.676109 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1968ms +[xorm] [info] 2024/09/11 05:47:29.684926 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 86.3073ms +[xorm] [info] 2024/09/11 05:49:29.675826 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.2503ms +[xorm] [info] 2024/09/11 05:51:29.690969 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.5991ms +[xorm] [info] 2024/09/11 05:53:29.670390 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.5499ms +[xorm] [info] 2024/09/11 05:55:29.672171 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0482ms +[xorm] [info] 2024/09/11 05:57:29.686000 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7605ms +[xorm] [info] 2024/09/11 05:59:29.676549 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.6838ms +[xorm] [info] 2024/09/11 06:01:29.660270 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 70.7268ms +[xorm] [info] 2024/09/11 06:03:29.675268 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.913ms +[xorm] [info] 2024/09/11 06:05:29.662497 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.6728ms +[xorm] [info] 2024/09/11 06:07:29.669803 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7968ms +[xorm] [info] 2024/09/11 06:09:29.683526 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5305ms +[xorm] [info] 2024/09/11 06:11:29.667636 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.0372ms +[xorm] [info] 2024/09/11 06:13:29.666250 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5229ms +[xorm] [info] 2024/09/11 06:15:29.668115 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0684ms +[xorm] [info] 2024/09/11 06:17:29.677565 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.9297ms +[xorm] [info] 2024/09/11 06:19:29.697592 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 96.6485ms +[xorm] [info] 2024/09/11 06:21:29.677428 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.912ms +[xorm] [info] 2024/09/11 06:23:29.668189 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.5537ms +[xorm] [info] 2024/09/11 06:25:29.674470 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.7934ms +[xorm] [info] 2024/09/11 06:27:29.671253 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.2543ms +[xorm] [info] 2024/09/11 06:29:29.669701 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0388ms +[xorm] [info] 2024/09/11 06:31:29.665721 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.4806ms +[xorm] [info] 2024/09/11 06:33:29.675486 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0781ms +[xorm] [info] 2024/09/11 06:35:29.674605 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.0307ms +[xorm] [info] 2024/09/11 06:37:29.685072 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.6035ms +[xorm] [info] 2024/09/11 06:39:29.677424 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5225ms +[xorm] [info] 2024/09/11 06:41:29.665933 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.1104ms +[xorm] [info] 2024/09/11 06:43:29.669972 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.7481ms +[xorm] [info] 2024/09/11 06:45:29.678957 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.1372ms +[xorm] [info] 2024/09/11 06:47:29.660258 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.9994ms +[xorm] [info] 2024/09/11 06:49:29.681759 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.8792ms +[xorm] [info] 2024/09/11 06:51:29.673360 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.9316ms +[xorm] [info] 2024/09/11 06:53:29.663207 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.2817ms +[xorm] [info] 2024/09/11 06:55:29.664480 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.8095ms +[xorm] [info] 2024/09/11 06:57:29.686277 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.4588ms +[xorm] [info] 2024/09/11 06:59:29.683798 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7583ms +[xorm] [info] 2024/09/11 07:01:29.692567 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.7408ms +[xorm] [info] 2024/09/11 07:03:29.678912 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.4312ms +[xorm] [info] 2024/09/11 07:05:29.685376 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.2907ms +[xorm] [info] 2024/09/11 07:07:29.688359 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.7073ms +[xorm] [info] 2024/09/11 07:09:29.683850 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.159ms +[xorm] [info] 2024/09/11 07:11:29.679441 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.5447ms +[xorm] [info] 2024/09/11 07:13:29.678935 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 88.5007ms +[xorm] [info] 2024/09/11 07:15:29.663963 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 68.6401ms +[xorm] [info] 2024/09/11 07:17:29.670700 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8684ms +[xorm] [info] 2024/09/11 07:19:29.666722 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.1962ms +[xorm] [info] 2024/09/11 07:21:29.669230 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.0838ms +[xorm] [info] 2024/09/11 07:23:29.667124 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.8838ms +[xorm] [info] 2024/09/11 07:25:29.669448 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.6356ms +[xorm] [info] 2024/09/11 07:27:29.671871 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 71.6722ms +[xorm] [info] 2024/09/11 07:29:29.679951 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.7093ms +[xorm] [info] 2024/09/11 07:31:29.681435 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2062ms +[xorm] [info] 2024/09/11 07:33:29.680998 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7015ms +[xorm] [info] 2024/09/11 07:35:29.679768 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.183ms +[xorm] [info] 2024/09/11 07:37:29.679282 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.5022ms +[xorm] [info] 2024/09/11 07:39:29.675966 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.9527ms +[xorm] [info] 2024/09/11 07:41:29.673127 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 74.5942ms +[xorm] [info] 2024/09/11 07:43:29.680996 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.8409ms +[xorm] [info] 2024/09/11 07:45:29.676780 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.9505ms +[xorm] [info] 2024/09/11 07:47:29.667645 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 75.1178ms +[xorm] [info] 2024/09/11 07:49:29.667909 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7336ms +[xorm] [info] 2024/09/11 07:51:29.681951 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.4524ms +[xorm] [info] 2024/09/11 07:53:29.689634 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.6141ms +[xorm] [info] 2024/09/11 07:55:29.672042 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.9259ms +[xorm] [info] 2024/09/11 07:57:29.684287 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.2043ms +[xorm] [info] 2024/09/11 07:59:29.684710 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 93.0124ms +[xorm] [info] 2024/09/11 08:01:29.676848 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.2467ms +[xorm] [info] 2024/09/11 08:03:29.667555 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 79.3515ms +[xorm] [info] 2024/09/11 08:05:29.691090 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.0782ms +[xorm] [info] 2024/09/11 08:07:29.674784 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.1874ms +[xorm] [info] 2024/09/11 08:09:29.684817 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.0225ms +[xorm] [info] 2024/09/11 08:11:29.680155 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.4269ms +[xorm] [info] 2024/09/11 08:13:29.683755 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.4615ms +[xorm] [info] 2024/09/11 08:15:29.667234 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 76.526ms +[xorm] [info] 2024/09/11 08:17:29.667441 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.5293ms +[xorm] [info] 2024/09/11 08:19:29.673849 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.3407ms +[xorm] [info] 2024/09/11 08:21:29.693701 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 100.0213ms +[xorm] [info] 2024/09/11 08:23:29.684605 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 91.0431ms +[xorm] [info] 2024/09/11 08:25:29.665377 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 72.1753ms +[xorm] [info] 2024/09/11 08:27:29.683621 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 92.816ms +[xorm] [info] 2024/09/11 08:29:29.680262 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.1094ms +[xorm] [info] 2024/09/11 08:31:29.680785 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.7365ms +[xorm] [info] 2024/09/11 08:33:29.670934 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 80.7847ms +[xorm] [info] 2024/09/11 08:35:29.671463 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.7977ms +[xorm] [info] 2024/09/11 08:37:29.656245 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 69.7642ms +[xorm] [info] 2024/09/11 08:39:29.674256 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 77.3048ms +[xorm] [info] 2024/09/11 08:41:29.679644 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.6321ms +[xorm] [info] 2024/09/11 08:43:29.666605 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.0128ms +[xorm] [info] 2024/09/11 08:45:29.679525 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.5317ms +[xorm] [info] 2024/09/11 08:47:29.672681 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 82.751ms +[xorm] [info] 2024/09/11 08:49:29.683425 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 89.7761ms +[xorm] [info] 2024/09/11 08:51:30.512169 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 921.8582ms +[xorm] [info] 2024/09/11 08:53:30.505742 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 907.5676ms +[xorm] [info] 2024/09/11 08:55:30.468382 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 872.7661ms +[xorm] [info] 2024/09/11 08:57:30.430484 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 833.5904ms +[xorm] [info] 2024/09/11 08:59:30.381468 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 793.3013ms +[xorm] [info] 2024/09/11 09:01:30.369555 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 774.2435ms +[xorm] [info] 2024/09/11 09:03:29.691344 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.283ms +[xorm] [info] 2024/09/11 09:05:29.680578 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 84.6142ms +[xorm] [info] 2024/09/11 09:07:29.673523 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 78.0809ms +[xorm] [info] 2024/09/11 09:09:29.686707 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 87.9265ms +[xorm] [info] 2024/09/11 09:11:29.680628 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 90.7296ms +[xorm] [info] 2024/09/11 09:13:29.670936 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 73.7736ms +[xorm] [info] 2024/09/11 09:15:29.683205 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 83.3246ms +[xorm] [info] 2024/09/11 09:17:29.700354 [SQL] SELECT `db_master_id`, `db_host`, `db_username`, `db_password`, `db_name`, `external_mysql`, `is_dev`, `created_at`, `updated_at`, `deleted_at` FROM `db_mapping` WHERE (deleted_at != ? AND is_dev = '1' AND db_master_id=?) [1 123456] - 95.6306ms diff --git a/wap.conf b/wap.conf new file mode 100644 index 0000000..8f0d455 --- /dev/null +++ b/wap.conf @@ -0,0 +1,35 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + #将DNS指向kubernetes集群内的DNS + resolver kube-dns.kube-system.svc.cluster.local valid=30s; + + set $oss_endpoint_service zyos-oss.dev.svc.cluster.local:5000; + set $endpoint_service zyos-app.dev.svc.cluster.local:5000; + + location /static { + root /usr/share/nginx/html; + index index.html index.htm; + } + location /api/qiniu { + proxy_pass http://$oss_endpoint_service; + proxy_set_header Connection ""; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + break; + } + #proxy server + location /api { + proxy_pass http://$endpoint_service; + + proxy_http_version 1.1; + + proxy_set_header Connection ""; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + break; + } +} \ No newline at end of file