rabin 1 year ago
parent
commit
f9f5b6fe8f
9 changed files with 279 additions and 55 deletions
  1. 22 0
      api/Admin.php
  2. 31 13
      api/Menu.php
  3. 150 20
      api/Page/Update.php
  4. 15 2
      lib/Auth.php
  5. 6 2
      lib/Menu.php
  6. 34 3
      lib/Page.php
  7. 2 12
      table/manage/admin.php
  8. 11 0
      table/manage/core.php
  9. 8 3
      table/system.php

+ 22 - 0
api/Admin.php

@@ -104,4 +104,26 @@ class Admin extends Auth
         $result = Dever::load('common')->token($this->user['id'], $this->user['mobile'], $system_id, $relation_id);
         return $result;
     }
+
+    # 修改资料
+    public function setInfo()
+    {
+        $username = Dever::input('username');
+        $password = Dever::input('password');
+        $data = array();
+        if ($username) {
+            $data['name'] = $username;
+        }
+        if ($password) {
+            $data += Dever::load('common')->createPwd($password);
+        }
+        $state = false;
+        if ($data) {
+            $state = Dever::db($this->system['relation_user_table'])->update($this->uid, $data);
+        }
+        if (!$state) {
+            Dever::error('修改失败');
+        }
+        return 'yes';
+    }
 }

+ 31 - 13
api/Menu.php

@@ -5,25 +5,43 @@ class Menu extends Auth
 {
     public function info()
     {
-        $this->top = false;
+        # 如果后续增加Root,就要这里置为false
+        $this->top = true;
         $top = Dever::db('menu')->select(array('parent_id' => '0', 'system_id' => $this->user['select']['system_id']));
         $result = $menu = array();
-        foreach ($top as $v) {
-            $menu = $this->getMenu($v);
-        }
-        if ($menu) {
-            $result[] = $menu;
-        }
         $result[] = array
         (
-            'path' => '/:pathMatch(.*)*',
-            'component' => '@/views/403',
-            'name' => 'NotFound',
+            'path' => '/',
+            'name' => 'Root',
+            'component' => 'Layout',
             'meta' => array
             (
-                'hidden' => true,
+                'title' => '首页',
+                'icon' => 'home-2-line',
+                'breadcrumbHidden' => true,
+            ),
+            'children' => array
+            (
+                array
+                (
+                    'path' => 'index',
+                    'name' => 'Index',
+                    'component' => '@/dever/index/index',
+                    'meta' => array
+                    (
+                        'title' => '控制台',
+                        'icon' => 'home-2-line',
+                        'noClosable' => true,
+                    )
+                ),
             )
         );
+        foreach ($top as $v) {
+            $menu = $this->getMenu($v);
+        }
+        if ($menu) {
+            $result[] = $menu;
+        }
         return array('list' => $result);
     }
     private function getMenu($v, $parent = '')
@@ -37,7 +55,7 @@ class Menu extends Auth
                 'title' => $v['name'],
                 'icon' => $v['icon'],
                 //'noClosable' => true,
-                'breadcrumbHidden' => true,
+                'breadcrumbHidden' => false,
                 'dynamicNewTab' => true,
             )
         );
@@ -66,7 +84,7 @@ class Menu extends Auth
                 $info['children'][] = $this->getMenu($v1, $v['key']);
             }
         } elseif ($v['path']) {
-            $info['component'] = '@/views/page/' . $v['path'];
+            $info['component'] = '@/dever/page/' . $v['path'];
         }
         return $info;
     }

+ 150 - 20
api/Page/Update.php

@@ -8,10 +8,10 @@ class Update extends Page
     {
         parent::__construct('update', $load, $id);
     }
-    public function get($value = array(), &$option = array())
+    public function get(&$value = array(), &$option = array())
     {
         $func = $this->checkFunc();
-        $remote = $show = array();
+        $remote = $show = $spec = array();
         $data['update'] = $data['field'] = $data['option'] = array();
         $this->setting('field', $data['update'], true, 'text');
         foreach ($data['update'] as $k => $v) {
@@ -19,13 +19,18 @@ class Update extends Page
                 $v['value'] = array();
             }
             if (isset($v['remote'])) {
-                # 需要设置remote
-                $remote[$v['key']] = array($k, $v['remote']);
+                $remote[$v['key']] = array($k, $v['remote'], $v['key']);
+            }
+            if (isset($v['spec_data'])) {
+                $spec[$v['key']] = array($k, $v['spec_data'], $v['key'] . '_spec');
             }
             if (isset($v['show']) && is_string($v['show'])) {
                 $show[$v['key']] = array($k, $v['show']);
             }
             $data['field'][$v['key']] = $v['value'];
+            if ($v['type'] == 'sku') {
+                $data['field'][$v['key'] . '_spec'] = [];
+            }
             if (isset($v['option'])) {
                 $data['option'][$v['key']] = $v['option'];
                 unset($data['update'][$k]['option']);
@@ -53,15 +58,31 @@ class Update extends Page
         if ($this->info) {
             $info = $this->info;
             $this->setInfo($info, $data, $remote, $show);
+            if ($spec) {
+                foreach ($spec as $k => $v) {
+                    $data['update'][$spec[$k][0]]['remote'] = Dever::url($spec[$k][1]);
+                    $result = Dever::call($spec[$k][1], array($this->info['id']));
+                    if ($result) {
+                        $data['field'][$spec[$k][2]] = $result;
+                    }
+                }
+            }
         } elseif ($value) {
-            foreach ($value as $k => $v) {
-                $this->setInfo($v, $data, $remote, $show);
+            foreach ($value as $k => &$v) {
+                $this->setInfo($v, $data, $remote, $show, 2);
                 $option[$k] = $data['option'];
             }
         } else {
             if ($remote) {
+                $info = array();
                 foreach ($remote as $k => $v) {
                     $data['update'][$v[0]]['remote'] = Dever::url($v[1]);
+                    if (isset($v[2]) && isset($data['option'][$v[2]]) && $data['option'][$v[2]] & $m = Dever::isset($data['option'][$v[2]][0], 'id')) {
+                        $result = Dever::call($v[1], array($m), 'api');
+                        if ($result) {
+                            $this->setUpdate($info, $data, $result);
+                        }
+                    }
                 }
             }
             if ($show) {
@@ -82,7 +103,7 @@ class Update extends Page
         return $data;
     }
 
-    private function setInfo($info, &$data, $remote, $show)
+    private function setInfo(&$info, &$data, $remote, $show, $type = 1)
     {
         foreach ($info as $k => $v) {
             if (isset($data['field'][$k])) {
@@ -93,16 +114,17 @@ class Update extends Page
                         $v = array();
                     }
                 }
-                
                 if (isset($this->config['field'][$k]) && isset($this->config['field'][$k]['update'])) {
                     $v = $this->config['field'][$k]['update'];
                 }
-                $data['field'][$k] = $v;
+                if ($type == 1) {
+                    $data['field'][$k] = $v;
+                }
                 if (isset($remote[$k])) {
                     $data['update'][$remote[$k][0]]['remote'] = Dever::url($remote[$k][1]);
                     $result = Dever::call($remote[$k][1], array($v), 'api');
                     if ($result) {
-                        $this->setUpdate($data['update'], $data['option'], $result);
+                        $this->setUpdate($info, $data, $result);
                     }
                 }
                 if (isset($show[$k])) {
@@ -112,15 +134,21 @@ class Update extends Page
         }
     }
 
-    private function setUpdate(&$update, &$option, $result)
+    private function setUpdate(&$info, &$data, $result)
     {
-        foreach ($update as $k => $v) {
+        foreach ($data['update'] as $k => $v) {
             if (isset($result[$v['key']])) {
                 if (isset($result[$v['key']]['option'])) {
-                    $option[$v['key']] = $result[$v['key']]['option'];
+                    $data['option'][$v['key']] = $result[$v['key']]['option'];
                     unset($result[$v['key']]['option']);
                 }
-                $update[$k] = array_merge($update[$k], $result[$v['key']]);
+                if (empty($data['field'][$v['key']]) && isset($result[$v['key']]['value'])) {
+                    $data['field'][$v['key']] = $result[$v['key']]['value'];
+                }
+                if (isset($result[$v['key']]['set']) && $info) {
+                    $info = array_merge($info, $result[$v['key']]['set']);
+                }
+                $data['update'][$k] = array_merge($data['update'][$k], $result[$v['key']]);
             }
         }
     }
@@ -234,7 +262,7 @@ class Update extends Page
         $update = array();
         $this->setting('field', $update, true, 'text');
         if ($update) {
-            $data = $other = array();
+            $data = $other = $sku = array();
             $input = Dever::input();
             $id = false;
             if (isset($input['id']) && $input['id'] > 0) {
@@ -245,7 +273,9 @@ class Update extends Page
                     if (isset($v['rules'])) {
                         $this->checkRules($v, $input[$v['key']]);
                     }
-                    if (strpos($v['key'], '/')) {
+                    if ($v['type'] == 'sku') {
+                        $sku[$v['key']] = array($v['where'], $v['content']['field'], $v['spec'], $v['spec_field'], $input[$v['key'] . '_spec'], $input[$v['key']]);
+                    } elseif (strpos($v['key'], '/')) {
                         $other[$v['key']] = array($v['where'], $v['content']['field'], $v['content']['drag'], $input[$v['key']]);
                     } else {
                         $this->doData($data, $v['key'], $input[$v['key']]);
@@ -281,6 +311,7 @@ class Update extends Page
             }
             $this->end($id, $data);
             $this->other($id, $data, $other);
+            $this->sku($id, $data, $sku);
             return '操作成功';
         }
     }
@@ -358,6 +389,9 @@ class Update extends Page
     {
         if ($other) {
             foreach ($other as $k => $v) {
+                if (strpos($k, '#')) {
+                    $k = str_replace('#', '', $k);
+                }
                 $common = $v[0];
                 $update = $v[1];
                 $drag = $v[2];
@@ -368,10 +402,14 @@ class Update extends Page
                         $value['id'] = $v1['id'];
                     }
                     foreach ($common as $k2 => $v2) {
-                        if ($v2 == 'id') {
-                            $value[$k2] = $rid;
-                        } elseif (isset($data[$v2])) {
-                            $value[$k2] = $data[$v2];
+                        if (!is_array($v2)) {
+                            if ($v2 == 'id') {
+                                $value[$k2] = $rid;
+                            } elseif (isset($data[$v2])) {
+                                $value[$k2] = $data[$v2];
+                            } else {
+                                $value[$k2] = $v2;
+                            }
                         }
                     }
                     foreach ($update as $k2 => $v2) {
@@ -393,4 +431,96 @@ class Update extends Page
             }
         }
     }
+
+    private function sku($rid, $data, $sku)
+    {
+        if ($sku) {
+            foreach ($sku as $k => $v) {
+                if (strpos($k, '#')) {
+                    $k = str_replace('#', '', $k);
+                }
+                $common = $v[0];
+                $update = $v[1];
+                $spec_table = $v[2];
+                $spec_value_table = $spec_table . '_value';
+                $spec_field = $v[3];
+                $spec = $v[4];
+                $input = $v[5];
+                $value = $spec_value = array();
+                Dever::db($spec_table)->update(array($spec_field => $rid), array('state' => 2));
+                Dever::db($spec_value_table)->update(array($spec_field => $rid), array('state' => 2));
+                foreach ($spec as $k1 => &$v1) {
+                    $spec_data = array();
+                    $spec_data['state'] = 1;
+                    $spec_data[$spec_field] = $rid;
+                    $spec_data['name'] = $v1['name'];
+                    $spec_data['sort'] = $k1+1;
+                    if (isset($v1['id']) && $v1['id']) {
+                        Dever::db($spec_table)->update($v1['id'], $spec_data);
+                    } else {
+                        $v1['id'] = Dever::db($spec_table)->insert($spec_data);
+                    }
+                    if ($v1['id']) {
+                        foreach ($v1['value'] as $k2 => &$v2) {
+                            $spec_value_data = array();
+                            $spec_value_data['state'] = 1;
+                            $spec_value_data[$spec_field] = $rid;
+                            $spec_value_data['spec_id'] = $v1['id'];
+                            $spec_value_data['value'] = $v2['value'] ?? $v2['name'];
+                            $spec_value_data['sort'] = $k2+1;
+                            $spec_value_data['is_checked'] = $v2['checked'] == 'true' ? 1 : 2;
+                            if (isset($v2['id']) && $v2['id']) {
+                                Dever::db($spec_value_table)->update($v2['id'], $spec_value_data);
+                            } else {
+                                $v2['id'] = Dever::db($spec_value_table)->insert($spec_value_data);
+                            }
+                            $spec_value[$spec_data['name']][$spec_value_data['value']] = array($v1['id'] . '_' . $v2['id'], $spec_data['sort']);
+                        }
+                    }
+                }
+                Dever::db($spec_table)->delete(array($spec_field => $rid, 'state' => 2));
+                Dever::db($spec_value_table)->delete(array($spec_field => $rid, 'state' => 2));
+                Dever::db($k)->update(array($spec_field => $rid), array('state' => 2));
+                foreach ($input as $k1 => $v1) {
+                    if (isset($v1['id'])) {
+                        $value['id'] = $v1['id'];
+                    }
+                    foreach ($common as $k2 => $v2) {
+                        if (!is_array($v2)) {
+                            if ($v2 == 'id') {
+                                $value[$k2] = $rid;
+                            } elseif (isset($data[$v2])) {
+                                $value[$k2] = $data[$v2];
+                            } else {
+                                $value[$k2] = $v2;
+                            }
+                        }
+                    }
+                    foreach ($update as $k2 => $v2) {
+                        if (isset($v1[$k2])) {
+                            $value[$k2] = $v1[$k2];
+                        }
+                    }
+                    $value['key'] = array();
+                    foreach ($v1 as $k2 => $v2) {
+                        if (isset($spec_value[$k2]) && isset($spec_value[$k2][$v2])) {
+                            $value['key'][$spec_value[$k2][$v2][1]] = $spec_value[$k2][$v2][0];
+                        }
+                    }
+                    if ($value['key']) {
+                        $value['key'] = implode(',' , $value['key']);
+                    }
+                    $value['state'] = 1;
+                    if (isset($value['id']) && $value['id'] > 0) {
+                        $id = $value['id'];
+                        unset($value['id']);
+                        Dever::db($k)->update($id, $value);
+                    } else {
+                        Dever::db($k)->insert($value);
+                    }
+                }
+                Dever::db($k)->delete(array($spec_field => $rid, 'state' => 2));
+            }
+        }
+    }
 }

+ 15 - 2
lib/Auth.php

@@ -5,22 +5,35 @@ class Auth
     protected $login = true;
     protected $uid;
     protected $user;
+    protected $system;
+    protected $relation;
     public $data = array();
     public function __construct()
     {
         $info = Dever::load('common', 'manage')->auth();
         if (!$info && $this->login) {
             $info['uid'] = 1;
+            $info['extend']['system_id'] = 1;
+            $info['extend']['relation_id'] = 1;
             //Dever::error('请先登录');
         }
+        $this->system = Dever::db('system', 'manage')->find($info['extend']['system_id']);
+        if (!$this->system) {
+            Dever::error('当前系统不存在');
+        }
+        $this->relation = Dever::db($this->system['relation_table'])->find($info['extend']['relation_id']);
+        if (!$this->system) {
+            Dever::error('当前系统设置错误');
+        }
+
         $this->uid = $info['uid'];
-        $this->user = Dever::db('admin', 'manage')->find($this->uid);
+        $this->user = Dever::db($this->system['relation_user_table'])->find($this->uid);
         if (!$this->user) {
             Dever::error('请先登录');
         }
         $this->user['auth'] = array('system' => '', 'menu' => '', 'func' => '');
         if ($this->user['role']) {
-            $role = Dever::db('role', 'manage')->select(array('id' => array('in', $this->user['role'])))->fetchAll();
+            $role = Dever::db($this->system['relation_role_table'])->select(array('id' => array('in', $this->user['role'])))->fetchAll();
             foreach ($role as $k => $v) {
                 $this->user['auth']['system'] .= $v['system'] . ',';
                 $this->user['auth']['menu'] .= $v['menu'] . ',';

+ 6 - 2
lib/Menu.php

@@ -4,9 +4,13 @@ use Dever\Project;
 class Menu
 {
     # 初始化菜单
-    public function init()
+    public function init($name = '')
     {
-        $app = Project::read();
+        if ($name) {
+            $app = array($name => Project::read($name));
+        } else {
+            $app = Project::read();
+        }
         foreach ($app as $k => $v) {
             $base = $v['path'] . 'table/manage/core.php';
             if (is_file($base)) {

+ 34 - 3
lib/Page.php

@@ -100,8 +100,10 @@ class Page extends Auth
     {
         $where = array();
         foreach ($set as $k => $v) {
-            if (isset($data[$v])) {
+            if (!is_array($v) && isset($data[$v])) {
                 $where[$k] = $data[$v];
+            } else {
+                $where[$k] = $v;
             }
         }
         if ($where) {
@@ -156,6 +158,17 @@ class Page extends Auth
     protected function checkRules($set, $data)
     {
         if ($set['rules']) {
+            if (!is_array($set['rules'])) {
+                $set['rules'] = array
+                (
+                    array
+                    (
+                        'required' => true,
+                        'trigger' => 'blur',
+                        'message' => $set['name'] . '不能为空',
+                    ),
+                );
+            }
             foreach ($set['rules'] as $k => $v) {
                 if (isset($v['required']) && $v['required'] && !$data && $data !== 0) {
                     Dever::error($v['message']);
@@ -261,10 +274,14 @@ class Page extends Auth
         if (strpos($key, '/') && $this->key == 'update') {
             $this->setType($value, 'array');
             $this->setShow($value);
+            if (strpos($key, '#')) {
+                $key = str_replace('#', '', $key);
+            }
+            $sku = $value['type'] == 'sku' ? true : false;
             $value['value'] = $this->getOther($key, $value['where'], $this->info);
             $update = new \Manage\Api\Page\Update($key, -1);
             $value['option'] = array();
-            $value['content'] = $update->get($value['value'], $value['option']);
+            $value['content'] = $update->get($value['value'], $value['option'], $sku);
             $data[] = $value;
             return $value['name'];
         } else {
@@ -355,6 +372,9 @@ class Page extends Auth
                 $value['value'] = $this->db->config['struct'][$value['key']]['default'];
             }
         }
+        if (isset($value['option']) && $value['option']) {
+            $this->db->config['struct'][$value['key']]['value'] = $value['option'];
+        }
         if ($option = $this->db->value($value['key'])) {
             if ($value['type'] == 'checkbox') {
                 $value['value'] = $value['value'] ? explode(',', $value['value']) : array();
@@ -368,7 +388,18 @@ class Page extends Auth
 
     private function setRules(&$value)
     {
-        if (isset($value['rules']) && $value['rules'] && is_array($value['rules'])) {
+        if (isset($value['rules']) && $value['rules']) {
+            if (!is_array($value['rules'])) {
+                $value['rules'] = array
+                (
+                    array
+                    (
+                        'required' => true,
+                        'trigger' => 'blur',
+                        'message' => $value['name'] . '不能为空',
+                    ),
+                );
+            }
             foreach ($value['rules'] as $k => $v) {
                 if (isset($v['only'])) {
                     if ($v['only'] == 'edit' && !$this->id) {

+ 2 - 12
table/manage/admin.php

@@ -245,6 +245,7 @@ return array
             set:
             maxlength:最大输入长度
             minlength:最小输入长度
+            size: 大小,'large' | 'default' | 'small'
 
             password:文本密码框
             textarea:多行文本
@@ -346,7 +347,7 @@ return array
                 'type'      => 'text',
                 'disable'   => false,//是否禁用
                 'placeholder' => '',//提示语
-                # 校验规则,如无rules,默认是必填, rules => false,就是选填
+                # 校验规则,如rules => true,是必填, 无rules或者rules=false,就是选填
                 # 参考:https://github.com/yiminghe/async-validator
                 'rules'     => array
                 (
@@ -432,17 +433,6 @@ return array
                 # 提示
                 'tip' => '',
             ),
-
-            'avatar' => array
-            (
-                'type' => 'sku',
-                # 这里传入上传规则id
-                'upload' => '1',
-                # 是否支持多选
-                'multiple' => false,
-                # 提示
-                'tip' => '',
-            ),
         ),
 
         # 是否开启控制功能

+ 11 - 0
table/manage/core.php

@@ -82,6 +82,17 @@ return array
             'show'      => 2,
         ),
 
+        'set_my' => array
+        (
+            'parent'    => 'platform',
+            'name'      => '个人资料',
+            'icon'      => '',
+            'sort'      => '100',
+            # 不显示在菜单中
+            'show'      => 2,
+            'path'      => 'set/my',
+        ),
+
         'menu' => array
         (
             'parent'    => 'platform',

+ 8 - 3
table/system.php

@@ -43,6 +43,11 @@ return array
             'name'      => '关联用户表表名',
             'type'      => 'varchar(200)',
         ),
+        'relation_role_table' => array
+        (
+            'name'      => '关联角色表表名',
+            'type'      => 'varchar(200)',
+        ),
         'sort' => array
         (
             'name'      => '排序',
@@ -52,11 +57,11 @@ return array
 
     'default' => array
     (
-        'field' => 'id,name,`key`,`partition`,relation_table,relation_field,relation_user_table,sort',
+        'field' => 'id,name,`key`,`partition`,relation_table,relation_field,relation_user_table,relation_role_table,sort',
         'value' => array
         (
-            '1,"平台","platform","database","manage/platform","platform_id","manage/admin",-1000',
-            '2,"集团","group","database","manage/group","group_id","manage/group_user",-900',
+            '1,"平台","platform","database","manage/platform","platform_id","manage/admin","manage/role",-1000',
+            '2,"集团","group","database","manage/group","group_id","manage/group_user","manage/group_role",-900',
         ),
         'num' => 1,
     ),