Browse Source

fix:合在一起

super-yimizi 9 hours ago
parent
commit
7a95319c92

+ 89 - 8
application/admin/controller/user/Share.php

@@ -3,35 +3,116 @@
 namespace app\admin\controller\user;
 
 use app\common\controller\Backend;
+use app\common\model\user\Share as ShareModel;
+use app\common\model\User as UserModel;
+use app\common\Enum\ShareEnum;
+use app\common\Enum\PageTypeEnum;
 
 /**
- * 用户分享记录
+ * 分享记录管理
  *
- * @icon fa fa-circle-o
+ * @icon fa fa-share-alt
  */
 class Share extends Backend
 {
 
     /**
      * Share模型对象
-     * @var \app\admin\model\user\Share
+     * @var \app\common\model\user\Share
      */
     protected $model = null;
 
     public function _initialize()
     {
         parent::_initialize();
-        $this->model = new \app\admin\model\user\Share;
+        $this->model = new ShareModel;
 
+        $this->view->assign("fromList", ShareEnum::getFromList());
+        $this->view->assign("platformList", ShareEnum::getPlatformList());
+        $this->view->assign("pageTypeList", PageTypeEnum::getPageTypeList());
     }
 
-
+    public function import()
+    {
+        parent::import();
+    }
 
     /**
      * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
-     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
-     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自定义
+     * 如果需要自定义必须将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
      */
 
+    /**
+     * 查看
+     */
+    public function index()
+    {
+        //当前是否为关联查询
+        $this->relationSearch = true;
+        //设置过滤方法
+        $this->request->filter(['strip_tags', 'trim']);
+        if ($this->request->isAjax()) {
+            //如果发送的来源是Selectpage,则转发到Selectpage
+            if ($this->request->request('keyField')) {
+                return $this->selectpage();
+            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+
+            $list = $this->model
+                    ->with(['user'])
+                    ->where($where)
+                    ->order($sort, $order)
+                    ->paginate($limit);
+
+            foreach ($list as $row) {
+                
+                $row->user->visible(['id','username','nickname','mobile','avatar']);
+                $row->visible(['id','user_id','share_id','spm','page','query','platform','from','platform_text','from_text','ext','createtime']);
+            }
+
+            $result = array("total" => $list->total(), "rows" => $list->items());
 
-}
+            return json($result);
+        }
+        return $this->view->fetch();
+    }
+
+    /**
+     * 详情
+     */
+    public function detail($ids)
+    {
+        $row = $this->model->get($ids);
+        if (!$row) {
+            $this->error(__('No Results were found'));
+        }
+        $adminIds = $this->getDataLimitAdminIds();
+        if (is_array($adminIds) && !in_array($row[$this->dataLimitField], $adminIds)) {
+            $this->error(__('You have no permission'));
+        }
+
+        // 加载关联数据
+        $row->load(['user']);
+        
+        // 解析spm参数
+        $smpParts = explode('.', $row->spm);
+        $smpInfo = [];
+        if (count($smpParts) >= 5) {
+            $smpInfo = [
+                'share_id' => $smpParts[0] ?? '',
+                'page_type' => $smpParts[1] ?? '',
+                'query' => $smpParts[2] ?? '',
+                'platform' => $smpParts[3] ?? '',
+                'from' => $smpParts[4] ?? '',
+            ];
+            
+            // 获取页面类型描述
+            $smpInfo['page_type_text'] = PageTypeEnum::getPageTypeText($smpParts[1] ?? 0);
+        }
+
+        $this->view->assign("row", $row);
+        $this->view->assign("smpInfo", $smpInfo);
+        return $this->view->fetch();
+    }
+}

+ 116 - 0
application/admin/view/user/share/detail.html

@@ -0,0 +1,116 @@
+<form id="detail-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="panel panel-default panel-intro">
+
+        <div class="panel-heading">
+            {:build_heading()}
+        </div>
+
+        <div class="panel-body">
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">{:__('Id')}:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">{$row.id|htmlentities}</p>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">
+                        {if $row.user}
+                            <a href="{:url('user/user/edit?ids='.$row.user.id)}" class="searchit" data-toggle="tooltip" title="{$row.user.username}">
+                                <img src="{$row.user.avatar}" alt="" class="img-polaroid" height="20"> {$row.user.nickname}({$row.user.username})
+                            </a>
+                        {else/}
+                            {$row.user_id|htmlentities}
+                        {/if}
+                    </p>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">{:__('Share_id')}:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">{$row.share_id|htmlentities}</p>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">SPM参数:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">
+                        <code>{$row.spm|htmlentities}</code>
+                        {if $smpInfo}
+                            <br>
+                            <small class="text-muted">
+                                分享者ID: {$smpInfo.share_id} | 
+                                页面类型: {$smpInfo.page_type_text}({$smpInfo.page_type}) | 
+                                查询参数: {$smpInfo.query} | 
+                                平台: {$smpInfo.platform} | 
+                                来源: {$smpInfo.from}
+                            </small>
+                        {/if}
+                    </p>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">{:__('Page')}:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">{$row.page|htmlentities}</p>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">{:__('Query')}:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">{$row.query|htmlentities}</p>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">{:__('Platform')}:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">
+                        <span class="label label-primary">{$row.platform_text}</span>
+                        <small class="text-muted">({$row.platform})</small>
+                    </p>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">{:__('From')}:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">
+                        <span class="label label-success">{$row.from_text}</span>
+                        <small class="text-muted">({$row.from})</small>
+                    </p>
+                </div>
+            </div>
+            {if $row.ext}
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">扩展信息:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <div class="well well-sm">
+                        {if $row.ext.memo}
+                            <p><strong>备注:</strong> {$row.ext.memo|htmlentities}</p>
+                        {/if}
+                        {if $row.ext.image}
+                            <p><strong>关联图片:</strong></p>
+                            <p><img src="{$row.ext.image|cdnurl}" alt="" class="img-responsive" style="max-width: 200px;"></p>
+                        {/if}
+                    </div>
+                </div>
+            </div>
+            {/if}
+            <div class="form-group">
+                <label class="control-label col-xs-12 col-sm-2">{:__('Createtime')}:</label>
+                <div class="col-xs-12 col-sm-8">
+                    <p class="form-control-static">{$row.createtime|datetime}</p>
+                </div>
+            </div>
+        </div>
+        
+        <div class="panel-footer">
+            <div class="row">
+                <div class="col-xs-12 col-sm-8 col-sm-offset-2">
+                    <button type="button" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
+                </div>
+            </div>
+        </div>
+    </div>
+</form>

+ 17 - 14
application/admin/view/user/share/index.html

@@ -1,26 +1,29 @@
 <div class="panel panel-default panel-intro">
-    <div class="panel-heading">
-        <div class="panel-lead"><em>分享记录</em>用于用户分享记录查看</div>
-        {:build_heading(null,FALSE)}
-    </div>
+    {:build_heading()}
+
     <div class="panel-body">
         <div id="myTabContent" class="tab-content">
             <div class="tab-pane fade active in" id="one">
                 <div class="widget-body no-padding">
                     <div id="toolbar" class="toolbar">
-                        <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
-                        
-                       
-                        <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('user/share/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
-                        
+                        <a class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
+                        <a class="btn btn-success btn-add {:$auth->check('user/share/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
+                        <a class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('user/share/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
+                        <a class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('user/share/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
 
-                        
+                        <div class="dropdown btn-group {:$auth->check('user/share/multi')?'':'hide'}">
+                            <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
+                            <ul class="dropdown-menu text-left" role="menu">
+                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="op=multi" data-field="status" data-value="normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
+                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="op=multi" data-field="status" data-value="hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
+                            </ul>
+                        </div>
 
-                        <a class="btn btn-success btn-recyclebin btn-dialog {:$auth->check('user/share/recyclebin')?'':'hide'}" href="user/share/recyclebin" title="{:__('Recycle bin')}"><i class="fa fa-recycle"></i> {:__('Recycle bin')}</a>
                     </div>
                     <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
-                           data-operate-edit="{:$auth->check('user/share/edit')}"
-                           data-operate-del="{:$auth->check('user/share/del')}"
+                           data-operate-detail="{:$auth->check('user/share/detail')?1:0}"
+                           data-operate-edit="{:$auth->check('user/share/edit')?1:0}"
+                           data-operate-del="{:$auth->check('user/share/del')?1:0}"
                            width="100%">
                     </table>
                 </div>
@@ -28,4 +31,4 @@
 
         </div>
     </div>
-</div>
+</div>

+ 1 - 1
application/api/validate/Share.php

@@ -5,7 +5,7 @@ namespace app\api\validate;
 use think\Validate;
 use app\common\Enum\ChannelEnum;
 
-class ShareValidate extends Validate
+class Share extends Validate
 {
     protected $rule = [
         'shareId' => 'require|max:50',

+ 4 - 0
application/tags.php

@@ -37,4 +37,8 @@ return [
     'log_write'    => [],
     // 应用结束
     'app_end'      => [],
+    // 用户分享后
+    'user_share_after' => [
+        'app\\listeners\\Commission',
+    ],
 ];

+ 66 - 69
public/assets/js/backend/user/share.js

@@ -2,7 +2,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
 
     var Controller = {
         index: function () {
-            // 初始化表格参数配置
+            // 初始化表格参数
             Table.api.init({
                 extend: {
                     index_url: 'user/share/index' + location.search,
@@ -11,6 +11,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                     del_url: 'user/share/del',
                     multi_url: 'user/share/multi',
                     import_url: 'user/share/import',
+                    detail_url: 'user/share/detail',
                     table: 'shop_user_share',
                 }
             });
@@ -27,76 +28,70 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 columns: [
                     [
                         {checkbox: true},
-                        {field: 'id', title: __('Id')},
-                        {field: 'spm', title: __('Spm'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
-                        {field: 'user_id', title: __('User_id')},
-                        {field: 'share_id', title: __('Share_id')},
-                        {field: 'page', title: __('Page'), operate: 'LIKE'},
-                        {field: 'query', title: __('Query'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
-                        {field: 'platform', title: __('Platform'), operate: 'LIKE'},
-                        {field: 'mode', title: __('Mode'), operate: 'LIKE'},
-                        {field: 'status', title: __('Status')},
-                        {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
-                        {field: 'updatetime', title: __('Updatetime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
-                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
-                    ]
-                ]
-            });
-
-            // 为表格绑定事件
-            Table.api.bindevent(table);
-        },
-        recyclebin: function () {
-            // 初始化表格参数配置
-            Table.api.init({
-                extend: {
-                    'dragsort_url': ''
-                }
-            });
-
-            var table = $("#table");
-
-            // 初始化表格
-            table.bootstrapTable({
-                url: 'user/share/recyclebin' + location.search,
-                pk: 'id',
-                sortName: 'id',
-                columns: [
-                    [
-                        {checkbox: true},
-                        {field: 'id', title: __('Id')},
+                        {field: 'id', title: __('Id'), sortable: true},
                         {
-                            field: 'deletetime',
-                            title: __('Deletetime'),
-                            operate: 'RANGE',
-                            addclass: 'datetimerange',
-                            formatter: Table.api.formatter.datetime
+                            field: 'user.nickname', 
+                            title: '受邀用户', 
+                            operate: 'LIKE',
+                            formatter: function (value, row, index) {
+                                if (row.user) {
+                                    return '<img src="' + row.user.avatar + '" class="img-polaroid" height="20"> ' + 
+                                           row.user.nickname + '(' + row.user.username + ')';
+                                }
+                                return '-';
+                            }
+                        },
+                        {field: 'share_id', title: '分享者ID', sortable: true},
+                        {
+                            field: 'spm', 
+                            title: 'SPM参数', 
+                            operate: 'LIKE',
+                            formatter: function (value, row, index) {
+                                return '<code style="font-size: 11px;">' + value + '</code>';
+                            }
                         },
+                        {field: 'page', title: '页面路径', operate: 'LIKE'},
+                        {field: 'query', title: '查询参数', operate: 'LIKE'},
                         {
-                            field: 'operate',
-                            width: '140px',
-                            title: __('Operate'),
-                            table: table,
-                            events: Table.api.events.operate,
-                            buttons: [
-                                {
-                                    name: 'Restore',
-                                    text: __('Restore'),
-                                    classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
-                                    icon: 'fa fa-rotate-left',
-                                    url: 'user/share/restore',
-                                    refresh: true
-                                },
-                                {
-                                    name: 'Destroy',
-                                    text: __('Destroy'),
-                                    classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
-                                    icon: 'fa fa-times',
-                                    url: 'user/share/destroy',
-                                    refresh: true
+                            field: 'platform', 
+                            title: '平台', 
+                            searchList: {"H5":"H5网页","WechatOfficialAccount":"微信公众号网页","WechatMiniProgram":"微信小程序","App":"APP"}, 
+                            formatter: function (value, row, index) {
+                                return '<span class="label label-primary">' + row.platform_text + '</span>';
+                            }
+                        },
+                        {
+                            field: 'from', 
+                            title: '来源', 
+                            searchList: {"forward":"直接转发","poster":"识别海报","link":"分享链接"}, 
+                            formatter: function (value, row, index) {
+                                var colorClass = value === 'poster' ? 'label-success' : (value === 'forward' ? 'label-info' : 'label-warning');
+                                return '<span class="label ' + colorClass + '">' + row.from_text + '</span>';
+                            }
+                        },
+                        {
+                            field: 'ext.memo', 
+                            title: '备注', 
+                            operate: false,
+                            formatter: function (value, row, index) {
+                                if (row.ext && row.ext.memo) {
+                                    return '<small class="text-muted">' + row.ext.memo + '</small>';
                                 }
-                            ],
-                            formatter: Table.api.formatter.operate
+                                return '-';
+                            }
+                        },
+                        {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, 
+                         formatter: Table.api.formatter.operate,
+                         buttons: [
+                             {
+                                 name: 'detail',
+                                 title: '详情',
+                                 classname: 'btn btn-xs btn-info btn-detail',
+                                 icon: 'fa fa-list',
+                                 url: 'user/share/detail'
+                             }
+                         ]
                         }
                     ]
                 ]
@@ -105,13 +100,15 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
             // 为表格绑定事件
             Table.api.bindevent(table);
         },
-
         add: function () {
             Controller.api.bindevent();
         },
         edit: function () {
             Controller.api.bindevent();
         },
+        detail: function () {
+            Controller.api.bindevent();
+        },
         api: {
             bindevent: function () {
                 Form.api.bindevent($("form[role=form]"));
@@ -119,4 +116,4 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
         }
     };
     return Controller;
-});
+});