diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 1b4e5b8f5..a0a913ee7 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -500,12 +500,14 @@ class DialogController extends AbstractController Base::checkClientVersion('0.13.33'); $user = User::auth(); // - $chat_nickname = Base::settingFind('system', 'chat_nickname'); - if ($chat_nickname == 'required') { - $nickname = User::select(['nickname as nickname_original'])->whereUserid($user->userid)->value('nickname_original'); - if (empty($nickname)) { + $chat_information = Base::settingFind('system', 'chat_information'); + if ($chat_information == 'required') { + if (empty($user->getRawOriginal('nickname'))) { return Base::retError('请设置昵称', [], -2); } + if (empty($user->getRawOriginal('tel'))) { + return Base::retError('请设置联系电话', [], -3); + } } // $dialog_id = Base::getPostInt('dialog_id'); diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index 99c9ea348..1b38b15e8 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -28,7 +28,7 @@ class SystemController extends AbstractController * @apiParam {String} type * - get: 获取(默认) * - all: 获取所有(需要管理员权限) - * - save: 保存设置(参数:['reg', 'reg_invite', 'login_code', 'password_policy', 'project_invite', 'chat_nickname', 'auto_archived', 'archived_day', 'all_group_mute', 'start_home', 'home_footer']) + * - save: 保存设置(参数:['reg', 'reg_invite', 'login_code', 'password_policy', 'project_invite', 'chat_information', 'auto_archived', 'archived_day', 'all_group_mute', 'start_home', 'home_footer']) * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -50,7 +50,7 @@ class SystemController extends AbstractController 'login_code', 'password_policy', 'project_invite', - 'chat_nickname', + 'chat_information', 'auto_archived', 'archived_day', 'all_group_mute', @@ -84,7 +84,7 @@ class SystemController extends AbstractController $setting['login_code'] = $setting['login_code'] ?: 'auto'; $setting['password_policy'] = $setting['password_policy'] ?: 'simple'; $setting['project_invite'] = $setting['project_invite'] ?: 'open'; - $setting['chat_nickname'] = $setting['chat_nickname'] ?: 'optional'; + $setting['chat_information'] = $setting['chat_information'] ?: 'optional'; $setting['auto_archived'] = $setting['auto_archived'] ?: 'close'; $setting['archived_day'] = floatval($setting['archived_day']) ?: 7; $setting['all_group_mute'] = $setting['all_group_mute'] ?: 'open'; diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index e6b055edb..e42b9a973 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -244,6 +244,7 @@ class UsersController extends AbstractController * @apiName editdata * * @apiParam {Object} [userimg] 会员头像(地址) + * @apiParam {String} [tel] 电话 * @apiParam {String} [nickname] 昵称 * @apiParam {String} [profession] 职位/职称 * @@ -264,6 +265,17 @@ class UsersController extends AbstractController $user->userimg = ''; } } + // 电话 + if (Arr::exists($data, 'tel')) { + $tel = trim(Request::input('tel')); + if (strlen($tel) < 6 || strlen($tel) > 20) { + return Base::retError('联系电话长度错误'); + } + if ($tel != $user->tel && User::whereTel($tel)->exists()) { + return Base::retError('联系电话已存在'); + } + $user->tel = $tel; + } // 昵称 if (Arr::exists($data, 'nickname')) { $nickname = trim(Request::input('nickname')); @@ -469,8 +481,9 @@ class UsersController extends AbstractController * @apiName lists * * @apiParam {Object} [keys] 搜索条件 - * - keys.key 邮箱/昵称/职位(赋值后keys.email、keys.nickname、keys.profession失效) + * - keys.key 邮箱/电话/昵称/职位(赋值后keys.email、keys.tel、keys.nickname、keys.profession失效) * - keys.email 邮箱 + * - keys.tel 电话 * - keys.nickname 昵称 * - keys.profession 职位 * - keys.identity 身份(如:admin、noadmin) @@ -504,6 +517,7 @@ class UsersController extends AbstractController } else { $builder->where(function($query) use ($keys) { $query->where("email", "like", "%{$keys['key']}%") + ->orWhere("tel", "like", "%{$keys['key']}%") ->orWhere("nickname", "like", "%{$keys['key']}%") ->orWhere("profession", "like", "%{$keys['key']}%"); }); @@ -512,6 +526,9 @@ class UsersController extends AbstractController if ($keys['email']) { $builder->where("email", "like", "%{$keys['email']}%"); } + if ($keys['tel']) { + $builder->where("tel", "like", "%{$keys['tel']}%"); + } if ($keys['nickname']) { $builder->where("nickname", "like", "%{$keys['nickname']}%"); } @@ -560,6 +577,7 @@ class UsersController extends AbstractController * - cleardisable 取消离职 * - delete 删除会员 * @apiParam {String} [email] 邮箱地址 + * @apiParam {String} [tel] 联系电话 * @apiParam {String} [password] 新的密码 * @apiParam {String} [nickname] 昵称 * @apiParam {String} [profession] 职位 @@ -639,6 +657,14 @@ class UsersController extends AbstractController } $upArray['email'] = $email; } + // 电话 + if (Arr::exists($data, 'tel')) { + $tel = trim($data['tel']); + if (User::whereTel($tel)->where('userid', '!=', $userInfo->userid)->exists()) { + return Base::retError('联系电话已存在'); + } + $upArray['tel'] = $tel; + } // 密码 if (Arr::exists($data, 'password')) { $password = trim($data['password']); diff --git a/app/Models/User.php b/app/Models/User.php index f550fabff..392d37e8c 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -16,6 +16,7 @@ use Carbon\Carbon; * @property string|null $az A-Z * @property string|null $pinyin 拼音(主要用于搜索) * @property string|null $email 邮箱 + * @property string|null $tel 联系电话 * @property string $nickname 昵称 * @property string|null $profession 职位/职称 * @property string $userimg 头像 @@ -56,6 +57,7 @@ use Carbon\Carbon; * @method static \Illuminate\Database\Eloquent\Builder|User wherePinyin($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereProfession($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereTaskDialogId($value) + * @method static \Illuminate\Database\Eloquent\Builder|User whereTel($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereUserid($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereUserimg($value) diff --git a/database/migrations/2022_07_08_150111_add_users_tel.php b/database/migrations/2022_07_08_150111_add_users_tel.php new file mode 100644 index 000000000..b9004b952 --- /dev/null +++ b/database/migrations/2022_07_08_150111_add_users_tel.php @@ -0,0 +1,34 @@ +string('tel', 50)->nullable()->default('')->after('email')->comment('联系电话'); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn("tel"); + }); + } +} diff --git a/resources/assets/js/pages/manage/components/TeamManagement.vue b/resources/assets/js/pages/manage/components/TeamManagement.vue index d254a7633..98f3ddc3b 100644 --- a/resources/assets/js/pages/manage/components/TeamManagement.vue +++ b/resources/assets/js/pages/manage/components/TeamManagement.vue @@ -222,6 +222,28 @@ export default { }, arr) } }, + { + title: this.$L('电话'), + key: 'tel', + minWidth: 80, + render: (h, {row}) => { + return h('QuickEdit', { + props: { + value: row.tel, + }, + on: { + 'on-update': (val, cb) => { + this.operationUser({ + userid: row.userid, + tel: val + }, true).finally(cb); + } + } + }, [ + h('AutoTip', row.tel || '-') + ]); + } + }, { title: this.$L('昵称'), key: 'nickname', diff --git a/resources/assets/js/pages/manage/setting/components/SystemSetting.vue b/resources/assets/js/pages/manage/setting/components/SystemSetting.vue index e2aafe3f9..fcb232f19 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemSetting.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemSetting.vue @@ -38,13 +38,13 @@
{{$L('开启:项目管理员可生成链接邀请成员加入项目。')}}
- - + + {{$L('可选')}} {{$L('必填')}} -
{{$L('必填:发送聊天内容前必须设置昵称。')}}
-
{{$L('如果必填,发送聊天前必须设置昵称。')}}
+
{{$L('必填:发送聊天内容前必须设置昵称、电话。')}}
+
{{$L('如果必填,发送聊天前必须设置昵称、电话。')}}
diff --git a/resources/assets/js/pages/manage/setting/personal.vue b/resources/assets/js/pages/manage/setting/personal.vue index 75faac09b..77a743728 100644 --- a/resources/assets/js/pages/manage/setting/personal.vue +++ b/resources/assets/js/pages/manage/setting/personal.vue @@ -5,9 +5,12 @@ {{$L('建议尺寸:200x200')}} - + + + + @@ -33,6 +36,8 @@ export default { formData: { userimg: '', + email: '', + tel: '', nickname: '', profession: '' }, @@ -54,6 +59,13 @@ export default { methods: { initLanguage() { this.ruleData = { + email: [ + {required: true, message: this.$L('请输入邮箱地址!'), trigger: 'change'}, + ], + tel: [ + {required: true, message: this.$L('请输入联系电话!'), trigger: 'change'}, + {type: 'string', min: 6, message: this.$L('电话长度至少6位!'), trigger: 'change'} + ], nickname: [ {required: true, message: this.$L('请输入昵称!'), trigger: 'change'}, {type: 'string', min: 2, message: this.$L('昵称长度至少2位!'), trigger: 'change'} @@ -62,11 +74,10 @@ export default { }, initData() { - if (!$A.strExists(this.userInfo.userimg, '/avatar')) { - this.$set(this.formData, 'userimg', this.userInfo.userimg); - } - const nickname = typeof this.userInfo.nickname_original !== "undefined" ? this.userInfo.nickname_original : this.userInfo.nickname; - this.$set(this.formData, 'nickname', nickname); + this.$set(this.formData, 'userimg', $A.strExists(this.userInfo.userimg, '/avatar') ? '' : this.userInfo.userimg); + this.$set(this.formData, 'email', this.userInfo.email); + this.$set(this.formData, 'tel', this.userInfo.tel); + this.$set(this.formData, 'nickname', typeof this.userInfo.nickname_original !== "undefined" ? this.userInfo.nickname_original : this.userInfo.nickname); this.$set(this.formData, 'profession', this.userInfo.profession); this.formData_bak = $A.cloneJSON(this.formData); }, diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index c8799a2e1..5900a4ddf 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -62,15 +62,22 @@ export default { } if (ret === -2 && params.checkNick !== false) { // 需要昵称 - dispatch("userNickNameInput").then(() => { - dispatch("call", Object.assign(cloneParams, { - checkNick: false - })).then(resolve).catch(reject); + dispatch("userEditInput", 'nickname').then(() => { + dispatch("call", cloneParams).then(resolve).catch(reject); }).catch(err => { reject({ret: -1, data, msg: err || $A.L('请设置昵称!')}) }); return; } + if (ret === -3 && params.checkTel !== false) { + // 需要联系电话 + dispatch("userEditInput", 'tel').then(() => { + dispatch("call", cloneParams).then(resolve).catch(reject); + }).catch(err => { + reject({ret: -1, data, msg: err || $A.L('请设置联系电话!')}) + }); + return; + } if (ret === 1) { resolve({data, msg}); } else { @@ -420,39 +427,50 @@ export default { }, /** - * 设置用户昵称 + * 设置用户信息 * @param dispatch + * @param type * @returns {Promise} */ - userNickNameInput({dispatch}) { - return new Promise(function (nameResolve, nameReject) { + userEditInput({dispatch}, type) { + return new Promise(function (userResolve, userReject) { + let desc = ''; + if (type === 'nickname') { + desc = '昵称'; + } else if (type === 'tel') { + desc = '联系电话'; + } else { + userReject('参数错误') + return + } setTimeout(_ => { $A.modalInput({ - title: "设置昵称", - placeholder: "请输入昵称", + title: `设置${desc}`, + placeholder: `请输入${desc}`, okText: "保存", onOk: (value) => { if (!value) { - return '请输入昵称' + return `请输入${desc}` } return new Promise((inResolve, inReject) => { dispatch("call", { url: 'users/editdata', data: { - nickname: value, + [type]: value, }, checkNick: false, + checkTel: false, }).then(() => { dispatch('getUserInfo').finally(_ => { inResolve() - nameResolve() + userResolve() }); }).catch(({msg}) => { inReject(msg) }); }) }, - onCancel: _ => nameReject + onCancel: _ => userReject }); }, 100) });