1
0

feat(web): 增加账号最后登陆时间

This commit is contained in:
2024-11-19 19:14:32 +08:00
parent 9a01d74d78
commit 323d326e8d
9 changed files with 154 additions and 44 deletions

View File

@@ -48,7 +48,7 @@ export function horizontalFormOptions() {
mode: 'horizontal',
canAccessSuperData: false,
horizontal: {
left: 2,
left: 3,
},
}
}
@@ -83,6 +83,41 @@ export function paginationTemplate(perPage = 20, maxButtons = 5) {
}
}
export function copyField(field, tips = '复制', ignoreLength = 0, extra = undefined) {
let tpl = ignoreLength === 0 ? `\${${field}}` : `\${TRUNCATE(${field}, ${ignoreLength})}`
let content = extra
? {
type: 'action',
level: 'link',
label: `\${${field}}`,
className: 'text-current underline',
size: 'xs',
...extra,
}
: {
type: 'tpl',
className: 'mr-1',
tpl: tpl,
}
return {
type: 'wrapper',
size: 'none',
body: [
content,
{
type: 'action',
level: 'link',
label: '',
icon: 'fa fa-copy',
size: 'xs',
actionType: 'copy',
content: `\$${field}`,
tooltip: `${tips}`,
},
]
}
}
export function mappingField(field, mapping) {
let mapData = {
'*': `<span class='label bg-gray-300'>\${${field}}</span>`,

View File

@@ -1,10 +1,63 @@
import {apiGet, horizontalFormOptions, mappingField, userRoleMapping, userStateMapping} from "../constants.js";
const dialogBody = [
{
type: 'input-email',
name: 'username',
label: '邮箱',
},
{
type: 'control',
name: 'role',
label: '角色',
body: [
mappingField('role', userRoleMapping),
]
},
{
type: 'control',
name: 'state',
label: '账号状态',
body: [
mappingField('state', userStateMapping)
]
},
{
type: 'input-datetime',
name: 'createTime',
label: '创建时间',
},
]
export function userDetailDialog() {
return {
actionType: 'dialog',
dialog: {
title: '账号详情',
actions: [],
body: {
type: 'form',
initApi: apiGet('${base}/user_management/detail/${username}'),
...horizontalFormOptions(),
static: true,
body: [
...dialogBody,
{
type: 'input-datetime',
name: 'lastLoginTime',
label: '上次登陆时间',
},
],
}
}
}
}
export function userCheckDialog() {
return {
actionType: 'dialog',
dialog: {
title: '用户注册',
title: '账号审核',
actions: [
{
type: 'action',
@@ -22,39 +75,7 @@ export function userCheckDialog() {
initApi: apiGet('${base}/user_management/detail/${username}'),
...horizontalFormOptions(),
static: true,
body: [
{
type: 'input-email',
name: 'username',
label: '邮箱',
},
{
type: 'control',
name: 'role',
label: '角色',
body: [
mappingField('role', userRoleMapping),
]
},
{
type: 'control',
name: 'state',
label: '账号状态',
body: [
mappingField('state', userStateMapping)
]
},
{
type: 'input-datetime',
name: 'createTime',
label: '创建时间',
},
{
type: 'input-datetime',
name: 'updateTime',
label: '更新时间',
},
]
body: dialogBody,
}
}
}

View File

@@ -2,6 +2,9 @@ import {apiGet, useAmis} from '../../components/constants.js'
import {userChangePasswordDialog} from "../../components/user/dialog-user-change-password.js";
import {tabUser} from "./tab-user.js";
import {tabOverview} from "./tab-overview.js";
import {tabMarket} from "./tab-market.js";
import {tabData} from "./tab-data.js";
import {tabLog} from "./tab-log.js";
useAmis(information => {
return {
@@ -55,7 +58,10 @@ useAmis(information => {
tabsMode: 'vertical',
tabs: [
tabOverview(),
tabMarket(),
tabData(),
tabUser(),
tabLog(),
]
},
}

View File

@@ -0,0 +1,9 @@
export function tabData() {
return {
title: '数据管理',
icon: 'fa fa-database',
body: [
'hello world'
]
}
}

View File

@@ -0,0 +1,10 @@
export function tabLog() {
return {
visibleOn: '${role === "ADMINISTRATOR"}',
title: '系统日志',
icon: 'fa fa-file',
body: [
'hello world'
]
}
}

View File

@@ -0,0 +1,9 @@
export function tabMarket() {
return {
title: '数据市场',
icon: 'fa fa-store',
body: [
'hello world'
]
}
}

View File

@@ -1,5 +1,12 @@
import {apiGet, crudCommonOptions, mappingField, userRoleMapping, userStateMapping} from '../../components/constants.js'
import {userCheckDialog} from "../../components/user/dialog-user-check.js";
import {
apiGet,
copyField,
crudCommonOptions,
mappingField,
userRoleMapping,
userStateMapping
} from '../../components/constants.js'
import {userCheckDialog, userDetailDialog} from "../../components/user/dialog-user-check.js";
import {userAdministratorRegisterDialog} from "../../components/user/dialog-user-register.js";
export function tabUser() {
@@ -26,28 +33,38 @@ export function tabUser() {
{
name: 'username',
label: '邮箱',
...copyField(
'username',
undefined,
undefined,
userDetailDialog(),
)
},
{
label: '角色',
width: 120,
align: 'center',
...mappingField('role', userRoleMapping)
},
{
label: '账号状态',
width: 80,
align: 'center',
...mappingField('state', userStateMapping)
},
{
label: '创建时间',
width: 150,
align: 'center',
type: 'tpl',
tpl: '${DATETOSTR(createTime)}'
tpl: "${IF(createTime, DATETOSTR(createTime), '-')}"
},
{
label: '更新时间',
label: '上次登陆时间',
width: 150,
align: 'center',
type: 'tpl',
tpl: '${DATETOSTR(updateTime)}'
tpl: "${IF(lastLoginTime, DATETOSTR(lastLoginTime), '-')}"
},
{
label: '操作',

View File

@@ -46,6 +46,7 @@ public class User {
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private State state = State.CHECKING;
private LocalDateTime lastLoginTime;
@CreatedDate
private LocalDateTime createTime;
@LastModifiedDate

View File

@@ -79,6 +79,8 @@ public class UserService {
throw new LoginFailureException();
} else {
StpUtil.login(user.getId());
user.setLastLoginTime(LocalDateTime.now());
userRepository.save(user);
return new UserInformation(user, StpUtil.getTokenInfo());
}
}
@@ -232,16 +234,16 @@ public class UserService {
private String username;
private User.Role role;
private User.State state;
private LocalDateTime lastLoginTime;
private LocalDateTime createTime;
private LocalDateTime updateTime;
public UserListItem(User user) {
this.id = user.getId();
this.username = user.getUsername();
this.role = user.getRole();
this.state = user.getState();
this.lastLoginTime = user.getLastLoginTime();
this.createTime = user.getCreateTime();
this.updateTime = user.getUpdateTime();
}
}
@@ -250,15 +252,15 @@ public class UserService {
private String username;
private User.Role role;
private User.State state;
private LocalDateTime lastLoginTime;
private LocalDateTime createTime;
private LocalDateTime updateTime;
public UserDetail(User user) {
this.username = user.getUsername();
this.role = user.getRole();
this.state = user.getState();
this.lastLoginTime = user.getLastLoginTime();
this.createTime = user.getCreateTime();
this.updateTime = user.getUpdateTime();
}
}
}