diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-redis/src/main/java/com/orion/ops/framework/redis/core/utils/RedisStrings.java b/orion-ops-framework/orion-ops-spring-boot-starter-redis/src/main/java/com/orion/ops/framework/redis/core/utils/RedisStrings.java index 12a7caf8..ae22de39 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-redis/src/main/java/com/orion/ops/framework/redis/core/utils/RedisStrings.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-redis/src/main/java/com/orion/ops/framework/redis/core/utils/RedisStrings.java @@ -1,6 +1,8 @@ package com.orion.ops.framework.redis.core.utils; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.orion.lang.define.cache.CacheKeyDefine; import com.orion.lang.utils.Strings; @@ -20,6 +22,20 @@ public class RedisStrings extends RedisUtils { private RedisStrings() { } + /** + * 获取 json + * + * @param key key + * @return JSONObject + */ + public static JSONObject getJson(String key) { + String value = redisTemplate.opsForValue().get(key); + if (value == null) { + return null; + } + return JSON.parseObject(value); + } + /** * 获取 json * @@ -28,7 +44,7 @@ public class RedisStrings extends RedisUtils { * @return T */ public static T getJson(CacheKeyDefine define) { - return getJson(define.getKey(), define); + return (T) getJson(define.getKey(), define.getType()); } /** @@ -40,11 +56,37 @@ public class RedisStrings extends RedisUtils { * @return T */ public static T getJson(String key, CacheKeyDefine define) { + return (T) getJson(key, define.getType()); + } + + /** + * 获取 json + * + * @param key key + * @param type type + * @param T + * @return T + */ + public static T getJson(String key, Class type) { String value = redisTemplate.opsForValue().get(key); if (value == null) { return null; } - return (T) JSON.parseObject(value, define.getType()); + return (T) JSON.parseObject(value, type); + } + + /** + * 获取 json + * + * @param key key + * @return JSONArray + */ + public static JSONArray getJsonArray(String key) { + String value = redisTemplate.opsForValue().get(key); + if (value == null) { + return null; + } + return JSON.parseArray(value); } /** @@ -55,7 +97,7 @@ public class RedisStrings extends RedisUtils { * @return T */ public static List getJsonArray(CacheKeyDefine define) { - return getJsonArray(define.getKey(), define); + return (List) getJsonArray(define.getKey(), define.getType()); } /** @@ -67,11 +109,23 @@ public class RedisStrings extends RedisUtils { * @return T */ public static List getJsonArray(String key, CacheKeyDefine define) { + return (List) getJsonArray(key, define.getType()); + } + + /** + * 获取 json + * + * @param key key + * @param type type + * @param T + * @return T + */ + public static List getJsonArray(String key, Class type) { String value = redisTemplate.opsForValue().get(key); if (value == null) { return null; } - return (List) JSON.parseArray(value, define.getType()); + return JSON.parseArray(value, type); } /** diff --git a/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/handler/preference/model/PreferenceModel.java b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/handler/preference/model/PreferenceModel.java new file mode 100644 index 00000000..085727e3 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/handler/preference/model/PreferenceModel.java @@ -0,0 +1,25 @@ +package com.orion.ops.module.infra.handler.preference.model; + +import com.alibaba.fastjson.JSON; + +import java.util.Map; + +/** + * 偏好 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/8 13:54 + */ +public interface PreferenceModel { + + /** + * 转为 map + * + * @return map + */ + default Map toMap() { + return JSON.parseObject(JSON.toJSONString(this)); + } + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/IPreferenceStrategy.java b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/IPreferenceStrategy.java new file mode 100644 index 00000000..f9071672 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-provider/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/IPreferenceStrategy.java @@ -0,0 +1,21 @@ +package com.orion.ops.module.infra.handler.preference.strategy; + +import com.orion.ops.module.infra.handler.preference.model.PreferenceModel; + +/** + * 偏好处理策略 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/8 13:49 + */ +public interface IPreferenceStrategy { + + /** + * 获取默认值 + * + * @return 默认值 + */ + Model getDefault(); + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PermissionController.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PermissionController.java index fb781bad..a26f7af3 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PermissionController.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PermissionController.java @@ -56,7 +56,7 @@ public class PermissionController { @IgnoreLog(IgnoreLogMode.RET) @GetMapping("/user") - @Operation(summary = "获取用户权限") + @Operation(summary = "获取用户权限聚合信息") public UserPermissionVO getUserPermission() { return permissionService.getUserPermission(); } diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PreferenceController.http b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PreferenceController.http new file mode 100644 index 00000000..42ae359a --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PreferenceController.http @@ -0,0 +1,28 @@ +### 更新用户偏好-全部 +PUT {{baseUrl}}/infra/preference/update +Content-Type: application/json +Authorization: {{token}} + +{ + "type": "SYSTEM", + "config": { + } +} + + +### 更新用户偏好-部分 +PUT {{baseUrl}}/infra/preference/update-partial +Content-Type: application/json +Authorization: {{token}} + +{ + "type": "SYSTEM", + "config": { + } +} + + +### 查询用户偏好 +GET {{baseUrl}}/infra/preference/get?type=SYSTEM +Authorization: {{token}} + diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PreferenceController.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PreferenceController.java new file mode 100644 index 00000000..2c1ef711 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/controller/PreferenceController.java @@ -0,0 +1,55 @@ +package com.orion.ops.module.infra.controller; + +import com.orion.ops.framework.common.annotation.RestWrapper; +import com.orion.ops.module.infra.entity.request.preference.PreferenceUpdateRequest; +import com.orion.ops.module.infra.entity.vo.PreferenceVO; +import com.orion.ops.module.infra.service.PreferenceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 用户偏好 api + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +@Tag(name = "infra - 用户偏好服务") +@Slf4j +@Validated +@RestWrapper +@RestController +@RequestMapping("/infra/preference") +@SuppressWarnings({"ELValidationInJSP", "SpringElInspection"}) +public class PreferenceController { + + @Resource + private PreferenceService preferenceService; + + @PutMapping("/update") + @Operation(summary = "更新用户偏好-整体") + public Integer updatePreference(@Validated @RequestBody PreferenceUpdateRequest request) { + return preferenceService.updatePreference(request, false); + } + + @PutMapping("/update-partial") + @Operation(summary = "更新用户偏好-部分") + public Integer updatePreferencePartial(@Validated @RequestBody PreferenceUpdateRequest request) { + return preferenceService.updatePreference(request, true); + } + + @GetMapping("/get") + @Operation(summary = "查询用户偏好") + @Parameter(name = "type", description = "type", required = true) + public PreferenceVO getPreference(@RequestParam("type") String type) { + return preferenceService.getPreferenceByType(type); + } + +} + diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/PreferenceConvert.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/PreferenceConvert.java new file mode 100644 index 00000000..b409a322 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/PreferenceConvert.java @@ -0,0 +1,28 @@ +package com.orion.ops.module.infra.convert; + +import com.orion.ops.module.infra.entity.domain.PreferenceDO; +import com.orion.ops.module.infra.entity.request.preference.PreferenceUpdateRequest; +import com.orion.ops.module.infra.entity.vo.PreferenceVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +/** + * 用户偏好 内部对象转换器 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +@Mapper +public interface PreferenceConvert { + + PreferenceConvert MAPPER = Mappers.getMapper(PreferenceConvert.class); + + @Mapping(target = "config", ignore = true) + PreferenceDO to(PreferenceUpdateRequest request); + + @Mapping(target = "config", ignore = true) + PreferenceVO to(PreferenceDO domain); + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/SystemUserConvert.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/SystemUserConvert.java index 4215c7d2..12ae921a 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/SystemUserConvert.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/convert/SystemUserConvert.java @@ -7,7 +7,7 @@ import com.orion.ops.module.infra.entity.request.user.SystemUserQueryRequest; import com.orion.ops.module.infra.entity.request.user.SystemUserUpdateRequest; import com.orion.ops.module.infra.entity.request.user.SystemUserUpdateStatusRequest; import com.orion.ops.module.infra.entity.vo.SystemUserVO; -import com.orion.ops.module.infra.entity.vo.UserBaseInfoVO; +import com.orion.ops.module.infra.entity.vo.UserCollectInfoVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -39,6 +39,6 @@ public interface SystemUserConvert { LoginUser toLoginUser(SystemUserDO domain); - UserBaseInfoVO toBaseInfo(LoginUser user); + UserCollectInfoVO toCollectInfo(LoginUser user); } diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/dao/PreferenceDAO.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/dao/PreferenceDAO.java new file mode 100644 index 00000000..6053b75c --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/dao/PreferenceDAO.java @@ -0,0 +1,28 @@ +package com.orion.ops.module.infra.dao; + +import com.orion.ops.framework.mybatis.core.mapper.IMapper; +import com.orion.ops.framework.mybatis.core.query.Conditions; +import com.orion.ops.module.infra.entity.domain.PreferenceDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户偏好 Mapper 接口 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +@Mapper +public interface PreferenceDAO extends IMapper { + + /** + * 通过 userId 删除 + * + * @param userId userId + * @return effect + */ + default int deleteByUserId(Long userId) { + return this.delete(Conditions.eq(PreferenceDO::getUserId, userId)); + } + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/define/PreferenceCacheKeyDefine.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/define/PreferenceCacheKeyDefine.java new file mode 100644 index 00000000..b1dac4e6 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/define/PreferenceCacheKeyDefine.java @@ -0,0 +1,25 @@ +package com.orion.ops.module.infra.define; + +import com.alibaba.fastjson.JSONObject; +import com.orion.lang.define.cache.CacheKeyBuilder; +import com.orion.lang.define.cache.CacheKeyDefine; + +import java.util.concurrent.TimeUnit; + +/** + * 用户偏好缓存 key + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +public interface PreferenceCacheKeyDefine { + + CacheKeyDefine PREFERENCE = new CacheKeyBuilder() + .key("user:preference:{}:{}") + .desc("用户偏好 ${userId} ${type}") + .type(JSONObject.class) + .timeout(1, TimeUnit.DAYS) + .build(); + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/domain/PreferenceDO.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/domain/PreferenceDO.java new file mode 100644 index 00000000..63880a30 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/domain/PreferenceDO.java @@ -0,0 +1,45 @@ +package com.orion.ops.module.infra.entity.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.orion.ops.framework.mybatis.core.domain.BaseDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +/** + * 用户偏好 实体对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "preference", autoResultMap = true) +@Schema(name = "PreferenceDO", description = "用户偏好 实体对象") +public class PreferenceDO extends BaseDO { + + private static final long serialVersionUID = 1L; + + @Schema(description = "id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @Schema(description = "用户id") + @TableField("user_id") + private Long userId; + + @Schema(description = "类型") + @TableField("type") + private String type; + + @Schema(description = "偏好配置") + @TableField("config") + private String config; + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/request/preference/PreferenceUpdateRequest.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/request/preference/PreferenceUpdateRequest.java new file mode 100644 index 00000000..f550140f --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/request/preference/PreferenceUpdateRequest.java @@ -0,0 +1,38 @@ +package com.orion.ops.module.infra.entity.request.preference; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.Map; + +/** + * 用户偏好 更新请求对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "PreferenceUpdateRequest", description = "用户偏好 更新请求对象") +public class PreferenceUpdateRequest implements Serializable { + + @NotBlank + @Size(max = 12) + @Schema(description = "类型") + private String type; + + @NotEmpty + @Schema(description = "偏好配置") + private Map config; + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/PreferenceVO.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/PreferenceVO.java new file mode 100644 index 00000000..42648553 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/PreferenceVO.java @@ -0,0 +1,31 @@ +package com.orion.ops.module.infra.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Map; + +/** + * 用户偏好 视图响应对象 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "PreferenceVO", description = "用户偏好 视图响应对象") +public class PreferenceVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "偏好配置") + private Map config; + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserBaseInfoVO.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserCollectInfoVO.java similarity index 66% rename from orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserBaseInfoVO.java rename to orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserCollectInfoVO.java index a2a135f7..32945de8 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserBaseInfoVO.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserCollectInfoVO.java @@ -6,6 +6,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Map; + /** * 用户基本信息 视图响应对象 * @@ -17,8 +19,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -@Schema(name = "UserBaseInfoVO", description = "用户基本信息 视图响应对象") -public class UserBaseInfoVO { +@Schema(name = "UserCollectInfoVO", description = "用户聚合信息 视图响应对象") +public class UserCollectInfoVO { @Schema(description = "id") private Long id; @@ -32,4 +34,10 @@ public class UserBaseInfoVO { @Schema(description = "头像地址") private String avatar; + @Schema(description = "系统偏好") + private Map systemPreference; + + @Schema(description = "提示偏好") + private Map tipsPreference; + } diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserPermissionVO.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserPermissionVO.java index 0f56a508..a1c247fe 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserPermissionVO.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/entity/vo/UserPermissionVO.java @@ -22,8 +22,8 @@ import java.util.List; @Schema(name = "UserPermissionVO", description = "用户权限 视图响应对象") public class UserPermissionVO { - @Schema(description = "用户基本信息") - private UserBaseInfoVO user; + @Schema(description = "用户聚合信息") + private UserCollectInfoVO user; @Schema(description = "该用户已启用的角色") private List roles; diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/enums/PreferenceTypeEnum.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/enums/PreferenceTypeEnum.java new file mode 100644 index 00000000..245e5fd9 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/enums/PreferenceTypeEnum.java @@ -0,0 +1,66 @@ +package com.orion.ops.module.infra.enums; + +import com.orion.ops.module.infra.handler.preference.model.PreferenceModel; +import com.orion.ops.module.infra.handler.preference.strategy.IPreferenceStrategy; +import com.orion.spring.SpringHolder; +import lombok.Getter; + +/** + * 偏好类型 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/8 11:31 + */ +@Getter +public enum PreferenceTypeEnum { + + /** + * 系统偏好 + */ + SYSTEM("systemPreferenceStrategy"), + + /** + * 提示偏好 + */ + TIPS("tipsPreferenceStrategy"), + + ; + + PreferenceTypeEnum(String beanName) { + this.type = this.name(); + this.beanName = beanName; + } + + private final String type; + + /** + * 策越 bean 名称 + * 可能跨模块所以不用 class + */ + private final String beanName; + + public static PreferenceTypeEnum of(String type) { + if (type == null) { + return null; + } + for (PreferenceTypeEnum value : values()) { + if (value.type.equals(type)) { + return value; + } + } + return null; + } + + /** + * 获取策略 + * + * @param model + * @param type + * @return IPreferenceStrategy + */ + public > T getStrategy() { + return SpringHolder.getBean(beanName); + } + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/AppPreferenceModel.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/AppPreferenceModel.java new file mode 100644 index 00000000..e2fb270e --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/AppPreferenceModel.java @@ -0,0 +1,52 @@ +package com.orion.ops.module.infra.handler.preference.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 系统偏好模型 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/8 13:59 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AppPreferenceModel implements PreferenceModel { + + @Schema(description = "是否使用侧边菜单") + private Boolean menu; + + @Schema(description = "是否使用顶部菜单") + private Boolean topMenu; + + @Schema(description = "是否显示导航栏") + private Boolean navbar; + + @Schema(description = "是否显示页脚") + private Boolean footer; + + @Schema(description = "是否开启多页签") + private Boolean tabBar; + + @Schema(description = "是否开启色弱模式") + private Boolean colorWeak; + + @Schema(description = "菜单宽度") + private Number menuWidth; + + @Schema(description = "主机视图") + private String hostView; + + @Schema(description = "主机秘钥视图") + private String hostKeyView; + + @Schema(description = "主机身份视图") + private String hostIdentityView; + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TipsPreferenceModel.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TipsPreferenceModel.java new file mode 100644 index 00000000..80184e47 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TipsPreferenceModel.java @@ -0,0 +1,25 @@ +package com.orion.ops.module.infra.handler.preference.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 提示偏好模型 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/8 13:59 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TipsPreferenceModel implements PreferenceModel { + + @Schema(description = "是否提示过系统偏好设置模态框") + private Boolean tippedSystemPreferenceModal; + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/SystemPreferenceStrategy.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/SystemPreferenceStrategy.java new file mode 100644 index 00000000..37445e76 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/SystemPreferenceStrategy.java @@ -0,0 +1,36 @@ +package com.orion.ops.module.infra.handler.preference.strategy; + +import com.orion.ops.module.infra.handler.preference.model.AppPreferenceModel; +import org.springframework.stereotype.Component; + +/** + * 系统偏好处理策略 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/8 13:48 + */ +@Component +public class SystemPreferenceStrategy implements IPreferenceStrategy { + + private static final String TABLE = "table"; + + private static final String CARD = "card"; + + @Override + public AppPreferenceModel getDefault() { + return AppPreferenceModel.builder() + .menu(true) + .topMenu(false) + .navbar(true) + .footer(true) + .tabBar(true) + .menuWidth(220) + .colorWeak(false) + .hostView(TABLE) + .hostKeyView(CARD) + .hostIdentityView(CARD) + .build(); + } + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TipsPreferenceStrategy.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TipsPreferenceStrategy.java new file mode 100644 index 00000000..64cbe737 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TipsPreferenceStrategy.java @@ -0,0 +1,23 @@ +package com.orion.ops.module.infra.handler.preference.strategy; + +import com.orion.ops.module.infra.handler.preference.model.TipsPreferenceModel; +import org.springframework.stereotype.Component; + +/** + * 提示偏好处理策略 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/10/8 15:11 + */ +@Component +public class TipsPreferenceStrategy implements IPreferenceStrategy { + + @Override + public TipsPreferenceModel getDefault() { + return TipsPreferenceModel.builder() + .tippedSystemPreferenceModal(false) + .build(); + } + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/PreferenceService.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/PreferenceService.java new file mode 100644 index 00000000..7b00b2d0 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/PreferenceService.java @@ -0,0 +1,52 @@ +package com.orion.ops.module.infra.service; + +import com.orion.ops.module.infra.entity.request.preference.PreferenceUpdateRequest; +import com.orion.ops.module.infra.entity.vo.PreferenceVO; +import com.orion.ops.module.infra.enums.PreferenceTypeEnum; + +import java.util.Map; +import java.util.concurrent.Future; + +/** + * 用户偏好 服务类 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +public interface PreferenceService { + + /** + * 更新用户偏好 + * + * @param request request + * @param partial 是否为部分更新 + * @return effect + */ + Integer updatePreference(PreferenceUpdateRequest request, boolean partial); + + /** + * 查询用户偏好 + * + * @param type type + * @return row + */ + PreferenceVO getPreferenceByType(String type); + + /** + * 获取用户偏好 + * + * @param userId userId + * @param type type + * @return 偏好 + */ + Future> getPreference(Long userId, PreferenceTypeEnum type); + + /** + * 删除用户偏好 + * + * @param userId userId + */ + void deletePreferenceByUserId(Long userId); + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/FavoriteServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/FavoriteServiceImpl.java index 5408cfbf..f1f201d7 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/FavoriteServiceImpl.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/FavoriteServiceImpl.java @@ -17,6 +17,7 @@ import com.orion.ops.module.infra.enums.FavoriteTypeEnum; import com.orion.ops.module.infra.service.FavoriteService; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -111,6 +112,7 @@ public class FavoriteServiceImpl implements FavoriteService { } @Override + @Async("asyncExecutor") public void deleteFavoriteByUserId(Long userId) { if (userId == null) { return; @@ -127,6 +129,7 @@ public class FavoriteServiceImpl implements FavoriteService { } @Override + @Async("asyncExecutor") public void deleteFavoriteByUserIdList(List userIdList) { if (Lists.isEmpty(userIdList)) { return; diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PermissionServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PermissionServiceImpl.java index 41a55629..4ff16a67 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PermissionServiceImpl.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PermissionServiceImpl.java @@ -16,20 +16,24 @@ import com.orion.ops.module.infra.entity.domain.SystemRoleDO; import com.orion.ops.module.infra.entity.domain.SystemRoleMenuDO; import com.orion.ops.module.infra.entity.dto.SystemMenuCacheDTO; import com.orion.ops.module.infra.entity.vo.SystemMenuVO; -import com.orion.ops.module.infra.entity.vo.UserBaseInfoVO; +import com.orion.ops.module.infra.entity.vo.UserCollectInfoVO; import com.orion.ops.module.infra.entity.vo.UserPermissionVO; import com.orion.ops.module.infra.enums.MenuStatusEnum; import com.orion.ops.module.infra.enums.MenuTypeEnum; +import com.orion.ops.module.infra.enums.PreferenceTypeEnum; import com.orion.ops.module.infra.enums.RoleStatusEnum; import com.orion.ops.module.infra.service.PermissionService; +import com.orion.ops.module.infra.service.PreferenceService; import com.orion.ops.module.infra.service.SystemMenuService; import lombok.Getter; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; +import java.util.concurrent.Future; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -66,11 +70,14 @@ public class PermissionServiceImpl implements PermissionService { @Resource private SystemMenuService systemMenuService; + @Resource + private PreferenceService preferenceService; + @PostConstruct @Override public void initPermissionCache() { long start = System.currentTimeMillis(); - log.info("initRoleMenuCache-start"); + log.info("initPermissionCache-start"); roleCache.clear(); menuCache.clear(); roleMenuCache.clear(); @@ -104,7 +111,7 @@ public class PermissionServiceImpl implements PermissionService { .map(SystemRoleDO::getCode) .ifPresent(code -> roleMenuCache.put(code, roleMenus)); }); - log.info("initRoleMenuCache-end used: {}ms", System.currentTimeMillis() - start); + log.info("initPermissionCache-end used: {}ms", System.currentTimeMillis() - start); } @Override @@ -186,10 +193,16 @@ public class PermissionServiceImpl implements PermissionService { return systemMenuService.buildSystemMenuTree(menus); } + @SneakyThrows @Override public UserPermissionVO getUserPermission() { // 获取用户信息 - UserBaseInfoVO user = SystemUserConvert.MAPPER.toBaseInfo(SecurityUtils.getLoginUser()); + UserCollectInfoVO user = SystemUserConvert.MAPPER.toCollectInfo(SecurityUtils.getLoginUser()); + Long id = user.getId(); + // 获取用户系统偏好 + Future> systemPreference = preferenceService.getPreference(id, PreferenceTypeEnum.SYSTEM); + // 获取用户提示偏好 + Future> tipsPreference = preferenceService.getPreference(id, PreferenceTypeEnum.TIPS); // 获取用户角色 List roles = this.getUserEnabledRoles(); // 获取用户权限 @@ -213,6 +226,9 @@ public class PermissionServiceImpl implements PermissionService { .collect(Collectors.toList()); } } + // 获取异步结果 + user.setSystemPreference(systemPreference.get()); + user.setTipsPreference(tipsPreference.get()); // 组装数据 return UserPermissionVO.builder() .user(user) diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PreferenceServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PreferenceServiceImpl.java new file mode 100644 index 00000000..1742fbde --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/PreferenceServiceImpl.java @@ -0,0 +1,165 @@ +package com.orion.ops.module.infra.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.orion.lang.utils.collect.Maps; +import com.orion.ops.framework.common.utils.Valid; +import com.orion.ops.framework.redis.core.utils.RedisStrings; +import com.orion.ops.framework.security.core.utils.SecurityUtils; +import com.orion.ops.module.infra.dao.PreferenceDAO; +import com.orion.ops.module.infra.define.PreferenceCacheKeyDefine; +import com.orion.ops.module.infra.entity.domain.PreferenceDO; +import com.orion.ops.module.infra.entity.request.preference.PreferenceUpdateRequest; +import com.orion.ops.module.infra.entity.vo.PreferenceVO; +import com.orion.ops.module.infra.enums.PreferenceTypeEnum; +import com.orion.ops.module.infra.service.PreferenceService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; +import java.util.stream.Collectors; + +/** + * 用户偏好 服务实现类 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023-9-27 18:37 + */ +@Slf4j +@Service +public class PreferenceServiceImpl implements PreferenceService { + + @Resource + private PreferenceDAO preferenceDAO; + + @Override + public Integer updatePreference(PreferenceUpdateRequest request, boolean partial) { + Long userId = SecurityUtils.getLoginUserId(); + String type = request.getType(); + Valid.valid(PreferenceTypeEnum::of, type); + // 查询 + PreferenceDO preference = preferenceDAO.of() + .wrapper(this.buildQueryWrapper(userId, type)) + .getOne(); + int effect; + if (preference == null) { + // 直接插入 + PreferenceDO insertRecord = new PreferenceDO(); + insertRecord.setUserId(userId); + insertRecord.setType(type); + insertRecord.setConfig(JSON.toJSONString(request.getConfig())); + effect = preferenceDAO.insert(insertRecord); + } else { + // 更新 + PreferenceDO updateRecord = new PreferenceDO(); + updateRecord.setId(preference.getId()); + if (partial) { + // 部分更新 + JSONObject config = JSON.parseObject(preference.getConfig()); + config.putAll(request.getConfig()); + updateRecord.setConfig(JSON.toJSONString(config)); + } else { + // 全部更新 + updateRecord.setConfig(JSON.toJSONString(request.getConfig())); + } + effect = preferenceDAO.updateById(updateRecord); + // 删除缓存 + RedisStrings.delete(PreferenceCacheKeyDefine.PREFERENCE.format(userId, type)); + } + return effect; + } + + @Override + public PreferenceVO getPreferenceByType(String type) { + Long userId = SecurityUtils.getLoginUserId(); + PreferenceTypeEnum typeEnum = Valid.valid(PreferenceTypeEnum::of, type); + Map config = this.getPreferenceByCache(userId, typeEnum); + // 返回 + return PreferenceVO.builder() + .config(config) + .build(); + } + + @Override + @Async("asyncExecutor") + public Future> getPreference(Long userId, PreferenceTypeEnum type) { + Map config = this.getPreferenceByCache(userId, type); + return CompletableFuture.completedFuture(config); + } + + @Override + @Async("asyncExecutor") + public void deletePreferenceByUserId(Long userId) { + // 删除 + int effect = preferenceDAO.deleteByUserId(userId); + log.info("PreferenceService-deletePreferenceById userId: {}, effect: {}", userId, effect); + // 删除缓存 + List deleteKeys = Arrays.stream(PreferenceTypeEnum.values()) + .map(s -> PreferenceCacheKeyDefine.PREFERENCE.format(userId, s)) + .collect(Collectors.toList()); + RedisStrings.delete(deleteKeys); + } + + /** + * 通过缓存获取偏好 + * + * @param userId userId + * @param type type + * @return config + */ + private Map getPreferenceByCache(Long userId, PreferenceTypeEnum type) { + String typeValue = type.getType(); + // 查询缓存 用 string 防止数据类型丢失 + String key = PreferenceCacheKeyDefine.PREFERENCE.format(userId, type); + Map config = RedisStrings.getJson(key); + boolean setCache = Maps.isEmpty(config); + // 查询数据库 + if (Maps.isEmpty(config)) { + config = preferenceDAO.of() + .wrapper(this.buildQueryWrapper(userId, typeValue)) + .optionalOne() + .map(PreferenceDO::getConfig) + .map(JSON::parseObject) + .orElse(null); + } + // 初始化 + if (Maps.isEmpty(config)) { + config = type.getStrategy() + .getDefault() + .toMap(); + // 插入 + PreferenceDO entity = new PreferenceDO(); + entity.setUserId(userId); + entity.setType(typeValue); + entity.setConfig(JSON.toJSONString(config)); + preferenceDAO.insert(entity); + } + // 设置缓存 + if (setCache) { + RedisStrings.setJson(key, PreferenceCacheKeyDefine.PREFERENCE, config); + } + return config; + } + + /** + * 构建查询 wrapper + * + * @param userId userId + * @param type type + * @return wrapper + */ + private LambdaQueryWrapper buildQueryWrapper(Long userId, String type) { + return preferenceDAO.wrapper() + .eq(PreferenceDO::getUserId, userId) + .eq(PreferenceDO::getType, type); + } + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemUserServiceImpl.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemUserServiceImpl.java index ce47c122..9c0b03a9 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemUserServiceImpl.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/service/impl/SystemUserServiceImpl.java @@ -22,6 +22,7 @@ import com.orion.ops.module.infra.entity.vo.SystemUserVO; import com.orion.ops.module.infra.enums.UserStatusEnum; import com.orion.ops.module.infra.service.AuthenticationService; import com.orion.ops.module.infra.service.FavoriteService; +import com.orion.ops.module.infra.service.PreferenceService; import com.orion.ops.module.infra.service.SystemUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; @@ -52,6 +53,9 @@ public class SystemUserServiceImpl implements SystemUserService { @Resource private FavoriteService favoriteService; + @Resource + private PreferenceService preferenceService; + @Resource private RedisTemplate redisTemplate; @@ -169,6 +173,8 @@ public class SystemUserServiceImpl implements SystemUserService { redisTemplate.delete(UserCacheKeyDefine.USER_INFO.format(id)); // 删除用户收藏 favoriteService.deleteFavoriteByUserId(id); + // 删除用户偏好 + preferenceService.deletePreferenceByUserId(id); return effect; } diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/resources/mapper/PreferenceMapper.xml b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/resources/mapper/PreferenceMapper.xml new file mode 100644 index 00000000..b5b61123 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/resources/mapper/PreferenceMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + id, user_id, type, config, create_time, update_time, creator, updater, deleted + + + diff --git a/orion-ops-ui/src/api/user/preference.ts b/orion-ops-ui/src/api/user/preference.ts new file mode 100644 index 00000000..20976194 --- /dev/null +++ b/orion-ops-ui/src/api/user/preference.ts @@ -0,0 +1,40 @@ +import axios from 'axios'; + +type Preference = 'SYSTEM' | 'TIPS' + +/** + * 用户偏好更新请求 + */ +export interface PreferenceUpdateRequest { + type: Preference; + config: object; +} + +/** + * 用户偏好查询响应 + */ +export interface PreferenceQueryResponse { + config: object; +} + +/** + * 更新用户偏好-整体 + */ +export function updatePreference(request: PreferenceUpdateRequest) { + return axios.put('/infra/preference/update', request); +} + +/** + * 更新用户偏好-部分 + */ +export function updatePreferencePartial(request: PreferenceUpdateRequest) { + return axios.put('/infra/preference/update-partial', request); +} + +/** + * 查询用户偏好 + */ +export function getPreference(type: Preference) { + return axios.get('/infra/preference/get', { params: { type } }); +} + diff --git a/orion-ops-ui/src/components/global-setting/block.vue b/orion-ops-ui/src/components/global-setting/block.vue index 55b8553b..4898ad05 100644 --- a/orion-ops-ui/src/components/global-setting/block.vue +++ b/orion-ops-ui/src/components/global-setting/block.vue @@ -4,9 +4,9 @@
{{ option.name }} - + @@ -19,6 +19,8 @@ import { useAppStore } from '@/store'; import FormWrapper from './form-wrapper.vue'; import { RadioOption } from '@arco-design/web-vue/es/radio/interface'; + import { updatePreferencePartial } from '@/api/user/preference'; + import { Message } from '@arco-design/web-vue'; interface OptionsProps { name: string; @@ -37,6 +39,7 @@ }, }, }); + const appStore = useAppStore(); /** @@ -46,10 +49,6 @@ key: string; value: unknown; }) => { - // 色弱模式 - if (key === 'colorWeak') { - document.body.style.filter = value ? 'invert(80%)' : 'none'; - } // 顶部菜单 if (key === 'topMenu') { appStore.updateSettings({ @@ -57,9 +56,21 @@ }); } // 修改配置 - appStore.updateSettings({ [key]: value }); - // TODO 同步偏好 - + const updateConfig = { [key]: value }; + appStore.updateSettings(updateConfig); + // 同步偏好 + Message.clear(); + const loading = Message.loading('同步中...'); + try { + await updatePreferencePartial({ + type: 'SYSTEM', + config: updateConfig + }); + Message.success('同步成功'); + } catch (e) { + } finally { + loading.close(); + } }; diff --git a/orion-ops-ui/src/store/modules/app/index.ts b/orion-ops-ui/src/store/modules/app/index.ts index d081fe16..70b14026 100644 --- a/orion-ops-ui/src/store/modules/app/index.ts +++ b/orion-ops-ui/src/store/modules/app/index.ts @@ -1,5 +1,6 @@ import { defineStore } from 'pinia'; import { AppState } from './types'; +import TimeScale from 'echarts/types/src/scale/Time'; const defaultConfig: AppState = { // 应用设置 @@ -36,16 +37,17 @@ export default defineStore('app', { }, actions: { - // 修改颜色主题 - toggleTheme(dark: boolean) { - this.updateSettings({ - theme: dark ? 'dark' : 'light' - }); - document.body.setAttribute('arco-theme', dark ? 'dark' : 'light'); - }, - // 更新配置 updateSettings(partial: Partial) { + // 主题颜色 + if (partial.theme !== undefined) { + document.body.setAttribute('arco-theme', partial.theme); + } + // 色弱模式 + if (partial.colorWeak !== undefined) { + document.body.style.filter = partial.colorWeak ? 'invert(80%)' : 'none'; + } + // 修改配置 this.$patch(partial as object); }, }, diff --git a/orion-ops-ui/src/store/modules/user/index.ts b/orion-ops-ui/src/store/modules/user/index.ts index e054c61e..2b702dd6 100644 --- a/orion-ops-ui/src/store/modules/user/index.ts +++ b/orion-ops-ui/src/store/modules/user/index.ts @@ -4,7 +4,7 @@ import { clearToken, setToken } from '@/utils/auth'; import { md5 } from '@/utils'; import { removeRouteListener } from '@/utils/route-listener'; import { UserState } from './types'; -import { useMenuStore, useTabBarStore } from '@/store'; +import { useAppStore, useMenuStore, useTabBarStore } from '@/store'; export default defineStore('user', { state: (): UserState => ({ @@ -30,7 +30,6 @@ export default defineStore('user', { // 获取用户信息 async info() { - // TODO 查询偏好 const { data } = await getUserPermission(); // 设置用户信息 this.setInfo({ @@ -41,8 +40,9 @@ export default defineStore('user', { roles: data.roles, permission: data.permissions, }); - // TODO 设置用户偏好 - + // 设置用户偏好 + const appStore = useAppStore(); + appStore.updateSettings(data.user.systemPreference); }, // 登录