diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 33e91b23..91e747ea 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -132,6 +132,24 @@ class UsersController extends AbstractController return Captcha::create(); } + /** + * @api {get} api/users/login/codejson 07. 验证码json + * + * @apiDescription 用于判断是否需要登录验证码 + * @apiVersion 1.0.0 + * @apiGroup users + * @apiName login__codejson + * + * @apiSuccess {Number} ret 返回状态码(1正确、0错误) + * @apiSuccess {String} msg 返回信息(错误描述) + * @apiSuccess {Object} data 返回数据 + */ + public function login__codejson() + { + $captcha = Captcha::create('default', true); + return Base::retSuccess('请求成功', $captcha); + } + /** * @api {get} api/users/info 04. 获取我的信息 * @@ -279,24 +297,6 @@ class UsersController extends AbstractController return Base::retSuccess('修改成功', $user); } - /** - * @api {get} api/users/login/codejson 07. 验证码json - * - * @apiDescription 用于判断是否需要登录验证码 - * @apiVersion 1.0.0 - * @apiGroup users - * @apiName login__codejson - * - * @apiSuccess {Number} ret 返回状态码(1正确、0错误) - * @apiSuccess {String} msg 返回信息(错误描述) - * @apiSuccess {Object} data 返回数据 - */ - public function login__codejson() - { - $captcha = Captcha::create('default', true); - return Base::retSuccess('请求成功', $captcha); - } - /** * @api {get} api/users/search 08. 搜索会员列表 * @@ -306,9 +306,9 @@ class UsersController extends AbstractController * @apiName searchinfo * * @apiParam {Object} keys 搜索条件 - * - keys.key // 昵称、邮箱、用户名 - * - keys.project_id // 在指定项目ID - * - keys.no_project_id // 不在指定项目ID + * - keys.key 昵称、邮箱 + * - keys.project_id 在指定项目ID + * - keys.no_project_id 不在指定项目ID * @apiParam {Number} [take] 获取数量,10-100 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) @@ -376,4 +376,140 @@ class UsersController extends AbstractController } return Base::retSuccess('success', $retArray); } + + /** + * 会员列表(限管理员) + * + * @apiParam {Object} [keys] 搜索条件 + * - keys.email 邮箱 + * - keys.nickname 昵称 + * - keys.profession 职位 + * @apiParam {Number} [page] 当前页,默认:1 + * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:50 + */ + public function lists() + { + User::auth('admin'); + // + $builder = User::select(['*', 'nickname as nickname_original']); + // + $keys = Request::input('keys'); + if (is_array($keys)) { + if ($keys['email']) { + $builder->where('email', 'like', '%' . $keys['email'] . '%'); + } + if ($keys['nickname']) { + $builder->where('nickname', 'like', '%' . $keys['nickname'] . '%'); + } + if ($keys['profession']) { + $builder->where('profession', 'like', '%' . $keys['profession'] . '%'); + } + if ($keys['identity']) { + if (Base::leftExists($keys['identity'], "no")) { + $builder->where('identity', 'not like', '%,' . Base::leftDelete($keys['identity'], 'no') . ',%'); + } else { + $builder->where('identity', 'like', '%,' . $keys['identity'] . ',%'); + } + } + } + $list = $builder->orderByDesc('userid')->paginate(Base::getPaginate(50, 20)); + // + return Base::retSuccess('success', $list); + } + + /** + * 操作会员(限管理员) + * + * @apiParam {Number} userid 会员ID + * @apiParam {String} [type] 操作 + * - setadmin 设为管理员 + * - clearadmin 取消管理员 + * - setdisable 设为禁用 + * - cleardisable 取消禁用 + * - delete 删除会员 + * @apiParam {String} [password] 新的密码 + * @apiParam {String} [nickname] 昵称 + * @apiParam {String} [profession] 职位 + */ + public function operation() + { + User::auth('admin'); + // + $data = Request::all(); + $userid = intval($data['userid']); + $type = $data['type']; + // + $userInfo = User::find($userid); + if (empty($userInfo)) { + return Base::retError('会员不存在或已被删除'); + } + // + $upArray = []; + switch ($type) { + case 'setadmin': + $upArray['identity'] = array_diff($userInfo->identity, ['admin']); + $upArray['identity'][] = 'admin'; + break; + + case 'clearadmin': + $upArray['identity'] = array_diff($userInfo->identity, ['admin']); + break; + + case 'setdisable': + $upArray['identity'] = array_diff($userInfo->identity, ['disable']); + $upArray['identity'][] = 'disable'; + break; + + case 'cleardisable': + $upArray['identity'] = array_diff($userInfo->identity, ['disable']); + break; + + case 'delete': + $userInfo->delete(); + break; + } + if (isset($upArray['identity'])) { + $upArray['identity'] = "," . implode(",", $upArray['identity']) . ","; + } + // 密码 + if (Arr::exists($data, 'password')) { + $password = trim($data['password']); + if (strlen($password) < 6) { + return Base::retError('密码设置不能小于6位数'); + } elseif (strlen($password) > 32) { + return Base::retError('密码最多只能设置32位数'); + } + $upArray['encrypt'] = Base::generatePassword(6); + $upArray['password'] = Base::md52($password, $upArray['encrypt']); + $upArray['changepass'] = 1; + } + // 昵称 + if (Arr::exists($data, 'nickname')) { + $nickname = trim($data['nickname']); + if (mb_strlen($nickname) < 2) { + return Base::retError('昵称不可以少于2个字'); + } elseif (mb_strlen($nickname) > 20) { + return Base::retError('昵称最多只能设置20个字'); + } else { + $upArray['nickname'] = $nickname; + } + } + // 职位/职称 + if (Arr::exists($data, 'profession')) { + $profession = trim($data['profession']); + if (mb_strlen($profession) < 2) { + return Base::retError('职位/职称不可以少于2个字'); + } elseif (mb_strlen($profession) > 20) { + return Base::retError('职位/职称最多只能设置20个字'); + } else { + $upArray['profession'] = $profession; + } + } + if ($upArray) { + $userInfo->updateInstance($upArray); + $userInfo->save(); + } + // + return Base::retSuccess('修改成功', $userInfo); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 1e613801..fd4fa565 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -267,9 +267,10 @@ class User extends AbstractModel /** * 用户身份认证(获取用户信息) + * @param null $identity 判断身份 * @return self */ - public static function auth() + public static function auth($identity = null) { $user = self::authInfo(); if (!$user) { @@ -280,6 +281,12 @@ class User extends AbstractModel throw new ApiException('请登录后继续...', [], -1); } } + if (in_array('disable', $user->identity)) { + throw new ApiException('帐号已停用...', [], -1); + } + if ($identity) { + $user->identity($identity); + } return $user; } diff --git a/database/migrations/2021_06_25_182631_create_users_table.php b/database/migrations/2021_06_25_182631_create_users_table.php index c3447668..d422e289 100644 --- a/database/migrations/2021_06_25_182631_create_users_table.php +++ b/database/migrations/2021_06_25_182631_create_users_table.php @@ -18,7 +18,7 @@ class CreateUsersTable extends Migration $table->string('identity')->nullable()->default('')->comment('身份'); $table->string('az', 10)->nullable()->default('')->comment('A-Z'); $table->string('email', 100)->nullable()->default('')->unique()->comment('邮箱'); - $table->string('nickname')->nullable()->comment('昵称'); + $table->string('nickname')->nullable()->default('')->comment('昵称'); $table->string('profession')->nullable()->default('')->comment('职位/职称'); $table->string('userimg')->nullable()->default('')->comment('头像'); $table->string('encrypt', 50)->nullable()->default(''); diff --git a/database/seeders/UsersTableSeeder.php b/database/seeders/UsersTableSeeder.php index 376502ec..450e3316 100644 --- a/database/seeders/UsersTableSeeder.php +++ b/database/seeders/UsersTableSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\User; use Illuminate\Database\Seeder; class UsersTableSeeder extends Seeder @@ -14,12 +15,14 @@ class UsersTableSeeder extends Seeder */ public function run() { - - \DB::table('users')->delete(); - + + if (User::count() > 0) { + return; + } + \DB::table('users')->insert(array ( - 0 => + 0 => array ( 'userid' => 1, 'identity' => ',admin,', @@ -41,7 +44,7 @@ class UsersTableSeeder extends Seeder 'created_at' => '2021-06-02 11:01:14', 'updated_at' => '2021-06-25 18:50:28', ), - 1 => + 1 => array ( 'userid' => 2, 'identity' => '', @@ -64,7 +67,7 @@ class UsersTableSeeder extends Seeder 'updated_at' => '2021-06-25 18:51:06', ), )); - - + + } -} \ No newline at end of file +} diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js index 52193dc4..2fbc6549 100644 --- a/resources/assets/js/app.js +++ b/resources/assets/js/app.js @@ -20,6 +20,7 @@ import Loading from './components/Loading.vue' import AutoTip from './components/AutoTip.vue' import TagInput from './components/TagInput.vue' import TableAction from './components/TableAction.vue' +import QuickEdit from './components/QuickEdit.vue' import UserAvatar from './components/UserAvatar.vue' Vue.component('PageTitle', PageTitle); @@ -27,6 +28,7 @@ Vue.component('Loading', Loading); Vue.component('AutoTip', AutoTip); Vue.component('TagInput', TagInput) Vue.component('TableAction', TableAction); +Vue.component('QuickEdit', QuickEdit); Vue.component('UserAvatar', UserAvatar); import { diff --git a/resources/assets/js/components/QuickEdit.vue b/resources/assets/js/components/QuickEdit.vue new file mode 100644 index 00000000..d49c4d16 --- /dev/null +++ b/resources/assets/js/components/QuickEdit.vue @@ -0,0 +1,56 @@ + + + diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 25818269..5a84fab6 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -114,6 +114,22 @@ + + + + + + + + + + +
+ +
+ +
+ + + diff --git a/resources/assets/js/pages/manage/setting/password.vue b/resources/assets/js/pages/manage/setting/password.vue index 23fa7347..95c16189 100644 --- a/resources/assets/js/pages/manage/setting/password.vue +++ b/resources/assets/js/pages/manage/setting/password.vue @@ -1,5 +1,6 @@