AdminForm.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. namespace backendApi\modules\v1\models;
  3. use common\components\Model;
  4. use common\helpers\Date;
  5. use common\libs\logging\operate\AdminOperate;
  6. /**
  7. * Login form
  8. */
  9. class AdminForm extends Model
  10. {
  11. public $id;
  12. public $adminName;
  13. public $realName;
  14. public $remark;
  15. public $isEnable;
  16. public $isModifyPassword;
  17. public $bindIp;
  18. public $email;
  19. public $oldPassword;
  20. public $password;
  21. public $surePassword;
  22. public $roleId;
  23. public function init() {
  24. parent::init();
  25. $this->adminOperateLogger = new AdminOperate([
  26. 'fetchClass' => Admin::class,
  27. ]);
  28. }
  29. /**
  30. * @inheritdoc
  31. */
  32. public function rules()
  33. {
  34. return [
  35. [['id', 'adminName', 'realName', 'oldPassword', 'password', 'surePassword', 'roleId', 'remark', 'isEnable', 'isModifyPassword', 'bindIp', 'email'], 'trim'],
  36. [['id', 'adminName', 'realName', 'roleId'], 'required'],
  37. [['password', 'surePassword'], 'required', 'on'=>['add', 'changePassword', 'noLoginModifyPassword']],
  38. [['adminName', 'oldPassword'], 'required', 'on'=>['noLoginModifyPassword']],
  39. [['adminName'], 'unique', 'targetClass'=>Admin::class, 'targetAttribute'=>'ADMIN_NAME', 'on'=>['add']],
  40. ['surePassword', 'compare', 'compareAttribute'=>'password', 'message' => '两次密码必须一致'],
  41. // [['email', 'isEmail']]
  42. ];
  43. }
  44. /**
  45. * 指定校验场景
  46. * @return array
  47. */
  48. public function scenarios()
  49. {
  50. $parentScenarios = parent::scenarios();
  51. $customScenarios = [
  52. 'add' => ['adminName', 'realName', 'password', 'surePassword', 'roleId', 'remark', 'isEnable', 'isModifyPassword', 'bindIp', 'email'],
  53. 'edit' => ['id', 'password', 'surePassword', 'roleId', 'realName', 'remark', 'isEnable', 'isModifyPassword', 'bindIp', 'email'],
  54. 'changePassword' => ['password', 'surePassword'],
  55. 'noLoginModifyPassword' => ['adminName', 'oldPassword', 'password', 'surePassword'],
  56. ];
  57. return array_merge($parentScenarios, $customScenarios);
  58. }
  59. public function isEmail()
  60. {
  61. $pattern = "/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/";
  62. if ($this->email && !preg_match($pattern, $this->email)) {
  63. return false;
  64. }
  65. return true;
  66. }
  67. public function attributeLabels()
  68. {
  69. return [
  70. 'id' => 'ID',
  71. 'adminName' => '管理员用户名',
  72. 'realName' => '管理员会员姓名',
  73. 'remark' => '备注',
  74. 'isEnable' => '是否启用',
  75. 'isModifyPassword' => '是否修改密码',
  76. 'bindIp' => '绑定IP',
  77. 'email' => '邮箱',
  78. 'oldPassword' => '原密码',
  79. 'password' => '密码',
  80. 'surePassword' => '确认密码',
  81. 'roleId' => '角色',
  82. ];
  83. }
  84. /**
  85. * 添加
  86. * @return Admin|null
  87. * @throws \yii\base\Exception
  88. */
  89. public function edit(){
  90. if(!$this->validate()){
  91. return null;
  92. }
  93. // 邮箱验证
  94. if ($this->email && !$this->isEmail()) {
  95. $this->addError('emailErr', '邮箱格式错误');
  96. return null;
  97. }
  98. if($this->scenario == 'add'){
  99. $model = new Admin();
  100. $model->ADMIN_NAME = strtolower($this->adminName);
  101. $model->REAL_NAME = $this->realName;
  102. $model->ROLE_ID = $this->roleId;
  103. $model->REMARK = $this->remark;
  104. $model->IS_ENABLE = $this->isEnable ? $this->isEnable : 0;
  105. $model->IS_MODIFY_PASSWORD = $this->isModifyPassword ? $this->isModifyPassword : 0;
  106. $model->BIND_IP = $this->bindIp;
  107. $model->EMAIL = $this->email;
  108. $model->CREATE_ADMIN = \Yii::$app->user->id;
  109. $model->CREATED_AT = Date::nowTime();
  110. } elseif($this->scenario == 'edit') {
  111. $model = Admin::findOne(['ID'=>$this->id]);
  112. $this->adminOperateLogger->beforeUpdate($model);
  113. $model->REAL_NAME = $this->realName;
  114. $model->ROLE_ID = $this->roleId;
  115. $model->REMARK = $this->remark;
  116. $model->IS_ENABLE = $this->isEnable ? $this->isEnable : 0;
  117. $model->IS_MODIFY_PASSWORD = $this->isModifyPassword ? $this->isModifyPassword : 0;
  118. $model->BIND_IP = $this->bindIp;
  119. $model->EMAIL = $this->email;
  120. $model->UPDATE_ADMIN = \Yii::$app->user->id;
  121. $model->UPDATED_AT = Date::nowTime();
  122. } elseif($this->scenario == 'changePassword') {
  123. $model = Admin::findOne(['ID'=>\Yii::$app->user->id]);
  124. } elseif($this->scenario == 'noLoginModifyPassword') {
  125. $model = Admin::findOne(["ADMIN_NAME"=>$this->adminName]);
  126. if( !$model ) {
  127. $this->addError('noLoginModifyPassword', '不存在的用户名');
  128. return null;
  129. }
  130. if( $this->oldPassword === $this->password ) {
  131. $this->addError('noLoginModifyPassword', '登录密码没有发生改变');
  132. return null;
  133. }
  134. if ( !$model->validatePassword($this->oldPassword) ) {
  135. $this->addError('noLoginModifyPassword', '原登录密码错误');
  136. return null;
  137. }
  138. $model->IS_MODIFY_PASSWORD = 0;
  139. }else {
  140. $this->addError('id', '提交场景不存在');
  141. return null;
  142. }
  143. // 给密码进行加密 ,如果需要添加验证密码安全验证时 ,可以在这个地方加
  144. if($this->password){
  145. if ($this->scenario == 'changePassword' || $this->scenario == 'noLoginModifyPassword'){
  146. // 进行规则的判断
  147. $message = $model->verificationPassword($this->password,$this->scenario,$model);
  148. if ( $message['code'] != 200 ){
  149. $this->addError($message['type'], $message['message']);
  150. return null;
  151. }
  152. }
  153. $model->PASSWORD_HASH = \Yii::$app->security->generatePasswordHash($this->password);
  154. }
  155. // 执行修改或添加 , 如果执行不成功就在这里报出错误
  156. if(!$model->save()){
  157. $this->addErrors($model->getErrors());
  158. return null;
  159. }
  160. // 执行完成后根据对应的类型写入日志
  161. if($this->scenario == 'add'){
  162. $this->adminOperateLogger->afterInsert($model)->clean()->save([
  163. 'optType' => '添加管理员',
  164. 'userName' => $model->ADMIN_NAME,
  165. 'remark' => $this->remark,
  166. ]);
  167. } elseif($this->scenario == 'edit') {
  168. $this->adminOperateLogger->afterUpdate($model);
  169. $this->adminOperateLogger->clean()->save([
  170. 'optType' => '编辑管理员',
  171. 'userName' => $model->ADMIN_NAME,
  172. 'remark' => $this->remark,
  173. ]);
  174. } elseif($this->scenario == 'noLoginModifyPassword') {
  175. $this->adminOperateLogger->clean()->save([
  176. 'optType' => '不登录重置密码',
  177. 'userName' => $model->ADMIN_NAME,
  178. 'adminName' => $model->ADMIN_NAME,
  179. 'remark' => '不登录重置密码',
  180. ]);
  181. }else{
  182. $this->adminOperateLogger->clean()->save([
  183. 'optType' => '重置密码',
  184. 'userName' => Admin::getAdminNameById(\Yii::$app->user->id),
  185. 'remark' => $this->remark,
  186. ]);
  187. }
  188. return $model;
  189. }
  190. /**
  191. * 删除管理员前
  192. * @param $selected
  193. * @throws \Exception
  194. */
  195. public function beforeDelete($selected) {
  196. foreach ($selected as $value){
  197. if($value==\Yii::$app->user->id){
  198. throw new \Exception('无法删除自己');
  199. }
  200. }
  201. $this->adminOperateLogger->setIsBatch(true)->beforeDelete($selected, 'ID');
  202. }
  203. /**
  204. * 删除管理员
  205. * @param $selected
  206. */
  207. public function delete($selected) {
  208. $this->adminOperateLogger->clean()->save([
  209. 'optType' => '删除管理员',
  210. ]);
  211. }
  212. }