package com.webgame.webgamebackend.common.constants; import java.nio.charset.StandardCharsets; import java.util.Base64; /** * 用户相关常量 */ public final class UserConstants { private UserConstants() { // 工具类禁止实例化 } /** * 头像背景色板(14 种 Material Design 颜色) */ private static final String[] AVATAR_COLORS = { "#E53935", "#D81B60", "#8E24AA", "#5E35B1", "#3949AB", "#1E88E5", "#039BE5", "#00ACC1", "#00897B", "#43A047", "#7CB342", "#C0CA33", "#FB8C00", "#F4511E" }; /** * 默认昵称(当用户昵称为空时使用) */ private static final String DEFAULT_NICKNAME = "玩家"; /** * 根据昵称生成默认头像 data URI(本地 SVG,无需外部 API) * * @param nickName 用户昵称 * @return data:image/svg+xml;base64,... 格式的头像 */ public static String generateDefaultAvatar(String nickName) { String name = (nickName == null || nickName.isBlank()) ? DEFAULT_NICKNAME : nickName.trim(); // 取首字符作为头像文字 String initial = name.substring(0, 1); // 根据昵称 hash 选颜色,同一昵称颜色不变 int colorIndex = Math.abs(name.hashCode()) % AVATAR_COLORS.length; String bgColor = AVATAR_COLORS[colorIndex]; String svg = """ %s """.formatted(bgColor, escapeXml(initial)); String base64 = Base64.getEncoder().encodeToString(svg.getBytes(StandardCharsets.UTF_8)); return "data:image/svg+xml;base64," + base64; } /** * XML 特殊字符转义(防止文字中特殊字符破坏 SVG 结构) */ private static String escapeXml(String text) { return text .replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "'"); } }