Merge remote-tracking branch 'origin/master'

pull/59/head
shao1121353141 2023-09-26 17:50:06 +08:00
commit d3d6615013
17 changed files with 181 additions and 73 deletions

View File

@ -108,4 +108,5 @@ public interface AppGroupRepository extends LogicDeleteRepository<AppGroupEntity
* @return {@link AppGroupEntity} * @return {@link AppGroupEntity}
*/ */
Optional<AppGroupEntity> findByCode(@Param("code") String code); Optional<AppGroupEntity> findByCode(@Param("code") String code);
} }

View File

@ -47,4 +47,22 @@ public interface AppGroupRepositoryCustomized {
* @return {@link List} * @return {@link List}
*/ */
List<AppGroupPO> getAppGroupList(AppGroupQuery query); List<AppGroupPO> getAppGroupList(AppGroupQuery query);
/**
*
*
* @param userId {@link Long}
* @param query {@link AppGroupQuery}
* @return {@link List}
*/
List<AppGroupPO> getAppGroupList(Long userId, AppGroupQuery query);
/**
*
*
* @param groupId {@link Long}
* @param userId {@link Long}
* @return {@link Long}
*/
Long getAppCount(String groupId, Long userId);
} }

View File

@ -17,7 +17,6 @@
*/ */
package cn.topiam.employee.common.repository.app; package cn.topiam.employee.common.repository.app;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -74,7 +73,7 @@ public interface AppRepository extends LogicDeleteRepository<AppEntity, Long>,
@Modifying @Modifying
@CacheEvict(allEntries = true) @CacheEvict(allEntries = true)
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Query(value = "UPDATE app SET is_enabled = :enabled WHERE id_ = :id", nativeQuery = true) @Query(value = "UPDATE AppEntity SET enabled = :enabled WHERE id = :id")
Integer updateAppStatus(@Param(value = "id") Long id, Integer updateAppStatus(@Param(value = "id") Long id,
@Param(value = "enabled") Boolean enabled); @Param(value = "enabled") Boolean enabled);
@ -106,17 +105,9 @@ public interface AppRepository extends LogicDeleteRepository<AppEntity, Long>,
*/ */
@NotNull @NotNull
@Cacheable @Cacheable
@Query(value = "SELECT * FROM app WHERE id_ = :id", nativeQuery = true) @Query(value = "SELECT AppEntity FROM AppEntity WHERE id = :id")
Optional<AppEntity> findByIdContainsDeleted(@NotNull @Param(value = "id") Long id); Optional<AppEntity> findByIdContainsDeleted(@NotNull @Param(value = "id") Long id);
/**
*
* @return {@link AppEntity}
*/
@NotNull
@Query(value = "SELECT a.* from app a LEFT JOIN app_group ag on a.group_id =ag.id_ WHERE a.group_id IS NOT NULL", nativeQuery = true)
List<AppEntity> getAppListByGroup();
/** /**
* clientId * clientId
* *
@ -136,12 +127,4 @@ public interface AppRepository extends LogicDeleteRepository<AppEntity, Long>,
@Cacheable @Cacheable
Optional<AppEntity> findByCode(String appCode); Optional<AppEntity> findByCode(String appCode);
/**
*
*
* @param id {@link Long}
* @param enabled {@link Boolean}
* @return {@link Boolean}
*/
} }

View File

@ -54,4 +54,13 @@ public interface AppRepositoryCustomized {
* @return {@link List} * @return {@link List}
*/ */
Page<AppEntity> getAppList(AppQuery appQuery, Pageable pageable); Page<AppEntity> getAppList(AppQuery appQuery, Pageable pageable);
/**
*
*
* @param userId {@link Long}
* @return {@link Long}
*/
Long getAppCount(Long userId);
} }

View File

@ -44,6 +44,26 @@ import lombok.AllArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
public class AppGroupRepositoryCustomizedImpl implements AppGroupRepositoryCustomized { public class AppGroupRepositoryCustomizedImpl implements AppGroupRepositoryCustomized {
private StringBuilder getBaseAppGroupListSql(AppGroupQuery query) {
//@formatter:off
StringBuilder builder = new StringBuilder("SELECT `group`.id_, `group`.name_, `group`.code_, `group`.type_, `group`.create_time, `group`.remark_, IFNULL( ass.app_count, 0) AS app_count FROM app_group `group` LEFT JOIN(SELECT aga.group_id, COUNT(*) AS `app_count` FROM app_group_association aga INNER JOIN app ON aga.app_id = app.id_ AND app.is_deleted = 0 GROUP BY aga.group_id ) ass ON `group`.id_ = ass.group_id WHERE is_deleted = '0'");
//分组名称
if (StringUtils.isNoneBlank(query.getName())) {
builder.append(" AND `group`.name_ like '%").append(query.getName()).append("%'");
}
//分组编码
if (StringUtils.isNoneBlank(query.getCode())) {
builder.append(" AND `group`.code_ like '%").append(query.getCode()).append("%'");
}
//分组类型
if (ObjectUtils.isNotEmpty(query.getType())) {
builder.append(" AND `group`.type_ like '%").append(query.getType().getCode()).append("%'");
}
builder.append(" ORDER BY `group`.create_time DESC");
//@formatter:on
return builder;
}
/** /**
* *
* *
@ -76,24 +96,28 @@ public class AppGroupRepositoryCustomizedImpl implements AppGroupRepositoryCusto
return jdbcTemplate.query(getBaseAppGroupListSql(query).toString(), new AppGroupPoMapper()); return jdbcTemplate.query(getBaseAppGroupListSql(query).toString(), new AppGroupPoMapper());
} }
private StringBuilder getBaseAppGroupListSql(AppGroupQuery query) { /**
//@formatter:off *
StringBuilder builder = new StringBuilder("SELECT `group`.id_, `group`.name_, `group`.code_, `group`.type_, `group`.create_time, `group`.remark_, IFNULL( ass.app_count, 0) AS app_count FROM app_group `group` LEFT JOIN(SELECT aga.group_id, COUNT(*) AS `app_count` FROM app_group_association aga INNER JOIN app ON aga.app_id = app.id_ AND app.is_deleted = 0 GROUP BY aga.group_id ) ass ON `group`.id_ = ass.group_id WHERE is_deleted = '0'"); *
//分组名称 * @param userId {@link Long}
if (StringUtils.isNoneBlank(query.getName())) { * @param query {@link AppGroupQuery}
builder.append(" AND `group`.name_ like '%").append(query.getName()).append("%'"); * @return {@link List}
} */
//分组编码 @Override
if (StringUtils.isNoneBlank(query.getCode())) { public List<AppGroupPO> getAppGroupList(Long userId, AppGroupQuery query) {
builder.append(" AND `group`.code_ like '%").append(query.getCode()).append("%'"); return null;
} }
//分组类型
if (ObjectUtils.isNotEmpty(query.getType())) { /**
builder.append(" AND `group`.type_ like '%").append(query.getType().getCode()).append("%'"); *
} *
builder.append(" ORDER BY `group`.create_time DESC"); * @param groupId {@link Long}
//@formatter:on * @param userId {@link Long}
return builder; * @return {@link Long}
*/
@Override
public Long getAppCount(String groupId, Long userId) {
return null;
} }
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;

View File

@ -94,7 +94,7 @@ public class AppRepositoryCustomizedImpl implements AppRepositoryCustomized {
.append(",").append(pageable.getPageSize()).toString(), .append(",").append(pageable.getPageSize()).toString(),
paramMap, new AppEntityMapper()); paramMap, new AppEntityMapper());
//@formatter:off //@formatter:off
String countSql = "SELECT count(*) FROM (" + sql + ") app_account_"; String countSql = "SELECT count(*) FROM (" + sql + ") app_";
//@formatter:on //@formatter:on
Integer count = namedParameterJdbcTemplate.queryForObject(countSql, paramMap, Integer count = namedParameterJdbcTemplate.queryForObject(countSql, paramMap,
Integer.class); Integer.class);
@ -139,6 +139,17 @@ public class AppRepositoryCustomizedImpl implements AppRepositoryCustomized {
return new PageImpl<>(list, pageable, Objects.requireNonNull(count).longValue()); return new PageImpl<>(list, pageable, Objects.requireNonNull(count).longValue());
} }
/**
*
*
* @param userId {@link Long}
* @return {@link Long}
*/
@Override
public Long getAppCount(Long userId) {
return null;
}
/** /**
* JdbcTemplate * JdbcTemplate
*/ */

View File

@ -47,7 +47,7 @@
"@ant-design/charts": "^1.4.2", "@ant-design/charts": "^1.4.2",
"@ant-design/icons": "^5.2.6", "@ant-design/icons": "^5.2.6",
"@ant-design/maps": "^1.0.7", "@ant-design/maps": "^1.0.7",
"@ant-design/pro-components": "^2.6.24", "@ant-design/pro-components": "^2.6.25",
"ahooks": "^3.7.8", "ahooks": "^3.7.8",
"antd": "^5.9.3", "antd": "^5.9.3",
"antd-img-crop": "^4.13.0", "antd-img-crop": "^4.13.0",

View File

@ -151,8 +151,8 @@ const Login: React.FC = () => {
<Helmet> <Helmet>
<link rel="icon" href={'/favicon.ico'} /> <link rel="icon" href={'/favicon.ico'} />
</Helmet> </Helmet>
{showBanner && <Banner />}
<div className={classnames(`${prefixCls}`)}> <div className={classnames(`${prefixCls}`)}>
{showBanner && <Banner />}
<div <div
style={{ style={{
backgroundColor: 'white', backgroundColor: 'white',
@ -187,7 +187,7 @@ const Login: React.FC = () => {
}, },
}} }}
onFinish={async (values) => { onFinish={async (values) => {
await run(values); run(values);
return data; return data;
}} }}
> >

View File

@ -23,7 +23,6 @@ const useStyle = createStyles(({ token, prefixCls }, prefix) => {
return { return {
main: { main: {
[`${prefixClassName}`]: { [`${prefixClassName}`]: {
padding: '24px',
[`${prefixClassName}-form-prefix-icon`]: { [`${prefixClassName}-form-prefix-icon`]: {
color: token.colorPrimary, color: token.colorPrimary,
fontSize: token.fontSize, fontSize: token.fontSize,
@ -46,12 +45,18 @@ const useStyle = createStyles(({ token, prefixCls }, prefix) => {
}, },
[`${antCls}-pro-form-login-page-desc`]: { [`${antCls}-pro-form-login-page-desc`]: {
marginTop: '25px', marginTop: '25px',
marginBottom: '25px', marginBottom: '40px',
color: 'rgba(0, 0, 0, 0.45)', color: 'rgba(0, 0, 0, 0.45)',
fontSize: '14px', fontSize: '14px',
}, },
[`${antCls}-pro-form-login-page-container`]: { [`${antCls}-pro-form-login-page-container`]: {
height: 'auto', height: 'auto',
[`${antCls}-pro-form-login-page-top`]: {
marginTop: '25px',
},
},
[`${antCls}-pro-form-login-page-main`]: {
marginBottom: '80px',
}, },
}, },
}, },

View File

@ -129,7 +129,7 @@ public interface AppConverter {
appGetResult.setClientId(entity.getClientId()); appGetResult.setClientId(entity.getClientId());
appGetResult.setClientSecret(entity.getClientSecret()); appGetResult.setClientSecret(entity.getClientSecret());
appGetResult.setType(entity.getType()); appGetResult.setType(entity.getType());
appGetResult.setGroupIds(groupIds); appGetResult.setGroupIds(groupIds.stream().map(String::valueOf).toList());
//图标未配置,所以先从模版中拿 //图标未配置,所以先从模版中拿
if (StringUtils.isBlank(entity.getIcon())) { if (StringUtils.isBlank(entity.getIcon())) {
ApplicationService applicationService = getApplicationServiceLoader() ApplicationService applicationService = getApplicationServiceLoader()

View File

@ -24,6 +24,9 @@ import java.util.List;
import cn.topiam.employee.common.enums.app.AppProtocol; import cn.topiam.employee.common.enums.app.AppProtocol;
import cn.topiam.employee.common.enums.app.AppType; import cn.topiam.employee.common.enums.app.AppType;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data; import lombok.Data;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@ -110,5 +113,5 @@ public class AppGetResult implements Serializable {
* ID * ID
*/ */
@Parameter(description = "应用组ID集合") @Parameter(description = "应用组ID集合")
private List<Long> groupIds; private List<String> groupIds;
} }

View File

@ -19,6 +19,7 @@ package cn.topiam.employee.portal.controller;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -49,6 +50,24 @@ import static cn.topiam.employee.common.constant.AppConstants.APP_PATH;
@RequestMapping(value = APP_PATH) @RequestMapping(value = APP_PATH)
@AllArgsConstructor @AllArgsConstructor
public class AppController { public class AppController {
/**
*
*
* @return {@link GetAppListResult}
*/
@Operation(summary = "获取应用数量")
@GetMapping(value = "/count")
public ApiRestResult<String> getAppCount(String groupId) {
Long count;
if (StringUtils.isEmpty(groupId)) {
count = appService.getAppCount();
} else {
count = appService.getAppCount(groupId);
}
return ApiRestResult.ok(count.toString());
}
/** /**
* *
* *

View File

@ -49,4 +49,19 @@ public interface AppService {
* @return {@link AppGroupListResult} * @return {@link AppGroupListResult}
*/ */
List<AppGroupListResult> getAppGroupList(AppGroupQuery appGroupQuery); List<AppGroupListResult> getAppGroupList(AppGroupQuery appGroupQuery);
/**
*
*
* @param groupId {@link String}
* @return {@link Long}
*/
Long getAppCount(String groupId);
/**
*
*
* @return {@link Long}
*/
Long getAppCount();
} }

View File

@ -68,10 +68,34 @@ public class AppServiceImpl implements AppService {
*/ */
@Override @Override
public List<AppGroupListResult> getAppGroupList(AppGroupQuery query) { public List<AppGroupListResult> getAppGroupList(AppGroupQuery query) {
List<AppGroupPO> list = appGroupRepository.getAppGroupList(query); Long userId = Long.valueOf(SecurityUtils.getCurrentUserId());
List<AppGroupPO> list = appGroupRepository.getAppGroupList(userId, query);
return appGroupConverter.entityConvertToAppGroupListResult(list); return appGroupConverter.entityConvertToAppGroupListResult(list);
} }
/**
*
*
* @param groupId {@link String}
* @return {@link Integer}
*/
@Override
public Long getAppCount(String groupId) {
Long userId = Long.valueOf(SecurityUtils.getCurrentUserId());
return appGroupRepository.getAppCount(groupId, userId);
}
/**
*
*
* @return {@link Long}
*/
@Override
public Long getAppCount() {
Long userId = Long.valueOf(SecurityUtils.getCurrentUserId());
return appRepository.getAppCount(userId);
}
/** /**
* AppRepository * AppRepository
*/ */

View File

@ -48,7 +48,7 @@
"@ant-design/charts": "^1.4.2", "@ant-design/charts": "^1.4.2",
"@ant-design/icons": "^5.2.6", "@ant-design/icons": "^5.2.6",
"@ant-design/maps": "^1.0.7", "@ant-design/maps": "^1.0.7",
"@ant-design/pro-components": "^2.6.24", "@ant-design/pro-components": "^2.6.25",
"ahooks": "^3.7.8", "ahooks": "^3.7.8",
"antd": "^5.9.3", "antd": "^5.9.3",
"antd-img-crop": "^4.13.0", "antd-img-crop": "^4.13.0",

View File

@ -135,32 +135,28 @@ const CardList = () => {
manualRequest manualRequest
request={queryAppList} request={queryAppList}
pagination={{}} pagination={{}}
toolbar={ toolbar={{
appGroupList?.length > 0 menu: {
? { type: 'tab',
menu: { activeKey: currentGroup,
type: 'tab', items: getItems(),
activeKey: currentGroup, onChange(key) {
items: getItems(), if (key) {
onChange(key) { setCurrentGroup(key);
if (key) { if (key === all) {
setCurrentGroup(key); setSearchParams((values) => {
if (key === all) { return { ...values, groupId: undefined };
setSearchParams((values) => { });
return { ...values, groupId: undefined }; } else {
}); setSearchParams((values) => {
} else { return { ...values, groupId: key };
setSearchParams((values) => { });
return { ...values, groupId: key }; }
}); actionRef.current?.reload();
}
actionRef.current?.reload();
}
},
},
} }
: {} },
} },
}}
params={searchParams} params={searchParams}
actionRef={actionRef} actionRef={actionRef}
renderItem={(item: AppList) => { renderItem={(item: AppList) => {

View File

@ -17,7 +17,7 @@
*/ */
export default { export default {
'pages.application.search.name': '应用名称', 'pages.application.search.name': '应用名称',
'pages.application.group_all': '全部', 'pages.application.group_all': '全部应用',
'pages.application.tab.list': '应用列表', 'pages.application.tab.list': '应用列表',
'pages.application.tab.account': '应用账号', 'pages.application.tab.account': '应用账号',
'pages.application.init.warning': '仅允许应用发起', 'pages.application.init.warning': '仅允许应用发起',