Skip to content

Commit

Permalink
feat($auth-center): download and export role info
Browse files Browse the repository at this point in the history
  • Loading branch information
johnnymillergh committed Aug 22, 2021
1 parent bce0cf4 commit b6640ce
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 7 deletions.
14 changes: 14 additions & 0 deletions auth-center/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -219,5 +219,19 @@
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>

<!-- Apache POI - Java API To Access Microsoft Format Files -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -1,16 +1,47 @@
package com.jmsoftware.maf.authcenter.role.controller;

import com.jmsoftware.maf.authcenter.role.entity.RoleExcelImport;
import com.jmsoftware.maf.authcenter.role.service.RoleService;
import com.jmsoftware.maf.springcloudstarter.controller.AbstractExcelImportController;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import java.util.List;

/**
* Description: RoleController, change description here.
*
* @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 12/17/2020 4:44 PM
**/
@Slf4j
@RestController
@RequiredArgsConstructor
public class RoleController {
@RequestMapping("/roles")
public class RoleController extends AbstractExcelImportController<RoleExcelImport> {
private final RoleService roleService;

@GetMapping("/stat/excel")
public ResponseEntity<StreamingResponseBody> downloadRoleStat() {
return this.roleService.downloadRoleStat();
}

@Override
public void onExceptionOccurred() {
log.error("Exception occurred when uploading excel for role.");
}

@Override
protected void executeDatabaseOperation(List<RoleExcelImport> beanList) throws Exception {

}

@Override
protected boolean validateBeforeAddToBeanList(List<RoleExcelImport> beanList, RoleExcelImport bean, int index) throws IllegalArgumentException {
return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.jmsoftware.maf.authcenter.role.entity;

import com.jmsoftware.maf.authcenter.role.entity.persistence.Role;
import com.jmsoftware.maf.springcloudstarter.annotation.ExcelColumn;
import lombok.Data;
import lombok.val;

import javax.validation.constraints.NotBlank;

/**
* Description: RoleExcelImport, change description here.
*
* @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 8/22/2021 10:52 AM
**/
@Data
public class RoleExcelImport {
/**
* Role name
*/
@NotBlank
@ExcelColumn(description = "Name")
private String name;
/**
* Role description
*/
@NotBlank
@ExcelColumn(description = "Description")
private String description;

/**
* Transform by role.
*
* @param role the role
* @return the role excel import
*/
public static RoleExcelImport transformBy(Role role) {
val roleExcelImport = new RoleExcelImport();
roleExcelImport.setName(role.getName());
roleExcelImport.setDescription(role.getDescription());
return roleExcelImport;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse;
import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse;
import lombok.NonNull;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
Expand Down Expand Up @@ -44,4 +46,11 @@ public interface RoleService extends IService<Role> {
* @return the boolean
*/
boolean checkAdmin(@NotEmpty List<@NotNull Long> roleIdList);

/**
* Download role stat response entity.
*
* @return the response entity
*/
ResponseEntity<StreamingResponseBody> downloadRoleStat();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,36 @@
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jmsoftware.maf.authcenter.role.entity.RoleExcelImport;
import com.jmsoftware.maf.authcenter.role.entity.constant.RoleRedisKey;
import com.jmsoftware.maf.authcenter.role.entity.persistence.Role;
import com.jmsoftware.maf.authcenter.role.mapper.RoleMapper;
import com.jmsoftware.maf.authcenter.role.service.RoleService;
import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdResponse;
import com.jmsoftware.maf.common.domain.authcenter.role.GetRoleListByUserIdSingleResponse;
import com.jmsoftware.maf.springcloudstarter.annotation.ExcelColumn;
import com.jmsoftware.maf.springcloudstarter.configuration.MafConfiguration;
import com.jmsoftware.maf.springcloudstarter.configuration.MafProjectProperty;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.val;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.lang.reflect.Field;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
Expand All @@ -40,6 +49,7 @@
@Service
@RequiredArgsConstructor
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
private static final String ROLE_TEMPLATE_EXCEL = "role-stat.xlsx";
private final MafProjectProperty mafProjectProperty;
private final MafConfiguration mafConfiguration;
private final RedisTemplate<String, String> redisTemplate;
Expand All @@ -48,16 +58,18 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
@Override
@SneakyThrows({JsonProcessingException.class})
public GetRoleListByUserIdResponse getRoleList(@NotNull Long userId) {
val key = String.format(mafProjectProperty.getProjectParentArtifactId()
val key = String.format(this.mafProjectProperty.getProjectParentArtifactId()
+ RoleRedisKey.GET_ROLE_LIST_BY_USER_ID.getKeyInfixFormat(), userId);
val hasKey = redisTemplate.hasKey(key);
val hasKey = this.redisTemplate.hasKey(key);
if (BooleanUtil.isTrue(hasKey)) {
return objectMapper.readValue(redisTemplate.opsForValue().get(key), GetRoleListByUserIdResponse.class);
return this.objectMapper.readValue(this.redisTemplate.opsForValue().get(key),
GetRoleListByUserIdResponse.class);
}
val response = new GetRoleListByUserIdResponse();
response.setRoleList(this.getRoleListByUserId(userId));
redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(response), RandomUtil.randomLong(1, 7),
TimeUnit.DAYS);
this.redisTemplate.opsForValue().set(key, this.objectMapper.writeValueAsString(response),
RandomUtil.randomLong(1, 7),
TimeUnit.DAYS);
return response;
}

Expand All @@ -75,9 +87,33 @@ public boolean checkAdmin(@NotEmpty List<@NotNull Long> roleIdList) {
val roleNameSet = roleList
.stream()
.map(Role::getName)
.filter(roleName -> StrUtil.equals(mafConfiguration.getSuperUserRole(), roleName))
.filter(roleName -> StrUtil.equals(this.mafConfiguration.getSuperUserRole(), roleName))
.collect(Collectors.toSet());
// If roleNameSet is not empty (contains "admin")
return CollUtil.isNotEmpty(roleNameSet);
}

@Override
public ResponseEntity<StreamingResponseBody> downloadRoleStat() {
val rolePage = new Page<Role>(1, 500);
this.page(rolePage);
val roleExcelImportList = rolePage
.getRecords()
.stream()
.map(RoleExcelImport::transformBy)
.collect(Collectors.toList());
val excelWriter = new ExcelWriter(true);
Field[] declaredFields = RoleExcelImport.class.getDeclaredFields();
for (Field declaredField : declaredFields) {
ExcelColumn annotation = declaredField.getAnnotation(ExcelColumn.class);
excelWriter.addHeaderAlias(declaredField.getName(), annotation.description());
}
excelWriter.write(roleExcelImportList);
excelWriter.setFreezePane(1);
excelWriter.autoSizeColumnAll();
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION,
ContentDisposition.builder("attachment").filename(ROLE_TEMPLATE_EXCEL).build().toString())
.body(outputStream -> excelWriter.flush(outputStream, true));
}
}

0 comments on commit b6640ce

Please sign in to comment.