Access.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. <?php
  2. /**
  3. *
  4. * @copyright ©2020 点小铺
  5. * @author hanj
  6. * @link: https://dyuit.com
  7. * Created by VSCode
  8. */
  9. namespace app\admin\model\store;
  10. use app\common\model\store\Access as AccessModel;
  11. /**
  12. * 商家用户权限模型
  13. * Class Access
  14. * @package app\admin\model\store
  15. */
  16. class Access extends AccessModel
  17. {
  18. /**
  19. * 获取权限列表
  20. * @throws \think\Exception
  21. * @throws \think\db\exception\DataNotFoundException
  22. * @throws \think\db\exception\ModelNotFoundException
  23. * @throws \think\exception\DbException
  24. */
  25. public function getList()
  26. {
  27. $all = static::getAll();
  28. return $this->formatTreeData($all);
  29. }
  30. /**
  31. * 新增记录
  32. * @param $data
  33. * @return false|int
  34. */
  35. public function add($data)
  36. {
  37. $data['wxapp_id'] = self::$wxapp_id;
  38. return $this->allowField(true)->save($data);
  39. }
  40. /**
  41. * 更新记录
  42. * @param $data
  43. * @return bool
  44. * @throws \think\db\exception\DataNotFoundException
  45. * @throws \think\db\exception\ModelNotFoundException
  46. * @throws \think\exception\DbException
  47. */
  48. public function edit($data)
  49. {
  50. // 判断上级角色是否为当前子级
  51. if ($data['parent_id'] > 0) {
  52. // 获取所有上级id集
  53. $parentIds = $this->getTopAccessIds($data['parent_id']);
  54. if (in_array($this['access_id'], $parentIds)) {
  55. $this->error = '上级权限不允许设置为当前子权限';
  56. return false;
  57. }
  58. }
  59. return $this->allowField(true)->save($data) !== false;
  60. }
  61. /**
  62. * 删除权限
  63. * @return bool|int
  64. * @throws \think\exception\DbException
  65. */
  66. public function remove()
  67. {
  68. // 判断是否存在下级权限
  69. if (self::detail(['parent_id' => $this['access_id']])) {
  70. $this->error = '当前权限下存在子权限,请先删除';
  71. return false;
  72. }
  73. return $this->delete();
  74. }
  75. /**
  76. * 获取所有上级id集
  77. * @param $access_id
  78. * @param null $all
  79. * @return array
  80. * @throws \think\db\exception\DataNotFoundException
  81. * @throws \think\db\exception\ModelNotFoundException
  82. * @throws \think\exception\DbException
  83. */
  84. private function getTopAccessIds($access_id, &$all = null)
  85. {
  86. static $ids = [];
  87. is_null($all) && $all = $this->getAll();
  88. foreach ($all as $item) {
  89. if ($item['access_id'] == $access_id && $item['parent_id'] > 0) {
  90. $ids[] = $item['parent_id'];
  91. $this->getTopAccessIds($item['parent_id'], $all);
  92. }
  93. }
  94. return $ids;
  95. }
  96. /**
  97. * 获取权限列表
  98. * @param $all
  99. * @param int $parent_id
  100. * @param int $deep
  101. * @return array
  102. */
  103. private function formatTreeData(&$all, $parent_id = 0, $deep = 1)
  104. {
  105. static $tempTreeArr = [];
  106. foreach ($all as $key => $val) {
  107. if ($val['parent_id'] == $parent_id) {
  108. // 记录深度
  109. $val['deep'] = $deep;
  110. // 根据角色深度处理名称前缀
  111. $val['name_h1'] = $this->htmlPrefix($deep) . $val['name'];
  112. $tempTreeArr[] = $val;
  113. $this->formatTreeData($all, $val['access_id'], $deep + 1);
  114. }
  115. }
  116. return $tempTreeArr;
  117. }
  118. private function htmlPrefix($deep)
  119. {
  120. // 根据角色深度处理名称前缀
  121. $prefix = '';
  122. if ($deep > 1) {
  123. for ($i = 1; $i <= $deep - 1; $i++) {
  124. $prefix .= '&nbsp;&nbsp;&nbsp;├ ';
  125. }
  126. $prefix .= '&nbsp;';
  127. }
  128. return $prefix;
  129. }
  130. /**
  131. * 新增默认权限
  132. */
  133. public function insertDefault()
  134. {
  135. $defaultData = $this->defaultData();
  136. $this->buildData($defaultData);
  137. }
  138. /**
  139. * 生成并写入默认数据
  140. * @param $defaultData
  141. * @param int $parent_id
  142. */
  143. private function buildData(&$defaultData, $parent_id = 0)
  144. {
  145. foreach ($defaultData as $key => $item) {
  146. // 保存数据
  147. $model = new static;
  148. $model->save([
  149. 'name' => $item['name'],
  150. 'url' => $item['url'],
  151. 'parent_id' => $parent_id,
  152. 'sort' => 100,
  153. ]);
  154. if (isset($item['subset']) && !empty($item['subset'])) {
  155. $this->buildData($item['subset'], $model['access_id']);
  156. }
  157. }
  158. }
  159. /**
  160. * 默认权限数据
  161. * @return array
  162. */
  163. private function defaultData()
  164. {
  165. return [
  166. [
  167. 'name' => '首页',
  168. 'url' => 'index/index'
  169. ],
  170. [
  171. 'name' => '管理员',
  172. 'url' => 'store',
  173. 'subset' => [
  174. [
  175. 'name' => '管理员管理',
  176. 'url' => 'store.user',
  177. 'subset' => [
  178. [
  179. 'name' => '管理员列表',
  180. 'url' => 'store.user/index'
  181. ],
  182. [
  183. 'name' => '添加管理员',
  184. 'url' => 'store.user/add'
  185. ],
  186. [
  187. 'name' => '编辑管理员',
  188. 'url' => 'store.user/edit'
  189. ],
  190. [
  191. 'name' => '删除管理员',
  192. 'url' => 'store.user/delete'
  193. ],
  194. ]
  195. ],
  196. [
  197. 'name' => '角色管理',
  198. 'url' => 'store.role',
  199. 'subset' => [
  200. [
  201. 'name' => '角色列表',
  202. 'url' => 'store.role/index'
  203. ],
  204. [
  205. 'name' => '添加角色',
  206. 'url' => 'store.role/add'
  207. ],
  208. [
  209. 'name' => '编辑角色',
  210. 'url' => 'store.role/edit'
  211. ],
  212. [
  213. 'name' => '删除角色',
  214. 'url' => 'store.role/delete'
  215. ],
  216. ]
  217. ],
  218. [
  219. 'name' => '权限管理',
  220. 'url' => 'store.access',
  221. 'subset' => [
  222. [
  223. 'name' => '权限列表',
  224. 'url' => 'store.access/index'
  225. ],
  226. [
  227. 'name' => '添加权限',
  228. 'url' => 'store.access/add'
  229. ],
  230. [
  231. 'name' => '编辑权限',
  232. 'url' => 'store.access/edit'
  233. ],
  234. [
  235. 'name' => '删除权限',
  236. 'url' => 'store.access/delete'
  237. ],
  238. ]
  239. ],
  240. ]
  241. ],
  242. [
  243. 'name' => '商品管理',
  244. 'url' => 'goods',
  245. 'subset' => [
  246. [
  247. 'name' => '商品管理',
  248. 'url' => 'goods',
  249. 'subset' => [
  250. [
  251. 'name' => '商品列表',
  252. 'url' => 'goods/index',
  253. ],
  254. [
  255. 'name' => '添加商品',
  256. 'url' => 'goods/add',
  257. ],
  258. [
  259. 'name' => '编辑商品',
  260. 'url' => 'goods/edit',
  261. ],
  262. [
  263. 'name' => '复制商品',
  264. 'url' => 'goods/copy',
  265. ],
  266. [
  267. 'name' => '删除商品',
  268. 'url' => 'goods/delete',
  269. ],
  270. [
  271. 'name' => '商品上下架',
  272. 'url' => 'goods/state',
  273. ],
  274. ]
  275. ],
  276. [
  277. 'name' => '商品分类',
  278. 'url' => 'goods.category',
  279. 'subset' => [
  280. [
  281. 'name' => '分类列表',
  282. 'url' => 'goods.category/index',
  283. ],
  284. [
  285. 'name' => '添加分类',
  286. 'url' => 'goods.category/add',
  287. ],
  288. [
  289. 'name' => '编辑分类',
  290. 'url' => 'goods.category/edit',
  291. ],
  292. [
  293. 'name' => '删除分类',
  294. 'url' => 'goods.category/delete',
  295. ],
  296. ],
  297. ],
  298. [
  299. 'name' => '商品评价',
  300. 'url' => 'goods.comment',
  301. 'subset' => [
  302. [
  303. 'name' => '评价列表',
  304. 'url' => 'goods.comment/index',
  305. ],
  306. [
  307. 'name' => '评价详情',
  308. 'url' => 'goods.comment/detail',
  309. ],
  310. [
  311. 'name' => '删除评价',
  312. 'url' => 'goods.comment/delete',
  313. ],
  314. ],
  315. ],
  316. ]
  317. ],
  318. [
  319. 'name' => '订单管理',
  320. 'url' => 'order',
  321. 'subset' => [
  322. [
  323. 'name' => '订单列表',
  324. 'url' => '',
  325. 'subset' => [
  326. [
  327. 'name' => '待发货',
  328. 'url' => 'order/delivery_list'
  329. ],
  330. [
  331. 'name' => '待收货',
  332. 'url' => 'order/receipt_list'
  333. ],
  334. [
  335. 'name' => '待付款',
  336. 'url' => 'order/pay_list'
  337. ],
  338. [
  339. 'name' => '已完成',
  340. 'url' => 'order/complete_list'
  341. ],
  342. [
  343. 'name' => '已取消',
  344. 'url' => 'order/cancel_list'
  345. ],
  346. [
  347. 'name' => '全部订单',
  348. 'url' => 'order/all_list',
  349. ],
  350. ]
  351. ],
  352. [
  353. 'name' => '订单详情',
  354. 'url' => '',
  355. 'subset' => [
  356. [
  357. 'name' => '详情信息',
  358. 'url' => 'order/detail',
  359. ],
  360. [
  361. 'name' => '确认发货',
  362. 'url' => 'order/delivery',
  363. ],
  364. [
  365. 'name' => '修改订单价格',
  366. 'url' => 'order/updateprice',
  367. ],
  368. ]
  369. ],
  370. [
  371. 'name' => '订单导出',
  372. 'url' => 'order.operate/export',
  373. ],
  374. [
  375. 'name' => '批量发货',
  376. 'url' => 'order.operate/batchdelivery',
  377. ],
  378. ]
  379. ],
  380. [
  381. 'name' => '用户管理',
  382. 'url' => 'user',
  383. 'subset' => [
  384. [
  385. 'name' => '用户列表',
  386. 'url' => 'user/index'
  387. ],
  388. [
  389. 'name' => '删除用户',
  390. 'url' => 'user/delete'
  391. ],
  392. ]
  393. ],
  394. [
  395. 'name' => '营销设置',
  396. 'url' => 'market',
  397. 'subset' => [
  398. [
  399. 'name' => '优惠券',
  400. 'url' => 'coupon',
  401. 'subset' => [
  402. [
  403. 'name' => '优惠券列表',
  404. 'url' => 'market.coupon/index',
  405. ],
  406. [
  407. 'name' => '新增优惠券',
  408. 'url' => 'market.coupon/add',
  409. ],
  410. [
  411. 'name' => '编辑优惠券',
  412. 'url' => 'market.coupon/edit',
  413. ],
  414. [
  415. 'name' => '删除优惠券',
  416. 'url' => 'market.coupon/delete',
  417. ],
  418. [
  419. 'name' => '领取记录',
  420. 'url' => 'market.coupon/receive',
  421. ]
  422. ]
  423. ]
  424. ]
  425. ],
  426. [
  427. 'name' => '小程序',
  428. 'url' => 'wxapp',
  429. 'subset' => [
  430. [
  431. 'name' => '小程序设置',
  432. 'url' => 'wxapp/setting',
  433. ],
  434. [
  435. 'name' => '页面管理',
  436. 'url' => 'wxapp.page',
  437. 'subset' => [
  438. [
  439. 'name' => '页面设计',
  440. 'url' => '',
  441. 'subset' => [
  442. [
  443. 'name' => '页面列表',
  444. 'url' => 'wxapp.page/index',
  445. ],
  446. [
  447. 'name' => '新增页面',
  448. 'url' => 'wxapp.page/add',
  449. ],
  450. [
  451. 'name' => '编辑页面',
  452. 'url' => 'wxapp.page/edit',
  453. ],
  454. [
  455. 'name' => '设为首页',
  456. 'url' => 'wxapp.page/sethome',
  457. ],
  458. ]
  459. ],
  460. [
  461. 'name' => '分类页模板',
  462. 'url' => 'wxapp.page/category',
  463. ],
  464. [
  465. 'name' => '页面链接',
  466. 'url' => 'wxapp.page/links',
  467. ],
  468. ]
  469. ],
  470. [
  471. 'name' => '帮助中心',
  472. 'url' => 'wxapp.help',
  473. 'subset' => [
  474. [
  475. 'name' => '帮助列表',
  476. 'url' => 'wxapp.help/index',
  477. ],
  478. [
  479. 'name' => '新增帮助',
  480. 'url' => 'wxapp.help/add',
  481. ],
  482. [
  483. 'name' => '编辑帮助',
  484. 'url' => 'wxapp.help/edit',
  485. ],
  486. [
  487. 'name' => '删除帮助',
  488. 'url' => 'wxapp.help/delete',
  489. ],
  490. ]
  491. ],
  492. ]
  493. ],
  494. [
  495. 'name' => '应用中心',
  496. 'url' => 'apps',
  497. 'subset' => [
  498. [
  499. 'name' => '分销中心',
  500. 'url' => 'apps.dealer',
  501. 'subset' => [
  502. [
  503. 'name' => '入驻申请',
  504. 'url' => 'apps.dealer.apply',
  505. 'subset' => [
  506. [
  507. 'name' => '申请列表',
  508. 'url' => 'apps.dealer.apply/index'
  509. ],
  510. [
  511. 'name' => '分销商审核',
  512. 'url' => 'apps.dealer.apply/submit'
  513. ]
  514. ]
  515. ],
  516. [
  517. 'name' => '分销商用户',
  518. 'url' => 'apps.dealer.user',
  519. 'subset' => [
  520. [
  521. 'name' => '分销商列表',
  522. 'url' => 'apps.dealer.user/index',
  523. ],
  524. [
  525. 'name' => '删除分销商',
  526. 'url' => 'apps.dealer.user/delete'
  527. ],
  528. [
  529. 'name' => '分销商二维码',
  530. 'url' => 'apps.dealer.user/qrcode'
  531. ]
  532. ]
  533. ],
  534. [
  535. 'name' => '分销订单',
  536. 'url' => 'apps.dealer.order/index',
  537. ],
  538. [
  539. 'name' => '提现申请',
  540. 'url' => 'apps.dealer.withdraw',
  541. 'subset' => [
  542. [
  543. 'name' => '申请列表',
  544. 'url' => 'apps.dealer.withdraw/index',
  545. ],
  546. [
  547. 'name' => '提现审核',
  548. 'url' => 'apps.dealer.withdraw/submit'
  549. ],
  550. [
  551. 'name' => '确认打款',
  552. 'url' => 'apps.dealer.withdraw/money'
  553. ]
  554. ]
  555. ],
  556. [
  557. 'name' => '分销设置',
  558. 'url' => 'apps.dealer.setting/index',
  559. ],
  560. [
  561. 'name' => '分销海报',
  562. 'url' => 'apps.dealer.setting/qrcode',
  563. ],
  564. ]
  565. ],
  566. ]
  567. ],
  568. [
  569. 'name' => '设置',
  570. 'url' => 'setting',
  571. 'subset' => [
  572. [
  573. 'name' => '商城设置',
  574. 'url' => 'setting/store',
  575. ],
  576. [
  577. 'name' => '交易设置',
  578. 'url' => 'setting/trade',
  579. ],
  580. [
  581. 'name' => '配送设置',
  582. 'url' => 'setting.delivery',
  583. 'subset' => [
  584. [
  585. 'name' => '运费模板列表',
  586. 'url' => 'setting.delivery/index'
  587. ],
  588. [
  589. 'name' => '新增运费模板',
  590. 'url' => 'setting.delivery/add'
  591. ],
  592. [
  593. 'name' => '编辑运费模板',
  594. 'url' => 'setting.delivery/edit'
  595. ],
  596. [
  597. 'name' => '删除运费模板',
  598. 'url' => 'setting.delivery/delete'
  599. ],
  600. ]
  601. ],
  602. [
  603. 'name' => '物流公司',
  604. 'url' => 'setting.express',
  605. 'subset' => [
  606. [
  607. 'name' => '物流公司列表',
  608. 'url' => 'setting.express/index'
  609. ],
  610. [
  611. 'name' => '新增物流公司',
  612. 'url' => 'setting.express/add'
  613. ],
  614. [
  615. 'name' => '编辑物流公司',
  616. 'url' => 'setting.express/edit'
  617. ],
  618. [
  619. 'name' => '删除物流公司',
  620. 'url' => 'setting.express/delete'
  621. ],
  622. ]
  623. ],
  624. [
  625. 'name' => '短信通知',
  626. 'url' => 'setting/sms',
  627. ],
  628. [
  629. 'name' => '模板消息',
  630. 'url' => 'setting/tplmsg',
  631. ],
  632. [
  633. 'name' => '上传设置',
  634. 'url' => 'setting/storage',
  635. ],
  636. [
  637. 'name' => '其他',
  638. 'url' => '',
  639. 'subset' => [
  640. [
  641. 'name' => '清理缓存',
  642. 'url' => 'setting.cache/clear',
  643. ],
  644. ]
  645. ]
  646. ]
  647. ],
  648. ];
  649. }
  650. }