SystemConfigServices.php 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\services\system\config;
  12. use app\dao\system\config\SystemConfigDao;
  13. use app\services\agent\AgentManageServices;
  14. use app\services\BaseServices;
  15. use crmeb\exceptions\AdminException;
  16. use crmeb\services\FileService;
  17. use crmeb\services\FormBuilder;
  18. use think\exception\ValidateException;
  19. use think\facade\Log;
  20. /**
  21. * 系统配置
  22. * Class SystemConfigServices
  23. * @package app\services\system\config
  24. * @method count(array $where = []) 获取指定条件下的count
  25. * @method save(array $data) 保存数据
  26. * @method get(int $id, ?array $field = []) 获取一条数据
  27. * @method update($id, array $data, ?string $key = null) 修改数据
  28. * @method delete(int $id, ?string $key = null) 删除数据
  29. * @method getUploadTypeList(string $configName) 获取上传配置中的上传类型
  30. */
  31. class SystemConfigServices extends BaseServices
  32. {
  33. /**
  34. * form表单句柄
  35. * @var FormBuilder
  36. */
  37. protected $builder;
  38. /**
  39. * 表单数据切割符号
  40. * @var string
  41. */
  42. protected $cuttingStr = '=>';
  43. /**
  44. * 表单提交url
  45. * @var string[]
  46. */
  47. protected $postUrl = [
  48. 'setting' => [
  49. 'url' => '/setting/config/save_basics',
  50. 'auth' => [],
  51. ],
  52. 'serve' => [
  53. 'url' => '/serve/sms_config/save_basics',
  54. 'auth' => ['short_letter_switch'],
  55. ],
  56. 'freight' => [
  57. 'url' => '/freight/config/save_basics',
  58. 'auth' => ['express'],
  59. ],
  60. 'agent' => [
  61. 'url' => '/agent/config/save_basics',
  62. 'auth' => ['fenxiao'],
  63. ],
  64. 'marketing' => [
  65. 'url' => '/marketing/integral_config/save_basics',
  66. 'auth' => ['point'],
  67. ]
  68. ];
  69. /**
  70. * 子集控制规则
  71. * @var array[]
  72. */
  73. protected $relatedRule = [
  74. 'brokerage_func_status' => [
  75. 'son_type' => [
  76. 'store_brokerage_statu' => [
  77. 'son_type' => ['store_brokerage_price' => ''],
  78. 'show_value' => 3
  79. ],
  80. 'brokerage_bindind' => '',
  81. 'store_brokerage_binding_status' => [
  82. 'son_type' => ['store_brokerage_binding_time' => ''],
  83. 'show_value' => 2
  84. ],
  85. 'spread_banner' => '',
  86. ],
  87. 'show_value' => 1
  88. ],
  89. 'brokerage_user_status' => [
  90. 'son_type' => [
  91. 'uni_brokerage_price' => '',
  92. 'day_brokerage_price_upper' => '',
  93. ],
  94. 'show_value' => 1
  95. ],
  96. 'pay_success_printing_switch' => [
  97. 'son_type' => [
  98. 'develop_id' => '',
  99. 'printing_api_key' => '',
  100. 'printing_client_id' => '',
  101. 'terminal_number' => '',
  102. ],
  103. 'show_value' => 1
  104. ],
  105. 'wss_open' => [
  106. 'son_type' => [
  107. 'wss_local_cert' => '',
  108. 'wss_local_pk' => '',
  109. ],
  110. 'show_value' => 1
  111. ],
  112. 'invoice_func_status' => [
  113. 'son_type' => [
  114. 'special_invoice_status' => '',
  115. ],
  116. 'show_value' => 1
  117. ],
  118. 'member_func_status' => [
  119. 'son_type' => [
  120. 'order_give_exp' => '',
  121. 'sign_give_exp' => '',
  122. 'invite_user_exp' => ''
  123. ],
  124. 'show_value' => 1
  125. ],
  126. 'balance_func_status' => [
  127. 'son_type' => [
  128. 'recharge_attention' => '',
  129. 'recharge_switch' => '',
  130. 'store_user_min_recharge' => '',
  131. ],
  132. 'show_value' => 1
  133. ],
  134. 'system_product_copy_type' => [
  135. 'son_type' => [
  136. 'copy_product_apikey' => '',
  137. ],
  138. 'show_value' => 2
  139. ],
  140. 'logistics_type' => [
  141. 'son_type' => [
  142. 'system_express_app_code' => '',
  143. ],
  144. 'show_value' => 2
  145. ],
  146. 'ali_pay_status' => [
  147. 'son_type' => [
  148. 'ali_pay_appid' => '',
  149. 'alipay_merchant_private_key' => '',
  150. 'alipay_public_key' => '',
  151. ],
  152. 'show_value' => 1
  153. ],
  154. 'pay_weixin_open' => [
  155. 'son_type' => [
  156. 'pay_weixin_mchid' => '',
  157. 'pay_weixin_key' => '',
  158. 'pay_weixin_client_cert' => '',
  159. 'pay_weixin_client_key' => '',
  160. 'paydir' => '',
  161. ],
  162. 'show_value' => 1
  163. ],
  164. 'config_export_open' => [
  165. 'son_type' => [
  166. 'config_export_to_name' => '',
  167. 'config_export_to_tel' => '',
  168. 'config_export_to_address' => '',
  169. 'config_export_siid' => '',
  170. ],
  171. 'show_value' => 1
  172. ],
  173. 'image_watermark_status' => [
  174. 'son_type' => [
  175. 'watermark_type' => [
  176. 'son_type' => [
  177. 'watermark_image' => '',
  178. 'watermark_opacity' => '',
  179. 'watermark_rotate' => '',
  180. ],
  181. 'show_value' => 1
  182. ],
  183. 'watermark_position' => '',
  184. 'watermark_x' => '',
  185. 'watermark_y' => '',
  186. 'watermark_type@' => [
  187. 'son_type' => [
  188. 'watermark_text' => '',
  189. 'watermark_text_size' => '',
  190. 'watermark_text_color' => '',
  191. 'watermark_text_angle' => ''
  192. ],
  193. 'show_value' => 2
  194. ],
  195. ],
  196. 'show_value' => 1
  197. ],
  198. ];
  199. /**
  200. * SystemConfigServices constructor.
  201. * @param SystemConfigDao $dao
  202. */
  203. public function __construct(SystemConfigDao $dao, FormBuilder $builder)
  204. {
  205. $this->dao = $dao;
  206. $this->builder = $builder;
  207. }
  208. public function getSonConfig()
  209. {
  210. $sonConfig = [];
  211. $rolateRule = $this->relatedRule;
  212. if ($rolateRule) {
  213. foreach ($rolateRule as $key => $value) {
  214. $sonConfig = array_merge($sonConfig, array_keys($value['son_type']));
  215. foreach ($value['son_type'] as $k => $v) {
  216. if (isset($v['son_type'])) {
  217. $sonConfig = array_merge($sonConfig, array_keys($v['son_type']));
  218. }
  219. }
  220. }
  221. }
  222. return $sonConfig;
  223. }
  224. /**
  225. * 获取单个系统配置
  226. * @param string $configName
  227. * @param null $default
  228. * @return mixed|null
  229. */
  230. public function getConfigValue(string $configName, $default = null)
  231. {
  232. $value = $this->dao->getConfigValue($configName);
  233. return is_null($value) ? $default : json_decode($value, true);
  234. }
  235. /**
  236. * 获取全部配置
  237. * @param array $configName
  238. * @return array
  239. */
  240. public function getConfigAll(array $configName = [])
  241. {
  242. return array_map(function ($item) {
  243. return json_decode($item, true);
  244. }, $this->dao->getConfigAll($configName));
  245. }
  246. /**
  247. * 获取配置并分页
  248. * @param array $where
  249. * @return array
  250. * @throws \think\db\exception\DataNotFoundException
  251. * @throws \think\db\exception\DbException
  252. * @throws \think\db\exception\ModelNotFoundException
  253. */
  254. public function getConfigList(array $where)
  255. {
  256. [$page, $limit] = $this->getPageValue();
  257. $list = $this->dao->getConfigList($where, $page, $limit);
  258. $count = $this->dao->count($where);
  259. foreach ($list as &$item) {
  260. $item['value'] = $item['value'] ? json_decode($item['value'], true) ?: '' : '';
  261. if ($item['type'] == 'radio' || $item['type'] == 'checkbox') {
  262. $item['value'] = $this->getRadioOrCheckboxValueInfo($item['menu_name'], $item['value']);
  263. }
  264. if ($item['type'] == 'upload' && !empty($item['value'])) {
  265. if ($item['upload_type'] == 1 || $item['upload_type'] == 3) {
  266. $item['value'] = [set_file_url($item['value'])];
  267. } elseif ($item['upload_type'] == 2) {
  268. $item['value'] = set_file_url($item['value']);
  269. }
  270. foreach ($item['value'] as $key => $value) {
  271. $tidy_srr[$key]['filepath'] = $value;
  272. $tidy_srr[$key]['filename'] = basename($value);
  273. }
  274. $item['value'] = $tidy_srr;
  275. }
  276. }
  277. return compact('count', 'list');
  278. }
  279. /**
  280. * 获取单选按钮或者多选按钮的显示值
  281. * @param $menu_name
  282. * @param $value
  283. * @return string
  284. * @throws \think\db\exception\DataNotFoundException
  285. * @throws \think\db\exception\ModelNotFoundException
  286. * @throws \think\exception\DbException
  287. */
  288. public function getRadioOrCheckboxValueInfo(string $menu_name, $value): string
  289. {
  290. $option = [];
  291. $config_one = $this->dao->getOne(['menu_name' => $menu_name]);
  292. if (!$config_one) {
  293. return '';
  294. }
  295. $parameter = explode("\n", $config_one['parameter']);
  296. foreach ($parameter as $k => $v) {
  297. if (isset($v) && strlen($v) > 0) {
  298. $data = explode('=>', $v);
  299. $option[$data[0]] = $data[1];
  300. }
  301. }
  302. $str = '';
  303. if (is_array($value)) {
  304. foreach ($value as $v) {
  305. $str .= $option[$v] . ',';
  306. }
  307. } else {
  308. $str .= !empty($value) ? $option[$value] ?? '' : $option[0] ?? '';
  309. }
  310. return $str;
  311. }
  312. /**
  313. * 获取系统配置信息
  314. * @param int $tabId
  315. * @return array
  316. * @throws \think\db\exception\DataNotFoundException
  317. * @throws \think\db\exception\DbException
  318. * @throws \think\db\exception\ModelNotFoundException
  319. */
  320. public function getReadList(int $tabId)
  321. {
  322. $info = $this->dao->getConfigTabAllList($tabId);
  323. foreach ($info as $k => $v) {
  324. if (!is_null(json_decode($v['value'])))
  325. $info[$k]['value'] = json_decode($v['value'], true);
  326. if ($v['type'] == 'upload' && !empty($v['value'])) {
  327. if ($v['upload_type'] == 1 || $v['upload_type'] == 3) $info[$k]['value'] = explode(',', $v['value']);
  328. }
  329. }
  330. return $info;
  331. }
  332. /**
  333. * 创建单行表单
  334. * @param string $type
  335. * @param array $data
  336. * @return array
  337. */
  338. public function createTextForm(string $type, array $data)
  339. {
  340. $formbuider = [];
  341. switch ($type) {
  342. case 'input':
  343. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : '';
  344. $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->placeholder($data['desc'])->col(13);
  345. break;
  346. case 'number':
  347. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : 0;
  348. $formbuider[] = $this->builder->number($data['menu_name'], $data['info'], (float)$data['value'])->info($data['desc']);
  349. break;
  350. case 'dateTime':
  351. $formbuider[] = $this->builder->dateTime($data['menu_name'], $data['info'], $data['value'])->info($data['desc']);
  352. break;
  353. case 'color':
  354. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : '';
  355. $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->info($data['desc']);
  356. break;
  357. default:
  358. $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : '';
  359. $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->placeholder($data['desc'])->col(13);
  360. break;
  361. }
  362. return $formbuider;
  363. }
  364. /**
  365. * 创建多行文本框
  366. * @param array $data
  367. * @return mixed
  368. */
  369. public function createTextareaForm(array $data)
  370. {
  371. $data['value'] = json_decode($data['value'], true) ?: '';
  372. $formbuider[] = $this->builder->textarea($data['menu_name'], $data['info'], $data['value'])->placeholder($data['desc'])->info($data['desc'])->rows(6)->col(13);
  373. return $formbuider;
  374. }
  375. /**
  376. * 创建当选表单
  377. * @param array $data
  378. * @return array
  379. * @throws \FormBuilder\Exception\FormBuilderException
  380. */
  381. public function createRadioForm(array $data, $control = false, $control_two = [])
  382. {
  383. $formbuider = [];
  384. $data['value'] = json_decode($data['value'], true) ?: '0';
  385. $parameter = explode("\n", $data['parameter']);
  386. $options = [];
  387. if ($parameter) {
  388. foreach ($parameter as $v) {
  389. if (strstr($v, $this->cuttingStr) !== false) {
  390. $pdata = explode($this->cuttingStr, $v);
  391. $options[] = ['label' => $pdata[1], 'value' => (int)$pdata[0]];
  392. }
  393. }
  394. $formbuider[] = $radio = $this->builder->radio($data['menu_name'], $data['info'], (int)$data['value'])->options($options)->info($data['desc'])->col(13);
  395. if ($control) {
  396. $radio->appendControl(isset($data['show_value']) ? $data['show_value'] : 1, is_array($control) ? $control : [$control]);
  397. }
  398. if ($control_two && isset($data['show_value2'])) {
  399. $radio->appendControl(isset($data['show_value2']) ? $data['show_value2'] : 2, is_array($control_two) ? $control_two : [$control_two]);
  400. }
  401. return $formbuider;
  402. }
  403. }
  404. /**
  405. * 创建上传组件表单
  406. * @param int $type
  407. * @param array $data
  408. * @return array
  409. */
  410. public function createUpoadForm(int $type, array $data)
  411. {
  412. $formbuider = [];
  413. switch ($type) {
  414. case 1:
  415. $data['value'] = json_decode($data['value'], true) ?: '';
  416. if ($data['value'] != '') $data['value'] = set_file_url($data['value']);
  417. $formbuider[] = $this->builder->frameImage($data['menu_name'], $data['info'], $this->url('admin/widget.images/index', ['fodder' => $data['menu_name']], true), $data['value'])
  418. ->icon('ios-image')->width('950px')->height('505px')->modal(['footer-hide' => true])->info($data['desc'])->col(13);
  419. break;
  420. case 2:
  421. $data['value'] = json_decode($data['value'], true) ?: [];
  422. if ($data['value'])
  423. $data['value'] = set_file_url($data['value']);
  424. $formbuider[] = $this->builder->frameImages($data['menu_name'], $data['info'], $this->url('admin/widget.images/index', ['fodder' => $data['menu_name'], 'type' => 'many', 'maxLength' => 5], true), $data['value'])
  425. ->maxLength(5)->icon('ios-images')->width('950px')->height('505px')->modal(['footer-hide' => true])
  426. ->info($data['desc'])->col(13);
  427. break;
  428. case 3:
  429. $data['value'] = json_decode($data['value'], true) ?: '';
  430. if ($data['value'] != '') $data['value'] = set_file_url($data['value']);
  431. $formbuider[] = $this->builder->uploadFile($data['menu_name'], $data['info'], $this->url('/adminapi/file/upload/1', ['type' => 1], false, true), $data['value'])
  432. ->name('file')->info($data['desc'])->col(13)->data(['menu_name' => $data['menu_name']])->headers([
  433. 'Authori-zation' => app()->request->header('Authori-zation'),
  434. ]);
  435. break;
  436. }
  437. return $formbuider;
  438. }
  439. /**
  440. * 创建单选框
  441. * @param array $data
  442. * @return array
  443. * @throws \FormBuilder\Exception\FormBuilderException
  444. */
  445. public function createCheckboxForm(array $data)
  446. {
  447. $formbuider = [];
  448. $data['value'] = json_decode($data['value'], true) ?: [];
  449. $parameter = explode("\n", $data['parameter']);
  450. $options = [];
  451. if ($parameter) {
  452. foreach ($parameter as $v) {
  453. if (strstr($v, $this->cuttingStr) !== false) {
  454. $pdata = explode($this->cuttingStr, $v);
  455. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  456. }
  457. }
  458. $formbuider[] = $this->builder->checkbox($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13);
  459. }
  460. return $formbuider;
  461. }
  462. /**
  463. * 创建选择框表单
  464. * @param array $data
  465. * @return array
  466. * @throws \FormBuilder\Exception\FormBuilderException
  467. */
  468. public function createSelectForm(array $data)
  469. {
  470. $formbuider = [];
  471. $data['value'] = json_decode($data['value'], true) ?: [];
  472. $parameter = explode("\n", $data['parameter']);
  473. $options = [];
  474. if ($parameter) {
  475. foreach ($parameter as $v) {
  476. if (strstr($v, $this->cuttingStr) !== false) {
  477. $pdata = explode($this->cuttingStr, $v);
  478. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  479. }
  480. }
  481. $formbuider[] = $this->builder->select($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13);
  482. }
  483. return $formbuider;
  484. }
  485. /**
  486. * 创建颜色选择器
  487. * @param array $data
  488. * @return mixed
  489. */
  490. public function createColorForm(array $data)
  491. {
  492. $data['value'] = json_decode($data['value'], true) ?: '';
  493. $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->col(13);
  494. return $formbuider;
  495. }
  496. public function bindBuilderData($data, $relatedRule)
  497. {
  498. if (!$data) return false;
  499. $p_list = array();
  500. foreach ($relatedRule as $rk => $rv) {
  501. $p_list[$rk] = $data[$rk];
  502. if (isset($rv['son_type']) && is_array($rv['son_type'])) {
  503. foreach ($rv['son_type'] as $sk => $sv) {
  504. if (is_array($sv) && isset($sv['son_type'])) {
  505. foreach ($sv['son_type'] as $ssk => $ssv) {
  506. $tmp = $data[$sk];
  507. $tmp['console'] = $data[$ssk];
  508. $p_list[$rk]['console'][] = $tmp;
  509. }
  510. } else {
  511. $p_list[$rk]['console'][] = $data[$sk];
  512. }
  513. }
  514. }
  515. }
  516. return array_values($p_list);
  517. }
  518. /**
  519. * 获取系统配置表单
  520. * @param int $id
  521. * @param array $formData
  522. * @return array
  523. * @throws \think\db\exception\DataNotFoundException
  524. * @throws \think\db\exception\DbException
  525. * @throws \think\db\exception\ModelNotFoundException
  526. */
  527. public function formTypeShine($data, $control = false, $controle_two = [])
  528. {
  529. switch ($data['type']) {
  530. case 'text'://文本框
  531. return $this->createTextForm($data['input_type'], $data);
  532. break;
  533. case 'radio'://单选框
  534. return $this->createRadioForm($data, $control, $controle_two);
  535. break;
  536. case 'textarea'://多行文本框
  537. return $this->createTextareaForm($data);
  538. break;
  539. case 'upload'://文件上传
  540. return $this->createUpoadForm((int)$data['upload_type'], $data);
  541. break;
  542. case 'checkbox'://多选框
  543. return $this->createCheckboxForm($data);
  544. break;
  545. case 'select'://多选框
  546. return $this->createSelectForm($data);
  547. break;
  548. case 'color':
  549. return $this->createColorForm($data);
  550. break;
  551. }
  552. }
  553. /**
  554. * @param int $tabId
  555. * @param array $formData
  556. * @param array $relatedRule
  557. * @return array|bool
  558. * @throws \think\db\exception\DataNotFoundException
  559. * @throws \think\db\exception\DbException
  560. * @throws \think\db\exception\ModelNotFoundException
  561. */
  562. public function createConfigForm(int $tabId, array $relatedRule)
  563. {
  564. $list = $this->dao->getConfigTabAllList($tabId);
  565. if (!$relatedRule) {
  566. $formbuider = $this->createNoCrontrolForm($list);
  567. } else {
  568. $formbuider = $this->createBindCrontrolForm($list, $relatedRule);
  569. }
  570. return $formbuider;
  571. }
  572. /**
  573. * 创建
  574. * @param array $list
  575. * @return array
  576. * @throws \FormBuilder\Exception\FormBuilderException
  577. * @throws \think\db\exception\DataNotFoundException
  578. * @throws \think\db\exception\DbException
  579. * @throws \think\db\exception\ModelNotFoundException
  580. */
  581. public function createForm(array $list)
  582. {
  583. if (!$list) return [];
  584. $list = array_combine(array_column($list, 'menu_name'), $list);
  585. $formbuider = [];
  586. $relateRule = $this->relatedRule;
  587. $sonConfig = $this->getSonConfig();
  588. foreach ($list as $key => $data) {
  589. if (in_array($key, $sonConfig)) {
  590. continue;
  591. }
  592. switch ($data['type']) {
  593. case 'text'://文本框
  594. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  595. break;
  596. case 'radio'://单选框
  597. $builder = [];
  598. if (isset($relateRule[$key])) {
  599. $role = $relateRule[$key];
  600. $data['show_value'] = $role['show_value'];
  601. foreach ($role['son_type'] as $sk => $sv) {
  602. if (isset($list[$sk])) {
  603. $son_data = $list[$sk];
  604. $son_data['show_value'] = $role['show_value'];
  605. $son_build = [];
  606. if (isset($sv['son_type'])) {
  607. foreach ($sv['son_type'] as $ssk => $ssv) {
  608. $son_data['show_value'] = $sv['show_value'];
  609. $son_build[] = $this->formTypeShine($list[$ssk])[0];
  610. unset($list[$ssk]);
  611. }
  612. }
  613. $son_build_two = [];
  614. if (isset($role['son_type'][$sk . '@'])) {
  615. $son_type_two = $role['son_type'][$sk . '@'];
  616. $son_data['show_value2'] = $son_type_two['show_value'];
  617. if (isset($son_type_two['son_type'])) {
  618. foreach ($son_type_two['son_type'] as $ssk => $ssv) {
  619. if (isset($list[$ssk]['menu_name']) && $list[$ssk]['menu_name'] == 'watermark_text_color') $list[$ssk]['type'] = 'color';
  620. $son_build_two[] = $this->formTypeShine($list[$ssk])[0];
  621. unset($list[$ssk]);
  622. }
  623. }
  624. }
  625. $builder[] = $this->formTypeShine($son_data, $son_build, $son_build_two)[0];
  626. unset($list[$sk]);
  627. }
  628. }
  629. $data['show_value'] = $role['show_value'];
  630. }
  631. $formbuider = array_merge($formbuider, $this->createRadioForm($data, $builder));
  632. break;
  633. case 'textarea'://多行文本框
  634. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  635. break;
  636. case 'upload'://文件上传
  637. $formbuider = array_merge($formbuider, $this->createUpoadForm((int)$data['upload_type'], $data));
  638. break;
  639. case 'checkbox'://多选框
  640. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  641. break;
  642. case 'select'://多选框
  643. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  644. break;
  645. }
  646. }
  647. return $formbuider;
  648. }
  649. /**无组件绑定规则
  650. * @param array $list
  651. * @return array|bool
  652. * @throws \FormBuilder\Exception\FormBuilderException
  653. * @throws \think\db\exception\DataNotFoundException
  654. * @throws \think\db\exception\DbException
  655. * @throws \think\db\exception\ModelNotFoundException
  656. */
  657. public function createNoCrontrolForm(array $list)
  658. {
  659. if (!$list) return false;
  660. $formbuider = [];
  661. foreach ($list as $key => $data) {
  662. switch ($data['type']) {
  663. case 'text'://文本框
  664. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  665. break;
  666. case 'radio'://单选框
  667. $formbuider = array_merge($formbuider, $this->createRadioForm($data));
  668. break;
  669. case 'textarea'://多行文本框
  670. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  671. break;
  672. case 'upload'://文件上传
  673. $formbuider = array_merge($formbuider, $this->createUpoadForm((int)$data['upload_type'], $data));
  674. break;
  675. case 'checkbox'://多选框
  676. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  677. break;
  678. case 'select'://多选框
  679. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  680. break;
  681. }
  682. }
  683. return $formbuider;
  684. }
  685. /**
  686. * 有组件绑定规则
  687. * @param array $list
  688. * @param array $relatedRule
  689. * @return array|bool
  690. * @throws \FormBuilder\Exception\FormBuilderException
  691. * @throws \think\db\exception\DataNotFoundException
  692. * @throws \think\db\exception\DbException
  693. * @throws \think\db\exception\ModelNotFoundException
  694. */
  695. public function createBindCrontrolForm(array $list, array $relatedRule)
  696. {
  697. if (!$list || !$relatedRule) return false;
  698. $formbuider = [];
  699. $new_data = array();
  700. foreach ($list as $dk => $dv) {
  701. $new_data[$dv['menu_name']] = $dv;
  702. }
  703. foreach ($relatedRule as $rk => $rv) {
  704. if (isset($rv['son_type'])) {
  705. $data = $new_data[$rk];
  706. switch ($data['type']) {
  707. case 'text'://文本框
  708. $formbuider = array_merge($formbuider, $this->createTextForm($data['input_type'], $data));
  709. break;
  710. case 'radio'://单选框
  711. $son_builder = array();
  712. foreach ($rv['son_type'] as $sk => $sv) {
  713. if (isset($sv['son_type'])) {
  714. foreach ($sv['son_type'] as $ssk => $ssv) {
  715. $son_data = $new_data[$sk];
  716. $son_data['show_value'] = $sv['show_value'];
  717. $son_builder[] = $this->formTypeShine($son_data, $this->formTypeShine($new_data[$ssk])[0])[0];
  718. }
  719. } else {
  720. $son_data = $new_data[$sk];
  721. $son_data['show_value'] = $rv['show_value'];
  722. $son_builder[] = $this->formTypeShine($son_data)[0];
  723. }
  724. }
  725. $formbuider = array_merge($formbuider, $this->createRadioForm($data, $son_builder));
  726. break;
  727. case 'textarea'://多行文本框
  728. $formbuider = array_merge($formbuider, $this->createTextareaForm($data));
  729. break;
  730. case 'upload'://文件上传
  731. $formbuider = array_merge($formbuider, $this->createUpoadForm((int)$data['upload_type'], $data));
  732. break;
  733. case 'checkbox'://多选框
  734. $formbuider = array_merge($formbuider, $this->createCheckboxForm($data));
  735. break;
  736. case 'select'://多选框
  737. $formbuider = array_merge($formbuider, $this->createSelectForm($data));
  738. break;
  739. }
  740. }
  741. }
  742. return $formbuider;
  743. }
  744. /**
  745. * 系统配置form表单创建
  746. * @param int $tabId
  747. * @return array
  748. * @throws \FormBuilder\Exception\FormBuilderException
  749. * @throws \think\db\exception\DataNotFoundException
  750. * @throws \think\db\exception\DbException
  751. * @throws \think\db\exception\ModelNotFoundException
  752. */
  753. public function getConfigForm($url, int $tabId)
  754. {
  755. /** @var SystemConfigTabServices $service */
  756. $service = app()->make(SystemConfigTabServices::class);
  757. $title = $service->value(['id' => $tabId], 'title');
  758. $list = $this->dao->getConfigTabAllList($tabId);
  759. $formbuider = $this->createForm($list);
  760. $name = 'setting';
  761. if ($url) {
  762. $name = explode('/', $url)[2] ?? $name;
  763. }
  764. $postUrl = $this->postUrl[$name]['url'] ?? '/setting/config/save_basics';
  765. return create_form($title, $formbuider, $this->url($postUrl), 'POST');
  766. }
  767. /**
  768. * 新增路由增加设置项验证
  769. * @param $url
  770. * @param $post
  771. * @return bool
  772. */
  773. public function checkParam($url, $post)
  774. {
  775. $name = '';
  776. if ($url) {
  777. $name = explode('/', $url)[2] ?? $name;
  778. }
  779. $auth = $this->postUrl[$name]['auth'] ?? false;
  780. if ($auth === false) {
  781. throw new ValidateException('请求不被允许');
  782. }
  783. if ($auth) {
  784. /** @var SystemConfigTabServices $systemConfigTabServices */
  785. $systemConfigTabServices = app()->make(SystemConfigTabServices::class);
  786. foreach ($post as $key => $value) {
  787. $tab_ids = $systemConfigTabServices->getColumn([['eng_title', 'IN', $auth]], 'id');
  788. if (!$tab_ids || !in_array($key, $this->dao->getColumn([['config_tab_id', 'IN', $tab_ids]], 'menu_name'))) {
  789. throw new ValidateException('设置类目不被允许');
  790. }
  791. }
  792. }
  793. return true;
  794. }
  795. /**
  796. * 修改配置获取form表单
  797. * @param int $id
  798. * @return array
  799. * @throws \FormBuilder\Exception\FormBuilderException
  800. * @throws \think\db\exception\DataNotFoundException
  801. * @throws \think\db\exception\DbException
  802. * @throws \think\db\exception\ModelNotFoundException
  803. */
  804. public function editConfigForm(int $id)
  805. {
  806. $menu = $this->dao->get($id)->getData();
  807. if (!$menu) {
  808. throw new AdminException('修改数据不存在!');
  809. }
  810. /** @var SystemConfigTabServices $service */
  811. $service = app()->make(SystemConfigTabServices::class);
  812. $formbuider = [];
  813. $formbuider[] = $this->builder->input('menu_name', '字段变量', $menu['menu_name'])->disabled(1);
  814. $formbuider[] = $this->builder->hidden('type', $menu['type']);
  815. $formbuider[] = $this->builder->select('config_tab_id', '分类', (int)$menu['config_tab_id'])->setOptions($service->getSelectForm());
  816. $formbuider[] = $this->builder->input('info', '配置名称', $menu['info'])->autofocus(1);
  817. $formbuider[] = $this->builder->input('desc', '配置简介', $menu['desc']);
  818. switch ($menu['type']) {
  819. case 'text':
  820. $menu['value'] = json_decode($menu['value'], true);
  821. $formbuider[] = $this->builder->select('input_type', '类型', $menu['input_type'])->setOptions([
  822. ['value' => 'input', 'label' => '文本框']
  823. , ['value' => 'dateTime', 'label' => '时间']
  824. , ['value' => 'color', 'label' => '颜色']
  825. , ['value' => 'number', 'label' => '数字']
  826. ]);
  827. //输入框验证规则
  828. $formbuider[] = $this->builder->input('value', '默认值', $menu['value']);
  829. if (!empty($menu['required'])) {
  830. $formbuider[] = $this->builder->number('width', '文本框宽(%)', (int)$menu['width']);
  831. $formbuider[] = $this->builder->input('required', '验证规则', $menu['required'])->placeholder('多个请用,隔开例如:required:true,url:true');
  832. }
  833. break;
  834. case 'textarea':
  835. $menu['value'] = json_decode($menu['value'], true);
  836. //多行文本
  837. if (!empty($menu['high'])) {
  838. $formbuider[] = $this->builder->textarea('value', '默认值', $menu['value'])->rows(5);
  839. $formbuider[] = $this->builder->number('width', '文本框宽(%)', (int)$menu['width']);
  840. $formbuider[] = $this->builder->number('high', '多行文本框高(%)', (int)$menu['high']);
  841. } else {
  842. $formbuider[] = $this->builder->input('value', '默认值', $menu['value']);
  843. }
  844. break;
  845. case 'radio':
  846. $formbuider = array_merge($formbuider, $this->createRadioForm($menu));
  847. //单选和多选参数配置
  848. if (!empty($menu['parameter'])) {
  849. $formbuider[] = $this->builder->textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  850. }
  851. break;
  852. case 'checkbox':
  853. $formbuider = array_merge($formbuider, $this->createCheckboxForm($menu));
  854. //单选和多选参数配置
  855. if (!empty($menu['parameter'])) {
  856. $formbuider[] = $this->builder->textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  857. }
  858. break;
  859. case 'upload':
  860. $formbuider = array_merge($formbuider, $this->createUpoadForm(($menu['upload_type']), $menu));
  861. //上传类型选择
  862. if (!empty($menu['upload_type'])) {
  863. $formbuider[] = $this->builder->radio('upload_type', '上传类型', $menu['upload_type'])->options([['value' => 1, 'label' => '单图'], ['value' => 2, 'label' => '多图'], ['value' => 3, 'label' => '文件']]);
  864. }
  865. break;
  866. }
  867. $formbuider[] = $this->builder->number('sort', '排序', (int)$menu['sort']);
  868. $formbuider[] = $this->builder->radio('status', '状态', $menu['status'])->options([['value' => 1, 'label' => '显示'], ['value' => 2, 'label' => '隐藏']]);
  869. return create_form('编辑字段', $formbuider, $this->url('/setting/config/' . $id), 'PUT');
  870. }
  871. /**
  872. * 字段状态
  873. * @return array
  874. */
  875. public function formStatus(): array
  876. {
  877. return [['value' => 1, 'label' => '显示'], ['value' => 2, 'label' => '隐藏']];
  878. }
  879. /**
  880. * 选择文文件类型
  881. * @return array
  882. */
  883. public function uploadType(): array
  884. {
  885. return [
  886. ['value' => 1, 'label' => '单图']
  887. , ['value' => 2, 'label' => '多图']
  888. , ['value' => 3, 'label' => '文件']
  889. ];
  890. }
  891. /**
  892. * 选择文本框类型
  893. * @return array
  894. */
  895. public function textType(): array
  896. {
  897. return [
  898. ['value' => 'input', 'label' => '文本框']
  899. , ['value' => 'dateTime', 'label' => '时间']
  900. , ['value' => 'color', 'label' => '颜色']
  901. , ['value' => 'number', 'label' => '数字']
  902. ];
  903. }
  904. /**
  905. * 获取创建配置规格表单
  906. * @param int $type
  907. * @param int $tab_id
  908. * @return array
  909. */
  910. public function createFormRule(int $type, int $tab_id): array
  911. {
  912. /** @var SystemConfigTabServices $service */
  913. $service = app()->make(SystemConfigTabServices::class);
  914. $formbuider = [];
  915. $form_type = '';
  916. $info_type = [];
  917. $parameter = [];
  918. switch ($type) {
  919. case 0://文本框
  920. $form_type = 'text';
  921. $info_type = $this->builder->select('input_type', '类型')->setOptions($this->textType());
  922. $parameter[] = $this->builder->input('value', '默认值');
  923. $parameter[] = $this->builder->number('width', '文本框宽(%)', 100);
  924. $parameter[] = $this->builder->input('required', '验证规则')->placeholder('多个请用,隔开例如:required:true,url:true');
  925. break;
  926. case 1://多行文本框
  927. $form_type = 'textarea';
  928. $parameter[] = $this->builder->textarea('value', '默认值');
  929. $parameter[] = $this->builder->number('width', '文本框宽(%)', 100);
  930. $parameter[] = $this->builder->number('high', '多行文本框高(%)', 5);
  931. break;
  932. case 2://单选框
  933. $form_type = 'radio';
  934. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>男\n2=>女\n3=>保密");
  935. $parameter[] = $this->builder->input('value', '默认值');
  936. break;
  937. case 3://文件上传
  938. $form_type = 'upload';
  939. $parameter[] = $this->builder->radio('upload_type', '上传类型', 1)->options($this->uploadType());
  940. break;
  941. case 4://多选框
  942. $form_type = 'checkbox';
  943. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  944. break;
  945. case 5://下拉框
  946. $form_type = 'select';
  947. $parameter[] = $this->builder->textarea('parameter', '配置参数')->placeholder("参数方式例如:\n1=>白色\n2=>红色\n3=>黑色");
  948. break;
  949. }
  950. if ($form_type) {
  951. $formbuider[] = $this->builder->hidden('type', $form_type);
  952. $formbuider[] = $this->builder->select('config_tab_id', '分类', $tab_id)->setOptions($service->getSelectForm());
  953. if ($info_type) {
  954. $formbuider[] = $info_type;
  955. }
  956. $formbuider[] = $this->builder->input('info', '配置名称')->autofocus(1);
  957. $formbuider[] = $this->builder->input('menu_name', '字段变量')->placeholder('例如:site_url');
  958. $formbuider[] = $this->builder->input('desc', '配置简介');
  959. $formbuider = array_merge($formbuider, $parameter);
  960. $formbuider[] = $this->builder->number('sort', '排序', 0);
  961. $formbuider[] = $this->builder->radio('status', '状态', 1)->options($this->formStatus());
  962. }
  963. return create_form('添加字段', $formbuider, $this->url('/setting/config'), 'POST');
  964. }
  965. /**
  966. * radio 和 checkbox规则的判断
  967. * @param $data
  968. * @return bool
  969. */
  970. public function valiDateRadioAndCheckbox($data)
  971. {
  972. $option = [];
  973. $option_new = [];
  974. $data['parameter'] = str_replace("\r\n", "\n", $data['parameter']);//防止不兼容
  975. $parameter = explode("\n", $data['parameter']);
  976. if (count($parameter) < 2) {
  977. throw new AdminException('请输入正确格式的配置参数');
  978. }
  979. foreach ($parameter as $k => $v) {
  980. if (isset($v) && !empty($v)) {
  981. $option[$k] = explode('=>', $v);
  982. }
  983. }
  984. if (count($option) < 2) {
  985. throw new AdminException('请输入正确格式的配置参数');
  986. }
  987. $bool = 1;
  988. foreach ($option as $k => $v) {
  989. $option_new[$k] = $option[$k][0];
  990. foreach ($v as $kk => $vv) {
  991. $vv_num = strlen($vv);
  992. if (!$vv_num) {
  993. $bool = 0;
  994. }
  995. }
  996. }
  997. if (!$bool) {
  998. throw new AdminException('请输入正确格式的配置参数');
  999. }
  1000. $num1 = count($option_new);//提取该数组的数目
  1001. $arr2 = array_unique($option_new);//合并相同的元素
  1002. $num2 = count($arr2);//提取合并后数组个数
  1003. if ($num1 > $num2) {
  1004. throw new AdminException('请输入正确格式的配置参数');
  1005. }
  1006. return true;
  1007. }
  1008. /**
  1009. * 验证参数
  1010. * @param $data
  1011. * @return bool
  1012. */
  1013. public function valiDateValue($data)
  1014. {
  1015. if (!$data || !isset($data['required']) || !$data['required']) {
  1016. return true;
  1017. }
  1018. $valids = explode(',', $data['required']);
  1019. foreach ($valids as $valid) {
  1020. $valid = explode(':', $valid);
  1021. if (isset($valid[0]) && isset($valid[1])) {
  1022. $k = strtolower(trim($valid[0]));
  1023. $v = strtolower(trim($valid[1]));
  1024. switch ($k) {
  1025. case 'required':
  1026. if ($v == 'true' && $data['value'] === '') {
  1027. throw new ValidateException(($data['info'] ?? '') . '请输入默认值');
  1028. }
  1029. break;
  1030. case 'url':
  1031. if ($v == 'true' && !check_link($data['value'])) {
  1032. throw new ValidateException(($data['info'] ?? '') . '请输入正确url');
  1033. }
  1034. break;
  1035. }
  1036. }
  1037. }
  1038. }
  1039. /**保存平台电子面单打印信息
  1040. * @param array $data
  1041. * @return bool
  1042. */
  1043. public function saveExpressInfo(array $data)
  1044. {
  1045. if (!is_array($data) || !$data) return false;
  1046. // config_export_id 快递公司id
  1047. // config_export_temp_id 快递公司模板id
  1048. // config_export_com 快递公司编码
  1049. // config_export_to_name 发货人姓名
  1050. // config_export_to_tel 发货人电话
  1051. // config_export_to_address 发货人详细地址
  1052. // config_export_siid 电子面单打印机编号
  1053. foreach ($data as $key => $value) {
  1054. $this->dao->update(['menu_name' => 'config_export_' . $key], ['value' => json_encode($value)]);
  1055. }
  1056. \crmeb\services\CacheService::clear();
  1057. return true;
  1058. }
  1059. /**
  1060. * 获取分享海报 兼容方法
  1061. */
  1062. public function getSpreadBanner()
  1063. {
  1064. //配置
  1065. $banner = sys_config('spread_banner', []);
  1066. if (!$banner) {
  1067. //组合数据
  1068. $banner = sys_data('routine_spread_banner');
  1069. if ($banner) {
  1070. $banner = array_column($banner, 'pic');
  1071. $this->dao->update(['menu_name' => 'spread_banner'], ['value' => json_encode($banner)]);
  1072. \crmeb\services\CacheService::clear();
  1073. }
  1074. }
  1075. return $banner;
  1076. }
  1077. /**
  1078. * 保存wss配置
  1079. * @param int $wssOpen
  1080. * @param string $wssLocalpk
  1081. * @param string $wssLocalCert
  1082. */
  1083. public function saveSslFilePath(int $wssOpen, string $wssLocalpk, string $wssLocalCert)
  1084. {
  1085. $wssFile = root_path() . '.wss';
  1086. $content = <<<WSS
  1087. wssOpen = $wssOpen
  1088. wssLocalpk = $wssLocalpk
  1089. wssLocalCert = $wssLocalCert
  1090. WSS;
  1091. try {
  1092. file_put_contents($wssFile, $content);
  1093. } catch (\Throwable $e) {
  1094. throw new ValidateException('保存wss证书失败,失败原因:' . $e->getMessage());
  1095. }
  1096. }
  1097. /**
  1098. * 获取wss配置
  1099. * @param string $key
  1100. * @return array|false|mixed
  1101. */
  1102. public function getSslFilePath(string $key = '')
  1103. {
  1104. $wssFile = root_path() . '.wss';
  1105. try {
  1106. $content = parse_ini_file($wssFile);
  1107. } catch (\Throwable $e) {
  1108. $content = [];
  1109. }
  1110. if (isset($content[$key])) {
  1111. return $content[$key];
  1112. } else {
  1113. return $content;
  1114. }
  1115. }
  1116. /**
  1117. * 检测缩略图水印配置是否更改
  1118. * @param array $post
  1119. * @return bool
  1120. */
  1121. public function checkThumbParam(array $post)
  1122. {
  1123. unset($post['upload_type'], $post['image_watermark_status']);
  1124. /** @var SystemConfigTabServices $systemConfigTabServices */
  1125. $systemConfigTabServices = app()->make(SystemConfigTabServices::class);
  1126. //上传配置->基础配置
  1127. $tab_id = $systemConfigTabServices->getColumn(['eng_title' => 'base_config'], 'id');
  1128. if ($tab_id) {
  1129. $all = $this->dao->getColumn(['config_tab_id' => $tab_id], 'value', 'menu_name');
  1130. if (array_intersect(array_keys($all), array_keys($post))) {
  1131. foreach ($post as $key => $item) {
  1132. //配置更改删除原来生成的缩略图
  1133. if (isset($all[$key]) && $item != json_decode($all[$key], true)) {
  1134. try {
  1135. FileService::delDir(public_path('uploads/thumb_water'));
  1136. break;
  1137. } catch (\Throwable $e) {
  1138. }
  1139. }
  1140. }
  1141. }
  1142. }
  1143. return true;
  1144. }
  1145. /**
  1146. * 变更分销绑定关系模式
  1147. * @param array $post
  1148. * @return bool
  1149. */
  1150. public function checkBrokerageBinding(array $post)
  1151. {
  1152. try {
  1153. $config_data = $post['store_brokerage_binding_status'];
  1154. $config_one = $this->dao->getOne(['menu_name' => 'store_brokerage_binding_status']);
  1155. $config_old = json_decode($config_one['value'], true);
  1156. if ($config_old != 2 && $config_data == 2) {
  1157. //自动解绑上级绑定
  1158. /** @var AgentManageServices $agentManage */
  1159. $agentManage = app()->make(AgentManageServices::class);
  1160. $agentManage->resetSpreadTime();
  1161. }
  1162. } catch (\Throwable $e) {
  1163. Log::error('变更分销绑定模式重置绑定时间失败,失败原因:' . $e->getMessage());
  1164. return false;
  1165. }
  1166. return true;
  1167. }
  1168. }