diff --git a/gringotts-frontend/components/constants.js b/gringotts-frontend/components/constants.js index 81b0163..535e90b 100644 --- a/gringotts-frontend/components/constants.js +++ b/gringotts-frontend/components/constants.js @@ -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 = { '*': `\${${field}}`, diff --git a/gringotts-frontend/components/user/dialog-user-check.js b/gringotts-frontend/components/user/dialog-user-check.js index d4bd6b3..ab5abf4 100644 --- a/gringotts-frontend/components/user/dialog-user-check.js +++ b/gringotts-frontend/components/user/dialog-user-check.js @@ -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, } } } diff --git a/gringotts-frontend/pages/index/main.js b/gringotts-frontend/pages/index/main.js index 1453c23..bd5eaaf 100644 --- a/gringotts-frontend/pages/index/main.js +++ b/gringotts-frontend/pages/index/main.js @@ -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(), ] }, } diff --git a/gringotts-frontend/pages/index/tab-data.js b/gringotts-frontend/pages/index/tab-data.js new file mode 100644 index 0000000..aeca2f1 --- /dev/null +++ b/gringotts-frontend/pages/index/tab-data.js @@ -0,0 +1,9 @@ +export function tabData() { + return { + title: '数据管理', + icon: 'fa fa-database', + body: [ + 'hello world' + ] + } +} \ No newline at end of file diff --git a/gringotts-frontend/pages/index/tab-log.js b/gringotts-frontend/pages/index/tab-log.js new file mode 100644 index 0000000..81b24b6 --- /dev/null +++ b/gringotts-frontend/pages/index/tab-log.js @@ -0,0 +1,10 @@ +export function tabLog() { + return { + visibleOn: '${role === "ADMINISTRATOR"}', + title: '系统日志', + icon: 'fa fa-file', + body: [ + 'hello world' + ] + } +} \ No newline at end of file diff --git a/gringotts-frontend/pages/index/tab-market.js b/gringotts-frontend/pages/index/tab-market.js new file mode 100644 index 0000000..e2dd260 --- /dev/null +++ b/gringotts-frontend/pages/index/tab-market.js @@ -0,0 +1,9 @@ +export function tabMarket() { + return { + title: '数据市场', + icon: 'fa fa-store', + body: [ + 'hello world' + ] + } +} \ No newline at end of file diff --git a/gringotts-frontend/pages/index/tab-user.js b/gringotts-frontend/pages/index/tab-user.js index 6d972ab..6ff675a 100644 --- a/gringotts-frontend/pages/index/tab-user.js +++ b/gringotts-frontend/pages/index/tab-user.js @@ -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: '操作', diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/user/entity/User.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/user/entity/User.java index eaca485..3c05ccd 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/user/entity/User.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/user/entity/User.java @@ -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 diff --git a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/user/service/UserService.java b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/user/service/UserService.java index bea248d..76e26d6 100644 --- a/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/user/service/UserService.java +++ b/gringotts-web/src/main/java/com/eshore/gringotts/web/domain/user/service/UserService.java @@ -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(); } } }