xieruidong il y a 2 ans
Parent
commit
6576c93e55

+ 263 - 0
application/admin/controller/seller/User.php

@@ -2,7 +2,14 @@
 
 namespace app\admin\controller\seller;
 
+use app\admin\model\Admin;
+use app\admin\model\AuthGroup;
+use app\admin\model\AuthGroupAccess;
 use app\common\controller\Backend;
+use fast\Random;
+use fast\Tree;
+use think\Db;
+use think\Validate;
 
 /**
  * 会员组管理
@@ -16,10 +23,42 @@ class User extends Backend
      * @var \app\admin\model\UserGroup
      */
     protected $model = null;
+    protected $childrenGroupIds = [];
+    protected $childrenAdminIds = [];
 
     public function _initialize()
     {
         parent::_initialize();
+        $this->model=new Admin;
+
+        $this->childrenAdminIds = $this->auth->getChildrenAdminIds($this->auth->isSuperAdmin());
+        $this->childrenGroupIds = $this->auth->getChildrenGroupIds($this->auth->isSuperAdmin());
+
+        $groupList = collection(AuthGroup::where('id', 'in', $this->childrenGroupIds)->select())->toArray();
+
+        Tree::instance()->init($groupList);
+        $groupdata = [];
+        if ($this->auth->isSuperAdmin()) {
+            $result = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0));
+            foreach ($result as $k => $v) {
+                $groupdata[$v['id']] = $v['name'];
+            }
+        } else {
+            $result = [];
+            $groups = $this->auth->getGroups();
+            foreach ($groups as $m => $n) {
+                $childlist = Tree::instance()->getTreeList(Tree::instance()->getTreeArray($n['id']));
+                $temp = [];
+                foreach ($childlist as $k => $v) {
+                    $temp[$v['id']] = $v['name'];
+                }
+                $result[__($n['name'])] = $temp;
+            }
+            $groupdata = $result;
+        }
+
+        $this->view->assign('groupdata', $groupdata);
+        $this->assignconfig("admin", ['id' => $this->auth->id]);
     }
     public function share(){
         return $this->fetch();
@@ -45,4 +84,228 @@ class User extends Backend
             $this->success();
         }
     }
+    /**
+     * 查看
+     */
+    public function index()
+    {
+        //设置过滤方法
+        $this->request->filter(['strip_tags', 'trim']);
+        if ($this->request->isAjax()) {
+            //如果发送的来源是Selectpage,则转发到Selectpage
+            if ($this->request->request('keyField')) {
+                return $this->selectpage();
+            }
+            $childrenGroupIds = $this->childrenGroupIds;
+            $groupName = AuthGroup::where('id', 'in', $childrenGroupIds)
+                ->column('id,name');
+            $authGroupList = AuthGroupAccess::where('group_id', 'in', $childrenGroupIds)
+                ->field('uid,group_id')
+                ->select();
+
+            $adminGroupName = [];
+            foreach ($authGroupList as $k => $v) {
+                if (isset($groupName[$v['group_id']])) {
+                    $adminGroupName[$v['uid']][$v['group_id']] = $groupName[$v['group_id']];
+                }
+            }
+            $groups = $this->auth->getGroups();
+            foreach ($groups as $m => $n) {
+                $adminGroupName[$this->auth->id][$n['id']] = $n['name'];
+            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+
+            $list = $this->model
+                ->where($where)
+                ->where('id', 'in', $this->childrenAdminIds)
+                ->where('user_type',Admin::UT_SELLER)
+                ->field(['password', 'salt', 'token'], true)
+                ->order($sort, $order)
+                ->paginate($limit);
+
+            foreach ($list as $k => &$v) {
+                $groups = isset($adminGroupName[$v['id']]) ? $adminGroupName[$v['id']] : [];
+                $v['groups'] = implode(',', array_keys($groups));
+                $v['groups_text'] = implode(',', array_values($groups));
+            }
+            unset($v);
+            $result = array("total" => $list->total(), "rows" => $list->items());
+
+            return json($result);
+        }
+        return $this->view->fetch();
+    }
+
+    /**
+     * 添加
+     */
+    public function add()
+    {
+        if ($this->request->isPost()) {
+            $this->token();
+            $params = $this->request->post("row/a");
+            if ($params) {
+                Db::startTrans();
+                try {
+                    if (!Validate::is($params['password'], '\S{6,16}')) {
+                        exception(__("Please input correct password"));
+                    }
+                    $params['salt'] = Random::alnum();
+                    $params['password'] = md5(md5($params['password']) . $params['salt']);
+                    $params['avatar'] = '/assets/img/avatar.png'; //设置新管理员默认头像。
+                    $params['user_type'] = Admin::UT_SELLER;
+                    $result = $this->model->validate('Admin.add')->save($params);
+                    if ($result === false) {
+                        exception($this->model->getError());
+                    }
+                    $group = $this->request->post("group/a");
+
+                    //过滤不允许的组别,避免越权
+                    $group = array_intersect($this->childrenGroupIds, $group);
+                    if (!$group) {
+                        exception(__('The parent group exceeds permission limit'));
+                    }
+
+                    $dataset = [];
+                    foreach ($group as $value) {
+                        $dataset[] = ['uid' => $this->model->id, 'group_id' => $value];
+                    }
+                    model('AuthGroupAccess')->saveAll($dataset);
+                    Db::commit();
+                } catch (\Exception $e) {
+                    Db::rollback();
+                    $this->error($e->getMessage());
+                }
+                $this->success();
+            }
+            $this->error(__('Parameter %s can not be empty', ''));
+        }
+        return $this->view->fetch();
+    }
+
+    /**
+     * 编辑
+     */
+    public function edit($ids = null)
+    {
+        $row = $this->model->get(['id' => $ids]);
+        if (!$row) {
+            $this->error(__('No Results were found'));
+        }
+        if (!in_array($row->id, $this->childrenAdminIds)) {
+            $this->error(__('You have no permission'));
+        }
+        if ($this->request->isPost()) {
+            $this->token();
+            $params = $this->request->post("row/a");
+            if ($params) {
+                Db::startTrans();
+                try {
+                    if ($params['password']) {
+                        if (!Validate::is($params['password'], '\S{6,16}')) {
+                            exception(__("Please input correct password"));
+                        }
+                        $params['salt'] = Random::alnum();
+                        $params['password'] = md5(md5($params['password']) . $params['salt']);
+                    } else {
+                        unset($params['password'], $params['salt']);
+                    }
+                    //这里需要针对username和email做唯一验证
+                    $adminValidate = \think\Loader::validate('Admin');
+                    $adminValidate->rule([
+                        'username' => 'require|regex:\w{3,12}|unique:admin,username,' . $row->id,
+                        'email'    => 'require|email|unique:admin,email,' . $row->id,
+                        'password' => 'regex:\S{32}',
+                    ]);
+                    dd($params);
+                    $result = $row->validate('Admin.edit')->save($params);
+                    if ($result === false) {
+                        exception($row->getError());
+                    }
+
+                    // 先移除所有权限
+                    model('AuthGroupAccess')->where('uid', $row->id)->delete();
+
+                    $group = $this->request->post("group/a");
+
+                    // 过滤不允许的组别,避免越权
+                    $group = array_intersect($this->childrenGroupIds, $group);
+                    if (!$group) {
+                        exception(__('The parent group exceeds permission limit'));
+                    }
+
+                    $dataset = [];
+                    foreach ($group as $value) {
+                        $dataset[] = ['uid' => $row->id, 'group_id' => $value];
+                    }
+                    model('AuthGroupAccess')->saveAll($dataset);
+                    Db::commit();
+                } catch (\Exception $e) {
+                    Db::rollback();
+                    $this->error($e->getMessage());
+                }
+                $this->success();
+            }
+            $this->error(__('Parameter %s can not be empty', ''));
+        }
+        $grouplist = $this->auth->getGroups($row['id']);
+        $groupids = [];
+        foreach ($grouplist as $k => $v) {
+            $groupids[] = $v['id'];
+        }
+        $this->view->assign("row", $row);
+        $this->view->assign("groupids", $groupids);
+        return $this->view->fetch();
+    }
+
+    /**
+     * 删除
+     */
+    public function del($ids = "")
+    {
+        if (!$this->request->isPost()) {
+            $this->error(__("Invalid parameters"));
+        }
+        $ids = $ids ? $ids : $this->request->post("ids");
+        if ($ids) {
+            $ids = array_intersect($this->childrenAdminIds, array_filter(explode(',', $ids)));
+            // 避免越权删除管理员
+            $childrenGroupIds = $this->childrenGroupIds;
+            $adminList = $this->model->where('id', 'in', $ids)->where('id', 'in', function ($query) use ($childrenGroupIds) {
+                $query->name('auth_group_access')->where('group_id', 'in', $childrenGroupIds)->field('uid');
+            })->select();
+            if ($adminList) {
+                $deleteIds = [];
+                foreach ($adminList as $k => $v) {
+                    $deleteIds[] = $v->id;
+                }
+                $deleteIds = array_values(array_diff($deleteIds, [$this->auth->id]));
+                if ($deleteIds) {
+                    Db::startTrans();
+                    try {
+                        $this->model->destroy($deleteIds);
+                        model('AuthGroupAccess')->where('uid', 'in', $deleteIds)->delete();
+                        Db::commit();
+                    } catch (\Exception $e) {
+                        Db::rollback();
+                        $this->error($e->getMessage());
+                    }
+                    $this->success();
+                }
+                $this->error(__('No rows were deleted'));
+            }
+        }
+        $this->error(__('You have no permission'));
+    }
+
+    /**
+     * 批量更新
+     * @internal
+     */
+    public function multi($ids = "")
+    {
+        // 管理员禁止批量操作
+        $this->error();
+    }
+
 }

+ 7 - 53
application/admin/model/Admin.php

@@ -20,9 +20,11 @@ class Admin extends Model
     protected $createTime = 'createtime';
     protected $updateTime = 'updatetime';
 
-    protected $readonly=['proxy','sub'];
-    protected $append=['is_proxy','is_sub','is_manager'];
+    protected $readonly=['user_type'];
+    protected $append=[];
     protected $hidden=['salt','password','token'];
+    const UT_ADMIN=0;
+    const UT_SELLER=1;
     /**
      * 重置用户密码
      * @author baiyouwen
@@ -34,34 +36,11 @@ class Admin extends Model
         return $ret;
     }
 
-    public function mobile(){
-        return $this->hasMany(Mobile::class,'proxy_id');
-    }
-    public function subOrder(){
-        return $this->hasMany(MobileOrder::class,'s_id');
-    }
-    public function proxyOrder(){
-        return $this->hasMany(MobileOrder::class,'admin_id');
-    }
-
     // 密码加密
     protected static function encryptPassword($password, $salt = '', $encrypt = 'md5')
     {
         return $encrypt($password . $salt);
     }
-    public function mobileHoldLog(){
-        return $this->morphMany(MobileHoldLog::class,'holdable','admin');
-    }
-    public function mobileOrderRefundLog(){
-        return $this->morphMany(MobileOrderRefundLog::class,'refunduser','admin');
-    }
-
-    public function scopeProxy(Query $query){
-        $query->where('proxy',1);
-    }
-    public function scopeSub(Query $query){
-        $query->where('sub',1);
-    }
 
     protected static function init()
     {
@@ -72,15 +51,6 @@ class Admin extends Model
             }
         });
         self::beforeWrite(function (self $admin){
-            if(!isset($admin['proxy'])){
-                $admin['proxy']=0;
-            }
-            if(!isset($admin['sub'])){
-                $admin['sub']=0;
-            }
-            if($admin['sub'] && $admin['proxy']){
-                throw_user('error admin role');
-            }
         });
         self::beforeInsert(function (self $admin){
 
@@ -89,26 +59,10 @@ class Admin extends Model
 
         });
     }
-
-    public static function getAdmins(){
-        return self::where('proxy',0)
-            ->where('sub',0)
-            ->column('id,nickname');
-    }
-
     public function getIsManagerAttr($_,$admin){
-        !isset($admin['sub']) && $admin['sub']=0;
-        !isset($admin['proxy']) && $admin['proxy']=0;
-        return !$admin['sub'] && !$admin['proxy'];
-    }
-    public function getIsSubAttr($_,$admin){
-        !isset($admin['sub']) && $admin['sub']=0;
-        !isset($admin['proxy']) && $admin['proxy']=0;
-        return $admin['sub'] && !$admin['proxy'];
+        return !$admin['user_type']==self::UT_ADMIN;
     }
-    public function getIsProxyAttr($_,$admin){
-        !isset($admin['sub']) && $admin['sub']=0;
-        !isset($admin['proxy']) && $admin['proxy']=0;
-        return !$admin['sub'] && $admin['proxy'];
+    public function getIsSellerAttr($_,$admin){
+        return $admin['user_type']==self::UT_SELLER;
     }
 }

+ 58 - 0
application/admin/view/seller/user/add.html

@@ -0,0 +1,58 @@
+<form id="add-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
+    {:token()}
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Group')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('group[]', $groupdata, null, ['class'=>'form-control selectpicker', 'multiple'=>'', 'data-rule'=>'required'])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="username" class="control-label col-xs-12 col-sm-2">{:__('Username')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="text" class="form-control" id="username" name="row[username]" value="" data-rule="required;username" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="email" class="control-label col-xs-12 col-sm-2">{:__('手机号')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="tel" class="form-control" id="email" name="row[mobile]" value="" data-rule="mobile" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="nickname" class="control-label col-xs-12 col-sm-2">{:__('Nickname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="text" class="form-control" id="nickname" name="row[nickname]" autocomplete="off" value="" data-rule="required" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="job" class="control-label col-xs-12 col-sm-2">{:__('部门')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="text" class="form-control" id="depart_name" name="row[depart_name]" autocomplete="off" value="" data-rule="required" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="job" class="control-label col-xs-12 col-sm-2">{:__('职位')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="text" class="form-control" id="job_name" name="row[job_name]" autocomplete="off" value="" data-rule="required" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="password" class="control-label col-xs-12 col-sm-2">{:__('Password')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="password" class="form-control" id="password" name="row[password]" autocomplete="new-password" value="" data-rule="required;password" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])}
+        </div>
+    </div>
+    <div class="form-group hidden layer-footer">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 58 - 0
application/admin/view/seller/user/edit.html

@@ -0,0 +1,58 @@
+<form id="edit-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
+    {:token()}
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Group')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_select('group[]', $groupdata, $groupids, ['class'=>'form-control selectpicker', 'multiple'=>'', 'data-rule'=>'required'])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="username" class="control-label col-xs-12 col-sm-2">{:__('Username')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="text" class="form-control" id="username" name="row[username]" value="{$row.username}" data-rule="required;username"/>
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="email" class="control-label col-xs-12 col-sm-2">{:__('手机号')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="tel" class="form-control" id="email" name="row[mobile]" value="{$row.mobile}" data-rule="mobile" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="nickname" class="control-label col-xs-12 col-sm-2">{:__('Nickname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="text" class="form-control" id="nickname" name="row[nickname]" autocomplete="off" value="{$row.nickname}" data-rule="required" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="depart_name" class="control-label col-xs-12 col-sm-2">{:__('部门')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="text" class="form-control" id="depart_name" name="row[depart_name]" autocomplete="off" value="{$row.depart_name}" data-rule="required" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="job_name" class="control-label col-xs-12 col-sm-2">{:__('职位')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="text" class="form-control" id="job_name" name="row[job_name]" autocomplete="off" value="{$row.job_name}" data-rule="required" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="password" class="control-label col-xs-12 col-sm-2">{:__('Password')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input type="password" class="form-control" id="password" name="row[password]" autocomplete="new-password" value="" data-rule="password" />
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')],$row['status'])}
+        </div>
+    </div>
+    <div class="form-group hidden layer-footer">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 17 - 100
application/admin/view/seller/user/index.html

@@ -1,104 +1,21 @@
-<style>
-    .profile-avatar-container {
-        position: relative;
-        width: 100px;
-        margin: 0 auto;
-    }
-
-    .profile-avatar-container .profile-user-img {
-        width: 100px;
-        height: 100px;
-    }
-
-    .profile-avatar-container .profile-avatar-text {
-        display: none;
-    }
-
-    .profile-avatar-container:hover .profile-avatar-text {
-        display: block;
-        position: absolute;
-        height: 100px;
-        width: 100px;
-        background: #444;
-        opacity: .6;
-        color: #fff;
-        top: 0;
-        left: 0;
-        line-height: 100px;
-        text-align: center;
-    }
-
-    .profile-avatar-container button {
-        position: absolute;
-        top: 0;
-        left: 0;
-        width: 100px;
-        height: 100px;
-        opacity: 0;
-    }
-</style>
-<div class="row animated fadeInRight">
-    <div class="col-md-4">
-        <div class="box box-primary">
-            <div class="panel-heading">
-                {:__('Profile')}
-            </div>
-            <div class="panel-body">
-
-                <form id="update-form" role="form" data-toggle="validator" method="POST" action="{:url('general.profile/update')}">
-                    {:token()}
-                    <input type="hidden" id="c-avatar" name="row[avatar]" value="{$admin.avatar|htmlentities}"/>
-                    <div class="box-body box-profile">
-
-                        <div class="profile-avatar-container">
-                            <img class="profile-user-img img-responsive img-circle" src="{$admin.avatar|cdnurl|htmlentities}" alt="">
-                            <div class="profile-avatar-text img-circle">{:__('点击更换')}</div>
-                            <button type="button" id="faupload-avatar" class="faupload" data-input-id="c-avatar"><i class="fa fa-upload"></i> {:__('Upload')}</button>
-                        </div>
-
-                        <h3 class="profile-username text-center">{$admin.nickname|htmlentities}</h3>
-
-                        <div class="form-group">
-                            <label for="username" class="control-label">{:__('Username')}:</label>
-                            <input type="text" class="form-control" id="username" name="row[username]" value="{$admin.username|htmlentities}" disabled/>
-                        </div>
-                        <div class="form-group">
-                            <label for="mobile" class="control-label">{:__('手机号')}:</label>
-                            <input type="text" class="form-control" id="mobile" name="row[mobile]" value="{$admin.mobile|htmlentities}"/>
-                        </div>
-                        <div class="form-group">
-                            <label for="email" class="control-label">{:__('邮箱')}:</label>
-                            <input type="text" class="form-control" id="email" name="row[email]" value="{$admin.email|htmlentities}" data-rule="required;email"/>
-                        </div>
-                        <div class="form-group">
-                            <label for="nickname" class="control-label">{:__('昵称')}:</label>
-                            <input type="text" class="form-control" id="nickname" name="row[nickname]" value="{$admin.nickname|htmlentities}" data-rule="required"/>
-                        </div>
-                        <div class="form-group">
-                            <label for="nickname" class="control-label">{:__('性别')}:</label>
-                            {:build_radios('row[sex]',['保密','男','女'],$admin['sex'])}
-                        </div>
-                        <div class="form-group">
-                            <label for="nickname" class="control-label">{:__('年龄')}:</label>
-                            <input type="number" class="form-control" id="age" name="row[age]" value="{$admin.age|htmlentities}" data-rule=""/>
-                        </div>
-                        <div class="form-group">
-                            <label for="nickname" class="control-label">{:__('居住地')}:</label>
-                            <input type="text" class="form-control" id="live_addr" name="row[live_addr]" value="{$admin.live_addr|htmlentities}" data-rule=""/>
-                        </div>
-                        <div class="form-group">
-                            <label for="nickname" class="control-label">{:__('职位')}:</label>
-                            <input type="text" class="form-control" id="job_name" name="row[job_name]" value="{$admin.job_name|htmlentities}" data-rule=""/>
-                        </div>
-                        <div class="form-group">
-                            <button type="submit" class="btn btn-primary">{:__('Submit')}</button>
-                            <button type="reset" class="btn btn-default">{:__('Reset')}</button>
-                        </div>
-
+<div class="panel panel-default panel-intro">
+    {: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">
+                        {:build_toolbar('refresh,add,delete')}
                     </div>
-                </form>
+                    <table id="table" class="table table-striped table-bordered table-hover" 
+                           data-operate-edit="{:$auth->check('seller/user/edit')}"
+                           data-operate-del="{:$auth->check('seller/user/del')}"
+                           width="100%">
+                    </table>
+                </div>
             </div>
-        </div>
 
+        </div>
     </div>
-</div>
+</div>

+ 104 - 0
application/admin/view/seller/user/show.html

@@ -0,0 +1,104 @@
+<style>
+    .profile-avatar-container {
+        position: relative;
+        width: 100px;
+        margin: 0 auto;
+    }
+
+    .profile-avatar-container .profile-user-img {
+        width: 100px;
+        height: 100px;
+    }
+
+    .profile-avatar-container .profile-avatar-text {
+        display: none;
+    }
+
+    .profile-avatar-container:hover .profile-avatar-text {
+        display: block;
+        position: absolute;
+        height: 100px;
+        width: 100px;
+        background: #444;
+        opacity: .6;
+        color: #fff;
+        top: 0;
+        left: 0;
+        line-height: 100px;
+        text-align: center;
+    }
+
+    .profile-avatar-container button {
+        position: absolute;
+        top: 0;
+        left: 0;
+        width: 100px;
+        height: 100px;
+        opacity: 0;
+    }
+</style>
+<div class="row animated fadeInRight">
+    <div class="col-md-4">
+        <div class="box box-primary">
+            <div class="panel-heading">
+                {:__('Profile')}
+            </div>
+            <div class="panel-body">
+
+                <form id="update-form" role="form" data-toggle="validator" method="POST" action="{:url('general.profile/update')}">
+                    {:token()}
+                    <input type="hidden" id="c-avatar" name="row[avatar]" value="{$admin.avatar|htmlentities}"/>
+                    <div class="box-body box-profile">
+
+                        <div class="profile-avatar-container">
+                            <img class="profile-user-img img-responsive img-circle" src="{$admin.avatar|cdnurl|htmlentities}" alt="">
+                            <div class="profile-avatar-text img-circle">{:__('点击更换')}</div>
+                            <button type="button" id="faupload-avatar" class="faupload" data-input-id="c-avatar"><i class="fa fa-upload"></i> {:__('Upload')}</button>
+                        </div>
+
+                        <h3 class="profile-username text-center">{$admin.nickname|htmlentities}</h3>
+
+                        <div class="form-group">
+                            <label for="username" class="control-label">{:__('Username')}:</label>
+                            <input type="text" class="form-control" id="username" name="row[username]" value="{$admin.username|htmlentities}" disabled/>
+                        </div>
+                        <div class="form-group">
+                            <label for="mobile" class="control-label">{:__('手机号')}:</label>
+                            <input type="text" class="form-control" id="mobile" name="row[mobile]" value="{$admin.mobile|htmlentities}"/>
+                        </div>
+                        <div class="form-group">
+                            <label for="email" class="control-label">{:__('邮箱')}:</label>
+                            <input type="text" class="form-control" id="email" name="row[email]" value="{$admin.email|htmlentities}" data-rule="required;email"/>
+                        </div>
+                        <div class="form-group">
+                            <label for="nickname" class="control-label">{:__('昵称')}:</label>
+                            <input type="text" class="form-control" id="nickname" name="row[nickname]" value="{$admin.nickname|htmlentities}" data-rule="required"/>
+                        </div>
+                        <div class="form-group">
+                            <label for="nickname" class="control-label">{:__('性别')}:</label>
+                            {:build_radios('row[sex]',['保密','男','女'],$admin['sex'])}
+                        </div>
+                        <div class="form-group">
+                            <label for="nickname" class="control-label">{:__('年龄')}:</label>
+                            <input type="number" class="form-control" id="age" name="row[age]" value="{$admin.age|htmlentities}" data-rule=""/>
+                        </div>
+                        <div class="form-group">
+                            <label for="nickname" class="control-label">{:__('居住地')}:</label>
+                            <input type="text" class="form-control" id="live_addr" name="row[live_addr]" value="{$admin.live_addr|htmlentities}" data-rule=""/>
+                        </div>
+                        <div class="form-group">
+                            <label for="nickname" class="control-label">{:__('职位')}:</label>
+                            <input type="text" class="form-control" id="job_name" name="row[job_name]" value="{$admin.job_name|htmlentities}" data-rule=""/>
+                        </div>
+                        <div class="form-group">
+                            <button type="submit" class="btn btn-primary">{:__('Submit')}</button>
+                            <button type="reset" class="btn btn-default">{:__('Reset')}</button>
+                        </div>
+
+                    </div>
+                </form>
+            </div>
+        </div>
+
+    </div>
+</div>

+ 48 - 17
public/assets/js/backend/seller/user.js

@@ -1,27 +1,58 @@
 define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'jstree'], function ($, undefined, Backend, Table, Form, undefined) {
-    //读取选中的条目
-    $.jstree.core.prototype.get_all_checked = function (full) {
-        var obj = this.get_selected(), i, j;
-        for (i = 0, j = obj.length; i < j; i++) {
-            obj = obj.concat(this.get_node(obj[i]).parents);
-        }
-        obj = $.grep(obj, function (v, i, a) {
-            return v != '#';
-        });
-        obj = obj.filter(function (itm, i, a) {
-            return i == a.indexOf(itm);
-        });
-        return full ? $.map(obj, $.proxy(function (i) {
-            return this.get_node(i);
-        }, this)) : obj;
-    };
     var Controller = {
         share: function () {
             Controller.api.bindevent();
         },
-        index: function () {
+        show: function () {
+            Controller.api.bindevent();
+        },
+        add: function () {
             Controller.api.bindevent();
         },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'seller/user/index',
+                    add_url: 'seller/user/add',
+                    edit_url: 'seller/user/edit',
+                    del_url: 'seller/user/del',
+                    multi_url: 'seller/user/multi',
+                }
+            });
+
+            var table = $("#table");
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                columns: [
+                    [
+                        {field: 'state', checkbox: true, },
+                        {field: 'id', title: 'ID'},
+                        {field: 'username', title: __('Username')},
+                        {field: 'mobile', title: __('手机号')},
+                        {field: 'nickname', title: __('Nickname')},
+                        {field: 'depart_name', title: __('部门')},
+                        {field: 'job_name', title: __('职位')},
+                        {field: 'groups_text', title: __('Group'), operate:false, formatter: Table.api.formatter.label},
+                        {field: 'status', title: __("Status"), searchList: {"normal":__('Normal'),"hidden":__('Hidden')}, formatter: Table.api.formatter.status},
+                        {field: 'logintime', title: __('登录时间'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: function (value, row, index) {
+                                if(row.id == Config.admin.id){
+                                    return '';
+                                }
+                                return Table.api.formatter.operate.call(this, value, row, index);
+                            }}
+                    ]
+                ]
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
         changepwd: function () {
             Controller.api.bindevent();
         },