完成用户资料修改接口

dev
truthhun 2 years ago
parent 115b582525
commit 126f75f318

@ -51,11 +51,6 @@ message LoginReply {
User user = 2;
}
message UpdateUserRequest {
int64 id = 1;
string name = 2;
}
message DeleteUserRequest { repeated int64 id = 1; }
message GetUserRequest { int64 id = 1; }
@ -111,7 +106,7 @@ service UserAPI {
// ID
// 穿ID
rpc UpdateUserPassword(UpdateUserRequest) returns (User) {
rpc UpdateUserPassword(User) returns (google.protobuf.Empty) {
option (google.api.http) = {
put : '/api/v1/user/password',
body : '*',
@ -120,9 +115,9 @@ service UserAPI {
// ID
// 穿ID
rpc UpdateUser(User) returns (User) {
rpc UpdateUser(User) returns (google.protobuf.Empty) {
option (google.api.http) = {
put : '/api/v1/user/password',
put : '/api/v1/user',
body : '*',
};
}

@ -20,6 +20,12 @@ import (
"google.golang.org/protobuf/types/known/emptypb"
)
const (
ErrorMessageUsernameOrPasswordError = "用户名或密码不正确"
ErrorMessageInvalidToken = "您未登录或您的登录已过期,请重新登录"
ErrorMessagePermissionDenied = "您没有权限访问该资源"
)
type UserAPIService struct {
pb.UnimplementedUserAPIServer
dbModel *model.DBModel
@ -128,12 +134,58 @@ func (s *UserAPIService) GetUser(ctx context.Context, req *pb.GetUserRequest) (*
return &pb.User{}, nil
}
func (s *UserAPIService) UpdateUser(ctx context.Context, req *pb.User) (*pb.User, error) {
return &pb.User{}, nil
// UpdateUser 更改用户信息
// 1. 用户更改自身信息
// 2. 管理员更改用户信息
func (s *UserAPIService) UpdateUser(ctx context.Context, req *pb.User) (*emptypb.Empty, error) {
userClaims, ok := ctx.Value(auth.CtxKeyUserClaims).(*auth.UserClaims)
if !ok || s.dbModel.IsInvalidToken(userClaims.UUID) {
return nil, status.Errorf(codes.Unauthenticated, ErrorMessageInvalidToken)
}
// 允许更改的字段
fields := []string{"mobile", "email", "address", "signature", "avatar", "realname", "identity"}
user := &model.User{
Mobile: req.Mobile, Email: req.Email, Address: req.Address,
Signature: req.Signature, Avatar: req.Avatar,
Realname: req.Realname, Identity: req.Identity,
Status: int8(req.Status), Id: req.Id,
}
// 更改用户自己的资料
if req.Id <= 0 || req.Id == userClaims.UserId {
user.Id = userClaims.UserId
exist, _ := s.dbModel.GetUser(user.Id, "status")
if exist.Status != model.UserStatusNormal {
// 非正常的用户状态,禁止修改个人信息,以避免用户修改成非法信息等
return nil, status.Errorf(codes.InvalidArgument, "您的用户状态异常,禁止修改个人信息")
}
if err := s.dbModel.UpdateUser(user, fields...); err != nil {
return nil, status.Errorf(codes.Internal, err.Error())
}
return &emptypb.Empty{}, nil
}
// 管理员更改用户资料,验证是否有权限
fullMethod, _ := ctx.Value(auth.CtxKeyFullMethod).(string)
yes := s.dbModel.CheckPermissionByUserId(userClaims.UserId, "", fullMethod)
if !yes {
return nil, status.Errorf(codes.PermissionDenied, ErrorMessagePermissionDenied)
}
// 对于管理员,允许该更用户状态
fields = append(fields, "status")
err := s.dbModel.UpdateUser(user, fields...)
if err != nil {
return nil, status.Errorf(codes.Internal, err.Error())
}
return &emptypb.Empty{}, nil
}
func (s *UserAPIService) UpdateUserPassword(ctx context.Context, req *pb.UpdateUserRequest) (*pb.User, error) {
return &pb.User{}, nil
func (s *UserAPIService) UpdateUserPassword(ctx context.Context, req *pb.User) (*emptypb.Empty, error) {
return &emptypb.Empty{}, nil
}
func (s *UserAPIService) DeleteUser(ctx context.Context, req *pb.DeleteUserRequest) (*emptypb.Empty, error) {

@ -0,0 +1,64 @@
# TODO
## API
### 用户模块
针对用户的相关操作
- [x] 用户注册
- [x] 用户登录
- [ ] 修改用户资料:普通用户修改个人资料,管理员可修改其他用户资料
- [ ] 查询个人资料
- [ ] 修改个人密码
- [ ] 退出登录
- [ ] 删除用户
- [ ] 查看用户列表
- [ ] 重置用户密码
- [ ] 上传用户头像
### 文档分类模块
文档分类的增删改查
### 文档模块
文档的增删改查,以及回收站管理功能
### 横幅模块
横幅的增删改查
### 系统配置模块
系统配置的增删改查
### 权限控制模块
权限分配与管理
### 配额模块
用户配额,比如:每天可以下载多少文档、上传多少文档、评论多少次、下载间隔、上传间隔、评论间隔等
### 评论模块
评论管理
### 通知模块
消息通知
### 搜索模块
文档和或用户搜索
### 附件模块
附件管理
### 任务模块
### 友链模块
友链管理

@ -10,6 +10,14 @@ import (
"gorm.io/gorm"
)
const (
UserStatusNormal = iota
UserStatusDisabled // 禁用
UserStatusPending // 审核中
UserStatusRejected // 拒绝
UserStatusIgnored // 忽略
)
type User struct {
Id int64 `form:"id" json:"id,omitempty" gorm:"primaryKey;autoIncrement;column:id;comment:用户 id;"`
Username string `form:"username" json:"username,omitempty" gorm:"column:username;type:varchar(64);size:64;index:username,unique;comment:用户名;"`

@ -34,7 +34,7 @@ export const updateUserPassword = (data) => {
export const updateUser = (data) => {
return service({
url: '/api/v1/user/password',
url: '/api/v1/user',
method: 'put',
data,
})
@ -63,5 +63,3 @@ export const getUserCaptcha = (params) => {
params,
})
}

@ -56,6 +56,12 @@ import { mapActions } from 'vuex'
import { getUserCaptcha } from '~/api/user'
export default {
name: 'FormLogin',
props: {
redirect: {
type: String,
default: '',
},
},
data() {
return {
user: {
@ -73,9 +79,19 @@ export default {
this.loadCaptcha()
},
methods: {
...mapActions('user', ['Login']),
...mapActions('user', ['login']),
async execLogin() {
await this.Login(this.user)
const res = await this.login(this.user)
if (res.status === 200) {
this.$message.success('登录成功')
setTimeout(() => {
if (this.redirect) {
this.$router.push(this.redirect)
} else {
this.$router.push({ name: 'index' })
}
}, 2000)
}
},
async loadCaptcha() {
const res = await getUserCaptcha({ type: 'login', t: Date.now() })

@ -1,6 +1,6 @@
<template>
<div class="com-form-profile">
<el-form label-position="top" label-width="80px" :model="profile">
<el-form label-position="left" label-width="80px" :model="profile">
<el-form-item label="用户名">
<el-input
v-model="profile.username"
@ -8,13 +8,7 @@
:disabled="true"
></el-input>
</el-form-item>
<el-form-item
label="真实姓名"
prop="realname"
:rules="[
{ required: true, trigger: 'blur', message: '请输入您的真实姓名' },
]"
>
<el-form-item label="真实姓名" prop="realname">
<el-input v-model="profile.realname"></el-input>
</el-form-item>
<el-form-item label="电子邮箱">
@ -23,6 +17,21 @@
<el-form-item label="联系电话">
<el-input v-model="profile.mobile"></el-input>
</el-form-item>
<el-form-item label="联系地址">
<el-input
v-model="profile.address"
type="textarea"
:rows="3"
></el-input>
</el-form-item>
<el-form-item label="个性签名">
<el-input
v-model="profile.signature"
type="textarea"
:rows="3"
></el-input>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@ -53,9 +62,9 @@ export default {
}
},
methods: {
...mapActions('user', ['setUserProfile']),
...mapActions('user', ['updateUser']),
async setProfile() {
const res = await this.setUserProfile(this.profile)
const res = await this.updateUser(this.profile)
if (res.status === 200) {
this.$emit('success', res)
}

@ -84,6 +84,10 @@
<i class="el-icon-link"></i>
<span slot="title">友链管理</span>
</el-menu-item>
<el-menu-item index="/admin/comment">
<i class="el-icon-chat-dot-square"></i>
<span slot="title">评论管理</span>
</el-menu-item>
<el-menu-item index="/admin/attachment">
<i class="el-icon-paperclip"></i>
<span slot="title">附件管理</span>
@ -114,8 +118,8 @@
<span>我的项目</span>
<el-dropdown style="float: right" trigger="click" @command="command">
<el-button>
<i class="el-icon-user" style="margin-right: 15px"> </i>
<span>{{ user.realname }}</span>
<i class="el-icon-user"></i>
<span>{{ user.username }}</span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="profile"> 个人资料 </el-dropdown-item>

@ -0,0 +1,16 @@
<template>
<div>
<div>{{ $route.name }}</div>
</div>
</template>
<script>
export default {
layout: 'admin',
head() {
return {
title: `面板 - MOREDOC · 魔刀文库`,
}
},
}
</script>

@ -4,7 +4,7 @@
<div slot="header" class="clearfix">
<span>管理员登录</span>
</div>
<form-login></form-login>
<form-login :redirect="'/admin'"></form-login>
</el-card>
</div>
</template>

@ -4,13 +4,14 @@ export const user = {
namespaced: true,
state: {
user: {
id: 0,
username: '',
realname: '',
email: '',
mobile: '',
avatar: '',
status: false,
limit: 0,
address: '',
signature: '',
},
token: '',
},
@ -29,7 +30,7 @@ export const user = {
},
actions: {
// 获取用户信息
async GetUser({ commit }) {
async getUser({ commit }) {
const res = await getUser()
if (res.status === 200) {
commit('setUser', res.data.data.user)
@ -52,7 +53,7 @@ export const user = {
}
return res
},
async Login({ commit }, loginInfo) {
async login({ commit }, loginInfo) {
const res = await login(loginInfo)
if (res.status === 200) {
commit('setUser', res.data.user)
@ -65,7 +66,7 @@ export const user = {
}
return res
},
Logout({ commit }) {
logout({ commit }) {
commit('logout')
},
},

Loading…
Cancel
Save