• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

miaoxing / admin / 12441964517

19 Dec 2024 01:58AM UTC coverage: 20.251%. First build
12441964517

push

github

twinh
feat(admin, u): 增加删除管理员功能

19 of 80 branches covered (23.75%)

0 of 12 new or added lines in 1 file covered. (0.0%)

145 of 716 relevant lines covered (20.25%)

2.43 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/pages/api/admin/admins/[id].php
1
<?php
2

3
use Miaoxing\Admin\Service\AdminModel;
4
use Miaoxing\App\Service\RolesUserModel;
5
use Miaoxing\Plugin\BasePage;
6
use Miaoxing\Plugin\Service\User;
7
use Miaoxing\Plugin\Service\UserModel;
8
use Miaoxing\Services\Page\ItemTrait;
9
use Miaoxing\Services\Service\DestroyAction;
10
use Miaoxing\Services\Service\ShowAction;
11
use Wei\Req;
12
use Wei\V;
13

14
return new class extends BasePage {
×
15
    use ItemTrait;
16

17
    protected $className = '管理员';
18

19
    protected $include = [
20
        'user',
21
    ];
22

23
    public function get()
24
    {
25
        return ShowAction::new()
×
26
            ->buildData(static function (AdminModel $admin) {
×
27
                $userRoles = RolesUserModel::fetchAll('user_id', $admin->userId);
×
28
                return [
×
29
                    'roleIds' => array_column($userRoles, 'roleId'),
×
30
                ];
×
31
            })
×
32
            ->exec($this);
×
33
    }
34

35
    public function patch(Req $req)
36
    {
37
        $data = (array) $req['user'];
×
38
        $admin = AdminModel::findFromReq();
×
39
        $user = $admin->user()->findOrInitBy();
×
40

41
        // 添加用户,编辑用户时,提交了密码,才检验密码是否合法
42
        $validatePassword = $user->isNew() || ($data['password'] ?? false);
×
43

44
        $v = V::new();
×
45
        $v->setModel($user);
×
46
        $v->alnum('username', '用户名')->required($user->isNew())->length(3, 32)->notModelDup()
×
47
            ->notRegex('/^\d/')->message('%name%不能以数字开头');
×
48
        $v->string('password', '密码', 6, 50)->required($validatePassword);
×
49
        $v->string('passwordAgain', '重复密码', 6, 50)->required($validatePassword)
×
50
            ->equalTo($data['password'] ?? null)->message('equalTo', '两次输入的密码不相等');
×
51
        $v->maxCharLength('nickName', ' 昵称', 32)->optional();
×
52
        $v->assert($data);
×
53

54
        if (isset($data['isEnabled']) && !$data['isEnabled'] && $user->isSuperAdmin()) {
×
55
            return err('不能禁用超级管理员');
×
56
        }
57

58
        // 只有校验过才存储到用户对象中
59
        if (isset($data['username'])) {
×
60
            $user->username = $data['username'];
×
61
        }
62

63
        if ($this->shouldUpdatePassword($validatePassword, $user)) {
×
64
            $user->setPlainPassword($data['password']);
×
65
        }
66

67
        $user->isAdmin = true;
×
68
        $user->save($data);
×
69
        $admin->save(['userId' => $user->id]);
×
70

71
        // 保存角色
72
        if (isset($req['roleIds'])) {
×
73
            $user->roles()->syncRelation($req['roleIds']);
×
74
        }
75

76
        return $admin->toRet();
×
77
    }
78

79
    public function delete()
80
    {
NEW
81
        return DestroyAction::new()
×
NEW
82
            ->beforeDestroy(function (AdminModel $admin) {
×
NEW
83
                if ($admin->userId === User::id()) {
×
NEW
84
                    return err('不能删除自己');
×
85
                }
NEW
86
                if ($admin->user->isSuperAdmin()) {
×
NEW
87
                    return err('不能删除超级管理员');
×
88
                }
NEW
89
            })
×
NEW
90
            ->afterDestroy(function (AdminModel $admin) {
×
NEW
91
                $admin->user->adminType = UserModel::ADMIN_TYPE_DEFAULT;
×
NEW
92
                $admin->user->save();
×
NEW
93
            })
×
NEW
94
            ->exec($this);
×
95
    }
96

97
    protected function shouldUpdatePassword(bool $validatePassword, UserModel $user): bool
98
    {
99
        if ($user->isNew()) {
×
100
            // 新用户总是要更新密码
101
            return true;
×
102
        }
103

104
        if ($this->app->isDemo()) {
×
105
            // 演示模式下,编辑用户不更新密码
106
            return false;
×
107
        }
108

109
        // 提交了密码,需更新密码
110
        return $validatePassword;
×
111
    }
112
};
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc