个人信息完成

pull/1/head
李强 2021-02-27 20:38:44 +08:00
parent b65a5bdf6d
commit 9398339e0e
10 changed files with 185 additions and 106 deletions

View File

@ -24,7 +24,12 @@ urlpatterns = [
re_path('user/changeStatus/', UserProfileModelViewSet.as_view({'put': 'change_status'})), re_path('user/changeStatus/', UserProfileModelViewSet.as_view({'put': 'change_status'})),
# 获取用户详情 # 获取用户详情
re_path('user/details/', UserProfileModelViewSet.as_view({'get': 'get_user_details'})), re_path('user/details/', UserProfileModelViewSet.as_view({'get': 'get_user_details'})),
# 后台重置密码
re_path('user/resetPwd/', UserProfileModelViewSet.as_view({'put': 'reset_pwd'})), re_path('user/resetPwd/', UserProfileModelViewSet.as_view({'put': 'reset_pwd'})),
# 用户自己重置密码
re_path('user/profile/updatePwd/', UserProfileModelViewSet.as_view({'put': 'update_pwd'})),
# 获取、更新用户个人信息
re_path('user/profile/', UserProfileModelViewSet.as_view({'get': 'profile','put': 'put_profile'})),
] ]
urlpatterns += router.urls urlpatterns += router.urls

View File

@ -1,3 +1,4 @@
from django.contrib.auth import authenticate
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.views import APIView from rest_framework.views import APIView
@ -8,7 +9,7 @@ from apps.permission.serializers import UserProfileSerializer, MenuSerializer, R
MenuCreateUpdateSerializer, DeptSerializer, DeptCreateUpdateSerializer, PostSerializer, PostCreateUpdateSerializer, \ MenuCreateUpdateSerializer, DeptSerializer, DeptCreateUpdateSerializer, PostSerializer, PostCreateUpdateSerializer, \
RoleCreateUpdateSerializer, DeptTreeSerializer, MenuTreeSerializer, UserProfileCreateUpdateSerializer, \ RoleCreateUpdateSerializer, DeptTreeSerializer, MenuTreeSerializer, UserProfileCreateUpdateSerializer, \
PostSimpleSerializer, RoleSimpleSerializer PostSimpleSerializer, RoleSimpleSerializer
from utils.response import SuccessResponse from utils.response import SuccessResponse, ErrorResponse
class GetUserProfileView(APIView): class GetUserProfileView(APIView):
@ -279,3 +280,56 @@ class UserProfileModelViewSet(CustomModelViewSet):
if hasattr(self, 'handle_logging'): if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs) self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data) return SuccessResponse(serializer.data)
def profile(self, request: Request, *args, **kwargs):
"""
获取用户个人信息
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.user.id)
serializer = self.get_serializer(instance)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)
def put_profile(self, request: Request, *args, **kwargs):
"""
更新用户个人信息
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.user.id)
instance.name = request.data.get('name',None)
instance.mobile = request.data.get('mobile',None)
instance.email = request.data.get('email',None)
instance.gender = request.data.get('gender',None)
instance.save()
serializer = self.get_serializer(instance)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)
def update_pwd(self, request: Request, *args, **kwargs):
"""
个人修改密码
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.user.id)
instance.mobile = request.data.get('newPassword',None)
if not authenticate(username=request.user.username, password=request.data.get('oldPassword',None)):
return ErrorResponse(msg='旧密码不正确!')
instance.set_password(request.data.get('newPassword'))
instance.save()
serializer = self.get_serializer(instance)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)

View File

@ -90,7 +90,7 @@ export function getUserProfile() {
// 修改用户个人信息 // 修改用户个人信息
export function updateUserProfile(data) { export function updateUserProfile(data) {
return request({ return request({
url: '/permission/user/profile', url: '/permission/user/profile/',
method: 'put', method: 'put',
data: data data: data
}) })
@ -105,7 +105,7 @@ export function updateUserPwd(oldPassword, newPassword) {
return request({ return request({
url: '/permission/user/profile/updatePwd/', url: '/permission/user/profile/updatePwd/',
method: 'put', method: 'put',
params: data data: data
}) })
} }

View File

@ -225,7 +225,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="任务分组:">{{ jobGroupFormat(form) }}</el-form-item> <el-form-item label="任务分组:">{{ jobGroupFormat(form) }}</el-form-item>
<el-form-item label="创建时间:">{{ form.createTime }}</el-form-item> <el-form-item label="创建时间:">{{ form.create_datetime }}</el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="cron表达式">{{ form.cronExpression }}</el-form-item> <el-form-item label="cron表达式">{{ form.cronExpression }}</el-form-item>

View File

@ -104,9 +104,9 @@
<el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" /> <el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
<el-table-column label="日志信息" align="center" prop="jobMessage" :show-overflow-tooltip="true" /> <el-table-column label="日志信息" align="center" prop="jobMessage" :show-overflow-tooltip="true" />
<el-table-column label="执行状态" align="center" prop="status" :formatter="statusFormat" /> <el-table-column label="执行状态" align="center" prop="status" :formatter="statusFormat" />
<el-table-column label="执行时间" align="center" prop="createTime" width="180"> <el-table-column label="执行时间" align="center" prop="create_datetime" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.create_datetime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@ -140,7 +140,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="任务分组:">{{ form.jobGroup }}</el-form-item> <el-form-item label="任务分组:">{{ form.jobGroup }}</el-form-item>
<el-form-item label="执行时间:">{{ form.createTime }}</el-form-item> <el-form-item label="执行时间:">{{ form.create_datetime }}</el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="调用方法:">{{ form.invokeTarget }}</el-form-item> <el-form-item label="调用方法:">{{ form.invokeTarget }}</el-form-item>

View File

@ -88,9 +88,9 @@
<el-table-column label="岗位名称" align="center" prop="postName" /> <el-table-column label="岗位名称" align="center" prop="postName" />
<el-table-column label="岗位排序" align="center" prop="postSort" /> <el-table-column label="岗位排序" align="center" prop="postSort" />
<el-table-column label="状态" align="center" prop="status" :formatter="statusFormat" /> <el-table-column label="状态" align="center" prop="status" :formatter="statusFormat" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <el-table-column label="创建时间" align="center" prop="create_datetime" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.create_datetime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">

View File

@ -118,9 +118,9 @@
></el-switch> ></el-switch>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <el-table-column label="创建时间" align="center" prop="create_datetime" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.create_datetime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">

View File

@ -153,7 +153,7 @@
></el-switch> ></el-switch>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160"> <el-table-column label="创建时间" align="center" prop="create_datetime" v-if="columns[6].visible" width="160">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.create_datetime) }}</span> <span>{{ parseTime(scope.row.create_datetime) }}</span>
</template> </template>

View File

@ -8,32 +8,38 @@
</div> </div>
<div> <div>
<div class="text-center"> <div class="text-center">
<userAvatar :user="user" /> <userAvatar :user="user"/>
</div> </div>
<ul class="list-group list-group-striped"> <ul class="list-group list-group-striped">
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="user" />用户名称 <svg-icon icon-class="user"/>
<div class="pull-right">{{ user.userName }}</div> 用户名称
<div class="pull-right">{{ user.username }}</div>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="phone" />手机号码 <svg-icon icon-class="phone"/>
<div class="pull-right">{{ user.phonenumber }}</div> 手机号码
<div class="pull-right">{{ user.mobile }}</div>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="email" />用户邮箱 <svg-icon icon-class="email"/>
用户邮箱
<div class="pull-right">{{ user.email }}</div> <div class="pull-right">{{ user.email }}</div>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="tree" />所属部门 <svg-icon icon-class="tree"/>
所属部门
<div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div> <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="peoples" />所属角色 <svg-icon icon-class="peoples"/>
所属角色
<div class="pull-right">{{ roleGroup }}</div> <div class="pull-right">{{ roleGroup }}</div>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="date" />创建日期 <svg-icon icon-class="date"/>
<div class="pull-right">{{ user.createTime }}</div> 创建日期
<div class="pull-right">{{ user.create_datetime }}</div>
</li> </li>
</ul> </ul>
</div> </div>
@ -46,10 +52,10 @@
</div> </div>
<el-tabs v-model="activeTab"> <el-tabs v-model="activeTab">
<el-tab-pane label="基本资料" name="userinfo"> <el-tab-pane label="基本资料" name="userinfo">
<userInfo :user="user" /> <userInfo :user="user"/>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="修改密码" name="resetPwd"> <el-tab-pane label="修改密码" name="resetPwd">
<resetPwd :user="user" /> <resetPwd :user="user"/>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-card> </el-card>
@ -59,14 +65,14 @@
</template> </template>
<script> <script>
import userAvatar from "./userAvatar"; import userAvatar from "./userAvatar";
import userInfo from "./userInfo"; import userInfo from "./userInfo";
import resetPwd from "./resetPwd"; import resetPwd from "./resetPwd";
import { getUserProfile } from "@/api/permission/user"; import {getUserProfile} from "@/api/permission/user";
export default { export default {
name: "Profile", name: "Profile",
components: { userAvatar, userInfo, resetPwd }, components: {userAvatar, userInfo, resetPwd},
data() { data() {
return { return {
user: {}, user: {},
@ -82,10 +88,14 @@ export default {
getUser() { getUser() {
getUserProfile().then(response => { getUserProfile().then(response => {
this.user = response.data; this.user = response.data;
this.roleGroup = response.roleGroup; this.roleGroup = response.data.role.map(val => {
this.postGroup = response.postGroup; return val.roleName
}).toString();
this.postGroup = response.data.post.map(val => {
return val.postName
}).toString();
}); });
} }
} }
}; };
</script> </script>

View File

@ -1,18 +1,21 @@
<template> <template>
<el-form ref="form" :model="user" :rules="rules" label-width="80px"> <el-form ref="form" :model="user" :rules="rules" label-width="80px">
<el-form-item label="用户昵称" prop="nickName"> <el-form-item label="用户昵称" prop="username">
<el-input v-model="user.nickName" /> <el-input v-model="user.username"/>
</el-form-item> </el-form-item>
<el-form-item label="手机号码" prop="phonenumber"> <el-form-item label="手机号码" prop="mobile">
<el-input v-model="user.phonenumber" maxlength="11" /> <el-input v-model="user.mobile" maxlength="11"/>
</el-form-item> </el-form-item>
<el-form-item label="邮箱" prop="email"> <el-form-item label="邮箱" prop="email">
<el-input v-model="user.email" maxlength="50" /> <el-input v-model="user.email" maxlength="50"/>
</el-form-item> </el-form-item>
<el-form-item label="性别"> <el-form-item label="性别">
<el-radio-group v-model="user.sex"> <el-radio-group v-model="user.gender">
<el-radio label="0"></el-radio> <el-radio
<el-radio label="1"></el-radio> v-for="dict in sexOptions"
:label="dict.dictValue"
>{{dict.dictLabel}}
</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -23,9 +26,9 @@
</template> </template>
<script> <script>
import { updateUserProfile } from "@/api/permission/user"; import {updateUserProfile} from "@/api/permission/user";
export default { export default {
props: { props: {
user: { user: {
type: Object type: Object
@ -35,28 +38,35 @@ export default {
return { return {
// //
rules: { rules: {
nickName: [ username: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" } {required: true, message: "用户昵称不能为空", trigger: "blur"}
], ],
email: [ email: [
{ required: true, message: "邮箱地址不能为空", trigger: "blur" }, {required: true, message: "邮箱地址不能为空", trigger: "blur"},
{ {
type: "email", type: "email",
message: "'请输入正确的邮箱地址", message: "'请输入正确的邮箱地址",
trigger: ["blur", "change"] trigger: ["blur", "change"]
} }
], ],
phonenumber: [ mobile: [
{ required: true, message: "手机号码不能为空", trigger: "blur" }, {required: true, message: "手机号码不能为空", trigger: "blur"},
{ {
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码", message: "请输入正确的手机号码",
trigger: "blur" trigger: "blur"
} }
] ]
} },
//
sexOptions: [],
}; };
}, },
created() {
this.getDicts("sys_user_sex").then(response => {
this.sexOptions = response.data;
});
},
methods: { methods: {
submit() { submit() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
@ -69,8 +79,8 @@ export default {
}, },
close() { close() {
this.$store.dispatch("tagsView/delView", this.$route); this.$store.dispatch("tagsView/delView", this.$route);
this.$router.push({ path: "/index" }); this.$router.push({path: "/index"});
} }
} }
}; };
</script> </script>