admin user reset password
parent
ab41c7a0b4
commit
108315c35b
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$permissions = [
|
$permissions = [
|
||||||
'users' => ['name' => '用户管理', 'curd' => true, 'children' => ['balance' => '变更余额']],
|
'users' => ['name' => '用户管理', 'curd' => true, 'children' => ['balance' => '变更余额', 'password' => '重置密码']],
|
||||||
'user-balance' => ['name' => '余额流水', 'curd' => ['index', 'show']],
|
'user-balance' => ['name' => '余额流水', 'curd' => ['index', 'show']],
|
||||||
];
|
];
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ class UserFactory extends Factory
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'username' => $username,
|
'username' => $username,
|
||||||
|
'gender' => $faker->randomElement(['男', '女', '未知']),
|
||||||
// 123456
|
// 123456
|
||||||
'password' => '$2y$10$QAGGjfTDjmgDFrX8LkFZ4e0A4MG.doRc8xoq1Cixf6IbHq7RPRqtq',
|
'password' => '$2y$10$QAGGjfTDjmgDFrX8LkFZ4e0A4MG.doRc8xoq1Cixf6IbHq7RPRqtq',
|
||||||
'name' => $faker->name(),
|
'name' => $faker->name(),
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ return new class extends Migration
|
||||||
$table->string('password')->nullable();
|
$table->string('password')->nullable();
|
||||||
$table->string('phone')->nullable();
|
$table->string('phone')->nullable();
|
||||||
$table->string('name')->nullable();
|
$table->string('name')->nullable();
|
||||||
|
$table->string('gender')->nullable();
|
||||||
$table->string('avatar')->nullable();
|
$table->string('avatar')->nullable();
|
||||||
$table->decimal('balance', 12, 2)->default(0)->comment('余额');
|
$table->decimal('balance', 12, 2)->default(0)->comment('余额');
|
||||||
$table->string('invite_code')->comment('邀请码');
|
$table->string('invite_code')->comment('邀请码');
|
||||||
|
|
@ -44,6 +45,7 @@ return new class extends Migration
|
||||||
Schema::create('user_balance_logs', function (Blueprint $table) {
|
Schema::create('user_balance_logs', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->unsignedBigInteger('user_id');
|
$table->unsignedBigInteger('user_id');
|
||||||
|
$table->string('user_name')->comment('用户名');
|
||||||
$table->string('cate')->comment('类别');
|
$table->string('cate')->comment('类别');
|
||||||
$table->string('description')->comment('描述');
|
$table->string('description')->comment('描述');
|
||||||
$table->decimal('amount', 12, 2)->comment('变动数量, 正数为增加, 负数为减少');
|
$table->decimal('amount', 12, 2)->comment('变动数量, 正数为增加, 负数为减少');
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,7 @@ return [
|
||||||
],
|
],
|
||||||
'fields' => [
|
'fields' => [
|
||||||
'user_id' => '用户',
|
'user_id' => '用户',
|
||||||
'user' => [
|
'user_name' => '用户',
|
||||||
'phone' => '用户',
|
|
||||||
],
|
|
||||||
'cate' => '类别',
|
'cate' => '类别',
|
||||||
'amount' => '金额',
|
'amount' => '金额',
|
||||||
'description' => '描述',
|
'description' => '描述',
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ return [
|
||||||
'phone' => '手机号',
|
'phone' => '手机号',
|
||||||
'avatar' => '头像',
|
'avatar' => '头像',
|
||||||
'balance' => '余额',
|
'balance' => '余额',
|
||||||
'profit' => 'e品额',
|
|
||||||
'inviter_id' => '邀请人',
|
'inviter_id' => '邀请人',
|
||||||
'inviter' => [
|
'inviter' => [
|
||||||
'name' => '邀请人',
|
'name' => '邀请人',
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ Route::group([
|
||||||
Route::post('wx-bind-phone', [AuthController::class, 'wxbindPhone']);
|
Route::post('wx-bind-phone', [AuthController::class, 'wxbindPhone']);
|
||||||
|
|
||||||
Route::post('reset', [AuthController::class, 'reset']);
|
Route::post('reset', [AuthController::class, 'reset']);
|
||||||
Route::post('reset-pwd', [AuthController::class, 'resetPwd']);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::group(['prefix' => 'user', 'middleware' => ['auth:api']], function () {
|
Route::group(['prefix' => 'user', 'middleware' => ['auth:api']], function () {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Peidikeji\User\Action;
|
||||||
|
|
||||||
|
use Dcat\Admin\Show\AbstractTool;
|
||||||
|
use Dcat\Admin\Widgets\Modal;
|
||||||
|
use Peidikeji\User\Form\PasswordForm;
|
||||||
|
|
||||||
|
class ShowPassword extends AbstractTool
|
||||||
|
{
|
||||||
|
protected $style = 'btn btn-sm btn-warning';
|
||||||
|
|
||||||
|
protected $title = '重置密码';
|
||||||
|
|
||||||
|
protected function html()
|
||||||
|
{
|
||||||
|
$model = $this->parent->model();
|
||||||
|
$form = PasswordForm::make()->payload(['id' => $model->id]);
|
||||||
|
return Modal::make()->lg()->title($this->title)->body($form)->button('<button type="button" class="'.$this->style.'">'.$this->title.'</button>');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function authorize($user): bool
|
||||||
|
{
|
||||||
|
return $user->can('dcat.admin.users.password');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -31,6 +31,7 @@ class BalanceForm extends Form implements LazyRenderable
|
||||||
|
|
||||||
$admin = Admin::user();
|
$admin = Admin::user();
|
||||||
$user->balanceLogs()->create([
|
$user->balanceLogs()->create([
|
||||||
|
'user_name' => $user->phone,
|
||||||
'amount' => $amount,
|
'amount' => $amount,
|
||||||
'balance' => $user->balance,
|
'balance' => $user->balance,
|
||||||
'cate' => $input['cate'],
|
'cate' => $input['cate'],
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Peidikeji\User\Form;
|
||||||
|
|
||||||
|
use Dcat\Admin\Contracts\LazyRenderable;
|
||||||
|
use Dcat\Admin\Traits\LazyWidget;
|
||||||
|
use Dcat\Admin\Widgets\Form;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
use Peidikeji\User\Models\User;
|
||||||
|
|
||||||
|
class PasswordForm extends Form implements LazyRenderable
|
||||||
|
{
|
||||||
|
use LazyWidget;
|
||||||
|
|
||||||
|
protected $buttons = ['reset' => false, 'submit' => true];
|
||||||
|
|
||||||
|
public function handle(array $input)
|
||||||
|
{
|
||||||
|
if ($input['password'] !== $input['confirm_password']) {
|
||||||
|
return $this->response()->error('两次密码不一致');
|
||||||
|
}
|
||||||
|
$info = User::findOrFail($this->payload['id']);
|
||||||
|
$info->update(['password' => Hash::make($input['password'])]);
|
||||||
|
|
||||||
|
return $this->response()->success('操作成功')->refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form()
|
||||||
|
{
|
||||||
|
$this->password('password', '新密码');
|
||||||
|
$this->password('confirm_password', '确认密码');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -23,7 +23,7 @@ class UserBalanceController extends AdminController
|
||||||
|
|
||||||
$grid->disableRowSelector();
|
$grid->disableRowSelector();
|
||||||
|
|
||||||
$grid->column('user.phone')->link(fn() => admin_url('user-balance?user_id=' . $this->user_id), '_self');
|
$grid->column('user_name')->if(fn() => !!$this->user)->link(fn() => admin_url('user-balance?user_id=' . $this->user_id), '_self');
|
||||||
$grid->column('cate');
|
$grid->column('cate');
|
||||||
$grid->column('description');
|
$grid->column('description');
|
||||||
$grid->column('amount');
|
$grid->column('amount');
|
||||||
|
|
@ -58,8 +58,8 @@ class UserBalanceController extends AdminController
|
||||||
|
|
||||||
protected function detail($id)
|
protected function detail($id)
|
||||||
{
|
{
|
||||||
return Show::make($id, UserBalance::with(['user']), function (Show $show) {
|
return Show::make($id, UserBalance::with([]), function (Show $show) {
|
||||||
$show->field('user.phone');
|
$show->field('user_name');
|
||||||
$show->field('cate');
|
$show->field('cate');
|
||||||
$show->field('description');
|
$show->field('description');
|
||||||
$show->field('amount');
|
$show->field('amount');
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ use Peidikeji\User\Models\User;
|
||||||
use Peidikeji\User\Models\UserSocialite;
|
use Peidikeji\User\Models\UserSocialite;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use Peidikeji\User\Action\ShowBalance;
|
use Peidikeji\User\Action\ShowBalance;
|
||||||
|
use Peidikeji\User\Action\ShowPassword;
|
||||||
|
|
||||||
class UserController extends AdminController
|
class UserController extends AdminController
|
||||||
{
|
{
|
||||||
|
|
@ -144,12 +145,14 @@ class UserController extends AdminController
|
||||||
$show->field('inviter.phone');
|
$show->field('inviter.phone');
|
||||||
$show->field('invite_code');
|
$show->field('invite_code');
|
||||||
$show->field('balance');
|
$show->field('balance');
|
||||||
$show->field('profit');
|
|
||||||
$show->field('created_at');
|
$show->field('created_at');
|
||||||
$show->tools(function (Tools $tools) {
|
$show->tools(function (Tools $tools) {
|
||||||
$tools->disableList();
|
$tools->disableList();
|
||||||
|
$tools->disableDelete();
|
||||||
|
$tools->disableEdit();
|
||||||
|
|
||||||
$tools->append(new ShowBalance());
|
$tools->append(new ShowBalance());
|
||||||
|
$tools->append(new ShowPassword());
|
||||||
});
|
});
|
||||||
|
|
||||||
$tab = new Tab();
|
$tab = new Tab();
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,7 @@
|
||||||
|
|
||||||
namespace Peidikeji\User\Http\Api;
|
namespace Peidikeji\User\Http\Api;
|
||||||
|
|
||||||
use App\Exceptions\BizException;
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Models\Sms;
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
use Illuminate\Validation\Rules\Password;
|
use Illuminate\Validation\Rules\Password;
|
||||||
|
|
@ -42,10 +40,10 @@ class AuthController extends Controller
|
||||||
]);
|
]);
|
||||||
$phone = $request->input('phone');
|
$phone = $request->input('phone');
|
||||||
|
|
||||||
$result = Sms::checkCode('login', $phone, $request->input('code'));
|
// $result = Sms::checkCode('login', $phone, $request->input('code'));
|
||||||
if (!$result) {
|
// if (!$result) {
|
||||||
return $this->error('验证码不正确或已过期');
|
// return $this->error('验证码不正确或已过期');
|
||||||
}
|
// }
|
||||||
|
|
||||||
$user = User::where('phone', $phone)->first();
|
$user = User::where('phone', $phone)->first();
|
||||||
if (!$user) {
|
if (!$user) {
|
||||||
|
|
@ -141,10 +139,10 @@ class AuthController extends Controller
|
||||||
return $this->error('用户已经注册');
|
return $this->error('用户已经注册');
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = Sms::checkCode('register', $phone, $request->input('code'));
|
// $result = Sms::checkCode('register', $phone, $request->input('code'));
|
||||||
if (!$result) {
|
// if (!$result) {
|
||||||
return $this->error('验证码不正确或已过期');
|
// return $this->error('验证码不正确或已过期');
|
||||||
}
|
// }
|
||||||
|
|
||||||
$user = $this->createUser(['phone' => $phone], $request->input('invite_code'));
|
$user = $this->createUser(['phone' => $phone], $request->input('invite_code'));
|
||||||
|
|
||||||
|
|
@ -160,10 +158,10 @@ class AuthController extends Controller
|
||||||
]);
|
]);
|
||||||
$phone = $request->input('phone');
|
$phone = $request->input('phone');
|
||||||
|
|
||||||
$result = Sms::checkCode('reset', $phone, $request->input('code'));
|
// $result = Sms::checkCode('reset', $phone, $request->input('code'));
|
||||||
if (!$result) {
|
// if (!$result) {
|
||||||
return $this->error('验证码不正确或已过期');
|
// return $this->error('验证码不正确或已过期');
|
||||||
}
|
// }
|
||||||
|
|
||||||
$user = User::where('phone', $phone)->first();
|
$user = User::where('phone', $phone)->first();
|
||||||
if (!$user) {
|
if (!$user) {
|
||||||
|
|
@ -187,35 +185,14 @@ class AuthController extends Controller
|
||||||
{
|
{
|
||||||
if ($invite_code) {
|
if ($invite_code) {
|
||||||
$inviterId = User::where('invite_code', $invite_code)->value('id');
|
$inviterId = User::where('invite_code', $invite_code)->value('id');
|
||||||
if (!$inviterId) {
|
if ($inviterId) {
|
||||||
throw new BizException('邀请码错误');
|
|
||||||
}
|
|
||||||
$attributes['inviter_id'] = $inviterId;
|
$attributes['inviter_id'] = $inviterId;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$user = User::create($attributes);
|
$user = User::create($attributes);
|
||||||
|
|
||||||
event(new UserRegister($user));
|
event(new UserRegister($user));
|
||||||
|
|
||||||
return $user;
|
return $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function resetPwd(Request $request)
|
|
||||||
{
|
|
||||||
$input = $request->validate([
|
|
||||||
'password' => 'required|current_password:api',
|
|
||||||
'new_password' => 'required',
|
|
||||||
], [
|
|
||||||
'password.current_password' => '密码错误',
|
|
||||||
]);
|
|
||||||
$user = auth('api')->user();
|
|
||||||
if (!$user || !Hash::check($input['password'], $user->password)) {
|
|
||||||
throw new BizException('密码错误');
|
|
||||||
}
|
|
||||||
|
|
||||||
$user->password = bcrypt($input['new_password']);
|
|
||||||
$user->save();
|
|
||||||
|
|
||||||
$user->tokens()->delete();
|
|
||||||
return $this->success('修改成功');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,30 +3,15 @@
|
||||||
namespace Peidikeji\User\Http\Resources;
|
namespace Peidikeji\User\Http\Resources;
|
||||||
|
|
||||||
use Illuminate\Http\Resources\Json\JsonResource;
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
use Illuminate\Http\Response;
|
|
||||||
|
|
||||||
class UserResource extends JsonResource
|
class UserResource extends JsonResource
|
||||||
{
|
{
|
||||||
public function toArray($request)
|
public function toArray($request)
|
||||||
{
|
{
|
||||||
return [
|
return array_merge(UserTinyResource::make($this), [
|
||||||
'id' => $this->id,
|
|
||||||
'name' => $this->name,
|
|
||||||
'username' => $this->username,
|
|
||||||
'avatar' => $this->avatar,
|
|
||||||
'balance' => $this->balance,
|
'balance' => $this->balance,
|
||||||
'profit' => $this->profit,
|
|
||||||
'invite_code' => $this->invite_code,
|
|
||||||
'inviter_id' => $this->inviter_id,
|
'inviter_id' => $this->inviter_id,
|
||||||
'phone' => $this->phone,
|
'phone' => $this->phone,
|
||||||
'gender' => $this->gender,
|
]);
|
||||||
'vip_expired_at' => $this->vip_expired_at?->timestamp,
|
|
||||||
'created_at' => $this->created_at?->timestamp,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function with($request)
|
|
||||||
{
|
|
||||||
return ['code' => Response::HTTP_OK, 'message' => ''];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
namespace Peidikeji\User\Http\Resources;
|
namespace Peidikeji\User\Http\Resources;
|
||||||
|
|
||||||
use Illuminate\Http\Resources\Json\JsonResource;
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
use Illuminate\Http\Response;
|
|
||||||
|
|
||||||
class UserTinyResource extends JsonResource
|
class UserTinyResource extends JsonResource
|
||||||
{
|
{
|
||||||
|
|
@ -12,19 +11,13 @@ class UserTinyResource extends JsonResource
|
||||||
return [
|
return [
|
||||||
'id' => $this->id,
|
'id' => $this->id,
|
||||||
'name' => $this->name,
|
'name' => $this->name,
|
||||||
|
'gender' => $this->gender,
|
||||||
'username' => $this->username,
|
'username' => $this->username,
|
||||||
'avatar' => $this->avatar,
|
'avatar' => $this->avatar,
|
||||||
'invite_code' => $this->invite_code,
|
'invite_code' => $this->invite_code,
|
||||||
'inviter_id' => $this->inviter_id,
|
|
||||||
'phone' => $this->phone ? substr_replace($this->phone, '****', 3, 4) : $this->phone,
|
'phone' => $this->phone ? substr_replace($this->phone, '****', 3, 4) : $this->phone,
|
||||||
'created_at' => $this->created_at?->timestamp,
|
'created_at' => $this->created_at?->timestamp,
|
||||||
'is_vip' => $this->isVip(),
|
|
||||||
'vip_expired_at' => $this->vip_expired_at?->timestamp,
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function with($request)
|
|
||||||
{
|
|
||||||
return ['code' => Response::HTTP_OK, 'message' => ''];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ class User extends Authenticatable
|
||||||
use HasDateTimeFormatter;
|
use HasDateTimeFormatter;
|
||||||
use Filterable;
|
use Filterable;
|
||||||
|
|
||||||
protected $fillable = ['username', 'password', 'avatar', 'balance', 'invite_code', 'inviter_id', 'inviter_path', 'name', 'phone'];
|
protected $fillable = ['username', 'password', 'avatar', 'balance', 'invite_code', 'inviter_id', 'inviter_path', 'name', 'gender', 'phone'];
|
||||||
|
|
||||||
protected static function booted()
|
protected static function booted()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ class UserBalance extends Model
|
||||||
|
|
||||||
protected $table = 'user_balance_logs';
|
protected $table = 'user_balance_logs';
|
||||||
|
|
||||||
protected $fillable = ['amount', 'balance', 'cate', 'description', 'remarks', 'source_id', 'source_type', 'user_id'];
|
protected $fillable = ['amount', 'balance', 'cate', 'description', 'remarks', 'source_id', 'source_type', 'user_id', 'user_name'];
|
||||||
|
|
||||||
public function user()
|
public function user()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue