caviar 3 lat temu
rodzic
commit
73de10d6cc

+ 36 - 33
app/admin/controller/Admin.php

@@ -8,6 +8,7 @@ use app\BaseController;
 use app\common\model\AdminModel;
 use app\common\model\AuthGroupAccessModel;
 use app\common\model\AuthGroupModel;
+use app\common\model\DepartmentModel;
 use app\common\model\StoreModel;
 use think\App;
 use think\facade\View;
@@ -19,26 +20,7 @@ class Admin extends BaseController
     private $authGroupModel;
     private $authGroupAccessModel;
     private $storeModel;
-
-    public $rules = [
-        ["id" => 1, "name" => "后台管理员", "pid" => 0],
-        ["id" => 2, "name" => "门店", "pid" => 0],
-        ["id" => 3, "name" => "门店主管", "pid" => 2],
-        ["id" => 4, "name" => "门店老师", "pid" => 2],
-        ["id" => 5, "name" => "门店顾问", "pid" => 2],
-        ["id" => 6, "name" => "门店促销员", "pid" => 2],
-        ["id" => 7, "name" => "佛堂", "pid" => 0],
-        ["id" => 8, "name" => "佛堂负责人", "pid" => 7],
-        ["id" => 9, "name" => "佛堂前台", "pid" => 7],
-        ["id" => 10, "name" => "佛堂道士", "pid" => 7],
-        ["id" => 11, "name" => "佛堂和尚", "pid" => 7],
-        ["id" => 12, "name" => "物流部", "pid" => 0],
-        ["id" => 13, "name" => "物流负责人", "pid" => 12],
-        ["id" => 14, "name" => "物流助理", "pid" => 12],
-        ["id" => 15, "name" => "财务", "pid" => 0],
-        ["id" => 16, "name" => "财务负责人", "pid" => 15],
-        ["id" => 17, "name" => "门店经销商", "pid" => 2],
-    ];
+    private $departmentModel;
 
     public function __construct(App $app)
     {
@@ -46,6 +28,7 @@ class Admin extends BaseController
         $this->authGroupModel = new AuthGroupModel();
         $this->authGroupAccessModel = new AuthGroupAccessModel();
         $this->storeModel = new StoreModel();
+        $this->departmentModel = new DepartmentModel();
         parent::__construct($app);
     }
 
@@ -59,11 +42,12 @@ class Admin extends BaseController
         $params = $request->param();
         $format_params = [
             'group_id' => format_string($params['group_id'] ?? null),
+            'department_id' => format_string($params['department_id'] ?? null),
         ];
         $list = $this->model->findByPaginate($format_params);
         $all_groups = $this->authGroupModel->fetchAllGroups();
         View::assign([
-            'rules' => $this->rules,
+            'all_department' => recursion($this->departmentModel->findAllDepartment()->toArray(),0),
             'list' => $list,
             'all_groups' => recursion($all_groups, 0),
             'params' => $format_params
@@ -84,14 +68,17 @@ class Admin extends BaseController
             $admin = $this->model->doesItExist($params['account']);
             if($admin)
                 return $this->fail(lang("The account already exists."));
+            $department = $this->departmentModel->findById($params['department_id']);
+            if(!$department)
+                return $this->fail('部门不存在!');
             $res = $this->model->create([
                 'account' => $params['account'],
                 'nickname' => $params['nickname'],
                 'mobile'    => $params['mobile'],
                 'password' => md5($params['password']),
-                'store_id' => isset($params['store_id']) && $params['store_id'] > 0 ? $params : null,
+                'department_id' => $params['department_id'],
+                'store_ids' => isset($params['store_ids']) ? join(',', $params['store_ids']) : $department->store_id,
                 'is_login_backstage' => $params['is_login_backstage'],
-                'rule'  =>  $params['rule']
             ]);
             $this->authGroupAccessModel->save([
                 'admin_id'  =>  $res->id,
@@ -100,14 +87,17 @@ class Admin extends BaseController
             return $this->ok(true);
         }
         $all_groups = $this->authGroupModel->fetchAllGroups();
+        $all_department = recursion($this->departmentModel->findAllDepartment()->toArray(),0);
         View::assign([
-            'stores'    =>  $this->storeModel->findAllStore(),
-            'rules' =>  recursion($this->rules,0),
-            'all_groups' => recursion($all_groups, 0)
+            'stores'    =>  $this->storeModel->findAllStore()->toArray(),
+            'all_department' => $all_department,
+            'all_group' => recursion($all_groups, 0),
+            'now_group' => $all_department[0] && $all_department[0]['auth_group_ids'] != null ?$this->authGroupModel->findByIds(explode(',', $all_department[0]['auth_group_ids'])) : []
         ]);
         return view();
     }
 
+
     /**
      * @return \think\response\Json|\think\response\View
      * @throws \think\db\exception\DataNotFoundException
@@ -118,18 +108,22 @@ class Admin extends BaseController
         $params = $this->request->param();
         if(!isset($params['id']))
             return $this->fail(lang('ID not exist'));
+        $admin = $this->model->findById($params['id']);
         if ($this->request->isAjax()) {
             $admin = $this->model->doesItExist($params['account']);
             if($admin && $admin->id != $params['id'])
                 return $this->fail(lang("The account already exists."));
+            $department = $this->departmentModel->findById($params['department_id']);
+            if(!$department)
+                return $this->fail('部门不存在!');
             $this->model->where('id',$params['id'])->update([
                 'account' => $params['account'],
                 'nickname' => $params['nickname'],
                 'mobile'    => $params['mobile'],
                 'password' => isset($params['password']) && $params['password'] != $admin->password ? md5($params['password']) : $admin['password'],
-                'store_id' => isset($params['store_id']) && $params['store_id'] > 0 ? $params['store_id'] : null,
+                'department_id' => $params['department_id'],
+                'store_ids' => isset($params['store_ids']) ? join(',', $params['store_ids']) : $department->store_id,
                 'is_login_backstage' => $params['is_login_backstage'],
-                'rule'  =>  $params['rule'] > 0 ? $params['rule'] : null,
                 'update_time' => time()
             ]);
             $relation = $this->authGroupAccessModel->findByAdminId($admin->id);
@@ -140,16 +134,26 @@ class Admin extends BaseController
             }
             return $this->ok(true);
         }
+        $all_department = recursion($this->departmentModel->findAllDepartment()->toArray(),0);
+        $stores = $this->storeModel->findAllStore();
+        foreach ($stores as $store) $store->isChecked = in_array($store->id, explode(',', $admin->store_ids ?? ''));
+        $group_ids = $admin->department->auth_group_ids;
         View::assign([
-            'stores'    =>  $this->storeModel->findAllStore(),
-            'all_groups' => recursion($this->authGroupModel->fetchAllGroups(), 0),
-            'rules' =>  recursion($this->rules,0),
-            'admin' => $this->model->findById($params['id']),
+            'stores'    =>  $stores,
+            'all_department' => $all_department,
+            'admin' => $admin,
+            'now_group' => $group_ids != null ? $this->authGroupModel->findByIds(explode(',', $group_ids)) : []
         ]);
         return view();
     }
 
 
+    public function getBindRules($department_id) {
+        $department = $this->departmentModel->findById($department_id);
+        if (!$department || $department->auth_group_ids == null)
+            return $this->ok([]);
+        return $this->ok($this->authGroupModel->findByIds(explode(',',$department->auth_group_ids)));
+    }
 
     public function delete(\think\Request $request) {
         $params = $request->param();
@@ -167,7 +171,6 @@ class Admin extends BaseController
         View::assign([
             'stores'    =>  $this->storeModel->findAllStore(),
             'all_groups' => recursion($this->authGroupModel->fetchAllGroups(), 0),
-            'rules' =>  recursion($this->rules,0),
             'admin' => $this->model->findById($params['id']),
         ]);
         return view();

+ 24 - 13
app/admin/controller/AuthGroup.php

@@ -16,6 +16,19 @@ class AuthGroup extends BaseController
     private $authService;
     private $storeModel;
 
+    public $reception_rules = [
+        ["id" => 10001, "zh" => "客户资料", "en" => "Customer information", "icon" => ""],
+        ["id" => 10002, "zh" => "查询业绩", "en" => "Query performance", "icon" => ""],
+        ["id" => 10003, "zh" => "历史订单", "en" => "Historical Orders", "icon" => ""],
+        ["id" => 10004, "zh" => "定金订单", "en" => "Deposit order", "icon" => ""],
+        ["id" => 10005, "zh" => "退货", "en" => "Return goods", "icon" => ""],
+        ["id" => 10006, "zh" => "换货", "en" => "Exchange goods", "icon" => ""],
+        ["id" => 10007, "zh" => "年费管理", "en" => "Annual fee management", "icon" => ""],
+        ["id" => 10008, "zh" => "生成X-report", "en" => "生成X-report", "icon" => ""],
+        ["id" => 10009, "zh" => "生成Z-report", "en" => "生成Z-report", "icon" => ""]
+    ];
+
+
     public function __construct(App $app)
     {
         parent::__construct($app);
@@ -35,20 +48,20 @@ class AuthGroup extends BaseController
      */
     public function add() {
         $all_groups = $this->authService->authGroupModel->fetchAllGroups();
+
         if ($this->request->isAjax()) {
             $params = $this->request->param();
             $res = $this->authService->authGroupModel->save([
-                'pid'   =>  $params['pid'] ?? 1,
+                'pid'   => 0,
                 'name' => format_string($params['name'] ?? null),
                 'rules' => format_string($params['rule_ids'] ?? null),
-                "store_ids" =>  isset($params["store_ids"]) ? join(',', $params['store_ids']) : null,
+                "reception_rules" =>  isset($params["reception_rules"]) ? join(',', $params['reception_rules']) : null,
                 'describe' => format_string($params['describe'] ?? null),
             ]);
             return $this->ok($res);
         }
-        $stores = $this->storeModel->findAllStore();
         View::assign([
-            "stores"    =>  $stores,
+            "reception_rules"    =>  $this->reception_rules,
             "all_groups"    =>  recursion($all_groups, 0)
         ]);
         return view();
@@ -67,22 +80,21 @@ class AuthGroup extends BaseController
         $group = $this->authService->authGroupModel->findById($id);
         if ($this->request->isAjax()) {
             $res = $this->authService->authGroupModel->where('id', $params['id'])->save([
-                'pid' => $params['pid'] ?? $group->pid,
+                'pid' => 0,
                 'name' => $params['name'] ?? $group->name,
                 'rules' => !isset($params['rule_ids']) ? null : $params['rule_ids'],
-                "store_ids" =>  isset($params["store_ids"]) ? join(',', $params['store_ids']) : null,
+                "reception_rules" =>  isset($params["reception_rules"]) ? join(',', $params['reception_rules']) : null,
                 'describe' => $params['describe'] ?? $group->describe,
                 'update_time' => time()
             ]);
             return $this->ok($res);
         }
-        $stores = $this->storeModel->findAllStore();
-        $store_ids = $group->store_ids ? explode(",",$group->store_ids) : [];
-        foreach ($stores as &$item) $item->isChecked = in_array($item->id, $store_ids);
+        $reception_rules = $group->reception_rules ? explode(',',$group->reception_rules) : [];
+        foreach ($this->reception_rules as &$item) $item['isChecked'] = in_array($item['id'], $reception_rules);
         View::assign([
             'group' => $group,
-            "stores" => $stores,
-            "all_groups" => recursion($all_groups, 0)
+            "all_groups" => recursion($all_groups, 0),
+            "reception_rules"    =>  $this->reception_rules,
         ]);
         return view();
     }
@@ -102,14 +114,13 @@ class AuthGroup extends BaseController
             return [
                 'id'        =>  $data['id'],
                 'title'     =>  $data['name'],
-                'pid'       =>  $data['pid'],
                 'field'     =>  $data['name'],
                 'spread'    =>  true,
                 'checked'   =>  false,
                 'disabled'  =>  $data['id'] == 1
             ];
         }, $groups);
-        return $this->ok(recursion($format_groups));
+        return $this->ok($format_groups);
     }
 
 

+ 123 - 0
app/admin/controller/AuthGroupCopy.php

@@ -0,0 +1,123 @@
+<?php
+
+
+namespace app\admin\controller;
+
+
+use app\admin\service\AuthService;
+use app\BaseController;
+use app\common\model\StoreModel;
+use think\App;
+use think\facade\View;
+
+
+class AuthGroupCopy extends BaseController
+{
+    private $authService;
+    private $storeModel;
+
+    public function __construct(App $app)
+    {
+        parent::__construct($app);
+        $this->authService = new AuthService();
+        $this->storeModel = new StoreModel();
+    }
+
+    public function index() {
+        return view();
+    }
+
+    /**
+     * @return \think\response\Json|\think\response\View
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
+    public function add() {
+        $all_groups = $this->authService->authGroupModel->fetchAllGroups();
+        if ($this->request->isAjax()) {
+            $params = $this->request->param();
+            $res = $this->authService->authGroupModel->save([
+                'pid'   =>  $params['pid'] ?? 1,
+                'name' => format_string($params['name'] ?? null),
+                'rules' => format_string($params['rule_ids'] ?? null),
+                "store_ids" =>  isset($params["store_ids"]) ? join(',', $params['store_ids']) : null,
+                'describe' => format_string($params['describe'] ?? null),
+            ]);
+            return $this->ok($res);
+        }
+        $stores = $this->storeModel->findAllStore();
+        View::assign([
+            "stores"    =>  $stores,
+            "all_groups"    =>  recursion($all_groups, 0)
+        ]);
+        return view();
+    }
+
+    /**
+     * @return \think\response\Json|\think\response\View
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
+    public function edit() {
+        $params = $this->request->param();
+        $id = $params['id'];
+        $all_groups = $this->authService->authGroupModel->fetchAllGroups();
+        $group = $this->authService->authGroupModel->findById($id);
+        if ($this->request->isAjax()) {
+            $res = $this->authService->authGroupModel->where('id', $params['id'])->save([
+                'pid' => $params['pid'] ?? $group->pid,
+                'name' => $params['name'] ?? $group->name,
+                'rules' => !isset($params['rule_ids']) ? null : $params['rule_ids'],
+                "store_ids" =>  isset($params["store_ids"]) ? join(',', $params['store_ids']) : null,
+                'describe' => $params['describe'] ?? $group->describe,
+                'update_time' => time()
+            ]);
+            return $this->ok($res);
+        }
+        $stores = $this->storeModel->findAllStore();
+        $store_ids = $group->store_ids ? explode(",",$group->store_ids) : [];
+        foreach ($stores as &$item) $item->isChecked = in_array($item->id, $store_ids);
+        View::assign([
+            'group' => $group,
+            "stores" => $stores,
+            "all_groups" => recursion($all_groups, 0)
+        ]);
+        return view();
+    }
+
+    public function delete(\think\Request $request) {
+        $params = $request->param();
+        if(!isset($params['ids']))
+            return $this->fail(lang("Please select the data you want to delete"));
+        $this->authService->authGroupModel->deleteByIds(explode(',', $params['ids']));
+        return $this->ok(true);
+    }
+
+
+    public function findAllAuthGroups() {
+        $groups = $this->authService->authGroupModel->fetchAllGroups()->toArray();
+        $format_groups = array_map(function ($data) {
+            return [
+                'id'        =>  $data['id'],
+                'title'     =>  $data['name'],
+                'pid'       =>  $data['pid'],
+                'field'     =>  $data['name'],
+                'spread'    =>  true,
+                'checked'   =>  false,
+                'disabled'  =>  $data['id'] == 1
+            ];
+        }, $groups);
+        return $this->ok(recursion($format_groups));
+    }
+
+
+
+}
+
+
+
+
+
+

+ 131 - 0
app/admin/controller/Department.php

@@ -0,0 +1,131 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\BaseController;
+use app\common\model\AuthGroupModel;
+use app\common\model\DepartmentModel;
+use think\App;
+use think\facade\View;
+
+class Department extends BaseController
+{
+    private $departmentModel;
+    private $authGroupModel;
+
+    public function __construct(App $app)
+    {
+        parent::__construct($app);
+        $this->authGroupModel = new AuthGroupModel();
+        $this->departmentModel = new DepartmentModel();
+    }
+
+    public function index() {
+        return view();
+    }
+
+    /**
+     * @return \think\response\Json|\think\response\View
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
+    public function add() {
+        $all_department = $this->departmentModel->fetchAllDepartment();
+        $all_group = $this->authGroupModel->fetchAllGroups();
+        if ($this->request->isAjax()) {
+            $params = $this->request->param();
+            $db_department = $this->departmentModel->findByName(format_string($params['name'] ?? null));
+            if ($db_department)
+                return $this->fail('部门已经存在!');
+            $department = [
+                'pid'   =>  $params['pid'] ?? 0,
+                'name' => format_string($params['name'] ?? null),
+                'describe' => format_string($params['describe'] ?? null),
+            ];
+            if($params['pid'] == 0) {
+                $auth_group_ids = array_merge($params['auth_group_ids'] ?? []);
+                $department['auth_group_ids'] = count($auth_group_ids) > 0 ? join(',', $auth_group_ids) : null;
+            }
+            $res = $this->departmentModel->save($department);
+            return $this->ok($res);
+        }
+        View::assign([
+            "all_department"    =>  recursion($all_department, 0),
+            "all_group" =>  $all_group
+        ]);
+        return view();
+    }
+
+    /**
+     * @return \think\response\Json|\think\response\View
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
+    public function edit() {
+        $params = $this->request->param();
+        $id = $params['id'];
+        $all_department = $this->departmentModel->fetchAllDepartment();
+        $all_group = $this->authGroupModel->fetchAllGroups();
+        $department = $this->departmentModel->findById($id);
+        if (!$department) {
+            return $this->fail(lang("Data not exist"));
+        }
+        if ($this->request->isAjax()) {
+            $res = $this->departmentModel->where('id', $params['id'])->save([
+                'pid' => $params['pid'] ?? $department->pid,
+                'name' => $params['name'] ?? $department->name,
+                "auth_group_ids" =>  isset($params["auth_group_ids"]) ? join(',', array_merge($params['auth_group_ids'])) : null,
+                'describe' => $params['describe'] ?? $department->describe,
+                'update_time' => time()
+            ]);
+            return $this->ok($res);
+        }
+        $group_ids = $department->auth_group_ids ? explode(',',$department->auth_group_ids) : [];
+        foreach ($all_group as &$item) $item->isChecked = in_array($item->id, $group_ids);
+        View::assign([
+            'department' => $department,
+            "all_department"    =>  recursion($all_department, 0),
+            "all_group" =>  $all_group
+        ]);
+        return view();
+    }
+
+    public function delete(\think\Request $request) {
+        $params = $request->param();
+        if(!isset($params['ids']))
+            return $this->fail(lang("Please select the data you want to delete"));
+        $this->departmentModel->deleteByIds(explode(',', $params['ids']));
+        return $this->ok(true);
+    }
+
+
+    /**
+     * @return \think\response\Json
+     */
+    public function fetchAllDepartment() {
+        $groups = $this->departmentModel->fetchAllDepartment()->toArray();
+        $format_groups = array_map(function ($data) {
+            return [
+                'id'        =>  $data['id'],
+                'title'     =>  $data['name'],
+                'pid'       =>  $data['pid'],
+                'field'     =>  $data['name'],
+                'spread'    =>  true,
+                'checked'   =>  false,
+                'disabled'  =>  $data['id'] == 1
+            ];
+        }, $groups);
+        return $this->ok(recursion($format_groups));
+    }
+
+
+
+}
+
+
+
+
+
+

+ 4 - 2
app/admin/lang/zh-cn.php

@@ -27,6 +27,7 @@ return [
     'admin_management_list'    => '管理员列表',
     "activity_management" => "活动管理",
     'customer_list' =>  '客户列表',
+    "role_management" => "角色管理",
 
     'Yes'   => '是',
     'No'    => '否',
@@ -151,8 +152,9 @@ return [
     "Checked"   =>  "选中",
     "Discount"  =>  "折扣",
     "Reduced price" =>  "减免价",
-    "Enter the product name or number and press Enter to select the product" => "输入商品名称或者编号后按回车选择商品"
-
+    "Enter the product name or number and press Enter to select the product" => "输入商品名称或者编号后按回车选择商品",
+    "Reception rules"   =>  "前台权限",
+    "Backstage permission"  =>  "后台权限",
 ];
 
 

+ 35 - 13
app/admin/view/admin/add.html

@@ -46,8 +46,8 @@
                     <div class="layui-form-item">
                         <label class="layui-form-label">{:lang('Department')}</label>
                         <div class="layui-input-block">
-                          <select name="group_id" lay-filter="required">
-                              {volist name="all_groups" id="item"}
+                          <select lay-filter="department" name="department_id">
+                              {volist name="all_department" id="item"}
                               <option value="{$item.id}"  >{$item.name}</option>
                               {volist name='$item.children' id='first'}
                               <option value="{$first.id}">&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
@@ -65,22 +65,20 @@
                           </select>
                         </div>
                     </div>
-                    <div class="layui-form-item">
+                    <div class="layui-form-item" id="store" {if $stores.0.id == 5} hidden {/if}>
                         <label class="layui-form-label">{:lang("Store")}</label>
                         <div class="layui-input-block">
-                            <select name="store_id">
-                                <option value="">{:lang('Unknown')}</option>
-                                {volist name="stores" id="item"}
-                                <option value="{$item.id}">{$item.name}</option>
-                                {/volist}
-                            </select>
+                            {volist name="stores" id="item"}
+                            <input type="checkbox" name="store_ids[]" value="{$item.id}" lay-skin="primary">{$item.name}</input>
+                            {/volist}
                         </div>
                     </div>
-                    <div class="layui-form-item">
+
+                    <div class="layui-form-item" >
                         <label class="layui-form-label">{:lang("Rule")}</label>
                         <div class="layui-input-block">
-                            <select name="rule">
-                                {volist name="rules" id="item"}
+                            <select name="group_id" id="rule">
+                                {volist name="now_group" id="item"}
                                 <option value="{$item.id}">{$item.name}</option>
                                 {volist name="item.children" id="el"}
                                 <option value="{$el.id}">&nbsp;&nbsp;| --&nbsp;{$el.name}</option>
@@ -89,6 +87,7 @@
                             </select>
                         </div>
                     </div>
+
                     <div class="layui-form-item">
                         <div class="layui-input-block">
                           <button type="button" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
@@ -105,10 +104,33 @@
   </div>
 </div>
 <script>
+
   layui.use(['laydate','form','upload'], () => {
     const form = layui.form;
+      form.on('select(department)', function (data) {
+          let id = data.value;
+          request("{:url('admin/admin/getBindRules')}", {department_id: id}).then(res => {
+              console.log(res)
+              if(res.code  == 200) {
+                  let options = "";
+                  let templates = res.data;
+                  for (let template of templates) {
+                      console.log(template)
+                      options += `<option value="${template.id}">${template.name}</option>`;
+                  }
+                  $("#rule").html(options);
+                  form.render('select');
+              }
+          });
+          if(data.value == 5) {
+              $('#store').css('display','block');
+          } else {
+              $('#store').css('display','none');
+          }
+
+      });
 
-    form.on('submit(caviar_submit_btn)', (data) => {
+      form.on('submit(caviar_submit_btn)', (data) => {
         const response = request('{:url("admin/admin/add")}', data.field)
         response.then((res) => {
         console.log(res);

+ 16 - 18
app/admin/view/admin/edit.html

@@ -56,16 +56,16 @@
                                         <label class="layui-form-label">{:lang('Department')}</label>
                                         <div class="layui-input-block">
                                             <select name="group_id" lay-filter="required">
-                                                {volist name="all_groups" id="item"}
-                                                <option value="{$item.id}"  {if $admin.access.group.id == $item.id} selected {/if} >{$item.name}</option>
+                                                {volist name="all_department" id="item"}
+                                                <option value="{$item.id}"  {if $admin.department_id == $item.id} selected {/if} >{$item.name}</option>
                                                 {volist name='$item.children' id='first'}
-                                                <option value="{$first.id}"  {if $admin.access.group.id == $first.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
+                                                <option value="{$first.id}"  {if $admin.department_id == $first.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
                                                 {volist name='$first.children' id='second'}
-                                                <option value="{$second.id}"  {if $admin.access.group.id == $second.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
+                                                <option value="{$second.id}"  {if $admin.department_id == $second.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
                                                 {volist name='$second.children' id='thirdly'}
-                                                <option value="{$thirdly.id}"  {if $admin.access.group.id == $thirdly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
+                                                <option value="{$thirdly.id}"  {if $admin.department_id == $thirdly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
                                                 {volist name='$thirdly.children' id='fourthly'}
-                                                <option value="{$fourthly.id}"  {if $admin.access.group.id == $fourthly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
+                                                <option value="{$fourthly.id}"  {if $admin.department_id == $fourthly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
                                                 {/volist}
                                                 {/volist}
                                                 {/volist}
@@ -74,25 +74,23 @@
                                             </select>
                                         </div>
                                     </div>
-                                    <div class="layui-form-item">
+                                    <div class="layui-form-item" id="store" {if $admin.department_id != 5} hidden {/if}>
                                         <label class="layui-form-label">{:lang("Store")}</label>
                                         <div class="layui-input-block">
-                                            <select name="store_id">
-                                                <option value="">{:lang('Unknown')}</option>
-                                                {volist name="stores" id="item"}
-                                                <option value="{$item.id}"  {if $admin.store_id == $item.id} selected {/if} >{$item.name}</option>
-                                                {/volist}
-                                            </select>
+                                            {volist name="stores" id="item"}
+                                            <input type="checkbox" name="store_ids[]" value="{$item.id}" lay-skin="primary" {if $item.isChecked} checked {/if}  >{$item.name}</input>
+                                            {/volist}
                                         </div>
                                     </div>
-                                    <div class="layui-form-item">
+
+                                    <div class="layui-form-item" >
                                         <label class="layui-form-label">{:lang("Rule")}</label>
                                         <div class="layui-input-block">
-                                            <select name="rule">
-                                                {volist name="rules" id="item"}
-                                                <option value="{$item.id}" {if $admin.rule == $item.id} selected {/if} >{$item.name}</option>
+                                            <select name="group_id" id="rule">
+                                                {volist name="now_group" id="item"}
+                                                <option value="{$item.id}" {if $admin.access.group_id == $item.id} selected {/if}>{$item.name}</option>
                                                 {volist name="item.children" id="el"}
-                                                <option value="{$el.id}" {if $admin.rule == $el.id} selected {/if} >&nbsp;&nbsp;| --&nbsp;{$el.name}</option>
+                                                <option value="{$el.id}"{if $admin.access.group_id == $el.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;{$el.name}</option>
                                                 {/volist}
                                                 {/volist}
                                             </select>

+ 29 - 3
app/admin/view/admin/index.html

@@ -10,9 +10,10 @@
                         <div class="row">
                             <div class="col-md-4">
                                 <div class="form-group">
-                                    <label class="w-120 pull-left control-label">{:lang("Department")}</label>
+                                    <label class="w-120 pull-left control-label">{:lang("Rule")}</label>
                                     <div class="pull-left w-120-calc">
                                         <select class="form-control pull-left" name="group_id">
+                                            <option value="0">{:lang("Unknown")}</option>
                                             {volist name="all_groups" id="item"}
                                             <option value="{$item.id}" {if $params.group_id == $item.id} selected {/if} >{$item.name}</option>
                                             {volist name='$item.children' id='first'}
@@ -34,6 +35,31 @@
                             </div>
                             <div class="col-md-4">
                                 <div class="form-group">
+                                    <label class="w-120 pull-left control-label">{:lang("Department")}</label>
+                                    <div class="pull-left w-120-calc">
+                                        <select class="form-control pull-left" name="department_id">
+                                            <option value="0">{:lang("Unknown")}</option>
+                                            {volist name="all_department" id="item"}
+                                            <option value="{$item.id}" {if $params.department_id == $item.id} selected {/if} >{$item.name}</option>
+                                            {volist name='$item.children' id='first'}
+                                            <option value="{$first.id}" {if $params.department_id == $first.id} selected {/if} >&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
+                                            {volist name='$first.children' id='second'}
+                                            <option value="{$second.id}" {if $params.department_id == $second.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
+                                            {volist name='$second.children' id='thirdly'}
+                                            <option value="{$thirdly.id}" {if $params.department_id == $thirdly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
+                                            {volist name='$thirdly.children' id='fourthly'}
+                                            <option value="{$fourthly.id}" {if $params.department_id == $fourthly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
+                                            {/volist}
+                                            {/volist}
+                                            {/volist}
+                                            {/volist}
+                                            {/volist}
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-4">
+                                <div class="form-group">
                                     <label class="w-120 pull-left control-label"></label>
                                     <div class="pull-left w-120-calc">
                                         <button class="btn btn-success m-r-5" id="caviar_send_btn" type="submit" href="#">{:lang('search')}</button>
@@ -61,9 +87,9 @@
                                 <th>{:lang('Account')}</th>
                                 <th>{:lang("Name")}</th>
                                 <th>{:lang("Mobile")}</th>
+                                <th>{:lang("Rule")}</th>
                                 <th>{:lang("Department")}</th>
                                 <th>{:lang("Is login backstage")}</th>
-                                <th>{:lang("rule")}</th>
                                 <th>{:lang('update_time')}</th>
                                 <th>{:lang('operation')}</th>
                             </tr>
@@ -76,8 +102,8 @@
                                 <td>{$item.nickname}</td>
                                 <td>{$item.mobile}</td>
                                 <td>{$item.access.group.name}</td>
+                                <td>{$item.department.name}</td>
                                 <td>{if $item.is_login_backstage == 1}{:lang("Yes")}{else /}{:lang("No")}{/if}</td>
-                                <td>{$rules[$item.rule - 1]['name']}</td>
                                 <td>{$item.update_time}</td>
                                 <td>
                                     <div class="btn-group">

+ 27 - 27
app/admin/view/auth_group/add.html

@@ -24,38 +24,38 @@
                                     </div>
 
                                     <div class="layui-form-item">
-                                        <label class="layui-form-label">{:lang("Store")}</label>
+                                        <label class="layui-form-label">{:lang("Reception rules")}</label>
                                         <div class="layui-input-block">
-                                            {volist name="stores" id="item"}
-                                            <input type="checkbox" name="store_ids[]" value="{$item.id}" title={$item.name}>
+                                            {volist name="reception_rules" id="item"}
+                                            <input type="checkbox" name="reception_rules[]" value="{$item.id}" title={$item.zh}>
                                             {/volist}
                                         </div>
                                     </div>
+<!--                                    <div class="layui-form-item">-->
+<!--                                        <label class="layui-form-label">上级角色</label>-->
+<!--                                        <div class="layui-input-block">-->
+<!--                                            <select name="pid" lay-filter="required">-->
+<!--                                                <option value="0" selected>{:lang("Unknown")}</option>-->
+<!--                                                {volist name="all_groups" id="item"}-->
+<!--                                                <option value="{$item.id}"  >{$item.name}</option>-->
+<!--                                                {volist name='$item.children' id='first'}-->
+<!--                                                <option value="{$first.id}">&nbsp;&nbsp;| &#45;&#45;&nbsp;{$first.name}</option>-->
+<!--                                                {volist name='$first.children' id='second'}-->
+<!--                                                <option value="{$second.id}">&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;{$second.name}</option>-->
+<!--                                                {volist name='$second.children' id='thirdly'}-->
+<!--                                                <option value="{$thirdly.id}">&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;{$thirdly.name}</option>-->
+<!--                                                {volist name='$thirdly.children' id='fourthly'}-->
+<!--                                                <option value="{$fourthly.id}">&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;{$fourthly.name}</option>-->
+<!--                                                {/volist}-->
+<!--                                                {/volist}-->
+<!--                                                {/volist}-->
+<!--                                                {/volist}-->
+<!--                                                {/volist}-->
+<!--                                            </select>-->
+<!--                                        </div>-->
+<!--                                    </div>-->
                                     <div class="layui-form-item">
-                                        <label class="layui-form-label">{:lang('Superior department')}</label>
-                                        <div class="layui-input-block">
-                                            <select name="pid" lay-filter="required">
-                                                <option value="0" selected>{:lang("Unknown")}</option>
-                                                {volist name="all_groups" id="item"}
-                                                <option value="{$item.id}"  >{$item.name}</option>
-                                                {volist name='$item.children' id='first'}
-                                                <option value="{$first.id}">&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
-                                                {volist name='$first.children' id='second'}
-                                                <option value="{$second.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
-                                                {volist name='$second.children' id='thirdly'}
-                                                <option value="{$thirdly.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
-                                                {volist name='$thirdly.children' id='fourthly'}
-                                                <option value="{$fourthly.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
-                                                {/volist}
-                                                {/volist}
-                                                {/volist}
-                                                {/volist}
-                                                {/volist}
-                                            </select>
-                                        </div>
-                                    </div>
-                                    <div class="layui-form-item">
-                                        <label class="layui-form-label">{:lang("Permission")}</label>
+                                        <label class="layui-form-label">{:lang("Backstage permission")}</label>
                                         <div class="layui-input-block">
                                             <div id="auth_caviar" class="demo-tree-more"></div>
                                         </div>

+ 27 - 30
app/admin/view/auth_group/edit.html

@@ -24,38 +24,38 @@
                                         </div>
                                     </div>
                                     <div class="layui-form-item">
-                                        <label class="layui-form-label">{:lang("Store")}</label>
+                                        <label class="layui-form-label">{:lang("Reception rules")}</label>
                                         <div class="layui-input-block">
-                                            {volist name="stores" id="item"}
-                                            <input type="checkbox" name="store_ids[]" value="{$item.id}" title={$item.name} {if $item.isChecked} checked {/if}>
+                                            {volist name="reception_rules" id="item"}
+                                            <input type="checkbox" name="reception_rules[]" value="{$item.id}" title={$item.zh} {if $item.isChecked} checked {/if}>
                                             {/volist}
                                         </div>
                                     </div>
+<!--                                    <div class="layui-form-item">-->
+<!--                                        <label class="layui-form-label">{:lang('Superior department')}</label>-->
+<!--                                        <div class="layui-input-block">-->
+<!--                                            <select name="pid" lay-filter="required">-->
+<!--                                                <option value="0" selected>{:lang("Unknown")}</option>-->
+<!--                                                {volist name="all_groups" id="item"}-->
+<!--                                                <option value="{$item.id}"  {if $group.pid == $item.id} selected {/if} >{$item.name}</option>-->
+<!--                                                {volist name='$item.children' id='first'}-->
+<!--                                                <option value="{$first.id}"  {if $group.pid == $first.id} selected {/if}>&nbsp;&nbsp;| &#45;&#45;&nbsp;{$first.name}</option>-->
+<!--                                                {volist name='$first.children' id='second'}-->
+<!--                                                <option value="{$second.id}"  {if $group.pid == $second.id} selected {/if}>&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;{$second.name}</option>-->
+<!--                                                {volist name='$second.children' id='thirdly'}-->
+<!--                                                <option value="{$thirdly.id}"  {if $group.pid == $thirdly.id} selected {/if}>&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;{$thirdly.name}</option>-->
+<!--                                                {volist name='$thirdly.children' id='fourthly'}-->
+<!--                                                <option value="{$fourthly.id}"  {if $group.pid == $fourthly.id} selected {/if}>&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;&nbsp;| &#45;&#45;&nbsp;{$fourthly.name}</option>-->
+<!--                                                {/volist}-->
+<!--                                                {/volist}-->
+<!--                                                {/volist}-->
+<!--                                                {/volist}-->
+<!--                                                {/volist}-->
+<!--                                            </select>-->
+<!--                                        </div>-->
+<!--                                    </div>-->
                                     <div class="layui-form-item">
-                                        <label class="layui-form-label">{:lang('Superior department')}</label>
-                                        <div class="layui-input-block">
-                                            <select name="pid" lay-filter="required">
-                                                <option value="0" selected>{:lang("Unknown")}</option>
-                                                {volist name="all_groups" id="item"}
-                                                <option value="{$item.id}"  {if $group.pid == $item.id} selected {/if} >{$item.name}</option>
-                                                {volist name='$item.children' id='first'}
-                                                <option value="{$first.id}"  {if $group.pid == $first.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
-                                                {volist name='$first.children' id='second'}
-                                                <option value="{$second.id}"  {if $group.pid == $second.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
-                                                {volist name='$second.children' id='thirdly'}
-                                                <option value="{$thirdly.id}"  {if $group.pid == $thirdly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
-                                                {volist name='$thirdly.children' id='fourthly'}
-                                                <option value="{$fourthly.id}"  {if $group.pid == $fourthly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
-                                                {/volist}
-                                                {/volist}
-                                                {/volist}
-                                                {/volist}
-                                                {/volist}
-                                            </select>
-                                        </div>
-                                    </div>
-                                    <div class="layui-form-item">
-                                        <label class="layui-form-label">{:lang("Permission")}</label>
+                                        <label class="layui-form-label">{:lang("Backstage permission")}</label>
                                         <div class="layui-input-block">
                                             <div id="auth_caviar" class="demo-tree-more"></div>
                                         </div>
@@ -63,9 +63,6 @@
                                     <div class="layui-form-item">
                                         <div class="layui-input-block">
                                             <button type="button" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn" lay-checked="getChecked">{:lang('Submit')}</button>
-                                            <button type="button" class="btn btn-danger" onclick='
-                                           deletingASingle_("{:url(\"admin/auth_group/delete\")}","{$group.id}",["{:lang(\"Succeed\")}"],"{:lang(\"Warn\")}","{:lang(\"Are you sure you want to delete the selected data\")}",["{:lang(\"Confirm\")}"])'
-                                            >{:lang('Delete')}</button>
                                             <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
                                         </div>
                                     </div>

+ 21 - 0
app/admin/view/auth_group/index.html

@@ -8,6 +8,9 @@
                 <div class="card-toolbar clearfix">
                     <div class="toolbar-btn-action">
                         <a class="btn btn-primary m-r-5" href="#!" onclick="add('{:url(\'admin/auth_group/add\')}')"><i class="mdi mdi-plus"></i> {:lang('add')}</a>
+                        <a class="btn btn-danger" href="#!" onclick="
+                            delete_()"
+                        ><i class="mdi mdi-window-close"></i> {:lang('delete')}</a>
                     </div>
                 </div>
                 <div class="card-body">
@@ -18,6 +21,23 @@
     </div>
 </div>
 <script>
+    function delete_() {
+        layui.use(['tree', 'form'], async () => {
+            const tree = layui.tree;
+            const checkedData = deepTraversal(tree.getChecked('auth_group_input')); //获取选中节点的数据
+            console.log(checkedData);
+            caviar_checkbox_delete(
+                '{:url(\'admin/auth_group/delete\')}',
+                ['{:lang(\'Check at least one box\')}','{:lang(\'Succeed\')}'],
+                '{:lang(\'Warn\')}',
+                '{:lang(\'Are you sure you want to delete the selected data\')}',
+                ['{:lang(\'Confirm\')}'],
+                checkedData.map(v => v.id)
+            )
+            return false;
+        });
+    }
+
     layui.use(['tree', 'util'], async() => {
         const tree = layui.tree
         let data = [];
@@ -34,6 +54,7 @@
                 const data = obj.data;  //获取当前点击的节点数据
                 view("{:url('admin/auth_group/edit')}?id=" + data.id.toString(), "{:lang('Update')}")
             }
+            ,id: "auth_group_input"
         });
 
 

+ 114 - 0
app/admin/view/auth_group_copy/add.html

@@ -0,0 +1,114 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+    <div class="lyear-layout-container">
+        <!--页面主要内容-->
+        <main>
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-lg-12">
+                        <div class="card">
+                            <div class="card-body">
+                                <form class="layui-form">
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Name")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Describe")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="describe" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Store")}</label>
+                                        <div class="layui-input-block">
+                                            {volist name="stores" id="item"}
+                                            <input type="checkbox" name="store_ids[]" value="{$item.id}" title={$item.name}>
+                                            {/volist}
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang('Superior department')}</label>
+                                        <div class="layui-input-block">
+                                            <select name="pid" lay-filter="required">
+                                                <option value="0" selected>{:lang("Unknown")}</option>
+                                                {volist name="all_groups" id="item"}
+                                                <option value="{$item.id}"  >{$item.name}</option>
+                                                {volist name='$item.children' id='first'}
+                                                <option value="{$first.id}">&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
+                                                {volist name='$first.children' id='second'}
+                                                <option value="{$second.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
+                                                {volist name='$second.children' id='thirdly'}
+                                                <option value="{$thirdly.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
+                                                {volist name='$thirdly.children' id='fourthly'}
+                                                <option value="{$fourthly.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                            </select>
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Permission")}</label>
+                                        <div class="layui-input-block">
+                                            <div id="auth_caviar" class="demo-tree-more"></div>
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <div class="layui-input-block">
+                                            <button type="button" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn" lay-checked="getChecked">{:lang('Submit')}</button>
+                                            <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                                        </div>
+                                    </div>
+                                </form>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+        </main>
+        <!--End 页面主要内容-->
+    </div>
+</div>
+<script>
+
+    layui.use(['tree', 'util'], async function(){
+        const tree = layui.tree
+            ,layer = layui.layer
+            ,form = layui.form;
+
+        const response = await request('{:url("admin/auth/findAuthRuleByAdminId")}');
+        let data = []
+        if(response.code === 200) data = response.data;
+
+        tree.render({
+            elem: '#auth_caviar'
+            ,data: data
+            ,showCheckbox: true  //是否显示复选框
+            ,id: "auth_input"
+        });
+
+        form.on('submit(caviar_submit_btn)', (data) => {
+            const checkedData = deepTraversal(tree.getChecked('auth_input')); //获取选中节点的数据
+            request('{:url("admin/auth_group/add")}',{
+                ...data.field,
+                rule_ids: checkedData.map(v => v.id).join(",")
+            }).then((res) => {
+                res.code === 200 ? layer.msg("{:lang('Succeed')}", { icon: 1, time:500 }, () => {
+                    parent.location.reload();
+                }) : layer.msg(res.message, { icon: 5 })
+            })
+            return false;
+        });
+
+    });
+
+</script>

+ 139 - 0
app/admin/view/auth_group_copy/edit.html

@@ -0,0 +1,139 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+    <div class="lyear-layout-container">
+        <!--页面主要内容-->
+        <main>
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-lg-12">
+                        <div class="card">
+                            <div class="card-body">
+                                <form class="layui-form">
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Name")}</label>
+                                        <div class="layui-input-block">
+                                            <input name="id" value="{$group.id}" hidden>
+                                            <input type="text" name="name" value="{$group.name}" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Describe")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="describe" value="{$group.describe}" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Store")}</label>
+                                        <div class="layui-input-block">
+                                            {volist name="stores" id="item"}
+                                            <input type="checkbox" name="store_ids[]" value="{$item.id}" title={$item.name} {if $item.isChecked} checked {/if}>
+                                            {/volist}
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang('Superior department')}</label>
+                                        <div class="layui-input-block">
+                                            <select name="pid" lay-filter="required">
+                                                <option value="0" selected>{:lang("Unknown")}</option>
+                                                {volist name="all_groups" id="item"}
+                                                <option value="{$item.id}"  {if $group.pid == $item.id} selected {/if} >{$item.name}</option>
+                                                {volist name='$item.children' id='first'}
+                                                <option value="{$first.id}"  {if $group.pid == $first.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
+                                                {volist name='$first.children' id='second'}
+                                                <option value="{$second.id}"  {if $group.pid == $second.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
+                                                {volist name='$second.children' id='thirdly'}
+                                                <option value="{$thirdly.id}"  {if $group.pid == $thirdly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
+                                                {volist name='$thirdly.children' id='fourthly'}
+                                                <option value="{$fourthly.id}"  {if $group.pid == $fourthly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                            </select>
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Permission")}</label>
+                                        <div class="layui-input-block">
+                                            <div id="auth_caviar" class="demo-tree-more"></div>
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <div class="layui-input-block">
+                                            <button type="button" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn" lay-checked="getChecked">{:lang('Submit')}</button>
+                                            <button type="button" class="btn btn-danger" onclick='
+                                           deletingASingle_("{:url(\"admin/auth_group/delete\")}","{$group.id}",["{:lang(\"Succeed\")}"],"{:lang(\"Warn\")}","{:lang(\"Are you sure you want to delete the selected data\")}",["{:lang(\"Confirm\")}"])'
+                                            >{:lang('Delete')}</button>
+                                            <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                                        </div>
+                                    </div>
+                                </form>
+
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+        </main>
+        <!--End 页面主要内容-->
+    </div>
+</div>
+<script>
+    var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
+
+    layui.use(['tree', 'util'], async function(){
+        var tree = layui.tree
+            ,layer = layui.layer
+            ,form = layui.form;
+
+        const response = await request('{:url("admin/auth/findAuthRuleByGroupId")}?group_id={$group.id}');
+        let data = []
+        if(response.code === 200) data = response.data;
+
+        tree.render({
+            elem: '#auth_caviar'
+            ,data: data
+            ,showCheckbox: true  //是否显示复选框
+            ,id: "auth_input"
+        });
+
+        form.on('submit(caviar_submit_btn)', (data) => {
+            const checkedData = deepTraversal(tree.getChecked('auth_input')); //获取选中节点的数据
+            request('{:url("admin/auth_group/edit")}',{
+                ...data.field,
+                rule_ids: checkedData.length === 0 ? undefined : checkedData.map(v => v.id).join(",")
+            }).then((res) => {
+                res.code === 200 ? layer.msg("{:lang('Succeed')}", {icon: 1,time:500},() => {
+                    parent.location.reload();
+                }) : layer.msg(res.message,{icon: 5})
+            })
+            return false;
+        });
+
+    });
+    function deletingASingle_(url,
+                             id,
+                             hints = ['Succeed'],
+                             title= 'Warn',
+                             content= 'Are you sure you want to delete the selected data?',
+                             btn = ['Confirm']) {
+        layer.open({
+            title: title,
+            content: content,
+            btn: btn,
+            yes: async (index, layero) => {
+                const response = await request(url, { ids: id.toString()} );
+                response.code === 200 ? layer.msg(hints[0], {icon: 1,time:200},() => {
+                    parent.layer.close(index);
+                    location.replace("{:url('admin/auth_group/index')}")
+                }) : layer.msg(res.message,{icon: 5})
+                layer.close(index);
+            }
+
+        });
+    }
+</script>

+ 41 - 0
app/admin/view/auth_group_copy/index.html

@@ -0,0 +1,41 @@
+{include file='common/_js_css'}
+
+
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="card">
+                <div class="card-toolbar clearfix">
+                    <div class="toolbar-btn-action">
+                        <a class="btn btn-primary m-r-5" href="#!" onclick="add('{:url(\'admin/auth_group/add\')}')"><i class="mdi mdi-plus"></i> {:lang('add')}</a>
+                    </div>
+                </div>
+                <div class="card-body">
+                    <div id="auth_group_tree" class="demo-tree-more"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    layui.use(['tree', 'util'], async() => {
+        const tree = layui.tree
+        let data = [];
+        const response = await request('{:url("admin/auth_group/findAllAuthGroups")}');
+        if(response.code === 200) data = response.data;
+
+        //基本演示
+        tree.render({
+            elem: '#auth_group_tree'
+            ,data: data
+            ,showCheckbox: true  //是否显示复选框
+            ,isJump: true //是否允许点击节点时弹出新窗口跳转
+            ,click: function(obj){
+                const data = obj.data;  //获取当前点击的节点数据
+                view("{:url('admin/auth_group/edit')}?id=" + data.id.toString(), "{:lang('Update')}")
+            }
+        });
+
+
+    });
+</script>

+ 95 - 0
app/admin/view/department/add.html

@@ -0,0 +1,95 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+    <div class="lyear-layout-container">
+        <!--页面主要内容-->
+        <main>
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-lg-12">
+                        <div class="card">
+                            <div class="card-body">
+                                <form class="layui-form">
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Name")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="name" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Describe")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="describe" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang('Superior department')}</label>
+                                        <div class="layui-input-block">
+                                            <select name="pid" lay-filter="required">
+                                                <option value="0" selected>{:lang("Top")}</option>
+                                                {volist name="all_department" id="item"}
+                                                <option value="{$item.id}"  >{$item.name}</option>
+                                                {volist name='$item.children' id='first'}
+                                                <option value="{$first.id}">&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
+                                                {volist name='$first.children' id='second'}
+                                                <option value="{$second.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
+                                                {volist name='$second.children' id='thirdly'}
+                                                <option value="{$thirdly.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
+                                                {volist name='$thirdly.children' id='fourthly'}
+                                                <option value="{$fourthly.id}">&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                            </select>
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item" id="group_role">
+                                        <label class="layui-form-label">{:lang("Relevance role")}</label>
+                                        <div class="layui-input-block">
+                                            {volist name="all_group" id="item"}
+                                            <input type="checkbox" name="auth_group_ids[]" value="{$item.id}" title="{$item.name}">
+                                            {/volist}
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <div class="layui-input-block">
+                                            <button type="button" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
+                                            <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                                        </div>
+                                    </div>
+                                </form>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+        </main>
+    </div>
+</div>
+<script>
+    // function show_role() {
+    //     if($("#pid").val() == 0) {
+    //         $('#group_role').css('display', 'block');
+    //     }
+    // }
+
+    layui.use(['tree', 'util'], async function(){
+        const layer = layui.layer
+            ,form = layui.form;
+        form.on('submit(caviar_submit_btn)', (data) => {
+            request('{:url("admin/department/add")}',{
+                ...data.field,
+            }).then((res) => {
+                res.code === 200 ? layer.msg("{:lang('Succeed')}", { icon: 1, time:500 }, () => {
+                    parent.location.reload();
+                }) : layer.msg(res.message, { icon: 5 })
+            })
+            return false;
+        });
+    });
+</script>

+ 91 - 0
app/admin/view/department/edit.html

@@ -0,0 +1,91 @@
+{include file='common/_js_css'}
+
+<div class="lyear-layout-web">
+    <div class="lyear-layout-container">
+        <!--页面主要内容-->
+        <main>
+            <div class="container-fluid">
+                <div class="row">
+                    <div class="col-lg-12">
+                        <div class="card">
+                            <div class="card-body">
+                                <form class="layui-form">
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Name")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" name="id" value="{$department.id}" hidden>
+                                            <input type="text" value="{$department.name}" name="name" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang("Describe")}</label>
+                                        <div class="layui-input-block">
+                                            <input type="text" value="{$department.describe}" name="describe" lay-verify="required" lay-reqtext="{:lang('Please fill in')}" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <label class="layui-form-label">{:lang('Superior department')}</label>
+                                        <div class="layui-input-block">
+                                            <select name="pid" lay-filter="required">
+                                                <option value="0" selected>{:lang("Top")}</option>
+                                                {volist name="all_department" id="item"}
+                                                <option value="{$item.id}" {if $department.pid == $item.id} selected {/if}>{$item.name}</option>
+                                                {volist name='$item.children' id='first'}
+                                                <option value="{$first.id}" {if $department.pid == $first.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;{$first.name}</option>
+                                                {volist name='$first.children' id='second'}
+                                                <option value="{$second.id}" {if $department.pid == $second.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$second.name}</option>
+                                                {volist name='$second.children' id='thirdly'}
+                                                <option value="{$thirdly.id}" {if $department.pid == $thirdly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$thirdly.name}</option>
+                                                {volist name='$thirdly.children' id='fourthly'}
+                                                <option value="{$fourthly.id}" {if $department.pid == $fourthly.id} selected {/if}>&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;&nbsp;| --&nbsp;{$fourthly.name}</option>
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                                {/volist}
+                                            </select>
+                                        </div>
+                                    </div>
+
+                                    <div class="layui-form-item" id="group_role">
+                                        <label class="layui-form-label">{:lang("Relevance role")}</label>
+                                        <div class="layui-input-block">
+                                            {volist name="all_group" id="item"}
+                                            <input type="checkbox" name="auth_group_ids[]" value="{$item.id}" title="{$item.name}" {if $item.isChecked } checked {/if}>
+                                            {/volist}
+                                        </div>
+                                    </div>
+                                    <div class="layui-form-item">
+                                        <div class="layui-input-block">
+                                            <button type="button" class="layui-btn" lay-submit="" lay-filter="caviar_submit_btn">{:lang('Submit')}</button>
+                                            <button type="reset" class="layui-btn layui-btn-primary">{:lang("Reset")}</button>
+                                        </div>
+                                    </div>
+                                </form>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+        </main>
+    </div>
+</div>
+<script>
+
+    layui.use(['tree', 'util'], async function(){
+        const layer = layui.layer
+            ,form = layui.form;
+        form.on('submit(caviar_submit_btn)', (data) => {
+            request('{:url("admin/department/edit")}',{
+                ...data.field,
+            }).then((res) => {
+                res.code === 200 ? layer.msg("{:lang('Succeed')}", { icon: 1, time:500 }, () => {
+                    parent.location.reload();
+                }) : layer.msg(res.message, { icon: 5 })
+            })
+            return false;
+        });
+    });
+</script>

+ 58 - 0
app/admin/view/department/index.html

@@ -0,0 +1,58 @@
+{include file='common/_js_css'}
+
+
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="card">
+                <div class="card-toolbar clearfix">
+                    <div class="toolbar-btn-action">
+                        <a class="btn btn-primary m-r-5" href="#!" onclick="add('{:url(\'admin/department/add\')}')"><i class="mdi mdi-plus"></i> {:lang('add')}</a>
+                        <a class="btn btn-danger" href="#!" onclick="delete_()"
+                        ><i class="mdi mdi-window-close"></i> {:lang('delete')}</a>
+                    </div>
+                </div>
+                <div class="card-body">
+                    <div id="department_tree" class="demo-tree-more"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    function delete_() {
+        layui.use(['tree', 'form'], async () => {
+            const tree = layui.tree;
+            const checkedData = deepTraversal(tree.getChecked('department_input')); //获取选中节点的数据
+            console.log(checkedData);
+            caviar_checkbox_delete(
+                '{:url(\'admin/department/delete\')}',
+                ['{:lang(\'Check at least one box\')}','{:lang(\'Succeed\')}'],
+                '{:lang(\'Warn\')}',
+                '{:lang(\'Are you sure you want to delete the selected data\')}',
+                ['{:lang(\'Confirm\')}'],
+                checkedData.map(v => v.id)
+            )
+            return false;
+        });
+    }
+    layui.use(['tree', 'util'], async() => {
+        const tree = layui.tree;
+        let data = [];
+        const response = await request('{:url("admin/department/fetchAllDepartment")}');
+        if(response.code === 200) data = response.data;
+
+        //基本演示
+        tree.render({
+            elem: '#department_tree'
+            ,data: data
+            ,showCheckbox: true  //是否显示复选框
+            ,isJump: true //是否允许点击节点时弹出新窗口跳转
+            ,click: function(obj){
+                const data = obj.data;  //获取当前点击的节点数据
+                view("{:url('admin/department/edit')}?id=" + data.id.toString(), "{:lang('Update')}")
+            }
+            ,id:"department_input"
+        });
+    });
+</script>

+ 18 - 7
app/common/model/AdminModel.php

@@ -27,6 +27,11 @@ class AdminModel extends BaseModel
         return self::hasOne(AuthGroupAccessModel::class,'admin_id','id');
     }
 
+    public function department()
+    {
+        return self::hasOne(DepartmentModel::class,'id','department_id');
+    }
+
 
     public function loadByLogin($username, $password) {
         return $this->where([
@@ -50,15 +55,21 @@ class AdminModel extends BaseModel
      */
     public function findByPaginate(array $params) {
         $where = [
+            ['erp_admin.is_delete', '=', 0],
+        ];
+        $access_where = [
             ['is_delete', '=', 0]
         ];
-        if(isset($params['group_id']))
-            array_push($where,['group_id', 'like', "%".$params['group_id']."%"]);
-        return $this->where('erp_admin.is_delete', 0)
-            ->with(['access','access.group'])
-            ->hasWhere('access', $where)
+        if(isset($params['group_id']) && $params['group_id'] > 0)
+            array_push($access_where,['group_id', '=', $params['group_id']]);
+        if(isset($params['department_id']) && $params['department_id'] > 0)
+            array_push($where, ['erp_admin.department_id', '=', $params['department_id']]);
+        return $this->where($where)
+            ->with(['access','access.group', 'department'])
+            ->hasWhere('access', $access_where)
+            ->hasWhere('department')
             ->order('create_time','desc')
-            ->paginate(['list_rows'=>10, "query" => $params]);
+            ->paginate(['list_rows' => 10, "query" => $params]);
     }
 
     public function doesItExist($account) {
@@ -70,7 +81,7 @@ class AdminModel extends BaseModel
     }
 
     public function findById($id) {
-        return $this->where('id',$id)->with(['access','access.group'])->find();
+        return $this->where('id',$id)->with(['access','access.group','department'])->find();
     }
 
 }

+ 6 - 0
app/common/model/BaseModel.php

@@ -45,6 +45,12 @@ abstract class BaseModel extends Model
         ])->find();
     }
 
+    public function findByIds(array $ids) {
+        return $this->where([
+            ['id','in', $ids],
+            ['is_delete','=', 0]
+        ])->select();
+    }
 
 
 

+ 32 - 0
app/common/model/DepartmentModel.php

@@ -0,0 +1,32 @@
+<?php
+
+
+namespace app\common\model;
+
+
+class DepartmentModel extends BaseModel
+{
+
+    protected $table = 'erp_department';
+
+    protected function genSchema(array $schema)
+    {
+        // TODO: Implement genSchema() method.
+    }
+
+    public function fetchAllDepartment() {
+        return $this->where('is_delete',0)->select();
+    }
+
+    public function findByName($name) {
+        return $this->where([
+            ['is_delete', '=', 0],
+            ['name', '=', $name]
+        ])->find();
+    }
+    function findAllDepartment() {
+        return $this->where([
+            ['is_delete', '=', 0],
+        ])->select();
+    }
+}

+ 3 - 2
public/static/js/common.js

@@ -48,11 +48,12 @@ async function caviar_checkbox_delete(url,
                                       title= 'Warn',
                                       content= 'Are you sure you want to delete the selected data?',
                                       btn = ['Confirm'],
+                                      ids_data = undefined
                                       ) {
     const ids = $('.checkbox_caviar:checkbox:checked').map((index,el) => {
         return $(el).val();
     }).get();
-    if(ids.length === 0) {
+    if(ids.length === 0 && ids_data === undefined) {
         layer.msg(hints[0],{icon: 5})
         return false;
     }
@@ -62,7 +63,7 @@ async function caviar_checkbox_delete(url,
         content,
         btn,
         yes: async (index, layero) => {
-            const response = await request(url, {ids: ids.join(',')});
+            const response = await request(url, {ids: ids_data ? ids_data.join(',') : ids.join(',')});
             response.code === 200 ? layer.msg(hints[1], {icon: 1,time:500},() => {
                 location.reload();
             }) : layer.msg(res.message,{icon: 5})