管理后台增加重置密码功能

pull/47/merge
isummer 2 years ago
parent 35b64d74de
commit 8fc1d353c9
  1. 8
      fir_admin/src/api/user.js
  2. 84
      fir_admin/src/views/userinfos/UserDetail.vue
  3. 2
      fir_client/src/components/FirLogin.vue
  4. 14
      fir_ser/admin/views/login.py

@ -53,3 +53,11 @@ export function updateCertificationInfo(data) {
data data
}) })
} }
export function resetPassword(data) {
return request({
url: '/user/info',
method: 'post',
data
})
}

@ -6,21 +6,21 @@
<el-form-item label="UID"> <el-form-item label="UID">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input :value="postForm.uid" disabled /> <el-input :value="postForm.uid" disabled/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="账号" prop="username"> <el-form-item label="账号" prop="username">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input v-model="postForm.username" /> <el-input v-model="postForm.username"/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="昵称"> <el-form-item label="昵称">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input v-model="postForm.first_name" /> <el-input v-model="postForm.first_name"/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
@ -28,7 +28,9 @@
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-select v-model="postForm.gender" class="filter-item" placeholder="Please select"> <el-select v-model="postForm.gender" class="filter-item" placeholder="Please select">
<el-option v-for="item in postForm.gender_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in postForm.gender_choices" :key="item.id" :label="item.name"
:value="item.id"
/>
</el-select> </el-select>
</el-col> </el-col>
</el-row> </el-row>
@ -37,7 +39,7 @@
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-select v-model="postForm.role" class="filter-item" placeholder="Please select"> <el-select v-model="postForm.role" class="filter-item" placeholder="Please select">
<el-option v-for="item in postForm.role_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in postForm.role_choices" :key="item.id" :label="item.name" :value="item.id"/>
</el-select> </el-select>
</el-col> </el-col>
</el-row> </el-row>
@ -46,7 +48,7 @@
<el-form-item label="邮箱" prop="email"> <el-form-item label="邮箱" prop="email">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input v-model="postForm.email" /> <el-input v-model="postForm.email"/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
@ -54,35 +56,37 @@
<el-form-item label="手机" prop="mobile"> <el-form-item label="手机" prop="mobile">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input v-model="postForm.mobile" /> <el-input v-model="postForm.mobile"/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="Q Q" prop="number"> <el-form-item label="Q Q" prop="number">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input v-model="postForm.qq" /> <el-input v-model="postForm.qq"/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="职位"> <el-form-item label="职位">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input v-model="postForm.job" /> <el-input v-model="postForm.job"/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="公司"> <el-form-item label="公司">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input v-model="postForm.company" /> <el-input v-model="postForm.company"/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="备注"> <el-form-item label="备注">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-input v-model="postForm.memo" :autosize="{ minRows: 4, maxRows: 6}" type="textarea" placeholder="Please input" /> <el-input v-model="postForm.memo" :autosize="{ minRows: 4, maxRows: 6}" type="textarea"
placeholder="Please input"
/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
@ -91,7 +95,9 @@
<el-form-item label="用户头像"> <el-form-item label="用户头像">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-image :src="postForm.head_img" :preview-src-list="[postForm.head_img]" fit="contain" style="width: 100px; height: 100px" /> <el-image :src="postForm.head_img" :preview-src-list="[postForm.head_img]" fit="contain"
style="width: 100px; height: 100px"
/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
@ -177,10 +183,16 @@
<el-form-item label="实名认证"> <el-form-item label="实名认证">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="16"> <el-col :span="16">
<el-select v-model="postForm.certification" class="filter-item" placeholder="Please select" :disabled="postForm.certification === -1"> <el-select v-model="postForm.certification" class="filter-item" placeholder="Please select"
<el-option v-for="item in postForm.certification_status_choices" :key="item.id" :label="item.name" :value="item.id" /> :disabled="postForm.certification === -1"
>
<el-option v-for="item in postForm.certification_status_choices" :key="item.id" :label="item.name"
:value="item.id"
/>
</el-select> </el-select>
<router-link v-if="postForm.certification_id" :to="{name: 'user_authentication_info_edit',params:{id:postForm.certification_id.id}}"> <router-link v-if="postForm.certification_id"
:to="{name: 'user_authentication_info_edit',params:{id:postForm.certification_id.id}}"
>
<el-button type="primary"> <el-button type="primary">
审核认证信息 审核认证信息
</el-button> </el-button>
@ -203,7 +215,7 @@
<el-form-item label="下载次数" prop="download_times"> <el-form-item label="下载次数" prop="download_times">
<el-row :gutter="12"> <el-row :gutter="12">
<el-col :span="8"> <el-col :span="8">
<el-input :value="postForm.download_times" disabled /> <el-input :value="postForm.download_times" disabled/>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<router-link v-if="postForm.id" :to="{name: 'order_info_list',params:{user_id:postForm.id}}"> <router-link v-if="postForm.id" :to="{name: 'order_info_list',params:{user_id:postForm.id}}">
@ -215,14 +227,14 @@
<el-form-item label="注册时间" prop="timestamp"> <el-form-item label="注册时间" prop="timestamp">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-date-picker :value="postForm.date_joined" type="datetime" disabled /> <el-date-picker :value="postForm.date_joined" type="datetime" disabled/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="应用版本历史记录"> <el-form-item label="应用版本历史记录">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-input v-model="postForm.history_release_limit" /> <el-input v-model="postForm.history_release_limit"/>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
@ -234,6 +246,9 @@
<el-col :span="8"> <el-col :span="8">
<el-button @click="add_amount_download_times(postForm.id)">下载次数充值</el-button> <el-button @click="add_amount_download_times(postForm.id)">下载次数充值</el-button>
</el-col> </el-col>
<el-col :span="8">
<el-button @click="reset_password(postForm.id)">重置密码</el-button>
</el-col>
<el-button v-if="!is_edit" type="primary" @click="is_edit=true">修改</el-button> <el-button v-if="!is_edit" type="primary" @click="is_edit=true">修改</el-button>
<div v-else> <div v-else>
<el-button type="primary" @click="is_edit=false">取消</el-button> <el-button type="primary" @click="is_edit=false">取消</el-button>
@ -245,7 +260,7 @@
<script> <script>
import { validURL } from '@/utils/validate' import { validURL } from '@/utils/validate'
import { getUserInfos, updateUserInfo } from '@/api/user' import { getUserInfos, resetPassword, updateUserInfo } from '@/api/user'
import { createOrderInfo } from '@/api/order' import { createOrderInfo } from '@/api/order'
import { changeStorageInfo, getStorageList } from '@/api/storage' import { changeStorageInfo, getStorageList } from '@/api/storage'
@ -277,7 +292,7 @@ const defaultForm = {
export default { export default {
name: 'UserDetail', name: 'UserDetail',
components: { }, filters: { components: {}, filters: {
userStatusFilter(status) { userStatusFilter(status) {
const statusMap = { const statusMap = {
true: '激活,允许登录', true: '激活,允许登录',
@ -341,8 +356,7 @@ export default {
storage_selection: [] storage_selection: []
} }
}, },
computed: { computed: {},
},
created() { created() {
if (this.isEdit) { if (this.isEdit) {
const id = this.$route.params && this.$route.params.id const id = this.$route.params && this.$route.params.id
@ -369,9 +383,33 @@ export default {
message: '取消充值' message: '取消充值'
}) })
}) })
}, reset_password(user_id) {
this.$prompt('请输入新密码,密码至少6位', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(({ value }) => {
resetPassword({ user_id: user_id, password: value }).then(res => {
if (res.code === 1000) {
this.$message.success('密码重置成功')
this.fetchData(user_id)
} else {
this.$message.error(res.msg)
}
})
}).catch((e) => {
console.log(e)
this.$message({
type: 'info',
message: '取消充值'
})
})
}, },
changeStorageData(force) { changeStorageData(force) {
changeStorageInfo({ id: this.postForm.id, use_storage_id: this.postForm.storage, force: force }).then(response => { changeStorageInfo({
id: this.postForm.id,
use_storage_id: this.postForm.storage,
force: force
}).then(response => {
this.$message.success('存储数据迁移并设置刷新成功') this.$message.success('存储数据迁移并设置刷新成功')
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)

@ -290,7 +290,7 @@ export default {
}); });
return return
} }
if (password.length > 6) { if (password.length >= 6) {
let params = { let params = {
"username": email, "username": email,
"password": password, "password": password,

@ -9,6 +9,7 @@ import logging
from django.contrib import auth from django.contrib import auth
from rest_framework.views import APIView from rest_framework.views import APIView
from api.models import UserInfo
from api.utils.auth.util import AuthInfo from api.utils.auth.util import AuthInfo
from api.utils.serializer import UserInfoSerializer from api.utils.serializer import UserInfoSerializer
from api.utils.utils import set_user_token from api.utils.utils import set_user_token
@ -81,3 +82,16 @@ class LoginUserView(APIView):
def get(self, request): def get(self, request):
serializer = UserInfoSerializer(request.user, ) serializer = UserInfoSerializer(request.user, )
return ApiResponse(data=serializer.data) return ApiResponse(data=serializer.data)
def post(self, request):
data = request.data
user_id = data.get('user_id')
password = data.get('password')
if user_id and password and len(password) >= 6:
user_obj = UserInfo.objects.filter(pk=user_id).first()
if user_obj:
user_obj.set_password(password)
user_obj.save(update_fields=['password'])
serializer = UserInfoSerializer(user_obj, )
return ApiResponse(data=serializer.data)
return ApiResponse(code=1001, msg='重置密码失败,用户不存在')

Loading…
Cancel
Save