SystemConfig.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. <?php
  2. namespace app\adminapi\controller\v1\setting;
  3. use app\adminapi\controller\AuthController;
  4. use Exception;
  5. use FormBuilder\exception\FormBuilderException;
  6. use think\db\exception\DataNotFoundException;
  7. use think\db\exception\DbException;
  8. use think\db\exception\ModelNotFoundException;
  9. use think\Request;
  10. use think\facade\Route as Url;
  11. use crmeb\services\{FormBuilder as Form, MiniProgramService, UtilService as Util};
  12. use app\models\system\{
  13. SystemConfigTab as ConfigTabModel, SystemConfig as ConfigModel, SystemConfigMerchant as ConfigMerchantModel
  14. };
  15. use think\Response;
  16. class SystemConfig extends AuthController
  17. {
  18. /**
  19. * 显示资源列表
  20. *
  21. * @return Response
  22. * @throws Exception
  23. */
  24. public function index()
  25. {
  26. $where = Util::getMore([
  27. ['tab_id', 0],
  28. ['page', 1],
  29. ['limit', 15]
  30. ]);
  31. if (!$where['tab_id']) return $this->fail('参数错误');
  32. $list = ConfigModel::getPageList($where, $this->merId);
  33. // foreach ($list as $k => $v) {
  34. // $list[$k]['value'] = json_decode($v['value'], true) ?: '';
  35. // if ($v['type'] == 'radio' || $v['type'] == 'checkbox') {
  36. // $list[$k]['value'] = ConfigTabModel::getRadioOrCheckboxValueInfo($v['menu_name'], $v['value']);
  37. // }
  38. // if ($v['type'] == 'upload' && !empty($v['value'])) {
  39. // if ($v['upload_type'] == 1 || $v['upload_type'] == 3) $list[$k]['value'] = explode(',', $v['value']);
  40. // }
  41. // }
  42. return $this->success($list);
  43. }
  44. /**
  45. * 显示创建资源表单页.
  46. * @param $type
  47. * @return Response
  48. * @throws FormBuilderException
  49. * @throws Exception
  50. */
  51. public function create()
  52. {
  53. $data = Util::getMore(['type',]);//接收参数
  54. $tab_id = !empty(request()->param('tab_id')) ? request()->param('tab_id') : 1;
  55. $formbuider = array();
  56. switch ($data['type']) {
  57. case 0://文本框
  58. $formbuider = ConfigModel::createInputRule($tab_id);
  59. break;
  60. case 1://多行文本框
  61. $formbuider = ConfigModel::createTextAreaRule($tab_id);
  62. break;
  63. case 2://单选框
  64. $formbuider = ConfigModel::createRadioRule($tab_id);
  65. break;
  66. case 3://文件上传
  67. $formbuider = ConfigModel::createUploadRule($tab_id);
  68. break;
  69. case 4://多选框
  70. $formbuider = ConfigModel::createCheckboxRule($tab_id);
  71. break;
  72. case 5://下拉框
  73. $formbuider = ConfigModel::createSelectRule($tab_id);
  74. break;
  75. }
  76. return $this->makePostForm('添加字段', $formbuider, Url::buildUrl('adminapi/setting/config')->domain(true)->build(), 'POST');
  77. }
  78. /**
  79. * 保存新建的资源
  80. *
  81. * @param Request $request
  82. * @return Response
  83. * @throws DataNotFoundException
  84. * @throws DbException
  85. * @throws ModelNotFoundException
  86. * @throws Exception
  87. */
  88. public function save(Request $request)
  89. {
  90. $data = Util::postMore([
  91. 'menu_name',
  92. 'type',
  93. 'input_type',
  94. 'config_tab_id',
  95. 'parameter',
  96. 'upload_type',
  97. 'required',
  98. 'width',
  99. 'high',
  100. 'value',
  101. 'info',
  102. 'desc',
  103. 'sort',
  104. 'status',]);
  105. if (!$data['info']) return $this->fail('请输入配置名称');
  106. if (!$data['menu_name']) return $this->fail('请输入字段名称');
  107. if ($data['menu_name']) {
  108. $oneConfig = ConfigModel::getOneConfig('menu_name', $data['menu_name']);
  109. if (!empty($oneConfig)) return $this->fail('请重新输入字段名称,之前的已经使用过了');
  110. }
  111. if (!$data['desc']) return $this->fail('请输入配置简介');
  112. if ($data['sort'] < 0) {
  113. $data['sort'] = 0;
  114. }
  115. if ($data['type'] == 'text') {
  116. if (!ConfigModel::valiDateTextRole($data)) return $this->fail(ConfigModel::getErrorInfo());
  117. }
  118. if ($data['type'] == 'textarea') {
  119. if (!ConfigModel::valiDateTextareaRole($data)) return $this->fail(ConfigModel::getErrorInfo());
  120. }
  121. if ($data['type'] == 'radio' || $data['type'] == 'checkbox') {
  122. if (!$data['parameter']) return $this->fail('请输入配置参数');
  123. if (!ConfigModel::valiDateRadioAndCheckbox($data)) return $this->fail(ConfigModel::getErrorInfo());
  124. $data['value'] = json_encode($data['value']);
  125. }
  126. ConfigModel::create($data);
  127. $data['mer_id'] = $this->merId;
  128. ConfigMerchantModel::create($data);
  129. \crmeb\services\CacheService::clear();
  130. return $this->success('添加配置成功!');
  131. }
  132. /**
  133. * 显示指定的资源
  134. *
  135. * @param int $id
  136. * @return Response
  137. * @throws DataNotFoundException
  138. * @throws DbException
  139. * @throws ModelNotFoundException
  140. */
  141. public function read($id)
  142. {
  143. if (!$id) return $this->fail('参数错误,请重新打开');
  144. $info = ConfigModel::getAll($id, 1, $this->merId);
  145. foreach ($info as $k => $v) {
  146. if (!is_null(json_decode($v['value'])))
  147. $info[$k]['value'] = json_decode($v['value'], true);
  148. if ($v['type'] == 'upload' && !empty($v['value'])) {
  149. if ($v['upload_type'] == 1 || $v['upload_type'] == 3) $info[$k]['value'] = explode(',', $v['value']);
  150. }
  151. }
  152. return $this->success(compact('info'));
  153. }
  154. /**
  155. * 显示编辑资源表单页.
  156. *
  157. * @param int $id
  158. * @return Response
  159. * @throws DataNotFoundException
  160. * @throws FormBuilderException
  161. * @throws ModelNotFoundException
  162. * @throws DbException
  163. */
  164. public function edit($id)
  165. {
  166. if(!$menu = ConfigMerchantModel::get($id)) $menu = ConfigModel::get($id);
  167. if (!$menu) return $this->fail('数据不存在!');
  168. $formbuider = array();
  169. $formbuider[] = Form::input('menu_name', '字段变量', $menu['menu_name'])->disabled(1);
  170. $formbuider[] = Form::hidden('type', $menu['type']);
  171. $formbuider[] = Form::select('config_tab_id', '分类', (string)$menu['config_tab_id'])->setOptions(ConfigModel::getConfigTabAll(-1));
  172. $formbuider[] = Form::input('info', '配置名称', $menu['info'])->autofocus(1);
  173. $formbuider[] = Form::input('desc', '配置简介', $menu['desc']);
  174. switch ($menu['type']) {
  175. case 'text':
  176. $menu['value'] = json_decode($menu['value'], true);
  177. $formbuider[] = Form::select('input_type', '类型', $menu['input_type'])->setOptions(ConfigModel::texttype());
  178. //输入框验证规则
  179. $formbuider[] = Form::input('value', '默认值', $menu['value']);
  180. if (!empty($menu['required'])) {
  181. $formbuider[] = Form::number('width', '文本框宽(%)', $menu['width']);
  182. $formbuider[] = Form::input('required', '验证规则', $menu['required'])->placeholder('多个请用,隔开例如:required:true,url:true');
  183. }
  184. break;
  185. case 'textarea':
  186. $menu['value'] = json_decode($menu['value'], true);
  187. //多行文本
  188. if (!empty($menu['high'])) {
  189. $formbuider[] = Form::textarea('value', '默认值', $menu['value'])->rows(5);
  190. $formbuider[] = Form::number('width', '文本框宽(%)', $menu['width']);
  191. $formbuider[] = Form::number('high', '多行文本框高(%)', $menu['high']);
  192. } else {
  193. $formbuider[] = Form::input('value', '默认值', $menu['value']);
  194. }
  195. break;
  196. case 'radio':
  197. $menu['value'] = json_decode($menu['value'], true);
  198. $parameter = explode("\n", $menu['parameter']);
  199. $options = [];
  200. if ($parameter) {
  201. foreach ($parameter as $v) {
  202. $data = explode("=>", $v);
  203. $options[] = ['label' => $data[1], 'value' => $data[0]];
  204. }
  205. $formbuider[] = Form::radio('value', '默认值', $menu['value'])->options($options);
  206. }
  207. //单选和多选参数配置
  208. if (!empty($menu['parameter'])) {
  209. $formbuider[] = Form::textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=白色\n2=红色\n3=黑色");
  210. }
  211. break;
  212. case 'checkbox':
  213. $menu['value'] = json_decode($menu['value'], true) ?: [];
  214. $parameter = explode("\n", $menu['parameter']);
  215. $options = [];
  216. if ($parameter) {
  217. foreach ($parameter as $v) {
  218. $data = explode("=>", $v);
  219. $options[] = ['label' => $data[1], 'value' => $data[0]];
  220. }
  221. $formbuider[] = Form::checkbox('value', '默认值', $menu['value'])->options($options);
  222. }
  223. //单选和多选参数配置
  224. if (!empty($menu['parameter'])) {
  225. $formbuider[] = Form::textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=白色\n2=红色\n3=黑色");
  226. }
  227. break;
  228. case 'upload':
  229. if ($menu['upload_type'] == 1) {
  230. $menu['value'] = json_decode($menu['value'], true);
  231. $formbuider[] = Form::frameImageOne('value', '图片', Url::buildUrl('admin/widget.images/index', array('fodder' => 'value')), (string)$menu['value'])->icon('ios-image')->width('60%')->height('435px');
  232. } elseif ($menu['upload_type'] == 2) {
  233. $menu['value'] = json_decode($menu['value'], true) ?: [];
  234. $formbuider[] = Form::frameImages('value', '多图片', Url::buildUrl('admin/widget.images/index', array('fodder' => 'value')), $menu['value'])->maxLength(5)->icon('ios-images')->width('60%')->height('435px')->spin(0);
  235. } else {
  236. $menu['value'] = json_decode($menu['value'], true);
  237. $formbuider[] = Form::uploadFileOne('value', '文件', Url::buildUrl('/adminapi/file/upload/1')->domain(true)->build(), $menu['value'])->name('file')->headers([
  238. 'Authori-zation' => $this->request->header('Authori-zation')
  239. ]);
  240. }
  241. //上传类型选择
  242. if (!empty($menu['upload_type'])) {
  243. $formbuider[] = Form::radio('upload_type', '上传类型', $menu['upload_type'])->options([['value' => 1, 'label' => '单图'], ['value' => 2, 'label' => '多图'], ['value' => 3, 'label' => '文件']]);
  244. }
  245. break;
  246. }
  247. $formbuider[] = Form::number('sort', '排序', $menu['sort']);
  248. $formbuider[] = Form::radio('status', '状态', $menu['status'])->options([['value' => 1, 'label' => '显示'], ['value' => 2, 'label' => '隐藏']]);
  249. return $this->makePostForm('编辑字段', $formbuider, Url::buildUrl('/setting/config/' . $id), 'PUT');
  250. }
  251. /**
  252. * 保存更新的资源
  253. *
  254. * @param Request $request
  255. * @param int $id
  256. * @return Response
  257. * @throws Exception
  258. */
  259. public function update(Request $request, $id)
  260. {
  261. $type = request()->post('type');
  262. if ($type == 'text' || $type == 'textarea' || $type == 'radio' || ($type == 'upload' && (request()->post('upload_type') == 1 || request()->post('upload_type') == 3))) {
  263. $value = request()->post('value');
  264. } else {
  265. $value = request()->post('value/a');
  266. }
  267. $data = Util::postMore(['status', 'info', 'desc', 'sort', 'config_tab_id', 'required', 'parameter', ['value', $value], 'upload_type', 'input_type']);
  268. $data['value'] = json_encode($data['value']);
  269. if(!$menu = ConfigMerchantModel::get($id)) $menu = ConfigModel::get($id);
  270. if (!$menu) return $this->fail('编辑的记录不存在!');
  271. ConfigMerchantModel::edit($data, $id);
  272. \crmeb\services\CacheService::clear();
  273. return $this->success('修改成功!');
  274. }
  275. /**
  276. * 删除指定资源
  277. *
  278. * @param int $id
  279. * @return Response
  280. */
  281. public function delete($id)
  282. {
  283. if (!ConfigMerchantModel::del($id))
  284. return $this->fail(ConfigMerchantModel::getErrorInfo('删除失败,请稍候再试!'));
  285. else
  286. return $this->success('删除成功!');
  287. }
  288. /**
  289. * 修改状态
  290. * @param $id
  291. * @param $status
  292. * @return mixed
  293. */
  294. public function set_status($id, $status)
  295. {
  296. if ($status == '' || $id == 0) return $this->fail('参数错误');
  297. ConfigModel::where(['id' => $id])->update(['status' => $status]);
  298. return $this->success($status == 0 ? '隐藏成功' : '显示成功');
  299. }
  300. /**
  301. * 基础配置
  302. * @return mixed
  303. * @throws DataNotFoundException
  304. * @throws DbException
  305. * @throws FormBuilderException
  306. * @throws ModelNotFoundException
  307. */
  308. public function edit_basics()
  309. {
  310. $tab_id = $this->request->param('tab_id');
  311. if (!$tab_id) $tab_id = 1;
  312. $list = ConfigModel::getAll($tab_id, 1, $this->merId);
  313. $title = ConfigTabModel::where('id', $tab_id)->value('title');
  314. $formbuider = [];
  315. foreach ($list as $data) {
  316. switch ($data['type']) {
  317. case 'text'://文本框
  318. switch ($data['input_type']) {
  319. case 'number':
  320. $data['value'] = json_decode($data['value'], true) ?: 0;
  321. $formbuider[] = Form::number($data['menu_name'], $data['info'], $data['value'])->info($data['desc']);
  322. break;
  323. case 'dateTime':
  324. $formbuider[] = Form::dateTime($data['menu_name'], $data['info'], $data['value'])->info($data['desc']);
  325. break;
  326. case 'color':
  327. $data['value'] = json_decode($data['value'], true) ?: '';
  328. $formbuider[] = Form::color($data['menu_name'], $data['info'], $data['value'])->info($data['desc']);
  329. break;
  330. default:
  331. $data['value'] = json_decode($data['value'], true) ?: '';
  332. $formbuider[] = Form::input($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->placeholder($data['desc'])->col(13);
  333. break;
  334. }
  335. break;
  336. case 'textarea'://多行文本框
  337. $data['value'] = json_decode($data['value'], true) ?: '';
  338. $formbuider[] = Form::textarea($data['menu_name'], $data['info'], $data['value'])->placeholder($data['desc'])->info($data['desc'])->rows(6)->col(13);
  339. break;
  340. case 'radio'://单选框
  341. $data['value'] = json_decode($data['value'], true) ?: '0';
  342. $parameter = explode("\n", $data['parameter']);
  343. $options = [];
  344. if ($parameter) {
  345. foreach ($parameter as $v) {
  346. $pdata = explode("=>", $v);
  347. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  348. }
  349. $formbuider[] = Form::radio($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13);
  350. }
  351. break;
  352. case 'upload'://文件上传
  353. switch ($data['upload_type']) {
  354. case 1:
  355. $data['value'] = json_decode($data['value'], true) ?: '';
  356. $formbuider[] = Form::frameImageOne($data['menu_name'], $data['info'], Url::buildUrl('admin/widget.images/index', array('fodder' => $data['menu_name'])), $data['value'])->icon('ios-image')->width('60%')->height('435px')->info($data['desc'])->col(13);
  357. break;
  358. case 2:
  359. $data['value'] = json_decode($data['value'], true) ?: [];
  360. $formbuider[] = Form::frameImages($data['menu_name'], $data['info'], Url::buildUrl('admin/widget.images/index', array('fodder' => $data['menu_name'])), $data['value'])->maxLength(5)->icon('ios-image')->width('60%')->height('435px')->info($data['desc'])->col(13);
  361. break;
  362. case 3:
  363. $data['value'] = json_decode($data['value'], true);
  364. $formbuider[] = Form::uploadFileOne($data['menu_name'], $data['info'], Url::buildUrl('/adminapi/file/upload/1')->domain(true)->build(), $data['value'])->name('file')->info($data['desc'])->col(13)->headers([
  365. 'Authori-zation' => $this->request->header('Authori-zation'),
  366. ]);
  367. break;
  368. }
  369. break;
  370. case 'checkbox'://多选框
  371. $data['value'] = json_decode($data['value'], true) ?: [];
  372. $parameter = explode("\n", $data['parameter']);
  373. $options = [];
  374. if ($parameter) {
  375. foreach ($parameter as $v) {
  376. $pdata = explode("=>", $v);
  377. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  378. }
  379. $formbuider[] = Form::checkbox($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13);
  380. }
  381. break;
  382. case 'select'://多选框
  383. $data['value'] = json_decode($data['value'], true) ?: [];
  384. $parameter = explode("\n", $data['parameter']);
  385. $options = [];
  386. if ($parameter) {
  387. foreach ($parameter as $v) {
  388. $pdata = explode("=>", $v);
  389. $options[] = ['label' => $pdata[1], 'value' => $pdata[0]];
  390. }
  391. $formbuider[] = Form::select($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13);
  392. }
  393. break;
  394. }
  395. }
  396. return $this->makePostForm($title, $formbuider, Url::buildUrl('/setting/config/save_basics'), 'POST');
  397. }
  398. /**
  399. * 保存数据
  400. * @return mixed
  401. * @throws DataNotFoundException
  402. * @throws DbException
  403. * @throws ModelNotFoundException
  404. */
  405. public function save_basics()
  406. {
  407. $request = $this->request;
  408. if ($request->isPost()) {
  409. $post = $request->post();
  410. foreach ($post as $k => $v) {
  411. if (is_array($v)) {
  412. $res = ConfigMerchantModel::merSet($this->merId)->where('menu_name', $k)->column('upload_type', 'type');
  413. if (!$res) {
  414. $res = ConfigModel::where('menu_name', $k)->column('upload_type', 'type');
  415. }
  416. foreach ($res as $kk => $vv) {
  417. if ($kk == 'upload') {
  418. if ($vv == 1 || $vv == 3) {
  419. $post[$k] = $v[0];
  420. }
  421. }
  422. }
  423. }
  424. }
  425. foreach ($post as $k => $v) {
  426. if($this->merId){
  427. if (!ConfigMerchantModel::merSet($this->merId)->where(['menu_name' => $k])->find()) {
  428. $data = ConfigModel::where(['menu_name' => $k])->find()->toArray();
  429. unset($data['id']);
  430. $data = array_merge($data, ['mer_id' => $this->merId, 'value' => json_encode($v)]);
  431. ConfigMerchantModel::create($data);
  432. } else {
  433. ConfigMerchantModel::merSet($this->merId)->where(['menu_name' => $k])->update(['value' => json_encode($v)]);
  434. }
  435. } else {
  436. ConfigModel::edit(['value' => json_encode($v)], $k, 'menu_name');
  437. }
  438. }
  439. return $this->success('修改成功');
  440. }
  441. return $this->fail('修改失败');
  442. }
  443. /**
  444. * @return mixed
  445. * @throws DataNotFoundException
  446. * @throws ModelNotFoundException
  447. * @throws Exception
  448. */
  449. public function header_basics()
  450. {
  451. [$type] = Util::getMore([
  452. [['type', 'd'], 0],
  453. ], $this->request, true);
  454. if ($type == 3) {//其它分类
  455. $config_tab = [];
  456. } else {
  457. $config_tab = ConfigModel::getConfigTabAll($type);
  458. if (is_object($config_tab)) {
  459. $config_tab = $config_tab->toArray();
  460. }
  461. foreach ($config_tab as &$item) {
  462. $item['children'] = ConfigModel::getConfigChildrenTabAll($item['value']);
  463. }
  464. }
  465. return $this->success(compact('config_tab'));
  466. }
  467. }