个人设置界面增加修改密码模块

其他零散改进不多赘述
This commit is contained in:
Chenx221 2024-03-03 15:32:49 +08:00
parent ae1ed4e1a0
commit 84b087362f
Signed by: chenx221
GPG Key ID: D7A9EC07024C3021
3 changed files with 90 additions and 18 deletions

View File

@ -32,6 +32,7 @@ class UserController extends Controller
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
'change-password' => ['POST'],
],
],
]
@ -323,7 +324,7 @@ class UserController extends Controller
/**
* @return string|Response
*/
public function actionInfo(): Response|string
public function actionInfo(string $focus = null): Response|string
{
if (Yii::$app->user->isGuest) {
Yii::$app->session->setFlash('error', '请先登录');
@ -331,14 +332,19 @@ class UserController extends Controller
}
$model = Yii::$app->user->identity;
$dataDirectory = Yii::getAlias(Yii::$app->params['dataDirectory']) . '/' . Yii::$app->user->id;
$usedSpace = FileSizeHelper::getDirectorySize($dataDirectory);
$usedSpace = FileSizeHelper::getDirectorySize(Yii::getAlias(Yii::$app->params['dataDirectory']) . '/' . Yii::$app->user->id);
$vaultUsedSpace = 0; // 保险箱已用空间暂时为0
$storageLimit = $model->storage_limit;
if (Yii::$app->request->isPost && $model->load(Yii::$app->request->post())) {
if ($model->save()) {
Yii::$app->session->setFlash('success', '个人简介已更新');
return $this->refresh();
return $this->render('info', [
'model' => $model,
'usedSpace' => $usedSpace, // B
'vaultUsedSpace' => $vaultUsedSpace, // B
'storageLimit' => $storageLimit, // MB
'focus' => 'bio',
]);
}
}
return $this->render('info', [
@ -346,7 +352,31 @@ class UserController extends Controller
'usedSpace' => $usedSpace, // B
'vaultUsedSpace' => $vaultUsedSpace, // B
'storageLimit' => $storageLimit, // MB
'focus' => $focus,
]);
}
/**
* @return Response|string
* @throws Exception
*/
public function actionChangePassword(): Response|string
{
if (Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = Yii::$app->user->identity;
$model->scenario = 'changePassword';
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
$model->password = Yii::$app->security->generatePasswordHash($model->newPassword);
if ($model->save(false)) {
Yii::$app->session->setFlash('success', 'Password changed successfully.');
} else {
Yii::$app->session->setFlash('error', 'Failed to change password.');
}
}
return $this->redirect(['user/info', 'focus' => 'password']);
}
}

View File

@ -36,6 +36,10 @@ class User extends ActiveRecord implements IdentityInterface
public $password2; // 重复密码
public $rememberMe; // 记住我
public $oldPassword; // 旧密码 修改密码用
public $newPassword; // 新密码 修改密码用
public $newPasswordRepeat; // 重复新密码 修改密码用
/**
* {@inheritdoc}
*/
@ -63,9 +67,28 @@ class User extends ActiveRecord implements IdentityInterface
['email', 'email', 'on' => 'register'],
['username', 'unique', 'on' => 'register'],
['email', 'unique', 'on' => 'register'],
[['oldPassword', 'newPassword', 'newPasswordRepeat'], 'required', 'on' => 'changePassword'],
['oldPassword', 'validatePassword2', 'on' => 'changePassword'],
['newPassword', 'string', 'min' => 6, 'max' => 24, 'on' => 'changePassword'],
['newPasswordRepeat', 'compare', 'compareAttribute' => 'newPassword', 'on' => 'changePassword'],
['newPassword', 'compare', 'compareAttribute' => 'oldPassword', 'operator' => '!=', 'message' => '新密码不能与旧密码相同', 'on' => 'changePassword'],
];
}
/**
* @param $attribute
* @param $params
* @return void
*/
public function validatePassword2($attribute, $params): void
{
if (!$this->hasErrors()) {
if (!Yii::$app->security->validatePassword($this->$attribute, $this->password)) {
$this->addError($attribute, '原密码不匹配');
}
}
}
/**
* {@inheritdoc}
*/

View File

@ -8,10 +8,14 @@
/* @var $storageLimit int */
/* @var $focus string */
use app\assets\FontAwesomeAsset;
use app\utils\FileSizeHelper;
use app\utils\IPLocation;
use yii\bootstrap5\ActiveForm;
use yii\bootstrap5\Html;
use yii\helpers\Url;
$this->title = '个人设置';
FontAwesomeAsset::register($this);
@ -75,8 +79,9 @@ $totalUsedPercent = min(($usedPercent + $vaultUsedPercent), 100); //总已用百
<div class="accordion userAccordion" id="userAccordion">
<div class="accordion-item">
<h2 class="accordion-header" id="headingStorage">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseStorage" aria-expanded="true">
<button class="accordion-button <?= ($focus === 'storage' || $focus === null) ? '' : 'collapsed' ?>"
type="button" data-bs-toggle="collapse"
data-bs-target="#collapseStorage" <?= ($focus === 'storage' || $focus === null) ? 'aria-expanded="true"' : '' ?>>
<span class="accordion-storage-content">
<span>
<i class="fa-solid fa-hard-drive"></i>
@ -88,7 +93,8 @@ $totalUsedPercent = min(($usedPercent + $vaultUsedPercent), 100); //总已用百
</span>
</button>
</h2>
<div id="collapseStorage" class="accordion-collapse collapse show">
<div id="collapseStorage"
class="accordion-collapse collapse <?= ($focus === 'storage' || $focus === null) ? 'show' : '' ?>">
<div class="accordion-body">
<div class="storage-info">
<div class="storage-columns">
@ -135,13 +141,14 @@ $totalUsedPercent = min(($usedPercent + $vaultUsedPercent), 100); //总已用百
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="headingBio">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseBio">
<button class="accordion-button <?= ($focus === 'bio') ? '' : 'collapsed' ?>" type="button"
data-bs-toggle="collapse"
data-bs-target="#collapseBio" <?= ($focus === 'bio') ? 'aria-expanded="true"' : '' ?>>
<i class="fa-solid fa-address-card"></i>
<span>个人简介</span>
</button>
</h2>
<div id="collapseBio" class="accordion-collapse collapse">
<div id="collapseBio" class="accordion-collapse collapse <?= ($focus === 'bio') ? 'show' : '' ?>">
<div class="accordion-body">
<?php $form = yii\widgets\ActiveForm::begin(); ?>
<?= $form->field($model, 'bio')->textarea(['rows' => 6])->label('简介') ?>
@ -154,27 +161,39 @@ $totalUsedPercent = min(($usedPercent + $vaultUsedPercent), 100); //总已用百
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="headingPassword">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#collapsePassword">
<button class="accordion-button <?= ($focus === 'password') ? '' : 'collapsed' ?>" type="button"
data-bs-toggle="collapse"
data-bs-target="#collapsePassword" <?= ($focus === 'password') ? 'aria-expanded="true"' : '' ?>>
<i class="fa-solid fa-key"></i>
<span>修改密码</span>
</button>
</h2>
<div id="collapsePassword" class="accordion-collapse collapse">
<div id="collapsePassword" class="accordion-collapse collapse <?= ($focus === 'password') ? 'show' : '' ?>">
<div class="accordion-body">
<!-- 修改密码表单相关内容 -->
<?php $form = ActiveForm::begin([
'action' => Url::to(['user/change-password']),
'method' => 'post'
]); ?>
<?= $form->field($model, 'oldPassword')->passwordInput()->label('原密码') ?>
<?= $form->field($model, 'newPassword')->passwordInput()->label('新密码') ?>
<?= $form->field($model, 'newPasswordRepeat')->passwordInput()->label('重复新密码') ?>
<div class="form-group">
<?= Html::submitButton('保存', ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="headingAdvanced">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseAdvanced">
<button class="accordion-button <?= ($focus === 'advanced') ? '' : 'collapsed' ?>" type="button"
data-bs-toggle="collapse"
data-bs-target="#collapseAdvanced" <?= ($focus === 'advanced') ? 'aria-expanded="true"' : '' ?>>
<i class="fa-solid fa-flask"></i>
<span>高级选项</span>
</button>
</h2>
<div id="collapseAdvanced" class="accordion-collapse collapse">
<div id="collapseAdvanced" class="accordion-collapse collapse <?= ($focus === 'advanced') ? 'show' : '' ?>">
<div class="accordion-body">
<!-- 高级选项相关内容 -->
</div>