|
|
@@ -4,14 +4,16 @@ namespace app\index\controller;
|
|
|
|
|
|
use app\common\controller\Frontend;
|
|
|
use think\Cache;
|
|
|
+use think\captcha\Captcha;
|
|
|
use think\Config;
|
|
|
use think\Cookie;
|
|
|
use think\Db;
|
|
|
use think\Session;
|
|
|
+use think\Validate;
|
|
|
|
|
|
/**
|
|
|
* 手机端:外发明细(purchase_order_detail)验证码 / 账号密码登录 + 列表
|
|
|
- * 普通用户:customer_user(手机号验证码 或 账号密码);管理员:admin 表账号密码(看全部、仅查看)
|
|
|
+ * 普通用户:customer 表(手机号验证码 或 登录账号+密码);管理员:admin 表账号密码(看全部、仅查看)
|
|
|
*/
|
|
|
class Index extends Frontend
|
|
|
{
|
|
|
@@ -59,7 +61,7 @@ class Index extends Frontend
|
|
|
return null;
|
|
|
}
|
|
|
// 手机登录必有 phone;账号密码登录必有 username
|
|
|
- if (empty($user['phone']) && empty($user['username'])) {
|
|
|
+ if (empty($user['phone']) && empty($user['account']) && empty($user['username'])) {
|
|
|
return null;
|
|
|
}
|
|
|
if (time() - (int)($user['login_time'] ?? 0) > $this->mprocTtlSeconds) {
|
|
|
@@ -259,11 +261,15 @@ class Index extends Frontend
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * customer_user 是否允许登录(status:1 / 正常)
|
|
|
+ * customer 是否允许登录(status:1 / 正常;空视为可登录以兼容旧数据)
|
|
|
*/
|
|
|
protected function mprocCustomerUserActive(array $row): bool
|
|
|
{
|
|
|
$st = $row['status'] ?? '';
|
|
|
+ if ($st === '' || $st === null) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
return $st === 1 || $st === '1';
|
|
|
}
|
|
|
|
|
|
@@ -272,23 +278,12 @@ class Index extends Frontend
|
|
|
*/
|
|
|
protected function mprocFindCustomerUserByMobile(string $phone): ?array
|
|
|
{
|
|
|
- $phone = trim($phone);
|
|
|
- if ($phone === '' || !preg_match('/^1\d{10}$/', $phone)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- try {
|
|
|
- $row = Db::table('customer_user')->where('mobile', $phone)->order('id', 'asc')->find();
|
|
|
- } catch (\Throwable $e) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- if (!is_array($row) || $row === [] || !$this->mprocCustomerUserActive($row)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- return $row;
|
|
|
+ return $this->mprocFindCustomerRowByPhone($phone);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 按登录账号(account)查找 customer;兼容旧会话把 11 位手机号写在 username 里
|
|
|
+ *
|
|
|
* @return array<string, mixed>|null
|
|
|
*/
|
|
|
protected function mprocFindCustomerUserByUsername(string $username): ?array
|
|
|
@@ -298,9 +293,12 @@ class Index extends Frontend
|
|
|
return null;
|
|
|
}
|
|
|
try {
|
|
|
- $row = Db::table('customer_user')->where('username', $username)->order('id', 'asc')->find();
|
|
|
+ $row = Db::table('customer')->where('account', $username)->order('id', 'asc')->find();
|
|
|
} catch (\Throwable $e) {
|
|
|
- return null;
|
|
|
+ $row = null;
|
|
|
+ }
|
|
|
+ if ((!is_array($row) || $row === []) && preg_match('/^1\d{10}$/', $username)) {
|
|
|
+ $row = $this->mprocFindCustomerRowByPhone($username);
|
|
|
}
|
|
|
if (!is_array($row) || $row === [] || !$this->mprocCustomerUserActive($row)) {
|
|
|
return null;
|
|
|
@@ -310,7 +308,7 @@ class Index extends Frontend
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * customer_user 密码校验(兼容 md5(md5+salt)、md5(md5) 无 salt)
|
|
|
+ * customer 密码校验(md5(md5) 无 salt;兼容 bcrypt)
|
|
|
*/
|
|
|
protected function mprocVerifyCustomerUserPassword(array $row, string $password): bool
|
|
|
{
|
|
|
@@ -321,18 +319,50 @@ class Index extends Frontend
|
|
|
if (preg_match('/^\$2[ayb]\$/', $stored)) {
|
|
|
return password_verify($password, $stored);
|
|
|
}
|
|
|
- $salt = (string)($row['salt'] ?? '');
|
|
|
- $hash = md5(md5($password) . $salt);
|
|
|
|
|
|
- return hash_equals($stored, $hash) || ($salt === '' && hash_equals($stored, md5(md5($password))));
|
|
|
+ return hash_equals($stored, md5(md5($password)));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 生成 customer_user 登录密码密文(与校验规则一致,保留原 salt)
|
|
|
+ * 生成 customer 登录密码密文
|
|
|
*/
|
|
|
protected function mprocHashCustomerUserPassword(string $password, string $existingSalt = ''): string
|
|
|
{
|
|
|
- return md5(md5($password) . $existingSalt);
|
|
|
+ unset($existingSalt);
|
|
|
+
|
|
|
+ return md5(md5($password));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param array<string, mixed> $cu
|
|
|
+ * @return array<string, mixed>
|
|
|
+ */
|
|
|
+ protected function mprocLoginPayloadFromCustomer(array $cu, string $loginType): array
|
|
|
+ {
|
|
|
+ $phone = trim((string)($cu['phone'] ?? ''));
|
|
|
+ $account = trim((string)($cu['account'] ?? ''));
|
|
|
+ if ($phone === '' && preg_match('/^1\d{10}$/', $account)) {
|
|
|
+ $phone = $account;
|
|
|
+ }
|
|
|
+ if ($account === '' && preg_match('/^1\d{10}$/', $phone)) {
|
|
|
+ $account = $phone;
|
|
|
+ }
|
|
|
+ $companyName = trim((string)($cu['company_name'] ?? ''));
|
|
|
+ if ($companyName === '' && $phone !== '') {
|
|
|
+ $companyName = $this->mprocResolveCompanyForLoginPhone($phone);
|
|
|
+ }
|
|
|
+ $id = (int)($cu['id'] ?? 0);
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'phone' => $phone,
|
|
|
+ 'account' => $account,
|
|
|
+ 'company_name' => $companyName,
|
|
|
+ 'username' => trim((string)($cu['username'] ?? '')),
|
|
|
+ 'customer_id' => $id,
|
|
|
+ 'customer_user_id' => $id,
|
|
|
+ 'login_type' => $loginType,
|
|
|
+ 'is_admin' => 0,
|
|
|
+ ];
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -361,7 +391,7 @@ class Index extends Frontend
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 登录手机号对应的外协单位名称:优先 customer_user;再 customer 表;否则 purchase_order_detail
|
|
|
+ * 登录手机号对应的外协单位名称:customer 表;否则 purchase_order_detail
|
|
|
*/
|
|
|
protected function mprocResolveCompanyForLoginPhone(string $phone): string
|
|
|
{
|
|
|
@@ -369,13 +399,6 @@ class Index extends Frontend
|
|
|
if ($phone === '' || !preg_match('/^1\d{10}$/', $phone)) {
|
|
|
return '';
|
|
|
}
|
|
|
- $cu = $this->mprocFindCustomerUserByMobile($phone);
|
|
|
- if (is_array($cu) && $cu !== []) {
|
|
|
- $co = trim((string)($cu['company_name'] ?? ''));
|
|
|
- if ($co !== '') {
|
|
|
- return $co;
|
|
|
- }
|
|
|
- }
|
|
|
$cust = $this->mprocFindCustomerRowByPhone($phone);
|
|
|
if (is_array($cust) && $cust !== []) {
|
|
|
$co = $this->mprocCustomerPickField($cust, ['company_name', 'name']);
|
|
|
@@ -400,7 +423,7 @@ class Index extends Frontend
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 仅按手机号在 customer.phone(多号逗号分隔)中匹配一条客户记录
|
|
|
+ * 按手机号匹配 customer(phone 或 account 单值相等)
|
|
|
*
|
|
|
* @return array<string, mixed>|null
|
|
|
*/
|
|
|
@@ -411,26 +434,20 @@ class Index extends Frontend
|
|
|
return null;
|
|
|
}
|
|
|
try {
|
|
|
- $rows = Db::table('customer')->where('phone', '<>', '')->select();
|
|
|
+ $row = Db::table('customer')
|
|
|
+ ->where(function ($q) use ($phone) {
|
|
|
+ $q->where('phone', $phone)->whereOr('account', $phone);
|
|
|
+ })
|
|
|
+ ->order('id', 'asc')
|
|
|
+ ->find();
|
|
|
} catch (\Throwable $e) {
|
|
|
return null;
|
|
|
}
|
|
|
- if (!is_array($rows)) {
|
|
|
+ if (!is_array($row) || $row === [] || !$this->mprocCustomerUserActive($row)) {
|
|
|
return null;
|
|
|
}
|
|
|
- foreach ($rows as $r) {
|
|
|
- if (!is_array($r)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- $raw = (string)($r['phone'] ?? '');
|
|
|
- $raw = str_replace(["\r", "\n", "\t", ' ', ' ', ','], ['', '', '', '', '', ','], $raw);
|
|
|
- foreach (explode(',', $raw) as $seg) {
|
|
|
- if (trim($seg) === $phone) {
|
|
|
- return $r;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return null;
|
|
|
+
|
|
|
+ return $row;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -457,13 +474,16 @@ class Index extends Frontend
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 在 customer 表中匹配当前用户:优先手机号(支持多号逗号分隔),否则按公司名与 company_name / name
|
|
|
+ * 在 customer 表中匹配当前用户:优先手机号,否则按公司名
|
|
|
*
|
|
|
* @return array<string, mixed>|null
|
|
|
*/
|
|
|
protected function mprocFindCustomerRowForUser(array $user): ?array
|
|
|
{
|
|
|
$phone = trim((string)($user['phone'] ?? ''));
|
|
|
+ if ($phone === '') {
|
|
|
+ $phone = trim((string)($user['account'] ?? ''));
|
|
|
+ }
|
|
|
$cn = trim((string)($user['company_name'] ?? ''));
|
|
|
if ($phone !== '' && preg_match('/^1\d{10}$/', $phone)) {
|
|
|
$byPhone = $this->mprocFindCustomerRowByPhone($phone);
|
|
|
@@ -620,7 +640,7 @@ class Index extends Frontend
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 按登录态解析 customer_user 行(id / 用户名 / 手机号)
|
|
|
+ * 按登录态解析 customer 行
|
|
|
*
|
|
|
* @return array<string, mixed>|null
|
|
|
*/
|
|
|
@@ -629,10 +649,10 @@ class Index extends Frontend
|
|
|
if (!empty($user['is_admin'])) {
|
|
|
return null;
|
|
|
}
|
|
|
- $cuId = (int)($user['customer_user_id'] ?? 0);
|
|
|
+ $cuId = (int)($user['customer_id'] ?? $user['customer_user_id'] ?? 0);
|
|
|
if ($cuId > 0) {
|
|
|
try {
|
|
|
- $row = Db::table('customer_user')->where('id', $cuId)->find();
|
|
|
+ $row = Db::table('customer')->where('id', $cuId)->find();
|
|
|
} catch (\Throwable $e) {
|
|
|
$row = null;
|
|
|
}
|
|
|
@@ -640,38 +660,43 @@ class Index extends Frontend
|
|
|
return $row;
|
|
|
}
|
|
|
}
|
|
|
- $uname = trim((string)($user['username'] ?? ''));
|
|
|
- if ($uname !== '') {
|
|
|
- $byName = $this->mprocFindCustomerUserByUsername($uname);
|
|
|
- if ($byName !== null) {
|
|
|
- return $byName;
|
|
|
+ $account = trim((string)($user['account'] ?? ''));
|
|
|
+ if ($account !== '') {
|
|
|
+ $byAcc = $this->mprocFindCustomerUserByUsername($account);
|
|
|
+ if ($byAcc !== null) {
|
|
|
+ return $byAcc;
|
|
|
}
|
|
|
}
|
|
|
$phone = trim((string)($user['phone'] ?? ''));
|
|
|
if ($phone !== '' && preg_match('/^1\d{10}$/', $phone)) {
|
|
|
return $this->mprocFindCustomerUserByMobile($phone);
|
|
|
}
|
|
|
+ $uname = trim((string)($user['username'] ?? ''));
|
|
|
+ if ($uname !== '' && preg_match('/^1\d{10}$/', $uname)) {
|
|
|
+ return $this->mprocFindCustomerUserByMobile($uname);
|
|
|
+ }
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * customer_user 表字段 →「我的」展示结构
|
|
|
+ * customer 表字段 →「我的」展示结构
|
|
|
*
|
|
|
* @param array<string, mixed> $cu
|
|
|
* @return array{company_name:string,contact_name:string,phone:string,email:string}
|
|
|
*/
|
|
|
protected function mprocProfileFromCustomerUserRow(array $cu): array
|
|
|
{
|
|
|
- $nm = trim((string)($cu['nickname'] ?? ''));
|
|
|
- if ($nm === '') {
|
|
|
- $nm = trim((string)($cu['username'] ?? ''));
|
|
|
+ $nm = trim((string)($cu['username'] ?? ''));
|
|
|
+ $phone = trim((string)($cu['phone'] ?? ''));
|
|
|
+ if ($phone === '') {
|
|
|
+ $phone = trim((string)($cu['account'] ?? ''));
|
|
|
}
|
|
|
|
|
|
return [
|
|
|
'company_name' => trim((string)($cu['company_name'] ?? '')),
|
|
|
'contact_name' => $nm,
|
|
|
- 'phone' => trim((string)($cu['mobile'] ?? '')),
|
|
|
+ 'phone' => $phone,
|
|
|
'email' => trim((string)($cu['email'] ?? '')),
|
|
|
];
|
|
|
}
|
|
|
@@ -718,7 +743,7 @@ class Index extends Frontend
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 旧会话补全 customer_user_id 等字段(登录后改表结构时无需重新登录)
|
|
|
+ * 旧会话补全 customer_id 等字段
|
|
|
*/
|
|
|
protected function mprocSyncSessionCustomerUser(array $user): array
|
|
|
{
|
|
|
@@ -729,10 +754,16 @@ class Index extends Frontend
|
|
|
if (!$cu) {
|
|
|
return $user;
|
|
|
}
|
|
|
- $user['customer_user_id'] = (int)($cu['id'] ?? 0);
|
|
|
+ $id = (int)($cu['id'] ?? 0);
|
|
|
+ $user['customer_id'] = $id;
|
|
|
+ $user['customer_user_id'] = $id;
|
|
|
$user['username'] = trim((string)($cu['username'] ?? $user['username'] ?? ''));
|
|
|
$user['company_name'] = trim((string)($cu['company_name'] ?? ''));
|
|
|
- $mob = trim((string)($cu['mobile'] ?? ''));
|
|
|
+ $user['account'] = trim((string)($cu['account'] ?? ''));
|
|
|
+ $mob = trim((string)($cu['phone'] ?? ''));
|
|
|
+ if ($mob === '') {
|
|
|
+ $mob = trim((string)($cu['account'] ?? ''));
|
|
|
+ }
|
|
|
if ($mob !== '') {
|
|
|
$user['phone'] = $mob;
|
|
|
}
|
|
|
@@ -746,7 +777,7 @@ class Index extends Frontend
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 「我的」:普通用户仅 customer_user;管理员仅 admin
|
|
|
+ * 「我的」:普通用户 customer;管理员 admin
|
|
|
*/
|
|
|
protected function mprocProfileForUser(array $user)
|
|
|
{
|
|
|
@@ -758,10 +789,15 @@ class Index extends Frontend
|
|
|
return $this->mprocProfileFromCustomerUserRow($cu);
|
|
|
}
|
|
|
|
|
|
+ $phone = trim((string)($user['phone'] ?? ''));
|
|
|
+ if ($phone === '') {
|
|
|
+ $phone = trim((string)($user['account'] ?? ''));
|
|
|
+ }
|
|
|
+
|
|
|
return [
|
|
|
'company_name' => trim((string)($user['company_name'] ?? '')),
|
|
|
'contact_name' => trim((string)($user['username'] ?? '')),
|
|
|
- 'phone' => trim((string)($user['phone'] ?? '')),
|
|
|
+ 'phone' => $phone,
|
|
|
'email' => '',
|
|
|
];
|
|
|
}
|
|
|
@@ -980,7 +1016,8 @@ class Index extends Frontend
|
|
|
$this->view->assign('mprocSearchQ', $q);
|
|
|
$this->view->assign('mprocProfile', $profile);
|
|
|
$this->view->assign('mprocIsAdmin', !empty($user['is_admin']) ? 1 : 0);
|
|
|
- $this->view->assign('mprocCanChangePwd', empty($user['is_admin']) && (int)($user['customer_user_id'] ?? 0) > 0 ? 1 : 0);
|
|
|
+ $cid = (int)($user['customer_id'] ?? $user['customer_user_id'] ?? 0);
|
|
|
+ $this->view->assign('mprocCanChangePwd', empty($user['is_admin']) && $cid > 0 ? 1 : 0);
|
|
|
$this->view->assign('mprocFocusEid', $mprocFocusEid);
|
|
|
|
|
|
if ($mainTab === 'me') {
|
|
|
@@ -1053,12 +1090,24 @@ class Index extends Frontend
|
|
|
Session::set('mproc_intended_url', $redirect);
|
|
|
}
|
|
|
$this->view->assign('mprocLoginRedirect', $redirect);
|
|
|
+ $this->view->assign('mprocCaptchaUrl', url('index/index/captcha'));
|
|
|
+ $this->view->assign('mprocCaptchaLen', (int)(Config::get('captcha.length') ?: 4));
|
|
|
|
|
|
return $this->view->fetch();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 发送登录验证码(POST:phone)
|
|
|
+ * 图形验证码(手机号登录用)
|
|
|
+ */
|
|
|
+ public function captcha($id = '')
|
|
|
+ {
|
|
|
+ $captcha = new Captcha((array)Config::get('captcha'));
|
|
|
+
|
|
|
+ return $captcha->entry($id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发送登录验证码(POST:phone、captcha)
|
|
|
*/
|
|
|
public function sendSms()
|
|
|
{
|
|
|
@@ -1066,6 +1115,13 @@ class Index extends Frontend
|
|
|
$this->error('请使用 POST');
|
|
|
}
|
|
|
$phone = trim((string)$this->request->post('phone', ''));
|
|
|
+ $captcha = trim((string)$this->request->post('captcha', ''));
|
|
|
+ if ($captcha === '') {
|
|
|
+ $this->error('请输入图形验证码');
|
|
|
+ }
|
|
|
+ if (!Validate::is($captcha, 'captcha')) {
|
|
|
+ $this->error('图形验证码不正确');
|
|
|
+ }
|
|
|
if (!preg_match('/^1\d{10}$/', $phone)) {
|
|
|
$this->error('请输入正确的11位手机号');
|
|
|
}
|
|
|
@@ -1124,24 +1180,13 @@ class Index extends Frontend
|
|
|
if (!$cu) {
|
|
|
$this->error('该手机号未开通或已禁用,请联系管理员');
|
|
|
}
|
|
|
- $companyName = trim((string)($cu['company_name'] ?? ''));
|
|
|
- if ($companyName === '') {
|
|
|
- $companyName = $this->mprocResolveCompanyForLoginPhone($phone);
|
|
|
- }
|
|
|
|
|
|
- $this->mprocFinishLogin([
|
|
|
- 'phone' => $phone,
|
|
|
- 'company_name' => $companyName,
|
|
|
- 'username' => trim((string)($cu['username'] ?? '')),
|
|
|
- 'customer_user_id' => (int)($cu['id'] ?? 0),
|
|
|
- 'login_type' => 'sms',
|
|
|
- 'is_admin' => 0,
|
|
|
- ]);
|
|
|
+ $this->mprocFinishLogin($this->mprocLoginPayloadFromCustomer($cu, 'sms'));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 账号密码登录(POST:username、password)
|
|
|
- * 先 customer_user(普通用户),未命中再 admin(管理员);admin 密码规则同 FastAdmin Auth::login
|
|
|
+ * 先 customer(account),未命中再 admin;admin 密码规则同 FastAdmin Auth::login
|
|
|
*/
|
|
|
public function doLoginPwd()
|
|
|
{
|
|
|
@@ -1159,19 +1204,7 @@ class Index extends Frontend
|
|
|
if (!$this->mprocVerifyCustomerUserPassword($cu, $password)) {
|
|
|
$this->error('账号或密码错误');
|
|
|
}
|
|
|
- $phone = trim((string)($cu['mobile'] ?? ''));
|
|
|
- $companyName = trim((string)($cu['company_name'] ?? ''));
|
|
|
- if ($companyName === '' && $phone !== '' && preg_match('/^1\d{10}$/', $phone)) {
|
|
|
- $companyName = $this->mprocResolveCompanyForLoginPhone($phone);
|
|
|
- }
|
|
|
- $this->mprocFinishLogin([
|
|
|
- 'phone' => $phone,
|
|
|
- 'company_name' => $companyName,
|
|
|
- 'username' => trim((string)($cu['username'] ?? '')),
|
|
|
- 'customer_user_id' => (int)($cu['id'] ?? 0),
|
|
|
- 'login_type' => 'pwd',
|
|
|
- 'is_admin' => 0,
|
|
|
- ]);
|
|
|
+ $this->mprocFinishLogin($this->mprocLoginPayloadFromCustomer($cu, 'pwd'));
|
|
|
}
|
|
|
|
|
|
// 管理员:表 admin
|
|
|
@@ -1233,7 +1266,7 @@ class Index extends Frontend
|
|
|
|
|
|
/**
|
|
|
* 是否允许当前登录用户修改该条 purchase_order_detail 的金额、交期
|
|
|
- * 仅普通用户(customer_user)可改;管理员(admin 账号密码)仅可查看
|
|
|
+ * 仅普通用户(customer)可改;管理员(admin)仅可查看
|
|
|
*/
|
|
|
protected function mprocCanEditRow(array $user, array $row)
|
|
|
{
|
|
|
@@ -1407,13 +1440,12 @@ class Index extends Frontend
|
|
|
if (!$this->mprocVerifyCustomerUserPassword($cu, $oldPwd)) {
|
|
|
$this->error('原密码不正确');
|
|
|
}
|
|
|
- $salt = (string)($cu['salt'] ?? '');
|
|
|
$data = [
|
|
|
- 'password' => $this->mprocHashCustomerUserPassword($newPwd, $salt),
|
|
|
+ 'password' => $this->mprocHashCustomerUserPassword($newPwd),
|
|
|
'updatetime' => date('Y-m-d H:i:s'),
|
|
|
];
|
|
|
try {
|
|
|
- Db::table('customer_user')->where('id', $cuId)->update($data);
|
|
|
+ Db::table('customer')->where('id', $cuId)->update($data);
|
|
|
} catch (\Throwable $e) {
|
|
|
$this->error('修改失败:' . $e->getMessage());
|
|
|
}
|