diff --git a/admin/controllers/app/licheb/Main.php b/admin/controllers/app/licheb/Main.php index 724d45ab..815fbcc8 100644 --- a/admin/controllers/app/licheb/Main.php +++ b/admin/controllers/app/licheb/Main.php @@ -15,8 +15,10 @@ class Main extends HD_Controller $this->app_id = 2; parent::__construct(); $this->load->model('app/licheb/App_licheb_users_model', 'userM'); + $this->load->model('app/licheb/syt_activity_model', 'mdSytActivity'); $this->load->model('app/material/Material_template_model', 'mdTemplate'); $this->load->model('app/material/Material_biz_model', 'mdMaterialBiz'); + $this->load->model('topics/topics_model', 'mdTopics'); } public function index() @@ -61,6 +63,25 @@ class Main extends HD_Controller ); $conditions[] = array('icon' => 'am-icon-home', 'list' => $list); + $list = array(); + $value = $this->mdTopics->count(array('app_id' => $this->app_id)); + $list[] = array( + 'title' => '专题(个)', + 'value' => $value, + 'btns' => array( + array('name' => '查看详情', 'url' => '/topics/topics?app_id=' . $this->app_id), + ), + ); + $value = $this->mdSytActivity->count(array('status>' => -1)); + $list[] = array( + 'title' => '私域通-活动(个)', + 'value' => $value, + 'btns' => array( + array('name' => '查看详情', 'url' => '/app/licheb/sytactivity'), + ), + ); + $conditions[] = array('icon' => 'am-icon-user', 'list' => $list); + /*小程序设置 end*/ /*实时数据 end*/ diff --git a/admin/controllers/app/licheb/Sytactivity.php b/admin/controllers/app/licheb/Sytactivity.php new file mode 100644 index 00000000..e1f59f18 --- /dev/null +++ b/admin/controllers/app/licheb/Sytactivity.php @@ -0,0 +1,417 @@ + '已删除', 0 => '待审核', 1 => '已通过', 2 => '未通过'); + private $app_id = 2; + + public function __construct() + { + parent::__construct(); + $this->load->model('app/licheb/syt_activity_model', 'mdSytActivity'); + $this->load->model('app/licheb/syt_activity_kpidata_model', 'mdSytKpiData'); + $this->load->model('topics/topics_model', 'mdTopics'); + } + + public function index() + { + return $this->lists(); + } + + public function lists() + { + $params = $this->input->get(); + $params['page'] = $params['page'] ? intval($params['page']) : 1; + $params['size'] = $params['size'] ? intval($params['size']) : 20; + $lists = array(); + $where = array('status>' => -1); + $count = $this->mdSytActivity->count($where); + if ($count) { + $this->load->library('MyEncryption'); + $res = $this->mdSytActivity->select($where, 'id desc', $params['page'], $params['size']); + foreach ($res as $key => $value) { + $setValue = array(); + $setValue['id'] = $value['id']; + $setValue['title'] = $value['title']; + $z_title = ''; + if ($value['z_id']) { + $re_t = $this->mdTopics->get(array('id' => $value['z_id'])); + $re_t['title'] && $z_title = $re_t['title']; + } + $setValue['z_id'] = $value['z_id']; + $setValue['z_title'] = $z_title; + $setValue['s_time'] = $value['s_time']; + $setValue['e_time'] = $value['e_time']; + $setValue['c_time'] = date('Y-m-d H:i', $value['c_time']); + $setValue['status_name'] = $this->statusAry[$value['status']]; + + $url = http_host_com('home') . "/h5/syt/special?skey=" . $this->myencryption->base64url_encode("a_id=" . $value['id']); + $setValue['url'] = urlencode($url); + $lists[] = $setValue; + } + } + $this->data['_title'] = '私域通-活动列表'; + $this->data['pager'] = array('count' => ceil($count / $params['size']), 'curr' => $params['page'], 'totle' => $count); + $this->data['lists'] = $lists; + $this->data['params'] = $params; + return $this->show_view('/app/licheb/syt/activity_lists', true); + } + + public function get() + { + $params = $this->input->get(); + $id = intval($params['id']); + $status_list = $kpi_list = array(); + $posters = array('imgs_url' => array(), 'imgs' => array()); + $share_title = $remark = $rule = ''; + if ($id > 0) { + $re = $this->mdSytActivity->get(array('id' => $id)); + if (!$re || empty($re)) { + return $this->show_json(SYS_CODE_FAIL, '活动不存在!'); + } + $_title = '编辑私域通活动'; + $dataInfo['editType'] = 0; + $dataInfo['edit_url'] = '/app/licheb/sytactivity/edit'; + $dataInfo['brand_id'] = $re['brand_id'] ? explode(',', $re['brand_id']) : []; + $dataInfo['status'] = $re['status']; + $dataInfo['z_id'] = $re['z_id']; + if ($re['jsondata']) { + $jsondata = json_decode($re['jsondata'], true); + $share_title = $jsondata['share_title'] ? $jsondata['share_title'] : ''; + $remark = $jsondata['remark'] ? $jsondata['remark'] : ''; + $rule = $jsondata['rule'] ? $jsondata['rule'] : ''; + if ($jsondata['posters']) { + foreach ($jsondata['posters'] as $key => $value) { + $posters['imgs_url'][] = array("value" => $value['url'], "src" => build_qiniu_image_url($value['url'])); + $posters['imgs'][] = array("value" => $value['url'], "src" => build_qiniu_image_url($value['url']) + , "width" => $value['width'], "height" => $value['height']); + } + } + } + if ($re['z_id']) { + $re_t = $this->mdTopics->get(array('id' => $re['z_id'])); + $dataInfo['z_title'] = $re_t['title'] ? $re_t['title'] : ''; + } + $dataInfo['title'] = $re['title']; + $dataInfo['img'] = $re['img'] ? $re['img'] : ''; + $dataInfo['img_url'] = $re['img'] ? build_qiniu_image_url($re['img']) : ''; + $dataInfo['time'] = $re['s_time'] . " ~ " . $re['e_time']; + $jsonkpi = $re['jsonkpi'] ? json_decode($re['jsonkpi'], true) : ''; + foreach ($this->mdSytKpiData->kpiAry() as $key => $value) { + $kpi_list[$key] = array("num" => $jsonkpi[$key]['num'], "score" => $jsonkpi[$key]['score'] + , "title" => $value['title1'], "num_tag" => $value['num_tag'], "score_tag" => $value['score_tag']); + } + } else { + $_title = '新增私域通活动'; + $dataInfo['editType'] = 2; + $dataInfo['edit_url'] = '/app/licheb/sytactivity/add'; + $dataInfo['brand_id'] = []; + $dataInfo['status'] = 0; + $dataInfo['z_id'] = 0; + foreach ($this->mdSytKpiData->kpiAry() as $key => $value) { + $kpi_list[$key] = array("num" => 0, "score" => 0, "title" => $value['title1'], "num_tag" => $value['num_tag'] + , "score_tag" => $value['score_tag']); + } + } + foreach ($this->statusAry as $key => $value) { + $status_list[] = array("id" => $key, "name" => $value); + } + $dataInfo['kpi_list'] = $kpi_list; + $dataInfo['id'] = $id; + $dataInfo['share_title'] = $share_title; + $dataInfo['remark'] = $remark; + $dataInfo['rule'] = $rule; + $this->data['info'] = $dataInfo; + $this->data['status_list'] = $status_list; + $this->data['posters'] = $posters; + $this->data['_title'] = $_title; + return $this->show_view('/app/licheb/syt/activity_edit', true); + } + + public function add() + { + $info = $this->input->post('info'); + $checkData = $this->checkData($info); + if (!$checkData['code']) { + return $this->show_json($checkData['code'], $checkData['msg']); + } + $brand_id = $info['brand_id'] ? implode(',', $info['brand_id']) : 0; + $re = $this->mdSytActivity->get(array("z_id" => $info['z_id'], "brand_id" => $brand_id)); + if ($re) { + return $this->show_json(SYS_CODE_FAIL, '该活动已存在!'); + } + $jsonkpi = json_encode($info['kpi_list'], JSON_UNESCAPED_UNICODE); + $json_data['share_title'] = $info['share_title']; + $json_data['remark'] = $info['remark']; + $json_data['rule'] = $info['rule']; + //海报 + $posters = array(); + if ($info['posters']) { + foreach ($info['posters'] as $key => $value) { + $posters[] = array('url' => $value['value'], 'width' => $value['width'], 'height' => $value['height']); + } + } + $json_data['posters'] = $posters; + $jsondata = json_encode($json_data, JSON_UNESCAPED_UNICODE); + $addData = array("brand_id" => $brand_id, "title" => $info['title'], "z_id" => $info['z_id'], "img" => $info['img'] + , "jsonkpi" => $jsonkpi, "jsondata" => $jsondata, "status" => $info['status'], "c_time" => time()); + if ($info['time']) { + $time = explode(' ~ ', $info['time']); + $addData['s_time'] = $time[0]; + $addData['e_time'] = $time[1]; + } + $id = $this->mdSytActivity->add($addData); + if (!$id) { + return $this->show_json(SYS_CODE_FAIL, '新增活动失败!'); + } + $this->data['type'] = 'add'; + $this->data['id'] = $id; + return $this->show_json(SYS_CODE_SUCCESS, '新增活动成功!'); + } + + public function edit() + { + $info = $this->input->post('info'); + $checkData = $this->checkData($info); + if (!$checkData['code']) { + return $this->show_json($checkData['code'], $checkData['msg']); + } + if (!$info['id']) { + return $this->show_json(SYS_CODE_FAIL, '参数错误!'); + } + $jsonkpi = json_encode($info['kpi_list'], JSON_UNESCAPED_UNICODE); + $json_data['share_title'] = $info['share_title']; + $json_data['remark'] = $info['remark']; + $json_data['rule'] = $info['rule']; + //海报 + $posters = array(); + if ($info['posters']) { + foreach ($info['posters'] as $key => $value) { + $posters[] = array('url' => $value['value'], 'width' => $value['width'], 'height' => $value['height']); + } + } + $json_data['posters'] = $posters; + $jsondata = json_encode($json_data, JSON_UNESCAPED_UNICODE); + $brand_id = $info['brand_id'] ? implode(',', $info['brand_id']) : 0; + $updateData = array("brand_id" => $brand_id, "title" => $info['title'], "z_id" => $info['z_id'], "img" => $info['img'] + , "jsonkpi" => $jsonkpi, "jsondata" => $jsondata); + if ($info['time']) { + $time = explode(' ~ ', $info['time']); + $updateData['s_time'] = $time[0]; + $updateData['e_time'] = $time[1]; + } + $this->mdSytActivity->update($updateData, array('id' => $info['id'])); + $this->data['type'] = 'edit'; + return $this->show_json(SYS_CODE_SUCCESS, '修改活动成功!'); + } + + /** + * Notes:修改商家状态 + * Created on: 2020/8/24 11:12 + * Created by: dengbw + * @return bool|void + */ + public function edit_status() + { + $info = $this->input->post('info'); + if (!$info['id']) { + return $this->show_json(SYS_CODE_FAIL, '参数错误!'); + } + $this->mdSytActivity->update(array("status" => intval($info['status'])), array('id' => $info['id'])); + return $this->show_json(SYS_CODE_SUCCESS, '操作成功!'); + } + + + /** + * Notes:私域通-报名 + * Created on: 2020/12/23 14:54 + * Created by: dengbw + * @return bool + */ + public function get_enroll_lists() + { + $params = $this->input->get(); + if (!$params['a_id']) { + return $this->show_json(SYS_CODE_FAIL, '参数错误!'); + } + $re = $this->mdSytActivity->get(array('id' => $params['a_id'])); + if (!$re || empty($re)) { + return $this->show_json(SYS_CODE_FAIL, '活动不存在!'); + } + $res = $this->enrollSelect($params); + $lists = $res['lists']; + $count = $res['count']; + $params = $res['params']; + $this->data['_title'] = '私域通-[' . $re['title'] . ']报名'; + $this->data['pager'] = array('count' => ceil($count / $params['size']), 'curr' => $params['page'], 'totle' => $count); + $this->data['lists'] = $lists; + $this->data['params'] = $res['params']; + return $this->show_view('/app/hdy/syt/enroll_lists', true); + } + + public function enrollSelect($params) + { + $this->load->model('app/syt/syt_activity_enroll_model', 'mdSytActivityEnroll'); + $this->load->model('app/syt/syt_activity_team_model', 'mdSytActivityTeam'); + $this->load->model('app/hdy/app_hdy_users_model', 'mdHdyUsers'); + $params['page'] = $params['page'] ? intval($params['page']) : 1; + $params['size'] = $params['size'] ? intval($params['size']) : 20; + $params['a_id'] = intval($params['a_id']); + $lists = array(); + $where = array('status' => 1, 'a_id' => $params['a_id']); + if ($params['nickname']) { + $where['nickname LIKE "%' . $params['nickname'] . '%"'] = null; + } + if ($params['mobile']) { + $where['mobile LIKE "%' . $params['mobile'] . '%"'] = null; + } + $count = $this->mdSytActivityEnroll->count($where); + if ($count) { + $res = $this->mdSytActivityEnroll->select($where, 'id desc', $params['page'], $params['size']); + foreach ($res as $key => $value) { + $setValue = array(); + $setValue['id'] = $value['id']; + $setValue['nickname'] = $value['nickname']; + $setValue['mobile'] = $value['mobile']; + $cf_name = '-'; + if ($value['cf_uid'] || $value['t_id']) { + if ($value['cf_uid']) { + $reUsers = $this->mdHdyUsers->get(array('id' => $value['cf_uid'])); + $reUsers['nickname'] && $cf_name = $reUsers['nickname']; + } else { + $re_t = $this->mdSytActivityTeam->get(array('id' => $value['t_id'])); + $re_t['name'] && $cf_name = $re_t['name']; + } + } + $setValue['cf_name'] = $cf_name; + $setValue['c_time'] = date('Y-m-d H:i', $value['c_time']); + $lists[] = $setValue; + } + } + $data['lists'] = $lists; + $data['count'] = $count; + $data['params'] = $params; + return $data; + } + + /** + * Notes:检查新增/修改数据 + * Created on: 2020/8/20 11:59 + * Created by: dengbw + * @param $info + * @return array + */ + private function checkData($info) + { + $msg = ''; + $code = SYS_CODE_FAIL; + if (!$info) { + $msg = '非法参数'; + } else if (!$info['brand_id']) { + $msg = '请选择活动品牌'; + } else if (!$info['z_id']) { + $msg = '请选择活动专题'; + } else if (!$info['title']) { + $msg = '请输入活动标题'; + } else if (!$info['time']) { + $msg = '请选择活动时间'; + } else { + $code = SYS_CODE_SUCCESS; + } + return array('code' => $code, 'msg' => $msg); + } + + public function del() + { + } + + public function batch() + { + // TODO: Implement batch() method. + } + + public function export() + { + $params = $this->input->get(); + $params['page'] = 1; + $params['size'] = 10000; + $data = $indexs = array(); + $res = $this->enrollSelect($params); + $fileName = '私域通报名'; + foreach ($res['lists'] as $key => $value) { + $temp['nickname'] = $value['nickname']; + $temp['mobile'] = $value['mobile']; + $temp['cf_name'] = $value['cf_name']; + $temp['c_time'] = $value['c_time']; + $data[] = $temp; + } + $indexs = [ + 'nickname' => '报名昵称', + 'mobile' => '手机号', + 'cf_name' => '来源', + 'c_time' => '创建时间' + ]; + array_unshift($data, $indexs); + $this->load->library('excel'); + $this->excel->out($data, $indexs, $fileName . "_" . date('YmdHis')); + } + + public function get_topics() + { + $page = $this->input->post('page') ? intval($this->input->post('page')) : 1; + $size = $this->input->post('size') ? intval($this->input->post('size')) : 10; + + $topicsList = array(); + $where = array('status >' => -1, 'app_id' => $this->app_id); + $title = $this->input->post('title'); + $title && $where['title like "%' . $title . '%"'] = null; + $count = $this->mdTopics->count($where); + if ($count) { + $res = $this->mdTopics->select($where, 'id desc', $page, $size); + foreach ($res as $key => $value) { + $setValue = array(); + $setValue['id'] = $value['id']; + $setValue['title'] = $value['title']; + $topicsList[] = $setValue; + } + } + $this->data['topicsList'] = $topicsList; + $hasNext = ceil($count / $size) > $page ? 1 : 0; + $this->data['topicsPage'] = array('page' => $page, 'pageLimit' => $size, 'pageCount' => $count, 'hasNext' => $hasNext); + return $this->show_json(SYS_CODE_SUCCESS); + } + + private function get_biz_name($info) + { + $biz_name = ''; + if ($info['biz_id']) { + $reBiz = $this->mdBiz->get(array('id' => $info['biz_id']), 'biz_name'); + $biz_name = $reBiz['biz_name']; + } else if ($info['brand_id']) { + $reBrand = $this->mdBrand->get(array('id' => $info['brand_id']), 'brand_name'); + $biz_name = $reBrand['brand_name']; + } + return $biz_name; + } + + public function get_kpidata() + { + $this->load->model('app/syt/syt_activity_member_model', 'mdSytActivityMember'); + $params = $this->input->get(); + $params['page'] = $params['page'] ? intval($params['page']) : 1; + $params['size'] = $params['size'] ? intval($params['size']) : 10; + $where = array('status' => 1); + $res = $this->mdSytActivityMember->select($where, 'id asc', $params['page'], $params['size']); + foreach ($res as $key => $value) { + $this->mdSytKpiData->update(array("t_id" => $value['t_id']), array("a_id" => $value['a_id'], 'cf_uid' => $value['uid'])); + } + print_r($res); + exit; + } + +} \ No newline at end of file diff --git a/admin/controllers/app/licheb/Sytbiz.php b/admin/controllers/app/licheb/Sytbiz.php new file mode 100644 index 00000000..6a0381fa --- /dev/null +++ b/admin/controllers/app/licheb/Sytbiz.php @@ -0,0 +1,138 @@ +load->model('app/licheb/syt_biz_score_model', 'mdSytBizScore'); + $this->load->model('app/licheb/syt_activity_model', 'mdSytActivity'); + $this->load->model('app/licheb/syt_activity_kpidata_model', 'mdSytActivityKpiData'); + $this->load->model("biz/biz_model", 'mdBiz'); + $this->load->model('app/app_weixin_users_model', 'mdWeixinUsers'); + $this->load->model('app/licheb/app_licheb_users_model', 'mdLichebUsers'); + } + + public function index() + { + return $this->lists(); + } + + public function lists() + { + $params = $this->input->get(); + $re_a = $this->mdSytActivity->get(array("id" => $params['a_id'])); + if (!$re_a) { + return $this->show_json(SYS_CODE_FAIL, "活动不存在"); + } + $params['page'] = $params['page'] ? intval($params['page']) : 1; + $params['size'] = $params['size'] ? intval($params['size']) : 20; + $lists = array(); + $where = array('a_id' => $params['a_id']); + if($params['biz_name']){ + $where['biz_id in (select id from lc_biz where biz_name like "%' . $params['biz_name'] . '%")'] = null; + } + $count = $this->mdSytBizScore->count($where); + if ($count) { + $res = $this->mdSytBizScore->select($where, 'score DESC,id ASC', $params['page'], $params['size'], 'biz_id,score,c_time'); + $str_biz_ids = implode(',', array_column($res, 'biz_id')); + $map_biz = $this->mdBiz->map('id', 'biz_name', ["id in ({$str_biz_ids})" => null]); + foreach ($res as $key => $value) { + $setValue = array(); + $enroll_count = $this->mdSytActivityKpiData->count(['kpi' => 'enroll', 'a_id' => $params['a_id'], 'biz_id' => $value['biz_id']]); + $browse_count = $this->mdSytActivityKpiData->count(['kpi' => 'browse', 'a_id' => $params['a_id'], 'biz_id' => $value['biz_id']]); + $share_count = $this->mdSytActivityKpiData->count(['kpi' => 'share', 'a_id' => $params['a_id'], 'biz_id' => $value['biz_id']]); + $setValue['biz_id'] = $value['biz_id']; + $setValue['biz_name'] = $map_biz[$value['biz_id']]; + $setValue['score'] = $value['score']; + $setValue['enroll_count'] = $enroll_count; + $setValue['browse_count'] = $browse_count; + $setValue['share_count'] = $share_count; + $setValue['c_time'] = date('Y-m-d H:i:s', $value['c_time']); + $lists[] = $setValue; + } + } + $this->data['_title'] = $re_a['title'] . '-门店统计'; + $this->data['pager'] = array('count' => ceil($count / $params['size']), 'curr' => $params['page'], 'totle' => $count); + $this->data['lists'] = $lists; + $this->data['params'] = $params; + return $this->show_view('/app/licheb/syt/activity_biz_lists', true); + } + + public function get_achievement() + { + $params = $this->input->get(); + $params['page'] = $params['page'] ? intval($params['page']) : 1; + $params['size'] = $params['size'] ? intval($params['size']) : 20; + $re_a = $this->mdSytActivity->get(array("id" => $params['a_id'])); + if (!$re_a) { + return $this->show_json(SYS_CODE_FAIL, "活动不存在"); + } + $_title = $re_a['title'].'_业绩报告'; + $where['a_id'] = $params['a_id']; + $params['biz_id'] && $where['biz_id'] = $params['biz_id']; + if ($params['time']) { + $time = explode(' ~ ', $params['time']); + $time[0] && $where["c_time >="] = strtotime($time[0] . ' 00:00:00'); + $time[1] && $where["c_time <="] = strtotime($time[1] . ' 23:59:59'); + } + $menu_lists = $lists = array(); + foreach ($this->mdSytActivityKpiData->kpiAry() as $key => $value) { + $count = $this->mdSytActivityKpiData->count(array_merge($where, array('kpi' => $key))); + $menu_lists[] = array('title' => $value['title2'], 'value' => $count, 'num_tag' => $value['num_tag']); + } + $count = $this->mdSytActivityKpiData->count($where); + if ($count) { + $res = $this->mdSytActivityKpiData->select($where, 'id DESC', $params['page'], $params['size'], 'id,uid,cf_uid,kpi,c_time'); + $uids_arr = array_unique(array_column($res, 'uid')); + $cf_uids_arr = array_unique(array_column($res, 'cf_uid')); + $uids = $this->mdWeixinUsers->get_map_by_ids($uids_arr, 'id,nickname'); + $cf_uids = $this->mdLichebUsers->get_map_by_ids($cf_uids_arr, 'id,uname'); + foreach ($res as $key => $value) { + $setValue = array(); + $setValue['id'] = $value['id']; + $setValue['nickname'] = $cf_uids[$value['cf_uid']][0]['uname'] ? $cf_uids[$value['cf_uid']][0]['uname'] : '无昵称'; + $nickname = $uids[$value['uid']][0]['nickname'] ? $uids[$value['uid']][0]['nickname'] : '无昵称'; + $setValue['title'] = '新增' . $this->mdSytActivityKpiData->kpiAry($value['kpi'], 'title') . '用户' . $nickname; + $setValue['c_time'] = date('Y-m-d H:i', $value['c_time']); + $lists[] = $setValue; + } + } + $this->data['_title'] = $_title; + $this->data['pager'] = array('count' => ceil($count / $params['size']), 'curr' => $params['page'], 'totle' => $count); + $this->data['lists'] = $lists; + $this->data['menu_lists'] = $menu_lists; + $this->data['params'] = $params; + return $this->show_view('/app/licheb/syt/achievement_lists', true); + } + + public function get() + { + } + + public function add() + { + } + + public function edit() + { + } + + public function del() + { + } + + public function batch() + { + } + + public function export() + { + } +} \ No newline at end of file diff --git a/admin/controllers/topics/Topics.php b/admin/controllers/topics/Topics.php index 58d49aa0..f0cc4da4 100644 --- a/admin/controllers/topics/Topics.php +++ b/admin/controllers/topics/Topics.php @@ -14,7 +14,8 @@ Class Topics extends AppBase private $moduleAry = array( array('name' => '文本模块', 'tag' => 'text'), array('name' => '广告模块', 'tag' => 'ad'), - array('name' => '报名模块', 'tag' => 'enroll') + array('name' => '报名模块', 'tag' => 'enroll'), + array("name" => "按钮模块", "tag" => "button") ); public function __construct() @@ -26,6 +27,7 @@ Class Topics extends AppBase $this->load->model('topics/topic_module_ad_model', 'mdModuleAd'); $this->load->model('topics/topic_module_enroll_model', 'mdModuleEnroll'); $this->load->model('topics/topic_module_enrolldata_model', 'mdModuleEnrolldata'); + $this->load->model('topics/topic_module_button_model', 'mdModuleButton'); $this->load->model('topics/topic_user_log_model', 'mdUserLog'); $this->load->model("sys/sys_admin_model", 'mdSysAdmin'); } @@ -67,11 +69,6 @@ Class Topics extends AppBase } $res = $this->mdTopics->select($where, "id desc", $params['page'], $size); $count = $this->mdTopics->count($where); - - $view_where["c_time > UNIX_TIMESTAMP(DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'),INTERVAL 7 day))"] = null; - $view_select = "tid, count(id) as doc_count, count(distinct app_uid) as doc_count_uid"; - - $user_log_arr = $this->mdUserLog->map_groupby('tid', '*', $view_where, $view_select, 'tid'); if ($res) { foreach ($res as $key => $value) { $setValue = array(); @@ -86,8 +83,6 @@ Class Topics extends AppBase } $setValue['status_name'] = $statusAry[$value['status']]; $setValue['c_time'] = date('Y-m-d H:i', $value['c_time']); - $setValue['count_view'] = $user_log_arr[$value['id']]['doc_count'] ?: 0; - $setValue['count_view_uid'] = $user_log_arr[$value['id']]['doc_count_uid'] ?: 0; $lists[] = $setValue; } } @@ -459,6 +454,10 @@ Class Topics extends AppBase $mdModule = $this->mdModuleEnroll; $style = 'block'; break; + case "button": + $title = '按钮模块'; + $mdModule = $this->mdModuleButton; + break; default: } if ($mdModule) { @@ -519,6 +518,10 @@ Class Topics extends AppBase $this->mdModuleAd->add($dataI); } else if ($add_sys_shop_module['tag'] == 'enroll') { $this->mdModuleEnroll->add($dataI); + } elseif ($add_sys_shop_module['tag'] == 'button') { + $this->mdModuleButton->add($dataI); + } elseif ($add_sys_shop_module['tag'] == 'countdown') { + $this->mdModuleCountdown->add($dataI); } //更新专题 $module_ids = $module_ids ? $module_ids . ',' . $mid : $mid; @@ -920,6 +923,63 @@ Class Topics extends AppBase return $this->show_json(SYS_CODE_SUCCESS, '保存成功!'); } + /** + * Notes:获取按扭模块信息 + * Created on: 2020/10/20 12:48 + * Created by: dengbw + */ + public function get_button_setting() + { + $module_id = intval($this->input->get('module_id')); + $re_btn = $this->mdModuleButton->get(array('module_id' => $module_id)); + $setting = $jsondata = array(); + $status = $module_type = 0; + $module_title = $module_descrip = ""; + if ($re_btn) { + $reM = $this->mdTopicModules->get(array('id' => $module_id)); + $status = intval($reM['status']); + $module_title = $re_btn['title']; + $module_type = intval($re_btn['type']); + $module_descrip = $re_btn['descrip']; + if ($re_btn['jsondata']) { + $jsondata = json_decode($re_btn['jsondata'], true); + $jsondata['img_url'] = $jsondata['img'] ? build_qiniu_image_url($jsondata['img']) : ""; + } + } + $setting['status'] = $status; + $setting['module_title'] = $module_title; + $setting['module_type'] = $module_type; + $setting['module_descrip'] = $module_descrip; + $setting['module_jsondata'] = $jsondata; + $this->data['setting'] = $setting; + return $this->show_json(SYS_CODE_SUCCESS, '获取成功!'); + } + + /** + * Notes:保存按扭模块 + * Created on: 2020/10/20 12:35 + * Created by: dengbw + */ + public function edit_save_button() + { + $save_data = $this->input->post('save_data'); + if (!$save_data['module_id']) { + return $this->show_json(SYS_CODE_FAIL, '非法参数!'); + } + $dataI['title'] = $save_data['setting']['module_title']; + $dataI['type'] = $save_data['setting']['module_type']; + $dataI['descrip'] = $save_data['setting']['module_descrip']; + $module_jsondata = $save_data['setting']['module_jsondata']; + unset($module_jsondata['img_url']); + $dataI['jsondata'] = json_encode($module_jsondata, JSON_UNESCAPED_UNICODE); + $this->mdModuleButton->update($dataI, array('module_id' => $save_data['module_id'])); + $where = array('id' => $save_data['module_id']); + $upd = array('status' => $save_data['setting']['status']); + $this->mdTopicModules->update($upd, $where); + return $this->show_json(SYS_CODE_SUCCESS, '保存成功!'); + } + + /** * Notes:修改状态 0下架,1正常 * Created on: 2019/12/3 15:48 @@ -938,20 +998,17 @@ Class Topics extends AppBase return $this->show_json(SYS_CODE_SUCCESS, '修改成功!'); } - public - function del() + public function del() { // TODO: Implement del() method. } - public - function batch() + public function batch() { } - public - function export() + public function export() { // TODO: Implement export() method. } diff --git a/admin/views/app/licheb/syt/achievement_lists.php b/admin/views/app/licheb/syt/achievement_lists.php new file mode 100644 index 00000000..53311a80 --- /dev/null +++ b/admin/views/app/licheb/syt/achievement_lists.php @@ -0,0 +1,122 @@ +
+
+ $value) { ?> +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+ + +
+
共有条数据
+ + + + + + + + + + + + + + + + + + + +
ID用户内容创建时间
+
+
+
+
+
+ +
+
+
+ + \ No newline at end of file diff --git a/admin/views/app/licheb/syt/activity_biz_lists.php b/admin/views/app/licheb/syt/activity_biz_lists.php new file mode 100644 index 00000000..67b4239c --- /dev/null +++ b/admin/views/app/licheb/syt/activity_biz_lists.php @@ -0,0 +1,60 @@ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
门店ID门店分数报名浏览分享创建时间操作
+ 业绩报告
+
+
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/admin/views/app/licheb/syt/activity_edit.php b/admin/views/app/licheb/syt/activity_edit.php new file mode 100644 index 00000000..21624945 --- /dev/null +++ b/admin/views/app/licheb/syt/activity_edit.php @@ -0,0 +1,543 @@ +
+
+
+
+
+
+
+ 状态 +
+
+ + +
+
+
+ +
+
+
+
+
+ 活动信息 + + +
+
+
+ +
+
+
+ +
+
+ 选择 +
+
+ 注:活动页面只能从现有的专题中选择 +
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+
+ + 建议尺寸宽度690 + + +
+
+
+
+ +
+

上传图片

+
+
+ + +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
{{v.title}}
+
+ +
+
{{v.num_tag}}
+
+ +
+
{{v.score_tag}}
+
+
+
+
+ + +
+
+
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/admin/views/app/licheb/syt/activity_lists.php b/admin/views/app/licheb/syt/activity_lists.php new file mode 100644 index 00000000..2ca003ba --- /dev/null +++ b/admin/views/app/licheb/syt/activity_lists.php @@ -0,0 +1,78 @@ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID活动标题专题开始时间结束时间创建时间状态
+
+ 报名 + 门店 + 业绩报告 + 分享二维码 + 编辑 +
+
+
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/admin/views/topics/edit.php b/admin/views/topics/edit.php index 1626ffad..d0610715 100644 --- a/admin/views/topics/edit.php +++ b/admin/views/topics/edit.php @@ -83,6 +83,8 @@ :is_template="is_template" @ad-title="changeModuleName"> +
@@ -135,6 +137,8 @@ + + + \ No newline at end of file diff --git a/admin/views/topics/module_enroll.php b/admin/views/topics/module_enroll.php index 701bf063..60cbef87 100644 --- a/admin/views/topics/module_enroll.php +++ b/admin/views/topics/module_enroll.php @@ -150,7 +150,7 @@
diff --git a/api/controllers/wxapp/liche/Aptinfo.php b/api/controllers/wxapp/liche/Aptinfo.php index 5b76d8e5..39cbdaf6 100644 --- a/api/controllers/wxapp/liche/Aptinfo.php +++ b/api/controllers/wxapp/liche/Aptinfo.php @@ -124,6 +124,16 @@ class Aptinfo extends Wxapp{ $lng = $this->input_param('lng'); $recommend_id = intval($this->input_param('cf_uid')); //来源用户id $cms_id = intval($this->input_param('cms_id')); //cmsid + $syt = intval($this->input_param('syt')); + if ($syt && $this->myuid) {//私域通报名 + $this->load->library('entity/syt_entity'); + $syt_entity = new Syt_entity(array('app_id' => $this->app_id)); + $results = $syt_entity->kpi_enroll_log(['cf_platform' => 'wxapp', 'uid' => $this->myuid, 'nickname' => $this->session['nickname'] + , 'mobile' => $this->session['mobile']]); + if ($results['code'] == 200) { + throw new Hd_exception($results['msg'], $results['code']); + } + } $city_id && $city_row = $this->sys_area_model->get(['county_id' => $city_id],'id,county_id,city_id'); $cms_row = $this->cms_model->get(['id'=>$cms_id]); diff --git a/api/controllers/wxapp/licheb/Customers.php b/api/controllers/wxapp/licheb/Customers.php index b53f96ea..12cb8bfd 100644 --- a/api/controllers/wxapp/licheb/Customers.php +++ b/api/controllers/wxapp/licheb/Customers.php @@ -120,7 +120,7 @@ class Customers extends Wxapp } $car_json = json_decode($row['car_json'], true); $update = []; - if($row['cf_title']!='平台分配'){ + if ($row['cf_title'] != '平台分配') { if ($mobile) { if (!mobile_valid($mobile)) { throw new Exception('手机号格式错误', ERR_PARAMS_ERROR); @@ -314,7 +314,7 @@ class Customers extends Wxapp $log = $log ? $log . ',' . $msg : $msg; } $visit = $status == 2 ? 1 : 0;//变成订单客户,更新客户已回访 - $this->customers_entity->add_log_visit($id, $uid, $this->session['uname'], $log,0,$visit); + $this->customers_entity->add_log_visit($id, $uid, $this->session['uname'], $log, 0, $visit); } } if ($result) { @@ -388,6 +388,7 @@ class Customers extends Wxapp $cf_clues = $this->input_param('cf_clues');//线索来源 $admin_id = $this->input_param('admin_id'); $id = $this->input_param('cus_id'); + $a_id = intval($this->input_param('a_id'));//私域通活动id !$page && $page = 1; !$size && $size = 10; @@ -403,12 +404,16 @@ class Customers extends Wxapp $orderby = 'c_time desc'; } } - $where = [ 'biz_id' => $biz_id, 'status>=' => 0 ]; + if ($a_id) { + $where["cf_id"] = 35; + $where["t_id"] = $a_id; + } + if ($group_id == 1 || $ismy) { $where["admin_id"] = $uid; } @@ -697,7 +702,7 @@ class Customers extends Wxapp if ($ret) { $this->load->library('receiver/customers_entity'); $visit = $update['status'] == 3 ? 1 : 0; - $this->customers_entity->add_log_visit($id, $this->session['uid'], $this->session['uname'], $log,0,$visit); + $this->customers_entity->add_log_visit($id, $this->session['uid'], $this->session['uname'], $log, 0, $visit); throw new Exception('操作成功', API_CODE_SUCCESS); } throw new Exception('操作失败', ERR_PARAMS_ERROR); diff --git a/api/controllers/wxapp/licheb/Sytactivity.php b/api/controllers/wxapp/licheb/Sytactivity.php new file mode 100644 index 00000000..9834fc67 --- /dev/null +++ b/api/controllers/wxapp/licheb/Sytactivity.php @@ -0,0 +1,224 @@ +login_white = array();//登录白名单 + $this->check_status = array();//用户状态校验 + $this->majia_white = array('get');//超级管理员披上马甲权限控制 + $this->load->model('app/licheb/syt_activity_model', 'mdSytActivity'); + $this->load->model('app/licheb/syt_activity_kpidata_model', 'mdSytActivityKpiData'); + $this->load->model('app/licheb/syt_biz_score_model', 'mdSytBizScore'); + $this->load->model('app/app_weixin_users_model', 'mdWeixinUsers'); + $this->load->model('app/licheb/app_licheb_users_model', 'mdLichebUsers'); + $this->load->model("biz/biz_model", 'mdBiz'); + $this->load->model('receiver/receiver_customers_model', 'mdCustomers'); + $this->biz_id = $this->session['new_biz_id'] ? $this->session['new_biz_id'] : intval($this->session['biz_id']); + } + + /** + * Notes:顶部菜单 + * Created on: 2022/1/14 9:40 + * Created by: dengbw + * @return mixed + */ + protected function get_tabs() + { + $data['title'] = '私域通'; + $bm_count = $this->mdSytActivityKpiData->count(['kpi' => 'enroll']); + $dd_count = $this->mdCustomers->count(['status' => 1, 'cf_id' => $this->cf_id]); + $xd_count = $this->mdCustomers->count(['status' => 2, 'cf_id' => $this->cf_id]); + $data['bg_img'] = 'https://qs.haodian.cn/wechat_app/lichebao/siyutong/theme.jpg'; + $data['menus'] = array(array('title' => '报名', 'value' => $bm_count), array('title' => '到店', 'value' => $dd_count), + array('title' => '下定', 'value' => $xd_count)); + return $data; + } + + /** + * Notes:推广活动列表 + * Created on: 2022/1/14 9:40 + * Created by: dengbw + * @return mixed + */ + protected function get_list() + { + $page = $this->input_param('page'); + $size = $this->input_param('size'); + !$page && $page = 1; + !$size && $size = 3; + $where['status'] = 1; + $date = date('Y-m-d H:i:s'); + $lists = array(); + $total = $this->mdSytActivity->count($where); + if ($total) { + $res = $this->mdSytActivity->select($where, 'id DESC', $page, $size, 'id,title,s_time,e_time'); + foreach ($res as $key => $value) { + $setValue = array(); + $setValue['id'] = intval($value['id']); + $setValue['title'] = $value['title']; + $type_name = $color = ''; + $type = 0; + $s_time = $value['s_time']; + $e_time = $value['e_time']; + if ($s_time > $date) { + $type = 1; + $type_name = '未开始'; + $color = '#999'; + } else if ($s_time <= $date && $e_time >= $date) { + $type = 2; + $type_name = '进行中'; + $color = '#ff842d'; + } else if ($e_time < $date) { + $type = 3; + $type_name = '已结束'; + $color = '#996c6c'; + } + $setValue['type'] = $type; + $setValue['type_name'] = $type_name; + $setValue['color'] = $color; + $lists[] = $setValue; + } + } + $data['list'] = $lists; + $data['total'] = $total; + return $data; + } + + /** + * Notes:推广活动详情 + * Created on: 2020/9/28 16:01 + * Created by: dengbw + * @throws Hd_exception + */ + protected function get_detail() + { + $id = intval($this->input_param('id')); + if (!$id) { + throw new Hd_exception('参数错误!', API_CODE_INVILD_PARAM); + } + $re = $this->mdSytActivity->get(array("id" => $id, "status" => 1)); + if (!$re) { + throw new Hd_exception('未找到活动!', API_CODE_INVILD_PARAM); + } + $jsondata = $re['jsondata'] ? json_decode($re['jsondata'], true) : ''; + $share_count = $this->mdSytActivityKpiData->count(['kpi' => 'share', 'a_id' => $id]); + $browse_count = $this->mdSytActivityKpiData->count(['kpi' => 'browse', 'a_id' => $id]); + $enroll_count = $this->mdSytActivityKpiData->count(['kpi' => 'enroll', 'a_id' => $id]); + $ranking = 0; + $re_biz_score = $this->mdSytBizScore->get(['a_id' => $id, 'biz_id' => $this->biz_id]); + if ($re_biz_score && $re_biz_score['score']) { + $ranking = $this->mdSytBizScore->count(['score >=' => $re_biz_score['score'], 'a_id' => $id]); + } + $data['id'] = intval($re['id']); + $data['img'] = $re['img'] ? build_qiniu_image_url($re['img']) : ''; + $data['poster'] = $jsondata['posters'] ? build_qiniu_image_url($jsondata['posters'][0]['url']) : $data['img']; + $data['remark'] = $jsondata['remark'] ? $jsondata['remark'] : ''; + $data['ranking'] = ['title' => '当前门店排名', 'value' => $ranking, 'url' => '/pages/siyutong/activityRanking/index?id=' . $id]; + $data['menus'] = [['title' => '分享', 'value' => $share_count], ['title' => '浏览', 'value' => $browse_count] + , ['title' => '报名>', 'value' => $enroll_count, 'url' => '/pages/customer/filterList/index?a_id=' . $id]]; + //生成分享连接 + $this->load->library('MyEncryption'); + $skey = $this->myencryption->base64url_encode("a_id={$id}&cf_uid={$this->myuid}&biz_id={$this->biz_id}&cf_share={$this->myencryption->random_string(6)}"); + $myqrcode_url = http_host_com('home') . '/h5/syt/special?skey=' . $skey; + $share_url = http_host_com('home') . '/h5/syt/myqrcode/get?url=' . $myqrcode_url; + $data['btn'] = ['title' => '马上邀请', 'value' => 1, 'share_url' => $share_url]; + return $data; + } + + /** + * Notes:实时战报 + * Created on: 2022/1/19 9:57 + * Created by: dengbw + * @return mixed + * @throws Hd_exception + */ + protected function get_log() + { + $page = $this->input_param('page'); + $size = $this->input_param('size'); + !$page && $page = 1; + !$size && $size = 10; + $id = intval($this->input_param('id')); + if (!$id) { + throw new Hd_exception('参数错误!', API_CODE_INVILD_PARAM); + } + $lists = array(); + $where = array('a_id' => $id, 'kpi<>' => 'share'); + $total = $this->mdSytActivityKpiData->count($where); + if ($total) { + $res = $this->mdSytActivityKpiData->select($where, 'id DESC', $page, $size, 'uid,cf_uid,kpi,biz_id,c_time'); + $uids_arr = array_unique(array_column($res, 'uid')); + $cf_uids_arr = array_unique(array_column($res, 'cf_uid')); + $uids = $this->mdWeixinUsers->get_map_by_ids($uids_arr, 'id,nickname'); + $cf_uids = $this->mdLichebUsers->get_map_by_ids($cf_uids_arr, 'id,uname'); + foreach ($res as $key => $value) { + $setValue = array(); + if ($value['kpi'] == 'enroll') { + $content = "{$uids[$value['uid']][0]['nickname']}通过{$cf_uids[$value['cf_uid']][0]['uname']}报名了活动"; + } else { + $content = "{$cf_uids[$value['cf_uid']][0]['uname']}邀请{$uids[$value['uid']][0]['nickname']}进入活动页"; + } + $setValue['content'] = $content; + $setValue['c_time'] = friendly_date($value['c_time'], 'mohu'); + $lists[] = $setValue; + } + } + $data['list'] = $lists; + $data['total'] = $total; + return $data; + } + + /** + * Notes:活动排名 + * Created on: 2022/1/19 14:25 + * Created by: dengbw + * @return mixed + * @throws Hd_exception + */ + protected function get_ranking() + { + $id = intval($this->input_param('id')); + if (!$id) { + throw new Hd_exception('参数错误!', API_CODE_INVILD_PARAM); + } + $re = $this->mdSytActivity->get(array("id" => $id, "status" => 1)); + if (!$re) { + throw new Hd_exception('未找到活动!', API_CODE_INVILD_PARAM); + } + $score = 0; + $ranking = []; + $jsondata = $re['jsondata'] ? json_decode($re['jsondata'], true) : ''; + $re = $this->mdSytBizScore->get(array("biz_id" => $this->biz_id)); + $re['score'] && $score = $re['score']; + $res = $this->mdSytBizScore->select(['a_id' => $id], 'score DESC,id ASC', 0, 7, 'biz_id,score'); + if ($res) { + $str_biz_ids = implode(',', array_column($res, 'biz_id')); + $map_biz = $this->mdBiz->map('id', 'biz_name', ["id in ({$str_biz_ids})" => null]); + foreach ($res as $key => $value) { + $num = $key + 1; + $ranking[] = ['num' => $num, 'biz_name' => $map_biz[$value['biz_id']], 'score' => $value['score'] . '分']; + } + } + $data['title'] = '活动排名'; + $data['biz'] = ['title' => '我的直营店', 'value' => $score . '分']; + $data['ranking'] = $ranking; + $data['rule'] = ['title' => '积分规则>', 'value' => $jsondata['rule'] ? $jsondata['rule'] : '']; + return $data; + } + +} \ No newline at end of file diff --git a/api/controllers/wxapp/material/Topic.php b/api/controllers/wxapp/material/Topic.php index 6a21f146..5a89ba2d 100644 --- a/api/controllers/wxapp/material/Topic.php +++ b/api/controllers/wxapp/material/Topic.php @@ -131,6 +131,16 @@ class Topic extends Wxapp $cf_id = 1; $brand_id = 0; $recommend_id && $cf_id = 8; + $syt = intval($this->input_param('syt')); + if ($syt && $this->myuid) {//私域通报名 + $this->load->library('entity/syt_entity'); + $syt_entity = new Syt_entity(array('app_id' => $this->app_id)); + $results = $syt_entity->kpi_enroll_log(['cf_platform' => 'wxapp', 'uid' => $this->myuid, 'nickname' => $this->session['nickname'] + , 'mobile' => $this->session['mobile']]); + if ($results['code'] == 200) { + throw new Hd_exception($results['msg'], $results['code']); + } + } $city_id && $city_row = $this->sys_area_model->get(['county_id' => $city_id], 'id,county_id,city_id'); $re_t = $this->mdTemplate->get(['id' => $t_id]); if ($re_t && $re_t['brand_ids']) { diff --git a/common/helpers/comm_helper.php b/common/helpers/comm_helper.php index d56450bc..427e0f45 100644 --- a/common/helpers/comm_helper.php +++ b/common/helpers/comm_helper.php @@ -33,6 +33,66 @@ if (!function_exists('load_cache')) { } } +/** + * 接口加密 + * @param $string + * @param string $operation + * @param string $key + * @param int $expiry + * @return string + */ +if (!function_exists('liche_authcode')) { + function liche_authcode($string, $operation = 'DECODE', $key = '123456', $expiry = 0) + { + $ckey_length = 4; + $key = md5($key ? $key : self::KEY); + $keya = md5(substr($key, 0, 16)); + $keyb = md5(substr($key, 16, 16)); + $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : ''; + + $cryptkey = $keya . md5($keya . $keyc); + $key_length = strlen($cryptkey); + + $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; + $string_length = strlen($string); + + $result = ''; + $box = range(0, 255); + + $rndkey = array(); + for ($i = 0; $i <= 255; $i++) { + $rndkey[$i] = ord($cryptkey[$i % $key_length]); + } + + for ($j = $i = 0; $i < 256; $i++) { + $j = ($j + $box[$i] + $rndkey[$i]) % 256; + $tmp = $box[$i]; + $box[$i] = $box[$j]; + $box[$j] = $tmp; + } + + for ($a = $j = $i = 0; $i < $string_length; $i++) { + $a = ($a + 1) % 256; + $j = ($j + $box[$a]) % 256; + $tmp = $box[$a]; + $box[$a] = $box[$j]; + $box[$j] = $tmp; + $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); + } + + if ($operation == 'DECODE') { + if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) { + return substr($result, 26); + } else { + return ''; + } + } else { + return $keyc . str_replace('=', '', base64_encode($result)); + } + + } +} + /** * sql日志 * @param $string diff --git a/common/libraries/entity/Syt_entity.php b/common/libraries/entity/Syt_entity.php new file mode 100644 index 00000000..de2507e8 --- /dev/null +++ b/common/libraries/entity/Syt_entity.php @@ -0,0 +1,249 @@ +ci = &get_instance(); + $this->init($params); + $class_name = lcfirst(get_class($this));//调用类的名称,子类或者当前类名称 + $this->log_file = "libraris_{$class_name}.log"; + $this->load->model('app/licheb/syt_activity_model', 'mdSytActivity'); + $this->load->model('app/licheb/syt_activity_kpidata_model', 'mdSytActivityKpiData'); + $this->load->model('app/licheb/syt_biz_score_model', 'mdSytBizScore'); + } + + public function init($params) + { + if ($params['app_id']) { + $this->app_id = $params['app_id']; + $this->load->model('app/App_model', 'mdApp'); + $this->app_config = $this->ci->mdApp->appConfig()[$this->app_id]; + } + } + + /** + * Notes:报名记录 + * Created on: 2022/1/24 10:57 + * Created by: dengbw + * @param $params + * @return array + */ + public function kpi_enroll_log($params) + { + if ($params['cf_platform'] == 'wxapp') { + if (!$params['uid']) { + return array('code' => 400, 'msg' => '无狸车用户uid'); + } + $this->load->model('app/liche/app_liche_users_model', 'mdLicheUsers'); + $this->load->model('app/licheb/app_licheb_users_model', 'mdLichebUsers'); + $this->load->model('app/app_weixin_users_model', 'mdWeixinUsers'); + $re_lu = $this->ci->mdLicheUsers->get(array("id" => $params['uid'])); + if (!$re_lu['unionid']) { + return array('code' => 400, 'msg' => '无狸车用户unionid'); + } + $re_lw = $this->ci->mdWeixinUsers->get(array("unionid" => $re_lu['unionid'])); + if (!$re_lw['unionid']) { + return array('code' => 400, 'msg' => '无狸车公众号unionid'); + } + $jsondata = $re_lw['jsondata'] ? json_decode($re_lw['jsondata'], true) : ''; + if (!$jsondata['syt']) { + return array('code' => 400, 'msg' => '无狸车公众号syt'); + } + $syt = $jsondata['syt']; + $syt['nickname'] = $params['nickname']; + $syt['mobile'] = $params['mobile']; + $syt['uid'] = $re_lw['id']; + $syt['cf_id'] = 35; + $syt['if_driver'] = 1; + $params = $syt; + } + $this->load->model('receiver/receiver_customers_model', 'mdCustomers'); + $this->load->model("biz/biz_model", 'mdBiz'); + $re_a = $this->ci->mdSytActivity->get(array("id" => $params['a_id'], "status" => 1)); + if (!$re_a) { + return array('code' => 400, 'msg' => '活动不存在'); + } + $nickname = $params['nickname']; + $mobile = $params['mobile']; + $cf_id = intval($params['cf_id']); + $uid = intval($params['uid']); + $biz_id = intval($params['biz_id']); + $if_driver = intval($params['if_driver']); + if ($biz_id) { + $re_enroll = $this->ci->mdCustomers->get(array('cf_id' => $cf_id, 't_id' => $params['a_id'], 'mobile' => $mobile)); + if ($re_enroll) { + return array('code' => 400, 'msg' => '你已经报名过啦,我们会在24时内与您取得联系,请耐心等待!'); + } + } + $brand_id = 0; + if ($re_a['brand_id']) { + $brand_ids = implode(',', $re_a['brand_id']); + $brand_id = count($brand_ids) > 0 ? $brand_ids[0] : $re_a['brand_id']; + } + $c_id = 0; + $type = 'customers'; + if ($biz_id) {//加入门店客户 + $re_biz = $this->ci->mdBiz->get(['id' => $biz_id, 'status' => 1]); + if ($re_biz) { + $add_data = [ + 'name' => $nickname, + 'mobile' => $mobile, + 'biz_id' => $biz_id, + 'brand_id' => $brand_id, + 'city_id' => $re_biz['city_id'], + 'county_id' => $re_biz['county_id'], + 'cf_title' => '私域活动', + 'cf_id' => $cf_id, + 't_id' => $params['a_id'], + 'p_time' => date('Y-m-d H:i:s'), + 'c_time' => time() + ]; + $c_id = $this->ci->mdCustomers->add($add_data); + if (!$c_id) { + return array('code' => 400, 'msg' => '您报名该活动失败了'); + } + } + } + if (!$c_id) {//未加到门店,加到线索池里 + $this->load->model('receiver/receiver_clues_model', 'clues_model'); + $this->load->library('receiver/clues_entity'); + $row = $this->ci->clues_model->get(['mobile' => $mobile]); + if ($row) { + $update = ['en_time' => date('Y-m-d H:i:s')]; + $this->ci->clues_model->update($update, ['id' => $row['id']]); + //增加日志 + $cf_title = $this->ci->clues_entity->cf_title($cf_id); + $log_msg = '用户报名'; + $cf_title && $log_msg = "用户通过【{$cf_title}】报名"; + $this->ci->clues_entity->add_log($row['id'], $uid, $nickname, $log_msg); + return array('code' => 200, 'msg' => '报名成功了,我们会在24时内与您取得联系!'); + } + $jsondata['info'] = ['biz_id' => $biz_id ? $biz_id : '']; + $params['a_id'] && $jsondata['info']['t_id'] = $params['a_id']; + $add_data = [ + 'name' => $nickname, + 'mobile' => $mobile, + 'brand_id' => $brand_id, + 'cf_uid' => $uid, + 'cf_id' => $cf_id, + 'app_id' => $this->app_id, + 'if_driver' => $if_driver, + 'cf_platform' => $params['cf_platform'], + 'jsondata' => json_encode($jsondata, JSON_UNESCAPED_UNICODE), + 'en_time' => date('Y-m-d H:i:s'), + 'c_time' => time() + ]; + $c_id = $this->ci->clues_model->add($add_data); + if (!$c_id) { + return array('code' => 400, 'msg' => '您报名该活动失败了'); + } + $type = 'clues'; + $cf_title = $this->ci->clues_entity->cf_title($cf_id); + $log_msg = '用户报名'; + $cf_title && $log_msg = "用户通过【{$cf_title}】报名"; + $this->ci->clues_entity->add_log($c_id, $uid, $nickname, $log_msg); + } + //增加报名分数 + $this->kpi_log(array('a_id' => $params['a_id'], 'cf_uid' => $params['cf_uid'], 'biz_id' => $params['biz_id'] + , 'kpi' => 'enroll', 'c_id' => $c_id, 'type' => $type, 'uid' => $uid)); + return array('code' => 200, 'msg' => '报名成功,我们会在24时内与您取得联系!'); + } + + /** + * Notes:添加kpi记录 + * Created on: 2021/1/13 11:20 + * Created by: dengbw + * @param $params + * @return array + */ + public function kpi_log($params) + { + if ($params['a_id'] && $params['uid'] && ($params['cf_uid'] || $params['biz_id'])) { + $re_a = $this->ci->mdSytActivity->get(array("id" => $params['a_id'], "status" => 1)); + $now_time = time(); + if (!$re_a || $now_time < strtotime($re_a['s_time']) || $now_time > strtotime($re_a['e_time'])) { + return array('code' => 0, 'msg' => '无活动或未在活动时间内'); + } + if ($params['kpi'] == 'share' && $params['cf_share']) {//检测分享码是否已使用 + $where_share = array("a_id" => $params['a_id'], 'kpi' => $params['kpi'], "cf_share" => $params['cf_share']); + if ($params['cf_uid']) { + $where_share['cf_uid'] = $params['cf_uid']; + } else { + $where_share['biz_id'] = $params['biz_id']; + } + $re_share = $this->ci->mdSytActivityKpiData->get($where_share); + if ($re_share) { + return array('code' => 0, 'msg' => '分享码已被使用'); + } + } + $re_kpi = $this->ci->mdSytActivityKpiData->get(array("a_id" => $params['a_id'], 'uid' => $params['uid'], 'kpi' => $params['kpi'])); + if ($re_kpi) {//已添加过活动kpi(访活动只记录一次用户kpi记录) + return array('code' => 0, 'msg' => '已添加过' . $params['kpi'] . '记录'); + } + $where_kpi = array("a_id" => $params['a_id'], "biz_id" => $params['biz_id'], 'kpi' => $params['kpi']); + //增加记录 + $addData = array_merge($where_kpi, array('uid' => $params['uid'], 'cf_uid' => $params['cf_uid'], 'c_time' => time())); + $jsondata = array(); + if ($params['kpi'] == 'enroll' && $params['c_id']) {//加报名id记录 + $jsondata['enroll_type'] = $params['type']; + $jsondata['enroll_c_id'] = $params['c_id']; + } + if ($params['kpi'] == 'share' && $params['cf_share']) {//加分享码 + $addData['cf_share'] = $params['cf_share']; + } + $jsondata && $addData['jsondata'] = json_encode($jsondata, JSON_UNESCAPED_UNICODE); + $id = $this->ci->mdSytActivityKpiData->add($addData); + if (!$id) { + return array('code' => 0, 'msg' => '添加记录失败'); + } + if (!$params['biz_id']) { + return array('code' => 0, 'msg' => '无门店不加分数'); + } + $jsonkpi = $re_a['jsonkpi'] ? json_decode($re_a['jsonkpi'], true) : array(); + $kpi_count = $this->ci->mdSytActivityKpiData->count(array_merge($where_kpi, array('status' => 0))); + $kpi_num = intval($jsonkpi[$params['kpi']]['num']); + $kpi_score = intval($jsonkpi[$params['kpi']]['score']); + if ($kpi_num && $kpi_score && $kpi_count >= $kpi_num) {//大于等于次数加分 + $re_biz_score = $this->ci->mdSytBizScore->get(array('a_id' => $params['a_id'], 'biz_id' => $params['biz_id'])); + if (!$re_biz_score) {//未添加门店数据 + $re_biz_score['id'] = $this->ci->mdSytBizScore->add(['a_id' => $params['a_id'], 'biz_id' => $params['biz_id'], 'c_time' => time()]); + if (!$re_biz_score['id']) { + return array('code' => 0, 'msg' => '添加门店分数记录'); + } + $re_biz_score['score'] = 0; + } + $score_ms = $kpi_score + intval($re_biz_score['score']); + $this->ci->mdSytBizScore->update(array('score' => $score_ms), array('id' => $re_biz_score['id'])); + $res_kpi = $this->ci->mdSytActivityKpiData->select(array_merge($where_kpi, array('status' => 0)), 'id asc', 0, $kpi_num, 'id'); + if ($res_kpi) { + $kpi_ids = implode(',', array_column($res_kpi, "id")); + $this->ci->mdSytActivityKpiData->update(array('status' => 1), array("id in(" . $kpi_ids . ")" => null));//更新为已加分 + } + return array('code' => 1, 'msg' => '添加记录成功'); + } + } else { + return array('code' => 0, 'msg' => '参数错误'); + } + } + + public function __get($name) + { + if ('_model' === substr($name, -6)) { + return $this->ci->$name; + } elseif ('load' == $name) { + return $this->ci->load; + } + return null; + } +} diff --git a/common/models/app/App_weixin_users_model.php b/common/models/app/App_weixin_users_model.php new file mode 100644 index 00000000..c914e4a2 --- /dev/null +++ b/common/models/app/App_weixin_users_model.php @@ -0,0 +1,39 @@ +table_name, 'default'); + } + + /** + * Notes:根据id获取数据 + * Created on: 2022/1/17 11:06 + * Created by: dengbw + * @param $ids + * @param string $fileds + * @return array + */ + public function get_map_by_ids($ids, $fileds = '') + { + $rows = []; + $ids = array_filter($ids); + if ($ids) { + $cf_ids = implode(',', $ids); + $where = [ + "id in ($cf_ids)" => null + ]; + $rows = $this->map('id', '', $where, '', '', '', $fileds); + } + return $rows; + } +} diff --git a/common/models/app/licheb/Syt_activity_kpidata_model.php b/common/models/app/licheb/Syt_activity_kpidata_model.php new file mode 100644 index 00000000..c6dd7dbc --- /dev/null +++ b/common/models/app/licheb/Syt_activity_kpidata_model.php @@ -0,0 +1,34 @@ +table_name, 'default'); + } + + public function kpiAry($kpi = '', $title = '') + { + $url = 'https://qs.haodian.cn/wechat_app/haodianyun/siyutong'; + $data['share'] = array('img' => $url . '/kpi2-1.png', 'title' => '分享', 'title1' => '分享次数', 'title2' => '分享次数', 'title3' => '分享人数' + , 'num_tag' => '次', 'score_tag' => '分数'); + $data['browse'] = array('img' => $url . '/kpi2-2.png', 'title' => '浏览', 'title1' => '浏览用户', 'title2' => '浏览次数', 'title3' => '浏览人数' + , 'num_tag' => '人', 'score_tag' => '分数'); + $data['enroll'] = array('img' => $url . '/kpi2-3.png', 'title' => '报名', 'title1' => '报名用户', 'title2' => '报名用户', 'title3' => '报名用户' + , 'num_tag' => '人', 'score_tag' => '分数'); + if ($kpi) { + return $data[$kpi][$title]; + } else { + return $data; + } + } +} diff --git a/common/models/app/licheb/Syt_activity_model.php b/common/models/app/licheb/Syt_activity_model.php new file mode 100644 index 00000000..78a495d7 --- /dev/null +++ b/common/models/app/licheb/Syt_activity_model.php @@ -0,0 +1,18 @@ +table_name, 'default'); + } +} diff --git a/common/models/app/licheb/Syt_biz_score_model.php b/common/models/app/licheb/Syt_biz_score_model.php new file mode 100644 index 00000000..68b6d79c --- /dev/null +++ b/common/models/app/licheb/Syt_biz_score_model.php @@ -0,0 +1,18 @@ +table_name, 'default'); + } +} diff --git a/common/models/receiver/Receiver_customers_model.php b/common/models/receiver/Receiver_customers_model.php index 7f3b7b86..602f74af 100644 --- a/common/models/receiver/Receiver_customers_model.php +++ b/common/models/receiver/Receiver_customers_model.php @@ -14,7 +14,7 @@ class Receiver_customers_model extends HD_Model private $status_arr = [-1 => '删除', 0 => '未见客户', 1 => '到店客户', 2 => '订单客户', 3 => '战败客户']; private $level = ['H', 'A', 'B', 'C', 'D']; - private $cfrom_arr = ['自有资源', '平台分配', '素材推广']; + private $cfrom_arr = ['自有资源', '平台分配', '素材推广', '私域活动']; private $cfrom_clues_arr = ['自然进店', '外展', 'DM', '转介绍', '其它','网站','外展外拓','垂直媒体','自媒体']; private $buy_time = [3, 7, 15, 30]; diff --git a/common/models/topics/Topic_module_button_model.php b/common/models/topics/Topic_module_button_model.php new file mode 100644 index 00000000..c921d4b6 --- /dev/null +++ b/common/models/topics/Topic_module_button_model.php @@ -0,0 +1,17 @@ +table_name, 'default'); + } +} \ No newline at end of file diff --git a/home/config/app.php b/home/config/app.php new file mode 100644 index 00000000..ac3eaca9 --- /dev/null +++ b/home/config/app.php @@ -0,0 +1,12 @@ +input_param(); + + //app_id是必需的 + $this->app_id = $app_id = $set_app_id ? $set_app_id : $this->input_param('app_id'); + $this->data['app_id'] = $app_id; + + $this->get_env(); + + $r = &load_cache('redis'); + $this->lc_redis = $r; + + //日志文件 + $class_name = lcfirst(get_class($this));//调用类的名称,子类或者当前类名称 + + $this->log_file = "h5_wxapp{$app_id}_{$class_name}.log"; + $this->log_dir = "h5_wxapp{$app_id}_{$class_name}"; + $this->redis_mcode = "wxapp_{$app_id}_mcode_"; + $this->white_mobile = array('18063762579'); + + $this->load->helper('cookie'); + + //根据app_id重载model + $this->load->rebuild_model($this->app_id); + + $this->load->library('hd_exception'); + } + + /** + * 所有方法请求入口 + * @param $method + * @return mixed + */ + function _remap($method){ + try{ + + if('index' == $method){ + $method = $this->request; + } else { + $method = $this->request.'_'. $method; + } + + if(!in_array($method, $this->white_appid) && !$this->app_id){ + debug_log("[error] ". __FUNCTION__ . "# not app_id", $this->log_file); + throw new Hd_exception('请求超时', 403); + } + + $data = $this->$method(); + + if($data['view']){//返回视图 + $this->data = array_merge($this->data, $data); + return $this->show_view($data['view'], $data['alone']); + } else {//返回json数据 + return $this->show_json($data); + } + } catch(Hd_exception $e){//处理异常 + $code = $e->getCode(); + $msg = $e->getMessage(); + + if($this->input->is_ajax_request()){ + return $this->show_json(array(), $code, $msg); + } else { + $this->data = array('heading' => 'Warning', 'message' => $msg); + return $this->show_view('errors/html/error_404'); + } + } + } + + /** + * 获取参数(只支持application/json格式) + * @param string $key + * @return array|mixed + */ + protected function input_param($key = ''){ + if($key){ + return $this->inputs[$key]; + } + + $request = $this->input->method(); + + switch($request){ + case 'post': + case 'put': + case 'delete': + $input = json_decode(file_get_contents('php://input'), true); + break; + default: + $input = $this->input->get(); + } + + $this->request = $request; + $this->inputs = $input; + return $this->inputs; + } + + /** + * @param $view + * @param $alone "独立页面" + */ + protected function show_view($view, $alone = false){ + if($alone){ + $this->load->view($view, $this->data); + } else{ + $this->load->view('h5/header',$this->data); + $this->load->view($view); + $this->load->view('h5/footer'); + } + } + + /** + * @param $data + * @param int $code + * @param string $msg + * @param string $url + */ + protected function show_json($data, $code = 200, $msg = 'success', $url = '') + { + if(!isset($data['code'])){ + $data = array('data' => $data, 'code' => $code, 'msg' => $msg, 'url' => $url); + } + + exit(json_encode($data)); + } + + /** + * @param $ukey + * @return array|mixed + */ + protected function api_session($ukey){ + $redis = &load_cache('redis'); + + $app_key = ""; + switch($this->app_id){ + case 1: + $app_key = "sbcard"; + break; + case 2: + $app_key= "xcard"; + } + + if(!$app_key){ + return array(); + } + + $redis_login = "wxapp_{$app_key}_login_"; + //data:{"uid":"用户ID", "session_key":"微信session_key"} + $data = $redis->get($redis_login.$ukey); + + $session = array(); + if($data){ + $session = json_decode($data, true); + } + + return $session; + } + + /** + * 获取环境 + */ + private function get_env(){ + if (false !== strpos($_SERVER['HTTP_HOST'], 'dev')) { //dev 测试 + $this->env = 'd'; + $this->host = "https://hd-wxdev.xiaoyu.com"; + $this->api_host = "https://hd-api-dev.xiaoyu.com"; + } elseif (false !== strpos($_SERVER['HTTP_HOST'], 'test')) {//test 测试 + $this->env = 't'; + $this->host = "https://www-test.haodian.cn"; + $this->api_host = "https://api.test.haodian.cn"; + } else { // 正式 + $this->env = 'p'; + $this->host = "https://www.haodian.cn"; + $this->api_host = "https://api.haodian.cn"; + } + } +} diff --git a/home/controllers/h5/syt/Myqrcode.php b/home/controllers/h5/syt/Myqrcode.php new file mode 100644 index 00000000..2a169efe --- /dev/null +++ b/home/controllers/h5/syt/Myqrcode.php @@ -0,0 +1,51 @@ +input->get('url'); + if ($url) { + $errorCorrectionLevel = 'L'; //容错级别 + $matrixPointSize = 5; //生成图片大小 + //生成二维码图片 + QRcode::png($url, false, $errorCorrectionLevel, $matrixPointSize, 1); + } + } + + function save() + { + $basedir = ''; + $saveDir = '要保存的目录地址'; + if (!is_dir($saveDir)) { + mkdir($basedir); + chmod($basedir, 0777); + } + if (is_dir($saveDir)) { + $filename = $saveDir . '/qrcode.png'; + $qrcode_content = 'hello qrcode';//二维码的内容 + ob_clean(); + QRcode::png($qrcode_content, $filename); + echo $filename; + } else { + exit('目录创建失败'); + } + } + +} \ No newline at end of file diff --git a/home/controllers/h5/syt/Special.php b/home/controllers/h5/syt/Special.php new file mode 100644 index 00000000..06f03b70 --- /dev/null +++ b/home/controllers/h5/syt/Special.php @@ -0,0 +1,652 @@ +secret = "2021_syt_h5_1119"; + //$this->load->helper('cookie'); + $this->load->model('app/licheb/syt_activity_model', 'mdSytActivity'); + $this->load->model('app/licheb/syt_activity_kpidata_model', 'mdSytActivityKpiData'); + $this->load->model('app/app_weixin_users_model', 'mdWeixinUsers'); + $this->load->model('receiver/receiver_customers_model', 'mdCustomers'); + $this->load->model("biz/biz_model", 'mdBiz'); + $ukey = get_cookie('ukey'); + if ($ukey) { + $this->session = json_decode(liche_authcode($ukey, 'DECODE', $this->secret), true); + $this->uid = $this->session['uid']; + } + //重置cookie + $reset = $this->input_param('reset'); + if ($reset) { + set_cookie("ukey", "", 86400 * 30); + $this->session = array(); + $this->uid = 0; + } + } + + /** + * Notes: + * https://liche-dev.xiaoyu.com/h5/syt/special + * https://liche-dev.xiaoyu.com/h5/syt/special?skey=YV9pZD03JmNmX3VpZD0yMSZiaXpfaWQ9MiZjZl9zaGFyZT1SNU5JS1c + * https://www.liche.cn/h5/syt/special + * Created on: 2021/8/26 11:19 + * Created by: dengbw + */ + function get() + { + $skey = $this->input->get('skey'); + //$skey = "YV9pZD03JmNmX3VpZD0yMSZiaXpfaWQ9MiZjZl9zaGFyZT1SNU5JS1c"; + if (!$skey) { + throw new Hd_exception("参数错误", 400); + } + $this->load->library('MyEncryption'); + $param = $this->myencryption->base64url_decode($skey); + //$skey = "a_id=7&cf_uid=24&biz_id=2&cf_share=" . $this->myencryption->random_string(6); + //echo $this->myencryption->base64url_encode($skey); + //print_r($param); + //exit; + $a_id = intval($param['a_id']);//活动id + $cf_uid = intval($param['cf_uid']);//来源用户id + $biz_id = intval($param['biz_id']);//门店id + $cf_share = $param['cf_share'];//分享 + $re_a = $this->mdSytActivity->get(array("id" => $a_id, "status" => 1)); + if (!$re_a) { + throw new Hd_exception("活动不存在", 400); + } + $url = http_host_com('home') . "/h5/syt/special?skey={$skey}"; + $this->set_auth($url); + $topic_ary = array('id' => $re_a['z_id'], 'a_id' => $a_id, '_title' => $re_a['title']); + $topic = $this->get_topic($topic_ary); + if (!$topic) { + throw new Hd_exception("专题不存在", 400); + } + if ($this->uid) { + $re_wu = $this->mdWeixinUsers->get(['id' => $this->uid]); + if ($re_wu) {//更新参数 + $jsondata = $re_wu['jsondata'] ? json_decode($re_wu['jsondata'], true) : ''; + $jsondata['syt'] = $param; + $this->mdWeixinUsers->update(['jsondata' => json_encode($jsondata, JSON_UNESCAPED_UNICODE)], ['id' => $this->uid]); + } + } + //一次性订阅 +// $re_s = $this->mdSytSubscribemsg->get(array('a_id' => $a_id, 'uid' => $this->uid)); +// if ($re_s) { +// $subscribemsg = '已订阅直播'; +// } else { +// $this->load->config('wechat'); +// $config = $this->config->item('liche'); +// $sub_redirect_url = urlencode(http_host_com('home') . '/h5/syt/special/subscribemsg?skey=' . $skey +// . '&s_time=' . $topic['mCountdown']['b_s_time']); +// $subscribemsg = "https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid={$config['appid']}&scene=0}&template_id=DO0B9IYYub1d0oNvy9czzGbe6_1EU8PQmnLEoDOcmXA&redirect_url={$sub_redirect_url}&reserved=test#wechat_redirect"; +// } +// $topic['subscribemsg'] = $subscribemsg; + $topic['subscribemsg'] = ''; + $a_img = $re_a['img'] ? build_qiniu_image_url($re_a['img']) : ''; + $a_title = $re_a['title'] ? $re_a['title'] : ''; + //微信分享 + $this->load->library('Jssdk'); + $jssdk = new Jssdk('liche'); + $sign_package = $jssdk->getSignPackage(); + $t_skey = $c_skey = ''; + if ($biz_id) {//门店 + $skey = "a_id=" . $a_id . "&cf_uid=" . $cf_uid . "&biz_id=" . $biz_id . "&cf_share=" . $this->myencryption->random_string(6); + $c_skey = "a_id=" . $a_id . "&cf_uid=" . $cf_uid . '&biz_id=' . $biz_id; + } else { + $skey = "a_id=" . $a_id . "&cf_uid=" . $cf_uid . "&cf_share=" . $this->myencryption->random_string(6); + $c_skey = "a_id=" . $a_id . '&cf_uid=' . $cf_uid; + } + //浏览 + $this->set_kpi_score(array('a_id' => $a_id, 'cf_uid' => $cf_uid, 'biz_id' => $biz_id, 'kpi' => 'browse')); + //分享 + $cf_share && $this->set_kpi_score(array('a_id' => $a_id, 'cf_uid' => $cf_uid, 'biz_id' => $biz_id, 'cf_share' => $cf_share, 'kpi' => 'share')); + $share_url = http_host_com('home') . "/h5/syt/special?skey=" . $this->myencryption->base64url_encode($skey); + $jsondata = $re_a['jsondata'] ? json_decode($re_a['jsondata'], true) : ''; + $share_title = $jsondata['share_title'] ? $jsondata['share_title'] : ''; + $posters = $jsondata['posters'] ? $jsondata['posters'] : ''; + $share = array( + 'title' => $a_title, + "img" => $a_img, + "desc" => $share_title, + "url" => $share_url + ); + //渠道获取统计代码 + $stat_code = ""; +// if ($t_id) { +// $where = array('id' => $t_id); +// $row = $this->mdSytActivityTeam->get($where); +// $row['declaration'] && $stat_code = $row['declaration']; +// } + $topic['a_skey'] = $this->myencryption->base64url_encode("a_id=" . $a_id); + $topic['c_skey'] = $this->myencryption->base64url_encode($c_skey); + $topic['t_skey'] = $t_skey; + $topic['a_id'] = $a_id; + $topic['cf_uid'] = $cf_uid; + $topic['biz_id'] = $biz_id; + $topic['uid'] = $this->uid; + $topic['posters'] = $posters; + $topic['stat_code'] = $stat_code; + $data = array( + '_title' => $a_title, + 'view' => 'h5/syt/special', + 'topic' => $topic, + "sign_package" => $sign_package, + "share" => $share, + ); + return $data; + } + + private function get_topic($param = array()) + { + $data = $list = $mButton = array(); + $mCountdown = array('b_e_time' => 0, 'b_s_time' => 0); + $this->load->model('app/App_model', 'mdApp'); + $this->load->model('topics/topics_model', 'mdTopics'); + $this->load->model('topics/topic_modules_model', 'mdTopicModules'); + $this->load->model('topics/topic_module_text_model', 'mdModuleText'); + $this->load->model('topics/topic_module_ad_model', 'mdModuleAd'); + $this->load->model('topics/topic_module_enroll_model', 'mdModuleEnroll'); + $this->load->model('topics/topic_module_button_model', 'mdModuleButton'); +// $this->load->model('topics/topic_module_countdown_model', 'mdModuleCountdown'); + $re = $this->mdTopics->get(array('id' => $param['id'], 'app_id' => $this->app_id)); + if (!$re) { + return $data; + } + $appConfig = array(); + $mp_app_id = $mp_app_name = ''; + $ebiz = 0; + if ($re['jsondata']) { + $topics_jsondata = $re['jsondata'] ? json_decode($re['jsondata'], true) : array(); + if ($topics_jsondata['mp_app_id']) { + $appConfig = $this->mdApp->appConfig()[$topics_jsondata['mp_app_id']]; + $mp_app_id = $topics_jsondata['mp_app_id']; + $mp_app_name = $appConfig['wx_kzh']['appname'] ? $appConfig['wx_kzh']['appname'] : '星师傅'; + } + $ebiz = intval($topics_jsondata['ebiz']); + } + $nickname = $mobile = $msgisReg = ''; + $module_ids = $re['module_ids']; + if ($module_ids) { + $where = is_numeric($module_ids) ? array('id' => $module_ids) : array("id in ({$module_ids})" => null); + $where['status'] = 1; + $total = $this->mdTopicModules->count($where); + if ($total) { + $select = 'id, type,jsondata'; + $rows = $this->mdTopicModules->select($where, 'sort DESC', 0, 0, $select); + foreach ($rows as $row_topic) { + $mid = $row_topic['id']; + $type = $row_topic['type']; + $json_topic = json_decode($row_topic['jsondata'], true); + $title_img = ""; + $title_icon = ""; + if ($json_topic['title_img']) { + $title_img = build_qiniu_image_url($json_topic['title_img']); + } else { + $title_icon = "https://qs.haodian.cn/wechat_app/xingxuanka/special/tt-tip2.png"; + } + switch ($type) { + case "countdown"://倒计时 + $module = $this->mdModuleCountdown->get(array('module_id' => $mid)); + $jsondata = $module['jsondata'] ? json_decode($module['jsondata'], true) : array(); + $b_s_time = $jsondata['time'] ? $jsondata['time'] : 0; + $b_e_time = strtotime($b_s_time) - time(); + $b_e_time < 0 && $b_e_time = 0; + $mCountdown = array( + 'title' => $module['title'] ? $module['title'] : '', + 'b_title' => $jsondata['title'] ? $jsondata['title'] : '', + 'b_mp_title' => $jsondata['mp_title'] ? $jsondata['mp_title'] : '', + 'b_ghid' => $appConfig['ghid'] ? $appConfig['ghid'] : '', + 'b_s_time' => $b_s_time, + 'b_e_time' => $b_e_time, + ); + break; + case "button"://按钮类型 + $module = $this->mdModuleButton->get(array('module_id' => $mid)); + $jsondata = $module['jsondata'] ? json_decode($module['jsondata'], true) : array(); + $ghid = $url = ''; + $url = $jsondata['url'] ? $jsondata['url'] : ''; + $url_mini = $jsondata['url_mini'] ? $jsondata['url_mini'] : '';//在小程序里连接 + if ($appConfig['ghid'] && (strstr($url, 'pages'))) {//跳转小程序 + $ghid = $appConfig['ghid']; + } + $mButton = array( + 'title' => $module['title'] ? $module['title'] : '', + 'type' => $module['type'], + 'b_url' => $url, + 'b_url_mini' => $url_mini, + 'b_title' => $jsondata['title'] ? $jsondata['title'] : '', + 'b_img' => $jsondata['img'] ? build_qiniu_image_url($jsondata['img']) : '', + 'b_color' => $jsondata['color'] ? $jsondata['color'] : '', + 'b_ghid' => $ghid, + ); + break; + case "text"://文本类型 + $module = $this->mdModuleText->get(array('module_id' => $mid)); + $list[] = array( + "type" => "text", + 'id' => $mid, + 'title' => $module['title'] ? $module['title'] : '', + "title_img" => $title_img, + "title_icon" => $title_icon, + "title_color" => $json_topic["title_color"] ? $json_topic["title_color"] : "#fff",//背景色, + "title_bgcolor" => $json_topic["title_bgcolor"] ? $json_topic["title_bgcolor"] : "#ee5b15",//背景色 + 'bg_img' => $json_topic['bg_img'] ? build_qiniu_image_url($json_topic['bg_img']) : "", + 'bg_color' => $json_topic["bg_color"] ? $json_topic["bg_color"] : '#ff0', + "border_color" => strval($json_topic['border_color']), + 'descrip' => $module['descrip'] ? $module['descrip'] : '', + 'content' => $module['content'] ? $module['content'] : '', + 'style' => 0, + 'ads' => array(), + ); + break; + case 'ad'://广告 + $module = $this->mdModuleAd->get(array('module_id' => $mid)); + $module_json = $module['img_json'] ? json_decode($module['img_json'], true) : array(); + $ads = array(); + foreach ($module_json as $ad) { + $url = strval($ad['link']); + $miniProgram = ''; + $img = $ad['img'] ? build_qiniu_image_url($ad['img']) : ''; + if ($appConfig['ghid'] && strstr($url, 'pages')) {//跳转小程序 + $img_class = $module['style'] == 2 ? 'wp100 block bds-f3' : 'wp100 block'; + $miniProgram = '
+
+ + +
'; + } + $is_item = false; + if (strpos($url, "wxapp/syt/item") !== false) { + $url .= "&__skey=" . $this->input_param('skey'); + $is_item = true; + } + $ads[] = array( + 'type' => 'ad', + 'img' => $img, + 'url' => $url ? $url : '', + 'miniProgram' => $miniProgram, + 'jump_type' => intval($ad['jump_type']), + 'is_item' => $is_item, + 'title' => $ad['title'] + ); + } + $title_img = ""; + $title_icon = ""; + if ($json_topic['title_img']) { + $title_img = build_qiniu_image_url($json_topic['title_img']); + } else { + $title_icon = "https://qs.haodian.cn/wechat_app/xingxuanka/special/tt-tip2.png"; + } + $list[] = array( + "type" => "ad", + 'id' => $mid, + 'title' => $module['title'] ? $module['title'] : '', + "title_img" => $title_img, + "title_icon" => $title_icon, + "title_color" => $json_topic["title_color"] ? $json_topic["title_color"] : "#fff",//背景色, + "title_bgcolor" => $json_topic["title_bgcolor"] ? $json_topic["title_bgcolor"] : "#fe7c35",//背景色 + 'bg_img' => $json_topic['bg_img'] ? build_qiniu_image_url($json_topic['bg_img']) : "", + 'bg_color' => $json_topic["bg_color"] ? $json_topic["bg_color"] : (2 == $module['style'] ? '#FFF' : ''), + "border_color" => strval($json_topic['border_color']), + 'descrip' => $module['descrip'] ? $module['descrip'] : '', + 'content' => '', + 'style' => $module['style'], + 'ads' => $ads, + ); + break; + case 'enroll'://报名活动 + $module = $this->mdModuleEnroll->get(array('module_id' => $mid)); + //处理状态字段 + $status = array("title" => "我要报名", "value" => 0); + //是否开始 + if (1 == $module['type']) { + $s_time = strtotime($module['as_time']); + $e_time = strtotime($module['ae_time']); + } else { + $s_time = strtotime($module['es_time']); + $e_time = strtotime($module['ee_time']); + } + if ($s_time > time()) { + $status = array("title" => "报名尚未开始", "value" => 2); + } elseif ($e_time < time()) { + $status = array("title" => "报名已截止", "value" => -2); + } + //判断是否还能参加报名 + if (0 == $status['value'] && $module['limit_num'] > 0) { + $where = array('a_id' => $param['a_id']); + $count = $this->mdSytActivityEnroll->count($where); + if ($count >= $module['limit_num']) { + $status = array("title" => "报名人数已满", "value" => 3); + } + } + if ($this->uid) {//是否报名 + $re_enroll = []; + $this->session['mobile'] && $re_enroll = $this->mdCustomers->get(array('cf_id' => $this->cf_id, 't_id' => $param['a_id'], 'mobile' => $this->session['mobile'])); + if ($re_enroll) { + $status = array("title" => "已报名", "value" => 1); + } else { + $reUsers = $this->mdWeixinUsers->get(array('id' => $this->uid)); + $nickname = $reUsers['nickname'] ? $reUsers['nickname'] : ''; + $mobile = $reUsers['mobile'] ? $reUsers['mobile'] : ''; + } + } + $jsondata = $module['jsondata'] ? json_decode($module['jsondata'], true) : array(); + $if_code = intval($jsondata['if_code']);//是否验证手机 + if ($jsondata["show_type"] == 1) { + $msgisReg = array( + 'title' => $module['title'] ? $module['title'] : '报名', + 'if_code' => $if_code, + 'status' => $status); + break; + } + + $info = array( +// array("title" => "姓名", "field" => "input", "key" => "uname"), +// array("title" => "手机号", "field" => "mobile", "key" => "mobile"), +// array("title" => "备注", "field" => "input", "key" => "remark"), + ); + $record = array(); + $date_arr = array( + date('Y.m.d'), + date('Y.m.d', strtotime("-1 day")), + date('Y.m.d', strtotime("-2 day")), + date('Y.m.d', strtotime("-3 day")) + ); + $num = 10; + $res = $this->mdCustomers->select(array('cf_id' => $this->cf_id, 't_id' => $param['a_id']), 'c_time desc', 1, $num); + if ($res) { + foreach ($res as $key2 => $val2) { + $nick_name = $val2['nickname']; + $len = mb_strlen($nick_name, 'UTF-8'); + if ($len >= 3) { + $nick_name = mb_substr($nick_name, 0, 1, 'UTF-8') . '*' . mb_substr($nick_name, -1, 1, 'UTF-8'); + } else { + $nick_name = mb_substr($nick_name, 0, 1, 'UTF-8') . '*'; + } + $record[] = date('Y.m.d', $val2['c_time']) . ' ' . $nick_name . ' 报名了 ' . $param['_title']; + } + } + $num = $num - count($record); + if ($num) { + for ($i = 0; $i < $num; $i++) { + $record[] = $date_arr[array_rand($date_arr)] . ' ' . rand_name() . ' 报名了 ' . $param['_title']; + } + } + $list[] = array( + "type" => "enroll", + 'id' => $mid, + 'title' => $module['title'] ? $module['title'] : '', + "title_img" => $title_img, + "title_icon" => $title_icon, + "title_color" => $json_topic["title_color"] ? $json_topic["title_color"] : "#fff",//背景色, + "title_bgcolor" => $json_topic["title_bgcolor"] ? $json_topic["title_bgcolor"] : "#ee5b15",//背景色 + 'bg_img' => $json_topic['bg_img'] ? build_qiniu_image_url($json_topic['bg_img']) : "", + 'bg_color' => $json_topic["bg_color"] ? $json_topic["bg_color"] : '#fff', + "border_color" => strval($json_topic['border_color']), + 'descrip' => $module['descrip'] ? $module['descrip'] : '', + 'content' => $module['content'] ? $module['content'] : '', + 'style' => 0, + 'if_code' => $if_code, + 'ads' => array(), + 'status' => $status, + 'info' => $info, + 'record' => $record + ); + break; + default: + } + } + } + } + + $data = array( + 'id' => $param['id'], + 'title' => $re['title'], + 'bg_img' => build_qiniu_image_url($re['bg_img']), + 'bg_color' => $re['bg_color'], + 'ebiz' => $ebiz, + 'list' => $list, + 'name' => $nickname, + 'telPhone' => $mobile, + 'vCode' => '', + 'codeState' => true, + 'codeTx' => '获取验证码', + 'isSubmiting' => false, + 'mButton' => $mButton, + 'mCountdown' => $mCountdown, + "bundleIntervalEvent" => '', + 'msgisShowCode' => false, + 'msgisRegShow' => false, + "qrcode" => '', + "logintelPhone" => '', + "loginvCode" => '', + "logincodeState" => true, + "logincodeTx" => '获取验证码', + "loginBundleIntervalEvent" => '', + 'loginBackurl' => '', + "msgisLoginShowCode" => false, + "needLogin" => $reUsers['mobile'] ? false : true, + 'mp_app_id' => $mp_app_id, + 'mp_app_name' => $mp_app_name, + 'msgisReg' => $msgisReg, + ); + return $data; + } + + /** + * Notes:生成海报 + * Created on: 2022/1/20 16:35 + * Created by: dengbw + * @return array + * @throws Hd_exception + */ + protected function get_poster() + { + $skey = $this->input_param('skey'); + if (!$skey) { + throw new Hd_exception("参数错误", 400); + } + $this->load->library('MyEncryption'); + $param = $this->myencryption->base64url_decode($skey); + $a_id = intval($param['a_id']);//活动id + $cf_uid = intval($param['cf_uid']); + $biz_id = intval($param['biz_id']);//门店id + $re_a = $this->mdSytActivity->get(array("id" => $a_id, "status" => 1)); + if (!$re_a) { + throw new Hd_exception("活动不存在", 400); + } + $url = http_host_com('home') . "/h5/wxapp/syt/special/poster?skey={$skey}"; + $this->set_auth($url); + if ($biz_id) {//门店 + $skey = "a_id=" . $a_id . "&cf_uid=" . $cf_uid . "&biz_id=" . $biz_id . "&cf_share=" . $this->myencryption->random_string(6); + } else { + $skey = "a_id=" . $a_id . "&cf_uid=" . $cf_uid . "&cf_share=" . $this->myencryption->random_string(6); + } + $share_url = http_host_com('home') . "/h5/syt/special?skey=" . $this->myencryption->base64url_encode($skey); + $qr_cod = '/h5/syt/myqrcode/get?url=' . $share_url; + $posters = array(); + if ($re_a['jsondata']) { + $jsondata = json_decode($re_a['jsondata'], true); + if ($jsondata['posters']) {//海报 + foreach ($jsondata['posters'] as $key => $value) { + $posters[] = array("img" => build_qiniu_image_url($value['url']), "code" => $qr_cod, + "width" => $value['width'], "height" => $value['height']); + } + } + } + $this->load->library('Jssdk'); + $jssdk = new Jssdk('liche'); + $sign_package = $jssdk->getSignPackage(); + $data = array( + '_title' => '生成海报', + 'posters' => $posters, + 'sign_package' => $sign_package, + 'view' => 'h5/syt/special_poster', + ); + return $data; + } + + /** + * Notes:活动报名 + * Created on: 2020/11/3 14:36 + * Created by: dengbw + * @throws Hd_exception + */ + function post_enroll() + { + $params = $this->input->post(); + $mobile = $params['mobile']; + $code = $params['code']; + $nickname = $params['nickname']; + $if_code = $params['if_code']; + if (!$nickname) { + throw new Hd_exception('请输入昵称', 400); + } + if (!mobile_valid($mobile)) { + throw new Hd_exception('手机号码不正确', 400); + } + $key = ''; + if (!$if_code) {//0开启,1关闭 + if (!$code) { + throw new Hd_exception('请输入验证码', 400); + } + $key = $this->redis_mcode . $mobile; + if (!in_array($mobile, $this->white_mobile)) {//校验手机号 + $code_check = $this->lc_redis->get($key); + if (!$code || $code != $code_check) { + throw new Hd_exception("验证码不正确", 400); + } + } + } + $params['cf_platform'] = 'h5'; + $params['mobile'] = $mobile; + $params['nickname'] = $nickname; + $params['uid'] = $this->uid; + $params['cf_id'] = $this->cf_id; + $this->load->library('entity/syt_entity'); + $syt_entity = new Syt_entity(array('app_id' => $this->app_id)); + $results = $syt_entity->kpi_enroll_log($params); + if ($results['code'] == 400) { + throw new Hd_exception($results['msg'], $results['code']); + } + $key && $this->lc_redis->delete($key); + throw new Hd_exception($results['msg'], $results['code']); + } + + /** + * Notes:获取短信验证码 + * Created on: 2020/10/14 22:10 + * Created by: dengbw + * @throws Hd_exception + */ + protected function get_mcode() + { + $mobile = $this->input_param('mobile'); + $title = $this->input_param('title'); + if (!mobile_valid($mobile)) { + throw new Hd_exception('手机号码不正确', 400); + } + $key = $this->redis_mcode . $mobile; + $code = $this->lc_redis->get($key); + if (!$code) { + $this->load->helper('string'); + $code = random_string('numeric', 6); + $this->lc_redis->save($key, $code, 600); + } + $content = "【狸车】您正在参与{$title}报名,验证码 {$code}"; + b2m_send_sms($mobile, $content); + throw new Hd_exception('发送成功', 200); + } + + /** + * Notes:设置kpi加分 + * Created on: 2020/10/15 10:09 + * Created by: dengbw + * @param array $param + */ + private function set_kpi_score($param = array()) + { + $param['uid'] = $this->uid; + if ($param['a_id'] && $param['uid'] && ($param['cf_uid'] || $param['biz_id'])) { + $this->load->library('entity/syt_entity'); + $syt_entity = new Syt_entity(array('app_id' => $this->app_id)); + $syt_entity->kpi_log($param); + } + } + + /** + * Notes:未登录授权登录 + * Created on: 2020/10/28 21:07 + * Created by: dengbw + * @param $url + */ + protected function set_auth($url) + { + if ("wx" == checkua() && !$this->uid) { + $this->load->helper('url'); + $config['appid'] = 'wxe66f905683582780';//小红榜授权 + $config['appSecret'] = '9546cd4de877be13ce203f3e6140633f'; + $this->load->config('wechat'); + $config = $this->config->item('liche'); + $code = $this->input->get('code'); + $auth = 1;//是否信息授权 + $auth && $url .= "&auth={$auth}"; + if ($code) {//授权码获取微信信息 + $auth_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$config['appid']}&secret={$config['appSecret']}&code={$code}&grant_type=authorization_code"; + $res = file_get_contents($auth_url); + $ret = json_decode($res, true); + $openid = $ret['openid']; + $unionid = $ret['unionid']; + $mobile = ''; + if ($openid) { + $row_wechat = $this->mdWeixinUsers->get(array('openid' => $openid)); + if (!$row_wechat) {//用户授权信息未记录到wechat + $info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$ret['access_token']}&openid={$openid}&lang=zh_CN"; + $res = file_get_contents($info_url); + $ret = json_decode($res, true); + $unionid = $ret['unionid']; + $add = array( + 'nickname' => strval($ret['nickname']), + "headimg" => strval($ret['headimgurl']), + "unionid" => $unionid, + "openid" => $openid, + "app_id" => $this->app_id, + "c_time" => time() + ); + $this->uid = $this->mdWeixinUsers->add($add); + if (!$this->uid) { + debug_log("[error]# " . $this->mdWeixinUsers->db->last_query(), __FUNCTION__, $this->log_dir); + } + } else { + !$unionid && $unionid = $row_wechat['unionid']; + $this->uid = $row_wechat['id']; + $mobile = $row_wechat['mobile']; + } + } + if ($this->uid) { + $session = array('uid' => $this->uid, "unionid" => $unionid, "mobile" => $mobile); + $ukey = liche_authcode(json_encode($session, JSON_UNESCAPED_UNICODE), 'ENCODE', $this->secret); + set_cookie("ukey", $ukey, 86400 * 30); + } + } elseif ($auth) {//信息授权获取用户微信昵称/头像 + $redirect_uri = urlencode($url); + $auth_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$config['appid']}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; + redirect($auth_url); + } elseif (!$this->session) {//静默授权获取用户openid + $redirect_uri = urlencode($url); + $auth_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$config['appid']}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"; + redirect($auth_url); + } + } + } + +} diff --git a/home/libraries/Hdwechat.php b/home/libraries/Hdwechat.php new file mode 100644 index 00000000..63c16cf9 --- /dev/null +++ b/home/libraries/Hdwechat.php @@ -0,0 +1,215 @@ +init($config); + } + + /** + * @param $config ('appid', 'secret') + */ + function init($config){ + $this->appid = $config['appid']; + $this->secret = $config['secret']; + $this->token_url = $config['token_url']; + + $CI = & get_instance(); + $CI->load->library("hd_wechat", $config); + /*这里用new的方式,因为load如果对象已经存在,会去取旧的,不会生成新配置的对象*/ + $this->hd_wechat = new Hd_wechat($config); + } + + /** + * 获取或者重置access_token + * @param $reset (是否重置) + * @return mixed + */ + function access_token($reset = false){ + + $this->access_token = $this->hd_wechat->access_token($reset); + + return $this->access_token; + } + + + /** + * 生成二维码 + * @param $filename (文件名称) + * @param $scene (最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式) + * @param $page (必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面) + * @param $width (二维码的宽度,单位 px,最小 280px,最大 1280px,默认430px) + * @return array {'file':'文件路径', 'url':'访问相对路径'} + */ + function wxacode($filename, $scene, $page, $width){ + $file = APPPATH . '../www/home/wx/wxacode/' . $filename . '.png'; + $dir = substr($file, 0, strrpos($file, '/')); + if(!is_dir($dir)){ + $ret = mkdir($dir, 0777, true);// 如果文件夹不存在,将以递归方式创建该文件夹 + if(!$ret){ + debug_log("[error] ". __FUNCTION__ . ": mkdir {$ret}, filename:{$filename}, scene:{$scene}, page:{$page}, width:{$width}", $this->log_file); + return array(); + } + } + + if(file_exists($file)){ + return array('file' => $file, 'url' => 'wx/wxacode/' . $filename . '.png'); + } + + $pre_url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='; + $url = $pre_url . $this->access_token(); + $data = array( + 'scene' => $scene, + 'page' => $page, + 'width' => $width ? $width : 430, + ); + + list($code, $res) = $this->curl_post($url, $data); + $ret = json_decode($res, true); + + if(isset($ret['errcode']) && 40001 == $ret['errcode']){//token过期,重置后请求 + $url = $pre_url . $this->access_token(true); + list($code, $res) = $this->curl_post($url, $data); + $ret = json_decode($res, true); + } + + if(isset($ret['errcode'])){ + debug_log("[error] ". __FUNCTION__ . ": httpcode:{$code}, response:{$res}, filename:{$filename}, scene:{$scene}, page:{$page}, width:{$width}", $this->log_file); + return array(); + } + + $ret = file_put_contents($file, $res); + if(false === $ret){ + debug_log("[error] ". __FUNCTION__ . ": file_put_contents {$ret}, filename:{$filename}, scene:{$scene}, page:{$page}, width:{$width}", $this->log_file); + return array(); + } + + return array('file' => $file, 'url' => 'wx/' . $filename . '.png'); + } + + function qrcode($filename, $scene, $type = 0, $expire = 0){ + $file = APPPATH . '../www/home/wx/qrcode/' . $filename . '.png'; + $file_url = 'wx/qrcode/' . $filename . '.png'; + $dir = substr($file, 0, strrpos($file, '/')); + if(!is_dir($dir)){ + $ret = mkdir($dir, 0777, true);// 如果文件夹不存在,将以递归方式创建该文件夹 + if(!$ret){ + debug_log("[error] ". __FUNCTION__ . ": mkdir {$ret}, filename:{$filename}, scene:{$scene}", $this->log_file); + return array(); + } + } + + if(file_exists($file)){ + return array('file' => $file, 'url' => $file_url); + } + + if(is_numeric($scene)){ + $action_info = array( + 'scene' => array('scene_id' => $scene) + ); + $action_name = $type ? 'QR_LIMIT_SCENE' : 'QR_SCENE'; + } else { + $action_info = array( + 'scene' => array('scene_str' => $scene) + ); + $action_name = $type ? 'QR_LIMIT_STR_SCENE' : 'QR_STR_SCENE'; + } + + $data = array( + 'action_name' => $action_name, + 'action_info' => $action_info + ); + $expire && $data['expire_seconds'] = $expire; + + $qr_url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='; + $url = $qr_url . $this->access_token(); + + //请求获取二维码的ticket + list($code, $res) = $this->curl_post($url, $data); + $ret = json_decode($res, true); + + if(isset($ret['errcode']) && 40001 == $ret['errcode']){//token过期,重置后请求 + $url = $qr_url . $this->access_token(true); + list($code, $res) = $this->curl_post($url, $data); + $ret = json_decode($res, true); + } + + if(isset($ret['errcode'])){ + debug_log("[error] ". __FUNCTION__ . ": httpcode:{$code}, response:{$res}, filename:{$filename}, scene:{$scene}", $this->log_file); + return array(); + } + + if(!$ret['ticket']){ + debug_log("[error] ". __FUNCTION__ . ": not ticket, filename:{$filename}, scene:{$scene}", $this->log_file); + return array(); + } + + //根据ticket获取 + $ticket_url='https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.$ret['ticket']; + + debug_log("[info] ". __FUNCTION__ . ": ticket_url=$ticket_url", $this->log_file); + + $ret = file_put_contents($file, $this->url_get($ticket_url)); + if(false === $ret){ + debug_log("[error] ". __FUNCTION__ . ": file_put_contents {$ret}, filename:{$filename}, scene:{$scene}", $this->log_file); + return array(); + } + + return array('file' => $file, 'url' => $file_url); + } + + /** + * @param $url + * @param $data + * @return array + */ + private function curl_post($url, $data){ + debug_log("[info] ". __FUNCTION__ . ":url={$url}, data=".json_encode($data), $this->log_file); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + $res = curl_exec($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + $size = strlen($res); + if($size > 5000){ + debug_log("[info] ". __FUNCTION__ . ":httpcode={$code}, response is big only show size={$size}", $this->log_file); + } else { + debug_log("[info] ". __FUNCTION__ . ":httpcode={$code}, response={$res}", $this->log_file); + } + + return array($code, $res); + } + + /** + * @param $url + * @return string + */ + private function url_get($url){ + $res = file_get_contents($url); + debug_log("[info] ". __FUNCTION__ . ":url={$url}, res={$res}", $this->log_file); + return $res; + } +} \ No newline at end of file diff --git a/home/libraries/Jssdk.php b/home/libraries/Jssdk.php new file mode 100644 index 00000000..4fa21937 --- /dev/null +++ b/home/libraries/Jssdk.php @@ -0,0 +1,85 @@ +appId = $group['appid']; + $this->appSecret = $group['appSecret']; + } else { + $CI->load->config('wechat'); + $config =$CI->config->item($group); + + $this->appId = $config['appid']; + $this->appSecret = $config['appSecret']; + } + + $r = &load_cache('redis'); + $this->redis = $r->redis(); + + $param = array('appid' => $this->appId, "secret" => $this->appSecret); + $CI->load->library("hd_wechat", $param); + $this->hd_wechat = $CI->hd_wechat; + $this->hd_wechat->init($param); + } + + public function getSignPackage() + { + $jsapiTicket = $this->getJsApiTicket(); + $url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; + + if($_SERVER['QUERY_STRING']) + { + //$url .= '?'.$_SERVER['QUERY_STRING']; + } + + $timestamp = time(); + $nonceStr = $this->createNonceStr(); + + // 这里参数的顺序要按照 key 值 ASCII 码升序排序 + $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; + $signature = sha1($string); + + $signPackage = array( + "appId" => $this->appId, + "nonceStr" => $nonceStr, + "timestamp" => $timestamp, + "url" => $url, + "signature" => $signature, + "rawString" => $string, + 'jsapi_ticket' => $jsapiTicket + ); + + return $signPackage; + } + + private function createNonceStr($length = 16) + { + $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + $str = ""; + for ($i = 0; $i < $length; $i++) + { + $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); + } + + return $str; + } + + private function getJsApiTicket() + { + $ticket = $this->hd_wechat->api_ticket(); + return $ticket; + } +} diff --git a/home/views/h5/footer.php b/home/views/h5/footer.php new file mode 100644 index 00000000..98709269 --- /dev/null +++ b/home/views/h5/footer.php @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/home/views/h5/header.php b/home/views/h5/header.php new file mode 100644 index 00000000..18d15ba0 --- /dev/null +++ b/home/views/h5/header.php @@ -0,0 +1,16 @@ + + + + + + + + <?=isset($_title)?$_title:''?> + + + + + + + \ No newline at end of file diff --git a/home/views/h5/syt/special.php b/home/views/h5/syt/special.php new file mode 100644 index 00000000..34478b2f --- /dev/null +++ b/home/views/h5/syt/special.php @@ -0,0 +1,825 @@ + + + + + + + <?= $_title ?> + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ +
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
+ + +
+
+
+
+ +
+ + + +
+
+ + +
+
+
+
+
+ +
+ + + +
+
+
+
+
+
+ +
+ + + +
+
+
+ + +
+
+
+
+
+ +
+ + + +
+
+
+
+
+
+ +
+ + + +
+
+
+
+
+
+ +
+ + + +
+
+
+ +
+ + +
+ +
+
+
+
+
+
{{item}} +
+
+
+
+
+
+ +
+
报名昵称
+
+
+
+
手机号码
+
+ +
+
+
验证码
+
+
+ +
+ +
+ +
+ +
+
+
+
+ + +
+ Powered by + + 好店云 +
+ + + + +
+
+
+
+ +
+ +
+
+ + + + +
+
+ + +
+ +
+
+
+ +
+
+
+
+
+
+
+ +
+
长按识别二维码,关注{{mp_app_name}}服务号。即可接收直播提醒,还有更多福利不定期放送哦~ +
+
+
+ 知道了 +
+
+
+
+ +
+
+
+
+
+
绑定手机号
+
+ +
+
+
+ +
+
+
+ 确定 +
+ +
+
+
+ +
+
+
+
+
+
{{msgisReg.title}}
+ +
+ +
+ +
+ +
+
+
+ +
+
+ + +
+
+
+ +
+ +
+ +
+ + + + + diff --git a/home/views/h5/syt/special_poster.php b/home/views/h5/syt/special_poster.php new file mode 100644 index 00000000..a5401159 --- /dev/null +++ b/home/views/h5/syt/special_poster.php @@ -0,0 +1,158 @@ + + + + + + + <?= $_title ?> + + + + + + + + + + + + +
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ + 长按图片保存到手机发送给好友 +
+
+
+
+ +
+ + + + \ No newline at end of file diff --git a/www/home/MP_verify_6KCtCFAFCutAcUIU.txt b/www/home/MP_verify_6KCtCFAFCutAcUIU.txt new file mode 100644 index 00000000..043bdcc7 --- /dev/null +++ b/www/home/MP_verify_6KCtCFAFCutAcUIU.txt @@ -0,0 +1 @@ +6KCtCFAFCutAcUIU \ No newline at end of file diff --git a/www/home/css/h5/syt/special.css b/www/home/css/h5/syt/special.css new file mode 100644 index 00000000..3da98b46 --- /dev/null +++ b/www/home/css/h5/syt/special.css @@ -0,0 +1 @@ +@charset "UTF-8";/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%;font-family:sans-serif}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-.267vw}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}.inner10{padding:1.333vw}.inner20{padding:2.667vw}.inner30{padding:4vw}.inner40{padding:5.333vw}.ulib-r0{border-radius:0!important}.ulib-r5{border-radius:.667vw}.ulib-r10{border-radius:1.333vw}.ulib-rl10{-webkit-border-top-left-radius:1.333vw;-webkit-border-bottom-left-radius:1.333vw;border-top-left-radius:1.333vw;border-bottom-left-radius:1.333vw}.ulib-r20{border-radius:2.667vw}.ulib-r750{border-radius:100vw}.ulib-rl750{-webkit-border-top-left-radius:100vw;-webkit-border-bottom-left-radius:100vw;border-top-left-radius:100vw;border-bottom-left-radius:100vw}.ulib-rt20{border-top-left-radius:2.667vw;border-top-right-radius:2.667vw}.ulib-rlt10{border-top-left-radius:1.333vw}.mt0{margin-top:0!important}.mt5{margin-top:.667vw}.mt10{margin-top:1.333vw}.mt15{margin-top:2vw}.mt20{margin-top:2.667vw}.mt25{margin-top:3.333vw}.mt30{margin-top:4vw}.mt40{margin-top:5.333vw}.mt60{margin-top:8vw}.mt70{margin-top:9.333vw}.mt110{margin-top:14.667vw}.mt120{margin-top:16vw}.ml5{margin-left:.667vw}.ml10{margin-left:1.333vw}.ml20{margin-left:2.667vw}.ml30{margin-left:4vw}.ml40{margin-left:5.333vw}.ml60{margin-left:8vw}.ml100{margin-left:13.333vw}.mr5{margin-right:.667vw}.mr10{margin-right:1.333vw}.mr20{margin-right:2.667vw}.mr30{margin-right:4vw}.mr40{margin-right:5.333vw}.mr100{margin-right:13.333vw}.mr110{margin-right:14.667vw}.mb5{margin-bottom:.667vw}.mb10{margin-bottom:1.333vw}.mb20{margin-bottom:2.667vw}.mb30{margin-bottom:4vw}.mb40{margin-bottom:5.333vw}.mb80{margin-bottom:10.667vw}.pt0{padding-top:0!important}.pt3{padding-top:.4vw}.pt5{padding-top:.667vw}.pt10{padding-top:1.333vw}.pt15{padding-top:2vw}.pt20{padding-top:2.667vw}.pt25{padding-top:3.333vw}.pt30{padding-top:4vw}.pt40{padding-top:5.333vw}.pt50{padding-top:6.667vw}.pt80{padding-top:10.667vw}.pt100{padding-top:13.333vw}.pl0{padding-left:0!important}.pl5{padding-left:.667vw}.pl10{padding-left:1.333vw}.pl15{padding-left:2vw}.pl20{padding-left:2.667vw}.pl25{padding-left:3.333vw}.pl30{padding-left:4vw}.pl40{padding-left:5.333vw}.pl60{padding-left:8vw}.pl70{padding-left:9.333vw}.pl80{padding-left:10.667vw}.pl100{padding-left:13.333vw}.pl140{padding-left:18.667vw}.pl160{padding-left:21.333vw}.pl170{padding-left:22.667vw}.pl180{padding-left:24vw}.pl190{padding-left:25.333vw}.pl200{padding-left:26.667vw}.pl210{padding-left:28vw}.pl250{padding-left:33.333vw}.pr0{padding-right:0!important}.pr5{padding-right:.667vw}.pr10{padding-right:1.333vw}.pr15{padding-right:2vw}.pr20{padding-right:2.667vw}.pr30{padding-right:4vw}.pr40{padding-right:5.333vw}.pr60{padding-right:8vw}.pr100{padding-right:13.333vw}.pr200{padding-right:26.667vw}.pr220{padding-right:29.333vw}.pb0{padding-bottom:0!important}.pb5{padding-bottom:.667vw}.pb10{padding-bottom:1.333vw}.pb15{padding-bottom:2vw}.pb20{padding-bottom:2.667vw}.pb25{padding-bottom:3.333vw}.pb30{padding-bottom:4vw}.pb40{padding-bottom:5.333vw}.pb50{padding-bottom:6.667vw}.pb60{padding-bottom:8vw}.pb100{padding-bottom:13.333vw}.btn{display:inline-block;text-align:center;border:none;vertical-align:middle;cursor:pointer;-webkit-transition:all .15s ease 0s;transition:all .15s ease 0s}.btn:active{box-shadow:inset 0 .4vw .667vw rgba(0,0,0,.125)}.btn[disabled]{background-color:#aaa;color:#777}.btn-green{background:#68bc79}.btn-gray{background:#ccc}.btn-ffb03f{background:#ffb03f}.btn-f03b26{background:#f03b26}.bds-f3{border:#f3f3f3 1px solid}.bds-ccc{border:#ccc 1px solid}.bds-eee{border:#eee 1px solid}.bts-eee{border-top:#eee 1px solid}.bls-eee{border-left:#eee 1px solid}.brs-eee{border-right:#eee 1px solid}.bbs-eee{border-bottom:#eee 1px solid}.last-b-none:last-child{border-bottom:none}.bds-2-bf{border:#bfbfbf .267vw solid}.bds-ee3423{border:#ee3423 1px solid}.bds-2-e6{border:#e6e6e6 .267vw solid;box-sizing:border-box}.bts-20-f6{border-top:#f6f6f6 2.667vw solid}.bts-1-eb{border-top:#eee 1px solid}.bds-1-fe4c0e{border-bottom:1px solid #fe4c0e}.bts-1-ffa564{border-top:1px solid #ffa564}.border-none{border:none}.color-fff{color:#fff}.color-ccc{color:#ccc}.color-333{color:#333}.color-666{color:#666}.color-888{color:#888}.color-999{color:#999}.color-bbb{color:#bbb}.color-ffae00{color:#ffae00}.color-68bc79{color:#68bc79}.color-ee3423{color:#ee3423}.color-ffd83f{color:#ffd83f}.color-ffd7d3{color:#ffd7d3}.color-f7471a{color:#f7471a}.color-fddf32{color:#fddf32}.color-ffb03f{color:#ffb03f}.color-26cf7e{color:#26cf7e}.color-ff7919{color:#ff7919}.color-fe2643{color:#fe2643}.color-ff9000{color:#ff9000}.color-980002{color:#980002}.color-ffd9ac{color:#ffd9ac}.color-fb5250{color:#fb5250}.color-ffb759{color:#ffb759}.color-138ce1{color:#138ce1}.bg-none{background:0 0}.bg-eee{background-color:#eee}.bg-fff{background-color:#fff}.bg-fa{background-color:#fafafa}.bg-f5{background-color:#f5f5f5}.bg-f6{background-color:#f6f6f6}.bg-f7{background-color:#f7f7f7}.bg-68bc79{background-color:#68bc79}.bg-ccc{background-color:#ccc}.bg-999{background-color:#999}.bg-ee3423{background-color:#ee3423}.bg-ffd83f{background-color:#ffd83f}.bg-fddf32{background-color:#fddf32}.bg-ffb03f{background-color:#ffb03f}.bg-ff6f02{background-color:#ff6f02}.bg-ff7919{background-color:#ff7919}.bg-ff9000{background-color:#ff9000}.bg-00d8a0{background-color:#00d8a0}.bg-9d0002{background-color:#9d0002}.bg-f5e5e5{background-color:#f5e5e5}.bg-d43232{background-color:#d43232}.bg-138ce1{background-color:#138ce1}.bg-e7f3fc{background-color:#e7f3fc}.bg-000-op50{background-color:rgba(0,0,0,.5)}.bg-000-op80{background-color:rgba(0,0,0,.8)}.fn-clear:after,.fn-clear:before{content:"";display:table}.fn-clear:after{clear:both}.fn-clear{zoom:1}.fn-fl{float:left}.fn-fr{float:right}.fn-flex{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row;-webkit-box-align:stretch;align-items:stretch}.fn-flex-center{-webkit-box-align:center;align-items:center}.fn-flex-item{display:block;-webkit-box-flex:1;flex:1}.fn-flex-item[flexsize="2"]{-webkit-box-flex:2;flex:2}.fn-flex-item[flexsize="3"]{-webkit-box-flex:3;flex:3}.fn-flex-item[flexsize="4"]{-webkit-box-flex:4;flex:4}.fn-flex-item[flexsize="5"]{-webkit-box-flex:5;flex:5}.fn-flex-item[flexsize="6"]{-webkit-box-flex:6;flex:6}.fn-flex-item[flexsize="7"]{-webkit-box-flex:7;flex:7}.fn-flex-item[flexsize="8"]{-webkit-box-flex:8;flex:8}.fn-flex-item[flexsize="9"]{-webkit-box-flex:9;flex:9}.fn-flex-itemfixed{-webkit-box-flex:0;flex:0 0 auto}.fn-flex-between{-webkit-box-pack:justify;justify-content:space-between}.fn-flex-content-center{-webkit-box-pack:center;justify-content:center}.fn-flex-wrap{flex-wrap:wrap}.block{display:block}.inline-block{display:inline-block}.fn-hide{display:none}.overflowhidden{overflow:hidden}.scroll-x{overflow-x:auto}.scroll-y{overflow-y:auto}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.top-0{top:0}.left-0{left:0}.bottom-0{bottom:0}.right-0{right:0}.z-index-0{z-index:0}.z-index-1{z-index:1}.z-index-2{z-index:2}.z-index-3{z-index:3}.z-index-4{z-index:4}.box-center-middle{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.box-middle{top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.box-center{left:50%;-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.box-shadow{box-shadow:0 0 1.333vw rgba(0,0,0,.15)}.wp80{width:80%;box-sizing:border-box}.wp100{width:100%;box-sizing:border-box}.img-cover{background-repeat:no-repeat;background-position:center center;background-size:100% auto}.fiximg{max-width:100%}.wp10{width:10%;box-sizing:border-box!important}.wp20{width:20%;box-sizing:border-box!important}.wp25{width:25%;box-sizing:border-box!important}.wp33{width:33%;box-sizing:border-box!important}.wp30{width:30%;box-sizing:border-box!important}.wp40{width:40%;box-sizing:border-box!important}.wp50{width:50%;box-sizing:border-box!important}.wp60{width:60%!important;box-sizing:border-box!important}.wp65{width:65%!important;box-sizing:border-box!important}.wp70{width:70%!important;box-sizing:border-box!important}.wp80{width:80%!important;box-sizing:border-box!important}.wp90{width:90%;box-sizing:border-box!important}.wp100{width:100%;box-sizing:border-box!important}.wp110{width:110%;box-sizing:border-box!important}.icon-jiazai{display:inline-block;-webkit-animation:rotate linear 1.2s infinite;animation:rotate linear 1.2s infinite}@-webkit-keyframes rotate{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.opacity-70{opacity:.7}.line-height-0{line-height:0}.line-height-15{line-height:1.5}.line-height-17{line-height:1.7}.line-height-20{line-height:2}.container{min-height:calc(100vh - 14.667vw)}.text-nowrap{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-underline{text-decoration:underline}.text-through{text-decoration:line-through}.text-middle{vertical-align:middle}.text-lighter{font-weight:400}.text-bold{font-weight:600}.text-break{word-break:break-all;word-wrap:break-word}.space-nowrap{white-space:nowrap}.space-normal{white-space:normal}.text-light{font-weight:lighter}.text-normal{font-weight:400}.line-clamp-2{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}.line-clamp-3{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}.line-height-13{line-height:1.3}.line-height-15{line-height:1.5}.line-height-17{line-height:1.7}.font-18{font-size:2.4vw}.font-20{font-size:2.667vw}.font-22{font-size:2.933vw}.font-24{font-size:3.2vw}.font-26{font-size:3.467vw}.font-28{font-size:3.733vw}.font-30{font-size:4vw}.font-32{font-size:4.267vw}.font-34{font-size:4.533vw}.font-36{font-size:4.8vw}.font-38{font-size:5.067vw}.font-40{font-size:5.333vw}.font-42{font-size:5.6vw}.font-44{font-size:5.867vw}.font-46{font-size:6.133vw}.font-48{font-size:6.4vw}.font-50{font-size:6.667vw}.font-62{font-size:8.267vw}.font-70{font-size:9.333vw}.font-80{font-size:10.667vw}.font-90{font-size:12vw}.img-30x21{width:4vw;height:2.8vw;box-sizing:border-box}.img-24x24{width:3.2vw;height:3.2vw;box-sizing:border-box}.img-30x30{width:4vw;height:4vw;box-sizing:border-box}.img-42x42{width:5.6vw;height:5.6vw;box-sizing:border-box}.img-45x45{width:6vw;height:6vw;box-sizing:border-box}.img-50x50{width:6.667vw;height:6.667vw;box-sizing:border-box}.img-52x52{width:6.667vw;height:6.667vw;box-sizing:border-box}.img-75x75{width:10vw;height:10vw;box-sizing:border-box}.img-120x120{width:16vw;height:16vw;box-sizing:border-box}.img-130x130{width:17.333vw;height:17.333vw;box-sizing:border-box}.img-140x140{width:18.667vw;height:18.667vw;box-sizing:border-box}.img-160x160{width:21.333vw;height:21.333vw;box-sizing:border-box}.img-175x175{width:23.333vw;height:23.333vw;box-sizing:border-box}.img-170x170{width:22.667vw;height:22.667vw;box-sizing:border-box}.img-180x180{width:24vw;height:24vw;box-sizing:border-box}.img-220x220{width:29.333vw;height:29.333vw;box-sizing:border-box}.img-315x166{width:42vw;height:22.133vw;box-sizing:border-box}.img-315x264{width:42vw;height:35.2vw;box-sizing:border-box}.img-315x430{width:42vw;height:57.333vw;box-sizing:border-box}.img-710x288{width:94.667vw;height:38.4vw;box-sizing:border-box}.img-630x280{width:84vw;height:37.333vw;box-sizing:border-box}.img-750x380{width:100%;height:50.667vw;box-sizing:border-box}.img-750x450{width:100%;height:60vw;box-sizing:border-box}.img-750x560{width:100%;height:74.667vw;box-sizing:border-box}.img-750x750{width:100%;height:100vw;box-sizing:border-box}.img-750x820{width:100%;height:109.333vw;box-sizing:border-box}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_1778318_ux2utnaduln.eot?t=1587889255235);src:url(//at.alicdn.com/t/font_1778318_ux2utnaduln.eot?t=1587889255235#iefix) format("embedded-opentype"),url("data:application/x-font-woff2;charset=utf-8;base64,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") format("woff2"),url(//at.alicdn.com/t/font_1778318_ux2utnaduln.woff?t=1587889255235) format("woff"),url(//at.alicdn.com/t/font_1778318_ux2utnaduln.ttf?t=1587889255235) format("truetype"),url(//at.alicdn.com/t/font_1778318_ux2utnaduln.svg?t=1587889255235#iconfont) format("svg")}.iconfont{font-family:iconfont!important;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-checked:before{content:"\e61c"}.icon-shuoming:before{content:"\e632"}.icon-guize:before{content:"\e633"}.icon-chenggong:before{content:"\e742"}.icon-wode:before{content:"\e67a"}.icon-home:before{content:"\e601"}.icon-shouye1:before{content:"\e6c9"}.icon-dagou:before{content:"\e603"}.icon-dianpuren:before{content:"\e662"}.icon-camera-b:before{content:"\e619"}.icon-xihuan:before{content:"\e76a"}.icon-youjiantou:before{content:"\e663"}.icon-_remen:before{content:"\e600"}.icon-huiyuan1:before{content:"\e641"}.icon-shoucang:before{content:"\e7a9"}.icon-shijian:before{content:"\e62e"}.icon-jiazai:before{content:"\eb7b"}.icon-My:before{content:"\e615"}.icon-guanbi3:before{content:"\e613"}.icon-xiangji:before{content:"\e616"}.icon-kefu:before{content:"\e610"}.icon-xiazai:before{content:"\e675"}.icon-youhui:before{content:"\e60c"}.icon-rms:before{content:"\e754"}.icon-dizhi:before{content:"\e646"}.icon-dianpu1:before{content:"\e739"}.icon-xiala1:before{content:"\e608"}.icon-shang:before{content:"\e62b"}.icon-fenlei:before{content:"\e609"}.icon-tianjia:before{content:"\e61f"}.icon-fenxiang:before{content:"\e691"}.icon-dingwei:before{content:"\e695"}.icon-bianji:before{content:"\e61e"}.icon-fenxiang1:before{content:"\e621"}.icon-weixin1:before{content:"\e604"}.icon-choice2:before{content:"\e6fe"}.icon-shouye:before{content:"\e62f"}.icon-tel:before{content:"\e63b"}.icon-quanbu:before{content:"\e61b"}.icon-loudou:before{content:"\e690"}.icon-fabu:before{content:"\e60d"}.icon-wenhao:before{content:"\ed36"}.icon-xiugai:before{content:"\e63f"}.icon-huati:before{content:"\e8b1"}.icon-huati1:before{content:"\e8c4"}.icon-xuanze1:before{content:"\e617"}.icon-xiaochengxugengduo_:before{content:"\e72d"}.icon-guangbo:before{content:"\e656"}.icon-pingjia1:before{content:"\e63a"}.icon-shop:before{content:"\e63c"}.icon-xihuan1:before{content:"\e623"}.icon-shoucang1:before{content:"\e624"}.icon-fanhui:before{content:"\eb7c"}.icon-gengduo:before{content:"\eb7d"}.icon-icon-test:before{content:"\e626"}.icon-icon-test1:before{content:"\e627"}.icon-icon-test2:before{content:"\e628"}.icon-icon-test3:before{content:"\e629"}.icon-icon-test4:before{content:"\e62a"}.icon-icon-test5:before{content:"\e62c"}.icon-icon-test6:before{content:"\e62d"}.icon-icon-test7:before{content:"\e630"}.icon-search:before{content:"\e60b"}.icon-lajitong:before{content:"\e622"}.icon-guanbi:before{content:"\e61a"}.icon-quo-right:before{content:"\e63d"}.icon-quo-left:before{content:"\e640"}.icon-bofang:before{content:"\e653"}.icon-time:before{content:"\e661"}.icon-tianjia1:before{content:"\e635"}.icon-gantanhao:before{content:"\e685"}.icon-dianpu:before{content:"\e655"}.icon-qianbao:before{content:"\e61d"}.icon-dingwei1:before{content:"\e66f"}.icon-weixin:before{content:"\e654"}.icon-book1:before{content:"\e631"}.icon-bj:before{content:"\e625"}.icon-linedesign:before{content:"\e66e"}.icon-guanbi1:before{content:"\e612"}.icon-dizhi1:before{content:"\e63e"}.icon-xiala:before{content:"\e87e"}.icon-zanxiao:before{content:"\e885"}.icon-guanbi2:before{content:"\e620"}.icon-dian:before{content:"\e679"}@-webkit-keyframes mDialogFadeIn{from{opacity:0}to{opacity:1}}@keyframes mDialogFadeIn{from{opacity:0}to{opacity:1}}.mDialogFadeIn{-webkit-animation-name:mDialogFadeIn;animation-name:mDialogFadeIn}@-webkit-keyframes mDialogFadeOut{from{opacity:1}to{opacity:0}}@keyframes mDialogFadeOut{from{opacity:1}to{opacity:0}}.mDialogFadeOut{-webkit-animation-name:mDialogFadeOut;animation-name:mDialogFadeOut}@-webkit-keyframes mDialogZoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes mDialogZoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.mDialogZoomIn{-webkit-animation-name:mDialogZoomIn;animation-name:mDialogZoomIn}@-webkit-keyframes mDialogZoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes mDialogZoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}.mDialogZoomOut{-webkit-animation-name:mDialogZoomOut;animation-name:mDialogZoomOut}@-webkit-keyframes mDialogBigIn{0%{opacity:0;-webkit-transform:scale(1.2,1.2);transform:scale(1.2,1.2)}100%{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1)}}@keyframes mDialogBigIn{0%{opacity:0;-webkit-transform:scale(1.2,1.2);transform:scale(1.2,1.2)}100%{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1)}}.mDialogBigIn{-webkit-animation-name:mDialogBigIn;animation-name:mDialogBigIn}@-webkit-keyframes mDialogBigOut{0%{opacity:1}100%{opacity:0;-webkit-transform:scale(1.2,1.2);transform:scale(1.2,1.2)}}@keyframes mDialogBigOut{0%{opacity:1}100%{opacity:0;-webkit-transform:scale(1.2,1.2);transform:scale(1.2,1.2)}}.mDialogBigOut{-webkit-animation-name:mDialogBigOut;animation-name:mDialogBigOut}.mDialog-layer-container{visibility:hidden;position:fixed;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;box-sizing:border-box}.mDialog-layer-container *{box-sizing:border-box}.mDialog-layer-container.mDialog-layer-container-full>.mDialog-layer-title{border-radius:0}.mDialog-layer-container.mDialog-layer-container-full>.mDialog-layer-main{border-radius:0}.mDialog-layer-container.mDialog-layer-container-full>.mDialog-layer-btns{border-radius:0}.mDialog-layer-title{border-radius:2.6667vw 2.6667vw 0 0;background:#f5f5f5;clear:both;border-bottom:1px solid #d5d5d5;padding:2.6667vw;overflow:hidden;font-size:4.8vw}.mDialog-layer-main{word-break:break-all;word-wrap:break-word;overflow:hidden;font-size:4.2667vw}.mDialog-layer-main:after{content:"";display:table;clear:both}.mDialog-layer-main.mDialog-layer-main-full>div{height:100%;overflow:hidden}.mDialog-layer-main>div{position:relative}.mDialog-layer-btns{clear:both;border-top:1px solid #e8e8e8;background:#fff;border-radius:0 0 2.6667vw 2.6667vw;display:-webkit-box;display:flex}.mDialog-layer-btns>.mDialog-btn{-webkit-box-flex:1;flex:1;display:block;text-align:center;position:relative;color:#007aff;font-size:4.8vw;padding:2.6667vw 0}.mDialog-layer-btns>.mDialog-btn:after{content:"";position:absolute;left:0;top:0;width:1px;height:100%;border-left:1px solid #d5d5d5;color:#d5d5d5}.mDialog-layer-btns>.mDialog-btn:active{background-color:rgba(0,0,0,.05)}.mDialog-layer-btns>.mDialog-btn:first-child:after{border-left:0}.mDialog-close{position:absolute;width:8.667vw;height:8.667vw;overflow:hidden;right:0;top:0;margin-top:-4.3333vw;margin-right:-4.3333vw;border-radius:100%;background-color:#000}.mDialog-close:before{-webkit-transform:rotate(45deg);transform:rotate(45deg);content:'';position:absolute;top:50%;left:1.3333vw;right:1.3333vw;background:#fff;height:.8vw;margin-top:-.4vw;border-radius:1.0667vw}.mDialog-close:after{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);content:'';position:absolute;top:50%;left:1.3333vw;right:1.3333vw;background:#fff;height:.8vw;margin-top:-.4vw;border-radius:1.0667vw}.mDialog-shade{position:fixed;left:0;top:0;right:0;bottom:0;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}.mDialog-shade.in{-webkit-animation-name:mDialogFadeIn;animation-name:mDialogFadeIn}.mDialog-shade.out{-webkit-animation-name:mDialogFadeOut;animation-name:mDialogFadeOut}.mDialog-default-section{background:#fff;font-size:4.2667vw;padding:2.6667vw}.mDialog-msg-section{background-color:rgba(0,0,0,.9);border-radius:2.6667vw;padding:4vw;color:#fff}@-webkit-keyframes line-spin-fade-loader{50%{opacity:.3}100%{opacity:1}}@keyframes line-spin-fade-loader{50%{opacity:.3}100%{opacity:1}}.mDialog-loading-section{background-color:rgba(0,0,0,.7);border-radius:2vw;padding:4vw 8vw;overflow:hidden}.mDialog-loading-section .loading-txt{font-size:4.2667vw;color:#fff;text-align:center;margin-top:2.6667vw;white-space:nowrap}.mDialog-loading-section .loading-icon{position:relative;width:16.533vw;height:16.533vw;margin:0 auto}.mDialog-loading-section .loading-icon>div{background-color:#fff;border-radius:.5333vw;-webkit-animation-fill-mode:both;animation-fill-mode:both;position:absolute;width:1.0667vw;height:4.8vw;margin-left:-.5333vw}.mDialog-loading-section .loading-icon>div:nth-child(1){top:11.733vw;left:50%;-webkit-animation:line-spin-fade-loader 1.2s .12s infinite ease-in-out;animation:line-spin-fade-loader 1.2s .12s infinite ease-in-out}.mDialog-loading-section .loading-icon>div:nth-child(2){top:10.7173vw;left:10.7173vw;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation:line-spin-fade-loader 1.2s .24s infinite ease-in-out;animation:line-spin-fade-loader 1.2s .24s infinite ease-in-out}.mDialog-loading-section .loading-icon>div:nth-child(3){top:8.533vw;left:11.733vw;-webkit-transform-origin:top center;transform-origin:top center;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-animation:line-spin-fade-loader 1.2s .36s infinite ease-in-out;animation:line-spin-fade-loader 1.2s .36s infinite ease-in-out}.mDialog-loading-section .loading-icon>div:nth-child(4){top:5.816vw;left:11.733vw;-webkit-transform:rotate(-135deg);transform:rotate(-135deg);-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation:line-spin-fade-loader 1.2s .48s infinite ease-in-out;animation:line-spin-fade-loader 1.2s .48s infinite ease-in-out}.mDialog-loading-section .loading-icon>div:nth-child(5){top:0;left:50%;-webkit-animation:line-spin-fade-loader 1.2s .6s infinite ease-in-out;animation:line-spin-fade-loader 1.2s .6s infinite ease-in-out}.mDialog-loading-section .loading-icon>div:nth-child(6){top:5.816vw;left:5.816vw;-webkit-transform-origin:top center;transform-origin:top center;-webkit-transform:rotate(135deg);transform:rotate(135deg);-webkit-animation:line-spin-fade-loader 1.2s .72s infinite ease-in-out;animation:line-spin-fade-loader 1.2s .72s infinite ease-in-out}.mDialog-loading-section .loading-icon>div:nth-child(7){top:8.2667vw;left:4.8vw;margin-left:-.5333vw;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation:line-spin-fade-loader 1.2s .84s infinite ease-in-out;animation:line-spin-fade-loader 1.2s .84s infinite ease-in-out}.mDialog-loading-section .loading-icon>div:nth-child(8){top:10.7173vw;left:5.816vw;margin-left:-.5333vw;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation:line-spin-fade-loader 1.2s .96s infinite ease-in-out;animation:line-spin-fade-loader 1.2s .96s infinite ease-in-out}.mDialog-loading-section.loading-notext{padding:8vw}.mDialog-confirm-section{background:#fff;padding:5.333vw 4vw;border-radius:2.6667vw 2.6667vw 0 0}.gohome{position:fixed;bottom:15.333vw;right:4vw;width:13.333vw;height:13.333vw;text-align:center;line-height:13.333vw;z-index:1000}*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}.clearfix:after{content:"";display:table;clear:both}input:focus,select:focus,textarea:focus{outline:0}em{font-style:normal}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none}a{text-decoration:none;color:#333}body,button,select,textarea{font-family:'\5FAE\8F6F\96C5\9ED1',Tahoma,Arial,Helvetica,sans-serif}html{width:100%;background-color:#fff}.mt80{margin-top:10.667vw}.pt80{padding-top:10.667vw}.btn-primary{border-radius:13.333vw;color:#fff;background-image:-webkit-gradient(linear,left bottom,left top,from(#04f8a1),to(#02fccd));background-image:linear-gradient(to top,#04f8a1,#02fccd);font-size:4.8vw}.btn-line-primary{border-radius:13.333vw;font-size:4.8vw;color:#02fccc;border:#02fccc solid 1px}.btn-pink{text-align:center;color:#fff;font-size:5.333vw;background-color:#ff128d}.font-60{font-size:8vw}.color-blue{color:#696cc6}.color-lightblue{color:#08daff}.color-lightforblue{text-shadow:.2rem 0 1rem #2d09b3,-.2rem 0 1rem #2d09b3,0 .2rem 1rem #2d09b3,0 -.2rem 1rem #2d09b3}html{background-color:#fff}img{max-width:100%}.index{width:100vw;min-height:100vh}.index .inp-reg{border:none}.index input[disabled]{background-color:#fff}.index .j-swiper{height:5.333vw;line-height:5.333vw;overflow:hidden}.index .time-pin{display:inline-block;min-width:6vw;margin:0 .667vw 0 2vw;padding:.667vw;box-sizing:border-box;vertical-align:middle;text-align:center}.index .viewlive{display:block;width:14.933vw;height:9.6vw;background-color:rgba(0,0,0,.8)}.index .icon-mine{bottom:24vw;right:1.333vw;width:16vw;height:16vw}.poster{width:100vw;height:100vh}.poster .p-swiper{width:100vw;height:100vh;overflow:hidden}.poster .swiper-container{position:absolute;width:100%;height:100vh}.poster .swiper-container .swiper-slide{width:100%;height:100vh;background-size:contain;background-position:center;overflow-y:auto}.poster .swiper-pagination-fraction{position:fixed;top:6.667vw;bottom:auto;left:auto;right:0;width:auto;padding:2vw 4vw;background-color:rgba(0,0,0,.8);font-size:30;color:#fff}.msg{position:fixed;left:0;top:0;width:100%;height:100%;z-index:1000}.msg .msgBgPoster{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.95)}.msg .msgBg{position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.8)}.msg .msgMain{position:fixed;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:9999}.msg .msgMain i.posterClose{position:absolute;top:-9.333vw;right:1.333vw;width:6.667vw;height:6.667vw;border-radius:100%;border:.4vw solid #fff}.msg .msgMain i.posterClose::after,.msg .msgMain i.posterClose::before{position:absolute;left:50%;top:50%;content:'';width:3.333vw;height:.267vw;background-color:#fff}.msg .msgMain i.posterClose::before{-webkit-transform:translate(-50%,-50%) rotate(-45deg);transform:translate(-50%,-50%) rotate(-45deg)}.msg .msgMain i.posterClose::after{-webkit-transform:translate(-50%,-50%) rotate(45deg);transform:translate(-50%,-50%) rotate(45deg)}.msg .msgMain i.posterClose span{display:block;position:absolute;top:6.4vw;left:2.933vw;height:2.667vw;border-left:.4vw solid #fff}.msg .msgMain i.close{position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);bottom:-8.267vw;width:6.667vw;height:6.667vw;border-radius:100%;border:.4vw solid #fff}.msg .msgMain i.close::after,.msg .msgMain i.close::before{position:absolute;left:50%;top:50%;content:'';width:3.333vw;height:.267vw;background-color:#fff}.msg .msgMain i.close::before{-webkit-transform:translate(-50%,-50%) rotate(-45deg);transform:translate(-50%,-50%) rotate(-45deg)}.msg .msgMain i.close::after{-webkit-transform:translate(-50%,-50%) rotate(45deg);transform:translate(-50%,-50%) rotate(45deg)}.msg .msgMain .msgPoster{width:80vw}.msg .msgMain .postercon{max-height:120vw;overflow-y:auto}.msg .msgMain .content{width:80vw;background-color:#fff;border-radius:1.333vw;padding:5.333vw}.msg .msgMain .content .word h2{font-size:4.8vw;padding-bottom:2vw}.msg .msgMain .content .word .desc{max-height:65vh;overflow-y:auto}.msg .msgMain .content .word p{margin:0 auto;color:#333;line-height:1.7}.msg .msgMain .content .opt{text-align:center;padding-top:2.667vw}.msg .msgMain .content .opt .btn{width:80%;height:9.333vw;line-height:9.333vw;display:inline-block;background-color:#1fbaa4;color:#fff;border-radius:133.333vw;font-size:3.733vw}.msg.msg-qrcode .content{width:62.667vw;background-size:100% auto;background-position:bottom center;background-repeat:no-repeat}.msg.msg-qrcode .content .time em{color:#0074f6}.msg.msg-qrcode .content .time span{margin-left:.667vw;text-decoration:underline}.msg.msg-qrcode .content .qrcode{padding-bottom:12vw;margin:8vw auto 0;width:33.333vw}.msg.msg-qrcode .content .qrcode span{display:block;background-color:#58bafe;border-radius:1.333vw;height:6.933vw;line-height:6.933vw}.msg.msg-tips .msgMain{width:77.333vw;min-height:54.667vw;border-radius:1.333vw;background-size:100% auto;background-repeat:no-repeat;background-position:bottom center}.msg.msg-tips .hd{height:11.733vw;line-height:11.733vw;background-color:#fafafa;border-top-left-radius:1.333vw;border-top-right-radius:1.333vw}.msg.msg-tips .bd{max-height:80vw;overflow:auto;line-height:1.7}.swiper-container{position:absolute;width:100%;height:100%}.swiper-container .swiper-slide{width:100%;height:100%;background-size:contain;background-position:center} \ No newline at end of file diff --git a/www/home/img/h5/syt/follow-bg.png b/www/home/img/h5/syt/follow-bg.png new file mode 100644 index 00000000..bbb9f71e Binary files /dev/null and b/www/home/img/h5/syt/follow-bg.png differ diff --git a/www/home/img/h5/syt/icon-1.png b/www/home/img/h5/syt/icon-1.png new file mode 100644 index 00000000..343e18a3 Binary files /dev/null and b/www/home/img/h5/syt/icon-1.png differ diff --git a/www/home/img/h5/syt/icon-2.png b/www/home/img/h5/syt/icon-2.png new file mode 100644 index 00000000..7a062885 Binary files /dev/null and b/www/home/img/h5/syt/icon-2.png differ diff --git a/www/home/img/h5/syt/icon-3.png b/www/home/img/h5/syt/icon-3.png new file mode 100644 index 00000000..b9002716 Binary files /dev/null and b/www/home/img/h5/syt/icon-3.png differ diff --git a/www/home/img/h5/syt/icon-4.png b/www/home/img/h5/syt/icon-4.png new file mode 100644 index 00000000..873a0acd Binary files /dev/null and b/www/home/img/h5/syt/icon-4.png differ diff --git a/www/home/img/h5/syt/icon-5.png b/www/home/img/h5/syt/icon-5.png new file mode 100644 index 00000000..9442af5c Binary files /dev/null and b/www/home/img/h5/syt/icon-5.png differ diff --git a/www/home/img/h5/syt/icon-finger.png b/www/home/img/h5/syt/icon-finger.png new file mode 100644 index 00000000..9b7e0df7 Binary files /dev/null and b/www/home/img/h5/syt/icon-finger.png differ diff --git a/www/home/img/h5/syt/icon-live.gif b/www/home/img/h5/syt/icon-live.gif new file mode 100644 index 00000000..579b012d Binary files /dev/null and b/www/home/img/h5/syt/icon-live.gif differ diff --git a/www/home/img/h5/syt/icon-live2.png b/www/home/img/h5/syt/icon-live2.png new file mode 100644 index 00000000..40e1d4e0 Binary files /dev/null and b/www/home/img/h5/syt/icon-live2.png differ diff --git a/www/home/img/h5/syt/icon-mine.png b/www/home/img/h5/syt/icon-mine.png new file mode 100644 index 00000000..290fb6a5 Binary files /dev/null and b/www/home/img/h5/syt/icon-mine.png differ diff --git a/www/home/img/h5/syt/icon-poster.gif b/www/home/img/h5/syt/icon-poster.gif new file mode 100644 index 00000000..c0c0e3b7 Binary files /dev/null and b/www/home/img/h5/syt/icon-poster.gif differ diff --git a/www/home/img/h5/syt/icon-team.png b/www/home/img/h5/syt/icon-team.png new file mode 100644 index 00000000..052a3cb3 Binary files /dev/null and b/www/home/img/h5/syt/icon-team.png differ diff --git a/www/home/img/h5/syt/invite-tt.png b/www/home/img/h5/syt/invite-tt.png new file mode 100644 index 00000000..eb182f0b Binary files /dev/null and b/www/home/img/h5/syt/invite-tt.png differ diff --git a/www/home/img/h5/syt/rank-1.png b/www/home/img/h5/syt/rank-1.png new file mode 100644 index 00000000..618ef032 Binary files /dev/null and b/www/home/img/h5/syt/rank-1.png differ diff --git a/www/home/img/h5/syt/rank-2.png b/www/home/img/h5/syt/rank-2.png new file mode 100644 index 00000000..99e6e523 Binary files /dev/null and b/www/home/img/h5/syt/rank-2.png differ diff --git a/www/home/img/h5/syt/rank-3.png b/www/home/img/h5/syt/rank-3.png new file mode 100644 index 00000000..3ec24e2c Binary files /dev/null and b/www/home/img/h5/syt/rank-3.png differ diff --git a/www/home/img/h5/syt/rank2-1.png b/www/home/img/h5/syt/rank2-1.png new file mode 100644 index 00000000..189edbc6 Binary files /dev/null and b/www/home/img/h5/syt/rank2-1.png differ diff --git a/www/home/img/h5/syt/rank2-2.png b/www/home/img/h5/syt/rank2-2.png new file mode 100644 index 00000000..58172304 Binary files /dev/null and b/www/home/img/h5/syt/rank2-2.png differ diff --git a/www/home/img/h5/syt/rank2-3.png b/www/home/img/h5/syt/rank2-3.png new file mode 100644 index 00000000..7ea2c8d7 Binary files /dev/null and b/www/home/img/h5/syt/rank2-3.png differ diff --git a/www/home/img/h5/syt/report-shadow.png b/www/home/img/h5/syt/report-shadow.png new file mode 100644 index 00000000..23cc520d Binary files /dev/null and b/www/home/img/h5/syt/report-shadow.png differ diff --git a/www/home/img/h5/syt/report-theme.jpg b/www/home/img/h5/syt/report-theme.jpg new file mode 100644 index 00000000..974a2370 Binary files /dev/null and b/www/home/img/h5/syt/report-theme.jpg differ diff --git a/www/home/img/h5/syt/share-tip.png b/www/home/img/h5/syt/share-tip.png new file mode 100644 index 00000000..f8156cf5 Binary files /dev/null and b/www/home/img/h5/syt/share-tip.png differ diff --git a/www/home/img/h5/syt/share-tip2.png b/www/home/img/h5/syt/share-tip2.png new file mode 100644 index 00000000..a1544bd4 Binary files /dev/null and b/www/home/img/h5/syt/share-tip2.png differ