Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
sun
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
钟尚武
sun
Commits
d379da40
Commit
d379da40
authored
Dec 03, 2018
by
Davve
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成用户密码重置
parent
049937f2
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
156 additions
and
107 deletions
+156
-107
account.py
api/account.py
+12
-3
urls.py
api/urls.py
+1
-0
user.py
api/user.py
+4
-0
settings.py
sun/settings.py
+8
-2
account.js
vu/src/api/account.js
+8
-0
list.vue
vu/src/views/account/list.vue
+123
-102
No files found.
api/account.py
View file @
d379da40
...
...
@@ -79,8 +79,6 @@ class LoginView(APIView):
raise
e
return
{
'data'
:
data
}
def
post
(
self
,
request
):
"""
登陆
...
...
@@ -116,10 +114,21 @@ class LoginView(APIView):
class
LogoutView
(
APIView
):
def
post
(
self
,
request
):
print
(
request
.
POST
)
self
.
rpc
[
'venus/sun/account/logout'
]()
.
unwrap
()
return
{
'session_key'
:
''
}
class
ResetPasswordView
(
APIView
):
def
post
(
self
,
request
):
id
=
request
.
POST
.
get
(
'id'
)
password
=
make_password
(
settings
.
OPERATOR_PASSWORD
)
try
:
self
.
rpc
[
'venus/sun/account/reset_password'
](
id
=
id
,
password
=
password
)
.
unwrap
()
except
Exception
as
e
:
raise
e
return
{
'message'
:
'操作成功'
}
api/urls.py
View file @
d379da40
...
...
@@ -23,6 +23,7 @@ urlpatterns = [
url
(
r'^account/login$'
,
LoginView
.
as_view
()),
url
(
r'^account/logout$'
,
LogoutView
.
as_view
()),
url
(
r'^account/get$'
,
LoginView
.
as_view
()),
url
(
r'^account/reset_password'
,
ResetPasswordView
.
as_view
()),
url
(
r'^account/list$'
,
AccountList
.
as_view
()),
url
(
r'^account/list/update$'
,
AccountList
.
as_view
()),
...
...
api/user.py
View file @
d379da40
...
...
@@ -4,8 +4,10 @@
# Date: 2018/11/15
import
json
from
django.conf
import
settings
from
utils.base
import
APIView
from
utils.time_utils
import
generate_id
from
django.contrib.auth.hashers
import
make_password
class
UserListView
(
APIView
):
...
...
@@ -36,10 +38,12 @@ class UserUpdateOrCreate(APIView):
id
=
request
.
POST
.
get
(
'id'
,
''
)
user_id
=
request
.
POST
.
get
(
'user_id'
,
''
)
tag_ids
=
list
(
map
(
lambda
x
:
x
.
split
(
":"
)[
0
],
json
.
loads
(
request
.
POST
.
get
(
'tags'
,
'[]'
))))
password
=
make_password
(
settings
.
PUPPET_PASSWORD
,
None
,
'pbkdf2_sha256'
)
if
not
user_id
:
user_id
=
generate_id
()
data
=
{
'user_id'
:
user_id
,
'password'
:
password
,
'is_recommend'
:
request
.
POST
.
get
(
'is_recommend'
),
'profile_pic'
:
request
.
POST
.
get
(
'avatar'
)[:
-
2
],
'nick_name'
:
request
.
POST
.
get
(
'nick_name'
),
...
...
sun/settings.py
View file @
d379da40
...
...
@@ -144,4 +144,10 @@ USERNAME = 'admin'
PASSWORD
=
'admin'
# 管理员头像
AVATAR
=
'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif'
\ No newline at end of file
AVATAR
=
'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif'
# 马甲用户密码
PUPPET_PASSWORD
=
123456
# 重置运营管理登陆密码
OPERATOR_PASSWORD
=
123456
\ No newline at end of file
vu/src/api/account.js
View file @
d379da40
...
...
@@ -31,3 +31,11 @@ export function fetchAccountDetail(id) {
params
:
{
id
}
})
}
export
function
resetPassword
(
data
)
{
return
request
({
url
:
'/api/account/reset_password'
,
method
:
'post'
,
data
})
}
vu/src/views/account/list.vue
View file @
d379da40
<
template
>
<div
class=
"app-container"
>
<div
class=
"filter-container"
>
<el-input
:placeholder=
"'搜素'"
v-model=
"listQuery.filter.value"
style=
"width: 180px;"
class=
"filter-item"
@
keyup
.
enter
.
native=
"handleFilter"
/>
<el-select
v-model=
"listQuery.filter.key"
:placeholder=
"'搜索字段'"
clearable
class=
"filter-item"
style=
"width: 110px"
>
<el-input
:placeholder=
"'搜素'"
v-model=
"listQuery.filter.value"
style=
"width: 180px;"
class=
"filter-item"
@
keyup
.
enter
.
native=
"handleFilter"
/>
<el-select
v-model=
"listQuery.filter.key"
:placeholder=
"'搜索字段'"
clearable
class=
"filter-item"
style=
"width: 110px"
>
<el-option
v-for=
"item in SearchTypeOptions"
:key=
"item.key"
:label=
"item.display_name"
:value=
"item.key"
/>
</el-select>
<el-button
v-waves
class=
"filter-item"
type=
"primary"
icon=
"el-icon-search"
@
click=
"handleFilter"
>
搜索
</el-button>
<el-button
class=
"filter-item"
style=
"margin-left: 10px;"
type=
"primary"
icon=
"el-icon-edit"
@
click=
"handleCreate"
>
创建
</el-button>
<el-button
class=
"filter-item"
style=
"margin-left: 10px;"
type=
"primary"
icon=
"el-icon-edit"
@
click=
"handleOfflineOrOnline('offline')"
>
下线
</el-button>
<el-button
class=
"filter-item"
style=
"margin-left: 10px;"
type=
"primary"
icon=
"el-icon-edit"
@
click=
"handleOfflineOrOnline('online')"
>
上线
</el-button>
<el-button
class=
"filter-item"
style=
"margin-left: 10px;"
type=
"primary"
icon=
"el-icon-edit"
@
click=
"handleCreate"
>
创建
</el-button>
<el-button
class=
"filter-item"
style=
"margin-left: 10px;"
type=
"primary"
icon=
"el-icon-edit"
@
click=
"handleOfflineOrOnline('offline')"
>
下线
</el-button>
<el-button
class=
"filter-item"
style=
"margin-left: 10px;"
type=
"primary"
icon=
"el-icon-edit"
@
click=
"handleOfflineOrOnline('online')"
>
上线
</el-button>
</div>
<el-table
v-loading=
"listLoading"
:data=
"list"
border
fit
highlight-current-row
style=
"width: 100%"
ref=
"multipleTable"
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
align=
"center"
></el-table-column>
<el-table-column
align=
"center"
label=
"账号ID"
>
<el-table
v-loading=
"listLoading"
:data=
"list"
border
fit
highlight-current-row
style=
"width: 100%"
ref=
"multipleTable"
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
align=
"center"
></el-table-column>
<el-table-column
align=
"center"
label=
"账号ID"
>
<template
slot-scope=
"scope"
>
<router-link
:to=
"'/account/edit/'+scope.row.id"
class=
"link-type"
>
<span>
{{
scope
.
row
.
id
}}
</span>
</router-link>
<span>
{{
scope
.
row
.
id
}}
</span>
</router-link>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"用户名"
>
<el-table-column
align=
"center"
label=
"用户名"
>
<
template
slot-scope=
"scope"
>
<span>
{{
scope
.
row
.
username
}}
</span>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"邮箱"
>
<el-table-column
align=
"center"
label=
"邮箱"
>
<
template
slot-scope=
"scope"
>
<span>
{{
scope
.
row
.
email
}}
</span>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"是否在线"
>
<el-table-column
align=
"center"
label=
"是否在线"
>
<
template
slot-scope=
"scope"
>
<el-tag
:type=
"scope.row.is_online | isOnlineFilter"
>
{{
scope
.
row
.
is_online
==
1
?
'是'
:
'否'
}}
</el-tag>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"操作"
>
<
template
slot-scope=
"scope"
>
<el-button
class=
"filter-item"
type=
"primary"
icon=
"el-icon-edit"
@
click=
"reset(scope.row)"
>
重置密码
</el-button>
</
template
>
</el-table-column>
</el-table>
<pagination
v-show=
"total>0"
:total=
"total"
:page=
"listQuery.page"
:limit=
"listQuery.limit"
style=
"margin-left: 250px;"
@
pagination=
"getList"
/>
<pagination
v-show=
"total>0"
:total=
"total"
:page=
"listQuery.page"
:limit=
"listQuery.limit"
style=
"margin-left: 250px;"
@
pagination=
"getList"
/>
</div>
</template>
<
script
>
import
{
fetchList
,
OffLineOrOnLine
}
from
'@/api/account'
import
Pagination
from
'@/components/Pagination'
// Secondary package based on el-pagination
import
waves
from
'@/directive/waves'
import
{
fetchList
,
OffLineOrOnLine
,
resetPassword
}
from
'@/api/account'
import
Pagination
from
'@/components/Pagination'
// Secondary package based on el-pagination
import
waves
from
'@/directive/waves'
export
default
{
name
:
'UserList'
,
components
:
{
Pagination
},
directives
:
{
waves
},
filters
:
{
isOnlineFilter
(
status
)
{
const
statusMap
=
{
1
:
'success'
,
0
:
'info'
,
export
default
{
name
:
'UserList'
,
components
:
{
Pagination
},
directives
:
{
waves
},
filters
:
{
isOnlineFilter
(
status
)
{
const
statusMap
=
{
1
:
'success'
,
0
:
'info'
,
}
return
statusMap
[
status
]
}
return
statusMap
[
status
]
}
},
data
()
{
return
{
list
:
null
,
total
:
0
,
listLoading
:
true
,
multipleSelection
:
[],
del_list
:
[],
},
data
()
{
return
{
list
:
null
,
total
:
0
,
listLoading
:
true
,
multipleSelection
:
[],
del_list
:
[],
listQuery
:
{
page
:
0
,
limit
:
10
,
filter
:
{
value
:
''
,
key
:
''
,
is_online
:
''
,
listQuery
:
{
page
:
0
,
limit
:
10
,
filter
:
{
value
:
''
,
key
:
''
,
is_online
:
''
,
},
},
},
BooleanTypeOptions
:
[
{
'key'
:
1
,
'display_name'
:
'是'
},
{
'key'
:
0
,
'display_name'
:
'否'
}
],
SearchTypeOptions
:[
{
'key'
:
'user__username'
,
'display_name'
:
'用户名'
},
]
}
},
created
()
{
this
.
getList
()
},
methods
:
{
getList
()
{
this
.
listLoading
=
true
fetchList
(
this
.
listQuery
).
then
(
response
=>
{
this
.
list
=
response
.
data
.
data
.
data
this
.
total
=
response
.
data
.
data
.
total
this
.
listLoading
=
false
})
},
handleSelectionChange
(
val
)
{
this
.
multipleSelection
=
val
;
},
handleSizeChange
(
val
)
{
this
.
listQuery
.
limit
=
val
this
.
getList
()
},
handleCurrentChange
(
val
)
{
this
.
listQuery
.
page
=
val
this
.
getList
()
BooleanTypeOptions
:
[
{
'key'
:
1
,
'display_name'
:
'是'
},
{
'key'
:
0
,
'display_name'
:
'否'
}
],
SearchTypeOptions
:
[
{
'key'
:
'user__username'
,
'display_name'
:
'用户名'
},
]
}
},
handleFilter
()
{
this
.
listQuery
.
page
=
1
created
()
{
this
.
getList
()
},
handleCreate
()
{
this
.
$router
.
push
(
'/account/create'
)
},
handleOfflineOrOnline
(
val
){
const
length
=
this
.
multipleSelection
.
length
;
let
str
=
''
;
this
.
del_list
=
this
.
del_list
.
concat
(
this
.
multipleSelection
);
for
(
let
i
=
0
;
i
<
length
;
i
++
)
{
if
(
val
===
'offline'
){
methods
:
{
getList
()
{
this
.
listLoading
=
true
fetchList
(
this
.
listQuery
).
then
(
response
=>
{
this
.
list
=
response
.
data
.
data
.
data
this
.
total
=
response
.
data
.
data
.
total
this
.
listLoading
=
false
})
},
handleSelectionChange
(
val
)
{
this
.
multipleSelection
=
val
;
},
handleSizeChange
(
val
)
{
this
.
listQuery
.
limit
=
val
this
.
getList
()
},
handleCurrentChange
(
val
)
{
this
.
listQuery
.
page
=
val
this
.
getList
()
},
handleFilter
()
{
this
.
listQuery
.
page
=
1
this
.
getList
()
},
handleCreate
()
{
this
.
$router
.
push
(
'/account/create'
)
},
handleOfflineOrOnline
(
val
)
{
const
length
=
this
.
multipleSelection
.
length
;
let
str
=
''
;
this
.
del_list
=
this
.
del_list
.
concat
(
this
.
multipleSelection
);
for
(
let
i
=
0
;
i
<
length
;
i
++
)
{
if
(
val
===
'offline'
)
{
this
.
multipleSelection
[
i
].
is_online
=
0
}
else
{
}
else
{
this
.
multipleSelection
[
i
].
is_online
=
1
}
str
+=
this
.
multipleSelection
[
i
].
id
+
' '
;
}
OffLineOrOnLine
({
type
:
val
,
ids
:
str
}).
then
(
response
=>
{
this
.
multipleSelection
=
[];
this
.
$message
.
success
(
response
.
data
.
data
.
message
);
this
.
$router
.
go
(
0
)
})
},
reset
(
data
){
resetPassword
(
data
).
then
(
response
=>
{
this
.
$message
.
success
(
'重置成功'
)
})
}
OffLineOrOnLine
({
type
:
val
,
ids
:
str
}).
then
(
response
=>
{
this
.
multipleSelection
=
[];
this
.
$message
.
success
(
response
.
data
.
data
.
message
);
this
.
$router
.
go
(
0
)
})
},
}
}
}
</
script
>
<
style
scoped
>
.edit-input
{
padding-right
:
100px
;
}
.cancel-btn
{
position
:
absolute
;
right
:
15px
;
top
:
10px
;
}
.edit-input
{
padding-right
:
100px
;
}
.cancel-btn
{
position
:
absolute
;
right
:
15px
;
top
:
10px
;
}
</
style
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment