Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
Expand All @@ -19,6 +21,7 @@
import tech.wetech.admin3.sys.service.dto.OrgUserDTO;
import tech.wetech.admin3.sys.service.dto.PageDTO;

import java.time.LocalDateTime;
import java.util.List;

import static tech.wetech.admin3.sys.model.Organization.Type;
Expand Down Expand Up @@ -47,9 +50,9 @@ public ResponseEntity<List<OrgTreeDTO>> findOrgTree(Long parentId) {

@RequiresPermissions("user:view")
@GetMapping("/{organizationId}/users")
public ResponseEntity<PageDTO<OrgUserDTO>> findOrgUsers(Pageable pageable, @RequestParam(required = false) String username, @RequestParam(required = false) User.State state, @PathVariable Long organizationId) {
public ResponseEntity<PageDTO<OrgUserDTO>> findOrgUsers(@SortDefault(sort = "lastLoginTime", direction = Sort.Direction.DESC) Pageable pageable, @RequestParam(required = false) String username, @RequestParam(required = false) User.State state, @RequestParam(required = false) LocalDateTime lastLoginTimeStart, @RequestParam(required = false) LocalDateTime lastLoginTimeEnd, @PathVariable Long organizationId) {
Organization organization = organizationService.findOrganization(organizationId);
return ResponseEntity.ok(userService.findOrgUsers(pageable, username, state, organization));
return ResponseEntity.ok(userService.findOrgUsers(pageable, username, state, organization, lastLoginTimeStart, lastLoginTimeEnd));
}

@RequiresPermissions("organization:create")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import tech.wetech.admin3.common.CommonResultStatus;
Expand All @@ -14,9 +15,11 @@
import tech.wetech.admin3.sys.model.User;
import tech.wetech.admin3.sys.model.UserCredential;
import tech.wetech.admin3.sys.repository.UserCredentialRepository;
import tech.wetech.admin3.sys.repository.UserRepository;
import tech.wetech.admin3.sys.service.SessionService;
import tech.wetech.admin3.sys.service.dto.UserinfoDTO;

import java.time.LocalDateTime;
import java.util.UUID;

import static tech.wetech.admin3.sys.model.UserCredential.IdentityType.PASSWORD;
Expand All @@ -29,15 +32,19 @@ public class DefaultSessionService implements SessionService {

private final UserCredentialRepository userCredentialRepository;

private final UserRepository userRepository;

private final SessionManager sessionManager;

public DefaultSessionService(UserCredentialRepository userCredentialRepository, SessionManager sessionManager) {
public DefaultSessionService(UserCredentialRepository userCredentialRepository, UserRepository userRepository, SessionManager sessionManager) {
this.userCredentialRepository = userCredentialRepository;
this.userRepository = userRepository;
this.sessionManager = sessionManager;
}


@Override
@Transactional
public UserinfoDTO login(String username, String password) {
UserCredential credential = userCredentialRepository.findCredential(username, PASSWORD)
.orElseThrow(() -> new UserException(CommonResultStatus.UNAUTHORIZED, "密码不正确"));
Expand All @@ -46,6 +53,8 @@ public UserinfoDTO login(String username, String password) {
if (user.isLocked()) {
throw new UserException(CommonResultStatus.UNAUTHORIZED, "用户已经停用,请与管理员联系");
}
user.setLastLoginTime(LocalDateTime.now());
userRepository.save(user);
String token = UUID.randomUUID().toString().replace("-", "");
UserinfoDTO userinfo = new UserinfoDTO(token, user.getId(), user.getUsername(), user.getAvatar(), new UserinfoDTO.Credential(credential.getIdentifier(), credential.getIdentityType()), user.findPermissions());
sessionManager.store(token, credential, userinfo);
Expand Down
11 changes: 11 additions & 0 deletions admin3-server/src/main/java/tech/wetech/admin3/sys/model/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ public class User extends BaseEntity {
@Column
private LocalDateTime createdTime;

@Column
private LocalDateTime lastLoginTime;

@ManyToMany(fetch = LAZY, cascade = CascadeType.DETACH)
@JoinTable(name = "user_role",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
Expand Down Expand Up @@ -126,6 +129,14 @@ public void setCreatedTime(LocalDateTime createdTime) {
this.createdTime = createdTime;
}

public LocalDateTime getLastLoginTime() {
return lastLoginTime;
}

public void setLastLoginTime(LocalDateTime lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}

public Set<Role> getRoles() {
return roles;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import tech.wetech.admin3.sys.model.Organization;
import tech.wetech.admin3.sys.model.User;

import java.time.LocalDateTime;
import java.util.Set;

/**
Expand All @@ -23,8 +24,10 @@ public interface UserRepository extends JpaRepository<User, Long> {
from User user where (user.organization=:organization or user.organization.parentIds like concat(:orgParentIds, '%'))
and (:username is null or user.username=:username)
and (:state is null or user.state=:state)
and (:lastLoginTimeStart is null or user.lastLoginTime >= :lastLoginTimeStart)
and (:lastLoginTimeEnd is null or user.lastLoginTime <= :lastLoginTimeEnd)
""")
Page<User> findOrgUsers(Pageable pageable, String username, User.State state, Organization organization, String orgParentIds);
Page<User> findOrgUsers(Pageable pageable, String username, User.State state, Organization organization, String orgParentIds, LocalDateTime lastLoginTimeStart, LocalDateTime lastLoginTimeEnd);

@Query("select count(user.id) from User user where user.organization=:organization or user.organization.parentIds like concat(:orgParentIds, '%')")
long countOrgUsers(Organization organization, String orgParentIds);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ public User findUserById(Long userId) {
.orElseThrow(() -> new BusinessException(RECORD_NOT_EXIST));
}

public PageDTO<OrgUserDTO> findOrgUsers(Pageable pageable, String username, User.State state, Organization organization) {
Page<User> page = userRepository.findOrgUsers(pageable, username, state, organization, organization.makeSelfAsParentIds());
public PageDTO<OrgUserDTO> findOrgUsers(Pageable pageable, String username, User.State state, Organization organization, LocalDateTime lastLoginTimeStart, LocalDateTime lastLoginTimeEnd) {
Page<User> page = userRepository.findOrgUsers(pageable, username, state, organization, organization.makeSelfAsParentIds(), lastLoginTimeStart, lastLoginTimeEnd);
return new PageDTO<>(page.getContent().stream().map(u ->
new OrgUserDTO(u.getId(), u.getUsername(), u.getAvatar(), u.getGender(), u.getState(), u.getOrgFullName(), u.getCreatedTime()))
new OrgUserDTO(u.getId(), u.getUsername(), u.getAvatar(), u.getGender(), u.getState(), u.getOrgFullName(), u.getCreatedTime(), u.getLastLoginTime()))
.collect(Collectors.toList()), page.getTotalElements());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ public record OrgUserDTO(Long id,
User.Gender gender,
User.State state,
String orgFullName,
LocalDateTime createdTime) {
LocalDateTime createdTime,
LocalDateTime lastLoginTime) {
}
2 changes: 1 addition & 1 deletion admin3-ui/src/api/organization.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export function getOrganizationTree(params: { parentId: number }) {
});
}

export function getOrganizationUserList(organizationId: number, data: { page: number; size: number; username?: string, state?: string, roleId?: number }) {
export function getOrganizationUserList(organizationId: number, data: { page: number; size: number; username?: string, state?: string, roleId?: number, lastLoginTimeStart?: string, lastLoginTimeEnd?: string }) {
return request({
url: `${BASE_URI}/organizations/${organizationId}/users`,
method: 'get',
Expand Down
22 changes: 22 additions & 0 deletions admin3-ui/src/views/user-list.vue
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,22 @@
<el-option key="1" label="正常" value="NORMAL"></el-option>
<el-option key="2" label="锁定" value="LOCKED"></el-option>
</el-select>
<el-date-picker
v-model="query.lastLoginTimeStart"
type="datetime"
placeholder="最后登录时间开始"
class="handle-select mr10"
clearable
value-format="YYYY-MM-DD HH:mm:ss"
></el-date-picker>
<el-date-picker
v-model="query.lastLoginTimeEnd"
type="datetime"
placeholder="最后登录时间结束"
class="handle-select mr10"
clearable
value-format="YYYY-MM-DD HH:mm:ss"
></el-date-picker>
<el-button type="primary" :icon="Search" @click="handleSearch">搜索</el-button>
<el-button type="primary" :icon="Plus" @click="addVisible = true;Object.assign(form, new User())"
v-action:user:create>新增
Expand Down Expand Up @@ -94,6 +110,7 @@
</el-table-column>

<el-table-column prop="createdTime" label="注册时间"></el-table-column>
<el-table-column prop="lastLoginTime" label="最后登录时间"></el-table-column>
<el-table-column prop="orgFullName" label="所属组织"></el-table-column>
<el-table-column label="操作" width="300" fixed="right">
<template #default="scope">
Expand Down Expand Up @@ -382,12 +399,15 @@ interface TableItem {
avatar: string;
state: string;
createdTime: string;
lastLoginTime: string;
orgFullName: string;
}

const query = reactive({
username: '',
state: '',
lastLoginTimeStart: '',
lastLoginTimeEnd: '',
pageIndex: 1,
pageSize: 10
});
Expand All @@ -400,6 +420,8 @@ const getUserData = () => {
size: query.pageSize,
username: query.username || undefined,
state: query.state || undefined,
lastLoginTimeStart: query.lastLoginTimeStart || undefined,
lastLoginTimeEnd: query.lastLoginTimeEnd || undefined,
}).then(res => {
tableData.value = res.data.list;
pageTotal.value = res.data.total;
Expand Down