formPageIndexTrait.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <?php
  2. namespace App\Admin\Controllers\Traits\WxSettingTraits;
  3. use App\Admin\Renderable\BannerRender;
  4. use App\Admin\Renderable\CircleRender;
  5. use App\Admin\Renderable\IconRender;
  6. use App\Admin\Renderable\PlateRender;
  7. use App\Jobs\System\SettingImgToJpgJob;
  8. use App\Models\Circle\WxCircle;
  9. use App\Models\WxIcon;
  10. use App\Models\WxPlate;
  11. use App\Models\Shop\WxShopClassify;
  12. use App\Models\WxSlideshow;
  13. use App\Wen\Utils\AdminUtils;
  14. use App\Wen\Utils\FieldUtils;
  15. use App\Wen\Utils\GatewayUtils;
  16. use App\Wen\Utils\Settings;
  17. use App\Wen\Utils\SiteUtils;
  18. use Dcat\Admin\Form\NestedForm;
  19. use Dcat\Admin\Widgets\Form;
  20. use Dcat\Admin\Widgets\Tooltip;
  21. use Illuminate\Http\Request;
  22. use Dcat\Admin\Layout\Content;
  23. use Illuminate\Support\Facades\Cache;
  24. trait formPageIndexTrait{
  25. public function index_pageindex(Content $content)
  26. {
  27. return $content->title('首页')
  28. // ->body($this->buildPreviewButton())
  29. // ->body($this->newline())
  30. ->body(
  31. <<<HTML
  32. <div class="card">{$this->form_pageindex()->render()}</div>
  33. HTML
  34. );
  35. }
  36. protected function form_pageindex(){
  37. $form = new Form();
  38. $form->confirm('您确定要提交表单吗?', 'content');
  39. $form->disableResetButton();
  40. $form->tab('首页', function (Form $form){
  41. global $__MINI_GLOBAL_TENANT_ID__;
  42. if($__MINI_GLOBAL_TENANT_ID__ == 0){
  43. $form->radio('app_index_top_nav_style', '顶部头部风格')->options([0=>'关注 推荐 附近', 1=>'搜索轮播'])->default(Settings::get('app_index_top_nav_style', 0));
  44. $form->divider();
  45. $form->html(function () {
  46. return '<div>---------------------------------------------------------------------------------</div>';
  47. }, '<b>小程序</b>');
  48. $form->multipleSelectTable('app_index_header_icon', '头部左右侧')
  49. ->title('图标库')
  50. ->max(2)
  51. ->from(IconRender::make())
  52. ->model(WxIcon::class, 'id', 'name', 'selectTable:formPageIndexTrait:app_index_header_icon')
  53. ->help('添加两个,分别是左右侧,小程序不显示右侧, <a href="'.admin_url('settings/icons').'" target="_blank">管理图标库>></a><a href="https://doc.minisns.cn/doc/70/" target="_blank" style="color: red;">(ps:如何控制顺序?)&nbsp;</a>')
  54. ->default(Settings::get('app_index_header_icon', ''));
  55. $form->html(function () {
  56. return '<div>---------------------------------------------------------------------------------</div>';
  57. }, '<b>App</b>');
  58. $form->multipleSelectTable('app_app_index_header_icon', '头部左右侧')
  59. ->title('图标库')
  60. ->max(2)
  61. ->from(IconRender::make())
  62. ->model(WxIcon::class, 'id', 'name', 'selectTable:formPageIndexTrait:app_app_index_header_icon')
  63. ->help('添加两个,分别是左右侧,小程序不显示右侧, <a href="'.admin_url('settings/icons').'" target="_blank">管理图标库>></a><a href="https://doc.minisns.cn/doc/70/" target="_blank" style="color: red;">(ps:如何控制顺序?)&nbsp;</a>')
  64. ->default(Settings::get('app_app_index_header_icon', ''));
  65. $form->text('app_search_carousel', '搜索提示上下轮播')->help('就是首页搜索框里面的灰色字,用|号隔开')->default(Settings::get('app_search_carousel', '搜索笔记/'.env('circle_call', '圈子').'/用户|在这里写下你想寻找的'));
  66. $form->divider();
  67. }else{
  68. if(Settings::get('app_index_top_nav_style', 0) == 1){
  69. $form->text('app_search_carousel', '搜索提示上下轮播')->help('就是首页搜索框里面的灰色字,用|号隔开')->default(Settings::get('app_search_carousel', '搜索笔记/'.env('circle_call', '圈子').'/用户|在这里写下你想寻找的',true));
  70. $form->divider();
  71. }
  72. }
  73. if($__MINI_GLOBAL_TENANT_ID__ > 0){
  74. $form->text('app_multi_index_text_share', '分享标题')->placeholder(Settings::get('app_share_right', ''))->default(Settings::get('app_multi_index_text_share', '', true));
  75. $form->image('app_multi_index_img_share', '分享图片')->help('<a href="'.Settings::get('img_share_default', '').'" download="dafault.jpg" target="_blank" style="color: steelblue">点击下载默认图</a>,和默认图大小差不多就行')->url('files/uploads')->uniqueName()->autoUpload()->default(Settings::get('app_multi_index_img_share', '', true));
  76. $form->divider();
  77. }
  78. $form->html(function () {
  79. return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;display: inline-block"><img src="https://img.mini.minisns.cn/images/index_tab.jpg"></div>';
  80. }, '');
  81. $form->html(function () {
  82. return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;">小提示:<br>1、你选择tab为“其他”类型时才需要配置跳转类型和id。<br>2、tab类型选择“板块”时,如果你不想用户重复添加这个板块,那么你就把tab“名字”写成板块的名字,相同的名字前端会去重处理<br>3、瀑布流控制不一定对所有tab都有效,有些强制瀑布流<br>4、icon正常不用配置,如果你需要,你也可以加,点击查看<a href="https://img.mini.minisns.cn/icons/icontip.jpg" target="_blank">使用说明</a>
  83. <br>5、选择圈子类型时,可以在“跳转id”配置多个'.env('circle_call', '圈子').'id,用英文逗号隔开,请看<a href="https://img.mini.minisns.cn/hbx/circle_tip.png" target="_blank">教程</a></div>';
  84. }, '');
  85. $form->table('app_index_tab','固定tab自定义', function (NestedForm $table) {
  86. $table->text('plate_name', '名字')->required();
  87. $table->text('icon', '图标')->help('mini-xxx');
  88. $table->select('show', '显示方式')->options([0=>'图标+名字', 1=>'仅显示图标']);
  89. $table->radio('type', '类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;')->options(
  90. [0 => '关注', 1 => '推荐', 2 => '热门-全站', 9=>'热门-仅本站', 3=>'好物',4=>'板块', 5=>'视频',6=>'长图文', 7=>'附近', 8=>env('circle_call', '圈子'), 999=>'其他']
  91. )->required()->default(1);
  92. $table->switch('waterfall', '列表式/瀑布流');
  93. $table->switch('force', '是否强制');
  94. $table->multipleSelectTable('plate_ids', '板块(板块类型时)')->title('板块库')
  95. ->max(10)
  96. ->from(PlateRender::make())
  97. ->model(WxPlate::class, 'id', 'plate_name', 'selectTable:formPageIndexTrait:app_index_tab:plate_ids')
  98. ->help('允许选择多个,<a href="'.admin_url('plate').'" target="_blank">管理板块>></a>');
  99. $table->select('target_type', '跳转类型(其他类型时)')->options(FieldUtils::getUrlTypes())->default(0);
  100. $table->text('target', '跳转id(其他类型时)')->help('怎么填请看<a href="https://doc.minisns.cn/doc/44/" target="_blank">路径大全</a>');
  101. })->default(Settings::get('app_index_tab', '',true));
  102. });
  103. $form->tab('推荐tab', function (Form $form) {
  104. $form->multipleSelectTable('app_index_banner', '轮播图')
  105. ->title('轮播图库')
  106. ->max(10)
  107. ->from(BannerRender::make())
  108. ->model(WxSlideshow::class, 'id', 'id', 'selectTable:formPageIndexTrait:app_index_banner')
  109. ->help('<a href="'.admin_url('slideshow').'" target="_blank">运营管理-轮播图中心</a><a href="https://doc.minisns.cn/doc/70/" target="_blank" style="color: red;">(ps:如何控制顺序?)&nbsp;</a>')
  110. ->default(Settings::get('app_index_banner', '',true));
  111. $form->number('app_index_banner_height', '轮播图高度')->help('默认是300rpx')->default(Settings::get('app_index_banner_height', 300,true));
  112. $form->divider();
  113. $form->table('app_index_notice','垂直滚动通知1', function (NestedForm $table) {
  114. $table->text('text', '文本')->default('文字');
  115. $table->image('img', '左侧图')->help('<a href="https://img.mini.minisns.cn/2023/06/23/c8186968da891a2dac10ff5d4fbe0351.png" download="app_share_vip_img.jpg" target="_blank" style="color: steelblue">点击下载默认图</a>')->default('https://img.mini.minisns.cn/2023/06/23/c8186968da891a2dac10ff5d4fbe0351.png')->uniqueName()->url('files/uploads')->autoUpload();
  116. $table->radio('type', '类型')->options(FieldUtils::getUrlTypes())->default(0);
  117. $table->text('target', '跳转id')->help('怎么填请看<a href="https://doc.minisns.cn/doc/44/" target="_blank">路径大全</a>');
  118. })->default(Settings::get('app_index_notice', '',true));
  119. $form->divider();
  120. $form->html(function () {
  121. return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;">简单说明一下:<br>1、每行多少个是根据后台配置了多少个菜单除以2,如你配置了16个菜单,那么每行就是8个,配置了100个菜单,那每行是50个<br>2、跳转id怎么填,请看<a href="https://doc.minisns.cn/doc/44/" target="_blank">这里</a></div>';
  122. }, '');
  123. $xxx = '<form class="_form" action="'.admin_url('clear', ['xx'=>'tt']).'" method="post">xxx</form>';
  124. $form->table('app_index_nav','格子菜单', function (NestedForm $table) {
  125. $table->text('name', '文本')->default('文字');
  126. $table->image('img', '图片')->help('<a href="https://img.mini.minisns.cn/images/nav/nav.png" download="app_share_vip_img.jpg" target="_blank" style="color: steelblue">点击下载默认图</a>')->default('https://img.mini.minisns.cn/images/nav/nav.png')->uniqueName()->url('files/uploads')->autoUpload();
  127. $table->select('type', '类型')->options(FieldUtils::getUrlTypes())->default(0);
  128. $table->text('target', '跳转id')->help('怎么填请看<a href="https://doc.minisns.cn/doc/44/" target="_blank">路径大全</a>');
  129. })->default(Settings::get('app_index_nav', '',true));
  130. $form->divider();
  131. global $__MINI_GLOBAL_TENANT_ID__;
  132. if($__MINI_GLOBAL_TENANT_ID__ === 0){
  133. $form->switch('app_index_realtime_post', '热帖榜')->help('每次更改需重新下载前端后生效')->default(Settings::get('app_index_realtime_post', 0));
  134. }
  135. $form->divider();
  136. $form->html(function () {
  137. return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;">首页排序说明:若不是配置了随机排序,则请至少添加2种排序,推荐的排序顺序为:1、计算热度 2、发表时间 3、文章ID</div>';
  138. }, '');
  139. $form->html(function () {
  140. return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;">计算热度说明:<br>1、每次发布新内容时,都给这个笔记一个热度值,这个热度值是跟当前时间成正比,也就是越新发布的,热度值越大<br>2、如果有评论,喜欢等互动,就给这个热度值增加相应的热度<br>3、评论,喜欢等互动越来越多的时候,后面增加的热度值越来越小,但不会小到0。<br>4、效果是新发表的内容有稳定的曝光,同时增加互动量高的笔记曝光时间</div>';
  141. }, '');
  142. $form->html(function () {
  143. return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;">随机排序说明:如果你想实现随机排序,则仅需要配置一个随机天数,其他的都不要选择</div>';
  144. }, '');
  145. $res5 = __system__paycode__tip__(5);
  146. Tooltip::make('.mini_global_admin_open_not_support_tip')
  147. ->bottom()
  148. ->title($res5['tip']);
  149. $form->listbox('app_index_list_sort', '内容列表排序')->options([
  150. 'weight' => '计算热度',
  151. 'created_at'=>'发表时间',
  152. 'last_reply_at' => '最后回复时间',
  153. 'id' => '文章ID',
  154. 'rand_3650' => '随机—3650天',
  155. 'rand_365' => '随机—365天',
  156. 'rand_100' => '随机—100天',
  157. 'rand_60' => '随机—60天',
  158. 'rand_30' => '随机—30天',
  159. 'rand_10' => '随机—10天',
  160. 'rand_7' => '随机—7天',
  161. 'rand_new_1000' => '随机—1000篇',
  162. 'rand_new_3000' => '随机—3000篇',
  163. 'rand_new_5000' => '随机—5000篇',
  164. 'rand_new_10000' => '随机—10000篇',
  165. 'rand_new_100000' => '随机—100000篇',
  166. ])->customFormat(function ($value){
  167. return Settings::get('app_index_list_sort', ['id'],true);
  168. })->help($res5['text'].'(这里解锁说的是 计算热度 ,并非这个配置用不了) 右边代表选中');
  169. $form->divider();
  170. $form->radio('app_index_flow', '扩展推流')->options([0=>'关闭', 1=>'开启'])->default(Settings::get('app_index_flow', 1,true));
  171. $form->divider();
  172. $form->multipleSelectTable('app_index_not_list_circles', '不显示内容的'.env('circle_call', '圈子'))
  173. ->title(env('circle_call', '圈子').'列表')
  174. ->max(100)
  175. ->from(CircleRender::make())
  176. ->model(WxCircle::class, 'id', 'circle_name', 'selectTable:formPageIndexTrait:app_index_not_list_circles')
  177. ->help('配置了之后,首页不显示对应的'.env('circle_call', '圈子').'内容<a href="https://doc.minisns.cn/doc/70/" target="_blank" style="color: red;">(ps:如何控制顺序?)&nbsp;</a>')
  178. ->default(Settings::get('app_index_not_list_circles', '',true));
  179. });
  180. $form->tab('热门tab', function (Form $form) {
  181. $form->html(function () {
  182. return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;">说明一下:开源版本的热门内容是依据喜欢数排序,捐助实时热榜的用户,自动采用热度排序。</div>';
  183. }, '');
  184. });
  185. $form->tab('好物tab', function (Form $form) {
  186. $form->html(function () {
  187. return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;">效果请参考<a href="https://img.mini.minisns.cn/images/index_haowu.jpg" target="_blank">效果图</a>。(这里并不是指商城页面,商城页面请去<a href="'.admin_url('settings/shop').'" target="_blank">后台-移动端-商城</a>)</div>';
  188. }, '');
  189. $form->table('app_index_shop_nav','格子菜单', function (NestedForm $table) {
  190. $table->text('name', '文本')->default('文字');
  191. $table->image('img', '图片')->help('<a href="https://img.mini.minisns.cn/images/nav/nav.png" download="app_share_vip_img.jpg" target="_blank" style="color: steelblue">点击下载默认图</a>')->default('https://img.mini.minisns.cn/images/nav/nav.png')->uniqueName()->url('files/uploads')->autoUpload();
  192. $table->radio('type', '类型')->options(FieldUtils::getUrlTypes())->default(0);
  193. $table->text('target', '跳转id')->help('怎么填请看<a href="https://doc.minisns.cn/doc/44/" target="_blank">路径大全</a>');
  194. })->default(Settings::get('app_index_shop_nav', '',true));
  195. $form->multipleSelect('app_index_shop_classify', '加载商品分类')->options(WxShopClassify::pluck('name', 'id'))->help('留空则加载全部分类')->default(Settings::get('app_index_shop_classify', [], true));
  196. });
  197. $form->tab('相亲Tab', function (Form $form) {
  198. $form->multipleSelectTable('app_xiangqin_index_banner', '轮播图')
  199. ->title('轮播图库')
  200. ->max(10)
  201. ->from(BannerRender::make())
  202. ->model(WxSlideshow::class, 'id', 'id', 'selectTable:formPageIndexTrait:app_xiangqin_index_banner')
  203. ->help('<a href="'.admin_url('slideshow').'" target="_blank">运营管理-轮播图中心</a><a href="https://doc.minisns.cn/doc/70/" target="_blank" style="color: red;">(ps:如何控制顺序?)&nbsp;</a>')
  204. ->default(Settings::get('app_xiangqin_index_banner', '',true));
  205. $form->number('app_xiangqin_index_banner_height', '轮播图高度')->help('默认是300rpx')->default(Settings::get('app_xiangqin_index_banner_height', 300,true));
  206. $form->divider();
  207. $form->table('app_xiangqin_index_notice','垂直滚动通知', function (NestedForm $table) {
  208. $table->text('text', '文本')->default('文字');
  209. $table->image('img', '左侧图')->help('<a href="https://img.mini.minisns.cn/2023/06/23/c8186968da891a2dac10ff5d4fbe0351.png" download="app_share_vip_img.jpg" target="_blank" style="color: steelblue">点击下载默认图</a>')->default('https://img.mini.minisns.cn/2023/06/23/c8186968da891a2dac10ff5d4fbe0351.png')->uniqueName()->url('files/uploads')->autoUpload();
  210. $table->radio('type', '类型')->options(FieldUtils::getUrlTypes())->default(0);
  211. $table->text('target', '跳转id')->help('怎么填请看<a href="https://doc.minisns.cn/doc/44/" target="_blank">路径大全</a>');
  212. })->default(Settings::get('app_xiangqin_index_notice', '',true));
  213. $form->divider();
  214. // $form->html(function () {
  215. // return '<div style="background-color: powderblue;color: #414750;padding: 10px;border-radius: 5px;">简单说明一下:<br>1、每行多少个是根据后台配置了多少个菜单除以2,如你配置了16个菜单,那么每行就是8个,配置了100个菜单,那每行是50个<br>2、跳转id怎么填,请看<a href="https://doc.minisns.cn/doc/44/" target="_blank">这里</a></div>';
  216. // }, '');
  217. $form->table('app_xiangqin_index_nav','格子菜单', function (NestedForm $table) {
  218. $table->text('name', '文本')->default('文字');
  219. $table->image('img', '图片')->help('<a href="https://img.mini.minisns.cn/images/nav/nav.png" download="app_share_vip_img.jpg" target="_blank" style="color: steelblue">点击下载默认图</a>')->default('https://img.mini.minisns.cn/images/nav/nav.png')->uniqueName()->url('files/uploads')->autoUpload();
  220. $table->select('type', '类型')->options(FieldUtils::getUrlTypes())->default(0);
  221. $table->text('target', '跳转id')->help('怎么填请看<a href="https://doc.minisns.cn/doc/44/" target="_blank">路径大全</a>');
  222. })->default(Settings::get('app_xiangqin_index_nav', '',true));
  223. $form->divider();
  224. });
  225. $form->action('settings/action/pageindex');
  226. return $form;
  227. }
  228. public function pageindex(Request $request)
  229. {
  230. global $__MINI_GLOBAL_TENANT_ID__;
  231. $app_index_tab = AdminUtils::_table_data($request->input('app_index_tab'));
  232. if(count(json_decode($app_index_tab, true)) < 2){
  233. return $this->response()->error('首页固定tab最少配置2个');
  234. }
  235. SiteUtils::forget_config_data();
  236. if($__MINI_GLOBAL_TENANT_ID__ > 0){
  237. Settings::set('app_multi_index_text_share', $request->input('app_multi_index_text_share'), true, true);
  238. Settings::set('app_multi_index_img_share', $request->input('app_multi_index_img_share'), true, true);
  239. SettingImgToJpgJob::dispatch([ _multi_key('app_multi_index_img_share') ]);
  240. }
  241. Settings::set('app_index_not_list_circles', $request->input('app_index_not_list_circles'), true, true);
  242. Settings::set('app_index_banner', AdminUtils::_multipleSelectTable_order_process('selectTable:formPageIndexTrait:app_index_banner', $request->input('app_index_banner')) , true, true);
  243. Settings::set('app_index_banner_height', $request->input('app_index_banner_height'), true, true);
  244. Settings::set('app_index_flow', $request->input('app_index_flow'), true, true);
  245. Settings::set('app_xiangqin_index_banner', AdminUtils::_multipleSelectTable_order_process('selectTable:formPageIndexTrait:app_xiangqin_index_banner', $request->input('app_xiangqin_index_banner')) , true, true);
  246. Settings::set('app_xiangqin_index_banner_height', $request->input('app_xiangqin_index_banner_height'), true, true);
  247. global $__MINI_GLOBAL_TENANT_ID__;
  248. if($__MINI_GLOBAL_TENANT_ID__ == 0){
  249. Settings::set('app_index_top_nav_style', $request->input('app_index_top_nav_style'), true);
  250. Settings::set('app_index_header_icon', AdminUtils::_multipleSelectTable_order_process('selectTable:formPageIndexTrait:app_index_header_icon', $request->input('app_index_header_icon')) , true);
  251. Settings::set('app_app_index_header_icon', AdminUtils::_multipleSelectTable_order_process('selectTable:formPageIndexTrait:app_app_index_header_icon', $request->input('app_app_index_header_icon')) , true);
  252. Settings::set('app_search_carousel', $request->input('app_search_carousel'), true);
  253. }else{
  254. if(Settings::get('app_index_top_nav_style', 0) == 1){
  255. Settings::set('app_search_carousel', $request->input('app_search_carousel'), true, true);
  256. }
  257. }
  258. if($__MINI_GLOBAL_TENANT_ID__ === 0){
  259. Settings::set('app_index_realtime_post', $request->input('app_index_realtime_post') == 1 ? 1 : 0, true);
  260. }
  261. Settings::set('app_index_tab', $app_index_tab, true, true);
  262. Settings::set('app_index_notice', AdminUtils::_table_data($request->input('app_index_notice')), true, true);
  263. Settings::set('app_index_nav', AdminUtils::_table_data($request->input('app_index_nav')), true, true);
  264. Settings::set('app_xiangqin_index_nav', AdminUtils::_table_data($request->input('app_xiangqin_index_nav')), true, true);
  265. Settings::set('app_index_list_sort', $request->input('app_index_list_sort'), true, true);
  266. Settings::set('app_index_shop_nav', AdminUtils::_table_data($request->input('app_index_shop_nav')), true, true);
  267. Settings::set('app_xiangqin_index_notice', AdminUtils::_table_data($request->input('app_xiangqin_index_notice')), true, true);
  268. Settings::set('app_index_shop_classify', $request->input('app_index_shop_classify'), true, true);
  269. $__global_config_version__ = Settings::get('__global_config_version__', 1) + 1;
  270. Settings::set('__global_config_version__', $__global_config_version__);
  271. GatewayUtils::success('all', 13, [ 'version' => $__global_config_version__, 'file' => basename(__FILE__) ]);
  272. return $this->response()->success('成功!');
  273. }
  274. }