Commit 3a892ee0206991fdf7aabad974c1c993866abfa1
1 parent
166cb0a2
Exists in
master
app-wx(v0.1.0 build 7)
F 订单详情,登录界面,注册完善 F 图片上传接口调整
Showing
46 changed files
with
1675 additions
and
740 deletions
Show diff stats
app-wx/config/main.php
@@ -12,7 +12,7 @@ return [ | @@ -12,7 +12,7 @@ return [ | ||
12 | 'runtimePath' => Yii::getAlias('@rootRuntime').'/app-wx/', | 12 | 'runtimePath' => Yii::getAlias('@rootRuntime').'/app-wx/', |
13 | 'bootstrap' => ['log'], | 13 | 'bootstrap' => ['log'], |
14 | 'controllerNamespace' => 'app\wx\controllers', | 14 | 'controllerNamespace' => 'app\wx\controllers', |
15 | - 'defaultRoute' => 'user', | 15 | + 'defaultRoute' => 'order', |
16 | 'modules' => [ | 16 | 'modules' => [ |
17 | 'order' => [ | 17 | 'order' => [ |
18 | 'class' => 'app\wx\modules\order\Module', | 18 | 'class' => 'app\wx\modules\order\Module', |
@@ -23,9 +23,8 @@ return [ | @@ -23,9 +23,8 @@ return [ | ||
23 | ], | 23 | ], |
24 | 'components' => [ | 24 | 'components' => [ |
25 | 'user' => [ | 25 | 'user' => [ |
26 | - 'class'=> 'app\wx\exts\User', | ||
27 | 'identityClass' => 'app\wx\models\User', | 26 | 'identityClass' => 'app\wx\models\User', |
28 | - 'enableAutoLogin' => false,//是否启用自动登录 | 27 | + 'enableAutoLogin' => true,//是否启用自动登录 |
29 | ], | 28 | ], |
30 | 'errorHandler' => [ | 29 | 'errorHandler' => [ |
31 | 'errorAction' => 'site/error', | 30 | 'errorAction' => 'site/error', |
app-wx/config/params.php
app-wx/controllers/BaseController.php
@@ -120,9 +120,13 @@ class BaseController extends AppController | @@ -120,9 +120,13 @@ class BaseController extends AppController | ||
120 | * 获取 ID | 120 | * 获取 ID |
121 | * @return int|string | 121 | * @return int|string |
122 | */ | 122 | */ |
123 | - public function getEngineerId() | 123 | + public function getUserId() |
124 | { | 124 | { |
125 | - return 0; | 125 | + if (isset(Yii::$app->user)) { |
126 | + return Yii::$app->user->id; | ||
127 | + } else { | ||
128 | + return 0; | ||
129 | + } | ||
126 | } | 130 | } |
127 | 131 | ||
128 | /** | 132 | /** |
@@ -171,17 +175,22 @@ class BaseController extends AppController | @@ -171,17 +175,22 @@ class BaseController extends AppController | ||
171 | */ | 175 | */ |
172 | protected function handleMallAccessCtrl() | 176 | protected function handleMallAccessCtrl() |
173 | { | 177 | { |
174 | - //AppLog::DEBUG("BaseController: handleMallAccessCtrl()" ); | ||
175 | $appUser = Yii::$app->getUser(); | 178 | $appUser = Yii::$app->getUser(); |
179 | + | ||
180 | + if (YII_ENV_DEV) { | ||
181 | + $baseURL = Yii::$app->request->getHostInfo() . Yii::$app->request->baseUrl; | ||
182 | + } else { | ||
183 | + $baseURL = Yii::$app->request->getHostInfo(); | ||
184 | + } | ||
185 | + | ||
176 | if(YII_ENV_DEV && $appUser->isGuest){ | 186 | if(YII_ENV_DEV && $appUser->isGuest){ |
177 | - $uid = Yii::$app->params['testUID']; // 请在各自的config/params-local.php里配置 | ||
178 | - header("Location: " . Yii::$app->params["baseUrl"] . "/user#login" );exit; | ||
179 | - return ; | 187 | + //header("Location: " .$baseURL . "/user#login" ); |
188 | + //exit; | ||
180 | } | 189 | } |
181 | - //test和 prod 环境,进行微信登陆 | 190 | + //test和 prod 环境 |
182 | if ($appUser->isGuest){ | 191 | if ($appUser->isGuest){ |
183 | - header("Location: " . Yii::$app->params["baseUrl"] . "/user#login" );exit; | ||
184 | - return ; | 192 | + header("Location: " . $baseURL . "/user#login" ); |
193 | + exit; | ||
185 | } | 194 | } |
186 | 195 | ||
187 | } | 196 | } |
@@ -220,41 +229,6 @@ class BaseController extends AppController | @@ -220,41 +229,6 @@ class BaseController extends AppController | ||
220 | return true; | 229 | return true; |
221 | } | 230 | } |
222 | 231 | ||
223 | - // | ||
224 | - public function setPhoneCode($phone, $code) | ||
225 | - { | ||
226 | - Yii::$app->session['v_'.$phone] = array('create_time' => time(),'vCode' => md5($phone.'_'.$code)); | ||
227 | - } | ||
228 | - | ||
229 | - public function getPhoneCode($phone) | ||
230 | - { | ||
231 | - return Yii::$app->session['v_'.$phone]; | ||
232 | - } | ||
233 | - | ||
234 | - // 默认是300秒 | ||
235 | - public function validatePhoneCode($phone, $code, $vaTime = 300) | ||
236 | - { | ||
237 | - $pCode = $this->getPhoneCode($phone); | ||
238 | - $cTime = time(); | ||
239 | - if (empty($pCode)) { | ||
240 | - return -3; | ||
241 | - } | ||
242 | - if ($cTime > ($pCode['create_time'] + $vaTime)) { | ||
243 | - $this->unsetPhoneCode($phone); | ||
244 | - return -1; | ||
245 | - } | ||
246 | - if($pCode['vCode'] == md5($phone.'_'.$code)){ | ||
247 | - return 0; | ||
248 | - }else{ | ||
249 | - return -2; | ||
250 | - } | ||
251 | - } | ||
252 | - | ||
253 | - public function unsetPhoneCode($phone) | ||
254 | - { | ||
255 | - unset(Yii::$app->session['v_'.$phone]); | ||
256 | - } | ||
257 | - | ||
258 | /** | 232 | /** |
259 | * 初始化web目录文件夹, 完成自动创建 | 233 | * 初始化web目录文件夹, 完成自动创建 |
260 | */ | 234 | */ |
app-wx/exts/User.php
@@ -1,112 +0,0 @@ | @@ -1,112 +0,0 @@ | ||
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 = 'domain\user\models\User'; | ||
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 | -} |
app-wx/models/User.php
@@ -3,16 +3,17 @@ | @@ -3,16 +3,17 @@ | ||
3 | namespace app\wx\models; | 3 | namespace app\wx\models; |
4 | 4 | ||
5 | use Yii; | 5 | use Yii; |
6 | -use yii\log\Logger; | 6 | +use yii\web\IdentityInterface; |
7 | use domain\user\models\User as UserModel; | 7 | use domain\user\models\User as UserModel; |
8 | 8 | ||
9 | /** | 9 | /** |
10 | * Class User | 10 | * Class User |
11 | * @package app\wx\models | 11 | * @package app\wx\models |
12 | */ | 12 | */ |
13 | -class User extends UserModel | 13 | +class User extends UserModel implements IdentityInterface |
14 | { | 14 | { |
15 | 15 | ||
16 | + static $id = null; | ||
16 | public function register() | 17 | public function register() |
17 | { | 18 | { |
18 | 19 | ||
@@ -30,5 +31,110 @@ class User extends UserModel | @@ -30,5 +31,110 @@ class User extends UserModel | ||
30 | 31 | ||
31 | } | 32 | } |
32 | 33 | ||
34 | + /** | ||
35 | + * Finds an identity by the given ID. | ||
36 | + * | ||
37 | + * @param string|int $id the ID to be looked for | ||
38 | + * @return IdentityInterface|null the identity object that matches the given ID. | ||
39 | + */ | ||
40 | + public static function findIdentity($id) | ||
41 | + { | ||
42 | + return static::findOne($id); | ||
43 | + } | ||
44 | + | ||
45 | + /** | ||
46 | + * Finds an identity by the given token. | ||
47 | + * | ||
48 | + * @param string $token the token to be looked for | ||
49 | + * @return IdentityInterface|null the identity object that matches the given token. | ||
50 | + */ | ||
51 | + public static function findIdentityByAccessToken($token, $type = null) | ||
52 | + { | ||
53 | + return static::findOne(['access_token' => $token]); | ||
54 | + } | ||
55 | + | ||
56 | + /** | ||
57 | + * @inheritdoc | ||
58 | + */ | ||
59 | + public function getId() | ||
60 | + { | ||
61 | + return self::getIdFromSession(); | ||
62 | + } | ||
63 | + | ||
64 | + /** | ||
65 | + * @inheritdoc | ||
66 | + */ | ||
67 | + public function getAuthKey() | ||
68 | + { | ||
69 | + return ''; | ||
70 | + } | ||
71 | + | ||
72 | + /** | ||
73 | + * @inheritdoc | ||
74 | + */ | ||
75 | + public function validateAuthKey($authKey) | ||
76 | + { | ||
77 | + return true; | ||
78 | + } | ||
79 | + | ||
80 | + /** | ||
81 | + * Validates password | ||
82 | + * | ||
83 | + * @param string $password password to validate | ||
84 | + * @return bool if password provided is valid for current user | ||
85 | + */ | ||
86 | + public function validatePassword($password) | ||
87 | + { | ||
88 | + return true ;//Yii::$app->security->validatePassword($password, $this->password_hash); | ||
89 | + } | ||
90 | + | ||
91 | + /** | ||
92 | + * Generates password hash from password and sets it to the model | ||
93 | + * | ||
94 | + * @param string $password | ||
95 | + */ | ||
96 | + public function setPassword($password) | ||
97 | + { | ||
98 | + $this->password_hash = Yii::$app->security->generatePasswordHash($password); | ||
99 | + } | ||
100 | + | ||
101 | + /** | ||
102 | + * Generates "remember me" authentication key | ||
103 | + */ | ||
104 | + public function generateAuthKey() | ||
105 | + { | ||
106 | + $this->auth_key = Yii::$app->security->generateRandomString(); | ||
107 | + } | ||
108 | + | ||
109 | + /** | ||
110 | + * Generates new password reset token | ||
111 | + */ | ||
112 | + public function generatePasswordResetToken() | ||
113 | + { | ||
114 | + $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); | ||
115 | + } | ||
116 | + | ||
117 | + /** | ||
118 | + * Removes password reset token | ||
119 | + */ | ||
120 | + public function removePasswordResetToken() | ||
121 | + { | ||
122 | + $this->password_reset_token = null; | ||
123 | + } | ||
124 | + | ||
125 | + /** | ||
126 | + * @return mixed|null | ||
127 | + */ | ||
128 | + protected static function getIdFromSession() | ||
129 | + { | ||
130 | + if (null === self::$id){ | ||
131 | + $user = Yii::$app->getUser(); | ||
132 | + $session = Yii::$app->getSession(); | ||
133 | + $id = $session->getHasSessionId() || $session->getIsActive() ? $session->get($user->idParam) : null; | ||
134 | + self::$id = $id; | ||
135 | + } | ||
136 | + | ||
137 | + return self::$id; | ||
138 | + } | ||
33 | 139 | ||
34 | } | 140 | } |
app-wx/modules/order/controllers/BaseController.php
@@ -7,7 +7,7 @@ use app\wx\controllers\BaseController as AppBaseController; | @@ -7,7 +7,7 @@ use app\wx\controllers\BaseController as AppBaseController; | ||
7 | 7 | ||
8 | /** | 8 | /** |
9 | * Class BaseController | 9 | * Class BaseController |
10 | - * @package app\wx\modules\toutiao\controllers | 10 | + * @package app\wx\modules\order\controllers |
11 | */ | 11 | */ |
12 | class BaseController extends AppBaseController | 12 | class BaseController extends AppBaseController |
13 | { | 13 | { |
@@ -19,6 +19,6 @@ class BaseController extends AppBaseController | @@ -19,6 +19,6 @@ class BaseController extends AppBaseController | ||
19 | public function init() | 19 | public function init() |
20 | { | 20 | { |
21 | parent::init(); // TODO: Change the autogenerated stub | 21 | parent::init(); // TODO: Change the autogenerated stub |
22 | - //$this->handleMallAccessCtrl(); | 22 | + $this->handleMallAccessCtrl(); |
23 | } | 23 | } |
24 | } | 24 | } |
25 | \ No newline at end of file | 25 | \ No newline at end of file |
app-wx/modules/order/controllers/CustomerBaseController.php
0 → 100644
@@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\wx\modules\order\controllers; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use app\wx\controllers\BaseController as AppBaseController; | ||
7 | + | ||
8 | +/** | ||
9 | + * Class BaseController | ||
10 | + * @package app\wx\modules\order\controllers | ||
11 | + */ | ||
12 | +class CustomerBaseController 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,98 @@ | @@ -0,0 +1,98 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace app\wx\modules\order\controllers; | ||
4 | + | ||
5 | +use Yii; | ||
6 | + | ||
7 | + | ||
8 | +use domain\order\RepairOrderRepository; | ||
9 | +use domain\order\RepairOrderStatus; | ||
10 | + | ||
11 | +use stdClass; | ||
12 | + | ||
13 | +/** | ||
14 | + * 控制器 | ||
15 | + */ | ||
16 | +class CustomerController extends CustomerBaseController | ||
17 | +{ | ||
18 | + /** | ||
19 | + * 首页 | ||
20 | + */ | ||
21 | + public function actionIndex() | ||
22 | + { | ||
23 | + return $this->render('/default/cindex'); | ||
24 | + } | ||
25 | + | ||
26 | + /** | ||
27 | + * @return string | ||
28 | + */ | ||
29 | + public function actionOrderDetails() | ||
30 | + { | ||
31 | + $e = new stdClass(); | ||
32 | + $e->success = false; | ||
33 | + $e->message = 'ok'; | ||
34 | + $orderUUId = $this->request->post('id'); | ||
35 | + $md5Mobile = $this->request->post('sn'); | ||
36 | + | ||
37 | + $orderModel = RepairOrderRepository::findOne(['uuid' => $orderUUId]); | ||
38 | + if (empty($orderModel)) { | ||
39 | + $e->message = '找不到该订单'; | ||
40 | + return $this->renderJson($e); | ||
41 | + } | ||
42 | + $brokenImageModels = RepairOrderRepository::findOrderImageAll(['repair_order_id' => $orderModel->id]); | ||
43 | + $brokenImages = []; | ||
44 | + $baseURL = Yii::$app->request->getHostInfo(); | ||
45 | + foreach($brokenImageModels as $k => $v) { | ||
46 | + $brokenImages[] = $baseURL.'/'.$v->image_path; | ||
47 | + } | ||
48 | + $totalPrice = $orderModel->order_price; | ||
49 | + $rPlans = RepairOrderRepository::findOrderPlansAll(['repair_order_id' => $orderModel->id]); | ||
50 | + $repairPlans = []; | ||
51 | + foreach($rPlans as $k => $plan) { | ||
52 | + $repairPlans[] = ['plan' => $plan['repair_plan'] ,'price' => $plan['price']]; | ||
53 | + } | ||
54 | + $fImages = RepairOrderRepository::findOrderFinishImageAll(['repair_order_id' => $orderModel->id]); | ||
55 | + $finishImages = []; | ||
56 | + foreach($fImages as $k => $image) { | ||
57 | + $finishImages[] = $baseURL.'/'.$image['image_path']; | ||
58 | + } | ||
59 | + $hasComment = false; | ||
60 | + | ||
61 | + $e->success = true; | ||
62 | + $e->item = [ | ||
63 | + 'carNo' => $orderModel->car_no, | ||
64 | + 'carModel' => $orderModel->car_model, | ||
65 | + 'customer' => $orderModel->customer, | ||
66 | + 'mobile' => '1*****'.substr($orderModel->contact_mobile,7,4), | ||
67 | + 'preRepair' => $orderModel->predict_fault, | ||
68 | + 'repairPrice' => $orderModel->predict_price.'元', | ||
69 | + 'preFinishDate' => date('Y-m-d H:00', $orderModel->predict_finish_time), | ||
70 | + 'orderDateTime' => date('Y-m-d H:00', $orderModel->created_at), | ||
71 | + 'status' => RepairOrderStatus::getEnLabel($orderModel->status), | ||
72 | + 'hasComment' => $hasComment, | ||
73 | + 'brokenImages' => $brokenImages, | ||
74 | + 'repairPlans' => $repairPlans, | ||
75 | + 'totalPrice' => $totalPrice, | ||
76 | + 'finishImages' => $finishImages | ||
77 | + ]; | ||
78 | + | ||
79 | + return $this->renderJson($e); | ||
80 | + } | ||
81 | + | ||
82 | + /** | ||
83 | + * @return string | ||
84 | + */ | ||
85 | + public function actionSubmitRate() | ||
86 | + { | ||
87 | + $e = new stdClass(); | ||
88 | + $e->success = false; | ||
89 | + $e->message = 'ok'; | ||
90 | + $star = $this->request->post('star'); | ||
91 | + $comment = $this->request->post('comment'); | ||
92 | + | ||
93 | + //echo $star.'_'.$comment; | ||
94 | + $e->success = true; | ||
95 | + return $this->renderJson($e); | ||
96 | + } | ||
97 | + | ||
98 | +} | ||
0 | \ No newline at end of file | 99 | \ No newline at end of file |
app-wx/modules/order/controllers/DefaultController.php
@@ -3,8 +3,17 @@ | @@ -3,8 +3,17 @@ | ||
3 | namespace app\wx\modules\order\controllers; | 3 | namespace app\wx\modules\order\controllers; |
4 | 4 | ||
5 | use Yii; | 5 | use Yii; |
6 | -use stdClass; | ||
7 | use yii\helpers\HtmlPurifier; | 6 | use yii\helpers\HtmlPurifier; |
7 | +use yii\base\Exception; | ||
8 | + | ||
9 | +use domain\order\RepairOrder; | ||
10 | +use domain\order\RepairOrderImages; | ||
11 | +use domain\order\RepairOrderRepository; | ||
12 | +use domain\order\RepairOrderStatus; | ||
13 | +use domain\order\RepairFinishImages; | ||
14 | +use domain\order\RepairOrderRepairPlan; | ||
15 | + | ||
16 | +use stdClass; | ||
8 | 17 | ||
9 | /** | 18 | /** |
10 | * 控制器 | 19 | * 控制器 |
@@ -27,19 +36,58 @@ class DefaultController extends BaseController | @@ -27,19 +36,58 @@ class DefaultController extends BaseController | ||
27 | $e = new stdClass(); | 36 | $e = new stdClass(); |
28 | $e->success = false; | 37 | $e->success = false; |
29 | $e->message = 'ok'; | 38 | $e->message = 'ok'; |
30 | - $userId = 0; | ||
31 | - $req = Yii::$app->request; | ||
32 | - $carNo = HtmlPurifier::process($req->post('carNo'), ['HTML.Allowed' => '']); | ||
33 | - $carModel = HtmlPurifier::process($req->post('carModel'), ['HTML.Allowed' => '']); | ||
34 | - $customer = HtmlPurifier::process($req->post('customer'), ['HTML.Allowed' => '']); | ||
35 | - $phone = HtmlPurifier::process($req->post('phone'), ['HTML.Allowed' => '']); | ||
36 | - $preRepair = HtmlPurifier::process($req->post('preRepair'), ['HTML.Allowed' => '']); | ||
37 | - $repairPrice = HtmlPurifier::process($req->post('repairPrice'), ['HTML.Allowed' => '']); | ||
38 | - $finishDate = HtmlPurifier::process($req->post('finishDate'), ['HTML.Allowed' => '']); | ||
39 | - $images = $req->post('images'); | ||
40 | - | ||
41 | - //echo $carNo.'_'.$carModel.'_'.$customer.'_'.$phone.'_'.$preRepair.'_'.$repairPrice.'_'.$finishDate.'_'.json_encode($images); | ||
42 | - $e->success = true; | 39 | + $userId = $this->getUserId(); |
40 | + $req = Yii::$app->request; | ||
41 | + $carNo = HtmlPurifier::process($req->post('carNo'), ['HTML.Allowed' => '']); | ||
42 | + $carModel = HtmlPurifier::process($req->post('carModel'), ['HTML.Allowed' => '']); | ||
43 | + $customer = HtmlPurifier::process($req->post('customer'), ['HTML.Allowed' => '']); | ||
44 | + $phone = HtmlPurifier::process($req->post('phone'), ['HTML.Allowed' => '']); | ||
45 | + $preRepair = HtmlPurifier::process($req->post('preRepair'), ['HTML.Allowed' => '']); | ||
46 | + $predictPrice = HtmlPurifier::process($req->post('repairPrice'), ['HTML.Allowed' => '']); | ||
47 | + $finishDate = HtmlPurifier::process($req->post('finishDate'), ['HTML.Allowed' => '']); | ||
48 | + $images = $req->post('images'); | ||
49 | + | ||
50 | + if (empty($carNo)) { | ||
51 | + $e->message = '车牌号码未填'; | ||
52 | + return $this->renderJson($e); | ||
53 | + } | ||
54 | + | ||
55 | + if (empty($carModel)) { | ||
56 | + $e->message = '车辆型号未填'; | ||
57 | + return $this->renderJson($e); | ||
58 | + } | ||
59 | + | ||
60 | + if (empty($phone)) { | ||
61 | + $e->message = '联系电话未填'; | ||
62 | + return $this->renderJson($e); | ||
63 | + } | ||
64 | + | ||
65 | + $data = [ | ||
66 | + 'user_id' => $userId, | ||
67 | + 'car_no' => $carNo, | ||
68 | + 'car_model' => $carModel, | ||
69 | + 'customer' => $customer, | ||
70 | + 'contact_mobile' => $phone, | ||
71 | + 'predict_fault' => $preRepair, | ||
72 | + 'predict_price' => $predictPrice, | ||
73 | + 'predict_finish_time' => strtotime($finishDate.':00:00'), | ||
74 | + 'status' => RepairOrderStatus::REPAIRING, | ||
75 | + ]; | ||
76 | + $tran = Yii::$app->db->beginTransaction(); | ||
77 | + try { | ||
78 | + $repairOrder = RepairOrder::create($data); | ||
79 | + $uuid = $repairOrder->uuid; | ||
80 | + RepairOrderImages::createBrokenImages($repairOrder->id, $uuid, $images); | ||
81 | + $tran->commit(); | ||
82 | + RepairOrderImages::mvBrokenImages($uuid, $images); | ||
83 | + $e->orderId = $uuid; | ||
84 | + $e->success = true; | ||
85 | + } catch(Exception $ex) { | ||
86 | + $tran->rollBack(); | ||
87 | + $e->orderId = ''; | ||
88 | + $e->message = '提交失败'; | ||
89 | + } | ||
90 | + | ||
43 | return $this->renderJson($e); | 91 | return $this->renderJson($e); |
44 | } | 92 | } |
45 | 93 | ||
@@ -106,34 +154,48 @@ class DefaultController extends BaseController | @@ -106,34 +154,48 @@ class DefaultController extends BaseController | ||
106 | $e = new stdClass(); | 154 | $e = new stdClass(); |
107 | $e->success = false; | 155 | $e->success = false; |
108 | $e->message = 'ok'; | 156 | $e->message = 'ok'; |
157 | + $orderUUId = $this->request->post('id'); | ||
158 | + $userId = $this->getUserId(); | ||
159 | + $orderModel = RepairOrderRepository::findOne(['uuid' => $orderUUId, 'user_id' => $userId]); | ||
160 | + if (empty($orderModel)) { | ||
161 | + $e->message = '找不到该订单'; | ||
162 | + return $this->renderJson($e); | ||
163 | + } | ||
164 | + $brokenImageModels = RepairOrderRepository::findOrderImageAll(['repair_order_id' => $orderModel->id]); | ||
165 | + $brokenImages = []; | ||
166 | + $baseURL = Yii::$app->request->getHostInfo(); | ||
167 | + foreach($brokenImageModels as $k => $v) { | ||
168 | + $brokenImages[] = $baseURL.'/'.$v->image_path; | ||
169 | + } | ||
170 | + $totalPrice = $orderModel->order_price; | ||
171 | + $rPlans = RepairOrderRepository::findOrderPlansAll(['repair_order_id' => $orderModel->id]); | ||
172 | + $repairPlans = []; | ||
173 | + foreach($rPlans as $k => $plan) { | ||
174 | + $repairPlans[] = ['plan' => $plan['repair_plan'] ,'price' => $plan['price']]; | ||
175 | + } | ||
176 | + $fImages = RepairOrderRepository::findOrderFinishImageAll(['repair_order_id' => $orderModel->id]); | ||
177 | + $finishImages = []; | ||
178 | + foreach($fImages as $k => $image) { | ||
179 | + $finishImages[] = $baseURL.'/'.$image['image_path']; | ||
180 | + } | ||
181 | + $hasComment = false; | ||
109 | 182 | ||
110 | $e->success = true; | 183 | $e->success = true; |
111 | $e->item = [ | 184 | $e->item = [ |
112 | - 'carNo' => 'XX12345', | ||
113 | - 'carModel' => '宝马X3', | ||
114 | - 'customer' => '李先生', | ||
115 | - 'mobile' => '13900139001', | ||
116 | - 'preRepair' => '更换轮胎', | ||
117 | - 'repairPrice' => '300元', | ||
118 | - 'preFinishDate' => '2019-12-15 15:00', | ||
119 | - 'orderDateTime' => '2019-12-14 15:00', | ||
120 | - 'status' => 'finish', | ||
121 | - 'hasComment' => false, | ||
122 | - 'brokenImages' => [ | ||
123 | - Yii::$app->request->baseUrl.'/i/order/demo.jpg', Yii::$app->request->baseUrl.'/i/order/demo.jpg', Yii::$app->request->baseUrl.'/i/order/demo.jpg' | ||
124 | - ], | ||
125 | - 'repairPlans' => [ | ||
126 | - ['content' => '更换车胎', | ||
127 | - 'price' => 450], | ||
128 | - ['content' => '更换车胎', | ||
129 | - 'price' => 450], | ||
130 | - ['content' => '更换车胎', | ||
131 | - 'price' => 450], | ||
132 | - ], | ||
133 | - 'totalPrice' => 1350, | ||
134 | - 'finishImages' => [ | ||
135 | - Yii::$app->request->baseUrl.'/i/order/demo.jpg', Yii::$app->request->baseUrl.'/i/order/demo.jpg', Yii::$app->request->baseUrl.'/i/order/demo.jpg' | ||
136 | - ] | 185 | + 'carNo' => $orderModel->car_no, |
186 | + 'carModel' => $orderModel->car_model, | ||
187 | + 'customer' => $orderModel->customer, | ||
188 | + 'mobile' => $orderModel->contact_mobile, | ||
189 | + 'preRepair' => $orderModel->predict_fault, | ||
190 | + 'repairPrice' => $orderModel->predict_price.'元', | ||
191 | + 'preFinishDate' => date('Y-m-d H:00', $orderModel->predict_finish_time), | ||
192 | + 'orderDateTime' => date('Y-m-d H:00', $orderModel->created_at), | ||
193 | + 'status' => RepairOrderStatus::getEnLabel($orderModel->status), | ||
194 | + 'hasComment' => $hasComment, | ||
195 | + 'brokenImages' => $brokenImages, | ||
196 | + 'repairPlans' => $repairPlans, | ||
197 | + 'totalPrice' => $totalPrice, | ||
198 | + 'finishImages' => $finishImages | ||
137 | ]; | 199 | ]; |
138 | 200 | ||
139 | return $this->renderJson($e); | 201 | return $this->renderJson($e); |
@@ -149,23 +211,38 @@ class DefaultController extends BaseController | @@ -149,23 +211,38 @@ class DefaultController extends BaseController | ||
149 | $e->message = 'ok'; | 211 | $e->message = 'ok'; |
150 | $repairPlans = $this->request->post('plans'); | 212 | $repairPlans = $this->request->post('plans'); |
151 | $images = $this->request->post('images'); | 213 | $images = $this->request->post('images'); |
214 | + $orderUUId = $this->request->post('id'); | ||
215 | + $userId = $this->getUserId(); | ||
216 | + $orderModel = RepairOrderRepository::findOne(['uuid' => $orderUUId, 'user_id' => $userId]); | ||
152 | 217 | ||
153 | - //print_r($images); | ||
154 | - //print_r($repairPlans); | ||
155 | - $e->success = true; | ||
156 | - return $this->renderJson($e); | ||
157 | - } | 218 | + if (empty($orderModel)) { |
219 | + $e->message = '找不到订单'; | ||
220 | + return $this->renderJson($e); | ||
221 | + } | ||
158 | 222 | ||
159 | - public function actionSubmitRate() | ||
160 | - { | ||
161 | - $e = new stdClass(); | ||
162 | - $e->success = false; | ||
163 | - $e->message = 'ok'; | ||
164 | - $star = $this->request->post('star'); | ||
165 | - $comment = $this->request->post('comment'); | 223 | + if (RepairOrderStatus::FINISH == $orderModel->status) { |
224 | + $e->message = '订单已完成,不能编辑'; | ||
225 | + return $this->renderJson($e); | ||
226 | + } | ||
227 | + $orderId = $orderModel->id; | ||
228 | + $tran = Yii::$app->db->beginTransaction(); | ||
229 | + try { | ||
230 | + $totalPrice = RepairOrderRepairPlan::batchCreate($orderId, $repairPlans); | ||
231 | + RepairFinishImages::createFinishImages($orderId, $orderModel->uuid, $images); | ||
232 | + $orderModel->status = RepairOrderStatus::FINISH; | ||
233 | + $orderModel->finish_at = time(); | ||
234 | + $orderModel->order_price = $totalPrice; | ||
235 | + $orderModel->save(); | ||
236 | + $tran->commit(); | ||
237 | + RepairFinishImages::mvFinishImages($orderModel->uuid, $images); | ||
238 | + $e->success = true; | ||
239 | + } catch (Exception $ex) { | ||
240 | + $tran->rollBack(); | ||
241 | + $e->success = false; | ||
242 | + $e->message = '提交失败'; | ||
243 | + $e->innerMEssage = $ex->getMessage(); | ||
244 | + } | ||
166 | 245 | ||
167 | - echo $star.'_'.$comment; | ||
168 | - $e->success = true; | ||
169 | return $this->renderJson($e); | 246 | return $this->renderJson($e); |
170 | } | 247 | } |
171 | 248 |
@@ -0,0 +1,40 @@ | @@ -0,0 +1,40 @@ | ||
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 | +<div> | ||
23 | + | ||
24 | +</div> | ||
25 | +<?=$this->render('pages/rate-template', ['asset' => $asset])?> | ||
26 | +<?=$this->render('pages/customer-order-template', ['asset' => $asset])?> | ||
27 | + | ||
28 | +<script> | ||
29 | + require.config({baseUrl: $site.assets_url + '/js/',urlArgs : "v=" + require.version}); | ||
30 | + require([ | ||
31 | + 'order-app' | ||
32 | + ], | ||
33 | + function(app){ | ||
34 | + app.bootstrap({ | ||
35 | + baseUrl: $site.base_url | ||
36 | + }); | ||
37 | + }); | ||
38 | +</script> | ||
39 | + | ||
40 | +<?=$this->render("@app/views/widgets/stat-code")?> |
app-wx/modules/order/views/default/index.php
@@ -21,10 +21,10 @@ function img($file, $path = '/i/') | @@ -21,10 +21,10 @@ function img($file, $path = '/i/') | ||
21 | </div> | 21 | </div> |
22 | 22 | ||
23 | <?=$this->render('pages/index-template', ['asset' => $asset])?> | 23 | <?=$this->render('pages/index-template', ['asset' => $asset])?> |
24 | -<?=$this->render('pages/rate-template', ['asset' => $asset])?> | ||
25 | <?=$this->render('pages/submit-template', ['asset' => $asset])?> | 24 | <?=$this->render('pages/submit-template', ['asset' => $asset])?> |
26 | <?=$this->render('pages/cost-list-template', ['asset' => $asset])?> | 25 | <?=$this->render('pages/cost-list-template', ['asset' => $asset])?> |
27 | <?=$this->render('pages/order-details-template', ['asset' => $asset])?> | 26 | <?=$this->render('pages/order-details-template', ['asset' => $asset])?> |
27 | +<?=$this->render('pages/customer-order-template', ['asset' => $asset])?> | ||
28 | 28 | ||
29 | <script> | 29 | <script> |
30 | require.config({baseUrl: $site.assets_url + '/js/',urlArgs : "v=" + require.version}); | 30 | require.config({baseUrl: $site.assets_url + '/js/',urlArgs : "v=" + require.version}); |
app-wx/modules/order/views/default/pages/customer-order-template.php
0 → 100644
@@ -0,0 +1,199 @@ | @@ -0,0 +1,199 @@ | ||
1 | +<?php | ||
2 | +use yii\helpers\Url; | ||
3 | +$baseUrl = Url::base(true); | ||
4 | +?> | ||
5 | +<style> | ||
6 | + body,div,p,span,input,ul,li{padding: 0;margin: 0} | ||
7 | + input{-webkit-appearance: none;} | ||
8 | + ul,li{list-style: none } | ||
9 | + #customer-order .content-div { width:100%; background: #fff; display:inline-flex;padding-top: 1rem} | ||
10 | + #customer-order .left-title-div {width:33%; font-size:1rem; font-weight:400; color:rgba(0,0,0,1); line-height:1.81rem;} | ||
11 | + #customer-order .center-content-div {width:47%; font-size:1rem; font-weight:400; color:rgba(118,118,118,1); line-height:1.81rem;} | ||
12 | + #customer-order .right-content-div {width:20%;font-size:0.94rem; font-weight:400; color:rgba(255,255,255,1);line-height:1.81rem;} | ||
13 | + #customer-order .content-div-two {width:100%; background: #fff; display:inline-flex;height: 1.81rem;} | ||
14 | + #customer-order .page-content{ background-color: #ECF0F2 } | ||
15 | + #customer-order .content-list-div {padding-bottom: 1rem} | ||
16 | + #customer-order .status-tip {width: 4.81rem; | ||
17 | + padding: 0.2rem 0; | ||
18 | + height: 1.81rem; | ||
19 | + background-color:#ff7b24; | ||
20 | + border-top-left-radius: 1rem; | ||
21 | + border-bottom-left-radius: 1rem; | ||
22 | + text-align: center; | ||
23 | + float: right;} | ||
24 | + #customer-order .btn-submit-cls{width:85%;text-align: center;margin: 2rem auto;margin-top:2.5rem; | ||
25 | + background:rgba(255,135,40,1); border-radius:2rem; font-size:1.06rem; font-weight:400; | ||
26 | + color:rgba(255,255,255,1);padding:1rem 0 } | ||
27 | + #customer-order .pic-div { | ||
28 | + width:100%; background: #fff; display:inline-flex;height: 1.81rem; | ||
29 | + } | ||
30 | + #customer-order .pic-image-div { | ||
31 | + width: 100%;background: #fff; padding-bottom: 1rem; margin: 0 auto; | ||
32 | + } | ||
33 | + #customer-order .pic-image-list { | ||
34 | + padding: 0.5rem 1rem;box-sizing: border-box;width:100%;display: block;overflow: hidden; | ||
35 | + } | ||
36 | + #customer-order .pic-image-list .img-cls{width:25%;box-sizing: border-box;float:left;padding-top:0.3rem;padding-right:0.3rem;} | ||
37 | + | ||
38 | + #customer-order .pic-class { margin-right: 0.5rem width:100%;height:0;padding-bottom: 100%;overflow:hidden; | ||
39 | + background-position: center center; | ||
40 | + background-repeat: no-repeat; | ||
41 | + -webkit-background-size:cover; | ||
42 | + -moz-background-size:cover;background-size:cover;position: relative} | ||
43 | + #customer-order .padding-left-1rem {padding-left: 1rem} | ||
44 | + #customer-order .content-wrapper{background:#fff;padding:1rem;box-sizing: border-box;margin-bottom:0.8rem;} | ||
45 | + #customer-order .content-wrapper .content-title{font-size: 1.06rem;color:#000;font-weight: bold;padding-bottom: 0.8rem;} | ||
46 | + #customer-order .content-wrapper .bullet-point{color: #fff;background: #ff7b24;border: 0;display: block;height:1rem;width: 1.0rem;text-align: center;border-radius: 0.5rem;font-size: 0.7rem;line-height: 1rem;} | ||
47 | + #customer-order .content-wrapper .plan-right-cls{padding-bottom: 0.5rem;margin-left:0.5rem;width:100%;} | ||
48 | + #customer-order .content-wrapper .plan-price-cls{font-size:0.75rem;color:#333;line-height: 1.5rem;} | ||
49 | + #customer-order .content-wrapper .repair-plan-list{width:100%;display: block;position: relative} | ||
50 | + #customer-order .content-wrapper .repair-plan-list:after{content:'';width:100%;height: 1px;background:#DBDBDB;display:block;} | ||
51 | + #customer-order .content-wrapper .total-price-cls{margin-top:0.5rem;color:#000} | ||
52 | + #customer-order .content-wrapper .finish-image-list{width:100%;display:block;} | ||
53 | + #customer-order .content-wrapper .finish-image-ul{width:100%;display:block;overflow: hidden;box-sizing: border-box;} | ||
54 | + #customer-order .content-wrapper .finish-image-li{width:25%;display:block;padding-top:0.3rem;padding-right:0.3rem;float:left;box-sizing: border-box;} | ||
55 | + #customer-order .content-wrapper .finishImage{width: 100%; | ||
56 | + height: 0; | ||
57 | + padding-bottom: 100%; | ||
58 | + overflow: hidden; | ||
59 | + background-position: center center; | ||
60 | + background-repeat: no-repeat; | ||
61 | + -webkit-background-size: cover; | ||
62 | + -moz-background-size: cover; | ||
63 | + background-size: cover; | ||
64 | + position: relative;} | ||
65 | + #customer-order .content-wrapper .comment-box{width:100%;display: flex;color:#000;align-items: center;justify-content: space-between;font-size: 1rem;} | ||
66 | + #customer-order .content-wrapper .rate-btn-cls{color:#fff;border-radius: 1.5rem;padding:0.6rem 0.8rem;text-align: center;background:#FF8728;width:4rem;} | ||
67 | + #customer-order .content-wrapper .comment-txt-cls{color:#000;font-size: 1rem;line-height: 1.5rem } | ||
68 | +</style> | ||
69 | +<script id="customer-order-template" type="text/template"> | ||
70 | + <div class="pages"> | ||
71 | + <div class="page" id="customer-order" style="background: #fff"> | ||
72 | + <div class="page-content"> | ||
73 | + <div class="content-list-div"> | ||
74 | + <div class="content-div"> | ||
75 | + <div class="left-title-div"><span class="padding-left-1rem">车牌号码</span></div> | ||
76 | + <div class="center-content-div">{{item.carNo}} </div> | ||
77 | + <div class="right-content-div"> | ||
78 | + {{#js_compare "'working' == this.item.status"}} | ||
79 | + <span class="status-tip"> | ||
80 | + 进行中 | ||
81 | + </span> | ||
82 | + {{else}} | ||
83 | + <span class="status-tip" style="color:#FFA903;background:#fef0d5"> | ||
84 | + 已完成 | ||
85 | + </span> | ||
86 | + {{/js_compare}} | ||
87 | + </div> | ||
88 | + </div> | ||
89 | + <div class="content-div-two"> | ||
90 | + <div class="left-title-div"><span class="padding-left-1rem">车辆型号</span></div> | ||
91 | + <div class="center-content-div">{{item.carModel}}</div> | ||
92 | + <div class="right-content-div"> | ||
93 | + </div> | ||
94 | + </div> | ||
95 | + <div class="content-div-two"> | ||
96 | + <div class="left-title-div"><span class="padding-left-1rem">客户名称</span></div> | ||
97 | + <div class="center-content-div">{{item.customer}}</div> | ||
98 | + <div class="right-content-div"> | ||
99 | + </div> | ||
100 | + </div> | ||
101 | + <div class="content-div-two"> | ||
102 | + <div class="left-title-div"><span class="padding-left-1rem">联系电话</span></div> | ||
103 | + <div class="center-content-div">{{item.mobile}}</div> | ||
104 | + <div class="right-content-div"> | ||
105 | + </div> | ||
106 | + </div> | ||
107 | + <div class="content-div-two"> | ||
108 | + <div class="left-title-div"><span class="padding-left-1rem">预估维修内容</span></div> | ||
109 | + <div class="center-content-div">{{item.preRepair}}</div> | ||
110 | + <div class="right-content-div"> | ||
111 | + </div> | ||
112 | + </div> | ||
113 | + <div class="content-div-two"> | ||
114 | + <div class="left-title-div"><span class="padding-left-1rem">预估维修费用</span></div> | ||
115 | + <div class="center-content-div">{{item.repairPrice}}</div> | ||
116 | + <div class="right-content-div"> | ||
117 | + </div> | ||
118 | + </div> | ||
119 | + <div class="content-div-two"> | ||
120 | + <div class="left-title-div"><span class="padding-left-1rem">预估完成时间</span></div> | ||
121 | + <div class="center-content-div">{{item.preFinishDate}}</div> | ||
122 | + <div class="right-content-div"> | ||
123 | + </div> | ||
124 | + </div> | ||
125 | + <div class="content-div-two"> | ||
126 | + <div class="left-title-div"><span class="padding-left-1rem">订单创建时间</span></div> | ||
127 | + <div class="center-content-div">{{item.orderDateTime}}</div> | ||
128 | + <div class="right-content-div"> | ||
129 | + </div> | ||
130 | + </div> | ||
131 | + <div class="pic-div"> | ||
132 | + <div class="left-title-div"><span class="padding-left-1rem">车损照片</span></div> | ||
133 | + </div> | ||
134 | + <div class="pic-image-div"> | ||
135 | + <div class="pic-image-list"> | ||
136 | + {{#each item.brokenImages}} | ||
137 | + <div class="img-cls"> | ||
138 | + <div class="pic-class" style="background-image: url({{this}})"></div> | ||
139 | + </div> | ||
140 | + {{/each}} | ||
141 | + </div> | ||
142 | + </div> | ||
143 | + </div> | ||
144 | + {{#js_compare "'working' == this.item.status"}} | ||
145 | + <div class="finish-submit btn-submit-cls"> 完成维修 </div> | ||
146 | + {{/js_compare}} | ||
147 | + {{#js_compare "'finish' == this.item.status"}} | ||
148 | + <div class="content-wrapper"> | ||
149 | + <div class="content-title">维修费用清单</div> | ||
150 | + <ul class="repair-plan-list"> | ||
151 | + {{#each this.item.repairPlans}} | ||
152 | + <li style="width:100%;display: flex;"> | ||
153 | + <div class="bullet-point">{{@index+1}}</div> | ||
154 | + <div class="plan-right-cls"> | ||
155 | + <p style="color:#000;font-size: 1rem;">{{plan}}</p> | ||
156 | + <p class="plan-price-cls">金额: ¥{{price}}</p> | ||
157 | + </div> | ||
158 | + </li> | ||
159 | + {{/each}} | ||
160 | + </ul> | ||
161 | + <div class="total-price-cls">总金额: ¥{{this.item.totalPrice}}</div> | ||
162 | + </div> | ||
163 | + | ||
164 | + {{#js_compare "this.item.finishImages.length > 0"}} | ||
165 | + <div class="content-wrapper"> | ||
166 | + <div class="content-title">维修完成照片</div> | ||
167 | + <div class="finish-image-list"> | ||
168 | + <ul class="finish-image-ul"> | ||
169 | + {{#each this.item.finishImages}} | ||
170 | + <li class="finish-image-li"> | ||
171 | + <div class="finishImage" style="background-image:url('{{this}}')"> </div></li> | ||
172 | + {{/each}} | ||
173 | + </ul> | ||
174 | + </div> | ||
175 | + </div> | ||
176 | + {{/js_compare}} | ||
177 | + | ||
178 | + <div class="content-wrapper" style="font-size: 1rem;"> | ||
179 | + GK车管家 <span style="color:#FF8728">《质保承诺》</span> | ||
180 | + </div> | ||
181 | + | ||
182 | + <div class="content-wrapper"> | ||
183 | + {{#js_compare "this.item.hasComment"}} | ||
184 | + <div class="content-title" style="padding-bottom: 0.5rem">评价</div> | ||
185 | + <div class="comment-txt-cls">服务评价:超赞</div> | ||
186 | + <div class="comment-txt-cls">这次修车体验很好,服务满意!</div> | ||
187 | + {{else}} | ||
188 | + | ||
189 | + <div class="comment-box"><div>您对此次维修服务体验如何?</div> | ||
190 | + <div class="rate-btn-cls">去评价</div> | ||
191 | + </div> | ||
192 | + | ||
193 | + {{/js_compare}} | ||
194 | + </div> | ||
195 | + {{/js_compare}} | ||
196 | + </div> | ||
197 | + </div> | ||
198 | + </div> | ||
199 | +</script> |
app-wx/modules/order/views/default/pages/order-details-template.php
@@ -152,7 +152,7 @@ $baseUrl = Url::base(true); | @@ -152,7 +152,7 @@ $baseUrl = Url::base(true); | ||
152 | <li style="width:100%;display: flex;"> | 152 | <li style="width:100%;display: flex;"> |
153 | <div class="bullet-point">{{@index+1}}</div> | 153 | <div class="bullet-point">{{@index+1}}</div> |
154 | <div class="plan-right-cls"> | 154 | <div class="plan-right-cls"> |
155 | - <p style="color:#000;font-size: 1rem;">{{content}}</p> | 155 | + <p style="color:#000;font-size: 1rem;">{{plan}}</p> |
156 | <p class="plan-price-cls">金额: ¥{{price}}</p> | 156 | <p class="plan-price-cls">金额: ¥{{price}}</p> |
157 | </div> | 157 | </div> |
158 | </li> | 158 | </li> |
@@ -185,9 +185,12 @@ $baseUrl = Url::base(true); | @@ -185,9 +185,12 @@ $baseUrl = Url::base(true); | ||
185 | <div class="comment-txt-cls">服务评价:超赞</div> | 185 | <div class="comment-txt-cls">服务评价:超赞</div> |
186 | <div class="comment-txt-cls">这次修车体验很好,服务满意!</div> | 186 | <div class="comment-txt-cls">这次修车体验很好,服务满意!</div> |
187 | {{else}} | 187 | {{else}} |
188 | + <div class="comment-box">车主暂未评价</div> | ||
189 | + <!-- | ||
188 | <div class="comment-box"><div>您对此次维修服务体验如何?</div> | 190 | <div class="comment-box"><div>您对此次维修服务体验如何?</div> |
189 | <div class="rate-btn-cls">去评价</div> | 191 | <div class="rate-btn-cls">去评价</div> |
190 | </div> | 192 | </div> |
193 | + --> | ||
191 | {{/js_compare}} | 194 | {{/js_compare}} |
192 | </div> | 195 | </div> |
193 | {{/js_compare}} | 196 | {{/js_compare}} |
app-wx/modules/order/views/default/pages/submit-template.php
@@ -94,8 +94,8 @@ $baseUrl = Url::base(true); | @@ -94,8 +94,8 @@ $baseUrl = Url::base(true); | ||
94 | <li class="s-li-item"> | 94 | <li class="s-li-item"> |
95 | <div class="s-li-div"> | 95 | <div class="s-li-div"> |
96 | <label class="s-li-label">预估完成时间<span class="require-cls">*</span></label> | 96 | <label class="s-li-label">预估完成时间<span class="require-cls">*</span></label> |
97 | - <div class="s-li-div-input-box"> | ||
98 | - <input class="s-li-div-input finishDate" type="text" value="" placeholder="请填写预估完成时间" /> | 97 | + <div class="s-li-div-input-box finish-date-btn"> |
98 | + <input class="s-li-div-input finishDate finish-date-input" type="text" value="" readonly placeholder="请填写预估完成时间" /> | ||
99 | </div> | 99 | </div> |
100 | </div> | 100 | </div> |
101 | </li> | 101 | </li> |
app-wx/modules/user/controllers/DefaultController.php
@@ -2,14 +2,9 @@ | @@ -2,14 +2,9 @@ | ||
2 | 2 | ||
3 | namespace app\wx\modules\user\controllers; | 3 | namespace app\wx\modules\user\controllers; |
4 | 4 | ||
5 | -use common\helpers\ImageManager; | ||
6 | -use common\helpers\ImageUtils; | ||
7 | -use common\models\EngineerProfile; | ||
8 | -use domain\toutiao\TtDefaultImageRepository; | ||
9 | -use domain\toutiao\TtNewsImageRepository; | ||
10 | -use domain\toutiao\TtNewsRepository; | ||
11 | -use domain\toutiao\TtType; | 5 | + |
12 | use Yii; | 6 | use Yii; |
7 | +use common\helpers\ImageManager; | ||
13 | use stdClass; | 8 | use stdClass; |
14 | 9 | ||
15 | /** | 10 | /** |
@@ -23,7 +18,8 @@ class DefaultController extends BaseController | @@ -23,7 +18,8 @@ class DefaultController extends BaseController | ||
23 | */ | 18 | */ |
24 | public function actionIndex() | 19 | public function actionIndex() |
25 | { | 20 | { |
26 | - return $this->render('index'); | 21 | + $params = ['isGuest' => Yii::$app->getUser()->isGuest]; |
22 | + return $this->render('index', $params); | ||
27 | } | 23 | } |
28 | 24 | ||
29 | /** | 25 | /** |
@@ -52,19 +48,10 @@ class DefaultController extends BaseController | @@ -52,19 +48,10 @@ class DefaultController extends BaseController | ||
52 | return $this->renderJson($e); | 48 | return $this->renderJson($e); |
53 | } | 49 | } |
54 | 50 | ||
55 | - $dir = Yii::getAlias('@site') . "/tmp"; | ||
56 | - $fileArr = explode('.', $_FILES["file"]['name']); | ||
57 | - $tt = time(); | ||
58 | - $filename = 'auto_'.$tt.md5($_FILES["file"]['name']).'.'.end($fileArr); | ||
59 | - $minFileName = 'auto_'.$tt.md5($_FILES["file"]['name']).'_min'.'.'.end($fileArr); | ||
60 | - $saveFilePath = $dir.'/'.$filename; | ||
61 | - move_uploaded_file($_FILES["file"]['tmp_name'], $saveFilePath); | ||
62 | - $tmpUrl = $tmpMinFile= $this->site->base_url.'/tmp/'.$filename; | ||
63 | - $imgSource = $this->_imageCreateFromPath($saveFilePath); | ||
64 | - if ($imgSource) { | ||
65 | - ImageUtils::resizeImage($imgSource, 100, 100, $dir.'/'.$minFileName); | ||
66 | - $tmpMinFile = $this->site->base_url.'/tmp/'.$minFileName; | ||
67 | - } | 51 | + $uploadInfo = ImageManager::uploadImg($_FILES["file"]); |
52 | + $filename = $uploadInfo[0]; | ||
53 | + $tmpUrl = $this->site->base_url.'/'.$uploadInfo[2]; | ||
54 | + $tmpMinFile = $this->site->base_url.'/'.$uploadInfo[3]; | ||
68 | 55 | ||
69 | $e->success = true; | 56 | $e->success = true; |
70 | $e->tmpFile = $filename; | 57 | $e->tmpFile = $filename; |
@@ -75,20 +62,4 @@ class DefaultController extends BaseController | @@ -75,20 +62,4 @@ class DefaultController extends BaseController | ||
75 | return $this->renderJson($e); | 62 | return $this->renderJson($e); |
76 | } | 63 | } |
77 | 64 | ||
78 | - /** | ||
79 | - * @param $imgPath | ||
80 | - * @return null|resource | ||
81 | - */ | ||
82 | - private function _imageCreateFromPath($imgPath) | ||
83 | - { | ||
84 | - list($width, $height, $type, $attr) = getimagesize($imgPath); | ||
85 | - switch ($type) { | ||
86 | - case 3: // png | ||
87 | - return imagecreatefrompng($imgPath); | ||
88 | - case 2: // jpeg | ||
89 | - return imagecreatefromjpeg($imgPath); | ||
90 | - default: | ||
91 | - return null; | ||
92 | - } | ||
93 | - } | ||
94 | } | 65 | } |
95 | \ No newline at end of file | 66 | \ No newline at end of file |
app-wx/modules/user/controllers/LoginController.php
@@ -2,17 +2,13 @@ | @@ -2,17 +2,13 @@ | ||
2 | 2 | ||
3 | namespace app\wx\modules\user\controllers; | 3 | namespace app\wx\modules\user\controllers; |
4 | 4 | ||
5 | -use common\helpers\ImageManager; | ||
6 | -use common\helpers\ImageUtils; | 5 | +use Yii; |
6 | +use domain\user\User; | ||
7 | use common\helpers\Utils; | 7 | use common\helpers\Utils; |
8 | -use common\models\EngineerProfile; | ||
9 | -use app\wx\models\User; | ||
10 | use common\helpers\Log as AppLog; | 8 | use common\helpers\Log as AppLog; |
11 | -use domain\toutiao\TtDefaultImageRepository; | ||
12 | -use domain\toutiao\TtNewsImageRepository; | ||
13 | -use domain\toutiao\TtNewsRepository; | ||
14 | -use domain\toutiao\TtType; | ||
15 | -use Yii; | 9 | +use domain\user\UserRepository; |
10 | +use common\helpers\ImageManager; | ||
11 | +use domain\user\PhoneCode; | ||
16 | use stdClass; | 12 | use stdClass; |
17 | 13 | ||
18 | /** | 14 | /** |
@@ -20,7 +16,7 @@ use stdClass; | @@ -20,7 +16,7 @@ use stdClass; | ||
20 | */ | 16 | */ |
21 | class LoginController extends BaseController | 17 | class LoginController extends BaseController |
22 | { | 18 | { |
23 | - | 19 | + const CODE_EXPIRE = 120; |
24 | /** | 20 | /** |
25 | * @return string | 21 | * @return string |
26 | */ | 22 | */ |
@@ -29,19 +25,143 @@ class LoginController extends BaseController | @@ -29,19 +25,143 @@ class LoginController extends BaseController | ||
29 | $e = new stdClass(); | 25 | $e = new stdClass(); |
30 | $e->success = false; | 26 | $e->success = false; |
31 | $e->message = 'ok'; | 27 | $e->message = 'ok'; |
32 | - $e->codeDuration = 70; | 28 | + $e->codeDuration = self::CODE_EXPIRE; |
33 | $action = $this->request->get('action'); | 29 | $action = $this->request->get('action'); |
30 | + $mobile = $this->request->get('mobile'); | ||
31 | + if (!Utils::isPhone($mobile)) { | ||
32 | + $e->message = '请输入合格手机号码'; | ||
33 | + return $this->renderJson($e); | ||
34 | + } | ||
35 | + $tt = time(); | ||
34 | if ('login' == $action) { | 36 | if ('login' == $action) { |
37 | + $userInfo = UserRepository::findOne(['mobile' => $mobile]); | ||
38 | + if (empty($userInfo)) { | ||
39 | + $e->message = '登录失败,该手机未注册'; | ||
40 | + return $this->renderJson($e); | ||
41 | + } | ||
42 | + $code = $this->getLoginCode($mobile); | ||
43 | + if ($code) { | ||
44 | + // 发送短信 | ||
45 | + } else { | ||
46 | + $code = $this->setLoginCode($mobile); | ||
47 | + // 发送短信 | ||
48 | + } | ||
35 | 49 | ||
36 | } else { | 50 | } else { |
51 | + $userModel = UserRepository::findOne(['mobile' => $mobile]); | ||
52 | + if ($userModel) { | ||
53 | + $e->message = '该手机号码已经注册过'; | ||
54 | + return $this->renderJson($e); | ||
55 | + } | ||
37 | 56 | ||
57 | + $phoneCode = $this->getRegisterCode($mobile); | ||
58 | + if ($phoneCode) { | ||
59 | + $code = $phoneCode; | ||
60 | + //发送短信 | ||
61 | + } else { | ||
62 | + $code = $this->setRegisterCode($mobile); | ||
63 | + //发送短信 | ||
64 | + } | ||
38 | } | 65 | } |
39 | 66 | ||
40 | $e->success = true; | 67 | $e->success = true; |
68 | + $e->testCode = $code; | ||
69 | + | ||
41 | return $this->renderJson($e); | 70 | return $this->renderJson($e); |
42 | } | 71 | } |
43 | 72 | ||
44 | /** | 73 | /** |
74 | + * @param $mobile | ||
75 | + * @return string | ||
76 | + */ | ||
77 | + private function setRegisterCode($mobile) | ||
78 | + { | ||
79 | + $session = Yii::$app->session; | ||
80 | + $code = Utils::randRegCode(6); | ||
81 | + $codeKey = $mobile."_".PhoneCode::REGISTER_TYPE; | ||
82 | + $sessionStr = json_encode(['content' => $code, 'expire_at' => time() + self::CODE_EXPIRE]); | ||
83 | + $session->set($codeKey, $sessionStr); | ||
84 | + | ||
85 | + return $code; | ||
86 | + } | ||
87 | + | ||
88 | + /** | ||
89 | + * @param $mobile | ||
90 | + * @return bool | ||
91 | + */ | ||
92 | + private function removeRegisterCode($mobile) | ||
93 | + { | ||
94 | + $session = Yii::$app->session; | ||
95 | + $codeKey = $mobile."_".PhoneCode::REGISTER_TYPE; | ||
96 | + return $session->remove($codeKey); | ||
97 | + } | ||
98 | + | ||
99 | + /** | ||
100 | + * @param $mobile | ||
101 | + * @return mixed | ||
102 | + */ | ||
103 | + private function getRegisterCode($mobile) | ||
104 | + { | ||
105 | + $session = Yii::$app->session; | ||
106 | + $codeKey = $mobile."_".PhoneCode::REGISTER_TYPE; | ||
107 | + $sessionContent = $session->get($codeKey); | ||
108 | + if (!$sessionContent) { | ||
109 | + return null; | ||
110 | + } | ||
111 | + | ||
112 | + $sessionContent = json_decode($sessionContent, true); | ||
113 | + if ($sessionContent && isset($sessionContent['expire_at']) && $sessionContent['expire_at'] > time()) { | ||
114 | + return $sessionContent['content']; | ||
115 | + } else { | ||
116 | + $session->remove($codeKey); | ||
117 | + return null; | ||
118 | + } | ||
119 | + } | ||
120 | + | ||
121 | + /** | ||
122 | + * @param $mobile | ||
123 | + * @return mixed | ||
124 | + */ | ||
125 | + private function getLoginCode($mobile) | ||
126 | + { | ||
127 | + $session = Yii::$app->session; | ||
128 | + $codeKey = $mobile."_".PhoneCode::LOGIN_TYPE; | ||
129 | + $sessionContent = $session->get($codeKey); | ||
130 | + if (!$sessionContent) { | ||
131 | + return null; | ||
132 | + } | ||
133 | + $sessionContent = json_decode($sessionContent, true); | ||
134 | + if ($sessionContent && isset($sessionContent['expire_at']) && $sessionContent['expire_at'] > time()) { | ||
135 | + return $sessionContent['content']; | ||
136 | + } else { | ||
137 | + $session->remove($codeKey); | ||
138 | + return null; | ||
139 | + } | ||
140 | + } | ||
141 | + | ||
142 | + /** | ||
143 | + * @param $mobile | ||
144 | + * @return string | ||
145 | + */ | ||
146 | + private function setLoginCode($mobile) | ||
147 | + { | ||
148 | + $session = Yii::$app->session; | ||
149 | + $code = Utils::randRegCode(6); | ||
150 | + $codeKey = $mobile."_".PhoneCode::LOGIN_TYPE; | ||
151 | + $sessionStr = json_encode(['content' => $code, 'expire_at' => time() + self::CODE_EXPIRE]); | ||
152 | + $session->set($codeKey, $sessionStr); | ||
153 | + | ||
154 | + return $code; | ||
155 | + } | ||
156 | + | ||
157 | + private function removeLoginCode($mobile) | ||
158 | + { | ||
159 | + $session = Yii::$app->session; | ||
160 | + $codeKey = $mobile."_".PhoneCode::LOGIN_TYPE; | ||
161 | + $session->remove($codeKey); | ||
162 | + } | ||
163 | + | ||
164 | + /** | ||
45 | * 注册界面 | 165 | * 注册界面 |
46 | * @return string | 166 | * @return string |
47 | */ | 167 | */ |
@@ -53,7 +173,7 @@ class LoginController extends BaseController | @@ -53,7 +173,7 @@ class LoginController extends BaseController | ||
53 | $name = $this->request->post('name'); | 173 | $name = $this->request->post('name'); |
54 | $mobile = $this->request->post('mobile'); | 174 | $mobile = $this->request->post('mobile'); |
55 | $code = $this->request->post('code'); | 175 | $code = $this->request->post('code'); |
56 | - $img = $this->request->post('img'); | 176 | + $licensePic = $this->request->post('licensePic'); |
57 | if (empty($name)) { | 177 | if (empty($name)) { |
58 | $e->message = '车厂名称必填'; | 178 | $e->message = '车厂名称必填'; |
59 | return $this->renderJson($e); | 179 | return $this->renderJson($e); |
@@ -68,15 +188,43 @@ class LoginController extends BaseController | @@ -68,15 +188,43 @@ class LoginController extends BaseController | ||
68 | $e->message = '验证码必填'; | 188 | $e->message = '验证码必填'; |
69 | return $this->renderJson($e); | 189 | return $this->renderJson($e); |
70 | } | 190 | } |
71 | - if (empty($img)) { | 191 | + if (empty($licensePic)) { |
72 | $e->message = '请上传营业执照'; | 192 | $e->message = '请上传营业执照'; |
73 | return $this->renderJson($e); | 193 | return $this->renderJson($e); |
74 | } | 194 | } |
75 | // 校验验证码 | 195 | // 校验验证码 |
196 | + $vcode = $this->getRegisterCode($mobile); | ||
197 | + if (empty($vcode)) { | ||
198 | + $e->message = '验证码已经超时请重新发送'; | ||
199 | + return $this->renderJson($e); | ||
200 | + } | ||
201 | + if ($vcode !== $code) { | ||
202 | + $e->message = '验证码不对'; | ||
203 | + return $this->renderJson($e); | ||
204 | + } | ||
76 | // 检查车厂名称是否注册了 | 205 | // 检查车厂名称是否注册了 |
77 | // 检查手机号码是否注册了 | 206 | // 检查手机号码是否注册了 |
78 | - echo $name.'_'.$mobile.'_'.$code.'_'.$img; | ||
79 | - $e->success = true; | 207 | + $userMobile = UserRepository::findOne(['mobile' => $mobile]); |
208 | + if ($userMobile) { | ||
209 | + $e->message = '该手机号已经注册过维修厂,请更换其他手机号'; | ||
210 | + return $this->renderJson($e); | ||
211 | + } | ||
212 | + | ||
213 | + $uData = [ | ||
214 | + 'mobile' => $mobile, | ||
215 | + 'name' => $name, | ||
216 | + 'user_name' => $mobile | ||
217 | + ]; | ||
218 | + $userEntity = User::create($uData); | ||
219 | + $this->removeRegisterCode($mobile); | ||
220 | + $saveImageInfo = ImageManager::mvUploadImage($licensePic, $userEntity->uuid); | ||
221 | + $userEntity->license_pic = $saveImageInfo[0].$saveImageInfo[1]; | ||
222 | + $userEntity->save(); | ||
223 | + if ($this->processLogin($userEntity)) { | ||
224 | + $e->success = true; | ||
225 | + } else { | ||
226 | + $e->message = '注册成功但是登录失败'; | ||
227 | + } | ||
80 | 228 | ||
81 | return $this->renderJson($e); | 229 | return $this->renderJson($e); |
82 | } | 230 | } |
@@ -93,7 +241,6 @@ class LoginController extends BaseController | @@ -93,7 +241,6 @@ class LoginController extends BaseController | ||
93 | $mobile = $this->request->post('mobile'); | 241 | $mobile = $this->request->post('mobile'); |
94 | $code = $this->request->post('code'); | 242 | $code = $this->request->post('code'); |
95 | 243 | ||
96 | - | ||
97 | if (!Utils::isPhone($mobile)) { | 244 | if (!Utils::isPhone($mobile)) { |
98 | $e->message = '手机号码格式不对'; | 245 | $e->message = '手机号码格式不对'; |
99 | return $this->renderJson($e); | 246 | return $this->renderJson($e); |
@@ -105,11 +252,29 @@ class LoginController extends BaseController | @@ -105,11 +252,29 @@ class LoginController extends BaseController | ||
105 | } | 252 | } |
106 | 253 | ||
107 | // 校验验证码 | 254 | // 校验验证码 |
108 | - // 检查车厂名称是否注册了 | ||
109 | - // 检查手机号码是否注册了 | ||
110 | - $e->success = true; | ||
111 | - $userInfo = \domain\user\models\User::findOne(1); | ||
112 | - $this->processLogin($userInfo); | 255 | + $logVcode = $this->getLoginCode($mobile); |
256 | + if (empty($logVcode)) { | ||
257 | + $e->message = '该手机登录码过期'; | ||
258 | + return $this->renderJson($e); | ||
259 | + } | ||
260 | + if ($code != $logVcode ) { | ||
261 | + $e->message = '验证码有误,请确认!'; | ||
262 | + return $this->renderJson($e); | ||
263 | + } | ||
264 | + | ||
265 | + $where = ['mobile' => $mobile]; | ||
266 | + $userInfo = UserRepository::findOne($where); | ||
267 | + if (empty($userInfo)) { | ||
268 | + $e->message = '登录失败,该手机未注册'; | ||
269 | + return $this->renderJson($e); | ||
270 | + } | ||
271 | + if($this->processLogin($userInfo)) { | ||
272 | + $this->removeLoginCode($mobile); | ||
273 | + $e->success = true; | ||
274 | + } else { | ||
275 | + $e->message = '登录失败'; | ||
276 | + } | ||
277 | + | ||
113 | return $this->renderJson($e); | 278 | return $this->renderJson($e); |
114 | } | 279 | } |
115 | 280 | ||
@@ -121,10 +286,6 @@ class LoginController extends BaseController | @@ -121,10 +286,6 @@ class LoginController extends BaseController | ||
121 | */ | 286 | */ |
122 | protected function processLogin($userEntity) | 287 | protected function processLogin($userEntity) |
123 | { | 288 | { |
124 | - if(!($userEntity instanceof User)) { | ||
125 | - AppLog::debug("processLogin: 返回 UserEntity 失败"); | ||
126 | - return false; | ||
127 | - } | ||
128 | /** | 289 | /** |
129 | * 登陆时间为7000秒,目前微信API的access token 的 expires_in 为 7200秒 | 290 | * 登陆时间为7000秒,目前微信API的access token 的 expires_in 为 7200秒 |
130 | */ | 291 | */ |
app-wx/modules/user/views/default/index.php
@@ -10,6 +10,11 @@ function img($file, $path = '/i/') | @@ -10,6 +10,11 @@ function img($file, $path = '/i/') | ||
10 | { | 10 | { |
11 | return \Yii::$app->request->baseUrl . $path.$file; | 11 | return \Yii::$app->request->baseUrl . $path.$file; |
12 | } | 12 | } |
13 | +if ($isGuest) { | ||
14 | + $isGuest = true; | ||
15 | +} else { | ||
16 | + $isGuest = 0; | ||
17 | +} | ||
13 | ?> | 18 | ?> |
14 | <style> | 19 | <style> |
15 | input{-webkit-appearance: none;} | 20 | input{-webkit-appearance: none;} |
@@ -25,6 +30,7 @@ function img($file, $path = '/i/') | @@ -25,6 +30,7 @@ function img($file, $path = '/i/') | ||
25 | <?=$this->render('pages/login-template', ['asset' => $asset])?> | 30 | <?=$this->render('pages/login-template', ['asset' => $asset])?> |
26 | 31 | ||
27 | <script> | 32 | <script> |
33 | + var isGuest = <?=$isGuest?>; | ||
28 | require.config({baseUrl: $site.assets_url + '/js/',urlArgs : "v=" + require.version}); | 34 | require.config({baseUrl: $site.assets_url + '/js/',urlArgs : "v=" + require.version}); |
29 | require([ | 35 | require([ |
30 | 'user-app' | 36 | 'user-app' |
app-wx/modules/user/views/default/pages/register-template.php
@@ -65,11 +65,12 @@ $baseUrl = Url::base(true); | @@ -65,11 +65,12 @@ $baseUrl = Url::base(true); | ||
65 | <div class="upload-section"> | 65 | <div class="upload-section"> |
66 | <div class="upload-title">上传营业执照</div> | 66 | <div class="upload-title">上传营业执照</div> |
67 | <div class="upload-img-box"> | 67 | <div class="upload-img-box"> |
68 | - <div class="upload-item upload-btn-cls"> | 68 | + <div class="upload-item upload-btn-cls licensePic"> |
69 | <input type="file" id="upload-btn" class="upload-input-cls" name="file" accept="image/*"/> | 69 | <input type="file" id="upload-btn" class="upload-input-cls" name="file" accept="image/*"/> |
70 | </div> | 70 | </div> |
71 | </div> | 71 | </div> |
72 | </div> | 72 | </div> |
73 | + <!-- | ||
73 | <div class="upload-section"> | 74 | <div class="upload-section"> |
74 | <div class="upload-title">维修场门头照</div> | 75 | <div class="upload-title">维修场门头照</div> |
75 | <div class="upload-img-box"> | 76 | <div class="upload-img-box"> |
@@ -78,6 +79,7 @@ $baseUrl = Url::base(true); | @@ -78,6 +79,7 @@ $baseUrl = Url::base(true); | ||
78 | </div> | 79 | </div> |
79 | </div> | 80 | </div> |
80 | </div> | 81 | </div> |
82 | + --> | ||
81 | </div> | 83 | </div> |
82 | <div class="action-box"> | 84 | <div class="action-box"> |
83 | <div class="register-btn-cls register-btn">注册</div> | 85 | <div class="register-btn-cls register-btn">注册</div> |
common/helpers/ImageManager.php
@@ -2,8 +2,9 @@ | @@ -2,8 +2,9 @@ | ||
2 | 2 | ||
3 | namespace common\helpers; | 3 | namespace common\helpers; |
4 | 4 | ||
5 | +use Yii; | ||
5 | /** | 6 | /** |
6 | - * 极办公系统的图片资源管理器 | 7 | + * 系统的图片资源管理器 |
7 | * Class ImageManager | 8 | * Class ImageManager |
8 | * @package app\wx\helpers | 9 | * @package app\wx\helpers |
9 | */ | 10 | */ |
@@ -20,39 +21,10 @@ class ImageManager | @@ -20,39 +21,10 @@ class ImageManager | ||
20 | /** | 21 | /** |
21 | * 根据系统模块划分, 定义图片一级目录结构 | 22 | * 根据系统模块划分, 定义图片一级目录结构 |
22 | */ | 23 | */ |
23 | - private static $USER_ROOT_PATH = 'user/'; // 用户 | ||
24 | - private static $DEVICE_ROOT_PATH = 'device/'; // 设备库 | ||
25 | - public static $ORDER_ROOT_PATH = 'order/'; // 订单 | ||
26 | - private static $ENGINEER_ROOT_PATH = 'engineer/'; // 工程师 | ||
27 | - private static $BIND_APPLY_ROOT_PATH = 'bind_apply/'; // 设备绑定申请 | ||
28 | - private static $SYSTEM_SETTING_ROOT_PATH = 'system_setting/'; // 系统设置 | ||
29 | - private static $TEMP_ROOT_PATH = 'tmp/'; // 临时目录 | ||
30 | - private static $INVOICE_ROOT_PATH = 'invoice/'; // 电子发票 | ||
31 | - private static $USER_ADS_ROOT_PATH = 'user_ads/'; // 小程序用户端广告 | ||
32 | - private static $ENGINEER_ACT_ROOT_PATH = 'engineer/act/'; // 工程师活动 | ||
33 | - private static $DEDUCTION_ACTIVITY_ROOT_PATH = 'marketing/'; // 抵扣金活动分享图片路径 | ||
34 | - private static $CUSTOMIZED_CODE_PATH = 'customized_qrcode/'; // 定制二维码图片路径 | ||
35 | - private static $SHOP_COVER_PATH = 'shop_cover/'; // 商店头部的cover | ||
36 | - private static $SHOP_ITEM_IMAGE_PATH = 'shop_item_image/'; // 商品主图路径 | ||
37 | - private static $SHOP_ITEM_DESC_IMAGE_PATH = 'shop_item_desc_image/'; // 商品详情图路径 | ||
38 | 24 | ||
39 | - | ||
40 | - /** | ||
41 | - * 文件名拼接随机串再md5,避免重复 | ||
42 | - * @param $length | ||
43 | - * @return null|string | ||
44 | - */ | ||
45 | - private static function rand($length) | ||
46 | - { | ||
47 | - $str = null; | ||
48 | - $strPol = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; | ||
49 | - $max = strlen($strPol) - 1; | ||
50 | - for ($i = 0; $i < $length; $i++) { | ||
51 | - $str .= $strPol[mt_rand(0, $max)]; | ||
52 | - } | ||
53 | - | ||
54 | - return $str; | ||
55 | - } | 25 | + public static $MAINTENANCE_PATH = 'maintenance/'; // 维修厂用户注册的图片路径 |
26 | + public static $ORDER_BROKEN_PATH = 'broken_order/'; // 订单里面车损坏的图片 | ||
27 | + public static $ORDER_FINISH_PATH = 'finish_order/'; // 维修好车的时候的图片 | ||
56 | 28 | ||
57 | /** | 29 | /** |
58 | * @param $path 数据库存储的图片相对路径 | 30 | * @param $path 数据库存储的图片相对路径 |
@@ -60,372 +32,86 @@ class ImageManager | @@ -60,372 +32,86 @@ class ImageManager | ||
60 | */ | 32 | */ |
61 | public static function getUrl($path, $style = null) | 33 | public static function getUrl($path, $style = null) |
62 | { | 34 | { |
63 | - if (empty($path)) return ''; | ||
64 | - return ImageServiceHelper::getUrl($path, $style); | ||
65 | - } | ||
66 | - | ||
67 | - public static function getVoiceUrl($path) | ||
68 | - { | ||
69 | - if (empty($path)) return ''; | ||
70 | - return ImageServiceHelper::getUrl($path); | ||
71 | - } | ||
72 | - | ||
73 | - /** | ||
74 | - * 添加上传图片 | ||
75 | - * @param $tmpPath | ||
76 | - * @param $savePath | ||
77 | - */ | ||
78 | - public static function add($tmpPath, $savePath) | ||
79 | - { | ||
80 | - return ImageServiceHelper::add($tmpPath, $savePath); | ||
81 | - } | ||
82 | - | ||
83 | - /** | ||
84 | - * 替换图片 | ||
85 | - * @param $oldPath | ||
86 | - * @param $newPath | ||
87 | - * @param $tmpPath | ||
88 | - */ | ||
89 | - public static function replace($oldPath, $newPath, $tmpPath) | ||
90 | - { | ||
91 | - return ImageServiceHelper::replace($oldPath, $newPath, $tmpPath); | ||
92 | - } | ||
93 | - | ||
94 | - /** | ||
95 | - * 移动图片存放位置 | ||
96 | - * @param $oldPath | ||
97 | - * @param $newPath | ||
98 | - * @return mixed | ||
99 | - */ | ||
100 | - public static function move($oldPath, $newPath) | ||
101 | - { | ||
102 | - ImageServiceHelper::move($oldPath, $newPath); | ||
103 | - } | ||
104 | - | ||
105 | - /** | ||
106 | - * 删除旧图片 | ||
107 | - * @param $path | ||
108 | - */ | ||
109 | - public static function delete($path) | ||
110 | - { | ||
111 | - ImageServiceHelper::delete($path); | ||
112 | - } | ||
113 | - | ||
114 | - /** | ||
115 | - * 获取[临时图片]的存储路径: tmp/20170509/[16位md5加密串].jpg | ||
116 | - * @param $suffix 图片后缀, 如'.jpg' | ||
117 | - * @return string | ||
118 | - */ | ||
119 | - public static function getTempImgPath($suffix) | ||
120 | - { | ||
121 | - $imageName = md5(time() . self::rand(5)) . '.' . $suffix; | ||
122 | - $basePath = self::$TEMP_ROOT_PATH . date("Ymd"); | ||
123 | - $savePath = $basePath . '/' . $imageName; | ||
124 | - return $savePath; | ||
125 | - } | ||
126 | - | ||
127 | - /** | ||
128 | - * [用户]=> 获取[用户头像]的存储路径: user/20170509/[userId]/[16位md5加密串].jpg | ||
129 | - * @param $userId | ||
130 | - * @param $suffix 图片后缀, 如'.jpg' | ||
131 | - * @return string | ||
132 | - */ | ||
133 | - public static function getUserAvatarPath($userId, $suffix) | ||
134 | - { | ||
135 | - $imageName = md5(time() . $userId . self::rand(5)) . '.' . $suffix; | ||
136 | - $basePath = self::$USER_ROOT_PATH . date("Ymd") . '/' . $userId; | ||
137 | - $savePath = $basePath . '/' . $imageName; | ||
138 | - return $savePath; | ||
139 | - } | ||
140 | - | ||
141 | - | ||
142 | - /** | ||
143 | - * [设备库]=> 获取[品牌LOGO]的存储路径: device/brand/[16位md5加密串].jpg | ||
144 | - * @param $suffix 图片后缀, 如'.jpg' | ||
145 | - * @return string | ||
146 | - */ | ||
147 | - public static function getBrandLogoPath($suffix) | ||
148 | - { | ||
149 | - $imageName = md5(time() . self::rand(5)) . '.' . $suffix; | ||
150 | - $basePath = self::$DEVICE_ROOT_PATH . 'brand'; | ||
151 | - $savePath = $basePath . '/' . $imageName; | ||
152 | - return $savePath; | ||
153 | - } | ||
154 | - | ||
155 | - /** | ||
156 | - * [设备库]=> 获取[设备分类图标]的存储路径: device/cat/[deviceCatId]/[16位md5加密串].jpg | ||
157 | - * @param $deviceCatId | ||
158 | - * @param $suffix 图片后缀, 如'.jpg' | ||
159 | - * @return string | ||
160 | - */ | ||
161 | - public static function getDeviceCatIconPath($deviceCatId, $suffix) | ||
162 | - { | ||
163 | - $imageName = md5(time() . $deviceCatId . self::rand(5)) . '.' . $suffix; | ||
164 | - $basePath = self::$DEVICE_ROOT_PATH . 'cat/' . $deviceCatId; | ||
165 | - $savePath = $basePath . '/' . $imageName; | ||
166 | - return $savePath; | ||
167 | - } | ||
168 | - | ||
169 | - /** | ||
170 | - * 获取图片的路径 | ||
171 | - * device/12/344f8c701b864c1782129fe4f2209514.jpg 设备/分类id/图片名称 | ||
172 | - * @param $deviceCatId | ||
173 | - * @param $suffix | ||
174 | - * @return string | ||
175 | - */ | ||
176 | - public static function getDeviceImgPath($deviceCatId, $suffix) | ||
177 | - { | ||
178 | - $imageName = md5(time() . $deviceCatId . self::rand(5)) . '.' . $suffix; | ||
179 | - $basePath = self::$DEVICE_ROOT_PATH . $deviceCatId; | ||
180 | - $savePath = $basePath . '/' . $imageName; | ||
181 | - return $savePath; | ||
182 | - } | ||
183 | - | ||
184 | - /** | ||
185 | - * [设备库]=> 获取[型号LOGO]的存储路径: device/model/[16位md5加密串].jpg | ||
186 | - * @param $suffix 图片后缀, 如'.jpg' | ||
187 | - * @return string | ||
188 | - */ | ||
189 | - public static function getModelLogoPath($suffix) | ||
190 | - { | ||
191 | - $imageName = md5(time() . self::rand(5)) . '.' . $suffix; | ||
192 | - $basePath = self::$DEVICE_ROOT_PATH . 'model'; | ||
193 | - $savePath = $basePath . '/' . $imageName; | ||
194 | - return $savePath; | ||
195 | - } | ||
196 | - | ||
197 | - | ||
198 | - /** | ||
199 | - * [订单]=> 获取[订单故障图片]的存储路径: order/20170509/[orderNo]/fault/[16位md5加密串].jpg | ||
200 | - * @param $orderNo | ||
201 | - * @param $suffix 图片后缀, 如'.jpg' | ||
202 | - * @return string | ||
203 | - */ | ||
204 | - public static function getOrderFaultImgPath($orderNo, $suffix) | ||
205 | - { | ||
206 | - $imageName = md5(time() . $orderNo . self::rand(5)) . '.' . $suffix; | ||
207 | - $basePath = self::$ORDER_ROOT_PATH . date("Ymd") . '/' . $orderNo . '/fault'; | ||
208 | - $savePath = $basePath . '/' . $imageName; | ||
209 | - return $savePath; | ||
210 | - } | ||
211 | - | ||
212 | - /** | ||
213 | - * [订单]=> 获取[订单质保申请图片]的存储路径: order/20170509/[orderNo]/appeal/[16位md5加密串].jpg | ||
214 | - * @param $orderNo | ||
215 | - * @param $suffix 图片后缀, 如'.jpg' | ||
216 | - * @return string | ||
217 | - */ | ||
218 | - public static function getOrderAppealImgPath($orderNo, $suffix) | ||
219 | - { | ||
220 | - $imageName = md5(time() . $orderNo . self::rand(5)) . '.' . $suffix; | ||
221 | - $basePath = self::$ORDER_ROOT_PATH . date("Ymd") . '/' . $orderNo . '/appeal'; | ||
222 | - $savePath = $basePath . '/' . $imageName; | ||
223 | - return $savePath; | ||
224 | - } | ||
225 | 35 | ||
226 | - /** | ||
227 | - * [工程师]=> 获取[工程师图片]的存储路径: engineer/20170509/[engineerId]/[16位md5加密串].jpg | ||
228 | - * @param $engineerId | ||
229 | - * @param $suffix 图片后缀, 如'.jpg' | ||
230 | - * @param $fileName 图片另外的名称,工程师图片可以是头像,身份证等 | ||
231 | - * @return string | ||
232 | - */ | ||
233 | - public static function getEngineerImgPath($engineerId, $fileName = '', $suffix = 'jpg') | ||
234 | - { | ||
235 | - $imageName = md5(time() . $engineerId . $fileName . self::rand(5)) . '.' . $suffix; | ||
236 | - $basePath = self::$ENGINEER_ROOT_PATH . date("Ymd") . '/' . $engineerId; | ||
237 | - $savePath = $basePath . '/' . $imageName; | ||
238 | - return $savePath; | 36 | + return $path; |
239 | } | 37 | } |
240 | 38 | ||
241 | /** | 39 | /** |
242 | - * [工程师]=> 获取[工程师定制二维码图片]的存储路径: engineer/20170509/customized_qrcode/[engineerId]/[16位md5加密串].jpg | ||
243 | - * @param $engineerId | ||
244 | - * @param $suffix 图片后缀, 如'.jpg' | ||
245 | - * @param $fileName 图片另外的名称 | 40 | + * @param $licensePic |
41 | + * @param $fileTypePath | ||
246 | * @return string | 42 | * @return string |
247 | */ | 43 | */ |
248 | - public static function getEngineerQrcodeImgPath($engineerId, $fileName = '', $suffix = 'jpg') | 44 | + public static function mvUploadImage($licensePic, $uuid, $fileTypePath = '') |
249 | { | 45 | { |
250 | - $imageName = md5(time() . $engineerId . $fileName . self::rand(5)) . '.' . $suffix; | ||
251 | - $basePath = self::$ENGINEER_ROOT_PATH . date("Ymd") . '/' . self::$CUSTOMIZED_CODE_PATH . $engineerId; | ||
252 | - $savePath = $basePath . '/' . $imageName; | ||
253 | - return $savePath; | ||
254 | - } | 46 | + $dir = Yii::getAlias('@site') . "/tmp"; |
47 | + $tmpFilePath = $dir.'/'.$licensePic; | ||
48 | + $fileArr = explode('.', $licensePic); | ||
255 | 49 | ||
256 | - /** | ||
257 | - * [工程师]=> 获取[考题图片]的存储路径: engineer/exam/[16位md5加密串].jpg | ||
258 | - * @param $suffix 图片后缀, 如'.jpg' | ||
259 | - * @return string | ||
260 | - */ | ||
261 | - public static function getExamImgPath($suffix) | ||
262 | - { | ||
263 | - $imageName = md5(time() . self::rand(5)) . '.' . $suffix; | ||
264 | - $basePath = self::$ENGINEER_ROOT_PATH . 'exam'; | ||
265 | - $savePath = $basePath . '/' . $imageName; | ||
266 | - return $savePath; | ||
267 | - } | 50 | + $minFileName = $fileArr[0].'_min'.'.'.end($fileArr); |
51 | + $tmpMinFilePath = $dir.'/'.$minFileName; | ||
268 | 52 | ||
53 | + $desPathFile = self::genImagePath($uuid, $fileTypePath); | ||
269 | 54 | ||
270 | - /** | ||
271 | - * [设备绑定申请]=> 获取[设备绑定申请图片]的存储路径: bind_apply/20170509/[applyId]/[16位md5加密串].jpg | ||
272 | - * @param $applyId | ||
273 | - * @param $suffix 图片后缀, 如'jpg' | ||
274 | - * @return string | ||
275 | - */ | ||
276 | - public static function getBindApplyImgPath($applyId, $filename, $suffix = "jpg") | ||
277 | - { | ||
278 | - $imageName = md5(time() . $filename . self::rand(5)) . '.' . $suffix; | ||
279 | - $basePath = self::$BIND_APPLY_ROOT_PATH . date("Ymd") . '/' . $applyId; | ||
280 | - $savePath = $basePath . '/' . $imageName; | ||
281 | - return $savePath; | ||
282 | - } | 55 | + $aimPath = Yii::getAlias('@site')."/".$desPathFile .$licensePic; |
56 | + FileUtil::moveFile($tmpFilePath, $aimPath,true); | ||
283 | 57 | ||
284 | - /** | ||
285 | - * [系统设置]=> 获取[用户小程序-设置图片]的存储路径: system_setting/mina/[16位md5加密串].jpg | ||
286 | - * @param $suffix 图片后缀, 如'.jpg' | ||
287 | - * @return string | ||
288 | - */ | ||
289 | - public static function getMinaSettingImgPath($suffix) | ||
290 | - { | ||
291 | - $imageName = md5(time() . self::rand(5)) . '.' . $suffix; | ||
292 | - $basePath = self::$SYSTEM_SETTING_ROOT_PATH . 'mina'; | ||
293 | - $savePath = $basePath . '/' . $imageName; | ||
294 | - return $savePath; | ||
295 | - } | 58 | + $aimTPath = Yii::getAlias('@site')."/".$desPathFile .$minFileName; |
59 | + FileUtil::moveFile($tmpMinFilePath, $aimTPath,true); | ||
296 | 60 | ||
297 | - /** | ||
298 | - * [工程师商铺头部的图片]=> 存储路径: shop_cover/wx/engineerUUId.jpg | ||
299 | - * @param $engineerUUId | ||
300 | - * @param $suffix 图片后缀, 如'.jpg' | ||
301 | - * @return string | ||
302 | - */ | ||
303 | - public static function getEngineerShopCoverImgPath($engineerUUId, $suffix = 'jpg') | ||
304 | - { | ||
305 | - $imageName = $engineerUUId . '.' . $suffix; | ||
306 | - $basePath = self::$SHOP_COVER_PATH . 'wx'; | ||
307 | - $savePath = $basePath . '/' . $imageName; | ||
308 | - return $savePath; | 61 | + return [$desPathFile, $licensePic, $minFileName]; |
309 | } | 62 | } |
310 | 63 | ||
311 | - | ||
312 | /** | 64 | /** |
313 | - * [系统设置]=> 获取[工程师服务号-设置图片]的存储路径: system_setting/mp/[16位md5加密串].jpg | ||
314 | - * @param $suffix 图片后缀, 如'.jpg' | ||
315 | - * @return string | ||
316 | - */ | ||
317 | - public static function getMPSettingImgPath($suffix) | ||
318 | - { | ||
319 | - $imageName = md5(time() . self::rand(5)) . '.' . $suffix; | ||
320 | - $basePath = self::$SYSTEM_SETTING_ROOT_PATH . 'mp'; | ||
321 | - $savePath = $basePath . '/' . $imageName; | ||
322 | - return $savePath; | ||
323 | - } | ||
324 | - | ||
325 | - /** 获取默认图片 | ||
326 | - * @param int $type | 65 | + * @param $uuid |
66 | + * @param string $fileTypePath | ||
327 | * @return string | 67 | * @return string |
328 | */ | 68 | */ |
329 | - public static function getDefaultImg($type = 1) | 69 | + public static function genImagePath($uuid, $fileTypePath = '') |
330 | { | 70 | { |
331 | - $domain = \yii::$app->request->getHostInfo(); | ||
332 | - if ($type == 1) { | ||
333 | - $str = $domain . '/i/default-img.jpg'; | 71 | + if (empty($fileTypePath)) { |
72 | + $catPath = self::$MAINTENANCE_PATH; | ||
334 | } else { | 73 | } else { |
335 | - $str = $domain . '/i/default-img.jpg'; | 74 | + $catPath = $fileTypePath; |
336 | } | 75 | } |
337 | - return $str; | ||
338 | - } | ||
339 | - | ||
340 | - /** | ||
341 | - * 获取电子发票pdf文件存储路径 | ||
342 | - * @param $sid | ||
343 | - * @param string $suffix | ||
344 | - * @return string | ||
345 | - */ | ||
346 | - public static function getInvoicePdfPath($sid, $suffix = "pdf") | ||
347 | - { | ||
348 | - $imageName = $sid . '.' . $suffix; | ||
349 | - $basePath = self::$INVOICE_ROOT_PATH . date("Ymd"); | ||
350 | - $savePath = $basePath . '/' . $imageName; | ||
351 | - return $savePath; | ||
352 | - } | ||
353 | - | ||
354 | - /** | ||
355 | - * 获取电子发票截图存储路径 | ||
356 | - * @param string $suffix | ||
357 | - * @return string | ||
358 | - */ | ||
359 | - public static function getInvoicePath($suffix) | ||
360 | - { | ||
361 | - $imageName = md5(time() . self::rand(5)) . '.' . $suffix; | ||
362 | - $basePath = self::$INVOICE_ROOT_PATH . date("Ymd"); | ||
363 | - $savePath = $basePath . '/' . $imageName; | ||
364 | - return $savePath; | ||
365 | - } | ||
366 | - | ||
367 | - /** | ||
368 | - * [小程序用户端广告]=> 获取[广告图片]的存储路径: user_ads/20180101/[adsId]/[md5加密串].png | ||
369 | - * @param $adsId | ||
370 | - * @param $suffix 图片后缀, 如'.png' | ||
371 | - * @return string | ||
372 | - */ | ||
373 | - public static function getUserAdsPath($adsId, $suffix = "png") | ||
374 | - { | ||
375 | - $imageName = md5(time() . $adsId . self::rand(5)) . '.' . $suffix; | ||
376 | - $basePath = self::$USER_ADS_ROOT_PATH . date("Ymd") . '/' . $adsId; | ||
377 | - $savePath = $basePath . '/' . $imageName; | ||
378 | - return $savePath; | ||
379 | - } | 76 | + $desPathFile = "upload/".$catPath.$uuid.'/'; |
380 | 77 | ||
381 | - /** | ||
382 | - * 获取工程师活动图片相对存储路径 | ||
383 | - */ | ||
384 | - public static function getEngineerActivityPath() | ||
385 | - { | ||
386 | - return self::$ENGINEER_ACT_ROOT_PATH; | 78 | + return $desPathFile; |
387 | } | 79 | } |
388 | 80 | ||
389 | - /** | ||
390 | - * 获取抵扣金活动路径 | ||
391 | - * @param $suffix 图片后缀, 如'.jpg' | ||
392 | - * @return string | ||
393 | - */ | ||
394 | - public static function getDeductionActivityPath($suffix) | 81 | + private static function _imageCreateFromPath($imgPath) |
395 | { | 82 | { |
396 | - $imageName = md5(time() . self::rand(5)) . '.' . $suffix; | ||
397 | - $basePath = self::$DEDUCTION_ACTIVITY_ROOT_PATH . 'deduction_activity'; | ||
398 | - $savePath = $basePath . '/' . $imageName; | ||
399 | - return $savePath; | 83 | + list($width, $height, $type, $attr) = getimagesize($imgPath); |
84 | + switch ($type) { | ||
85 | + case 3: // png | ||
86 | + return imagecreatefrompng($imgPath); | ||
87 | + case 2: // jpeg | ||
88 | + return imagecreatefromjpeg($imgPath); | ||
89 | + default: | ||
90 | + return null; | ||
91 | + } | ||
400 | } | 92 | } |
401 | 93 | ||
402 | /** | 94 | /** |
403 | - * 商品主图存储路径:shop_item_image/20170509/[engineerId]/[16位md5加密串].jpg | ||
404 | - * @param $engineerId | ||
405 | - * @param $suffix 图片后缀, 如'.jpg' | ||
406 | - * @param $fileName 图片另外的名称,工程师图片可以是头像,身份证等 | ||
407 | - * @return string | 95 | + * 上传到服务器临时文件区 |
96 | + * @param $fileInfo $_FILE['file'] | ||
97 | + * @return array | ||
408 | */ | 98 | */ |
409 | - public static function getShopItemImgPath($engineerId, $fileName = '', $suffix = 'jpg') | 99 | + public static function uploadImg($fileInfo) |
410 | { | 100 | { |
411 | - $imageName = md5(time() . $engineerId . $fileName . self::rand(5)) . '.' . $suffix; | ||
412 | - $basePath = self::$SHOP_ITEM_IMAGE_PATH . date("Ymd") . '/' . $engineerId; | ||
413 | - $savePath = $basePath . '/' . $imageName; | ||
414 | - return $savePath; | ||
415 | - } | 101 | + $dir = Yii::getAlias('@site') . "/tmp"; |
102 | + $fileArr = explode('.', $fileInfo['name']); | ||
103 | + $tt = time(); | ||
104 | + $filename = 'auto_'.$tt.md5($fileInfo['name']).'.'.end($fileArr); | ||
105 | + $minFileName = 'auto_'.$tt.md5($fileInfo['name']).'_min'.'.'.end($fileArr); | ||
106 | + $saveFilePath = $dir.'/'.$filename; | ||
107 | + move_uploaded_file($fileInfo['tmp_name'], $saveFilePath); | ||
108 | + $tmpUrl = $tmpMinFile = 'tmp/'.$filename; | ||
109 | + $imgSource = self::_imageCreateFromPath($saveFilePath); | ||
110 | + if ($imgSource) { | ||
111 | + ImageUtils::resizeImage($imgSource, 100, 100, $dir.'/'.$minFileName); | ||
112 | + $tmpMinFile = 'tmp/'.$minFileName; | ||
113 | + } | ||
416 | 114 | ||
417 | - /** | ||
418 | - * 商品详情图存储路径: shop_item_desc_image/20170509/[engineerId]/[16位md5加密串].jpg | ||
419 | - * @param $engineerId | ||
420 | - * @param $suffix 图片后缀, 如'.jpg' | ||
421 | - * @param $fileName 图片另外的名称,工程师图片可以是头像,身份证等 | ||
422 | - * @return string | ||
423 | - */ | ||
424 | - public static function getShopItemDescImgPath($engineerId, $fileName = '', $suffix = 'jpg') | ||
425 | - { | ||
426 | - $imageName = md5(time() . $engineerId . $fileName . self::rand(5)) . '.' . $suffix; | ||
427 | - $basePath = self::$SHOP_ITEM_DESC_IMAGE_PATH . date("Ymd") . '/' . $engineerId; | ||
428 | - $savePath = $basePath . '/' . $imageName; | ||
429 | - return $savePath; | 115 | + return [$filename, $minFileName, $tmpUrl, $tmpMinFile]; |
430 | } | 116 | } |
431 | } | 117 | } |
432 | \ No newline at end of file | 118 | \ No newline at end of file |
common/helpers/Utils.php
@@ -454,58 +454,4 @@ class Utils | @@ -454,58 +454,4 @@ class Utils | ||
454 | } | 454 | } |
455 | } | 455 | } |
456 | 456 | ||
457 | - /** | ||
458 | - * 生成mac 地址 | ||
459 | - * @return string | ||
460 | - */ | ||
461 | - static function macGenerate() | ||
462 | - { | ||
463 | - $adrArray = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" ]; | ||
464 | - $returnMAC = ''; | ||
465 | - | ||
466 | - for($i = 1; $i < 13 ; $i++) { | ||
467 | - $index = 0; | ||
468 | - if ($i != 2) { | ||
469 | - $index = mt_rand(0, 15); | ||
470 | - } else { | ||
471 | - //第二位只能是偶数 | ||
472 | - $indexArray = [0, 2, 4, 6, 8, 10, 12, 14]; | ||
473 | - $index = $indexArray[mt_rand(0, 7)]; | ||
474 | - } | ||
475 | - | ||
476 | - $returnMAC = $returnMAC . $adrArray[$index]; | ||
477 | - } | ||
478 | - | ||
479 | - return self::coverToMacAddress($returnMAC); | ||
480 | - } | ||
481 | - | ||
482 | - /** | ||
483 | - * 把mac地址转化为带:的字符串 | ||
484 | - * @param $macStr | ||
485 | - * @return string | ||
486 | - */ | ||
487 | - static function coverToMacAddress($macStr) | ||
488 | - { | ||
489 | - if (empty($macStr)) { | ||
490 | - return null; | ||
491 | - } | ||
492 | - | ||
493 | - $macSplitArr = str_split($macStr, 2); | ||
494 | - $returnStr = implode(":", $macSplitArr); | ||
495 | - | ||
496 | - return $returnStr; | ||
497 | - } | ||
498 | - | ||
499 | - /** | ||
500 | - * @param $mac | ||
501 | - * @return bool | ||
502 | - */ | ||
503 | - static function isMacAddress($mac) | ||
504 | - { | ||
505 | - if(preg_match('/^([0-9a-fA-F]{2})(([:|-]{0,1}[0-9a-fA-F]{2}){5})$/', $mac)) { | ||
506 | - return true; | ||
507 | - } else { | ||
508 | - return false; | ||
509 | - } | ||
510 | - } | ||
511 | } | 457 | } |
512 | \ No newline at end of file | 458 | \ No newline at end of file |
@@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\order; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use common\helpers\ImageManager; | ||
7 | +use domain\order\models\RepairFinishImages as RepairFinishImagesModel; | ||
8 | +/** | ||
9 | + * 维修完成的图片 | ||
10 | + */ | ||
11 | +class RepairFinishImages | ||
12 | +{ | ||
13 | + /** | ||
14 | + * @return null|object | ||
15 | + * @throws \yii\base\InvalidConfigException | ||
16 | + */ | ||
17 | + static function create($sItems) | ||
18 | + { | ||
19 | + if (empty($sItems)) { | ||
20 | + return null; | ||
21 | + } | ||
22 | + $classData = [ | ||
23 | + 'class' => RepairFinishImagesModel::className() | ||
24 | + ]; | ||
25 | + foreach($sItems as $k => $v) { | ||
26 | + $classData[$k] = $v; | ||
27 | + } | ||
28 | + $userModel = Yii::createObject($classData); | ||
29 | + if($userModel->save()) { | ||
30 | + return $userModel; | ||
31 | + } else { | ||
32 | + return null; | ||
33 | + } | ||
34 | + } | ||
35 | + | ||
36 | + /** | ||
37 | + * @param $orderId | ||
38 | + * @param $orderUUId | ||
39 | + * @param $images | ||
40 | + */ | ||
41 | + static function createFinishImages($orderId, $orderUUId, $images) | ||
42 | + { | ||
43 | + if (empty($images)) { | ||
44 | + return null; | ||
45 | + } | ||
46 | + RepairFinishImagesModel::deleteAll(['repair_order_id' => $orderId]); | ||
47 | + foreach($images as $k => $v) { | ||
48 | + $imgPath = ImageManager::genImagePath($orderUUId, ImageManager::$ORDER_FINISH_PATH); | ||
49 | + $sData = [ | ||
50 | + 'repair_order_id' => $orderId, | ||
51 | + 'image_path' => $imgPath.$v | ||
52 | + ]; | ||
53 | + self::create($sData); | ||
54 | + } | ||
55 | + } | ||
56 | + | ||
57 | + /** | ||
58 | + * @param $orderUUId | ||
59 | + * @param $images | ||
60 | + */ | ||
61 | + static function mvFinishImages($orderUUId, $images) | ||
62 | + { | ||
63 | + foreach($images as $k => $v) { | ||
64 | + ImageManager::mvUploadImage($v, $orderUUId, ImageManager::$ORDER_FINISH_PATH); | ||
65 | + } | ||
66 | + } | ||
67 | +} | ||
0 | \ No newline at end of file | 68 | \ No newline at end of file |
@@ -0,0 +1,36 @@ | @@ -0,0 +1,36 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\order; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use domain\order\models\RepairOrder as RepairOrderModel; | ||
7 | + | ||
8 | +/** | ||
9 | + * 维修订单 | ||
10 | + */ | ||
11 | +class RepairOrder | ||
12 | +{ | ||
13 | + /** | ||
14 | + * @param $sItems | ||
15 | + * @return null|object | ||
16 | + * @throws \yii\base\InvalidConfigException | ||
17 | + */ | ||
18 | + static function create($sItems) | ||
19 | + { | ||
20 | + if (empty($sItems)) { | ||
21 | + return null; | ||
22 | + } | ||
23 | + $classData = [ | ||
24 | + 'class' => RepairOrderModel::className() | ||
25 | + ]; | ||
26 | + foreach($sItems as $k => $v) { | ||
27 | + $classData[$k] = $v; | ||
28 | + } | ||
29 | + $userModel = Yii::createObject($classData); | ||
30 | + if($userModel->save()) { | ||
31 | + return $userModel; | ||
32 | + } else { | ||
33 | + return null; | ||
34 | + } | ||
35 | + } | ||
36 | +} | ||
0 | \ No newline at end of file | 37 | \ No newline at end of file |
@@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\order; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use common\helpers\ImageManager; | ||
7 | +use domain\order\models\RepairOrderImages as RepairOrderImagesModel; | ||
8 | +/** | ||
9 | + * 维修订单故障图片 | ||
10 | + */ | ||
11 | +class RepairOrderImages | ||
12 | +{ | ||
13 | + /** | ||
14 | + * @return null|object | ||
15 | + * @throws \yii\base\InvalidConfigException | ||
16 | + */ | ||
17 | + static function create($sItems) | ||
18 | + { | ||
19 | + if (empty($sItems)) { | ||
20 | + return null; | ||
21 | + } | ||
22 | + $classData = [ | ||
23 | + 'class' => RepairOrderImagesModel::className() | ||
24 | + ]; | ||
25 | + foreach($sItems as $k => $v) { | ||
26 | + $classData[$k] = $v; | ||
27 | + } | ||
28 | + $userModel = Yii::createObject($classData); | ||
29 | + if($userModel->save()) { | ||
30 | + return $userModel; | ||
31 | + } else { | ||
32 | + return null; | ||
33 | + } | ||
34 | + } | ||
35 | + | ||
36 | + /** | ||
37 | + * @param $orderId | ||
38 | + * @param $orderUUId | ||
39 | + * @param $images | ||
40 | + */ | ||
41 | + static function createBrokenImages($orderId, $orderUUId, $images) | ||
42 | + { | ||
43 | + if (empty($images)) { | ||
44 | + return null; | ||
45 | + } | ||
46 | + foreach($images as $k => $v) { | ||
47 | + $imgPath = ImageManager::genImagePath($orderUUId, ImageManager::$ORDER_BROKEN_PATH); | ||
48 | + $sData = [ | ||
49 | + 'repair_order_id' => $orderId, | ||
50 | + 'image_path' => $imgPath.$v | ||
51 | + ]; | ||
52 | + self::create($sData); | ||
53 | + } | ||
54 | + } | ||
55 | + | ||
56 | + /** | ||
57 | + * @param $orderUUId | ||
58 | + * @param $images | ||
59 | + */ | ||
60 | + static function mvBrokenImages($orderUUId, $images) | ||
61 | + { | ||
62 | + foreach($images as $k => $v) { | ||
63 | + ImageManager::mvUploadImage($v, $orderUUId, ImageManager::$ORDER_BROKEN_PATH); | ||
64 | + } | ||
65 | + } | ||
66 | + | ||
67 | +} | ||
0 | \ No newline at end of file | 68 | \ No newline at end of file |
@@ -0,0 +1,56 @@ | @@ -0,0 +1,56 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\order; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use domain\order\models\RepairOrderRepairPlan as RepairOrderRepairPlanModel; | ||
7 | + | ||
8 | + | ||
9 | +/** | ||
10 | + * 维修方案 | ||
11 | + */ | ||
12 | +class RepairOrderRepairPlan | ||
13 | +{ | ||
14 | + /** | ||
15 | + * @return null|object | ||
16 | + * @throws \yii\base\InvalidConfigException | ||
17 | + */ | ||
18 | + static function create($sItems) | ||
19 | + { | ||
20 | + if (empty($sItems)) { | ||
21 | + return null; | ||
22 | + } | ||
23 | + $classData = [ | ||
24 | + 'class' => RepairOrderRepairPlanModel::className() | ||
25 | + ]; | ||
26 | + foreach($sItems as $k => $v) { | ||
27 | + $classData[$k] = $v; | ||
28 | + } | ||
29 | + $repairPlanModel = Yii::createObject($classData); | ||
30 | + if($repairPlanModel->save()) { | ||
31 | + return $repairPlanModel; | ||
32 | + } else { | ||
33 | + return null; | ||
34 | + } | ||
35 | + } | ||
36 | + | ||
37 | + /** | ||
38 | + * @param $orderId | ||
39 | + * @param $plans | ||
40 | + */ | ||
41 | + static function batchCreate($orderId, $plans) | ||
42 | + { | ||
43 | + RepairOrderRepairPlanModel::deleteAll(['repair_order_id' => $orderId]); | ||
44 | + $totalPrice = 0; | ||
45 | + foreach($plans as $k => $plan) { | ||
46 | + $item = [ | ||
47 | + 'repair_order_id' => $orderId, | ||
48 | + 'repair_plan' => $plan['content'], | ||
49 | + 'price' => $plan['price'], | ||
50 | + ]; | ||
51 | + $totalPrice = $totalPrice + $plan['price']*1; | ||
52 | + self::create($item); | ||
53 | + } | ||
54 | + return $totalPrice; | ||
55 | + } | ||
56 | +} | ||
0 | \ No newline at end of file | 57 | \ No newline at end of file |
@@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\order; | ||
4 | +use Yii; | ||
5 | +use domain\order\models\RepairOrderRepairPlan as RepairOrderRepairPlanModel; | ||
6 | +use domain\order\models\RepairFinishImages as RepairFinishImagesModel; | ||
7 | + | ||
8 | +/** | ||
9 | + * 维修订单 | ||
10 | + */ | ||
11 | +class RepairOrderRepairPlanRepository | ||
12 | +{ | ||
13 | + /** | ||
14 | + * @param $condition | ||
15 | + * @return static | ||
16 | + */ | ||
17 | + static function findOne($condition) | ||
18 | + { | ||
19 | + return RepairOrderRepairPlanModel::findOne($condition); | ||
20 | + } | ||
21 | + | ||
22 | + /** | ||
23 | + * @param $condition | ||
24 | + * @return array|null|\yii\db\ActiveRecord[] | ||
25 | + */ | ||
26 | + static function findOrderPlansAll($condition) | ||
27 | + { | ||
28 | + if (empty($condition)) { | ||
29 | + return null; | ||
30 | + } | ||
31 | + $repairPlans = RepairOrderRepairPlanModel::find(); | ||
32 | + $repairPlans->where($condition); | ||
33 | + $plans = $repairPlans->all(); | ||
34 | + | ||
35 | + return $plans; | ||
36 | + } | ||
37 | +} | ||
0 | \ No newline at end of file | 38 | \ No newline at end of file |
@@ -0,0 +1,72 @@ | @@ -0,0 +1,72 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\order; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use domain\order\models\RepairOrder as RepairOrderModel; | ||
7 | +use domain\order\models\RepairOrderImages as RepairOrderImagesModel; | ||
8 | +use domain\order\models\RepairOrderRepairPlan as RepairOrderRepairPlanModel; | ||
9 | +use domain\order\models\RepairFinishImages as RepairFinishImagesModel; | ||
10 | + | ||
11 | +/** | ||
12 | + * 维修订单 | ||
13 | + */ | ||
14 | +class RepairOrderRepository | ||
15 | +{ | ||
16 | + /** | ||
17 | + * @param $condition | ||
18 | + * @return static | ||
19 | + */ | ||
20 | + static function findOne($condition) | ||
21 | + { | ||
22 | + return RepairOrderModel::findOne($condition); | ||
23 | + } | ||
24 | + | ||
25 | + /** | ||
26 | + * @param $condition | ||
27 | + * @return array|null|\yii\db\ActiveRecord[] | ||
28 | + */ | ||
29 | + static function findOrderImageAll($condition) | ||
30 | + { | ||
31 | + if (empty($condition)) { | ||
32 | + return null; | ||
33 | + } | ||
34 | + $repairOrderImage = RepairOrderImagesModel::find(); | ||
35 | + $repairOrderImage->where($condition); | ||
36 | + $images = $repairOrderImage->all(); | ||
37 | + | ||
38 | + return $images; | ||
39 | + } | ||
40 | + | ||
41 | + /** | ||
42 | + * @param $condition | ||
43 | + * @return array|null|\yii\db\ActiveRecord[] | ||
44 | + */ | ||
45 | + static function findOrderPlansAll($condition) | ||
46 | + { | ||
47 | + if (empty($condition)) { | ||
48 | + return null; | ||
49 | + } | ||
50 | + $repairPlans = RepairOrderRepairPlanModel::find(); | ||
51 | + $repairPlans->where($condition); | ||
52 | + $plans = $repairPlans->all(); | ||
53 | + | ||
54 | + return $plans; | ||
55 | + } | ||
56 | + | ||
57 | + /** | ||
58 | + * @param $condition | ||
59 | + * @return array|null|\yii\db\ActiveRecord[] | ||
60 | + */ | ||
61 | + static function findOrderFinishImageAll($condition) | ||
62 | + { | ||
63 | + if (empty($condition)) { | ||
64 | + return null; | ||
65 | + } | ||
66 | + $repairFinishImage = RepairFinishImagesModel::find(); | ||
67 | + $repairFinishImage->where($condition); | ||
68 | + $images = $repairFinishImage->all(); | ||
69 | + | ||
70 | + return $images; | ||
71 | + } | ||
72 | +} | ||
0 | \ No newline at end of file | 73 | \ No newline at end of file |
@@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\order; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use domain\order\models\RepairOrder as RepairOrderModel; | ||
7 | + | ||
8 | +/** | ||
9 | + * 维修订单状态 | ||
10 | + */ | ||
11 | +class RepairOrderStatus | ||
12 | +{ | ||
13 | + const REPAIRING = 1; //维修中 | ||
14 | + const FINISH = 2; // 维修完成 | ||
15 | + | ||
16 | + /** | ||
17 | + * @param $index | ||
18 | + * @return string | ||
19 | + */ | ||
20 | + static function getEnLabel($index = '') | ||
21 | + { | ||
22 | + $arr = [ | ||
23 | + self::REPAIRING => "working", | ||
24 | + self::FINISH => "finish", | ||
25 | + ]; | ||
26 | + if ('' === $index) { | ||
27 | + return $arr; | ||
28 | + } | ||
29 | + if (isset($arr[$index])) { | ||
30 | + return $arr[$index]; | ||
31 | + } else { | ||
32 | + return ''; | ||
33 | + } | ||
34 | + } | ||
35 | +} | ||
0 | \ No newline at end of file | 36 | \ No newline at end of file |
domain/order/models/RepairFinishImages.php
domain/order/models/RepairOrder.php
1 | <?php | 1 | <?php |
2 | 2 | ||
3 | -namespace domain\user\models; | 3 | +namespace domain\order\models; |
4 | 4 | ||
5 | use yii\db\ActiveRecord; | 5 | use yii\db\ActiveRecord; |
6 | use yii\behaviors\TimestampBehavior; | 6 | use yii\behaviors\TimestampBehavior; |
7 | +use common\helpers\Utils; | ||
7 | 8 | ||
8 | /** | 9 | /** |
9 | * 维修订单 | 10 | * 维修订单 |
@@ -32,4 +33,24 @@ class RepairOrder extends ActiveRecord | @@ -32,4 +33,24 @@ class RepairOrder extends ActiveRecord | ||
32 | ] | 33 | ] |
33 | ]; | 34 | ]; |
34 | } | 35 | } |
36 | + /* @inheritdoc */ | ||
37 | + public function init() | ||
38 | + { | ||
39 | + parent::init(); | ||
40 | + $this->attachEvents(); | ||
41 | + } | ||
42 | + | ||
43 | + /* @inheritdoc */ | ||
44 | + public function attachEvents() | ||
45 | + { | ||
46 | + $this->on(static::EVENT_BEFORE_INSERT, [$this, 'onBeforeInsert']); | ||
47 | + } | ||
48 | + | ||
49 | + /** | ||
50 | + * 记录插入前的回调处理 | ||
51 | + */ | ||
52 | + public function onBeforeInsert() | ||
53 | + { | ||
54 | + $this->uuid = Utils::genUUID(); | ||
55 | + } | ||
35 | } | 56 | } |
36 | \ No newline at end of file | 57 | \ No newline at end of file |
domain/order/models/RepairOrderImages.php
domain/order/models/RepairOrderRate.php
domain/order/models/RepairOrderRepairPlan.php
@@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\user; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use domain\user\models\PhoneCode as PhoneCodeModel; | ||
7 | + | ||
8 | +/** | ||
9 | + * 手机验证码 | ||
10 | + */ | ||
11 | +class PhoneCode | ||
12 | +{ | ||
13 | + const LOGIN_TYPE = 1; | ||
14 | + const REGISTER_TYPE = 2; | ||
15 | + const REGISTER_EXPIRE_AFTER = 120; | ||
16 | + | ||
17 | +} | ||
0 | \ No newline at end of file | 18 | \ No newline at end of file |
@@ -0,0 +1,36 @@ | @@ -0,0 +1,36 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\user; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use domain\user\models\User as UserModel; | ||
7 | + | ||
8 | +/** | ||
9 | + * 手机验证码 | ||
10 | + */ | ||
11 | +class User | ||
12 | +{ | ||
13 | + /** | ||
14 | + * @param $data | ||
15 | + * @return null|object | ||
16 | + * @throws \yii\base\InvalidConfigException | ||
17 | + */ | ||
18 | + static function create($data) | ||
19 | + { | ||
20 | + if (empty($data)) { | ||
21 | + return null; | ||
22 | + } | ||
23 | + $classData = [ | ||
24 | + 'class' => UserModel::className() | ||
25 | + ]; | ||
26 | + foreach($data as $k => $v) { | ||
27 | + $classData[$k] = $v; | ||
28 | + } | ||
29 | + $userModel = Yii::createObject($classData); | ||
30 | + if($userModel->save()) { | ||
31 | + return $userModel; | ||
32 | + } else { | ||
33 | + return null; | ||
34 | + } | ||
35 | + } | ||
36 | +} | ||
0 | \ No newline at end of file | 37 | \ No newline at end of file |
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +<?php | ||
2 | + | ||
3 | +namespace domain\user; | ||
4 | + | ||
5 | +use domain\user\models\User as UserModel; | ||
6 | + | ||
7 | +/** | ||
8 | + * 手机验证码 | ||
9 | + */ | ||
10 | +class UserRepository | ||
11 | +{ | ||
12 | + /** | ||
13 | + * @param $condition | ||
14 | + * @return static | ||
15 | + */ | ||
16 | + public static function findOne($condition) | ||
17 | + { | ||
18 | + return UserModel::findOne($condition); | ||
19 | + } | ||
20 | +} | ||
0 | \ No newline at end of file | 21 | \ No newline at end of file |
domain/user/models/User.php
@@ -2,6 +2,8 @@ | @@ -2,6 +2,8 @@ | ||
2 | 2 | ||
3 | namespace domain\user\models; | 3 | namespace domain\user\models; |
4 | 4 | ||
5 | +use common\helpers\Utils; | ||
6 | +use yii\base\NotSupportedException; | ||
5 | use yii\db\ActiveRecord; | 7 | use yii\db\ActiveRecord; |
6 | use yii\behaviors\TimestampBehavior; | 8 | use yii\behaviors\TimestampBehavior; |
7 | use yii\web\IdentityInterface; | 9 | use yii\web\IdentityInterface; |
@@ -33,7 +35,26 @@ class User extends ActiveRecord implements IdentityInterface | @@ -33,7 +35,26 @@ class User extends ActiveRecord implements IdentityInterface | ||
33 | ] | 35 | ] |
34 | ]; | 36 | ]; |
35 | } | 37 | } |
38 | + /* @inheritdoc */ | ||
39 | + public function init() | ||
40 | + { | ||
41 | + parent::init(); | ||
42 | + $this->attachEvents(); | ||
43 | + } | ||
44 | + | ||
45 | + /* @inheritdoc */ | ||
46 | + public function attachEvents() | ||
47 | + { | ||
48 | + $this->on(static::EVENT_BEFORE_INSERT, [$this, 'onBeforeInsert']); | ||
49 | + } | ||
36 | 50 | ||
51 | + /** | ||
52 | + * 记录插入前的回调处理 | ||
53 | + */ | ||
54 | + public function onBeforeInsert() | ||
55 | + { | ||
56 | + $this->uuid = Utils::genUUID(); | ||
57 | + } | ||
37 | 58 | ||
38 | /** @inheritdoc */ | 59 | /** @inheritdoc */ |
39 | public static function findIdentity($id) | 60 | public static function findIdentity($id) |
web/dist/js/order-app.js
1 | -define("order-app",["mk7/app"],function(t){var i=Dom7,n=function(){var t=i(".ui-loading-block");0==t.length&&(i(".view-main").html('<div class="ui-loading-block" id="ui-loading"><div class="ui-loading-cnt"><div class="spinner"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div><div id="loader-inner"><p></p></div> </div> </div>'),window.waitingTime=1e4,window.loaderTimer&&clearTimeout(window.loaderTimer),window.loaderTimer=setTimeout(function(){var t=document.getElementById("loader-inner"),i=document.createElement("p");i.className="notice",t&&(i.innerHTML='加载速度太慢?试试<a class="link" href="#" onclick="javascript:location.reload();return false;">重新加载</a>',t.appendChild(i))},window.waitingTime))},e=!0;return t.name="order",t.routes={index:function(){return e=!1,n(),t.runController("index")},"index/:tab":function(i){e=!1,n();var a={tab:i};return t.runController("index",a)},"rate/:id":function(i){e=!1,n();var a={id:i};return t.runController("rate",a)},submit:function(){return e=!1,n(),t.runController("submit")},"order-details/:id":function(i){e=!1,n();var a={id:i};return t.runController("order-details",a)},"cost-list/:id":function(i){e=!1,n();var a={id:i};return t.runController("cost-list",a)},"*":function(){return t.runController("index")}},t}),define("order/cost-list-controller",["mk7/controller","mk7/url","mk7/utils","mk7/uploadjs"],function(t,i,n,e){var a=Dom7,t=(Template7,new t),o="/user/default/upload-file",r="/order/default/submit-repair-plans";return t.run=function(){var t=this;t.setPageTitle("费用列表"),t.imgLimit=9,t.canSubmit=!0,t.render()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.addEvent(),t.uploadImgEvent(),t.delPlanEvent(),t.inputPriceChangeEvent(),t.submitEvent()},t.addEvent=function(){var t=this;a("#cost-list .add-repair-plan").click(function(i){var n=a("#cost-list .cost-list-div"),e=t.planTpl(n.length+1);a(e).insertBefore(a("#cost-list .cost-total-list-div"))})},t.delPlanEvent=function(){var t=this;a("#cost-list").on("click",".del-plan",function(i){console.log("del plan event"),a(this).parents(".cost-list-div").remove(),a("#cost-list .total-plan-price").html(t.computedPrice())})},t.planTpl=function(t){var i='<div class="cost-list-div"><p class="item-title">第'+t+'项</p><div class="repair-item-cls"><input type="text" class="input-left input-cls" placeholder="填写维修内容" value=""><input type="number" class="input-right input-cls" placeholder="填写价格" value="0"><span class="del-plan"></span></div></div>';return i},t.inputPriceChangeEvent=function(){var t=this;a("#cost-list").on("input propertychange",".input-cls",function(){var i=t.computedPrice();a("#cost-list .total-plan-price").html(i)})},t.computedPrice=function(){var t=a("#cost-list .input-right"),i=0;return a.each(t,function(t,n){i+=1*a(n).val()}),Math.round(i,2)},t.uploadImgEvent=function(){var t=this;a("#cost-list #upload-btn").change(function(){if(""!=a(this).val()&&null!=a(this).val()){var r=a(this).parents("li");e.uploadFile({selector:"#upload-btn",url:i.to(o),processAppendTo:"#cost-list",success:function(i,e){try{if(i.success){var o=i.tmpUrl;a('<li class="upload-li up-img"><div data="'+i.tmpFile+'" data-url="'+o+'" class="upload-item" style="background-image:url('+i.tmpMinUrl+')"></div><span class="del-img"></span></li>').insertBefore(r),t.imgLimit==a("#cost-list #image-list").find(".up-img").length&&a("#cost-list .upload-btn-li").hide()}else n.toast({content:i.message,closeDelay:5e3})}catch(l){console.log(l),n.toast({content:"出错",closeDelay:5e3})}}})}}),a("#cost-list #image-list").on("click",".del-img",function(i){a(this).parent().remove(),t.imgLimit>=a("#cost-list #image-list").find(".up-img").length&&a("#cost-list .upload-btn-li").show()})},t.submitEvent=function(){var t=this;a("#cost-list .btn-submit").click(function(e){var o=a("#cost-list .content-div").find(".repair-item-cls"),l=[],s=!0,c=!0;if(a.each(o,function(t,i){var e=n.trim(a(i).find(".input-left").val()),o=n.trim(a(i).find(".input-right").val());""==e&&(s=!1),""!=o&&0!=o||(c=!1),l.push({content:e,price:o})}),!s)return n.toast({content:"维修清单有部分未填内容"}),!1;if(!c)return n.toast({content:"维修清单有部分未填价格"}),!1;var d=a("#cost-list #image-list").find(".upload-item"),u=[];if(a.each(d,function(t,i){u.push(a(i).attr("data"))}),!t.canSubmit)return!1;t.canSubmit=!1;var m=t.csrf({images:u,plans:l});n.httpPost(r,m,function(e){t.canSubmit=!0,e.success?window.location.replace(i.to("order/#item-details/"+t.id)):n.toast({content:e.message})},!0)})},t}),define("order/index-controller",["mk7/controller","mk7/url","mk7/utils"],function(t,i,n){var e=Dom7,a=Template7,t=new t,o="order/default/order-list";return t.run=function(){var t=this;t.setPageTitle("订单列表"),t.tab=t.params.tab,t.page=0,t.nodata="",t.loading=!1,t.pageCount=1,t.render({tab:t.tab}),t.loadPage()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.tabEvent(),t.bindScrollEvent(),t.addEvent()},t.tabEvent=function(){e(".tab-cls").click(function(t){var i=e(this).attr("data-href");window.location.replace(i)})},t.handleNodata=function(){var t=this;t.nodata="没有数据了";var i=e(".nodata");0==i.length&&e("#index .order-list").append('<div class="nodata">'+t.nodata+"</div>"),t.app.detachInfiniteScroll(".infinite-scroll"),e("#index .infinite-scroll-preloader").remove()},t.loadPage=function(){var t=this;if(t.loading=!0,t.page>=t.pageCount)return void t.handleNodata();var a={status:t.tab};a.page=t.page+1,a=t.csrf(a),e.ajax({method:"GET",url:i.to(o),data:a,dataType:"json",beforeSend:function(){t.showIndicator()},success:function(i){1==i.success&&(n.isDefined(i.page)&&(t.page=parseInt(i.page)),n.isDefined(i.page_count)&&(t.pageCount=parseInt(i.page_count)),t.renderItems(i.items,!0))},error:function(t){},complete:function(i){t.hideIndicator(),t.loading=!1}})},t.bindScrollEvent=function(){var t=this;t.app.attachInfiniteScroll("#index .infinite-scroll"),e("#index .infinite-scroll").on("infinite",function(){t.loading||t.nodata||t.loadPage()})},t.renderItems=function(t,i){var n=e("#index .order-list"),o=e("script#order-item-template"),r=a.compile(o.html()),l=r({list:t});0==i&&(n.html(""),n.append(l)),n.append(l)},t.addEvent=function(){e("#index .add-btn-cls").click(function(t){window.location.href=i.to("order/#submit")})},t}),define("order/order-details-controller",["mk7/controller","mk7/url","mk7/utils"],function(t,i,n){var e=Dom7,t=(Template7,new t),a="order/default/order-details";return t.run=function(){var t=this;t.id=t.params.id,t.setPageTitle("维修单"),t.loadPage()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.finishBtnEvent(),t.goToComment()},t.loadPage=function(){var t=this,i=t.csrf({id:t.id});n.httpGet(a,i,function(i){var n=i;t.render(n)},!0)},t.finishBtnEvent=function(){var t=this;e("#order-details .finish-submit").click(function(n){window.location.href=i.to("order/#cost-list/"+t.id)})},t.goToComment=function(){var t=this;e("#order-details .rate-btn-cls").click(function(n){window.location.href=i.to("order/#rate/"+t.id)})},t}),define("order/rate-controller",["mk7/controller","mk7/url","mk7/utils"],function(t,i,n){var e=Dom7,t=(Template7,new t),a="order/default/submit-rate";return t.run=function(){var t=this;t.id=t.params.id,t.setPageTitle("评价"),t.loadPage()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.starClickEvent(),t.submitEvent()},t.loadPage=function(){var t=this;t.render()},t.starClickEvent=function(){e("#rate").on("click",".quality-box .img-star",function(t){var i=e(this).attr("data-id"),n=e("#rate .quality-box .img-star");e.each(n,function(t,n){var a=e(n).attr("data-id");if(1*a<=i){e(n).addClass("star-on");var o=e("#rate .quality-box").find(".rate-text"),r=e(n).attr("data-txt");o.html(r)}else e(n).removeClass("star-on")})})},t.submitEvent=function(){var t=this;e("#rate .submit-btn").click(function(o){var r=n.trim(e("#rate .text-content").val()),l=e("#rate .img-star"),s=0;e.each(l,function(t,i){e(i).hasClass("star-on")&&s++});var c=t.csrf({star:s,comment:r});n.httpPost(i.to(a),c,function(i){i.success?window.location.replace("order/#order-details/"+t.id):n.toast({content:i.message})},!0)})},t}),define("order/submit-controller",["mk7/controller","mk7/url","mk7/utils","mk7/uploadjs"],function(t,i,n,e){var a=Dom7,t=(Template7,new t),o="/user/default/upload-file",r="/order/default/submit",l=!0;return t.run=function(){var t=this;t.setPageTitle("录入维修单"),t.imgLimit=9,t.render()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.uploadImgEvent(),t.submitEvent()},t.uploadImgEvent=function(){var t=this;a("#submit #upload-btn").change(function(){if(""!=a(this).val()&&null!=a(this).val()){var r=a(this).parents("li");e.uploadFile({selector:"#upload-btn",url:i.to(o),processAppendTo:"#submit",success:function(i,e){try{if(i.success){var o=i.tmpUrl;a('<li class="upload-li up-img"><div data="'+i.tmpFile+'" data-url="'+o+'" class="upload-item" style="background-image:url('+i.tmpMinUrl+')"></div><span class="del-img"></span></li>').insertBefore(r),t.imgLimit==a("#submit #image-list").find(".up-img").length&&a("#submit .upload-btn-li").hide()}else n.toast({content:i.message,closeDelay:5e3})}catch(l){console.log(l),n.toast({content:"出错",closeDelay:5e3})}}})}}),a("#submit #image-list").on("click",".del-img",function(i){a(this).parent().remove(),t.imgLimit>=a("#submit #image-list").find(".up-img").length&&a("#submit .upload-btn-li").show()})},t.submitEvent=function(){var t=this;a("#submit .submit-btn-cls").click(function(e){var o=n.trim(a("#submit .carNo").val()),s=n.trim(a("#submit .carModel").val()),c=n.trim(a("#submit .customer").val()),d=n.trim(a("#submit .phone").val()),u=n.trim(a("#submit .preRepair").val()),m=n.trim(a("#submit .repairPrice").val()),p=n.trim(a("#submit .finishDate").val());if(0==l)return!1;if(""==o)return n.toast({content:"车牌号必填"}),!1;if(""==s)return n.toast({content:"车辆型号必填"}),!1;if(""==c)return n.toast({content:"客户名称必填"}),!1;if(""==d)return n.toast({content:"客联系电话必填"}),!1;if(!n.isMobile(d)&&!uitls.isTelephone(d))return n.toast({content:"客联系电话有误"}),!1;if(""==u)return n.toast({content:"预估维修内容必填"}),!1;if(""==m)return n.toast({content:"预估维修费用必填"}),!1;if(""==p)return n.toast({content:"预估完成时间必填"}),!1;var f=t.getUploadImgs();if(0==f.length)return n.toast({content:"请上传车损照"}),!1;l=!1;var v=t.csrf({carNo:o,carModel:s,customer:c,phone:d,preRepair:u,repairPrice:m,finishDate:p,images:f});n.httpPost(r,v,function(t){return l=!0,t.success?void(window.location.href=i.to("/")):(n.toast({content:message}),!1)},!0)})},t.getUploadImgs=function(){var t=a("#submit #image-list").find(".up-img"),i=[];return 0==t.length?[]:(a.each(t,function(t,n){var e=a(n).find(".upload-item");i.push(e.attr("data"))}),i)},t}); | ||
2 | \ No newline at end of file | 1 | \ No newline at end of file |
2 | +define("order-app",["mk7/app"],function(t){var e=Dom7,n=function(){var t=e(".ui-loading-block");0==t.length&&(e(".view-main").html('<div class="ui-loading-block" id="ui-loading"><div class="ui-loading-cnt"><div class="spinner"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div><div id="loader-inner"><p></p></div> </div> </div>'),window.waitingTime=1e4,window.loaderTimer&&clearTimeout(window.loaderTimer),window.loaderTimer=setTimeout(function(){var t=document.getElementById("loader-inner"),e=document.createElement("p");e.className="notice",t&&(e.innerHTML='加载速度太慢?试试<a class="link" href="#" onclick="javascript:location.reload();return false;">重新加载</a>',t.appendChild(e))},window.waitingTime))},i=!0;return t.name="order",t.routes={index:function(){return i=!1,n(),t.runController("index")},"index/:tab":function(e){i=!1,n();var a={tab:e};return t.runController("index",a)},submit:function(){return i=!1,n(),t.runController("submit")},"order-details/:id":function(e){i=!1,n();var a={id:e};return t.runController("order-details",a)},"customer-order/:id/:sn":function(e,a){i=!1,n();var r={id:e,sn:a};return t.runController("customer-order",r)},"rate/:id/:sn":function(e,a){i=!1,n();var r={id:e,sn:a};return t.runController("rate",r)},"cost-list/:id":function(e){i=!1,n();var a={id:e};return t.runController("cost-list",a)},"*":function(){return t.runController("index")}},t}),define("order/cost-list-controller",["mk7/controller","mk7/url","mk7/utils","mk7/uploadjs"],function(t,e,n,i){var a=Dom7,t=(Template7,new t),r="/user/default/upload-file",o="/order/default/submit-repair-plans";return t.run=function(){var t=this;t.setPageTitle("费用列表"),t.id=t.params.id,t.imgLimit=9,t.canSubmit=!0,t.render()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.addEvent(),t.uploadImgEvent(),t.delPlanEvent(),t.inputPriceChangeEvent(),t.submitEvent()},t.addEvent=function(){var t=this;a("#cost-list .add-repair-plan").click(function(e){var n=a("#cost-list .cost-list-div"),i=t.planTpl(n.length+1);a(i).insertBefore(a("#cost-list .cost-total-list-div"))})},t.delPlanEvent=function(){var t=this;a("#cost-list").on("click",".del-plan",function(e){console.log("del plan event"),a(this).parents(".cost-list-div").remove(),a("#cost-list .total-plan-price").html(t.computedPrice())})},t.planTpl=function(t){var e='<div class="cost-list-div"><p class="item-title">第'+t+'项</p><div class="repair-item-cls"><input type="text" class="input-left input-cls" placeholder="填写维修内容" value=""><input type="number" class="input-right input-cls" placeholder="填写价格" value="0"><span class="del-plan"></span></div></div>';return e},t.inputPriceChangeEvent=function(){var t=this;a("#cost-list").on("input propertychange",".input-cls",function(){var e=t.computedPrice();a("#cost-list .total-plan-price").html(e)})},t.computedPrice=function(){var t=a("#cost-list .input-right"),e=0;return a.each(t,function(t,n){e+=1*a(n).val()}),Math.round(e,2)},t.uploadImgEvent=function(){var t=this;a("#cost-list #upload-btn").change(function(){if(""!=a(this).val()&&null!=a(this).val()){var o=a(this).parents("li");i.uploadFile({selector:"#upload-btn",url:e.to(r),processAppendTo:"#cost-list",success:function(e,i){try{if(e.success){var r=e.tmpUrl;a('<li class="upload-li up-img"><div data="'+e.tmpFile+'" data-url="'+r+'" class="upload-item" style="background-image:url('+e.tmpMinUrl+')"></div><span class="del-img"></span></li>').insertBefore(o),t.imgLimit==a("#cost-list #image-list").find(".up-img").length&&a("#cost-list .upload-btn-li").hide()}else n.toast({content:e.message,closeDelay:5e3})}catch(s){console.log(s),n.toast({content:"出错",closeDelay:5e3})}}})}}),a("#cost-list #image-list").on("click",".del-img",function(e){a(this).parent().remove(),t.imgLimit>=a("#cost-list #image-list").find(".up-img").length&&a("#cost-list .upload-btn-li").show()})},t.submitEvent=function(){var t=this;a("#cost-list .btn-submit").click(function(i){var r=a("#cost-list .content-div").find(".repair-item-cls"),s=[],l=!0,c=!0;if(a.each(r,function(t,e){var i=n.trim(a(e).find(".input-left").val()),r=n.trim(a(e).find(".input-right").val());""==i&&(l=!1),""!=r&&0!=r||(c=!1),s.push({content:i,price:r})}),!l)return n.toast({content:"维修清单有部分未填内容"}),!1;if(!c)return n.toast({content:"维修清单有部分未填价格"}),!1;var u=a("#cost-list #image-list").find(".upload-item"),d=[];if(a.each(u,function(t,e){d.push(a(e).attr("data"))}),!t.canSubmit)return!1;t.canSubmit=!1;var m=t.csrf({images:d,plans:s,id:t.id});n.httpPost(o,m,function(i){t.canSubmit=!0,i.success?window.location.replace(e.to("order#order-details/"+t.id)):n.toast({content:i.message})},!0)})},t}),define("order/customer-order-controller",["mk7/controller","mk7/url","mk7/utils"],function(t,e,n){var i=Dom7,t=(Template7,new t),a="order/customer/order-details";return t.run=function(){var t=this;t.id=t.params.id,t.sn=t.params.sn,t.setPageTitle("维修单"),t.loadPage()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.goToComment()},t.loadPage=function(){var t=this,i=t.csrf({id:t.id});n.httpPost(e.to(a),i,function(e){var n=e;t.render(n)},!0)},t.goToComment=function(){var t=this;i("#customer-order .rate-btn-cls").click(function(n){window.location.replace(e.to("order/customer#rate/"+t.id+"/"+t.sn))})},t}),define("order/index-controller",["mk7/controller","mk7/url","mk7/utils"],function(t,e,n){var i=Dom7,a=Template7,t=new t,r="order/default/order-list";return t.run=function(){var t=this;t.setPageTitle("订单列表"),t.tab=t.params.tab,t.page=0,t.nodata="",t.loading=!1,t.pageCount=1,t.render({tab:t.tab}),t.loadPage()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.tabEvent(),t.bindScrollEvent(),t.addEvent()},t.tabEvent=function(){i(".tab-cls").click(function(t){var e=i(this).attr("data-href");window.location.replace(e)})},t.handleNodata=function(){var t=this;t.nodata="没有数据了";var e=i(".nodata");0==e.length&&i("#index .order-list").append('<div class="nodata">'+t.nodata+"</div>"),t.app.detachInfiniteScroll(".infinite-scroll"),i("#index .infinite-scroll-preloader").remove()},t.loadPage=function(){var t=this;if(t.loading=!0,t.page>=t.pageCount)return void t.handleNodata();var a={status:t.tab};a.page=t.page+1,a=t.csrf(a),i.ajax({method:"GET",url:e.to(r),data:a,dataType:"json",beforeSend:function(){t.showIndicator()},success:function(e){1==e.success&&(n.isDefined(e.page)&&(t.page=parseInt(e.page)),n.isDefined(e.page_count)&&(t.pageCount=parseInt(e.page_count)),t.renderItems(e.items,!0))},error:function(t){},complete:function(e){t.hideIndicator(),t.loading=!1}})},t.bindScrollEvent=function(){var t=this;t.app.attachInfiniteScroll("#index .infinite-scroll"),i("#index .infinite-scroll").on("infinite",function(){t.loading||t.nodata||t.loadPage()})},t.renderItems=function(t,e){var n=i("#index .order-list"),r=i("script#order-item-template"),o=a.compile(r.html()),s=o({list:t});0==e&&(n.html(""),n.append(s)),n.append(s)},t.addEvent=function(){i("#index .add-btn-cls").click(function(t){window.location.href=e.to("order/#submit")})},t}),define("order/order-details-controller",["mk7/controller","mk7/url","mk7/utils"],function(t,e,n){var i=Dom7,t=(Template7,new t),a="order/default/order-details";return t.run=function(){var t=this;t.id=t.params.id,t.setPageTitle("维修单"),t.loadPage()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.finishBtnEvent(),t.goToComment()},t.loadPage=function(){var t=this,i=t.csrf({id:t.id});n.httpPost(e.to(a),i,function(e){var n=e;t.render(n)},!0)},t.finishBtnEvent=function(){var t=this;i("#order-details .finish-submit").click(function(n){window.location.href=e.to("order/#cost-list/"+t.id)})},t.goToComment=function(){var t=this;i("#order-details .rate-btn-cls").click(function(n){window.location.href=e.to("order/#rate/"+t.id)})},t}),define("order/rate-controller",["mk7/controller","mk7/url","mk7/utils"],function(t,e,n){var i=Dom7,t=(Template7,new t),a="order/customer/submit-rate";return t.run=function(){var t=this;t.id=t.params.id,t.sn=t.params.sn,t.setPageTitle("评价"),t.loadPage()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.starClickEvent(),t.submitEvent()},t.loadPage=function(){var t=this;t.render()},t.starClickEvent=function(){i("#rate").on("click",".quality-box .img-star",function(t){var e=i(this).attr("data-id"),n=i("#rate .quality-box .img-star");i.each(n,function(t,n){var a=i(n).attr("data-id");if(1*a<=e){i(n).addClass("star-on");var r=i("#rate .quality-box").find(".rate-text"),o=i(n).attr("data-txt");r.html(o)}else i(n).removeClass("star-on")})})},t.submitEvent=function(){var t=this;i("#rate .submit-btn").click(function(r){var o=n.trim(i("#rate .text-content").val()),s=i("#rate .img-star"),l=0;i.each(s,function(t,e){i(e).hasClass("star-on")&&l++});var c=t.csrf({star:l,comment:o});n.httpPost(e.to(a),c,function(i){i.success?window.location.replace(e.to("order/customer#customer-order/"+t.id+"/"+t.sn)):n.toast({content:i.message})},!0)})},t}),define("order/submit-controller",["mk7/controller","mk7/url","mk7/utils","mk7/uploadjs","mk7/picker"],function(t,e,n,a,r){var o=Dom7,t=(Template7,new t),s="/user/default/upload-file",l="/order/default/submit",c=!0,u="";return t.run=function(){var t=this;t.setPageTitle("录入维修单"),t.imgLimit=9,t.render()},t.bindEvents=function(){var t=this;console.log("bindEvents"),t.uploadImgEvent(),t.submitEvent(),t.selectDateEvent()},t.uploadImgEvent=function(){var t=this;o("#submit #upload-btn").change(function(){if(""!=o(this).val()&&null!=o(this).val()){var i=o(this).parents("li");a.uploadFile({selector:"#upload-btn",url:e.to(s),processAppendTo:"#submit",success:function(e,a){try{if(e.success){var r=e.tmpUrl;o('<li class="upload-li up-img"><div data="'+e.tmpFile+'" data-url="'+r+'" class="upload-item" style="background-image:url('+e.tmpMinUrl+')"></div><span class="del-img"></span></li>').insertBefore(i),t.imgLimit==o("#submit #image-list").find(".up-img").length&&o("#submit .upload-btn-li").hide()}else n.toast({content:e.message,closeDelay:5e3})}catch(s){console.log(s),n.toast({content:"出错",closeDelay:5e3})}}})}}),o("#submit #image-list").on("click",".del-img",function(e){o(this).parent().remove(),t.imgLimit>=o("#submit #image-list").find(".up-img").length&&o("#submit .upload-btn-li").show()})},t.submitEvent=function(){var t=this;o("#submit .submit-btn-cls").click(function(i){var a=n.trim(o("#submit .carNo").val()),r=n.trim(o("#submit .carModel").val()),s=n.trim(o("#submit .customer").val()),u=n.trim(o("#submit .phone").val()),d=n.trim(o("#submit .preRepair").val()),m=n.trim(o("#submit .repairPrice").val()),v=n.trim(o("#submit .finishDate").val());if(0==c)return!1;if(""==a)return n.toast({content:"车牌号必填"}),!1;if(""==r)return n.toast({content:"车辆型号必填"}),!1;if(""==s)return n.toast({content:"客户名称必填"}),!1;if(""==u)return n.toast({content:"客联系电话必填"}),!1;if(!n.isMobile(u)&&!uitls.isTelephone(u))return n.toast({content:"客联系电话有误"}),!1;if(""==d)return n.toast({content:"预估维修内容必填"}),!1;if(""==m)return n.toast({content:"预估维修费用必填"}),!1;if(""==v)return n.toast({content:"预估完成时间必填"}),!1;var p=t.getUploadImgs();if(0==p.length)return n.toast({content:"请上传车损照"}),!1;c=!1;var f=t.csrf({carNo:a,carModel:r,customer:s,phone:u,preRepair:d,repairPrice:m,finishDate:v,images:p});n.httpPost(l,f,function(t){return c=!0,t.success?void window.location.replace(e.to("order#order-details/"+t.orderId)):(n.toast({content:message}),!1)},!0)})},t.getUploadImgs=function(){var t=o("#submit #image-list").find(".up-img"),e=[];return 0==t.length?[]:(o.each(t,function(t,n){var i=o(n).find(".upload-item");e.push(i.attr("data"))}),e)},t.selectDateEvent=function(){var t=this;o("#submit .finish-date-input").click(function(e){var n=o(this).val();console.log(n),t.dateTimeSelector("#submit .finish-date-input",n)})},t.dateTimeSelector=function(t,e){var n=this,a=new Date,r=30,s=a.getFullYear(),l=a.getMonth(),c=a.getDate(),d=a.getHours(),m=s+"-"+(l+1)+"-"+c;if(""!=e&&null!=e&&void 0!==e){var v=e.split(" ");m=v[0],d=v[1]}var p=[];for(i=0;i<=r;i++){var f=new Date;f.setDate(a.getDate()+i);var g=f.getFullYear()+"-"+(f.getMonth()+1)+"-"+f.getDate();p.push(g)}var h=n.app.picker({input:t,toolbarTemplate:'<div class="toolbar"><div class="toolbar-inner"><div class="left">请选择用工时间</div><div class="right"><a href="javascript:void(0);" class="link submit-confirm-picker">确定</a></div></div></div>',value:[m,d],onChange:function(t,e,n){var i,a,r;if(e[0]instanceof Date)i=e[0].getFullYear(),a=e[0].getMonth(),r=e[0].getDate();else{var o=e[0].split("-");i=o[0],a=o[1]-1,r=o[2]}var s=new Date(i,a,r,e[1],0),l=new Date((new Date).getTime()+36e5);if(s<l){if(void 0===t.cols[0])return!1;var c=l.getHours(),u=l.getFullYear()+"-"+(l.getMonth()+1)+"-"+l.getDate(),d=new Date(l.getFullYear(),l.getMonth(),l.getDate(),l.getHours(),0);if(d-new Date<9e5){var m=new Date(d.getTime()+36e5);c=m.getHours(),u=m.getFullYear()+"-"+(m.getMonth()+1)+"-"+m.getDate()}t.cols[0].setValue(u),t.cols[2].setValue(c)}},formatValue:function(t,e,n){var i="";i=e[0]instanceof Date?e[0].getFullYear()+"-"+(e[0].getMonth()+1)+"-"+e[0].getDate():e[0];var a=i+" "+e[1];return a},cols:[{values:p,displayValues:function(){var t=[],e=new Date,n=e.getFullYear(),i=e.getMonth()+1,a=e.getDate();e.setDate(e.getDate()+1);for(var r=0;r<p.length;r++){var o=p[r],s=o.split("-"),l=s[1]+"月"+s[2]+"日";n==s[0]&&1*i==s[1]&&1*a==s[2]&&(l+="(今天)"),1*e.getFullYear()==s[0]&&1*e.getMonth()+1==s[1]&&1*e.getDate()==s[2]&&(l+="(明天)"),t.push(l)}return t}()},{divider:!0,content:" "},{values:function(){for(var t=[],e=0;e<=23;e++)t.push(e);return t}(),displayValues:function(){for(var t=[],e=0;e<=23;e++)t.push(e<10?"0"+e+"时":e+"时");return t}()},{divider:!0,content:" "}],onClose:function(e){if(h){var n=h.value,i=n[1]<10?"0"+n[1]:n[1];u=n[0]+" "+i,o(t).val(u),h.destroy()}}});h.open(),o(".submit-confirm-picker").on("click",function(e){e.preventDefault();var n=h.value,i=n[1]<10?"0"+n[1]:n[1];u=n[0]+" "+i,o(t).val(u),h.destroy()})},t}); | ||
3 | \ No newline at end of file | 3 | \ No newline at end of file |
web/dist/js/user-app.js
1 | -define("user-app",["mk7/app"],function(e){var t=Dom7,n=function(){var e=t(".ui-loading-block");0==e.length&&(t(".view-main").html('<div class="ui-loading-block" id="ui-loading"><div class="ui-loading-cnt"><div class="spinner"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div><div id="loader-inner"><p></p></div> </div> </div>'),window.waitingTime=1e4,window.loaderTimer&&clearTimeout(window.loaderTimer),window.loaderTimer=setTimeout(function(){var e=document.getElementById("loader-inner"),t=document.createElement("p");t.className="notice",e&&(t.innerHTML='加载速度太慢?试试<a class="link" href="#" onclick="javascript:location.reload();return false;">重新加载</a>',e.appendChild(t))},window.waitingTime))},o=!0;return e.name="user",e.routes={index:function(){return o=!1,n(),e.runController("index")},register:function(){return o=!1,n(),e.runController("register")},login:function(){return o=!1,n(),e.runController("login")},"*":function(){return e.runController("index")}},e}),define("user/index-controller",["mk7/controller","mk7/url","mk7/utils"],function(e,t,n){var e=(Dom7,Template7,new e);return e.run=function(){var e=this;e.setPageTitle("首页"),e.hideAllNonBaseMenuItem(window.$site),e.render()},e.bindEvents=function(){console.log("bindEvents")},e}),define("user/login-controller",["mk7/controller","mk7/url","mk7/utils"],function(e,t,n){var o=Dom7,e=(Template7,new e),i="/user/login/get-code",r="/user/login/login",l=!0,c=!0,s=null;return e.run=function(){var e=this;e.setPageTitle("登录"),e.codeDuration=60,e.render()},e.bindEvents=function(){var e=this;console.log("bindEvents"),e.getCodeEvent(),e.gotoRegisterEvent(),e.loginEvent()},e.getCodeEvent=function(){var e=this;o("#login .get-code-cls").click(function(){if(0==l)return!1;clearInterval(s),l=!1;var r=e.csrf({action:"login"});n.httpGet(t.to(i),r,function(t){if(!t.success)return n.toast({content:t.message,closeDelay:3e3}),l=!0,!1;var i=t.codeDuration;e.codeDuration=i,s=setInterval(function(t){e.codeDuration--,0==e.codeDuration?(o("#login .get-code-cls").html("获取验证码"),clearInterval(s),e.codeDuration=i,l=!0):o("#login .get-code-cls").html('<span class="count-down-cls">'+e.codeDuration+"s后重新获取</span>")},1e3)})})},e.loginEvent=function(){var e=this;o("#login .login-btn").click(function(i){var l=n.trim(o("#login .mobile").val()),s=n.trim(o("#login .code").val());if(""==l)return n.toast({content:"手机号码必填"}),!1;if(!n.isMobile(l))return n.toast({content:"手机号码不合格"}),!1;if(""==s)return n.toast({content:"验证码必填"}),!1;if(0==c)return!1;c=!1;var a=e.csrf({mobile:l,code:s});n.httpPost(t.to(r),a,function(e){return e.success?(c=!0,void(window.location.href=t.to("/"))):(n.toast({content:e.message,closeDelay:3e3}),c=!0,!1)})})},e.gotoRegisterEvent=function(){o("#login .register-btn").click(function(e){window.location.href=t.to("user/#register")})},e}),define("user/register-controller",["mk7/controller","mk7/url","mk7/utils","mk7/uploadjs"],function(e,t,n,o){var i=Dom7,e=(Template7,new e),r="/user/login/register",l="/user/default/upload-file",c="/user/login/get-code",s=!0,a=!0,u=null;return e.run=function(){var e=this;e.setPageTitle("注册"),e.codeDuration=60,e.render()},e.bindEvents=function(){var e=this;console.log("bindEvents"),e.uploadEvent(),e.getCodeEvent(),e.registerEvent(),e.gotoLoginEvent()},e.uploadEvent=function(){i("#register .upload-input-cls").change(function(){if(""!=i(this).val()&&null!=i(this).val()){var e=i(this).attr("id"),r=i(this).parent();o.uploadFile({selector:"#"+e,url:t.to(l),processAppendTo:"#register",success:function(e,t){try{if(e.success){var o=e.tmpUrl;r.css("background-image","url("+e.tmpMinUrl+")"),r.attr("data",e.tmpFile),r.attr("data-url",o)}else n.toast({content:e.message,closeDelay:5e3})}catch(i){n.toast({content:"出错",closeDelay:5e3})}}})}})},e.getCodeEvent=function(){var e=this;i("#register .get-code-cls").click(function(){if(0==s)return!1;clearInterval(u),s=!1;var o=e.csrf({action:"register"});n.httpGet(t.to(c),o,function(t){if(!t.success)return n.toast({content:t.message,closeDelay:3e3}),s=!0,!1;var o=t.codeDuration;e.codeDuration=o,u=setInterval(function(t){e.codeDuration--,0==e.codeDuration?(i("#register .get-code-cls").html("获取验证码"),clearInterval(u),e.codeDuration=o,s=!0):i("#register .get-code-cls").html('<span class="count-down-cls">'+e.codeDuration+"s后重新获取</span>")},1e3)})})},e.registerEvent=function(){var e=this;i("#register .register-btn").click(function(o){var l=n.trim(i("#register .name").val()),c=n.trim(i("#register .mobile").val()),s=n.trim(i("#register .code").val());if(""==l)return n.toast({content:"车厂名称必填"}),!1;if(""==c)return n.toast({content:"手机号码必填"}),!1;if(!n.isMobile(c))return n.toast({content:"手机号码不合格"}),!1;if(""==s)return n.toast({content:"验证码必填"}),!1;var u=i("#register .upload-btn-cls").attr("data");if(void 0===u||null==u)return n.toast({content:"请上传营业执照"}),!1;if(0==a)return!1;a=!1;var d=e.csrf({name:l,mobile:c,code:s,img:u});n.httpPost(t.to(r),d,function(e){return e.success?void(window.location.href=t.to("/")):(n.toast({content:e.message,closeDelay:3e3}),a=!0,!1)})})},e.gotoLoginEvent=function(){i("#register .login-btn").click(function(e){window.location.href=t.to("user/#login")})},e}); | ||
2 | \ No newline at end of file | 1 | \ No newline at end of file |
2 | +define("user-app",["mk7/app"],function(e){var t=Dom7,n=function(){var e=t(".ui-loading-block");0==e.length&&(t(".view-main").html('<div class="ui-loading-block" id="ui-loading"><div class="ui-loading-cnt"><div class="spinner"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div><div id="loader-inner"><p></p></div> </div> </div>'),window.waitingTime=1e4,window.loaderTimer&&clearTimeout(window.loaderTimer),window.loaderTimer=setTimeout(function(){var e=document.getElementById("loader-inner"),t=document.createElement("p");t.className="notice",e&&(t.innerHTML='加载速度太慢?试试<a class="link" href="#" onclick="javascript:location.reload();return false;">重新加载</a>',e.appendChild(t))},window.waitingTime))},o=!0;return e.name="user",e.routes={index:function(){return o=!1,n(),e.runController("index")},register:function(){return o=!1,n(),e.runController("register")},login:function(){return o=!1,n(),e.runController("login")},"*":function(){return e.runController("index")}},e}),define("user/index-controller",["mk7/controller","mk7/url","mk7/utils"],function(e,t,n){var e=(Dom7,Template7,new e);return e.run=function(){var e=this;e.setPageTitle("首页"),e.hideAllNonBaseMenuItem(window.$site),e.render()},e.bindEvents=function(){console.log("bindEvents")},e}),define("user/login-controller",["mk7/controller","mk7/url","mk7/utils"],function(e,t,n){var o=Dom7,e=(Template7,new e),i="/user/login/get-code",r="/user/login/login",l=!0,s=!0,c=null;return e.run=function(){var e=this;return e.setPageTitle("登录"),e.codeDuration=60,isGuest?void e.render():(window.location.href=t.to("order/#index"),"")},e.bindEvents=function(){var e=this;console.log("bindEvents"),e.getCodeEvent(),e.gotoRegisterEvent(),e.loginEvent()},e.getCodeEvent=function(){var e=this;o("#login .get-code-cls").click(function(){var r=n.trim(o("#login .mobile").val());if(""==r)return n.toast({content:"手机号码必填"}),!1;if(!n.isMobile(r))return n.toast({content:"手机号码不合格"}),!1;if(0==l)return!1;clearInterval(c),l=!1;var s=e.csrf({action:"login",mobile:r});n.httpGet(t.to(i),s,function(t){if(!t.success)return n.toast({content:t.message,closeDelay:3e3}),l=!0,!1;t.testCode&&o("#login .code").val(t.testCode);var i=t.codeDuration;e.codeDuration=i,c=setInterval(function(t){e.codeDuration--,0==e.codeDuration?(o("#login .get-code-cls").html("获取验证码"),clearInterval(c),e.codeDuration=i,l=!0):o("#login .get-code-cls").html('<span class="count-down-cls">'+e.codeDuration+"s后重新获取</span>")},1e3)})})},e.loginEvent=function(){var e=this;o("#login .login-btn").click(function(i){var l=n.trim(o("#login .mobile").val()),c=n.trim(o("#login .code").val());if(""==l)return n.toast({content:"手机号码必填"}),!1;if(!n.isMobile(l))return n.toast({content:"手机号码不合格"}),!1;if(""==c)return n.toast({content:"验证码必填"}),!1;if(0==s)return!1;s=!1;var a=e.csrf({mobile:l,code:c});n.httpPost(t.to(r),a,function(e){return s=!0,e.success?void(window.location.href=t.to("order/#index")):(n.toast({content:e.message,closeDelay:3e3}),!1)})})},e.gotoRegisterEvent=function(){o("#login .register-btn").click(function(e){window.location.href=t.to("user/#register")})},e}),define("user/register-controller",["mk7/controller","mk7/url","mk7/utils","mk7/uploadjs"],function(e,t,n,o){var i=Dom7,e=(Template7,new e),r="/user/login/register",l="/user/default/upload-file",s="/user/login/get-code",c=!0,a=!0,u=null;return e.run=function(){var e=this;return e.setPageTitle("注册"),e.codeDuration=60,isGuest?void e.render():(window.location.href=t.to("order/#index"),"")},e.bindEvents=function(){var e=this;console.log("bindEvents"),e.uploadEvent(),e.getCodeEvent(),e.registerEvent(),e.gotoLoginEvent()},e.uploadEvent=function(){i("#register .upload-input-cls").change(function(){if(""!=i(this).val()&&null!=i(this).val()){var e=i(this).attr("id"),r=i(this).parent();o.uploadFile({selector:"#"+e,url:t.to(l),processAppendTo:"#register",success:function(e,t){try{if(e.success){var o=e.tmpUrl;r.css("background-image","url("+e.tmpMinUrl+")"),r.attr("data",e.tmpFile),r.attr("data-url",o)}else n.toast({content:e.message,closeDelay:5e3})}catch(i){n.toast({content:"出错",closeDelay:5e3})}}})}})},e.getCodeEvent=function(){var e=this;i("#register .get-code-cls").click(function(){var o=n.trim(i("#register .mobile").val());if(""==o)return n.toast({content:"手机号码必填"}),!1;if(!n.isMobile(o))return n.toast({content:"手机号码不合格"}),!1;if(0==c)return!1;clearInterval(u),c=!1;var r=e.csrf({action:"register",mobile:o});n.httpGet(t.to(s),r,function(t){if(!t.success)return n.toast({content:t.message,closeDelay:3e3}),c=!0,!1;t.testCode&&i("#register .code").val(t.testCode);var o=t.codeDuration;e.codeDuration=o,u=setInterval(function(t){e.codeDuration--,0==e.codeDuration?(i("#register .get-code-cls").html("获取验证码"),clearInterval(u),e.codeDuration=o,c=!0):i("#register .get-code-cls").html('<span class="count-down-cls">'+e.codeDuration+"s后重新获取</span>")},1e3)})})},e.registerEvent=function(){var e=this;i("#register .register-btn").click(function(o){var l=n.trim(i("#register .name").val()),s=n.trim(i("#register .mobile").val()),c=n.trim(i("#register .code").val());if(""==l)return n.toast({content:"车厂名称必填"}),!1;if(""==s)return n.toast({content:"手机号码必填"}),!1;if(!n.isMobile(s))return n.toast({content:"手机号码不合格"}),!1;if(""==c)return n.toast({content:"验证码必填"}),!1;var u=i("#register .licensePic").attr("data");if(void 0===u||null==u)return n.toast({content:"请上传营业执照"}),!1;if(0==a)return!1;a=!1;var d=e.csrf({name:l,mobile:s,code:c,licensePic:u});n.httpPost(t.to(r),d,function(e){return e.success?void(window.location.href=t.to("order/#index")):(n.toast({content:e.message,closeDelay:3e3}),a=!0,!1)})})},e.gotoLoginEvent=function(){i("#register .login-btn").click(function(e){window.location.href=t.to("user/#login")})},e}); | ||
3 | \ No newline at end of file | 3 | \ No newline at end of file |
web/src/js/order/app.js
@@ -47,26 +47,37 @@ define( | @@ -47,26 +47,37 @@ define( | ||
47 | } | 47 | } |
48 | return app.runController('index',params); | 48 | return app.runController('index',params); |
49 | }, | 49 | }, |
50 | - 'rate/:id': function (id) { | 50 | + |
51 | + 'submit': function () { | ||
52 | + fromOutside = false; | ||
53 | + _autoLoading(); | ||
54 | + return app.runController('submit'); | ||
55 | + }, | ||
56 | + 'order-details/:id': function (id) { | ||
51 | fromOutside = false; | 57 | fromOutside = false; |
52 | _autoLoading(); | 58 | _autoLoading(); |
53 | var params = { | 59 | var params = { |
54 | id:id | 60 | id:id |
55 | } | 61 | } |
56 | - return app.runController('rate',params); | 62 | + return app.runController('order-details', params); |
57 | }, | 63 | }, |
58 | - 'submit': function () { | 64 | + 'customer-order/:id/:sn': function (id,sn) { |
59 | fromOutside = false; | 65 | fromOutside = false; |
60 | _autoLoading(); | 66 | _autoLoading(); |
61 | - return app.runController('submit'); | 67 | + var params = { |
68 | + id:id, | ||
69 | + sn:sn | ||
70 | + } | ||
71 | + return app.runController('customer-order', params); | ||
62 | }, | 72 | }, |
63 | - 'order-details/:id': function (id) { | 73 | + 'rate/:id/:sn': function (id,sn) { |
64 | fromOutside = false; | 74 | fromOutside = false; |
65 | _autoLoading(); | 75 | _autoLoading(); |
66 | var params = { | 76 | var params = { |
67 | - id:id | 77 | + id:id, |
78 | + sn:sn | ||
68 | } | 79 | } |
69 | - return app.runController('order-details', params); | 80 | + return app.runController('rate',params); |
70 | }, | 81 | }, |
71 | 'cost-list/:id': function (id) { | 82 | 'cost-list/:id': function (id) { |
72 | fromOutside = false; | 83 | fromOutside = false; |
web/src/js/order/cost-list-controller.js
@@ -20,6 +20,7 @@ define( | @@ -20,6 +20,7 @@ define( | ||
20 | ctrl.run = function () { | 20 | ctrl.run = function () { |
21 | var me = this; | 21 | var me = this; |
22 | me.setPageTitle("费用列表"); | 22 | me.setPageTitle("费用列表"); |
23 | + me.id = me.params.id | ||
23 | me.imgLimit = 9; | 24 | me.imgLimit = 9; |
24 | me.canSubmit = true; | 25 | me.canSubmit = true; |
25 | me.render(); | 26 | me.render(); |
@@ -151,11 +152,11 @@ define( | @@ -151,11 +152,11 @@ define( | ||
151 | return false; | 152 | return false; |
152 | } | 153 | } |
153 | me.canSubmit = false; | 154 | me.canSubmit = false; |
154 | - var pData = me.csrf({images:images, plans: repairPlan}); | 155 | + var pData = me.csrf({images:images, plans: repairPlan, id:me.id}); |
155 | utils.httpPost(submitURL,pData, function(res){ | 156 | utils.httpPost(submitURL,pData, function(res){ |
156 | me.canSubmit = true; | 157 | me.canSubmit = true; |
157 | if (res.success) { | 158 | if (res.success) { |
158 | - window.location.replace(url.to('order/#item-details/'+me.id)) | 159 | + window.location.replace(url.to('order#order-details/'+me.id)) |
159 | } else { | 160 | } else { |
160 | utils.toast({content:res.message}) | 161 | utils.toast({content:res.message}) |
161 | } | 162 | } |
@@ -0,0 +1,50 @@ | @@ -0,0 +1,50 @@ | ||
1 | +/** | ||
2 | + * 维修中页 | ||
3 | + */ | ||
4 | +define( | ||
5 | + "order/customer-order-controller", | ||
6 | + [ | ||
7 | + 'mk7/controller', | ||
8 | + 'mk7/url', | ||
9 | + 'mk7/utils', | ||
10 | + ], | ||
11 | + | ||
12 | + function(ctrl, url, utils) { | ||
13 | + | ||
14 | + var $$ = Dom7; | ||
15 | + var t7 = Template7; | ||
16 | + var ctrl = new ctrl(); | ||
17 | + | ||
18 | + var pageURL = 'order/customer/order-details'; | ||
19 | + ctrl.run = function () { | ||
20 | + var me = this; | ||
21 | + me.id = me.params.id; | ||
22 | + me.sn = me.params.sn; | ||
23 | + me.setPageTitle("维修单"); | ||
24 | + me.loadPage(); | ||
25 | + } | ||
26 | + ctrl.bindEvents = function () { | ||
27 | + var me = this; | ||
28 | + console.log("bindEvents"); | ||
29 | + me.goToComment(); | ||
30 | + } | ||
31 | + ctrl.loadPage = function() { | ||
32 | + var me = this | ||
33 | + var pData = me.csrf({id: me.id}); | ||
34 | + utils.httpPost(url.to(pageURL), pData, function(res) { | ||
35 | + var rData = res; | ||
36 | + me.render(rData); | ||
37 | + }, true) | ||
38 | + | ||
39 | + } | ||
40 | + | ||
41 | + ctrl.goToComment = function() { | ||
42 | + var me = this; | ||
43 | + $$('#customer-order .rate-btn-cls').click(function(e){ | ||
44 | + window.location.replace(url.to('order/customer#rate/'+me.id+'/'+me.sn)) | ||
45 | + }) | ||
46 | + | ||
47 | + } | ||
48 | + return ctrl; | ||
49 | + } | ||
50 | +); |
web/src/js/order/order-details-controller.js
@@ -31,7 +31,7 @@ define( | @@ -31,7 +31,7 @@ define( | ||
31 | ctrl.loadPage = function() { | 31 | ctrl.loadPage = function() { |
32 | var me = this | 32 | var me = this |
33 | var pData = me.csrf({id: me.id}); | 33 | var pData = me.csrf({id: me.id}); |
34 | - utils.httpGet(pageURL, pData, function(res) { | 34 | + utils.httpPost(url.to(pageURL), pData, function(res) { |
35 | var rData = res; | 35 | var rData = res; |
36 | me.render(rData); | 36 | me.render(rData); |
37 | }, true) | 37 | }, true) |
web/src/js/order/rate-controller.js
1 | /** | 1 | /** |
2 | - * 订单评价-首页 | 2 | + * 订单评价 |
3 | */ | 3 | */ |
4 | define( | 4 | define( |
5 | "order/rate-controller", | 5 | "order/rate-controller", |
@@ -15,10 +15,11 @@ define( | @@ -15,10 +15,11 @@ define( | ||
15 | var t7 = Template7; | 15 | var t7 = Template7; |
16 | var ctrl = new ctrl(); | 16 | var ctrl = new ctrl(); |
17 | 17 | ||
18 | - var submitURL = 'order/default/submit-rate'; | 18 | + var submitURL = 'order/customer/submit-rate'; |
19 | ctrl.run = function () { | 19 | ctrl.run = function () { |
20 | var me = this; | 20 | var me = this; |
21 | me.id = me.params.id; | 21 | me.id = me.params.id; |
22 | + me.sn = me.params.sn; | ||
22 | me.setPageTitle("评价"); | 23 | me.setPageTitle("评价"); |
23 | me.loadPage(); | 24 | me.loadPage(); |
24 | } | 25 | } |
@@ -65,7 +66,7 @@ define( | @@ -65,7 +66,7 @@ define( | ||
65 | var pData = me.csrf({star:star,comment:comment}); | 66 | var pData = me.csrf({star:star,comment:comment}); |
66 | utils.httpPost(url.to(submitURL), pData, function(res) { | 67 | utils.httpPost(url.to(submitURL), pData, function(res) { |
67 | if (res.success) { | 68 | if (res.success) { |
68 | - window.location.replace('order/#order-details/'+me.id); | 69 | + window.location.replace(url.to('order/customer#customer-order/'+me.id+'/'+me.sn)); |
69 | } else { | 70 | } else { |
70 | utils.toast({content:res.message}); | 71 | utils.toast({content:res.message}); |
71 | } | 72 | } |
web/src/js/order/submit-controller.js
@@ -8,9 +8,10 @@ define( | @@ -8,9 +8,10 @@ define( | ||
8 | 'mk7/url', | 8 | 'mk7/url', |
9 | 'mk7/utils', | 9 | 'mk7/utils', |
10 | 'mk7/uploadjs', | 10 | 'mk7/uploadjs', |
11 | + 'mk7/picker' | ||
11 | ], | 12 | ], |
12 | 13 | ||
13 | - function(ctrl, url, utils, uploadjs) { | 14 | + function(ctrl, url, utils, uploadjs, picker) { |
14 | 15 | ||
15 | var $$ = Dom7; | 16 | var $$ = Dom7; |
16 | var t7 = Template7; | 17 | var t7 = Template7; |
@@ -19,6 +20,7 @@ define( | @@ -19,6 +20,7 @@ define( | ||
19 | var uploadURL = '/user/default/upload-file'; | 20 | var uploadURL = '/user/default/upload-file'; |
20 | var submitURL = '/order/default/submit'; | 21 | var submitURL = '/order/default/submit'; |
21 | var canSubmit = true; | 22 | var canSubmit = true; |
23 | + var finishTime = ''; | ||
22 | ctrl.run = function () { | 24 | ctrl.run = function () { |
23 | var me = this; | 25 | var me = this; |
24 | me.setPageTitle("录入维修单"); | 26 | me.setPageTitle("录入维修单"); |
@@ -30,6 +32,7 @@ define( | @@ -30,6 +32,7 @@ define( | ||
30 | console.log("bindEvents"); | 32 | console.log("bindEvents"); |
31 | me.uploadImgEvent(); | 33 | me.uploadImgEvent(); |
32 | me.submitEvent(); | 34 | me.submitEvent(); |
35 | + me.selectDateEvent(); | ||
33 | } | 36 | } |
34 | ctrl.uploadImgEvent = function() { | 37 | ctrl.uploadImgEvent = function() { |
35 | var me = this; | 38 | var me = this; |
@@ -48,7 +51,6 @@ define( | @@ -48,7 +51,6 @@ define( | ||
48 | try { | 51 | try { |
49 | if (response.success) { | 52 | if (response.success) { |
50 | var imgUrl = response.tmpUrl; | 53 | var imgUrl = response.tmpUrl; |
51 | - | ||
52 | $$('<li class="upload-li up-img"><div data="' + response.tmpFile + '" data-url="' + imgUrl + '" class="upload-item" style="background-image:url(' + response.tmpMinUrl + ')">' + '</div><span class="del-img"></span></li>').insertBefore(uploadParent); | 54 | $$('<li class="upload-li up-img"><div data="' + response.tmpFile + '" data-url="' + imgUrl + '" class="upload-item" style="background-image:url(' + response.tmpMinUrl + ')">' + '</div><span class="del-img"></span></li>').insertBefore(uploadParent); |
53 | if (me.imgLimit == $$('#submit #image-list').find('.up-img').length) { | 55 | if (me.imgLimit == $$('#submit #image-list').find('.up-img').length) { |
54 | $$('#submit .upload-btn-li').hide(); | 56 | $$('#submit .upload-btn-li').hide(); |
@@ -133,7 +135,7 @@ define( | @@ -133,7 +135,7 @@ define( | ||
133 | utils.toast({content:message}); | 135 | utils.toast({content:message}); |
134 | return false; | 136 | return false; |
135 | } else { | 137 | } else { |
136 | - window.location.href = url.to('/'); | 138 | + window.location.replace(url.to('order#order-details/'+res.orderId)); |
137 | } | 139 | } |
138 | }, true); | 140 | }, true); |
139 | 141 | ||
@@ -152,6 +154,179 @@ define( | @@ -152,6 +154,179 @@ define( | ||
152 | 154 | ||
153 | return returnImg; | 155 | return returnImg; |
154 | } | 156 | } |
157 | + ctrl.selectDateEvent = function() { | ||
158 | + var me = this | ||
159 | + $$('#submit .finish-date-input').click(function(e) { | ||
160 | + var cData = $$(this).val(); | ||
161 | + console.log(cData) | ||
162 | + me.dateTimeSelector('#submit .finish-date-input', cData); | ||
163 | + }) | ||
164 | + } | ||
165 | + ctrl.dateTimeSelector = function(dateId, cData) { | ||
166 | + var me = this; | ||
167 | + var curDay = new Date(); | ||
168 | + var maxDays = 30; | ||
169 | + var yearDefaultSelect = curDay.getFullYear(); | ||
170 | + var monthDefaultSelect = curDay.getMonth(); | ||
171 | + var dateDefaultSelect = curDay.getDate(); | ||
172 | + var hoursSelect = curDay.getHours(); | ||
173 | + var cDateFormat = yearDefaultSelect + '-' + (monthDefaultSelect+1) + '-' +dateDefaultSelect; | ||
174 | + if ('' != cData && null != cData && undefined !== cData) { | ||
175 | + var cD = cData.split(' ') | ||
176 | + cDateFormat = cD[0]; | ||
177 | + hoursSelect = cD[1]; | ||
178 | + } | ||
179 | + | ||
180 | + //console.log(cDateFormat) | ||
181 | + //console.log(hoursSelect) | ||
182 | + var sDays = []; | ||
183 | + for( i= 0; i<= maxDays; i++){ | ||
184 | + var thisDay = new Date(); | ||
185 | + thisDay.setDate(curDay.getDate()+i); | ||
186 | + var setD = thisDay.getFullYear()+'-'+(thisDay.getMonth()+1)+'-'+thisDay.getDate(); | ||
187 | + sDays.push(setD); | ||
188 | + } | ||
189 | + | ||
190 | + var pickerInline = me.app.picker({ | ||
191 | + input : dateId, | ||
192 | + toolbarTemplate : | ||
193 | + '<div class="toolbar">' + | ||
194 | + '<div class="toolbar-inner">' + | ||
195 | + '<div class="left">' + | ||
196 | + '请选择用工时间' + | ||
197 | + '</div>' + | ||
198 | + '<div class="right">' + | ||
199 | + '<a href="javascript:void(0);" class="link submit-confirm-picker">确定</a>' + | ||
200 | + '</div>' + | ||
201 | + '</div>' + | ||
202 | + '</div>', | ||
203 | + | ||
204 | + value : [ cDateFormat, hoursSelect], | ||
205 | + | ||
206 | + onChange: function (picker, values, displayValues) { | ||
207 | + | ||
208 | + var year,month,date; | ||
209 | + if(values[0] instanceof Date){ | ||
210 | + year = values[0].getFullYear(); | ||
211 | + month = (values[0].getMonth()); | ||
212 | + date = values[0].getDate(); | ||
213 | + }else{ | ||
214 | + var cD = values[0].split('-'); | ||
215 | + year = cD[0]; | ||
216 | + month = cD[1] - 1; | ||
217 | + date = cD[2]; | ||
218 | + } | ||
219 | + | ||
220 | + var selectedDay = new Date(year, month, date, values[1], 0); | ||
221 | + var cDate = new Date(new Date().getTime() + 60 * 60 * 1000); //1小时后 | ||
222 | + | ||
223 | + if (selectedDay < cDate) { | ||
224 | + | ||
225 | + if(undefined === picker.cols[0]) { | ||
226 | + return false; | ||
227 | + } | ||
228 | + var setHours = cDate.getHours(); | ||
229 | + var myDate = cDate.getFullYear() + '-' + (cDate.getMonth()+1) + '-' + cDate.getDate(); | ||
230 | + | ||
231 | + var nextHoursDate = new Date(cDate.getFullYear(), cDate.getMonth(), cDate.getDate(), cDate.getHours(), 0); | ||
232 | + // 还有15分钟就下一个小时的 | ||
233 | + if ((nextHoursDate - (new Date())) < 15 * 60 *1000 ) { | ||
234 | + var nextNextHoursDate = new Date(nextHoursDate.getTime() + 60 * 60 * 1000); | ||
235 | + setHours = nextNextHoursDate.getHours(); | ||
236 | + myDate = nextNextHoursDate.getFullYear() + '-' + (nextNextHoursDate.getMonth()+1) + '-' + nextNextHoursDate.getDate(); | ||
237 | + } | ||
238 | + | ||
239 | + picker.cols[0].setValue(myDate); | ||
240 | + picker.cols[2].setValue(setHours); | ||
241 | + } | ||
242 | + }, | ||
243 | + | ||
244 | + formatValue: function (picker, values, displayValues) { | ||
245 | + var date =''; | ||
246 | + if (values[0] instanceof Date) { | ||
247 | + date = values[0].getFullYear()+'-'+ (values[0].getMonth()+1) +'-'+values[0].getDate(); | ||
248 | + } else { | ||
249 | + date = values[0]; | ||
250 | + } | ||
251 | + | ||
252 | + var rd = date + " " + values[1];// +':'+values[2] | ||
253 | + return rd | ||
254 | + }, | ||
255 | + | ||
256 | + cols: [ | ||
257 | + // Years | ||
258 | + { | ||
259 | + values: sDays, | ||
260 | + displayValues:(function(){ | ||
261 | + var arr = []; | ||
262 | + var date = new Date(); | ||
263 | + var todayYear = date.getFullYear(); | ||
264 | + var todayMonth = date.getMonth() +1; | ||
265 | + var todayDate = date.getDate(); | ||
266 | + date.setDate(date.getDate() + 1); | ||
267 | + for (var i = 0; i < sDays.length; i++) { | ||
268 | + var gd = sDays[i]; | ||
269 | + var d = gd.split('-'); | ||
270 | + var pushDate = d[1]+'月'+d[2]+'日'; | ||
271 | + if(todayYear == d[0] && (todayMonth * 1) == d[1] && (todayDate * 1) == d[2]){ | ||
272 | + pushDate = pushDate + '(今天)'; | ||
273 | + } | ||
274 | + if((date.getFullYear() *1) == d[0] && ((date.getMonth() *1)+1) == d[1] && (date.getDate() *1) == d[2]){ | ||
275 | + pushDate = pushDate + '(明天)'; | ||
276 | + } | ||
277 | + arr.push(pushDate); | ||
278 | + } | ||
279 | + return arr; | ||
280 | + })() | ||
281 | + }, | ||
282 | + // Space divider | ||
283 | + { | ||
284 | + divider: true, | ||
285 | + content: ' ' | ||
286 | + }, | ||
287 | + // Hours | ||
288 | + { | ||
289 | + values: (function () { | ||
290 | + var arr = []; | ||
291 | + for (var i = 0; i <= 23; i++) { arr.push(i); } | ||
292 | + return arr; | ||
293 | + })(), | ||
294 | + displayValues:(function(){ | ||
295 | + var arr = []; | ||
296 | + for (var i = 0; i <= 23; i++) { arr.push(i < 10 ? '0' + i+ '时' : i+'时'); } | ||
297 | + return arr; | ||
298 | + })() | ||
299 | + }, | ||
300 | + // Space divider | ||
301 | + { | ||
302 | + divider: true, | ||
303 | + content: ' ' | ||
304 | + }, | ||
305 | + ], | ||
306 | + onClose : function(e) { | ||
307 | + if(pickerInline) { | ||
308 | + // 设置年月日 | ||
309 | + var values = pickerInline.value; | ||
310 | + var hourStr = values[1] < 10 ? "0"+values[1] : values[1]; | ||
311 | + finishTime = values[0]+' '+hourStr; | ||
312 | + $$(dateId).val(finishTime); | ||
313 | + | ||
314 | + pickerInline.destroy(); | ||
315 | + } | ||
316 | + } | ||
317 | + }); | ||
318 | + pickerInline.open(); | ||
319 | + $$('.submit-confirm-picker').on('click', function(e){ | ||
320 | + e.preventDefault(); | ||
321 | + // 设置年月日 | ||
322 | + var values = pickerInline.value; | ||
323 | + var hourStr = values[1] < 10 ? "0"+values[1] : values[1]; | ||
324 | + finishTime = values[0]+' '+hourStr; //+':'+minStr | ||
325 | + $$(dateId).val(finishTime); | ||
326 | + | ||
327 | + pickerInline.destroy(); | ||
328 | + }); | ||
329 | + } | ||
155 | return ctrl; | 330 | return ctrl; |
156 | } | 331 | } |
157 | ); | 332 | ); |
web/src/js/user/login-controller.js
@@ -23,6 +23,10 @@ define( | @@ -23,6 +23,10 @@ define( | ||
23 | var me = this; | 23 | var me = this; |
24 | me.setPageTitle("登录"); | 24 | me.setPageTitle("登录"); |
25 | me.codeDuration = 60; | 25 | me.codeDuration = 60; |
26 | + if (!isGuest) { | ||
27 | + window.location.href = url.to('order/#index'); | ||
28 | + return ''; | ||
29 | + } | ||
26 | me.render(); | 30 | me.render(); |
27 | } | 31 | } |
28 | ctrl.bindEvents = function () { | 32 | ctrl.bindEvents = function () { |
@@ -36,18 +40,30 @@ define( | @@ -36,18 +40,30 @@ define( | ||
36 | ctrl.getCodeEvent = function() { | 40 | ctrl.getCodeEvent = function() { |
37 | var me = this; | 41 | var me = this; |
38 | $$('#login .get-code-cls').click(function() { | 42 | $$('#login .get-code-cls').click(function() { |
43 | + var mobile = utils.trim($$('#login .mobile').val()); | ||
44 | + if ('' == mobile) { | ||
45 | + utils.toast({content:'手机号码必填'}) | ||
46 | + return false; | ||
47 | + } | ||
48 | + if (!utils.isMobile(mobile)) { | ||
49 | + utils.toast({content:'手机号码不合格'}) | ||
50 | + return false; | ||
51 | + } | ||
39 | if (false == clickGetCode) { | 52 | if (false == clickGetCode) { |
40 | return false; | 53 | return false; |
41 | } | 54 | } |
42 | clearInterval(tt); | 55 | clearInterval(tt); |
43 | clickGetCode = false; | 56 | clickGetCode = false; |
44 | - var pData = me.csrf({action:'login'}) | 57 | + var pData = me.csrf({action:'login', mobile:mobile}) |
45 | utils.httpGet(url.to(getCodeURL), pData, function(res) { | 58 | utils.httpGet(url.to(getCodeURL), pData, function(res) { |
46 | if (!res.success) { | 59 | if (!res.success) { |
47 | utils.toast({content:res.message,closeDelay:3000}) | 60 | utils.toast({content:res.message,closeDelay:3000}) |
48 | clickGetCode = true; | 61 | clickGetCode = true; |
49 | return false; | 62 | return false; |
50 | } | 63 | } |
64 | + if(res.testCode) { | ||
65 | + $$('#login .code').val(res.testCode); | ||
66 | + } | ||
51 | var codeDuration = res.codeDuration | 67 | var codeDuration = res.codeDuration |
52 | me.codeDuration = codeDuration; | 68 | me.codeDuration = codeDuration; |
53 | tt = setInterval(function(e) { | 69 | tt = setInterval(function(e) { |
@@ -90,13 +106,12 @@ define( | @@ -90,13 +106,12 @@ define( | ||
90 | loginClick = false; | 106 | loginClick = false; |
91 | var pData = me.csrf({mobile:mobile,code:code}) | 107 | var pData = me.csrf({mobile:mobile,code:code}) |
92 | utils.httpPost(url.to(loginURL),pData, function(res) { | 108 | utils.httpPost(url.to(loginURL),pData, function(res) { |
109 | + loginClick = true; | ||
93 | if (!res.success) { | 110 | if (!res.success) { |
94 | utils.toast({content:res.message,closeDelay:3000}) | 111 | utils.toast({content:res.message,closeDelay:3000}) |
95 | - loginClick = true; | ||
96 | return false; | 112 | return false; |
97 | } else { | 113 | } else { |
98 | - loginClick = true; | ||
99 | - window.location.href = url.to('/'); | 114 | + window.location.href = url.to('order/#index'); |
100 | } | 115 | } |
101 | }) | 116 | }) |
102 | }) | 117 | }) |
web/src/js/user/register-controller.js
@@ -28,6 +28,10 @@ define( | @@ -28,6 +28,10 @@ define( | ||
28 | me.setPageTitle("注册"); | 28 | me.setPageTitle("注册"); |
29 | //me.hideAllNonBaseMenuItem(window.$site); | 29 | //me.hideAllNonBaseMenuItem(window.$site); |
30 | me.codeDuration = 60; | 30 | me.codeDuration = 60; |
31 | + if (!isGuest) { | ||
32 | + window.location.href = url.to('order/#index'); | ||
33 | + return ''; | ||
34 | + } | ||
31 | me.render(); | 35 | me.render(); |
32 | } | 36 | } |
33 | ctrl.bindEvents = function () { | 37 | ctrl.bindEvents = function () { |
@@ -71,18 +75,31 @@ define( | @@ -71,18 +75,31 @@ define( | ||
71 | ctrl.getCodeEvent = function() { | 75 | ctrl.getCodeEvent = function() { |
72 | var me = this; | 76 | var me = this; |
73 | $$('#register .get-code-cls').click(function() { | 77 | $$('#register .get-code-cls').click(function() { |
78 | + var mobile = utils.trim($$('#register .mobile').val()); | ||
79 | + if ('' == mobile) { | ||
80 | + utils.toast({content:'手机号码必填'}) | ||
81 | + return false; | ||
82 | + } | ||
83 | + if (!utils.isMobile(mobile)) { | ||
84 | + utils.toast({content:'手机号码不合格'}) | ||
85 | + return false; | ||
86 | + } | ||
74 | if (false == clickGetCode) { | 87 | if (false == clickGetCode) { |
75 | return false; | 88 | return false; |
76 | } | 89 | } |
77 | clearInterval(tt); | 90 | clearInterval(tt); |
78 | clickGetCode = false; | 91 | clickGetCode = false; |
79 | - var pData = me.csrf({action:'register'}) | 92 | + |
93 | + var pData = me.csrf({action:'register', mobile:mobile}) | ||
80 | utils.httpGet(url.to(getCodeURL), pData, function(res) { | 94 | utils.httpGet(url.to(getCodeURL), pData, function(res) { |
81 | if (!res.success) { | 95 | if (!res.success) { |
82 | utils.toast({content:res.message,closeDelay:3000}) | 96 | utils.toast({content:res.message,closeDelay:3000}) |
83 | clickGetCode = true; | 97 | clickGetCode = true; |
84 | return false; | 98 | return false; |
85 | } | 99 | } |
100 | + if(res.testCode) { | ||
101 | + $$('#register .code').val(res.testCode); | ||
102 | + } | ||
86 | var codeDuration = res.codeDuration | 103 | var codeDuration = res.codeDuration |
87 | me.codeDuration = codeDuration; | 104 | me.codeDuration = codeDuration; |
88 | tt = setInterval(function(e) { | 105 | tt = setInterval(function(e) { |
@@ -122,8 +139,8 @@ define( | @@ -122,8 +139,8 @@ define( | ||
122 | return false; | 139 | return false; |
123 | } | 140 | } |
124 | 141 | ||
125 | - var imgURL = $$('#register .upload-btn-cls').attr('data'); | ||
126 | - if (undefined === imgURL || null == imgURL) { | 142 | + var licensePic = $$('#register .licensePic').attr('data'); |
143 | + if (undefined === licensePic || null == licensePic) { | ||
127 | utils.toast({content:'请上传营业执照'}) | 144 | utils.toast({content:'请上传营业执照'}) |
128 | return false; | 145 | return false; |
129 | } | 146 | } |
@@ -131,14 +148,14 @@ define( | @@ -131,14 +148,14 @@ define( | ||
131 | return false; | 148 | return false; |
132 | } | 149 | } |
133 | registerClick = false; | 150 | registerClick = false; |
134 | - var pData = me.csrf({name:name, mobile:mobile,code:code,img:imgURL}) | 151 | + var pData = me.csrf({name:name, mobile:mobile,code:code,licensePic:licensePic}) |
135 | utils.httpPost(url.to(registerUrl),pData, function(res) { | 152 | utils.httpPost(url.to(registerUrl),pData, function(res) { |
136 | if (!res.success) { | 153 | if (!res.success) { |
137 | utils.toast({content:res.message,closeDelay:3000}) | 154 | utils.toast({content:res.message,closeDelay:3000}) |
138 | registerClick = true; | 155 | registerClick = true; |
139 | return false; | 156 | return false; |
140 | } else { | 157 | } else { |
141 | - window.location.href = url.to('/'); | 158 | + window.location.href = url.to('order/#index'); |
142 | } | 159 | } |
143 | }) | 160 | }) |
144 | }) | 161 | }) |