diff --git a/backend/app/api/v1/user.go b/backend/app/api/v1/user.go index e1c974869..f511ce2fc 100644 --- a/backend/app/api/v1/user.go +++ b/backend/app/api/v1/user.go @@ -2,6 +2,7 @@ package v1 import ( "github.com/pkg/errors" + "strconv" "github.com/1Panel-dev/1Panel/app/api/v1/helper" "github.com/1Panel-dev/1Panel/app/dto" @@ -125,7 +126,8 @@ func (b *BaseApi) UpdateUser(c *gin.Context) { upMap := make(map[string]interface{}) upMap["email"] = req.Email - if err := userService.Update(upMap); err != nil { + upMap["name"] = req.Name + if err := userService.Update(req.ID, upMap); err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return } @@ -133,13 +135,14 @@ func (b *BaseApi) UpdateUser(c *gin.Context) { } func (b *BaseApi) GetUserInfo(c *gin.Context) { - name, ok := c.Params.Get("name") + idParam, ok := c.Params.Get("id") if !ok { helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, errors.New("error name")) return } + intNum, _ := strconv.Atoi(idParam) - user, err := userService.Get(name) + user, err := userService.Get(uint(intNum)) if err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return diff --git a/backend/app/dto/user.go b/backend/app/dto/user.go index 8a42f43a7..01008e474 100644 --- a/backend/app/dto/user.go +++ b/backend/app/dto/user.go @@ -21,6 +21,8 @@ type CaptchaResponse struct { } type UserUpdate struct { + ID uint `json:"id" validate:"required"` + Name string `json:"name" validate:"required"` Email string `json:"email" validate:"required,email"` } diff --git a/backend/app/repo/user.go b/backend/app/repo/user.go index bc27a640a..08aeab20e 100644 --- a/backend/app/repo/user.go +++ b/backend/app/repo/user.go @@ -12,7 +12,7 @@ type IUserRepo interface { GetList(opts ...DBOption) ([]model.User, error) Page(limit, offset int, opts ...DBOption) (int64, []model.User, error) Create(user *model.User) error - Update(vars map[string]interface{}) error + Update(id uint, vars map[string]interface{}) error Save(user model.User) error Delete(opts ...DBOption) error } @@ -57,8 +57,8 @@ func (u *UserRepo) Create(user *model.User) error { return global.DB.Create(user).Error } -func (u *UserRepo) Update(vars map[string]interface{}) error { - return global.DB.Model(&model.User{}).Updates(vars).Error +func (u *UserRepo) Update(id uint, vars map[string]interface{}) error { + return global.DB.Model(&model.User{}).Where("id = ?", id).Updates(vars).Error } func (u *UserRepo) Save(user model.User) error { diff --git a/backend/app/service/user.go b/backend/app/service/user.go index 2a34a6c36..c230c9bbd 100644 --- a/backend/app/service/user.go +++ b/backend/app/service/user.go @@ -17,22 +17,22 @@ import ( type UserService struct{} type IUserService interface { - Get(name string) (*dto.UserBack, error) + Get(name uint) (*dto.UserBack, error) Page(search dto.UserPage) (int64, interface{}, error) Register(userDto dto.UserCreate) error Login(c *gin.Context, info dto.Login) (*dto.UserLoginInfo, error) LogOut(c *gin.Context) error Delete(name string) error Save(req model.User) error - Update(upMap map[string]interface{}) error + Update(id uint, upMap map[string]interface{}) error } func NewIUserService() IUserService { return &UserService{} } -func (u *UserService) Get(name string) (*dto.UserBack, error) { - user, err := userRepo.Get(commonRepo.WithByName(name)) +func (u *UserService) Get(id uint) (*dto.UserBack, error) { + user, err := userRepo.Get(commonRepo.WithByID(id)) if err != nil { return nil, constant.ErrRecordNotFound } @@ -136,6 +136,6 @@ func (u *UserService) Save(req model.User) error { return userRepo.Save(req) } -func (u *UserService) Update(upMap map[string]interface{}) error { - return userRepo.Update(upMap) +func (u *UserService) Update(id uint, upMap map[string]interface{}) error { + return userRepo.Update(id, upMap) } diff --git a/backend/router/ro_user.go b/backend/router/ro_user.go index 501e83659..1c88b3741 100644 --- a/backend/router/ro_user.go +++ b/backend/router/ro_user.go @@ -18,6 +18,7 @@ func (s *UserRouter) InitUserRouter(Router *gin.RouterGroup) { withRecordRouter.POST("", baseApi.Register) withRecordRouter.DELETE("", baseApi.DeleteUser) userRouter.POST("/search", baseApi.PageUsers) - userRouter.GET(":name", baseApi.GetUserInfo) + userRouter.GET(":id", baseApi.GetUserInfo) + userRouter.POST(":id", baseApi.UpdateUser) } } diff --git a/frontend/src/api/interface/user.ts b/frontend/src/api/interface/user.ts index 0cf9ad659..4a7b585d0 100644 --- a/frontend/src/api/interface/user.ts +++ b/frontend/src/api/interface/user.ts @@ -2,8 +2,9 @@ import { CommonModel, ReqPage } from '.'; export namespace User { export interface User extends CommonModel { - username: string; + name: string; email: string; + password: string; } export interface UserCreate { username: string; @@ -11,7 +12,7 @@ export namespace User { } export interface ReqGetUserParams extends ReqPage { - username?: string; + name?: string; email?: string; } } diff --git a/frontend/src/api/modules/user.ts b/frontend/src/api/modules/user.ts index b2fbaac62..129df2489 100644 --- a/frontend/src/api/modules/user.ts +++ b/frontend/src/api/modules/user.ts @@ -13,52 +13,19 @@ export const getUserList = (params: User.ReqGetUserParams) => { }; // * 新增用户 -export const addUser = (params: User.UserCreate) => { - return http.post(`/users/add`, params); +export const addUser = (params: User.User) => { + return http.post(`/users`, params); }; -export const getUserById = (id: string) => { - return http.get(`/users/detail/${id}`); +export const getUserById = (id: number) => { + return http.get(`/users/${id}`); }; -// // * 批量添加用户 -// export const BatchAddUser = (params: FormData) => { -// return http.post(`/users/import`, params); -// }; - // * 编辑用户 export const editUser = (params: User.User) => { - return http.post(`/users/edit`, params); + return http.post(`/users/` + params.id, params); }; // * 批量删除用户 export const deleteUser = (params: { ids: number[] }) => { return http.post(`/users/delete`, params); }; - -// * 切换用户状态 -// export const changeUserStatus = (params: { id: string; status: number }) => { -// return http.post(`/users/change`, params); - -// }; - -// // * 重置用户密码 -// export const resetUserPassWord = (params: { id: string }) => { -// return http.post(`/users/rest_password`, params); -// }; - -// // * 导出用户数据 -// export const exportUserInfo = (params: User.ReqGetUserParams) => { -// return http.post(`/user/export`, params, { -// responseType: 'blob', -// }); -// }; - -// // * 获取用户状态 -// export const getUserStatus = () => { -// return http.get(`/user/status`); -// }; - -// // * 获取用户性别字典 -// export const getUserGender = () => { -// return http.get(`/user/gender`); -// }; diff --git a/frontend/src/global/form-rues.ts b/frontend/src/global/form-rues.ts index bf5b13508..78298ab1b 100644 --- a/frontend/src/global/form-rues.ts +++ b/frontend/src/global/form-rues.ts @@ -4,6 +4,7 @@ import { FormItemRule } from 'element-plus'; interface CommonRule { required: FormItemRule; name: FormItemRule; + email: FormItemRule; } export const Rules: CommonRule = { @@ -20,4 +21,9 @@ export const Rules: CommonRule = { trigger: 'blur', pattern: '/^[a-zA-Z0-9\u4e00-\u9fa5]{1}[a-zA-Z0-9_.\u4e00-\u9fa5-]{0,30}$/', }, + email: { + type: 'email', + message: i18n.global.t('commons.rule.email'), + trigger: 'blur', + }, }; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 6cf78b030..fabcf5c10 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -22,6 +22,12 @@ export default { deleteSuccess: 'Delete Success', loginSuccess: 'Login Success', requestTimeout: 'The request timed out, please try again later', + deleteTitle: 'Delete', + operationSuccess: 'Successful operation', + infoTitle: 'Hint', + sureLogOut: 'Are you sure you want to log out?', + createSuccess: 'Create Success', + updateSuccess: 'Update Success', }, login: { captchaHelper: 'Please enter the verification code', @@ -31,12 +37,14 @@ export default { password: 'Please enter a password', required: 'Please enter the required fields', commonName: 'Support English, Chinese, numbers, .-_, length 1-30', + email: 'Email format error', }, }, business: { user: { username: 'Username', email: 'Email', + password: 'Password', }, }, menu: { diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 6b7856c33..e70ad44df 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -26,6 +26,8 @@ export default { requestTimeout: '请求超时,请稍后重试', infoTitle: '提示', sureLogOut: '您是否确认退出登录?', + createSuccess: '新建成功', + updateSuccess: '更新成功', }, login: { captchaHelper: '请输入验证码', @@ -35,12 +37,14 @@ export default { password: '请输入密码', required: '请填写必填项', commonName: '支持英文、中文、数字、.-_,长度1-30', + email: '邮箱格式错误', }, }, business: { user: { username: '用户名', email: '邮箱', + password: '密码', }, }, menu: { diff --git a/frontend/src/layout/form-button.vue b/frontend/src/layout/form-button.vue new file mode 100644 index 000000000..bba22c5ab --- /dev/null +++ b/frontend/src/layout/form-button.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/src/layout/layout-content.vue b/frontend/src/layout/layout-content.vue index 103c18f52..c4a3c79ae 100644 --- a/frontend/src/layout/layout-content.vue +++ b/frontend/src/layout/layout-content.vue @@ -16,10 +16,11 @@
- -
- -
+ + + + +
@@ -28,6 +29,7 @@