SystemConfig.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <?php
  2. namespace app\admin\controller\setting;
  3. use think\Exception;
  4. use think\facade\Route as Url;
  5. use app\admin\controller\AuthController;
  6. use app\admin\model\system\{
  7. SystemConfig as ConfigModel, SystemConfigTab as ConfigTabModel
  8. };
  9. use crmeb\services\{
  10. CacheService,
  11. FormBuilder as Form,
  12. UtilService as Util,
  13. JsonService as Json
  14. };
  15. use crmeb\services\upload\Upload;
  16. use think\Exception;
  17. /**
  18. * 配置列表控制器
  19. * Class SystemConfig
  20. * @package app\admin\controller\system
  21. */
  22. class SystemConfig extends AuthController
  23. {
  24. /**
  25. * 基础配置
  26. * */
  27. public function index()
  28. {
  29. [$type, $tab_id, $children_tab_id] = Util::getMore([
  30. ['type', 0],//配置类型
  31. ['tab_id', 1],//当前分类ID
  32. ['children_tab_id', null],//当前子集分类ID
  33. ], null, true);
  34. $config_tab = null;//顶级分类
  35. $children_config_tab = null;//二级分类
  36. if ($type == 3) {//其它分类
  37. $config_tab = null;
  38. } else {
  39. $config_tab = ConfigModel::getConfigTabAll($type);//获取一级tab
  40. }
  41. $children_config_tab = ConfigModel::getConfigChildrenTabAll($tab_id);//获取二级tab
  42. if (!$children_tab_id && $children_config_tab) {
  43. $children_tab_id = $children_config_tab[0]['id'];
  44. }
  45. if ($children_tab_id) {
  46. $tid = $children_tab_id;
  47. } else {
  48. $tid = $tab_id;
  49. }
  50. //获取分类配置参数
  51. $list = ConfigModel::getAll($tid);
  52. $formbuider = ConfigModel::builder_config_from_data($list);//生产表单json
  53. $form = Form::make_post_form('编辑配置', $formbuider, Url::buildUrl('save_basics'));
  54. $this->assign('tab_id', $tab_id);
  55. $this->assign('children_tab_id', $children_tab_id);
  56. $this->assign('config_tab', $config_tab);
  57. $this->assign('children_config_tab', $children_config_tab);
  58. $this->assign(compact('form'));
  59. $this->assign('list', $list);
  60. return $this->fetch();
  61. }
  62. /**
  63. * 基础配置 单个
  64. * @return mixed|void
  65. */
  66. public function index_alone()
  67. {
  68. $tab_id = input('tab_id');
  69. if (!$tab_id) return $this->failed('参数错误,请重新打开');
  70. $this->assign('tab_id', $tab_id);
  71. $list = ConfigModel::getAll($tab_id);
  72. foreach ($list as $k => $v) {
  73. if (!is_null(json_decode($v['value'])))
  74. $list[$k]['value'] = json_decode($v['value'], true);
  75. if ($v['type'] == 'upload' && !empty($v['value'])) {
  76. if ($v['upload_type'] == 1 || $v['upload_type'] == 3) $list[$k]['value'] = explode(',', $v['value']);
  77. }
  78. }
  79. $this->assign('list', $list);
  80. return $this->fetch();
  81. }
  82. /**
  83. * 添加字段
  84. * @return string
  85. * @throws \FormBuilder\exception\FormBuilderException
  86. */
  87. public function create()
  88. {
  89. $data = Util::getMore(['type',]);//接收参数
  90. $tab_id = !empty(request()->param('tab_id')) ? request()->param('tab_id') : 1;
  91. //前面通用字段
  92. $formbuiderheader = array();
  93. $formbuiderheader[] = Form::select('config_tab_id', '分类', 0)->setOptions(function () {
  94. $menuList = ConfigTabModel::field(['id', 'pid', 'title'])->select()->toArray();
  95. $list = sort_list_tier($menuList, '顶级', 'pid', 'id');
  96. $options = [['value' => 0, 'label' => '顶级按钮']];
  97. foreach ($list as $option) {
  98. $options[] = ['value' => $option['id'], 'label' => $option['html'] . $option['title']];
  99. }
  100. return $options;
  101. })->filterable(1);
  102. $formbuiderheader[] = Form::select('input_type', '类型')->setOptions(ConfigModel::texttype());
  103. $formbuiderheader[] = Form::input('info', '配置名称')->autofocus(1);
  104. $formbuiderheader[] = Form::input('menu_name', '字段变量')->placeholder('例如:site_url');
  105. $formbuiderheader[] = Form::input('desc', '配置简介');
  106. //不同类型不同字段
  107. $formbuider = array();
  108. switch ($data['type']) {
  109. case 0://文本框
  110. $formbuider = ConfigModel::createInputRule($tab_id);
  111. break;
  112. case 1://多行文本框
  113. $formbuider = ConfigModel::createTextAreaRule($tab_id);
  114. break;
  115. case 2://单选框
  116. $formbuider = ConfigModel::createRadioRule($tab_id);
  117. break;
  118. case 3://文件上传
  119. $formbuider = ConfigModel::createUploadRule($tab_id);
  120. break;
  121. case 4://多选框
  122. $formbuider = ConfigModel::createCheckboxRule($tab_id);
  123. break;
  124. case 5://下拉框
  125. $formbuider = ConfigModel::createSelectRule($tab_id);
  126. break;
  127. }
  128. //后面通用字段
  129. $formbuiderfoot = array();
  130. $formbuiderfoot[] = Form::number('sort', '排序');
  131. $formbuiderfoot[] = Form::radio('status', '状态', 1)->options(ConfigModel::formstatus());
  132. $formbuiders = array_merge($formbuiderheader, $formbuider, $formbuiderfoot);
  133. $form = Form::make_post_form('添加字段', $formbuiders, Url::buildUrl('save'));
  134. $this->assign(compact('form'));
  135. $this->assign('get', request()->param());
  136. return $this->fetch();
  137. }
  138. /**
  139. * 保存字段
  140. * */
  141. public function save()
  142. {
  143. $data = Util::postMore([
  144. 'menu_name',
  145. 'type',
  146. 'input_type',
  147. 'config_tab_id',
  148. 'parameter',
  149. 'upload_type',
  150. 'required',
  151. 'width',
  152. 'high',
  153. 'value',
  154. 'info',
  155. 'desc',
  156. 'sort',
  157. 'status',]);
  158. if (!$data['info']) return Json::fail('请输入配置名称');
  159. if (!$data['menu_name']) return Json::fail('请输入字段名称');
  160. if ($data['menu_name']) {
  161. $oneConfig = ConfigModel::getOneConfig('menu_name', $data['menu_name']);
  162. if (!empty($oneConfig)) return Json::fail('请重新输入字段名称,之前的已经使用过了');
  163. }
  164. if (!$data['desc']) return Json::fail('请输入配置简介');
  165. if ($data['sort'] < 0) {
  166. $data['sort'] = 0;
  167. }
  168. if ($data['type'] == 'text') {
  169. if (!ConfigModel::valiDateTextRole($data)) return Json::fail(ConfigModel::getErrorInfo());
  170. }
  171. if ($data['type'] == 'textarea') {
  172. if (!ConfigModel::valiDateTextareaRole($data)) return Json::fail(ConfigModel::getErrorInfo());
  173. }
  174. $data['parameter'] = htmlspecialchars_decode($data['parameter']);
  175. if ($data['type'] == 'radio' || $data['type'] == 'checkbox') {
  176. if (!$data['parameter']) return Json::fail('请输入配置参数');
  177. if (!ConfigModel::valiDateRadioAndCheckbox($data)) return Json::fail(ConfigModel::getErrorInfo());
  178. $data['value'] = json_encode($data['value']);
  179. }
  180. ConfigModel::create($data);
  181. CacheService::clear();
  182. return Json::successful('添加菜单成功!');
  183. }
  184. /**
  185. * @param $id
  186. */
  187. public function update_config($id)
  188. {
  189. $type = request()->post('type');
  190. if ($type == 'text' || $type == 'textarea' || $type == 'radio' || ($type == 'upload' && (request()->post('upload_type') == 1 || request()->post('upload_type') == 3))) {
  191. $value = request()->post('value');
  192. } else {
  193. $value = request()->post('value/a');
  194. }
  195. $data = Util::postMore(['status', 'info', 'desc', 'sort', 'config_tab_id', 'required', 'parameter', ['value', $value], 'upload_type', 'input_type']);
  196. $data['value'] = htmlspecialchars_decode(json_encode($data['value']));
  197. $data['parameter'] = htmlspecialchars_decode($data['parameter']);
  198. if (!ConfigModel::get($id)) return Json::fail('编辑的记录不存在!');
  199. ConfigModel::edit($data, $id);
  200. return Json::successful('修改成功!');
  201. }
  202. /**
  203. * 修改是否显示子子段
  204. * @param $id
  205. * @return mixed
  206. */
  207. public function edit_config($id)
  208. {
  209. $menu = ConfigModel::get($id)->getData();
  210. if (!$menu) return Json::fail('数据不存在!');
  211. $formbuider = array();
  212. $formbuider[] = Form::input('menu_name', '字段变量', $menu['menu_name'])->disabled(1);
  213. $formbuider[] = Form::hidden('type', $menu['type']);
  214. // $formbuider[] = Form::select('config_tab_id', '分类', (string)$menu['config_tab_id'])->setOptions(ConfigModel::getConfigTabAll(-1));
  215. $formbuider[] = Form::select('config_tab_id', '分类', (string)$menu['config_tab_id'])->setOptions(function () {
  216. $menuList = ConfigTabModel::field(['id', 'pid', 'title'])->select()->toArray();
  217. $list = sort_list_tier($menuList, '顶级', 'pid', 'id');
  218. $options = [['value' => 0, 'label' => '顶级按钮']];
  219. foreach ($list as $option) {
  220. $options[] = ['value' => $option['id'], 'label' => $option['html'] . $option['title']];
  221. }
  222. return $options;
  223. })->filterable(1);
  224. $formbuider[] = Form::input('info', '配置名称', $menu['info'])->autofocus(1);
  225. $formbuider[] = Form::input('desc', '配置简介', $menu['desc']);
  226. switch ($menu['type']) {
  227. case 'text':
  228. $menu['value'] = json_decode($menu['value'], true);
  229. $formbuider[] = Form::select('input_type', '类型', $menu['input_type'])->setOptions(ConfigModel::texttype());
  230. //输入框验证规则
  231. $formbuider[] = Form::input('value', '默认值', $menu['value']);
  232. if (!empty($menu['required'])) {
  233. $formbuider[] = Form::number('width', '文本框宽(%)', $menu['width']);
  234. $formbuider[] = Form::input('required', '验证规则', $menu['required'])->placeholder('多个请用,隔开例如:required:true,url:true');
  235. }
  236. break;
  237. case 'textarea':
  238. $menu['value'] = json_decode($menu['value'], true);
  239. //多行文本
  240. if (!empty($menu['high'])) {
  241. $formbuider[] = Form::textarea('value', '默认值', $menu['value'])->rows(5);
  242. $formbuider[] = Form::number('width', '文本框宽(%)', $menu['width']);
  243. $formbuider[] = Form::number('high', '多行文本框高(%)', $menu['high']);
  244. } else {
  245. $formbuider[] = Form::input('value', '默认值', $menu['value']);
  246. }
  247. break;
  248. case 'radio':
  249. $menu['value'] = json_decode($menu['value'], true);
  250. $parameter = explode("\n", htmlspecialchars_decode($menu['parameter']));
  251. $options = [];
  252. if ($parameter) {
  253. foreach ($parameter as $v) {
  254. $data = explode("=>", $v);
  255. $options[] = ['label' => $data[1], 'value' => $data[0]];
  256. }
  257. $formbuider[] = Form::radio('value', '默认值', $menu['value'])->options($options);
  258. }
  259. //单选和多选参数配置
  260. if (!empty($menu['parameter'])) {
  261. $formbuider[] = Form::textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=白色\n2=红色\n3=黑色");
  262. }
  263. break;
  264. case 'checkbox':
  265. $menu['value'] = json_decode($menu['value'], true) ?: [];
  266. $parameter = explode("\n", htmlspecialchars_decode($menu['parameter']));
  267. $options = [];
  268. if ($parameter) {
  269. foreach ($parameter as $v) {
  270. $data = explode("=>", $v);
  271. $options[] = ['label' => $data[1], 'value' => $data[0]];
  272. }
  273. $formbuider[] = Form::checkbox('value', '默认值', $menu['value'])->options($options);
  274. }
  275. //单选和多选参数配置
  276. if (!empty($menu['parameter'])) {
  277. $formbuider[] = Form::textarea('parameter', '配置参数', $menu['parameter'])->placeholder("参数方式例如:\n1=白色\n2=红色\n3=黑色");
  278. }
  279. break;
  280. case 'upload':
  281. if ($menu['upload_type'] == 1) {
  282. $menu['value'] = json_decode($menu['value'], true);
  283. $formbuider[] = Form::frameImageOne('value', '图片', Url::buildUrl('admin/widget.images/index', array('fodder' => 'value')), (string)$menu['value'])->icon('image')->width('100%')->height('550px');
  284. } elseif ($menu['upload_type'] == 2) {
  285. $menu['value'] = json_decode($menu['value'], true) ?: [];
  286. $formbuider[] = Form::frameImages('value', '多图片', Url::buildUrl('admin/widget.images/index', array('fodder' => 'value')), $menu['value'])->maxLength(5)->icon('images')->width('100%')->height('550px')->spin(0);
  287. } else {
  288. $menu['value'] = json_decode($menu['value'], true);
  289. $formbuider[] = Form::uploadFileOne('value', '文件', Url::buildUrl('file_upload'), $menu['value'])->name('file');
  290. }
  291. //上传类型选择
  292. if (!empty($menu['upload_type'])) {
  293. $formbuider[] = Form::radio('upload_type', '上传类型', $menu['upload_type'])->options([['value' => 1, 'label' => '单图'], ['value' => 2, 'label' => '多图'], ['value' => 3, 'label' => '文件']]);
  294. }
  295. break;
  296. }
  297. $formbuider[] = Form::number('sort', '排序', $menu['sort']);
  298. $formbuider[] = Form::radio('status', '状态', $menu['status'])->options([['value' => 1, 'label' => '显示'], ['value' => 2, 'label' => '隐藏']]);
  299. $form = Form::make_post_form('编辑字段', $formbuider, Url::buildUrl('update_config', array('id' => $id)));
  300. $this->assign(compact('form'));
  301. return $this->fetch('public/form-builder');
  302. }
  303. /**
  304. * 删除子字段
  305. * @return \think\response\Json
  306. */
  307. public function delete_config()
  308. {
  309. $id = input('id');
  310. if (!ConfigModel::del($id)) {
  311. return Json::fail(ConfigModel::getErrorInfo('删除失败,请稍候再试!'));
  312. } else {
  313. CacheService::clear();
  314. return Json::successful('删除成功!');
  315. }
  316. }
  317. /**
  318. * 保存数据 true
  319. * */
  320. public function save_basics()
  321. {
  322. $request = app('request');
  323. if ($request->isPost()) {
  324. $post = $request->post();
  325. foreach ($post as $k => $v) {
  326. if (is_array($v)) {
  327. $res = ConfigModel::where('menu_name', $k)->column('upload_type', 'type');
  328. foreach ($res as $kk => $vv) {
  329. if ($kk == 'upload') {
  330. if ($vv == 1 || $vv == 3) {
  331. $post[$k] = $v[0];
  332. }
  333. }
  334. }
  335. }
  336. }
  337. foreach ($post as $k => $v) {
  338. ConfigModel::edit(['value' => json_encode($v)], $k, 'menu_name');
  339. }
  340. try {
  341. CacheService::clear();
  342. } catch (Exception $e) {
  343. var_dump($e->getMessage());
  344. }
  345. return $this->successful('修改成功');
  346. }
  347. return $this->fail('修改失败');
  348. }
  349. /**
  350. * 文件上传
  351. * */
  352. public function file_upload()
  353. {
  354. $upload = new Upload('local');
  355. $res = $upload->to('config/file')->validate()->move($this->request->param('file', 'file'));
  356. if ($res === false) return Json::fail($upload->getError());
  357. return Json::successful('上传成功!', ['filePath' => $res->filePath]);
  358. }
  359. }