Commit 62d73041165a13a64080241ad70f9622682d1509
1 parent
3777f29b
Exists in
master
app-wx
F 重新提交文件
Showing
36 changed files
with
1612 additions
and
0 deletions
Show diff stats
@@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
1 | +<?php namespace app\wx\assets; | ||
2 | + | ||
3 | +use yii\web\View; | ||
4 | +use yii\web\AssetBundle; | ||
5 | + | ||
6 | +/** | ||
7 | + * Class AppAsset | ||
8 | + * @package app\wx\assets | ||
9 | + */ | ||
10 | +class AppAsset extends AssetBundle | ||
11 | +{ | ||
12 | + public $sourcePath = '@webroot/dist'; | ||
13 | + public $css = [ | ||
14 | + 'css/mk7.css?v=0.0.9' | ||
15 | + ]; | ||
16 | + public $js = [ | ||
17 | + 'js/mk7.js' | ||
18 | + ]; | ||
19 | + public $jsOptions = [ | ||
20 | + 'position' => View::POS_HEAD | ||
21 | + ]; | ||
22 | + public $depends = [ | ||
23 | + ]; | ||
24 | + | ||
25 | +} |
@@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
1 | +<?php |
@@ -0,0 +1,44 @@ | @@ -0,0 +1,44 @@ | ||
1 | +<?php | ||
2 | +$params = array_merge( | ||
3 | + require(__DIR__ . '/../../common/config/params.php'), | ||
4 | + require(__DIR__ . '/../../common/config/params-local.php'), | ||
5 | + require(__DIR__ . '/params.php'), | ||
6 | + require(__DIR__ . '/params-local.php') | ||
7 | +); | ||
8 | + | ||
9 | +return [ | ||
10 | + 'id' => 'app-wx', | ||
11 | + 'basePath' => dirname(__DIR__), | ||
12 | + 'runtimePath' => Yii::getAlias('@rootRuntime').'/app-wx/', | ||
13 | + 'bootstrap' => ['log'], | ||
14 | + 'controllerNamespace' => 'app\wx\controllers', | ||
15 | + 'defaultRoute' => 'order', | ||
16 | + 'modules' => [ | ||
17 | + | ||
18 | + 'home' => [ | ||
19 | + 'class' => 'app\wx\modules\home\Module', | ||
20 | + ] | ||
21 | + ], | ||
22 | + 'components' => [ | ||
23 | + 'user' => [ | ||
24 | + 'class'=> 'app\wx\exts\User', | ||
25 | + 'identityClass' => 'app\wx\models\User', | ||
26 | + 'enableAutoLogin' => false,//是否启用自动登录 | ||
27 | + ], | ||
28 | + 'errorHandler' => [ | ||
29 | + 'errorAction' => 'site/error', | ||
30 | + ], | ||
31 | + 'assetManager' => [ | ||
32 | + 'forceCopy' => true, //每次都发布文件 | ||
33 | + 'appendTimestamp' => true, //后面加上时间戳,防止缓存。 | ||
34 | + ], | ||
35 | + | ||
36 | + 'urlManager' => [ | ||
37 | + 'enablePrettyUrl' => true, | ||
38 | + 'showScriptName' => false, | ||
39 | + 'rules' => [ | ||
40 | + ], | ||
41 | + ], | ||
42 | + ], | ||
43 | + 'params' => $params, | ||
44 | +]; |
@@ -0,0 +1,36 @@ | @@ -0,0 +1,36 @@ | ||
1 | +<?php | ||
2 | +namespace app\wx\controllers; | ||
3 | + | ||
4 | +use Yii; | ||
5 | +use yii\web\Controller; | ||
6 | + | ||
7 | +/** | ||
8 | + * 该基类的主要作用是,提供一个便利的方法集成。 | ||
9 | + */ | ||
10 | +class AppController extends Controller | ||
11 | +{ | ||
12 | + /** @var \yii\web\request **/ | ||
13 | + public $request; | ||
14 | + /** @var \yii\web\response **/ | ||
15 | + public $response; | ||
16 | + | ||
17 | + /** | ||
18 | + * @throws yii\web\HttpException | ||
19 | + */ | ||
20 | + public function init() | ||
21 | + { | ||
22 | + parent::init(); | ||
23 | + $this->request = Yii::$app->getRequest(); | ||
24 | + $this->response = Yii::$app->getResponse(); | ||
25 | + } | ||
26 | + | ||
27 | + /** | ||
28 | + * 渲染 JSON 数据结果 | ||
29 | + * @param $data | ||
30 | + * @return string | ||
31 | + */ | ||
32 | + public function renderJson($data) | ||
33 | + { | ||
34 | + return json_encode($data, JSON_UNESCAPED_UNICODE); | ||
35 | + } | ||
36 | +} | ||
0 | \ No newline at end of file | 37 | \ No newline at end of file |
@@ -0,0 +1,281 @@ | @@ -0,0 +1,281 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\wx\controllers; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use yii\helpers\Url; | ||
7 | +use yii\web\BadRequestHttpException; | ||
8 | +use yii\db\Query; | ||
9 | +use app\wx\models\Engineer; | ||
10 | +use common\helpers\WxHelper; | ||
11 | +use common\helpers\ImageManager; | ||
12 | +use common\exts\wechat\Log as WxLog; | ||
13 | +use common\helpers\Log as AppLog; | ||
14 | +use common\helpers\PerformanceUtils; | ||
15 | +use common\models\SysSetting; | ||
16 | +use domain\engineer\EngineerRole; | ||
17 | +use domain\engineer\EngineerStatus; | ||
18 | +use domain\engineer\EngineerSkillTagsRepository; | ||
19 | +use stdClass; | ||
20 | +use function header; | ||
21 | +use function in_array; | ||
22 | +use function md5; | ||
23 | +use function str_replace; | ||
24 | +use function urlencode; | ||
25 | + | ||
26 | + | ||
27 | +/** | ||
28 | + * 只有通过 微信 OAuth 验证后才能访问整个App, | ||
29 | + * 这是所有应用控制器的基类 | ||
30 | + * Class BaseController | ||
31 | + * @package app\wx\controllers | ||
32 | + * @author lee.li <34923862@qq.com> | ||
33 | + * @date 2015/07/01 | ||
34 | + */ | ||
35 | +class BaseController extends AppController | ||
36 | +{ | ||
37 | + /** | ||
38 | + * CSR验证,关闭后可以在不提交CSR验证码的情况下通过POST方式提交数据 | ||
39 | + * @var bool | ||
40 | + */ | ||
41 | + public $enableCsrfValidation = false; | ||
42 | + /** @var **/ | ||
43 | + protected $wx; | ||
44 | + /** @var **/ | ||
45 | + protected $site; | ||
46 | + | ||
47 | + /** | ||
48 | + * 初始化应用控制器,确保 mall id 的存在,有效启动程序,否则抛出异常。 | ||
49 | + * @throws yii\web\BadRequestHttpException | ||
50 | + * @throws yii\web\BadRequestHttpException | ||
51 | + */ | ||
52 | + public function init() | ||
53 | + { | ||
54 | + | ||
55 | + $this->initTempFilePaths(); | ||
56 | + | ||
57 | + parent::init(); | ||
58 | + | ||
59 | + $wxArray = $this->getWxArray(); | ||
60 | + | ||
61 | + //重置应用的名称 | ||
62 | + Yii::$app->name = $wxArray['name']; | ||
63 | + | ||
64 | + /** | ||
65 | + * 微信服务号配置 | ||
66 | + */ | ||
67 | + $this->wx = new stdClass(); | ||
68 | + $this->site = new stdClass(); | ||
69 | + | ||
70 | + $this->formatWx($wxArray); | ||
71 | + $this->formatSite($wxArray); | ||
72 | + | ||
73 | + $view = Yii::$app->view; | ||
74 | + $view->params['site']= $this->site; | ||
75 | + } | ||
76 | + | ||
77 | + /** | ||
78 | + * @return array|bool | ||
79 | + */ | ||
80 | + private function getWxArray() | ||
81 | + { | ||
82 | + $wxArray = [ | ||
83 | + 'name' => '配件维修', | ||
84 | + 'intro' => '报修', | ||
85 | + 'logo_path' => '', | ||
86 | + 'subscribe_title' => '报修', | ||
87 | + 'subscribe_desc' => '报修', | ||
88 | + 'subscribe_img' => '', | ||
89 | + 'subscribe_url' => '', | ||
90 | + 'appid' => 'appid', | ||
91 | + 'appsecret' => 'appsecret', | ||
92 | + 'token' => 'token' | ||
93 | + | ||
94 | + ]; | ||
95 | + return $wxArray; | ||
96 | + } | ||
97 | + | ||
98 | + /** | ||
99 | + * @param $wxArray | ||
100 | + */ | ||
101 | + private function formatWx($wxArray) | ||
102 | + { | ||
103 | + /** | ||
104 | + * 工程师微信服务号信息 | ||
105 | + */ | ||
106 | + $this->wx->name = $wxArray['name'];//名称 | ||
107 | + $this->wx->intro = $wxArray['intro'];//简介 | ||
108 | + $this->wx->logo_url = $wxArray['logo_path'];//路径 | ||
109 | + $this->wx->subscribe_title = $wxArray['subscribe_title']; // 公众号关注图文标题 | ||
110 | + $this->wx->subscribe_desc = $wxArray['subscribe_desc']; // 公众号关注图文描述 | ||
111 | + $this->wx->subscribe_img = $wxArray['subscribe_img']; // 公众号关注图文消息图片 | ||
112 | + $this->wx->subscribe_url = $wxArray['subscribe_url']; // 公众号关注图文url | ||
113 | + | ||
114 | + $this->wx->appid = $wxArray['appid'];// APPID | ||
115 | + $this->wx->appsecret = $wxArray['appsecret'];//APPSECRET | ||
116 | + $this->wx->token = $wxArray['token'];//微信TOKEN | ||
117 | + } | ||
118 | + | ||
119 | + /** | ||
120 | + * 获取 ID | ||
121 | + * @return int|string | ||
122 | + */ | ||
123 | + public function getEngineerId() | ||
124 | + { | ||
125 | + return 0; | ||
126 | + } | ||
127 | + | ||
128 | + /** | ||
129 | + * @param $wxArray | ||
130 | + */ | ||
131 | + private function formatSite($wxArray) | ||
132 | + { | ||
133 | + /** | ||
134 | + * 站点信息 | ||
135 | + */ | ||
136 | + $appUser = Yii::$app->getUser(); | ||
137 | + $url = Yii::$app->request->getHostInfo() . Yii::$app->request->url; | ||
138 | + $this->site->url = $url; | ||
139 | + if (YII_ENV_DEV) { | ||
140 | + $this->site->base_url = Yii::$app->request->getHostInfo() . Yii::$app->request->baseUrl; | ||
141 | + } else { | ||
142 | + $this->site->base_url = Yii::$app->request->getHostInfo(); | ||
143 | + } | ||
144 | + | ||
145 | + $am = Yii::$app->view->getAssetManager(); | ||
146 | + $assets = $am->getBundle('app\wx\assets\AppAsset'); | ||
147 | + | ||
148 | + $this->site->is_android = (int)$this->isAndroid(); | ||
149 | + $this->site->assets_url = $assets->baseUrl; | ||
150 | + $this->site->is_login = !$appUser->isGuest; | ||
151 | + $this->site->title = $wxArray['name']; | ||
152 | + $search = array("\t", "\n", "\r"); | ||
153 | + $this->site->desc = str_replace($search, '<br/>', $wxArray['intro']); | ||
154 | + $this->site->icon = $wxArray['logo_path']; | ||
155 | + | ||
156 | + // 携带当前用户的邀请码参数,实现推荐用户功能 | ||
157 | + $sn = ''; | ||
158 | + | ||
159 | + $baseUrl = $this->site->base_url; | ||
160 | + $this->site->user_bridge_url = $sn ? ($baseUrl . '/wechat/bridging?sn=' . $sn . '&tourl=' . urlencode($this->site->url)) : ''; | ||
161 | + $this->site->sn = $sn; | ||
162 | + | ||
163 | + $this->site->appid = 'appid'; | ||
164 | + $this->site->timestamp = time(); | ||
165 | + $this->site->noncestr = 'noncestr'; | ||
166 | + $this->site->signature = 'signature'; | ||
167 | + } | ||
168 | + | ||
169 | + /** | ||
170 | + * @return yii\web\Response | ||
171 | + */ | ||
172 | + protected function handleMallAccessCtrl() | ||
173 | + { | ||
174 | + //AppLog::DEBUG("BaseController: handleMallAccessCtrl()" ); | ||
175 | + $appUser = Yii::$app->getUser(); | ||
176 | + if(YII_ENV_DEV && $appUser->isGuest){ | ||
177 | + $uid = Yii::$app->params['testUID']; // 请在各自的config/params-local.php里配置 | ||
178 | + $appUser->login(0); | ||
179 | + $this->goHome(); | ||
180 | + return ; | ||
181 | + } | ||
182 | + //test和 prod 环境,进行微信登陆 | ||
183 | + if ($appUser->isGuest){ | ||
184 | + $this->handleOAuthRedirect(); | ||
185 | + } else { | ||
186 | + $path = $this->request->get('jumppath'); | ||
187 | + $model= $this->request->get('jumpmodel'); | ||
188 | + $paramOne= $this->request->get('paramOne'); | ||
189 | + if (!empty($path) && !empty($model)) { | ||
190 | + $locationUrl = Yii::$app->params["baseUrl"]."/".$model."#".$path; | ||
191 | + if (!empty($paramOne)) { | ||
192 | + $locationUrl .= "/".urldecode($paramOne); | ||
193 | + } | ||
194 | + header("Location: $locationUrl");exit; | ||
195 | + } | ||
196 | + } | ||
197 | + | ||
198 | + } | ||
199 | + | ||
200 | + /** | ||
201 | + * @return yii\web\Response | ||
202 | + */ | ||
203 | + private function handleOAuthRedirect() | ||
204 | + { | ||
205 | + $sn = Yii::$app->request->get("sn"); | ||
206 | + | ||
207 | + //Yii::$app->response->redirect($OAuthUrl)->send(); | ||
208 | + //Yii::$app->end(); | ||
209 | + } | ||
210 | + | ||
211 | + | ||
212 | + /** | ||
213 | + * 是否是IOS端 | ||
214 | + * 是否通过微信客户端来访问 | ||
215 | + * LOG 记录时发现, | ||
216 | + * 在微信公众号里面第一次访问: $_SERVER ['HTTP_USER_AGENT'] 为 Mozilla/4.0 | ||
217 | + * 第二次访问: $_SERVER ['HTTP_USER_AGENT'] 为 | ||
218 | + * 苹果: | ||
219 | + * Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13E238 MicroMessenger/6.3.16 NetType/WIFI Language/zh_CN | ||
220 | + * 安卓(小米NOTE): | ||
221 | + * Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9b4) Gecko/2008030317 Firefox/3.0b4 | ||
222 | + * @return bool | ||
223 | + */ | ||
224 | + protected function isAndroid() | ||
225 | + { | ||
226 | +// if(false !== strpos($_SERVER ['HTTP_USER_AGENT'], 'Android') || !isset($_SERVER ['HTTP_USER_AGENT'])){ | ||
227 | +// return true; | ||
228 | +// } else { | ||
229 | +// return false; | ||
230 | +// } | ||
231 | + return true; | ||
232 | + } | ||
233 | + | ||
234 | + // | ||
235 | + public function setPhoneCode($phone, $code) | ||
236 | + { | ||
237 | + Yii::$app->session['v_'.$phone] = array('create_time' => time(),'vCode' => md5($phone.'_'.$code)); | ||
238 | + } | ||
239 | + | ||
240 | + public function getPhoneCode($phone) | ||
241 | + { | ||
242 | + return Yii::$app->session['v_'.$phone]; | ||
243 | + } | ||
244 | + | ||
245 | + // 默认是300秒 | ||
246 | + public function validatePhoneCode($phone, $code, $vaTime = 300) | ||
247 | + { | ||
248 | + $pCode = $this->getPhoneCode($phone); | ||
249 | + $cTime = time(); | ||
250 | + if (empty($pCode)) { | ||
251 | + return -3; | ||
252 | + } | ||
253 | + if ($cTime > ($pCode['create_time'] + $vaTime)) { | ||
254 | + $this->unsetPhoneCode($phone); | ||
255 | + return -1; | ||
256 | + } | ||
257 | + if($pCode['vCode'] == md5($phone.'_'.$code)){ | ||
258 | + return 0; | ||
259 | + }else{ | ||
260 | + return -2; | ||
261 | + } | ||
262 | + } | ||
263 | + | ||
264 | + public function unsetPhoneCode($phone) | ||
265 | + { | ||
266 | + unset(Yii::$app->session['v_'.$phone]); | ||
267 | + } | ||
268 | + | ||
269 | + /** | ||
270 | + * 初始化web目录文件夹, 完成自动创建 | ||
271 | + */ | ||
272 | + private function initTempFilePaths() | ||
273 | + { | ||
274 | + // 临时文件 | ||
275 | + $webRoot = Yii::getAlias('@webroot'); | ||
276 | + $tmpFilePath = $webRoot . '/tmp'; | ||
277 | + if (!is_dir($tmpFilePath)) { | ||
278 | + mkdir($tmpFilePath, 0777, true); | ||
279 | + } | ||
280 | + } | ||
281 | +} | ||
0 | \ No newline at end of file | 282 | \ No newline at end of file |
@@ -0,0 +1,60 @@ | @@ -0,0 +1,60 @@ | ||
1 | +<?php namespace app\wx\controllers; | ||
2 | + | ||
3 | +use common\models\SysSetting; | ||
4 | +use yii; | ||
5 | + | ||
6 | +/** | ||
7 | + * 错误控制 | ||
8 | + * Class ErrorController | ||
9 | + * @package app\wx\controllers | ||
10 | + */ | ||
11 | +class ErrorController extends yii\web\Controller | ||
12 | +{ | ||
13 | + protected $site; | ||
14 | + public function init() | ||
15 | + { | ||
16 | + \yii::$app->name = '系统通知'; | ||
17 | + $this->site = new \stdClass(); | ||
18 | + $this->getSite(); | ||
19 | + $view = \yii::$app->view; | ||
20 | + $view->params['site'] = $this->site; | ||
21 | + } | ||
22 | + | ||
23 | + public function getSite() | ||
24 | + { | ||
25 | + | ||
26 | + $url = \yii::$app->request->getHostInfo() . \yii::$app->request->url; | ||
27 | + $this->site->url = $url; | ||
28 | + if(YII_ENV_DEV){ | ||
29 | + $this->site->base_url = \yii::$app->request->getHostInfo() . \yii::$app->request->baseUrl; | ||
30 | + } else { | ||
31 | + $this->site->base_url = \yii::$app->request->getHostInfo(); | ||
32 | + } | ||
33 | + $this->site->assets_url = $url; | ||
34 | + $this->site->title = '通知'; | ||
35 | + $this->site->desc = ''; | ||
36 | + $this->site->icon = ''; | ||
37 | + $this->site->appid = ''; | ||
38 | + $this->site->timestamp = ''; | ||
39 | + $this->site->noncestr = ''; | ||
40 | + $this->site->signature = ''; | ||
41 | + $this->site->user_bridge_url = ''; | ||
42 | + $this->site->sn = ''; | ||
43 | + | ||
44 | + return $this->site; | ||
45 | + } | ||
46 | + | ||
47 | + /** 系统暂停 | ||
48 | + * @return string | ||
49 | + */ | ||
50 | + public function actionStop() | ||
51 | + { | ||
52 | + $this->layout = 'site'; | ||
53 | + \yii::$app->name = '系统通知'; | ||
54 | + $viewTpl = '@app/wx/views/site/error/stop.php'; | ||
55 | + $siteInfo = SysSetting::getClientSiteInfo(); | ||
56 | + | ||
57 | + return $this->render($viewTpl,['stop_status'=> $siteInfo['stop'], 'stop_head'=> $siteInfo['stop_head'], 'stop_content'=> $siteInfo['stop_content']]); | ||
58 | + } | ||
59 | + | ||
60 | +} |
@@ -0,0 +1,199 @@ | @@ -0,0 +1,199 @@ | ||
1 | +<?php | ||
2 | +namespace app\wx\controllers; | ||
3 | + | ||
4 | +use Yii; | ||
5 | +use app\wx\models\Engineer; | ||
6 | +use common\models\EngineerProfile; | ||
7 | +use common\helpers\WxHelper; | ||
8 | +use common\models\SysSetting; | ||
9 | + | ||
10 | +use stdClass; | ||
11 | + | ||
12 | +/** | ||
13 | + * Site-控制器 | ||
14 | + * Class SiteController | ||
15 | + * @package app\wx\controllers | ||
16 | + */ | ||
17 | +class SiteController extends BaseController | ||
18 | +{ | ||
19 | + public $layout = 'site'; | ||
20 | + | ||
21 | + /** | ||
22 | + * @param yii\base\Action $action | ||
23 | + * @return bool | ||
24 | + * @throws yii\web\BadRequestHttpException | ||
25 | + */ | ||
26 | + public function beforeAction($action) | ||
27 | + { | ||
28 | + $view = Yii::$app->view; | ||
29 | + $view->params['site']= $this->site; | ||
30 | + | ||
31 | + //$this->handleMallAccessCtrl(); | ||
32 | + return parent::beforeAction($action); | ||
33 | + } | ||
34 | + | ||
35 | + /** | ||
36 | + * @return string | ||
37 | + * @return string HTML | ||
38 | + */ | ||
39 | + public function actionIndex() | ||
40 | + { | ||
41 | + //获取当前用户的模型model | ||
42 | + $engineerId = $this->getEngineerId(); | ||
43 | + $engineer = new stdClass(); | ||
44 | + /** | ||
45 | + * 构造user的共用信息 | ||
46 | + */ | ||
47 | + $engineer = $this->buildEngineerResult($engineerId); | ||
48 | + | ||
49 | + return $this->render('index', | ||
50 | + [ | ||
51 | + 'engineer' => $engineer, | ||
52 | + ] | ||
53 | + ); | ||
54 | + } | ||
55 | + | ||
56 | + private function buildEngineerResult($engineerId) | ||
57 | + { | ||
58 | + $query = Engineer::find() | ||
59 | + ->select(['engineer.id', 'engineer_profile.headimgurl','engineer_profile.nickname']) | ||
60 | + ->leftJoin('engineer_profile', "engineer.id = engineer_profile.engineer_id") | ||
61 | + ->where(['engineer.id' => $engineerId]); | ||
62 | + $query->asArray(); | ||
63 | + $engineerArray = $query->one(); | ||
64 | + | ||
65 | + if(empty($engineerArray)){ | ||
66 | + return false; | ||
67 | + } | ||
68 | + | ||
69 | + $engineer = new stdClass(); | ||
70 | + $engineer->id = (int)$engineerArray['id']; | ||
71 | + $engineer->headimgurl = $engineerArray['headimgurl']; | ||
72 | + $engineer->nickname = $engineerArray['nickname']; | ||
73 | + return $engineer; | ||
74 | + } | ||
75 | + | ||
76 | + | ||
77 | + /** | ||
78 | + * | ||
79 | + */ | ||
80 | + public function actionAjaxJweixin() | ||
81 | + { | ||
82 | + // 设置微信分享内容 | ||
83 | + $result = new stdClass(); | ||
84 | + | ||
85 | + $engineerId = $this->getEngineerId(); | ||
86 | + | ||
87 | + $baseUrl = $this->site->base_url; | ||
88 | + if (isset($_GET['from'])) { | ||
89 | + $url = $_GET['from']; | ||
90 | + } else { | ||
91 | + $url = $baseUrl; | ||
92 | + } | ||
93 | + | ||
94 | + $sign = WxHelper::getWxJSSDK()->getSignContext($url); | ||
95 | + | ||
96 | + $result->appid = $sign->appId; | ||
97 | + $result->timestamp = $sign->timestamp; | ||
98 | + $result->noncestr = $sign->nonceStr; | ||
99 | + $result->signature = $sign->signature; | ||
100 | + | ||
101 | + | ||
102 | + //$sn = $engineer ? urlencode(base64_encode($engineer->id)) : ''; | ||
103 | + // 携带当前用户的邀请码参数,实现推荐用户功能 | ||
104 | + $sn = ''; | ||
105 | + $engineer = Engineer::findOne($engineerId); | ||
106 | + if ($engineer) { | ||
107 | + if (empty($engineer->invite_code)) { | ||
108 | + $engineer->invite_code = Engineer::createInviteCode($engineerId); | ||
109 | + $engineer->save(); | ||
110 | + } | ||
111 | + $sn = $engineer->invite_code; | ||
112 | + } | ||
113 | + $result->user_bridge_url = $baseUrl . '/wechat/bridging?sn=' . $sn . '&tourl=' . urlencode($url); | ||
114 | + $result->sn = $sn; | ||
115 | + | ||
116 | + if ($engineer) { | ||
117 | + $profile = EngineerProfile::findOne(['engineer_id' => $engineer->id]); | ||
118 | + $result->title = $this->wx->name; | ||
119 | + $result->icon = $profile->headimgurl; | ||
120 | + } else { | ||
121 | + $result->title = $this->wx->name; | ||
122 | + $result->icon = ''; | ||
123 | + } | ||
124 | + $result->desc = $this->wx->intro; | ||
125 | + | ||
126 | + | ||
127 | + return $this->renderJson($result); | ||
128 | + } | ||
129 | + | ||
130 | + /* | ||
131 | + * 错误页面 | ||
132 | + */ | ||
133 | + public function actionError() | ||
134 | + { | ||
135 | + $this->layout = '/error'; | ||
136 | + | ||
137 | + $exception = Yii::$app->errorHandler->exception; | ||
138 | + if ($exception && isset($exception->statusCode)) { | ||
139 | + $code = $exception->statusCode; | ||
140 | + } | ||
141 | + // $viewTpl = 'error/' . $code . '.php'; | ||
142 | + $viewTpl = 'error/404.php'; | ||
143 | + | ||
144 | + return $this->render($viewTpl); | ||
145 | + } | ||
146 | + | ||
147 | + /** 封号提示 | ||
148 | + * @return string | ||
149 | + */ | ||
150 | + public function actionBlock() | ||
151 | + { | ||
152 | + $this->layout = '/error'; | ||
153 | + $viewTpl = 'error/block.php'; | ||
154 | + $service_phone = SysSetting::getServicePhone(); | ||
155 | + return $this->render($viewTpl,['service_phone'=>$service_phone]); | ||
156 | + } | ||
157 | + | ||
158 | + /** 关注提示 | ||
159 | + * @return string | ||
160 | + */ | ||
161 | + public function actionSubscribe() | ||
162 | + { | ||
163 | + $this->layout = '/error'; | ||
164 | + $viewTpl = 'error/subscribe.php'; | ||
165 | + $service_phone = SysSetting::getServicePhone(); | ||
166 | + return $this->render($viewTpl,['service_phone'=>$service_phone]); | ||
167 | + } | ||
168 | + | ||
169 | + /** | ||
170 | + * 未授权提示 | ||
171 | + */ | ||
172 | + public function actionNoOauth() | ||
173 | + { | ||
174 | + $this->layout = '/error'; | ||
175 | + $viewTpl = 'error/block.php'; | ||
176 | + $id = $this->request->get('id'); | ||
177 | + $service_phone = SysSetting::getServicePhone(); | ||
178 | + $errorMsg = '当前没有权限查看该内容'; | ||
179 | + if ($id == 1) { | ||
180 | + $errorMsg = '请进行认证以后再来查看该页面'; | ||
181 | + } | ||
182 | + return $this->render($viewTpl,['service_phone'=>$service_phone, 'errorMsg' => $errorMsg]); | ||
183 | + } | ||
184 | + | ||
185 | + public function actionIndex2() | ||
186 | + { | ||
187 | + | ||
188 | + return $this->renderPartial('index2'); | ||
189 | + } | ||
190 | + | ||
191 | + /** | ||
192 | + * 跳转到接单教程界面 | ||
193 | + */ | ||
194 | + public function actionToTutorialPage() | ||
195 | + { | ||
196 | + header("Location: http://mp.weixin.qq.com/mp/homepage?__biz=MzIyNDc5ODMwOA==&hid=1&sn=4f8b8972dc5f471a85618dde0f6a5987&scene=18"); | ||
197 | + exit; | ||
198 | + } | ||
199 | +} |
@@ -0,0 +1,112 @@ | @@ -0,0 +1,112 @@ | ||
1 | +<?php | ||
2 | +namespace app\wx\exts; | ||
3 | + | ||
4 | +use Yii; | ||
5 | +use yii\web\Cookie; | ||
6 | +use yii\web\User as AppUser; | ||
7 | + | ||
8 | +/** | ||
9 | + * Class User | ||
10 | + * @package app\wx\exts | ||
11 | + */ | ||
12 | +class User extends AppUser | ||
13 | +{ | ||
14 | + | ||
15 | + /** @var 工程师用户ID **/ | ||
16 | + private $_id = null; | ||
17 | + | ||
18 | + | ||
19 | + | ||
20 | + /** | ||
21 | + * @var string the class name of the [[identity]] object. | ||
22 | + */ | ||
23 | + public $identityClassForMall; | ||
24 | + | ||
25 | + /** | ||
26 | + * @inheritdoc | ||
27 | + */ | ||
28 | + public function switchIdentity($identity, $duration = 0) | ||
29 | + { | ||
30 | + $this->setIdentity($identity); | ||
31 | + | ||
32 | + if (!$this->enableSession) { | ||
33 | + return; | ||
34 | + } | ||
35 | + | ||
36 | + /* Ensure any existing identity cookies are removed. */ | ||
37 | + if ($this->enableAutoLogin) { | ||
38 | + Yii::$app->getResponse()->getCookies()->remove(new Cookie($this->identityCookie)); | ||
39 | + } | ||
40 | + | ||
41 | + $session = Yii::$app->getSession(); | ||
42 | + if (!YII_ENV_TEST) { | ||
43 | + $session->regenerateID(true); | ||
44 | + } | ||
45 | + | ||
46 | + $session->remove($this->idParam); | ||
47 | + $session->remove($this->authTimeoutParam); | ||
48 | + | ||
49 | + if ($identity) { | ||
50 | + $session->set($this->idParam, $identity->getId()); | ||
51 | + | ||
52 | + if ($this->authTimeout !== null) { | ||
53 | + $session->set($this->authTimeoutParam, time() + $this->authTimeout); | ||
54 | + } | ||
55 | + if ($this->absoluteAuthTimeout !== null) { | ||
56 | + $session->set($this->absoluteAuthTimeoutParam, time() + $this->absoluteAuthTimeout); | ||
57 | + } | ||
58 | + if ($duration > 0 && $this->enableAutoLogin) { | ||
59 | + $this->sendIdentityCookie($identity, $duration); | ||
60 | + } | ||
61 | + } | ||
62 | + } | ||
63 | + | ||
64 | + /** | ||
65 | + * @inheritdoc | ||
66 | + */ | ||
67 | + protected function renewAuthStatus() | ||
68 | + { | ||
69 | + $session = Yii::$app->getSession(); | ||
70 | + $id = $session->getHasSessionId() || $session->getIsActive() ? $session->get($this->idParam) : null; | ||
71 | + | ||
72 | + if ($id === null) { | ||
73 | + $identity = null; | ||
74 | + } else { | ||
75 | + $class = 'app\wx\models\Engineer'; | ||
76 | + $identity = $class::findIdentity($id); | ||
77 | + } | ||
78 | + | ||
79 | + $this->setIdentity($identity); | ||
80 | + | ||
81 | + if ($identity !== null && ($this->authTimeout !== null || $this->absoluteAuthTimeout !== null)) { | ||
82 | + $expire = $this->authTimeout !== null ? $session->get($this->authTimeoutParam) : null; | ||
83 | + $expireAbsolute = $this->absoluteAuthTimeout !== null ? $session->get($this->absoluteAuthTimeoutParam) : null; | ||
84 | + if ($expire !== null && $expire < time() || $expireAbsolute !== null && $expireAbsolute < time()) { | ||
85 | + $this->logout(false); | ||
86 | + } elseif ($this->authTimeout !== null) { | ||
87 | + $session->set($this->authTimeoutParam, time() + $this->authTimeout); | ||
88 | + } | ||
89 | + } | ||
90 | + | ||
91 | + if ($this->enableAutoLogin) { | ||
92 | + if ($this->getIsGuest()) { | ||
93 | + $this->loginByCookie(); | ||
94 | + } elseif ($this->autoRenewCookie) { | ||
95 | + $this->renewIdentityCookie(); | ||
96 | + } | ||
97 | + } | ||
98 | + } | ||
99 | + | ||
100 | + | ||
101 | + /** | ||
102 | + * @return int | ||
103 | + */ | ||
104 | + public function getId() | ||
105 | + { | ||
106 | + if(null === $this->_id){ | ||
107 | + $session = Yii::$app->getSession(); | ||
108 | + $this->_id = $session->getHasSessionId() || $session->getIsActive() ? $session->get($this->idParam) : null; | ||
109 | + } | ||
110 | + return (int)$this->_id; | ||
111 | + } | ||
112 | +} |
@@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
1 | +<?php | ||
2 | +namespace app\wx\helpers; | ||
3 | + | ||
4 | +use yii; | ||
5 | +use yii\data\Sort as dataSort; | ||
6 | + | ||
7 | +/** | ||
8 | + * Class Sort | ||
9 | + * @package app\wx\helpers | ||
10 | + */ | ||
11 | +class Sort extends dataSort | ||
12 | +{ | ||
13 | + /** | ||
14 | + * @param $model | ||
15 | + * @param array $extraAttrbutes | ||
16 | + */ | ||
17 | + public function setAttributes($model, $extraAttrbutes = []) | ||
18 | + { | ||
19 | + foreach ($model->attributes() as $attribute) { | ||
20 | + $this->attributes[$attribute] = [ | ||
21 | + 'asc' => [$attribute => SORT_ASC], | ||
22 | + 'desc' => [$attribute => SORT_DESC], | ||
23 | + 'label' => $model->getAttributeLabel($attribute), | ||
24 | + ]; | ||
25 | + } | ||
26 | + | ||
27 | + if ($extraAttrbutes) { | ||
28 | + foreach ($extraAttrbutes as $k => $label) { | ||
29 | + $this->attributes[$k] = [ | ||
30 | + 'asc' => [$k => SORT_ASC], | ||
31 | + 'desc' => [$k => SORT_DESC], | ||
32 | + 'label' => $label, | ||
33 | + ]; | ||
34 | + } | ||
35 | + } | ||
36 | + } | ||
37 | +} | ||
0 | \ No newline at end of file | 38 | \ No newline at end of file |
@@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
1 | +index |
@@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\wx\models; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use yii\log\Logger; | ||
7 | +use yii\base\Exception; | ||
8 | +use common\models\EngineerProfile as EngineerProfileModel; | ||
9 | +use common\models\Address as AddressModel; | ||
10 | +use domain\finance\models\EngineerWallet as EngineerWalletModel; | ||
11 | + | ||
12 | +/** | ||
13 | + * Class User | ||
14 | + * @package app\wx\models | ||
15 | + */ | ||
16 | +class User | ||
17 | +{ | ||
18 | + | ||
19 | + public function register() | ||
20 | + { | ||
21 | + | ||
22 | + } | ||
23 | + | ||
24 | + /** @inheritdoc */ | ||
25 | + public function beforeSave($insert) | ||
26 | + { | ||
27 | + | ||
28 | + } | ||
29 | + | ||
30 | + /** @inheritdoc */ | ||
31 | + public function afterSave($insert, $changedAttributes) | ||
32 | + { | ||
33 | + | ||
34 | + } | ||
35 | + | ||
36 | + | ||
37 | +} |
@@ -0,0 +1,78 @@ | @@ -0,0 +1,78 @@ | ||
1 | +<?php namespace app\wx\models; | ||
2 | + | ||
3 | +use yii; | ||
4 | +use yii\web\IdentityInterface; | ||
5 | + | ||
6 | +/** | ||
7 | + * Class UserIdentity | ||
8 | + * @package app\wx\models | ||
9 | + */ | ||
10 | +class UserIdentity implements IdentityInterface | ||
11 | +{ | ||
12 | + /** | ||
13 | + * @var null | ||
14 | + */ | ||
15 | + static $id = null; | ||
16 | + | ||
17 | + /** | ||
18 | + * @param int|string $id | ||
19 | + * @return IdentityInterface | ||
20 | + */ | ||
21 | + public static function findIdentity($id) | ||
22 | + { | ||
23 | + self::getIdFromSession(); | ||
24 | + return new UserIdentity(); | ||
25 | + } | ||
26 | + | ||
27 | + /** | ||
28 | + * @param mixed $token | ||
29 | + * @param null $type | ||
30 | + * @return IdentityInterface | ||
31 | + */ | ||
32 | + public static function findIdentityByAccessToken($token, $type = null) | ||
33 | + { | ||
34 | + return self::getIdFromSession(); | ||
35 | + return new UserIdentity(); | ||
36 | + } | ||
37 | + | ||
38 | + /** | ||
39 | + * @return int|string $id | ||
40 | + */ | ||
41 | + public function getId() | ||
42 | + { | ||
43 | + return self::getIdFromSession(); | ||
44 | + } | ||
45 | + | ||
46 | + /** | ||
47 | + *不启动自动登录,AuthKey 是用来设定到cookie的字符串 | ||
48 | + * | ||
49 | + */ | ||
50 | + public function getAuthKey() | ||
51 | + { | ||
52 | + return ""; | ||
53 | + } | ||
54 | + | ||
55 | + /** | ||
56 | + * 不启动自动登录,这里默认返回true | ||
57 | + * @param string $authKey | ||
58 | + */ | ||
59 | + public function validateAuthKey($authKey) | ||
60 | + { | ||
61 | + return true; | ||
62 | + } | ||
63 | + | ||
64 | + /** | ||
65 | + * @return mixed|null | ||
66 | + */ | ||
67 | + protected static function getIdFromSession() | ||
68 | + { | ||
69 | + if (null === self::$id){ | ||
70 | + $user = \Yii::$app->getUser(); | ||
71 | + $session = Yii::$app->getSession(); | ||
72 | + $id = $session->getHasSessionId() || $session->getIsActive() ? $session->get($user->idParam) : null; | ||
73 | + self::$id = $id; | ||
74 | + } | ||
75 | + | ||
76 | + return self::$id; | ||
77 | + } | ||
78 | +} | ||
0 | \ No newline at end of file | 79 | \ No newline at end of file |
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +<?php namespace app\wx\modules; | ||
2 | + | ||
3 | +/** | ||
4 | + * Class BaseModule | ||
5 | + * @package app\wx\modules | ||
6 | + */ | ||
7 | +class BaseModule extends \yii\base\Module | ||
8 | +{ | ||
9 | + public function init() | ||
10 | + { | ||
11 | + parent::init(); | ||
12 | + } | ||
13 | +} | ||
0 | \ No newline at end of file | 14 | \ No newline at end of file |
@@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\wx\modules\home; | ||
4 | + | ||
5 | +use yii\base\Module as BaseModule; | ||
6 | + | ||
7 | +/** | ||
8 | + * Class Module | ||
9 | + * @package app\wx\modules | ||
10 | + */ | ||
11 | +class Module extends BaseModule | ||
12 | +{ | ||
13 | + public function init() | ||
14 | + { | ||
15 | + parent::init(); | ||
16 | + } | ||
17 | +} | ||
0 | \ No newline at end of file | 18 | \ No newline at end of file |
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\wx\modules\home\controllers; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use app\wx\controllers\BaseController as AppBaseController; | ||
7 | + | ||
8 | +/** | ||
9 | + * Class BaseController | ||
10 | + * @package app\wx\modules\toutiao\controllers | ||
11 | + */ | ||
12 | +class BaseController extends AppBaseController | ||
13 | +{ | ||
14 | + public $layout = 'main'; | ||
15 | + | ||
16 | + /** | ||
17 | + * @throws yii\web\BadRequestHttpException | ||
18 | + */ | ||
19 | + public function init() | ||
20 | + { | ||
21 | + parent::init(); // TODO: Change the autogenerated stub | ||
22 | + | ||
23 | + } | ||
24 | +} | ||
0 | \ No newline at end of file | 25 | \ No newline at end of file |
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\wx\modules\home\controllers; | ||
4 | + | ||
5 | +use common\helpers\ImageManager; | ||
6 | +use common\models\EngineerProfile; | ||
7 | +use domain\toutiao\TtDefaultImageRepository; | ||
8 | +use domain\toutiao\TtNewsImageRepository; | ||
9 | +use domain\toutiao\TtNewsRepository; | ||
10 | +use domain\toutiao\TtType; | ||
11 | +use Yii; | ||
12 | +use stdClass; | ||
13 | + | ||
14 | +/** | ||
15 | + * 控制器 | ||
16 | + */ | ||
17 | +class DefaultController extends BaseController | ||
18 | +{ | ||
19 | + | ||
20 | + /** | ||
21 | + * 首页 | ||
22 | + */ | ||
23 | + public function actionIndex() | ||
24 | + { | ||
25 | + return $this->render('index'); | ||
26 | + } | ||
27 | + | ||
28 | + | ||
29 | +} | ||
0 | \ No newline at end of file | 30 | \ No newline at end of file |
@@ -0,0 +1,38 @@ | @@ -0,0 +1,38 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Url; | ||
4 | + | ||
5 | +$baseUrl = Url::base(true); | ||
6 | +$assets = $this->getAssetManager(); | ||
7 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
8 | + | ||
9 | +function img($file, $path = '/i/') | ||
10 | +{ | ||
11 | + return \Yii::$app->request->baseUrl . $path.$file; | ||
12 | +} | ||
13 | +?> | ||
14 | +<style> | ||
15 | + | ||
16 | +</style> | ||
17 | +<div class="views"> | ||
18 | + <div class="view view-main"> | ||
19 | + <?=$this->render("@app/views/widgets/ui-loading")?> | ||
20 | + </div> | ||
21 | +</div> | ||
22 | + | ||
23 | +<?=$this->render('pages/index-template', ['asset' => $asset])?> | ||
24 | +<?=$this->render('pages/register-template', ['asset' => $asset])?> | ||
25 | + | ||
26 | +<script> | ||
27 | + require.config({baseUrl: $site.assets_url + '/js/',urlArgs : "v=" + require.version}); | ||
28 | + require([ | ||
29 | + 'home-app' | ||
30 | + ], | ||
31 | + function(app){ | ||
32 | + app.bootstrap({ | ||
33 | + baseUrl: $site.base_url | ||
34 | + }); | ||
35 | + }); | ||
36 | +</script> | ||
37 | + | ||
38 | +<?=$this->render("@app/views/widgets/stat-code")?> |
app-wx/modules/home/views/default/pages/index-template.php
0 → 100644
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Url; | ||
4 | + | ||
5 | +$baseUrl = Url::base(true); | ||
6 | +?> | ||
7 | +<style> | ||
8 | +#index{} | ||
9 | + | ||
10 | +</style> | ||
11 | +<script id="index-template" type="text/template"> | ||
12 | + <div class="pages"> | ||
13 | + <div class="page" id="index" style="background: #f2f3f6"> | ||
14 | + <div class="page-content"> | ||
15 | + | ||
16 | + </div> | ||
17 | + | ||
18 | + </div> | ||
19 | + </div> | ||
20 | +</script> |
app-wx/modules/home/views/default/pages/register-template.php
0 → 100644
@@ -0,0 +1,45 @@ | @@ -0,0 +1,45 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Url; | ||
4 | + | ||
5 | +$baseUrl = Url::base(true); | ||
6 | +?> | ||
7 | +<style> | ||
8 | + body,div,p,span,input{padding: 0;margin: 0} | ||
9 | + input{-webkit-appearance: none;} | ||
10 | + #register{} | ||
11 | + #register .input-list{padding:1rem;box-sizing: border-box} | ||
12 | + #register .input-row-cls{width:100%;margin-top:0.7rem;} | ||
13 | + #register .input-list .input-div{line-height: 1.25rem;font-size: 1rem;} | ||
14 | + #register .input-list .input-cls{width:100%;line-height: inherit;font-size: inherit;border:1px solid #ccc;padding:0.3rem;box-sizing: border-box} | ||
15 | + #register .input-list .validation-code{display:flex;align-items: center} | ||
16 | + #register .input-list .get-code-cls{width: 7rem;font-size: 0.8rem;display: flex;align-items: center;justify-content:center;background:#f25601;color:#fff;padding:0.302rem 0.3rem;box-sizing: border-box;border: 1px solid #f25601; | ||
17 | + border-left:0;} | ||
18 | + | ||
19 | +</style> | ||
20 | +<script id="register-template" type="text/template"> | ||
21 | + <div class="pages"> | ||
22 | + <div class="page" id="register" style="background: #fff"> | ||
23 | + <div class="page-content"> | ||
24 | + <div class="input-list"> | ||
25 | + <div class="input-row-cls"><label class="input-label-cls">车厂名称</label><div class="input-div"><input class="input-cls" type="text" placeholder="输入车厂名称" /></div></div> | ||
26 | + | ||
27 | + <div class="input-row-cls"><label class="input-label-cls">手机号码</label><div class="input-div"><input class="input-cls" type="number" placeholder="输入手机号码" /></div></div> | ||
28 | + | ||
29 | + <div class="input-row-cls"> | ||
30 | + <label class="input-label-cls">验证码</label> | ||
31 | + <div class="input-div validation-code"> | ||
32 | + <input class="input-cls" type="text" placeholder="" style="border-right: 0;"/> | ||
33 | + <div class="get-code-cls">获取验证码</div> | ||
34 | + </div> | ||
35 | + </div> | ||
36 | + </div> | ||
37 | + <div style="padding:1rem;box-sizing: border-box"> | ||
38 | + <div>上传营业执照</div> | ||
39 | + <div></div> | ||
40 | + </div> | ||
41 | + <div style="padding:1rem;box-sizing:border-box"><div style="width:70%; padding:1rem;text-align:center;box-sizing: border-box;color:#fff;background:#f25601;margin: 0 auto;">注册</div></div> | ||
42 | + </div> | ||
43 | + </div> | ||
44 | + </div> | ||
45 | +</script> |
@@ -0,0 +1,43 @@ | @@ -0,0 +1,43 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +use app\wx\assets\AppAsset; | ||
4 | +use yii\helpers\Html; | ||
5 | + | ||
6 | +AppAsset::register($this); | ||
7 | + | ||
8 | +$site = $this->params['site']; | ||
9 | + | ||
10 | +$this->title = \yii::$app->name; | ||
11 | +$assets = $this->getAssetManager(); | ||
12 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
13 | +?> | ||
14 | +<?php $this->beginPage() ?> | ||
15 | +<!DOCTYPE HTML> | ||
16 | + | ||
17 | +<html lang="<?= \yii::$app->language ?>"> | ||
18 | +<head> | ||
19 | +<meta charset="<?= \yii::$app->charset ?>"> | ||
20 | +<meta name="apple-mobile-web-app-capable" content="yes"> | ||
21 | +<meta name="apple-mobile-web-app-status-bar-style" content="black"> | ||
22 | +<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> | ||
23 | +<meta http-equiv="Pragma" content="no-cache"> | ||
24 | +<meta http-equiv="Expires" content="0"> | ||
25 | +<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> | ||
26 | +<?= Html::csrfMetaTags() ?> | ||
27 | +<title><?= Html::encode($this->title) ?></title> | ||
28 | +<script> | ||
29 | + <?=$this->render("@app/views/widgets/js-site", ['site' => $site])?> | ||
30 | +</script> | ||
31 | +<?php $this->head() ?> | ||
32 | +<style> | ||
33 | + | ||
34 | +</style> | ||
35 | +</head> | ||
36 | +<body> | ||
37 | +<?php $this->beginBody() ?> | ||
38 | +<?=$content?> | ||
39 | +<?php $this->endBody() ?> | ||
40 | +</body> | ||
41 | +</html> | ||
42 | +<?php $this->endPage() ?> | ||
43 | + |
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Html; | ||
3 | +use app\wx\assets\AppAsset; | ||
4 | +AppAsset::register($this); | ||
5 | + | ||
6 | + | ||
7 | +?> | ||
8 | +<?php $this->beginPage() ?> | ||
9 | +<!DOCTYPE html> | ||
10 | +<html lang="<?=yii::$app->language ?>"> | ||
11 | +<head> | ||
12 | + <meta charset="<?=yii::$app->charset ?>"> | ||
13 | + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui"> | ||
14 | + <?= Html::csrfMetaTags() ?> | ||
15 | + <title><?= Html::encode($this->title) ?></title> | ||
16 | + <?php $this->head() ?> | ||
17 | + <style> | ||
18 | + | ||
19 | + </style> | ||
20 | +</head> | ||
21 | +<body> | ||
22 | +<?php $this->beginBody() ?> | ||
23 | + | ||
24 | +<?=$content?> | ||
25 | + | ||
26 | +<?php $this->endBody() ?> | ||
27 | +</body> | ||
28 | +</html> | ||
29 | +<?php $this->endPage() ?> |
@@ -0,0 +1,34 @@ | @@ -0,0 +1,34 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Html; | ||
3 | +use app\wx\assets\AppAsset; | ||
4 | +AppAsset::register($this); | ||
5 | + | ||
6 | +$this->title = \yii::$app->name; | ||
7 | +$baseUrl = yii::getAlias('@web'); | ||
8 | +$assets = $this->getAssetManager(); | ||
9 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
10 | +$site = $this->params['site']; | ||
11 | +?> | ||
12 | +<?php $this->beginPage() ?> | ||
13 | +<!DOCTYPE html> | ||
14 | + | ||
15 | +<html lang="<?=yii::$app->language ?>"> | ||
16 | +<head> | ||
17 | +<meta charset="<?=yii::$app->charset ?>"> | ||
18 | +<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui"> | ||
19 | +<?= Html::csrfMetaTags() ?> | ||
20 | +<title><?= Html::encode($this->title) ?></title> | ||
21 | +<script> | ||
22 | + <?=$this->render("/widgets/js-site", ['site' => $site])?> | ||
23 | +</script> | ||
24 | +<?php $this->head() ?> | ||
25 | +</head> | ||
26 | +<body> | ||
27 | +<?php $this->beginBody() ?> | ||
28 | + | ||
29 | +<?=$content?> | ||
30 | + | ||
31 | +<?php $this->endBody() ?> | ||
32 | +</body> | ||
33 | +</html> | ||
34 | +<?php $this->endPage() ?> |
@@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Html; | ||
3 | +use app\wx\assets\AppAsset; | ||
4 | +AppAsset::register($this); | ||
5 | + | ||
6 | +$this->title = \yii::$app->name; | ||
7 | +$baseUrl = yii::getAlias('@web'); | ||
8 | +$assets = $this->getAssetManager(); | ||
9 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
10 | +$site = $this->params['site']; | ||
11 | +?> | ||
12 | +<?php $this->beginPage() ?> | ||
13 | +<!DOCTYPE html> | ||
14 | +<html lang="<?=yii::$app->language ?>"> | ||
15 | +<head> | ||
16 | +<meta charset="<?=yii::$app->charset ?>"> | ||
17 | + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui"> | ||
18 | + <?= Html::csrfMetaTags() ?> | ||
19 | + <title><?= Html::encode($this->title) ?></title> | ||
20 | + <script> | ||
21 | + <?=$this->render("/widgets/js-site", ['site' => $site])?> | ||
22 | + </script> | ||
23 | + <?php $this->head() ?> | ||
24 | +</head> | ||
25 | +<body> | ||
26 | +<?php $this->beginBody() ?> | ||
27 | + | ||
28 | +<?=$content?> | ||
29 | + | ||
30 | +<?php $this->endBody() ?> | ||
31 | +</body> | ||
32 | +</html> | ||
33 | +<?php $this->endPage() ?> |
@@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Html; | ||
3 | +use app\wx\assets\AppAsset; | ||
4 | +AppAsset::register($this); | ||
5 | + | ||
6 | +$this->title = \yii::$app->name; | ||
7 | +$baseUrl = yii::getAlias('@web'); | ||
8 | +$assets = $this->getAssetManager(); | ||
9 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
10 | +$site = $this->params['site']; | ||
11 | +?> | ||
12 | +<?php $this->beginPage() ?> | ||
13 | +<!DOCTYPE html> | ||
14 | +<html lang="<?=yii::$app->language ?>"> | ||
15 | +<head> | ||
16 | +<meta charset="<?=yii::$app->charset ?>"> | ||
17 | + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui"> | ||
18 | + <?= Html::csrfMetaTags() ?> | ||
19 | + <title><?= Html::encode($this->title) ?></title> | ||
20 | + <script> | ||
21 | + <?=$this->render("/widgets/js-site", ['site' => $site])?> | ||
22 | + </script> | ||
23 | + <?php $this->head() ?> | ||
24 | +</head> | ||
25 | +<body> | ||
26 | +<?php $this->beginBody() ?> | ||
27 | + | ||
28 | +<?=$content?> | ||
29 | + | ||
30 | +<?php $this->endBody() ?> | ||
31 | +</body> | ||
32 | +</html> | ||
33 | +<?php $this->endPage() ?> |
@@ -0,0 +1,51 @@ | @@ -0,0 +1,51 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Url; | ||
3 | +$assets = $this->getAssetManager(); | ||
4 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
5 | +?> | ||
6 | +<style> | ||
7 | + .error-wrap { | ||
8 | + margin:0 auto; | ||
9 | + width:95%; | ||
10 | + margin-top: 50px; | ||
11 | + padding: 0 5px; | ||
12 | + font-size: 18px; | ||
13 | + font-weight: bold; | ||
14 | + } | ||
15 | +</style> | ||
16 | + | ||
17 | +<div class="error-wrap"> | ||
18 | + <div style="text-align: center"><img src="<?= $asset->baseUrl . '/i/error.jpg' ?>" /></div> | ||
19 | + <div style="margin-bottom: 10px">一瞬间,访客风起云涌,页面进不去了...</div> | ||
20 | + <div style="">我们将在<span id="num" class="text-danger">10</span>秒后为您跳转回首页</div> | ||
21 | + <div style="line-height: 28px;margin-top: 30px;"> | ||
22 | + <p>在使用系统的过程中,遇到问题或者有好的建议,请一定告诉我们。我们深宅多年练就的功能,就是为了化问题为神奇。</p> | ||
23 | + | ||
24 | + <p style="margin-bottom: 30px"> 邮箱:tech@jiwork.com (求约)</p> | ||
25 | + </div> | ||
26 | +</div> | ||
27 | + | ||
28 | +<script> | ||
29 | + | ||
30 | + function countDown(period, intv, callback) { | ||
31 | + var num = document.getElementById("num"); | ||
32 | + var timeRemain = period - 1; | ||
33 | + var setText = function (text) { | ||
34 | + num.innerHTML = text; | ||
35 | + } | ||
36 | + var t = setInterval(function () { | ||
37 | + setText(timeRemain); | ||
38 | + timeRemain -= 1; | ||
39 | + if (timeRemain < 0) { | ||
40 | + clearInterval(t); | ||
41 | + if (callback) { | ||
42 | + callback(); | ||
43 | + } | ||
44 | + } | ||
45 | + }, intv); | ||
46 | + } | ||
47 | + | ||
48 | + countDown(10, 1000, function () { | ||
49 | + location.href = "<?php echo Url::home(); ?>"; | ||
50 | + }); | ||
51 | +</script> | ||
0 | \ No newline at end of file | 52 | \ No newline at end of file |
@@ -0,0 +1,51 @@ | @@ -0,0 +1,51 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Url; | ||
3 | +$assets = $this->getAssetManager(); | ||
4 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
5 | +?> | ||
6 | +<style> | ||
7 | + .error-wrap { | ||
8 | + margin:0 auto; | ||
9 | + width:95%; | ||
10 | + margin-top: 50px; | ||
11 | + padding: 0 5px; | ||
12 | + font-size: 18px; | ||
13 | + font-weight: bold; | ||
14 | + } | ||
15 | +</style> | ||
16 | + | ||
17 | +<div class="error-wrap"> | ||
18 | + <div style="text-align: center"><img src="<?= $asset->baseUrl . '/i/error.jpg' ?>" /></div> | ||
19 | + <div style="margin-bottom: 10px">一瞬间,访客风起云涌,页面进不去了...</div> | ||
20 | + <div style="">我们将在<span id="num" class="text-danger">10</span>秒后为您跳转回首页</div> | ||
21 | + <div style="line-height: 28px;margin-top: 30px;"> | ||
22 | + <p>在使用系统的过程中,遇到问题或者有好的建议,请一定告诉我们。我们深宅多年练就的功能,就是为了化问题为神奇。</p> | ||
23 | + | ||
24 | + <p style="margin-bottom: 30px"> 邮箱:tech@jiwork.com (求约)</p> | ||
25 | + </div> | ||
26 | +</div> | ||
27 | + | ||
28 | +<script> | ||
29 | + | ||
30 | + function countDown(period, intv, callback) { | ||
31 | + var num = document.getElementById("num"); | ||
32 | + var timeRemain = period - 1; | ||
33 | + var setText = function (text) { | ||
34 | + num.innerHTML = text; | ||
35 | + } | ||
36 | + var t = setInterval(function () { | ||
37 | + setText(timeRemain); | ||
38 | + timeRemain -= 1; | ||
39 | + if (timeRemain < 0) { | ||
40 | + clearInterval(t); | ||
41 | + if (callback) { | ||
42 | + callback(); | ||
43 | + } | ||
44 | + } | ||
45 | + }, intv); | ||
46 | + } | ||
47 | + | ||
48 | + countDown(10, 1000, function () { | ||
49 | + location.href = "<?php echo Url::home(); ?>"; | ||
50 | + }); | ||
51 | +</script> | ||
0 | \ No newline at end of file | 52 | \ No newline at end of file |
@@ -0,0 +1,51 @@ | @@ -0,0 +1,51 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Url; | ||
3 | +$assets = $this->getAssetManager(); | ||
4 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
5 | +?> | ||
6 | +<style> | ||
7 | + .error-wrap { | ||
8 | + margin:0 auto; | ||
9 | + width:90%; | ||
10 | + margin-top: 20px; | ||
11 | + padding: 0 20px; | ||
12 | + font-size: 18px; | ||
13 | + font-weight: bold; | ||
14 | + } | ||
15 | +</style> | ||
16 | + | ||
17 | +<div class="error-wrap"> | ||
18 | + <div style="text-align: center"><i class="iconfont icon-kulian" style="font-size: 100pt "></i></div> | ||
19 | + <div style="margin-bottom: 10px">一瞬间,访客风起云涌,页面进不去了...</div> | ||
20 | + <div style="">我们将在<span id="num" class="text-danger">10</span>秒后为您跳转回首页</div> | ||
21 | + <div style="line-height: 28px;margin-top: 30px;"> | ||
22 | + <p>在使用系统的过程中,遇到问题或者有好的建议,请一定告诉我们。我们深宅多年练就的功能,就是为了化问题为神奇。</p> | ||
23 | + | ||
24 | + <p style="margin-bottom: 30px"> 邮箱:tech@jiwork.com (求约)</p> | ||
25 | + </div> | ||
26 | +</div> | ||
27 | + | ||
28 | +<script> | ||
29 | + | ||
30 | + function countDown(period, intv, callback) { | ||
31 | + var num = document.getElementById("num"); | ||
32 | + var timeRemain = period - 1; | ||
33 | + var setText = function (text) { | ||
34 | + num.innerHTML = text; | ||
35 | + } | ||
36 | + var t = setInterval(function () { | ||
37 | + setText(timeRemain); | ||
38 | + timeRemain -= 1; | ||
39 | + if (timeRemain < 0) { | ||
40 | + clearInterval(t); | ||
41 | + if (callback) { | ||
42 | + callback(); | ||
43 | + } | ||
44 | + } | ||
45 | + }, intv); | ||
46 | + } | ||
47 | + | ||
48 | + countDown(10, 1000, function () { | ||
49 | + location.href = "<?php echo Url::home(); ?>"; | ||
50 | + }); | ||
51 | +</script> | ||
0 | \ No newline at end of file | 52 | \ No newline at end of file |
@@ -0,0 +1,28 @@ | @@ -0,0 +1,28 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Url; | ||
3 | +$assets = $this->getAssetManager(); | ||
4 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
5 | +$baseUrl = Url::base(true); | ||
6 | +?> | ||
7 | +<style> | ||
8 | + .error-wrap { | ||
9 | + margin:0 auto; | ||
10 | + width:90%; | ||
11 | + margin-top: 20px; | ||
12 | + padding: 0 20px; | ||
13 | + font-size: 15px; | ||
14 | + color: #666; | ||
15 | + } | ||
16 | +</style> | ||
17 | + | ||
18 | +<div class="error-wrap"> | ||
19 | + <div style="text-align: center"> | ||
20 | + <span style="display:block;width:100%;margin:0 auto;margin-top:80px;"><img style="width=105px; height: 105px;" src="<?=$baseUrl?>/i/tauth/forbidden.png" /></span> | ||
21 | + <?php if(isset($errorMsg)) {?> | ||
22 | + <div style="width:100%;text-align: center;margin:0 auto;margin-top: 20px;line-height:1.6rem"><?=$errorMsg?></div> | ||
23 | + <?php } else {?> | ||
24 | + <div style="width:100%;text-align: center;margin:0 auto;margin-top: 20px;line-height:1.6rem">对不起,您的账号已被封<br/>请联系客服: <?=$service_phone?></div> | ||
25 | + <?php } ?> | ||
26 | + | ||
27 | + </div> | ||
28 | +</div> | ||
0 | \ No newline at end of file | 29 | \ No newline at end of file |
@@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
1 | +<?php | ||
2 | +$assets = $this->getAssetManager(); | ||
3 | +$asset = $assets->getBundle('app\wx\assets\AppAsset'); | ||
4 | +?> | ||
5 | + | ||
6 | +<div class="views"> | ||
7 | + <div id="view-index" class="view view-main"> | ||
8 | + <?=$this->render("/widgets/ui-loading")?> | ||
9 | + </div> | ||
10 | +</div> | ||
11 | +<?=$this->render("_index-template", ['engineer'=>$engineer, 'asset' => $asset])?> | ||
12 | +<script> | ||
13 | + require.config({baseUrl: $site.assets_url + '/js/',urlArgs : "v=" + require.version}); | ||
14 | + require([ | ||
15 | + 'site-app', | ||
16 | + ], | ||
17 | + function(app) { | ||
18 | + app.bootstrap({ | ||
19 | + baseUrl: $site.base_url | ||
20 | + }); | ||
21 | + }); | ||
22 | + | ||
23 | +</script> | ||
24 | + | ||
25 | +<?=$this->render("/widgets/stat-code")?> | ||
0 | \ No newline at end of file | 26 | \ No newline at end of file |
@@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
1 | +<html> | ||
2 | +<head> | ||
3 | + <meta http-equiv="content-type" content="text/html;charset=utf-8"/> | ||
4 | + <meta name="viewport" content="width=device-width, initial-scale=1"/> | ||
5 | + <title>微信支付样例-支付</title> | ||
6 | + <script type="text/javascript"> | ||
7 | + //调用微信JS api 支付 | ||
8 | + function jsApiCall() | ||
9 | + { | ||
10 | + WeixinJSBridge.invoke( | ||
11 | + 'getBrandWCPayRequest', | ||
12 | + <?php echo $jsApiParameters; ?>, | ||
13 | + function(res){ | ||
14 | + WeixinJSBridge.log(res.err_msg); | ||
15 | + alert(res.err_code+res.err_desc+res.err_msg); | ||
16 | + } | ||
17 | + ); | ||
18 | + } | ||
19 | + | ||
20 | + function callpay() | ||
21 | + { | ||
22 | + if (typeof WeixinJSBridge == "undefined"){ | ||
23 | + if( document.addEventListener ){ | ||
24 | + document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); | ||
25 | + }else if (document.attachEvent){ | ||
26 | + document.attachEvent('WeixinJSBridgeReady', jsApiCall); | ||
27 | + document.attachEvent('onWeixinJSBridgeReady', jsApiCall); | ||
28 | + } | ||
29 | + }else{ | ||
30 | + jsApiCall(); | ||
31 | + } | ||
32 | + } | ||
33 | + </script> | ||
34 | +</head> | ||
35 | +<body> | ||
36 | + <br/> | ||
37 | + <font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/> | ||
38 | + <div align="center"> | ||
39 | + <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button> | ||
40 | + </div> | ||
41 | +</body> | ||
42 | +</html> | ||
0 | \ No newline at end of file | 43 | \ No newline at end of file |
@@ -0,0 +1,43 @@ | @@ -0,0 +1,43 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Url; | ||
3 | +?> | ||
4 | +<style> | ||
5 | + .toolbar .toolbar-inner { | ||
6 | + background: #fff; | ||
7 | + } | ||
8 | + .toolbar .toolbar-inner a.active { | ||
9 | + color: #dd2727; | ||
10 | + background: #fff; | ||
11 | + } | ||
12 | + .toolbar .toolbar-inner .badge { | ||
13 | + color: #fff; | ||
14 | + background: #dd2727; | ||
15 | + } | ||
16 | + .toolbar .toolbar-inner .iconfont { | ||
17 | + font-size:22px; | ||
18 | + } | ||
19 | +</style> | ||
20 | +<div class="toolbar tabbar tabbar-labels toolbar-fixed"> | ||
21 | + <div class="toolbar-inner" style="border: 0; padding: 0;"> | ||
22 | + <a href="<?=Url::toRoute(['/order'])?>" class="tab-link <?php if('order' == $label):?>active<?php endif;?> home-link"> | ||
23 | + <i class="icon iconfont <?=(''==$label) ? 'icon-home-fill' : 'icon-home'?>"></i> | ||
24 | + <span class="tabbar-label">首页</span> | ||
25 | + </a> | ||
26 | + <!-- | ||
27 | + <a href="<?=Url::toRoute(['/cat'])?>" class="tab-link <?php if('cat' == $label):?>active<?php endif;?> cat-link"> | ||
28 | + <i class="icon iconfont <?=('cat'==$label) ? 'icon-search-list-fill' : 'icon-search-list'?>"></i> | ||
29 | + <span class="tabbar-label">搜索</span> | ||
30 | + </a> | ||
31 | + <a href="<?=Url::toRoute('/cart')?>" class="tab-link <?php if('cart' == $label):?>active<?php endif;?> cart-link"> | ||
32 | + <i class="icon iconfont <?=('cart'==$label) ? 'icon-cart-fill' : 'icon-cart'?>"> | ||
33 | + <span class="badge">0</span> | ||
34 | + </i> | ||
35 | + <span class="tabbar-label">购物车</span> | ||
36 | + </a> | ||
37 | + --> | ||
38 | + <a href="<?=Url::toRoute(['/user'])?>" class="tab-link <?php if('user' == $label):?>active<?php endif;?> user-link"> | ||
39 | + <i class="icon iconfont <?=('user'==$label) ? 'icon-my-fill' : 'icon-my'?>"></i> | ||
40 | + <span class="tabbar-label">我</span> | ||
41 | + </a> | ||
42 | + </div> | ||
43 | +</div> | ||
0 | \ No newline at end of file | 44 | \ No newline at end of file |
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | +window.$site = { | ||
2 | + base_url : '<?=$site->base_url?>', | ||
3 | + assets_url : '<?=$site->assets_url?>', | ||
4 | + title: '<?=$site->title?>', | ||
5 | + desc: '<?=$site->desc?>', | ||
6 | + url: '<?=$site->url?>', | ||
7 | + icon: '<?=$site->icon?>', | ||
8 | + appid: '<?=$site->appid?>', | ||
9 | + timestamp: '<?=$site->timestamp?>', | ||
10 | + noncestr: '<?=$site->noncestr?>',//noncestr | ||
11 | + signature: '<?=$site->signature?>',//signature | ||
12 | + user_bridge_url: '<?=$site->user_bridge_url?>', | ||
13 | + sn: '<?=$site->sn ?>' | ||
14 | +} | ||
0 | \ No newline at end of file | 15 | \ No newline at end of file |
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | +<!--预载入页面动画--> | ||
2 | +<div class="ui-loading-block" id="ui-loading"> | ||
3 | + <div class="ui-loading-cnt"> | ||
4 | +<!-- <i class="ui-loading-bright"></i>--> | ||
5 | + <div class="spinner"> | ||
6 | + <div class="bounce1"></div> | ||
7 | + <div class="bounce2"></div> | ||
8 | + <div class="bounce3"></div></div> | ||
9 | + <div id="loader-inner"><p></p></div> | ||
10 | + </div> | ||
11 | +</div> | ||
12 | +<!--//预载入页面动画--> | ||
13 | +<script> | ||
14 | + window['waitingTime'] = 10000; // 显示重新加载的等待时间,默认10s | ||
15 | + window['loaderTimer'] = setTimeout(function(){ | ||
16 | + var loaderTips = document.getElementById('loader-inner'); | ||
17 | + var tips = document.createElement('p'); | ||
18 | + tips.className = 'notice'; | ||
19 | + if(loaderTips){ | ||
20 | + tips.innerHTML = '加载速度太慢?试试<a class="link" href="#" onclick="javascript:location.reload();return false;" style="color: #0EA2F8">重新加载</a>'; | ||
21 | + loaderTips.appendChild(tips); | ||
22 | + } | ||
23 | + },window['waitingTime']); | ||
24 | +</script> | ||
0 | \ No newline at end of file | 25 | \ No newline at end of file |