后台前端界面调整

main
kangwenjing 2026-04-02 14:05:28 +08:00
parent 7080391f3a
commit 659c8a74c8
55 changed files with 927 additions and 316 deletions

View File

@ -0,0 +1,22 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="64" height="64" rx="18" fill="url(#bg)"/>
<rect x="4" y="4" width="56" height="56" rx="14" stroke="rgba(255,255,255,0.22)"/>
<text
x="32"
y="38"
text-anchor="middle"
font-size="21"
font-weight="700"
font-family="Arial, PingFang SC, Microsoft YaHei, sans-serif"
fill="white"
letter-spacing="0.5"
>
CRM
</text>
<defs>
<linearGradient id="bg" x1="10" y1="8" x2="56" y2="56" gradientUnits="userSpaceOnUse">
<stop stop-color="#7C3AED"/>
<stop offset="1" stop-color="#4F46E5"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 684 B

View File

@ -0,0 +1,46 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
<title id="title">Ziguang Huizhi CRM Icon Logo</title>
<desc id="desc">Brand-oriented CRM logo icon with an abstract converging symbol, data nodes, and geometric structure in purple tones.</desc>
<defs>
<linearGradient id="bg" x1="72" y1="60" x2="448" y2="460" gradientUnits="userSpaceOnUse">
<stop stop-color="#744CF7"/>
<stop offset="1" stop-color="#2E1685"/>
</linearGradient>
<linearGradient id="mark" x1="170" y1="152" x2="342" y2="360" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF"/>
<stop offset="1" stop-color="#D4C4FF"/>
</linearGradient>
<linearGradient id="accent" x1="198" y1="184" x2="322" y2="322" gradientUnits="userSpaceOnUse">
<stop stop-color="#A98CFF"/>
<stop offset="1" stop-color="#6C44F2"/>
</linearGradient>
</defs>
<rect x="40" y="40" width="432" height="432" rx="112" fill="url(#bg)"/>
<path d="M130 256C130 185.307 185.307 130 256 130C326.693 130 382 185.307 382 256C382 326.693 326.693 382 256 382C185.307 382 130 326.693 130 256Z" stroke="#FFFFFF" stroke-opacity="0.1" stroke-width="12"/>
<path d="M256 150L344 202V310L256 362L168 310V202L256 150Z" fill="#FFFFFF" fill-opacity="0.08"/>
<path d="M256 174L323 213V299L256 338L189 299V213L256 174Z" stroke="#FFFFFF" stroke-opacity="0.16" stroke-width="2"/>
<path d="M206 193L256 242L306 193" stroke="url(#mark)" stroke-width="22" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M206 319L256 270L306 319" stroke="url(#mark)" stroke-width="22" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M206 193V319" stroke="url(#mark)" stroke-width="18" stroke-linecap="round"/>
<path d="M306 193V319" stroke="url(#mark)" stroke-width="18" stroke-linecap="round"/>
<path d="M228 221L256 249L284 221" stroke="url(#accent)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M228 291L256 263L284 291" stroke="url(#accent)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="206" cy="193" r="14" fill="#FFFFFF"/>
<circle cx="306" cy="193" r="14" fill="#FFFFFF"/>
<circle cx="206" cy="319" r="14" fill="#FFFFFF"/>
<circle cx="306" cy="319" r="14" fill="#FFFFFF"/>
<circle cx="256" cy="242" r="14" fill="#FFFFFF"/>
<circle cx="256" cy="270" r="14" fill="#FFFFFF"/>
<circle cx="206" cy="193" r="5" fill="#7A57F8"/>
<circle cx="306" cy="193" r="5" fill="#7A57F8"/>
<circle cx="206" cy="319" r="5" fill="#7A57F8"/>
<circle cx="306" cy="319" r="5" fill="#7A57F8"/>
<circle cx="256" cy="242" r="5" fill="#7A57F8"/>
<circle cx="256" cy="270" r="5" fill="#7A57F8"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,37 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
<title id="title">Ziguang Huizhi CRM Icon Minimal</title>
<desc id="desc">Minimal enterprise CRM icon with geometric links, converging data paths, and a premium purple palette.</desc>
<defs>
<linearGradient id="bg" x1="64" y1="56" x2="448" y2="456" gradientUnits="userSpaceOnUse">
<stop stop-color="#7B57F8"/>
<stop offset="1" stop-color="#4320B7"/>
</linearGradient>
<linearGradient id="line" x1="156" y1="156" x2="356" y2="356" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF"/>
<stop offset="1" stop-color="#D7C9FF"/>
</linearGradient>
</defs>
<rect x="40" y="40" width="432" height="432" rx="108" fill="url(#bg)"/>
<rect x="78" y="78" width="356" height="356" rx="88" stroke="#FFFFFF" stroke-opacity="0.12" stroke-width="2"/>
<circle cx="176" cy="176" r="20" fill="#F6F2FF"/>
<circle cx="336" cy="176" r="20" fill="#F6F2FF"/>
<circle cx="176" cy="336" r="20" fill="#F6F2FF"/>
<circle cx="336" cy="336" r="20" fill="#F6F2FF"/>
<path d="M176 176L224 224" stroke="url(#line)" stroke-width="18" stroke-linecap="round"/>
<path d="M336 176L288 224" stroke="url(#line)" stroke-width="18" stroke-linecap="round"/>
<path d="M176 336L224 288" stroke="url(#line)" stroke-width="18" stroke-linecap="round"/>
<path d="M336 336L288 288" stroke="url(#line)" stroke-width="18" stroke-linecap="round"/>
<path d="M232 176V336" stroke="#F4EEFF" stroke-width="24" stroke-linecap="round"/>
<path d="M280 176V336" stroke="#F4EEFF" stroke-width="24" stroke-linecap="round"/>
<path d="M232 256H280" stroke="#F4EEFF" stroke-width="24" stroke-linecap="round"/>
<rect x="220" y="220" width="72" height="72" rx="24" fill="#F8F5FF" fill-opacity="0.18"/>
<circle cx="256" cy="256" r="22" fill="#FFFFFF"/>
<circle cx="256" cy="256" r="8" fill="#7B57F8"/>
<path d="M128 256C128 185.308 185.308 128 256 128C326.692 128 384 185.308 384 256C384 326.692 326.692 384 256 384C185.308 384 128 326.692 128 256Z" stroke="#FFFFFF" stroke-opacity="0.1" stroke-width="10" stroke-dasharray="1 20"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,86 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
<title id="title">Ziguang Huizhi CRM Icon Premium Glow</title>
<desc id="desc">Premium CRM icon with luminous data rings, glowing nodes, and a glass-like core on a purple enterprise background.</desc>
<defs>
<radialGradient id="bg" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(190 152) rotate(44.5) scale(410 430)">
<stop stop-color="#8B6BFF"/>
<stop offset="0.45" stop-color="#5E34E6"/>
<stop offset="1" stop-color="#20104D"/>
</radialGradient>
<radialGradient id="glow" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(256 256) rotate(90) scale(150)">
<stop stop-color="#FFFFFF" stop-opacity="0.9"/>
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0"/>
</radialGradient>
<linearGradient id="ring" x1="128" y1="128" x2="384" y2="384" gradientUnits="userSpaceOnUse">
<stop stop-color="#F8F4FF"/>
<stop offset="1" stop-color="#A887FF"/>
</linearGradient>
<linearGradient id="core" x1="210" y1="194" x2="314" y2="318" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF"/>
<stop offset="1" stop-color="#D8CCFF"/>
</linearGradient>
<filter id="blur40" x="84" y="84" width="344" height="344" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="20" result="effect1_foregroundBlur"/>
</filter>
<filter id="blur12" x="118" y="118" width="276" height="276" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="6" result="effect1_foregroundBlur"/>
</filter>
</defs>
<rect x="40" y="40" width="432" height="432" rx="112" fill="url(#bg)"/>
<rect x="74" y="74" width="364" height="364" rx="92" stroke="#FFFFFF" stroke-opacity="0.1" stroke-width="2"/>
<g filter="url(#blur40)">
<circle cx="256" cy="256" r="112" fill="url(#glow)" fill-opacity="0.5"/>
</g>
<circle cx="256" cy="256" r="136" stroke="#FFFFFF" stroke-opacity="0.08" stroke-width="2"/>
<circle cx="256" cy="256" r="104" stroke="url(#ring)" stroke-opacity="0.4" stroke-width="10"/>
<circle cx="256" cy="256" r="78" stroke="#FFFFFF" stroke-opacity="0.18" stroke-width="2" stroke-dasharray="4 14"/>
<g filter="url(#blur12)">
<path d="M172 184L228 228" stroke="#EDE6FF" stroke-width="16" stroke-linecap="round"/>
<path d="M340 184L284 228" stroke="#EDE6FF" stroke-width="16" stroke-linecap="round"/>
<path d="M172 328L228 284" stroke="#EDE6FF" stroke-width="16" stroke-linecap="round"/>
<path d="M340 328L284 284" stroke="#EDE6FF" stroke-width="16" stroke-linecap="round"/>
<path d="M196 256H224" stroke="#EDE6FF" stroke-width="16" stroke-linecap="round"/>
<path d="M288 256H316" stroke="#EDE6FF" stroke-width="16" stroke-linecap="round"/>
</g>
<path d="M172 184L228 228" stroke="#FFFFFF" stroke-opacity="0.92" stroke-width="10" stroke-linecap="round"/>
<path d="M340 184L284 228" stroke="#FFFFFF" stroke-opacity="0.92" stroke-width="10" stroke-linecap="round"/>
<path d="M172 328L228 284" stroke="#FFFFFF" stroke-opacity="0.92" stroke-width="10" stroke-linecap="round"/>
<path d="M340 328L284 284" stroke="#FFFFFF" stroke-opacity="0.92" stroke-width="10" stroke-linecap="round"/>
<path d="M196 256H224" stroke="#FFFFFF" stroke-opacity="0.92" stroke-width="10" stroke-linecap="round"/>
<path d="M288 256H316" stroke="#FFFFFF" stroke-opacity="0.92" stroke-width="10" stroke-linecap="round"/>
<g>
<rect x="204" y="204" width="104" height="104" rx="32" fill="#FFFFFF" fill-opacity="0.1"/>
<path d="M256 190L314 223V289L256 322L198 289V223L256 190Z" fill="url(#core)"/>
<path d="M256 212L294 234V278L256 300L218 278V234L256 212Z" fill="#5E34E6"/>
<path d="M237 245H275C282.18 245 288 250.82 288 258C288 265.18 282.18 271 275 271H237C229.82 271 224 265.18 224 258C224 250.82 229.82 245 237 245Z" fill="#F7F2FF"/>
<circle cx="256" cy="258" r="9" fill="#7E5AF8"/>
</g>
<g>
<circle cx="172" cy="184" r="16" fill="#FFFFFF"/>
<circle cx="340" cy="184" r="16" fill="#FFFFFF"/>
<circle cx="172" cy="328" r="16" fill="#FFFFFF"/>
<circle cx="340" cy="328" r="16" fill="#FFFFFF"/>
<circle cx="196" cy="256" r="14" fill="#FFFFFF"/>
<circle cx="316" cy="256" r="14" fill="#FFFFFF"/>
</g>
<g fill="#B495FF">
<circle cx="172" cy="184" r="6"/>
<circle cx="340" cy="184" r="6"/>
<circle cx="172" cy="328" r="6"/>
<circle cx="340" cy="328" r="6"/>
<circle cx="196" cy="256" r="5"/>
<circle cx="316" cy="256" r="5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -0,0 +1,86 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
<title id="title">紫光汇智 CRM 系统图标增强版</title>
<desc id="desc">以客户节点、管理中枢、数据连接和CRM字样强化客户关系管理系统的识别度。</desc>
<defs>
<linearGradient id="bgGradient" x1="70" y1="56" x2="442" y2="456" gradientUnits="userSpaceOnUse">
<stop stop-color="#7D5BFA"/>
<stop offset="0.55" stop-color="#5D33E6"/>
<stop offset="1" stop-color="#2A146F"/>
</linearGradient>
<linearGradient id="panelGradient" x1="108" y1="96" x2="404" y2="404" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF" stop-opacity="0.18"/>
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0.04"/>
</linearGradient>
<linearGradient id="linkGradient" x1="148" y1="132" x2="362" y2="314" gradientUnits="userSpaceOnUse">
<stop stop-color="#F7F3FF"/>
<stop offset="1" stop-color="#B89DFF"/>
</linearGradient>
<linearGradient id="coreGradient" x1="194" y1="158" x2="318" y2="306" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF"/>
<stop offset="1" stop-color="#D7CAFF"/>
</linearGradient>
<filter id="softGlow" x="104" y="96" width="304" height="256" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="8" result="effect1_foregroundBlur"/>
</filter>
</defs>
<rect x="40" y="40" width="432" height="432" rx="112" fill="url(#bgGradient)"/>
<rect x="76" y="76" width="360" height="360" rx="92" fill="url(#panelGradient)" stroke="#FFFFFF" stroke-opacity="0.1" stroke-width="2"/>
<circle cx="256" cy="216" r="126" stroke="#FFFFFF" stroke-opacity="0.08" stroke-width="14"/>
<circle cx="256" cy="216" r="92" stroke="#FFFFFF" stroke-opacity="0.14" stroke-width="6" stroke-dasharray="3 18"/>
<g filter="url(#softGlow)">
<path d="M170 150L224 194" stroke="url(#linkGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M342 150L288 194" stroke="url(#linkGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M150 246L214 230" stroke="url(#linkGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M362 246L298 230" stroke="url(#linkGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M190 308L232 270" stroke="url(#linkGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M322 308L280 270" stroke="url(#linkGradient)" stroke-width="14" stroke-linecap="round"/>
</g>
<g>
<circle cx="170" cy="150" r="18" fill="#F4EEFF"/>
<circle cx="342" cy="150" r="18" fill="#F4EEFF"/>
<circle cx="150" cy="246" r="18" fill="#F4EEFF"/>
<circle cx="362" cy="246" r="18" fill="#F4EEFF"/>
<circle cx="190" cy="308" r="18" fill="#F4EEFF"/>
<circle cx="322" cy="308" r="18" fill="#F4EEFF"/>
</g>
<g fill="#B396FF">
<circle cx="170" cy="150" r="6"/>
<circle cx="342" cy="150" r="6"/>
<circle cx="150" cy="246" r="6"/>
<circle cx="362" cy="246" r="6"/>
<circle cx="190" cy="308" r="6"/>
<circle cx="322" cy="308" r="6"/>
</g>
<g>
<path d="M256 142L316 176V244L256 278L196 244V176L256 142Z" fill="url(#coreGradient)"/>
<path d="M256 162L298 186V234L256 258L214 234V186L256 162Z" fill="#5D33E6"/>
<circle cx="256" cy="200" r="18" fill="#FFFFFF"/>
<path d="M224 234C224 218.536 236.536 206 252 206H260C275.464 206 288 218.536 288 234V236H224V234Z" fill="#F2ECFF"/>
<path d="M236 188L248 200" stroke="#A386FF" stroke-width="6" stroke-linecap="round"/>
<path d="M276 188L264 200" stroke="#A386FF" stroke-width="6" stroke-linecap="round"/>
</g>
<g opacity="0.92">
<path d="M228 120C236 112 246 108 256 108C266 108 276 112 284 120" stroke="#FFFFFF" stroke-opacity="0.3" stroke-width="8" stroke-linecap="round"/>
<path d="M214 322C225 334 240 340 256 340C272 340 287 334 298 322" stroke="#FFFFFF" stroke-opacity="0.22" stroke-width="8" stroke-linecap="round"/>
</g>
<g>
<rect x="126" y="354" width="260" height="62" rx="31" fill="#FFFFFF" fill-opacity="0.12" stroke="#FFFFFF" stroke-opacity="0.16" stroke-width="2"/>
<circle cx="162" cy="385" r="10" fill="#EDE6FF"/>
<path d="M178 385H196" stroke="#EDE6FF" stroke-width="8" stroke-linecap="round"/>
<path d="M224 372C214.059 372 206 380.059 206 390C206 399.941 214.059 408 224 408H232" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M252 372V408" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round"/>
<path d="M252 372H272C279.732 372 286 378.268 286 386C286 393.732 279.732 400 272 400H252" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M252 392L282 408" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round"/>
<path d="M306 408V372L324 394L342 372V408" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,76 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
<title id="title">紫光汇智 CRM 系统图标</title>
<desc id="desc">以紫色几何网络和数据流为核心,表达汇聚智慧、数据连接与客户关系管理的现代企业级图标。</desc>
<defs>
<linearGradient id="bgGradient" x1="76" y1="76" x2="436" y2="436" gradientUnits="userSpaceOnUse">
<stop stop-color="#6E41F5"/>
<stop offset="1" stop-color="#3D1FA8"/>
</linearGradient>
<linearGradient id="panelGradient" x1="120" y1="120" x2="392" y2="392" gradientUnits="userSpaceOnUse">
<stop stop-color="#8C67FF" stop-opacity="0.28"/>
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0.08"/>
</linearGradient>
<linearGradient id="linkGradient" x1="146" y1="164" x2="366" y2="348" gradientUnits="userSpaceOnUse">
<stop stop-color="#EEE8FF"/>
<stop offset="1" stop-color="#B99CFF"/>
</linearGradient>
<linearGradient id="coreGradient" x1="214" y1="214" x2="298" y2="298" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF"/>
<stop offset="1" stop-color="#D9CCFF"/>
</linearGradient>
<filter id="softGlow" x="96" y="96" width="320" height="320" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="10" result="effect1_foregroundBlur"/>
</filter>
</defs>
<rect x="40" y="40" width="432" height="432" rx="116" fill="url(#bgGradient)"/>
<rect x="76" y="76" width="360" height="360" rx="92" fill="url(#panelGradient)" stroke="#FFFFFF" stroke-opacity="0.12"/>
<circle cx="256" cy="256" r="142" stroke="#FFFFFF" stroke-opacity="0.12" stroke-width="20"/>
<circle cx="256" cy="256" r="104" stroke="#FFFFFF" stroke-opacity="0.1" stroke-width="10" stroke-dasharray="2 22"/>
<g filter="url(#softGlow)">
<path d="M160 178L224 226" stroke="url(#linkGradient)" stroke-width="18" stroke-linecap="round"/>
<path d="M160 334L224 286" stroke="url(#linkGradient)" stroke-width="18" stroke-linecap="round"/>
<path d="M352 178L288 226" stroke="url(#linkGradient)" stroke-width="18" stroke-linecap="round"/>
<path d="M352 334L288 286" stroke="url(#linkGradient)" stroke-width="18" stroke-linecap="round"/>
<path d="M184 256H214" stroke="url(#linkGradient)" stroke-width="18" stroke-linecap="round"/>
<path d="M298 256H328" stroke="url(#linkGradient)" stroke-width="18" stroke-linecap="round"/>
</g>
<path d="M196 170C218 147 239 136 256 136C273 136 294 147 316 170" stroke="#CDBBFF" stroke-opacity="0.95" stroke-width="14" stroke-linecap="round"/>
<path d="M196 342C218 365 239 376 256 376C273 376 294 365 316 342" stroke="#CDBBFF" stroke-opacity="0.95" stroke-width="14" stroke-linecap="round"/>
<g>
<rect x="220" y="220" width="72" height="72" rx="24" transform="rotate(45 256 256)" fill="url(#coreGradient)"/>
<path d="M256 204L302 230.5V281.5L256 308L210 281.5V230.5L256 204Z" fill="#5B33DE"/>
<path d="M256 226L283 241.5V272.5L256 288L229 272.5V241.5L256 226Z" fill="#EDE7FF"/>
<path d="M244 238H268C276.837 238 284 245.163 284 254V258C284 266.837 276.837 274 268 274H244C235.163 274 228 266.837 228 258V254C228 245.163 235.163 238 244 238Z" fill="#7B55F7"/>
<circle cx="256" cy="256" r="10" fill="#FFFFFF"/>
</g>
<g fill="#F4F0FF">
<circle cx="160" cy="178" r="18"/>
<circle cx="160" cy="334" r="18"/>
<circle cx="352" cy="178" r="18"/>
<circle cx="352" cy="334" r="18"/>
<circle cx="184" cy="256" r="16"/>
<circle cx="328" cy="256" r="16"/>
</g>
<g fill="#B99CFF">
<circle cx="160" cy="178" r="7"/>
<circle cx="160" cy="334" r="7"/>
<circle cx="352" cy="178" r="7"/>
<circle cx="352" cy="334" r="7"/>
<circle cx="184" cy="256" r="6"/>
<circle cx="328" cy="256" r="6"/>
</g>
<path d="M138 178C153 152 175 132 202 120" stroke="#FFFFFF" stroke-opacity="0.18" stroke-width="8" stroke-linecap="round"/>
<path d="M138 334C153 360 175 380 202 392" stroke="#FFFFFF" stroke-opacity="0.18" stroke-width="8" stroke-linecap="round"/>
<path d="M374 178C359 152 337 132 310 120" stroke="#FFFFFF" stroke-opacity="0.18" stroke-width="8" stroke-linecap="round"/>
<path d="M374 334C359 360 337 380 310 392" stroke="#FFFFFF" stroke-opacity="0.18" stroke-width="8" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -0,0 +1,94 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
<title id="title">紫光汇智销售 CRM 系统图标</title>
<desc id="desc">以线索节点、商机漏斗、转化路径和成交中枢,表达销售 CRM 系统的业务特征。</desc>
<defs>
<linearGradient id="bgGradient" x1="68" y1="56" x2="444" y2="456" gradientUnits="userSpaceOnUse">
<stop stop-color="#7F61FF"/>
<stop offset="0.52" stop-color="#5A31E3"/>
<stop offset="1" stop-color="#231056"/>
</linearGradient>
<linearGradient id="panelGradient" x1="92" y1="86" x2="420" y2="420" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF" stop-opacity="0.18"/>
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0.05"/>
</linearGradient>
<linearGradient id="funnelGradient" x1="174" y1="132" x2="338" y2="310" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF"/>
<stop offset="1" stop-color="#D6C7FF"/>
</linearGradient>
<linearGradient id="flowGradient" x1="138" y1="132" x2="374" y2="296" gradientUnits="userSpaceOnUse">
<stop stop-color="#F6F2FF"/>
<stop offset="1" stop-color="#AB8EFF"/>
</linearGradient>
<linearGradient id="dealGradient" x1="228" y1="252" x2="286" y2="320" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF"/>
<stop offset="1" stop-color="#E2D8FF"/>
</linearGradient>
<filter id="softGlow" x="104" y="94" width="304" height="254" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="8" result="effect1_foregroundBlur"/>
</filter>
</defs>
<rect x="40" y="40" width="432" height="432" rx="112" fill="url(#bgGradient)"/>
<rect x="76" y="76" width="360" height="360" rx="92" fill="url(#panelGradient)" stroke="#FFFFFF" stroke-opacity="0.1" stroke-width="2"/>
<circle cx="256" cy="212" r="126" stroke="#FFFFFF" stroke-opacity="0.08" stroke-width="14"/>
<circle cx="256" cy="212" r="94" stroke="#FFFFFF" stroke-opacity="0.14" stroke-width="6" stroke-dasharray="3 18"/>
<g filter="url(#softGlow)">
<path d="M158 146L204 180" stroke="url(#flowGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M256 122V168" stroke="url(#flowGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M354 146L308 180" stroke="url(#flowGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M174 242L214 228" stroke="url(#flowGradient)" stroke-width="14" stroke-linecap="round"/>
<path d="M338 242L298 228" stroke="url(#flowGradient)" stroke-width="14" stroke-linecap="round"/>
</g>
<g>
<circle cx="158" cy="146" r="18" fill="#F5F0FF"/>
<circle cx="256" cy="122" r="18" fill="#F5F0FF"/>
<circle cx="354" cy="146" r="18" fill="#F5F0FF"/>
<circle cx="174" cy="242" r="18" fill="#F5F0FF"/>
<circle cx="338" cy="242" r="18" fill="#F5F0FF"/>
</g>
<g fill="#AF92FF">
<circle cx="158" cy="146" r="6"/>
<circle cx="256" cy="122" r="6"/>
<circle cx="354" cy="146" r="6"/>
<circle cx="174" cy="242" r="6"/>
<circle cx="338" cy="242" r="6"/>
</g>
<path d="M194 166H318L294 226H218L194 166Z" fill="url(#funnelGradient)"/>
<path d="M212 194H300L286 230H226L212 194Z" fill="#7B57F8" fill-opacity="0.9"/>
<path d="M226 230H286L274 268H238L226 230Z" fill="#F1EAFF"/>
<path d="M244 268H268V302H244V268Z" fill="#FFFFFF"/>
<rect x="235" y="302" width="42" height="18" rx="9" fill="#CDBBFF"/>
<path d="M214 182H298" stroke="#FFFFFF" stroke-opacity="0.28" stroke-width="4" stroke-linecap="round"/>
<path d="M226 216H286" stroke="#FFFFFF" stroke-opacity="0.26" stroke-width="4" stroke-linecap="round"/>
<path d="M238 250H274" stroke="#7B57F8" stroke-opacity="0.4" stroke-width="4" stroke-linecap="round"/>
<g>
<circle cx="256" cy="292" r="30" fill="url(#dealGradient)"/>
<circle cx="256" cy="292" r="18" fill="#6A43EF"/>
<path d="M248 292L254 298L266 286" stroke="#FFFFFF" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g opacity="0.95">
<path d="M256 322V340" stroke="#F5F0FF" stroke-width="10" stroke-linecap="round"/>
<path d="M236 336L256 356L276 336" stroke="#F5F0FF" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<g>
<rect x="116" y="360" width="280" height="58" rx="29" fill="#FFFFFF" fill-opacity="0.12" stroke="#FFFFFF" stroke-opacity="0.16" stroke-width="2"/>
<path d="M148 389C148 379.611 155.611 372 165 372H177C186.389 372 194 379.611 194 389C194 398.389 186.389 406 177 406H165C155.611 406 148 398.389 148 389Z" fill="#F0E9FF"/>
<path d="M216 381C216 376.582 219.582 373 224 373H250" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round"/>
<path d="M216 397C216 392.582 219.582 389 224 389H244" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round"/>
<path d="M216 381V397" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round"/>
<path d="M270 373V405" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round"/>
<path d="M270 373H288C295.732 373 302 379.268 302 387C302 394.732 295.732 401 288 401H270" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M320 405V373L338 395L356 373V405" stroke="#FFFFFF" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -1,22 +1,46 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="64" height="64" rx="18" fill="url(#bg)"/>
<rect x="4" y="4" width="56" height="56" rx="14" stroke="rgba(255,255,255,0.22)"/>
<text
x="32"
y="38"
text-anchor="middle"
font-size="21"
font-weight="700"
font-family="Arial, PingFang SC, Microsoft YaHei, sans-serif"
fill="white"
letter-spacing="0.5"
>
CRM
</text>
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
<title id="title">Ziguang Huizhi CRM Icon Logo</title>
<desc id="desc">Brand-oriented CRM logo icon with an abstract converging symbol, data nodes, and geometric structure in purple tones.</desc>
<defs>
<linearGradient id="bg" x1="10" y1="8" x2="56" y2="56" gradientUnits="userSpaceOnUse">
<stop stop-color="#7C3AED"/>
<stop offset="1" stop-color="#4F46E5"/>
<linearGradient id="bg" x1="72" y1="60" x2="448" y2="460" gradientUnits="userSpaceOnUse">
<stop stop-color="#744CF7"/>
<stop offset="1" stop-color="#2E1685"/>
</linearGradient>
<linearGradient id="mark" x1="170" y1="152" x2="342" y2="360" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFFFFF"/>
<stop offset="1" stop-color="#D4C4FF"/>
</linearGradient>
<linearGradient id="accent" x1="198" y1="184" x2="322" y2="322" gradientUnits="userSpaceOnUse">
<stop stop-color="#A98CFF"/>
<stop offset="1" stop-color="#6C44F2"/>
</linearGradient>
</defs>
<rect x="40" y="40" width="432" height="432" rx="112" fill="url(#bg)"/>
<path d="M130 256C130 185.307 185.307 130 256 130C326.693 130 382 185.307 382 256C382 326.693 326.693 382 256 382C185.307 382 130 326.693 130 256Z" stroke="#FFFFFF" stroke-opacity="0.1" stroke-width="12"/>
<path d="M256 150L344 202V310L256 362L168 310V202L256 150Z" fill="#FFFFFF" fill-opacity="0.08"/>
<path d="M256 174L323 213V299L256 338L189 299V213L256 174Z" stroke="#FFFFFF" stroke-opacity="0.16" stroke-width="2"/>
<path d="M206 193L256 242L306 193" stroke="url(#mark)" stroke-width="22" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M206 319L256 270L306 319" stroke="url(#mark)" stroke-width="22" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M206 193V319" stroke="url(#mark)" stroke-width="18" stroke-linecap="round"/>
<path d="M306 193V319" stroke="url(#mark)" stroke-width="18" stroke-linecap="round"/>
<path d="M228 221L256 249L284 221" stroke="url(#accent)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M228 291L256 263L284 291" stroke="url(#accent)" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="206" cy="193" r="14" fill="#FFFFFF"/>
<circle cx="306" cy="193" r="14" fill="#FFFFFF"/>
<circle cx="206" cy="319" r="14" fill="#FFFFFF"/>
<circle cx="306" cy="319" r="14" fill="#FFFFFF"/>
<circle cx="256" cy="242" r="14" fill="#FFFFFF"/>
<circle cx="256" cy="270" r="14" fill="#FFFFFF"/>
<circle cx="206" cy="193" r="5" fill="#7A57F8"/>
<circle cx="306" cy="193" r="5" fill="#7A57F8"/>
<circle cx="206" cy="319" r="5" fill="#7A57F8"/>
<circle cx="306" cy="319" r="5" fill="#7A57F8"/>
<circle cx="256" cy="242" r="5" fill="#7A57F8"/>
<circle cx="256" cy="270" r="5" fill="#7A57F8"/>
</svg>

Before

Width:  |  Height:  |  Size: 684 B

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -21,6 +21,29 @@ type NavItem = {
children?: NavChildItem[];
};
function BrandLockup({ mobile = false }: { mobile?: boolean }) {
return (
<div className="flex min-w-0 items-center gap-2.5">
<img
src="/crm-favicon.svg"
alt="紫光汇智CRM 图标"
className={cn(
"shrink-0 rounded-2xl shadow-sm ring-1 ring-violet-200/60",
mobile ? "h-7 w-7 rounded-xl" : "h-9 w-9"
)}
/>
<span
className={cn(
"truncate bg-gradient-to-r from-violet-600 to-indigo-600 bg-clip-text font-bold text-transparent",
mobile ? "text-sm uppercase tracking-[0.12em]" : "text-lg"
)}
>
CRM
</span>
</div>
);
}
const navItems: NavItem[] = [
{ name: "首页", path: "/", icon: Home },
{ name: "拓展", path: "/expansion", icon: Users },
@ -123,9 +146,7 @@ export default function Layout() {
{/* Desktop Sidebar */}
<aside className="hidden w-64 flex-col border-r border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 md:flex transition-colors duration-300">
<div className="flex h-16 items-center justify-between border-b border-slate-200 dark:border-slate-800 px-6">
<span className="text-lg font-bold bg-gradient-to-r from-violet-600 to-indigo-600 bg-clip-text text-transparent">
CRM
</span>
<BrandLockup />
<button
onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
className="rounded-full p-2 text-slate-500 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-slate-800 transition-colors"
@ -166,9 +187,7 @@ export default function Layout() {
: "bg-white/90 backdrop-blur-xl transition-colors duration-300 dark:bg-slate-950/90",
)}>
<div className="min-w-0 flex-1 pr-2">
<p className="bg-gradient-to-r from-violet-600 to-indigo-600 bg-clip-text text-sm font-bold uppercase tracking-[0.14em] text-transparent">
CRM
</p>
<BrandLockup mobile />
</div>
<div className="flex shrink-0 items-center gap-2.5">
{shouldShowDailyReportReminder ? (

View File

@ -255,7 +255,7 @@ export default function LoginPage() {
<div className="login-panel-intro">
<div className="login-brand-lockup">
<div className="login-brand-mark">
{platformConfig?.logoUrl ? <img src={platformConfig.logoUrl} alt={appName} /> : <span></span>}
<img src="/crm-favicon.svg" alt={appName} />
</div>
<div>
<p className="login-brand-kicker"></p>

View File

@ -151,9 +151,10 @@
.login-panel-eyebrow {
color: #7c3aed !important;
font-size: 0.8rem;
font-size: clamp(1.4rem, 1.5vw, 1.75rem);
font-weight: 700;
letter-spacing: 0.18em;
line-height: 1.2;
letter-spacing: 0.04em;
text-transform: uppercase;
text-align: left;
}
@ -343,7 +344,7 @@
}
.login-panel-header p {
font-size: 0.92rem;
font-size: 1.25rem;
line-height: 1.6;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
import{d2 as c,bI as o}from"./index-CYM97J2V.js";const r=new o("antFadeIn",{"0%":{opacity:0},"100%":{opacity:1}}),s=new o("antFadeOut",{"0%":{opacity:1},"100%":{opacity:0}}),p=(t,a=!1)=>{const{antCls:e}=t,n=`${e}-fade`,i=a?"&":"";return[c(n,r,s,t.motionDurationMid,a),{[`
import{d2 as c,bI as o}from"./index-Dv-rJwbZ.js";const r=new o("antFadeIn",{"0%":{opacity:0},"100%":{opacity:1}}),s=new o("antFadeOut",{"0%":{opacity:1},"100%":{opacity:0}}),p=(t,a=!1)=>{const{antCls:e}=t,n=`${e}-fade`,i=a?"&":"";return[c(n,r,s,t.motionDurationMid,a),{[`
${i}${n}-enter,
${i}${n}-appear
`]:{opacity:0,animationTimingFunction:"linear"},[`${i}${n}-leave`]:{animationTimingFunction:"linear"}}]};export{p as i};

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
import{r as n,ak as ee,av as re,aq as ae,C as N,am as M,at as te,ah as G,bg as H,ce as T,ax as ne,x as le,y as L,z as q,dx as oe,ay as W,aG as se,aL as ie,F as ce,aB as A,dy as de,bE as ue,aJ as be,ai as F}from"./index-CYM97J2V.js";var fe=["prefixCls","className","style","checked","disabled","defaultChecked","type","title","onChange"],pe=n.forwardRef(function(e,r){var a=e.prefixCls,t=a===void 0?"rc-checkbox":a,c=e.className,C=e.style,h=e.checked,p=e.disabled,_=e.defaultChecked,O=_===void 0?!1:_,d=e.type,w=d===void 0?"checkbox":d,I=e.title,i=e.onChange,R=ee(e,fe),g=n.useRef(null),u=n.useRef(null),o=re(O,{value:h}),P=ae(o,2),E=P[0],x=P[1];n.useImperativeHandle(r,function(){return{focus:function(s){var f;(f=g.current)===null||f===void 0||f.focus(s)},blur:function(){var s;(s=g.current)===null||s===void 0||s.blur()},input:g.current,nativeElement:u.current}});var b=N(t,c,M(M({},"".concat(t,"-checked"),E),"".concat(t,"-disabled"),p)),v=function(s){p||("checked"in e||x(s.target.checked),i==null||i({target:G(G({},e),{},{type:w,checked:s.target.checked}),stopPropagation:function(){s.stopPropagation()},preventDefault:function(){s.preventDefault()},nativeEvent:s.nativeEvent}))};return n.createElement("span",{className:b,title:I,style:C,ref:u},n.createElement("input",te({},R,{className:"".concat(t,"-input"),ref:g,onChange:v,disabled:p,checked:!!E,type:w})),n.createElement("span",{className:"".concat(t,"-inner")}))});function ve(e){const r=H.useRef(null),a=()=>{T.cancel(r.current),r.current=null};return[()=>{a(),r.current=T(()=>{r.current=null})},C=>{r.current&&(C.stopPropagation(),a()),e==null||e(C)}]}const me=e=>{const{checkboxCls:r}=e,a=`${r}-wrapper`;return[{[`${r}-group`]:Object.assign(Object.assign({},L(e)),{display:"inline-flex",flexWrap:"wrap",columnGap:e.marginXS,[`> ${e.antCls}-row`]:{flex:1}}),[a]:Object.assign(Object.assign({},L(e)),{display:"inline-flex",alignItems:"baseline",cursor:"pointer","&:after":{display:"inline-block",width:0,overflow:"hidden",content:"'\\a0'"},[`& + ${a}`]:{marginInlineStart:0},[`&${a}-in-form-item`]:{'input[type="checkbox"]':{width:14,height:14}}}),[r]:Object.assign(Object.assign({},L(e)),{position:"relative",whiteSpace:"nowrap",lineHeight:1,cursor:"pointer",borderRadius:e.borderRadiusSM,alignSelf:"center",[`${r}-input`]:{position:"absolute",inset:0,zIndex:1,cursor:"pointer",opacity:0,margin:0,[`&:focus-visible + ${r}-inner`]:oe(e)},[`${r}-inner`]:{boxSizing:"border-box",display:"block",width:e.checkboxSize,height:e.checkboxSize,direction:"ltr",backgroundColor:e.colorBgContainer,border:`${q(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:e.borderRadiusSM,borderCollapse:"separate",transition:`all ${e.motionDurationSlow}`,"&:after":{boxSizing:"border-box",position:"absolute",top:"50%",insetInlineStart:"25%",display:"table",width:e.calc(e.checkboxSize).div(14).mul(5).equal(),height:e.calc(e.checkboxSize).div(14).mul(8).equal(),border:`${q(e.lineWidthBold)} solid ${e.colorWhite}`,borderTop:0,borderInlineStart:0,transform:"rotate(45deg) scale(0) translate(-50%,-50%)",opacity:0,content:'""',transition:`all ${e.motionDurationFast} ${e.motionEaseInBack}, opacity ${e.motionDurationFast}`}},"& + span":{paddingInlineStart:e.paddingXS,paddingInlineEnd:e.paddingXS}})},{[`
import{r as n,ak as ee,av as re,aq as ae,C as N,am as M,at as te,ah as G,bg as H,ce as T,ax as ne,x as le,y as L,z as q,dx as oe,ay as W,aG as se,aL as ie,F as ce,aB as A,dy as de,bE as ue,aJ as be,ai as F}from"./index-Dv-rJwbZ.js";var fe=["prefixCls","className","style","checked","disabled","defaultChecked","type","title","onChange"],pe=n.forwardRef(function(e,r){var a=e.prefixCls,t=a===void 0?"rc-checkbox":a,c=e.className,C=e.style,h=e.checked,p=e.disabled,_=e.defaultChecked,O=_===void 0?!1:_,d=e.type,w=d===void 0?"checkbox":d,I=e.title,i=e.onChange,R=ee(e,fe),g=n.useRef(null),u=n.useRef(null),o=re(O,{value:h}),P=ae(o,2),E=P[0],x=P[1];n.useImperativeHandle(r,function(){return{focus:function(s){var f;(f=g.current)===null||f===void 0||f.focus(s)},blur:function(){var s;(s=g.current)===null||s===void 0||s.blur()},input:g.current,nativeElement:u.current}});var b=N(t,c,M(M({},"".concat(t,"-checked"),E),"".concat(t,"-disabled"),p)),v=function(s){p||("checked"in e||x(s.target.checked),i==null||i({target:G(G({},e),{},{type:w,checked:s.target.checked}),stopPropagation:function(){s.stopPropagation()},preventDefault:function(){s.preventDefault()},nativeEvent:s.nativeEvent}))};return n.createElement("span",{className:b,title:I,style:C,ref:u},n.createElement("input",te({},R,{className:"".concat(t,"-input"),ref:g,onChange:v,disabled:p,checked:!!E,type:w})),n.createElement("span",{className:"".concat(t,"-inner")}))});function ve(e){const r=H.useRef(null),a=()=>{T.cancel(r.current),r.current=null};return[()=>{a(),r.current=T(()=>{r.current=null})},C=>{r.current&&(C.stopPropagation(),a()),e==null||e(C)}]}const me=e=>{const{checkboxCls:r}=e,a=`${r}-wrapper`;return[{[`${r}-group`]:Object.assign(Object.assign({},L(e)),{display:"inline-flex",flexWrap:"wrap",columnGap:e.marginXS,[`> ${e.antCls}-row`]:{flex:1}}),[a]:Object.assign(Object.assign({},L(e)),{display:"inline-flex",alignItems:"baseline",cursor:"pointer","&:after":{display:"inline-block",width:0,overflow:"hidden",content:"'\\a0'"},[`& + ${a}`]:{marginInlineStart:0},[`&${a}-in-form-item`]:{'input[type="checkbox"]':{width:14,height:14}}}),[r]:Object.assign(Object.assign({},L(e)),{position:"relative",whiteSpace:"nowrap",lineHeight:1,cursor:"pointer",borderRadius:e.borderRadiusSM,alignSelf:"center",[`${r}-input`]:{position:"absolute",inset:0,zIndex:1,cursor:"pointer",opacity:0,margin:0,[`&:focus-visible + ${r}-inner`]:oe(e)},[`${r}-inner`]:{boxSizing:"border-box",display:"block",width:e.checkboxSize,height:e.checkboxSize,direction:"ltr",backgroundColor:e.colorBgContainer,border:`${q(e.lineWidth)} ${e.lineType} ${e.colorBorder}`,borderRadius:e.borderRadiusSM,borderCollapse:"separate",transition:`all ${e.motionDurationSlow}`,"&:after":{boxSizing:"border-box",position:"absolute",top:"50%",insetInlineStart:"25%",display:"table",width:e.calc(e.checkboxSize).div(14).mul(5).equal(),height:e.calc(e.checkboxSize).div(14).mul(8).equal(),border:`${q(e.lineWidthBold)} solid ${e.colorWhite}`,borderTop:0,borderInlineStart:0,transform:"rotate(45deg) scale(0) translate(-50%,-50%)",opacity:0,content:'""',transition:`all ${e.motionDurationFast} ${e.motionEaseInBack}, opacity ${e.motionDurationFast}`}},"& + span":{paddingInlineStart:e.paddingXS,paddingInlineEnd:e.paddingXS}})},{[`
${a}:not(${a}-disabled),
${r}:not(${r}-disabled)
`]:{[`&:hover ${r}-inner`]:{borderColor:e.colorPrimary}},[`${a}:not(${a}-disabled)`]:{[`&:hover ${r}-checked:not(${r}-disabled) ${r}-inner`]:{backgroundColor:e.colorPrimaryHover,borderColor:"transparent"},[`&:hover ${r}-checked:not(${r}-disabled):after`]:{borderColor:e.colorPrimaryHover}}},{[`${r}-checked`]:{[`${r}-inner`]:{backgroundColor:e.colorPrimary,borderColor:e.colorPrimary,"&:after":{opacity:1,transform:"rotate(45deg) scale(1) translate(-50%,-50%)",transition:`all ${e.motionDurationMid} ${e.motionEaseOutBack} ${e.motionDurationFast}`}}},[`

View File

@ -1 +1 @@
import{x as F,r as s,H as $,ay as w,b$ as q,c0 as D,d7 as E,B as J,cQ as M,d8 as Q,C as S,A as U,av as Y,d9 as G,aJ as K}from"./index-CYM97J2V.js";import{A as Z}from"./useDict-BjF_A4fe.js";const ee=e=>{const{componentCls:n,iconCls:l,antCls:t,zIndexPopup:o,colorText:f,colorWarning:u,marginXXS:c,marginXS:i,fontSize:g,fontWeightStrong:v,colorTextHeading:y}=e;return{[n]:{zIndex:o,[`&${t}-popover`]:{fontSize:g},[`${n}-message`]:{marginBottom:i,display:"flex",flexWrap:"nowrap",alignItems:"start",[`> ${n}-message-icon ${l}`]:{color:u,fontSize:g,lineHeight:1,marginInlineEnd:i},[`${n}-title`]:{fontWeight:v,color:y,"&:only-child":{fontWeight:"normal"}},[`${n}-description`]:{marginTop:c,color:f}},[`${n}-buttons`]:{textAlign:"end",whiteSpace:"nowrap",button:{marginInlineStart:i}}}}},te=e=>{const{zIndexPopupBase:n}=e;return{zIndexPopup:n+60}},I=F("Popconfirm",e=>ee(e),te,{resetStyle:!1});var ne=function(e,n){var l={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.indexOf(t)<0&&(l[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,t=Object.getOwnPropertySymbols(e);o<t.length;o++)n.indexOf(t[o])<0&&Object.prototype.propertyIsEnumerable.call(e,t[o])&&(l[t[o]]=e[t[o]]);return l};const k=e=>{const{prefixCls:n,okButtonProps:l,cancelButtonProps:t,title:o,description:f,cancelText:u,okText:c,okType:i="primary",icon:g=s.createElement($,null),showCancel:v=!0,close:y,onConfirm:C,onCancel:O,onPopupClick:m}=e,{getPrefixCls:p}=s.useContext(w),[d]=q("Popconfirm",D.Popconfirm),b=E(o),x=E(f);return s.createElement("div",{className:`${n}-inner-content`,onClick:m},s.createElement("div",{className:`${n}-message`},g&&s.createElement("span",{className:`${n}-message-icon`},g),s.createElement("div",{className:`${n}-message-text`},b&&s.createElement("div",{className:`${n}-title`},b),x&&s.createElement("div",{className:`${n}-description`},x))),s.createElement("div",{className:`${n}-buttons`},v&&s.createElement(J,Object.assign({onClick:O,size:"small"},t),u||(d==null?void 0:d.cancelText)),s.createElement(Z,{buttonProps:Object.assign(Object.assign({size:"small"},M(i)),l),actionFn:C,close:y,prefixCls:p("btn"),quitOnNullishReturnValue:!0,emitEvent:!0},c||(d==null?void 0:d.okText))))},oe=e=>{const{prefixCls:n,placement:l,className:t,style:o}=e,f=ne(e,["prefixCls","placement","className","style"]),{getPrefixCls:u}=s.useContext(w),c=u("popconfirm",n),[i]=I(c);return i(s.createElement(Q,{placement:l,className:S(c,t),style:o,content:s.createElement(k,Object.assign({prefixCls:c},f))}))};var se=function(e,n){var l={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.indexOf(t)<0&&(l[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,t=Object.getOwnPropertySymbols(e);o<t.length;o++)n.indexOf(t[o])<0&&Object.prototype.propertyIsEnumerable.call(e,t[o])&&(l[t[o]]=e[t[o]]);return l};const le=s.forwardRef((e,n)=>{var l,t;const{prefixCls:o,placement:f="top",trigger:u="click",okType:c="primary",icon:i=s.createElement($,null),children:g,overlayClassName:v,onOpenChange:y,onVisibleChange:C,overlayStyle:O,styles:m,classNames:p}=e,d=se(e,["prefixCls","placement","trigger","okType","icon","children","overlayClassName","onOpenChange","onVisibleChange","overlayStyle","styles","classNames"]),{getPrefixCls:b,className:x,style:T,classNames:j,styles:h}=U("popconfirm"),[_,z]=Y(!1,{value:(l=e.open)!==null&&l!==void 0?l:e.visible,defaultValue:(t=e.defaultOpen)!==null&&t!==void 0?t:e.defaultVisible}),P=(a,r)=>{z(a,!0),C==null||C(a),y==null||y(a,r)},B=a=>{P(!1,a)},V=a=>{var r;return(r=e.onConfirm)===null||r===void 0?void 0:r.call(void 0,a)},W=a=>{var r;P(!1,a),(r=e.onCancel)===null||r===void 0||r.call(void 0,a)},A=(a,r)=>{const{disabled:X=!1}=e;X||P(a,r)},N=b("popconfirm",o),H=S(N,x,v,j.root,p==null?void 0:p.root),R=S(j.body,p==null?void 0:p.body),[L]=I(N);return L(s.createElement(G,Object.assign({},K(d,["title"]),{trigger:u,placement:f,onOpenChange:A,open:_,ref:n,classNames:{root:H,body:R},styles:{root:Object.assign(Object.assign(Object.assign(Object.assign({},h.root),T),O),m==null?void 0:m.root),body:Object.assign(Object.assign({},h.body),m==null?void 0:m.body)},content:s.createElement(k,Object.assign({okType:c,icon:i},e,{prefixCls:N,close:B,onConfirm:V,onCancel:W})),"data-popover-inject":!0}),g))}),ae=le;ae._InternalPanelDoNotUseOrYouWillBeFired=oe;export{ae as P};
import{x as F,r as s,H as $,ay as w,b$ as q,c0 as D,d7 as E,B as J,cQ as M,d8 as Q,C as S,A as U,av as Y,d9 as G,aJ as K}from"./index-Dv-rJwbZ.js";import{A as Z}from"./useDict-ClxJHHDi.js";const ee=e=>{const{componentCls:n,iconCls:l,antCls:t,zIndexPopup:o,colorText:f,colorWarning:u,marginXXS:c,marginXS:i,fontSize:g,fontWeightStrong:v,colorTextHeading:y}=e;return{[n]:{zIndex:o,[`&${t}-popover`]:{fontSize:g},[`${n}-message`]:{marginBottom:i,display:"flex",flexWrap:"nowrap",alignItems:"start",[`> ${n}-message-icon ${l}`]:{color:u,fontSize:g,lineHeight:1,marginInlineEnd:i},[`${n}-title`]:{fontWeight:v,color:y,"&:only-child":{fontWeight:"normal"}},[`${n}-description`]:{marginTop:c,color:f}},[`${n}-buttons`]:{textAlign:"end",whiteSpace:"nowrap",button:{marginInlineStart:i}}}}},te=e=>{const{zIndexPopupBase:n}=e;return{zIndexPopup:n+60}},I=F("Popconfirm",e=>ee(e),te,{resetStyle:!1});var ne=function(e,n){var l={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.indexOf(t)<0&&(l[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,t=Object.getOwnPropertySymbols(e);o<t.length;o++)n.indexOf(t[o])<0&&Object.prototype.propertyIsEnumerable.call(e,t[o])&&(l[t[o]]=e[t[o]]);return l};const k=e=>{const{prefixCls:n,okButtonProps:l,cancelButtonProps:t,title:o,description:f,cancelText:u,okText:c,okType:i="primary",icon:g=s.createElement($,null),showCancel:v=!0,close:y,onConfirm:C,onCancel:O,onPopupClick:m}=e,{getPrefixCls:p}=s.useContext(w),[d]=q("Popconfirm",D.Popconfirm),b=E(o),x=E(f);return s.createElement("div",{className:`${n}-inner-content`,onClick:m},s.createElement("div",{className:`${n}-message`},g&&s.createElement("span",{className:`${n}-message-icon`},g),s.createElement("div",{className:`${n}-message-text`},b&&s.createElement("div",{className:`${n}-title`},b),x&&s.createElement("div",{className:`${n}-description`},x))),s.createElement("div",{className:`${n}-buttons`},v&&s.createElement(J,Object.assign({onClick:O,size:"small"},t),u||(d==null?void 0:d.cancelText)),s.createElement(Z,{buttonProps:Object.assign(Object.assign({size:"small"},M(i)),l),actionFn:C,close:y,prefixCls:p("btn"),quitOnNullishReturnValue:!0,emitEvent:!0},c||(d==null?void 0:d.okText))))},oe=e=>{const{prefixCls:n,placement:l,className:t,style:o}=e,f=ne(e,["prefixCls","placement","className","style"]),{getPrefixCls:u}=s.useContext(w),c=u("popconfirm",n),[i]=I(c);return i(s.createElement(Q,{placement:l,className:S(c,t),style:o,content:s.createElement(k,Object.assign({prefixCls:c},f))}))};var se=function(e,n){var l={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&n.indexOf(t)<0&&(l[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,t=Object.getOwnPropertySymbols(e);o<t.length;o++)n.indexOf(t[o])<0&&Object.prototype.propertyIsEnumerable.call(e,t[o])&&(l[t[o]]=e[t[o]]);return l};const le=s.forwardRef((e,n)=>{var l,t;const{prefixCls:o,placement:f="top",trigger:u="click",okType:c="primary",icon:i=s.createElement($,null),children:g,overlayClassName:v,onOpenChange:y,onVisibleChange:C,overlayStyle:O,styles:m,classNames:p}=e,d=se(e,["prefixCls","placement","trigger","okType","icon","children","overlayClassName","onOpenChange","onVisibleChange","overlayStyle","styles","classNames"]),{getPrefixCls:b,className:x,style:T,classNames:j,styles:h}=U("popconfirm"),[_,z]=Y(!1,{value:(l=e.open)!==null&&l!==void 0?l:e.visible,defaultValue:(t=e.defaultOpen)!==null&&t!==void 0?t:e.defaultVisible}),P=(a,r)=>{z(a,!0),C==null||C(a),y==null||y(a,r)},B=a=>{P(!1,a)},V=a=>{var r;return(r=e.onConfirm)===null||r===void 0?void 0:r.call(void 0,a)},W=a=>{var r;P(!1,a),(r=e.onCancel)===null||r===void 0||r.call(void 0,a)},A=(a,r)=>{const{disabled:X=!1}=e;X||P(a,r)},N=b("popconfirm",o),H=S(N,x,v,j.root,p==null?void 0:p.root),R=S(j.body,p==null?void 0:p.body),[L]=I(N);return L(s.createElement(G,Object.assign({},K(d,["title"]),{trigger:u,placement:f,onOpenChange:A,open:_,ref:n,classNames:{root:H,body:R},styles:{root:Object.assign(Object.assign(Object.assign(Object.assign({},h.root),T),O),m==null?void 0:m.root),body:Object.assign(Object.assign({},h.body),m==null?void 0:m.body)},content:s.createElement(k,Object.assign({okType:c,icon:i},e,{prefixCls:N,close:B,onConfirm:V,onCancel:W})),"data-popover-inject":!0}),g))}),ae=le;ae._InternalPanelDoNotUseOrYouWillBeFired=oe;export{ae as P};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{u as W,r as t,j as e,B as M,W as Y,a3 as $,Y as c,R as v,T as F,a5 as K,b3 as P,aU as D,aT as G,aW as H,s as w,a_ as q}from"./index-CYM97J2V.js";import{P as A}from"./index-B7x062Ky.js";import{R as b,C as d}from"./row-DNGQ3hV2.js";import{C as N}from"./index-Bcf8yIZZ.js";import{I as J}from"./index-DV4zjsPW.js";import{F as O}from"./Table-CAs2vM8c.js";import{T as u}from"./index-DqftVe8j.js";import{C as S}from"./index-M0Ae7f04.js";import"./useForm-B5uILH8t.js";import"./Pagination-By0LqcoC.js";const{Text:U}=F;function oe(){const{t:a}=W(),[o,C]=t.useState([]),[h,I]=t.useState([]),[T,m]=t.useState(!1),[p,x]=t.useState(!1),[f,g]=t.useState(!1),[l,y]=t.useState(null),[j,i]=t.useState([]),[n,_]=t.useState(""),R=t.useMemo(()=>o.find(s=>s.userId===l)||null,[o,l]),k=async()=>{m(!0);try{const s=await D();C(s||[])}finally{m(!1)}},z=async()=>{x(!0);try{const s=await G();I(s||[])}finally{x(!1)}},E=async s=>{try{const r=await H(s);i(r||[])}catch{i([])}};t.useEffect(()=>{k(),z()},[]),t.useEffect(()=>{l?E(l):i([])},[l]);const L=t.useMemo(()=>{if(!n)return o;const s=n.toLowerCase();return o.filter(r=>r.username.toLowerCase().includes(s)||r.displayName.toLowerCase().includes(s))},[o,n]),B=async()=>{if(!l){w.warning(a("userRole.selectUser"));return}g(!0);try{await q(l,j),w.success(a("common.success"))}finally{g(!1)}};return e.jsxs("div",{className:"app-page",children:[e.jsx(A,{title:a("userRole.title"),subtitle:a("userRole.subtitle")}),e.jsx("div",{className:"app-page__page-actions",children:e.jsx(M,{type:"primary",icon:e.jsx(Y,{"aria-hidden":"true"}),onClick:B,loading:f,disabled:!l,children:a(f?"common.loading":"common.save")})}),e.jsxs(b,{gutter:24,className:"app-page__split",style:{height:"calc(100vh - 180px)"},children:[e.jsx(d,{xs:24,lg:12,style:{height:"100%"},children:e.jsxs(N,{title:e.jsxs(c,{children:[e.jsx(v,{"aria-hidden":"true"}),e.jsx("span",{children:a("userRole.userList")})]}),className:"app-page__panel-card full-height-card",children:[e.jsx("div",{className:"mb-4",children:e.jsx(J,{placeholder:a("userRole.searchUser"),prefix:e.jsx($,{"aria-hidden":"true",className:"text-gray-400"}),value:n,onChange:s=>_(s.target.value),allowClear:!0,"aria-label":a("userRole.searchUser")})}),e.jsx("div",{style:{height:"calc(100% - 60px)",overflowY:"auto"},children:e.jsx(O,{rowKey:"userId",size:"middle",loading:T,dataSource:L,rowSelection:{type:"radio",selectedRowKeys:l?[l]:[],onChange:s=>y(s[0])},onRow:s=>({onClick:()=>y(s.userId),className:"cursor-pointer"}),pagination:{pageSize:10,showTotal:s=>a("common.total",{total:s})},columns:[{title:a("users.userInfo"),key:"user",render:(s,r)=>e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{style:{fontWeight:500},className:"truncate",children:r.displayName}),e.jsxs("div",{style:{fontSize:12,color:"#8c8c8c"},className:"truncate",children:["@",r.username]})]})},{title:a("common.status"),dataIndex:"status",width:80,render:s=>s===1?e.jsx(u,{color:"green",className:"m-0",children:"Enabled"}):e.jsx(u,{className:"m-0",children:"Disabled"})}]})})]})}),e.jsx(d,{xs:24,lg:12,style:{height:"100%"},children:e.jsx(N,{title:e.jsxs(c,{children:[e.jsx(P,{"aria-hidden":"true"}),e.jsx("span",{children:a("userRole.grantRoles")})]}),className:"app-page__panel-card full-height-card",extra:R?e.jsxs(u,{color:"blue",children:[a("userRole.editing"),": ",R.displayName]}):null,children:l?e.jsxs("div",{style:{padding:"8px 0",height:"100%",overflowY:"auto"},children:[e.jsx(S.Group,{style:{width:"100%"},value:j,onChange:s=>i(s),disabled:p,children:e.jsx(b,{gutter:[16,16],children:h.map(s=>e.jsx(d,{span:12,children:e.jsx(S,{value:s.roleId,className:"w-full",children:e.jsxs(c,{direction:"vertical",size:0,children:[e.jsx("span",{style:{fontWeight:500},children:s.roleName}),e.jsx(U,{type:"secondary",style:{fontSize:12},className:"tabular-nums",children:s.roleCode})]})})},s.roleId))})}),!h.length&&!p&&e.jsx(K,{description:"No roles available"})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 bg-gray-50 rounded-lg border border-dashed border-gray-200",children:[e.jsx(v,{style:{fontSize:40,color:"#bfbfbf",marginBottom:16},"aria-hidden":"true"}),e.jsx(U,{type:"secondary",children:a("userRole.selectUser")})]})})})]})]})}export{oe as default};
import{u as W,r as t,j as e,B as M,W as Y,a3 as $,Y as c,R as v,T as F,a5 as K,b3 as P,aU as D,aT as G,aW as H,s as w,a_ as q}from"./index-Dv-rJwbZ.js";import{P as A}from"./index-D4i8Uis-.js";import{R as b,C as d}from"./row-NVxLItiq.js";import{C as N}from"./index-EoMRal4G.js";import{I as J}from"./index-DFGcC-dW.js";import{F as O}from"./Table-BD43FaLh.js";import{T as u}from"./index-BymHESMU.js";import{C as S}from"./index-58fJYkx8.js";import"./useForm-43P2UNGc.js";import"./Pagination-xbf267Yj.js";const{Text:U}=F;function oe(){const{t:a}=W(),[o,C]=t.useState([]),[h,I]=t.useState([]),[T,m]=t.useState(!1),[p,x]=t.useState(!1),[f,g]=t.useState(!1),[l,y]=t.useState(null),[j,i]=t.useState([]),[n,_]=t.useState(""),R=t.useMemo(()=>o.find(s=>s.userId===l)||null,[o,l]),k=async()=>{m(!0);try{const s=await D();C(s||[])}finally{m(!1)}},z=async()=>{x(!0);try{const s=await G();I(s||[])}finally{x(!1)}},E=async s=>{try{const r=await H(s);i(r||[])}catch{i([])}};t.useEffect(()=>{k(),z()},[]),t.useEffect(()=>{l?E(l):i([])},[l]);const L=t.useMemo(()=>{if(!n)return o;const s=n.toLowerCase();return o.filter(r=>r.username.toLowerCase().includes(s)||r.displayName.toLowerCase().includes(s))},[o,n]),B=async()=>{if(!l){w.warning(a("userRole.selectUser"));return}g(!0);try{await q(l,j),w.success(a("common.success"))}finally{g(!1)}};return e.jsxs("div",{className:"app-page",children:[e.jsx(A,{title:a("userRole.title"),subtitle:a("userRole.subtitle")}),e.jsx("div",{className:"app-page__page-actions",children:e.jsx(M,{type:"primary",icon:e.jsx(Y,{"aria-hidden":"true"}),onClick:B,loading:f,disabled:!l,children:a(f?"common.loading":"common.save")})}),e.jsxs(b,{gutter:24,className:"app-page__split",style:{height:"calc(100vh - 180px)"},children:[e.jsx(d,{xs:24,lg:12,style:{height:"100%"},children:e.jsxs(N,{title:e.jsxs(c,{children:[e.jsx(v,{"aria-hidden":"true"}),e.jsx("span",{children:a("userRole.userList")})]}),className:"app-page__panel-card full-height-card",children:[e.jsx("div",{className:"mb-4",children:e.jsx(J,{placeholder:a("userRole.searchUser"),prefix:e.jsx($,{"aria-hidden":"true",className:"text-gray-400"}),value:n,onChange:s=>_(s.target.value),allowClear:!0,"aria-label":a("userRole.searchUser")})}),e.jsx("div",{style:{height:"calc(100% - 60px)",overflowY:"auto"},children:e.jsx(O,{rowKey:"userId",size:"middle",loading:T,dataSource:L,rowSelection:{type:"radio",selectedRowKeys:l?[l]:[],onChange:s=>y(s[0])},onRow:s=>({onClick:()=>y(s.userId),className:"cursor-pointer"}),pagination:{pageSize:10,showTotal:s=>a("common.total",{total:s})},columns:[{title:a("users.userInfo"),key:"user",render:(s,r)=>e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{style:{fontWeight:500},className:"truncate",children:r.displayName}),e.jsxs("div",{style:{fontSize:12,color:"#8c8c8c"},className:"truncate",children:["@",r.username]})]})},{title:a("common.status"),dataIndex:"status",width:80,render:s=>s===1?e.jsx(u,{color:"green",className:"m-0",children:"Enabled"}):e.jsx(u,{className:"m-0",children:"Disabled"})}]})})]})}),e.jsx(d,{xs:24,lg:12,style:{height:"100%"},children:e.jsx(N,{title:e.jsxs(c,{children:[e.jsx(P,{"aria-hidden":"true"}),e.jsx("span",{children:a("userRole.grantRoles")})]}),className:"app-page__panel-card full-height-card",extra:R?e.jsxs(u,{color:"blue",children:[a("userRole.editing"),": ",R.displayName]}):null,children:l?e.jsxs("div",{style:{padding:"8px 0",height:"100%",overflowY:"auto"},children:[e.jsx(S.Group,{style:{width:"100%"},value:j,onChange:s=>i(s),disabled:p,children:e.jsx(b,{gutter:[16,16],children:h.map(s=>e.jsx(d,{span:12,children:e.jsx(S,{value:s.roleId,className:"w-full",children:e.jsxs(c,{direction:"vertical",size:0,children:[e.jsx("span",{style:{fontWeight:500},children:s.roleName}),e.jsx(U,{type:"secondary",style:{fontSize:12},className:"tabular-nums",children:s.roleCode})]})})},s.roleId))})}),!h.length&&!p&&e.jsx(K,{description:"No roles available"})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 bg-gray-50 rounded-lg border border-dashed border-gray-200",children:[e.jsx(v,{style:{fontSize:40,color:"#bfbfbf",marginBottom:16},"aria-hidden":"true"}),e.jsx(U,{type:"secondary",children:a("userRole.selectUser")})]})})})]})]})}export{oe as default};

View File

@ -0,0 +1 @@
import{u as I,r,f as v,s as x,j as e,T as S,R as k,a as C,b as T,B as j,c as P,g as R,d as B,l as E,e as U}from"./index-Dv-rJwbZ.js";import{F as l}from"./index-DmVlNV9v.js";import{I as m}from"./index-DFGcC-dW.js";import{C as z}from"./index-58fJYkx8.js";import"./useForm-43P2UNGc.js";import"./row-NVxLItiq.js";const{Text:L}=S;function V(){const{t:a}=I(),[i,f]=r.useState(null),[o,g]=r.useState(!0),[u,h]=r.useState(!1),[s,b]=r.useState(null),[y]=l.useForm(),c=r.useCallback(async()=>{if(!o)return;const t=await v();f(t)},[o]);r.useEffect(()=>{(async()=>{try{const[n,d]=await Promise.all([R("security.captcha.enabled","true"),B()]);b(d);const p=n!=="false";g(p),p&&await c()}catch{g(!0),await c()}})()},[c]),r.useEffect(()=>{new URLSearchParams(window.location.search).get("timeout")==="1"&&(x.warning(a("login.loginTimeout")),window.history.replaceState({},document.title,window.location.pathname))},[a]);const N=async t=>{h(!0);try{const n=await E({username:t.username,password:t.password,tenantCode:t.tenantCode,captchaId:o?i==null?void 0:i.captchaId:void 0,captchaCode:o?t.captchaCode:void 0});if(localStorage.setItem("accessToken",n.accessToken),localStorage.setItem("refreshToken",n.refreshToken),localStorage.setItem("username",t.username),n.availableTenants){localStorage.setItem("availableTenants",JSON.stringify(n.availableTenants));const d=JSON.parse(atob(n.accessToken.split(".")[1]));localStorage.setItem("activeTenantId",String(d.tenantId))}try{const d=await U();sessionStorage.setItem("userProfile",JSON.stringify(d))}catch{sessionStorage.removeItem("userProfile")}x.success(a("common.success")),window.location.href="/"}catch{o&&await c()}finally{h(!1)}},w=s!=null&&s.loginBgUrl?{backgroundImage:`url(${s.loginBgUrl})`,backgroundSize:"cover",backgroundPosition:"center",position:"relative"}:{};return e.jsxs("div",{className:"login-page",style:w,children:[e.jsx("div",{className:"login-page-backdrop"}),e.jsx("div",{className:"login-page-grid",children:e.jsx("section",{className:"login-panel",children:e.jsx("div",{className:"login-panel-card",children:e.jsxs("div",{className:"login-panel-layout",children:[e.jsx("div",{className:"login-left",children:e.jsxs("div",{className:"login-brand",children:[e.jsx("div",{className:"brand-logo-wrap",children:e.jsx("img",{src:(s==null?void 0:s.logoUrl)||"/logo.svg",alt:"Logo",className:"brand-logo-img"})}),e.jsxs("div",{className:"brand-copy",children:[e.jsx("p",{className:"brand-kicker",children:"智慧销售协同平台"}),e.jsx("span",{className:"brand-name",children:(s==null?void 0:s.projectName)||"UnisBase"})]})]})}),e.jsx("div",{className:"login-right",children:e.jsxs("div",{className:"login-container",children:[e.jsxs("div",{className:"login-header",children:[e.jsx("p",{className:"login-panel-eyebrow",children:a("login.welcome")}),e.jsx(L,{type:"secondary",children:a("login.subtitle")})]}),e.jsxs(l,{form:y,layout:"vertical",onFinish:N,className:"login-form",requiredMark:!1,autoComplete:"off",children:[e.jsx(l.Item,{name:"username",rules:[{required:!0,message:a("login.username")}],children:e.jsx(m,{size:"large",prefix:e.jsx(k,{className:"text-gray-400","aria-hidden":"true"}),placeholder:a("login.username"),autoComplete:"username",spellCheck:!1,"aria-label":a("login.username")})}),e.jsx(l.Item,{name:"password",rules:[{required:!0,message:a("login.password")}],children:e.jsx(m.Password,{size:"large",prefix:e.jsx(C,{className:"text-gray-400","aria-hidden":"true"}),placeholder:a("login.password"),autoComplete:"current-password","aria-label":a("login.password")})}),o?e.jsx(l.Item,{name:"captchaCode",rules:[{required:!0,message:a("login.captcha")}],children:e.jsxs("div",{className:"captcha-wrapper",children:[e.jsx(m,{size:"large",prefix:e.jsx(T,{className:"text-gray-400","aria-hidden":"true"}),placeholder:a("login.captcha"),maxLength:6,"aria-label":a("login.captcha")}),e.jsx(j,{className:"captcha-image-btn",onClick:()=>void c(),icon:i?null:e.jsx(P,{spin:!0}),"aria-label":"刷新验证码",children:i?e.jsx("img",{src:i.imageBase64,alt:"验证码"}):null})]})}):null,e.jsx("div",{className:"login-extra",children:e.jsx(l.Item,{name:"remember",valuePropName:"checked",noStyle:!0,children:e.jsx(z,{children:a("login.rememberMe")})})}),e.jsx(l.Item,{children:e.jsx(j,{type:"primary",htmlType:"submit",loading:u,block:!0,size:"large",className:"login-submit-btn",children:a(u?"login.loggingIn":"login.submit")})})]})]})})]})})})})]})}export{V as default};

View File

@ -1 +1 @@
import{j as e,m as N,n as I,u as R,T as $,o as c,p as k,B as l,q as w,t as T,v as C,w as M,R as S,S as _}from"./index-CYM97J2V.js";import{P as D}from"./index-B7x062Ky.js";import{T as o}from"./index-DqftVe8j.js";import{R as h,C as r}from"./row-DNGQ3hV2.js";import{C as p}from"./index-Bcf8yIZZ.js";import{F as E}from"./Table-CAs2vM8c.js";import"./useForm-B5uILH8t.js";import"./index-M0Ae7f04.js";import"./Pagination-By0LqcoC.js";function d({title:a,value:n,icon:i,color:s="blue",trend:t,suffix:u="",layout:f="column",gridColumn:m,className:b="",onClick:g,style:y={}}){const x={blue:"#1677ff",green:"#52c41a",orange:"#faad14",red:"#ff4d4f",purple:"#722ed1",gray:"#8c8c8c"}[s]||s,v={...m?{gridColumn:m}:{},...y};return e.jsxs("div",{className:`stat-card stat-card-${f} ${b}`,style:v,onClick:g,children:[e.jsxs("div",{className:"stat-card-header",children:[e.jsx("span",{className:"stat-card-title",children:a}),i&&e.jsx("span",{className:"stat-card-icon",style:{color:x},"aria-hidden":"true",children:i})]}),e.jsxs("div",{className:"stat-card-body",children:[e.jsxs("div",{className:"stat-card-value tabular-nums",style:{color:x},children:[n,u&&e.jsx("span",{className:"stat-card-suffix",children:u})]}),t&&e.jsxs("div",{className:`stat-card-trend ${t.direction==="up"?"trend-up":"trend-down"} tabular-nums`,"aria-label":`${t.direction==="up"?"Increase":"Decrease"} of ${t.value}%`,children:[t.direction==="up"?e.jsx(N,{"aria-hidden":"true"}):e.jsx(I,{"aria-hidden":"true"}),e.jsxs("span",{children:[Math.abs(t.value),"%"]})]})]})]})}const{Text:j}=$;function J(){const{t:a}=R(),n=[{key:"1",name:"Product Sync",time:"2024-02-10 14:00",duration:"45min",status:"processing"},{key:"2",name:"Tech Review",time:"2024-02-10 10:00",duration:"60min",status:"success"},{key:"3",name:"Daily Standup",time:"2024-02-10 09:00",duration:"15min",status:"success"},{key:"4",name:"Client Call",time:"2024-02-10 16:30",duration:"30min",status:"default"}],i=[{title:a("dashboard.meetingName"),dataIndex:"name",key:"name",render:s=>e.jsx(j,{strong:!0,children:s})},{title:a("dashboard.startTime"),dataIndex:"time",key:"time",className:"tabular-nums",render:s=>e.jsx(j,{type:"secondary",children:s})},{title:a("dashboard.duration"),dataIndex:"duration",key:"duration",width:100,className:"tabular-nums"},{title:a("common.status"),dataIndex:"status",key:"status",width:120,render:s=>s==="processing"?e.jsx(o,{icon:e.jsx(c,{spin:!0,"aria-hidden":"true"}),color:"processing",children:a("dashboardExt.processing")}):s==="success"?e.jsx(o,{icon:e.jsx(k,{"aria-hidden":"true"}),color:"success",children:a("dashboardExt.completed")}):e.jsx(o,{color:"default",children:a("dashboardExt.pending")})},{title:a("common.action"),key:"action",width:80,render:()=>e.jsx(l,{type:"link",size:"small",icon:e.jsx(w,{"aria-hidden":"true"}),"aria-label":a("dashboard.viewAll")})}];return e.jsxs("div",{className:"app-page dashboard-page",children:[e.jsx(D,{title:a("dashboard.title"),subtitle:a("dashboard.subtitle")}),e.jsx("div",{className:"app-page__page-actions",children:e.jsx(l,{icon:e.jsx(c,{"aria-hidden":"true"}),size:"small",children:a("common.refresh")})}),e.jsxs(h,{gutter:[24,24],children:[e.jsx(r,{xs:24,sm:12,lg:6,children:e.jsx(d,{title:a("dashboard.todayMeetings"),value:12,icon:e.jsx(T,{"aria-hidden":"true"}),color:"blue",trend:{value:8,direction:"up"}})}),e.jsx(r,{xs:24,sm:12,lg:6,children:e.jsx(d,{title:a("dashboard.activeDevices"),value:45,icon:e.jsx(C,{"aria-hidden":"true"}),color:"green",trend:{value:2,direction:"up"}})}),e.jsx(r,{xs:24,sm:12,lg:6,children:e.jsx(d,{title:a("dashboard.transcriptionDuration"),value:1280,suffix:"min",icon:e.jsx(M,{"aria-hidden":"true"}),color:"orange",trend:{value:5,direction:"down"}})}),e.jsx(r,{xs:24,sm:12,lg:6,children:e.jsx(d,{title:a("dashboard.totalUsers"),value:320,icon:e.jsx(S,{"aria-hidden":"true"}),color:"purple",trend:{value:12,direction:"up"}})})]}),e.jsxs(h,{gutter:[24,24],className:"mt-6",children:[e.jsx(r,{xs:24,xl:16,children:e.jsx(p,{title:a("dashboard.recentMeetings"),bordered:!1,className:"app-page__content-card",extra:e.jsx(l,{type:"link",size:"small",children:a("dashboard.viewAll")}),styles:{body:{padding:0}},children:e.jsx(E,{dataSource:n,columns:i,pagination:!1,size:"middle",className:"roles-table"})})}),e.jsx(r,{xs:24,xl:8,children:e.jsx(p,{title:a("dashboard.deviceLoad"),bordered:!1,className:"app-page__content-card",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-12",children:[e.jsx(_,{active:!0,paragraph:{rows:4}}),e.jsxs("div",{className:"mt-4 text-gray-400 flex items-center gap-2",children:[e.jsx(c,{spin:!0,"aria-hidden":"true"}),e.jsx("span",{children:a("dashboardExt.chartLoading")})]})]})})})]})]})}export{J as default};
import{j as e,m as N,n as I,u as R,T as $,o as c,p as k,B as l,q as w,t as T,v as C,w as M,R as S,S as _}from"./index-Dv-rJwbZ.js";import{P as D}from"./index-D4i8Uis-.js";import{T as o}from"./index-BymHESMU.js";import{R as h,C as r}from"./row-NVxLItiq.js";import{C as p}from"./index-EoMRal4G.js";import{F as E}from"./Table-BD43FaLh.js";import"./useForm-43P2UNGc.js";import"./index-58fJYkx8.js";import"./Pagination-xbf267Yj.js";function d({title:a,value:n,icon:i,color:s="blue",trend:t,suffix:u="",layout:f="column",gridColumn:m,className:b="",onClick:g,style:y={}}){const x={blue:"#1677ff",green:"#52c41a",orange:"#faad14",red:"#ff4d4f",purple:"#722ed1",gray:"#8c8c8c"}[s]||s,v={...m?{gridColumn:m}:{},...y};return e.jsxs("div",{className:`stat-card stat-card-${f} ${b}`,style:v,onClick:g,children:[e.jsxs("div",{className:"stat-card-header",children:[e.jsx("span",{className:"stat-card-title",children:a}),i&&e.jsx("span",{className:"stat-card-icon",style:{color:x},"aria-hidden":"true",children:i})]}),e.jsxs("div",{className:"stat-card-body",children:[e.jsxs("div",{className:"stat-card-value tabular-nums",style:{color:x},children:[n,u&&e.jsx("span",{className:"stat-card-suffix",children:u})]}),t&&e.jsxs("div",{className:`stat-card-trend ${t.direction==="up"?"trend-up":"trend-down"} tabular-nums`,"aria-label":`${t.direction==="up"?"Increase":"Decrease"} of ${t.value}%`,children:[t.direction==="up"?e.jsx(N,{"aria-hidden":"true"}):e.jsx(I,{"aria-hidden":"true"}),e.jsxs("span",{children:[Math.abs(t.value),"%"]})]})]})]})}const{Text:j}=$;function J(){const{t:a}=R(),n=[{key:"1",name:"Product Sync",time:"2024-02-10 14:00",duration:"45min",status:"processing"},{key:"2",name:"Tech Review",time:"2024-02-10 10:00",duration:"60min",status:"success"},{key:"3",name:"Daily Standup",time:"2024-02-10 09:00",duration:"15min",status:"success"},{key:"4",name:"Client Call",time:"2024-02-10 16:30",duration:"30min",status:"default"}],i=[{title:a("dashboard.meetingName"),dataIndex:"name",key:"name",render:s=>e.jsx(j,{strong:!0,children:s})},{title:a("dashboard.startTime"),dataIndex:"time",key:"time",className:"tabular-nums",render:s=>e.jsx(j,{type:"secondary",children:s})},{title:a("dashboard.duration"),dataIndex:"duration",key:"duration",width:100,className:"tabular-nums"},{title:a("common.status"),dataIndex:"status",key:"status",width:120,render:s=>s==="processing"?e.jsx(o,{icon:e.jsx(c,{spin:!0,"aria-hidden":"true"}),color:"processing",children:a("dashboardExt.processing")}):s==="success"?e.jsx(o,{icon:e.jsx(k,{"aria-hidden":"true"}),color:"success",children:a("dashboardExt.completed")}):e.jsx(o,{color:"default",children:a("dashboardExt.pending")})},{title:a("common.action"),key:"action",width:80,render:()=>e.jsx(l,{type:"link",size:"small",icon:e.jsx(w,{"aria-hidden":"true"}),"aria-label":a("dashboard.viewAll")})}];return e.jsxs("div",{className:"app-page dashboard-page",children:[e.jsx(D,{title:a("dashboard.title"),subtitle:a("dashboard.subtitle")}),e.jsx("div",{className:"app-page__page-actions",children:e.jsx(l,{icon:e.jsx(c,{"aria-hidden":"true"}),size:"small",children:a("common.refresh")})}),e.jsxs(h,{gutter:[24,24],children:[e.jsx(r,{xs:24,sm:12,lg:6,children:e.jsx(d,{title:a("dashboard.todayMeetings"),value:12,icon:e.jsx(T,{"aria-hidden":"true"}),color:"blue",trend:{value:8,direction:"up"}})}),e.jsx(r,{xs:24,sm:12,lg:6,children:e.jsx(d,{title:a("dashboard.activeDevices"),value:45,icon:e.jsx(C,{"aria-hidden":"true"}),color:"green",trend:{value:2,direction:"up"}})}),e.jsx(r,{xs:24,sm:12,lg:6,children:e.jsx(d,{title:a("dashboard.transcriptionDuration"),value:1280,suffix:"min",icon:e.jsx(M,{"aria-hidden":"true"}),color:"orange",trend:{value:5,direction:"down"}})}),e.jsx(r,{xs:24,sm:12,lg:6,children:e.jsx(d,{title:a("dashboard.totalUsers"),value:320,icon:e.jsx(S,{"aria-hidden":"true"}),color:"purple",trend:{value:12,direction:"up"}})})]}),e.jsxs(h,{gutter:[24,24],className:"mt-6",children:[e.jsx(r,{xs:24,xl:16,children:e.jsx(p,{title:a("dashboard.recentMeetings"),bordered:!1,className:"app-page__content-card",extra:e.jsx(l,{type:"link",size:"small",children:a("dashboard.viewAll")}),styles:{body:{padding:0}},children:e.jsx(E,{dataSource:n,columns:i,pagination:!1,size:"middle",className:"roles-table"})})}),e.jsx(r,{xs:24,xl:8,children:e.jsx(p,{title:a("dashboard.deviceLoad"),bordered:!1,className:"app-page__content-card",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-12",children:[e.jsx(_,{active:!0,paragraph:{rows:4}}),e.jsxs("div",{className:"mt-4 text-gray-400 flex items-center gap-2",children:[e.jsx(c,{spin:!0,"aria-hidden":"true"}),e.jsx("span",{children:a("dashboardExt.chartLoading")})]})]})})})]})]})}export{J as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{j as e,T as d}from"./index-CYM97J2V.js";const{Title:i,Text:n}=d,c=({title:r,subtitle:s,extra:a,className:l=""})=>e.jsxs("div",{className:`page-header flex justify-between items-end mb-6 ${l}`,children:[e.jsxs("div",{children:[e.jsx(i,{level:4,className:"mb-1",style:{margin:0},children:r}),s&&e.jsx(n,{type:"secondary",style:{display:"block"},children:s})]}),a&&e.jsx("div",{className:"page-header-extra",children:a})]});export{c as P};
import{j as e,T as d}from"./index-Dv-rJwbZ.js";const{Title:i,Text:n}=d,c=({title:r,subtitle:s,extra:a,className:l=""})=>e.jsxs("div",{className:`page-header flex justify-between items-end mb-6 ${l}`,children:[e.jsxs("div",{children:[e.jsx(i,{level:4,className:"mb-1",style:{margin:0},children:r}),s&&e.jsx(n,{type:"secondary",style:{display:"block"},children:s})]}),a&&e.jsx("div",{className:"page-header-extra",children:a})]});export{c as P};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{r as u,h as p,j as e,L as f,a as o,T as j,B as l,i as w,k as y,s as g}from"./index-CYM97J2V.js";import{F as s}from"./index-CacOxAQN.js";import{C as h}from"./index-Bcf8yIZZ.js";import{I as a}from"./index-DV4zjsPW.js";import"./useForm-B5uILH8t.js";import"./row-DNGQ3hV2.js";const{Title:P,Text:b}=j;function F(){const[d,t]=u.useState(!1),c=p(),[m]=s.useForm(),n=()=>{localStorage.clear(),sessionStorage.clear(),c("/login")},x=async r=>{t(!0);try{await y({oldPassword:r.oldPassword,newPassword:r.newPassword}),g.success("密码已更新,请重新登录"),n()}finally{t(!1)}};return e.jsx(f,{style:{minHeight:"100vh",background:"#f0f2f5",display:"flex",alignItems:"center",justifyContent:"center"},children:e.jsxs(h,{style:{width:420,borderRadius:8,boxShadow:"0 4px 12px rgba(0,0,0,0.1)"},children:[e.jsxs("div",{className:"text-center mb-6",children:[e.jsx(o,{style:{fontSize:40,color:"#1890ff"}}),e.jsx(P,{level:3,style:{marginTop:16},children:"首次登录请修改密码"}),e.jsx(b,{type:"secondary",children:"当前账号被要求更新初始密码,提交成功后会跳转到登录页。"})]}),e.jsxs(s,{form:m,layout:"vertical",onFinish:x,children:[e.jsx(s.Item,{label:"当前密码",name:"oldPassword",rules:[{required:!0,message:"请输入当前密码"}],children:e.jsx(a.Password,{prefix:e.jsx(o,{})})}),e.jsx(s.Item,{label:"新密码",name:"newPassword",rules:[{required:!0,min:6,message:"新密码至少 6 位"}],children:e.jsx(a.Password,{prefix:e.jsx(o,{})})}),e.jsx(s.Item,{label:"确认新密码",name:"confirmPassword",dependencies:["newPassword"],rules:[{required:!0,message:"请再次输入新密码"},({getFieldValue:r})=>({validator(T,i){return!i||r("newPassword")===i?Promise.resolve():Promise.reject(new Error("两次输入的新密码不一致"))}})],children:e.jsx(a.Password,{prefix:e.jsx(o,{})})}),e.jsx(l,{type:"primary",htmlType:"submit",block:!0,size:"large",loading:d,style:{marginTop:8},children:"提交并重新登录"}),e.jsx(l,{type:"link",block:!0,icon:e.jsx(w,{}),onClick:n,style:{marginTop:8},children:"退出登录"})]})]})})}export{F as default};
import{r as u,h as p,j as e,L as f,a as o,T as j,B as l,i as w,k as y,s as g}from"./index-Dv-rJwbZ.js";import{F as s}from"./index-DmVlNV9v.js";import{C as h}from"./index-EoMRal4G.js";import{I as a}from"./index-DFGcC-dW.js";import"./useForm-43P2UNGc.js";import"./row-NVxLItiq.js";const{Title:P,Text:b}=j;function F(){const[d,t]=u.useState(!1),c=p(),[m]=s.useForm(),n=()=>{localStorage.clear(),sessionStorage.clear(),c("/login")},x=async r=>{t(!0);try{await y({oldPassword:r.oldPassword,newPassword:r.newPassword}),g.success("密码已更新,请重新登录"),n()}finally{t(!1)}};return e.jsx(f,{style:{minHeight:"100vh",background:"#f0f2f5",display:"flex",alignItems:"center",justifyContent:"center"},children:e.jsxs(h,{style:{width:420,borderRadius:8,boxShadow:"0 4px 12px rgba(0,0,0,0.1)"},children:[e.jsxs("div",{className:"text-center mb-6",children:[e.jsx(o,{style:{fontSize:40,color:"#1890ff"}}),e.jsx(P,{level:3,style:{marginTop:16},children:"首次登录请修改密码"}),e.jsx(b,{type:"secondary",children:"当前账号被要求更新初始密码,提交成功后会跳转到登录页。"})]}),e.jsxs(s,{form:m,layout:"vertical",onFinish:x,children:[e.jsx(s.Item,{label:"当前密码",name:"oldPassword",rules:[{required:!0,message:"请输入当前密码"}],children:e.jsx(a.Password,{prefix:e.jsx(o,{})})}),e.jsx(s.Item,{label:"新密码",name:"newPassword",rules:[{required:!0,min:6,message:"新密码至少 6 位"}],children:e.jsx(a.Password,{prefix:e.jsx(o,{})})}),e.jsx(s.Item,{label:"确认新密码",name:"confirmPassword",dependencies:["newPassword"],rules:[{required:!0,message:"请再次输入新密码"},({getFieldValue:r})=>({validator(T,i){return!i||r("newPassword")===i?Promise.resolve():Promise.reject(new Error("两次输入的新密码不一致"))}})],children:e.jsx(a.Password,{prefix:e.jsx(o,{})})}),e.jsx(l,{type:"primary",htmlType:"submit",block:!0,size:"large",loading:d,style:{marginTop:8},children:"提交并重新登录"}),e.jsx(l,{type:"link",block:!0,icon:e.jsx(w,{}),onClick:n,style:{marginTop:8},children:"退出登录"})]})]})})}export{F as default};

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
import{r as o,x as Ae,da as we,bT as De,ax as We,y as Oe,z as oe,db as fe,aB as pe,bZ as $e,ai as D,E as Be,C as Q,b_ as Ke,aL as Xe,A as Ge,aK as Ye,dc as Qe,dd as Ue,cS as ke,de as Je,df as Fe,dg as U,dh as Ze,di as et,aj as tt,aG as le,ce as xe,dj as nt,F as rt,cY as ot,dk as ve,dl as at,cg as je,bK as lt,at as it,dm as st,b$ as ct,ab as mt,c0 as ut,bF as dt,I as ft,H as pt,K as gt,ch as bt,aJ as ht,dn as Pe,ay as Ne,dp as yt,dq as Ct,dr as $t,ds as xt,dt as vt,du as St,bh as Et,dv as It,dw as wt}from"./index-CYM97J2V.js";import{u as Me,a as Re,t as ue,b as Ot}from"./useForm-B5uILH8t.js";import{C as _e,R as Ft}from"./row-DNGQ3hV2.js";function jt(e){return e==null?null:typeof e=="object"&&!o.isValidElement(e)?e:{title:e}}function ie(e){const[t,n]=o.useState(e);return o.useEffect(()=>{const r=setTimeout(()=>{n(e)},e.length?0:10);return()=>{clearTimeout(r)}},[e]),t}const Pt=e=>{const{componentCls:t}=e,n=`${t}-show-help`,r=`${t}-show-help-item`;return{[n]:{transition:`opacity ${e.motionDurationFast} ${e.motionEaseInOut}`,"&-appear, &-enter":{opacity:0,"&-active":{opacity:1}},"&-leave":{opacity:1,"&-active":{opacity:0}},[r]:{overflow:"hidden",transition:`height ${e.motionDurationFast} ${e.motionEaseInOut},
import{r as o,x as Ae,da as we,bT as De,ax as We,y as Oe,z as oe,db as fe,aB as pe,bZ as $e,ai as D,E as Be,C as Q,b_ as Ke,aL as Xe,A as Ge,aK as Ye,dc as Qe,dd as Ue,cS as ke,de as Je,df as Fe,dg as U,dh as Ze,di as et,aj as tt,aG as le,ce as xe,dj as nt,F as rt,cY as ot,dk as ve,dl as at,cg as je,bK as lt,at as it,dm as st,b$ as ct,ab as mt,c0 as ut,bF as dt,I as ft,H as pt,K as gt,ch as bt,aJ as ht,dn as Pe,ay as Ne,dp as yt,dq as Ct,dr as $t,ds as xt,dt as vt,du as St,bh as Et,dv as It,dw as wt}from"./index-Dv-rJwbZ.js";import{u as Me,a as Re,t as ue,b as Ot}from"./useForm-43P2UNGc.js";import{C as _e,R as Ft}from"./row-NVxLItiq.js";function jt(e){return e==null?null:typeof e=="object"&&!o.isValidElement(e)?e:{title:e}}function ie(e){const[t,n]=o.useState(e);return o.useEffect(()=>{const r=setTimeout(()=>{n(e)},e.length?0:10);return()=>{clearTimeout(r)}},[e]),t}const Pt=e=>{const{componentCls:t}=e,n=`${t}-show-help`,r=`${t}-show-help-item`;return{[n]:{transition:`opacity ${e.motionDurationFast} ${e.motionEaseInOut}`,"&-appear, &-enter":{opacity:0,"&-active":{opacity:1}},"&-leave":{opacity:1,"&-active":{opacity:0}},[r]:{overflow:"hidden",transition:`height ${e.motionDurationFast} ${e.motionEaseInOut},
opacity ${e.motionDurationFast} ${e.motionEaseInOut},
transform ${e.motionDurationFast} ${e.motionEaseInOut} !important`,[`&${r}-appear, &${r}-enter`]:{transform:"translateY(-5px)",opacity:0,"&-active":{transform:"translateY(0)",opacity:1}},[`&${r}-leave-active`]:{transform:"translateY(-5px)"}}}}},Nt=e=>({legend:{display:"block",width:"100%",marginBottom:e.marginLG,padding:0,color:e.colorTextDescription,fontSize:e.fontSizeLG,lineHeight:"inherit",border:0,borderBottom:`${oe(e.lineWidth)} ${e.lineType} ${e.colorBorder}`},'input[type="search"]':{boxSizing:"border-box"},'input[type="radio"], input[type="checkbox"]':{lineHeight:"normal"},'input[type="file"]':{display:"block"},'input[type="range"]':{display:"block",width:"100%"},"select[multiple], select[size]":{height:"auto"},"input[type='file']:focus,\n input[type='radio']:focus,\n input[type='checkbox']:focus":{outline:0,boxShadow:`0 0 0 ${oe(e.controlOutlineWidth)} ${e.controlOutline}`},output:{display:"block",paddingTop:15,color:e.colorText,fontSize:e.fontSize,lineHeight:e.lineHeight}}),Se=(e,t)=>{const{formItemCls:n}=e;return{[n]:{[`${n}-label > label`]:{height:t},[`${n}-control-input`]:{minHeight:t}}}},Mt=e=>{const{componentCls:t}=e;return{[e.componentCls]:Object.assign(Object.assign(Object.assign({},Oe(e)),Nt(e)),{[`${t}-text`]:{display:"inline-block",paddingInlineEnd:e.paddingSM},"&-small":Object.assign({},Se(e,e.controlHeightSM)),"&-large":Object.assign({},Se(e,e.controlHeightLG))})}},Rt=e=>{const{formItemCls:t,iconCls:n,rootPrefixCls:r,antCls:a,labelRequiredMarkColor:i,labelColor:u,labelFontSize:s,labelHeight:f,labelColonMarginInlineStart:m,labelColonMarginInlineEnd:p,itemMarginBottom:d}=e;return{[t]:Object.assign(Object.assign({},Oe(e)),{marginBottom:d,verticalAlign:"top","&-with-help":{transition:"none"},[`&-hidden,
&-hidden${a}-row`]:{display:"none"},"&-has-warning":{[`${t}-split`]:{color:e.colorError}},"&-has-error":{[`${t}-split`]:{color:e.colorWarning}},[`${t}-label`]:{flexGrow:0,overflow:"hidden",whiteSpace:"nowrap",textAlign:"end",verticalAlign:"middle","&-left":{textAlign:"start"},"&-wrap":{overflow:"unset",lineHeight:e.lineHeight,whiteSpace:"unset","> label":{verticalAlign:"middle",textWrap:"balance"}},"> label":{position:"relative",display:"inline-flex",alignItems:"center",maxWidth:"100%",height:f,color:u,fontSize:s,[`> ${n}`]:{fontSize:e.fontSize,verticalAlign:"top"},[`&${t}-required`]:{"&::before":{display:"inline-block",marginInlineEnd:e.marginXXS,color:i,fontSize:e.fontSize,fontFamily:"SimSun, sans-serif",lineHeight:1,content:'"*"'},[`&${t}-required-mark-hidden, &${t}-required-mark-optional`]:{"&::before":{display:"none"}}},[`${t}-optional`]:{display:"inline-block",marginInlineStart:e.marginXXS,color:e.colorTextDescription,[`&${t}-required-mark-hidden`]:{display:"none"}},[`${t}-tooltip`]:{color:e.colorTextDescription,cursor:"help",writingMode:"horizontal-tb",marginInlineStart:e.marginXXS},"&::after":{content:'":"',position:"relative",marginBlock:0,marginInlineStart:m,marginInlineEnd:p},[`&${t}-no-colon::after`]:{content:'"\\a0"'}}},[`${t}-control`]:{"--ant-display":"flex",flexDirection:"column",flexGrow:1,[`&:first-child:not([class^="'${r}-col-'"]):not([class*="' ${r}-col-'"])`]:{width:"100%"},"&-input":{position:"relative",display:"flex",alignItems:"center",minHeight:e.controlHeight,"&-content":{flex:"auto",maxWidth:"100%",[`&:has(> ${a}-switch:only-child, > ${a}-rate:only-child)`]:{display:"flex",alignItems:"center"}}}},[t]:{"&-additional":{display:"flex",flexDirection:"column"},"&-explain, &-extra":{clear:"both",color:e.colorTextDescription,fontSize:e.fontSize,lineHeight:e.lineHeight},"&-explain-connected":{width:"100%"},"&-extra":{minHeight:e.controlHeightSM,transition:`color ${e.motionDurationMid} ${e.motionEaseOut}`},"&-explain":{"&-error":{color:e.colorError},"&-warning":{color:e.colorWarning}}},[`&-with-help ${t}-explain`]:{height:"auto",opacity:1},[`${t}-feedback-icon`]:{fontSize:e.fontSize,textAlign:"center",visibility:"visible",animationName:we,animationDuration:e.motionDurationMid,animationTimingFunction:e.motionEaseOutBack,pointerEvents:"none","&-success":{color:e.colorSuccess},"&-error":{color:e.colorError},"&-warning":{color:e.colorWarning},"&-validating":{color:e.colorPrimary}}})}},re=e=>({padding:e.verticalLabelPadding,margin:e.verticalLabelMargin,whiteSpace:"initial",textAlign:"start","> label":{margin:0,"&::after":{visibility:"hidden"}}}),_t=e=>{const{antCls:t,formItemCls:n}=e;return{[`${n}-horizontal`]:{[`${n}-label`]:{flexGrow:0},[`${n}-control`]:{flex:"1 1 0",minWidth:0},[`${n}-label[class$='-24'], ${n}-label[class*='-24 ']`]:{[`& + ${n}-control`]:{minWidth:"unset"}},[`${t}-col-24${n}-label,

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
.login-page{min-height:100vh;display:flex;background:#fff}.login-left{flex:1.1;background:linear-gradient(140deg,#f0f5ff,#eef5ff 40%,#f7fbff);padding:56px 64px;display:flex;flex-direction:column;justify-content:space-between;position:relative;overflow:hidden}.login-brand{display:flex;align-items:center;gap:10px;z-index:1}.brand-logo-img{width:34px;height:34px;filter:drop-shadow(0 8px 16px rgba(45,107,255,.24))}.brand-name{font-size:20px;font-weight:600;color:#2f3a4f;letter-spacing:-.2px}.login-hero{margin-top:-40px;z-index:1}.hero-title{font-size:42px;font-weight:700;line-height:1.2;color:#1d2b3a;margin-bottom:24px;letter-spacing:-.5px;text-wrap:balance}.hero-accent{color:#1677ff;position:relative}.hero-desc{font-size:16px;line-height:1.8;color:#687489;max-width:440px}.login-left-footer{display:flex;align-items:center;gap:12px;color:#8c97a8;font-size:13px;z-index:1}.footer-divider{width:4px;height:4px;background:#c4ccd7;border-radius:50%}.login-right{flex:1;display:flex;align-items:center;justify-content:center;padding:40px;background:#fff}.login-container{width:100%;max-width:400px}.login-header{margin-bottom:40px}.login-header h2{font-size:28px!important;font-weight:700!important;color:#1f2a37!important;margin-bottom:8px!important;letter-spacing:-.5px}.login-header span{font-size:15px;color:#6b7280}.login-form .ant-form-item{margin-bottom:20px}.login-form .ant-input-affix-wrapper-lg{padding:10px 16px;border-radius:8px}.captcha-wrapper{display:flex;gap:12px}.captcha-image-btn{padding:0;width:120px;height:46px;flex-shrink:0;border-radius:8px;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#f9fafb}.captcha-image-btn img{width:100%;height:100%;object-fit:cover;transition:opacity .2s}.captcha-image-btn:hover img{opacity:.8}.login-extra{display:flex;justify-content:space-between;align-items:center;margin-top:-4px;margin-bottom:24px}.forgot-password{font-size:14px;color:#1677ff}.login-submit-btn{height:48px;font-size:16px;font-weight:600;border-radius:8px}.login-footer{margin-top:32px;text-align:center;padding:16px;background:#f9fafb;border-radius:12px}.tabular-nums{font-variant-numeric:tabular-nums}@media (max-width: 1024px){.login-left{padding:48px}.hero-title{font-size:36px}}@media (max-width: 900px){.login-left{display:none}.login-right{background:#f3f4f6}.login-container{background:#fff;padding:48px 32px;border-radius:20px;box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a}}@media (max-width: 480px){.login-right{padding:20px}.login-container{padding:32px 20px}}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{bm as t}from"./index-CYM97J2V.js";async function n(a){return(await t.get("/sys/api/orgs",{params:{tenantId:a}})).data.data}async function p(a){return(await t.post("/sys/api/orgs",a)).data.data}async function o(a,s){return(await t.put(`/sys/api/orgs/${a}`,s)).data.data}async function c(a){return(await t.delete(`/sys/api/orgs/${a}`)).data.data}export{p as c,c as d,n as l,o as u};
import{bm as t}from"./index-Dv-rJwbZ.js";async function n(a){return(await t.get("/sys/api/orgs",{params:{tenantId:a}})).data.data}async function p(a){return(await t.post("/sys/api/orgs",a)).data.data}async function o(a,s){return(await t.put(`/sys/api/orgs/${a}`,s)).data.data}async function c(a){return(await t.delete(`/sys/api/orgs/${a}`)).data.data}export{p as c,c as d,n as l,o as u};

View File

@ -1 +1 @@
import{cH as r}from"./index-CYM97J2V.js";const s=(t,o,a,e)=>({total:t,current:o,pageSize:a,onChange:e,showSizeChanger:!0,showQuickJumper:!0,showTotal:n=>r.t("common.total",{total:n}),pageSizeOptions:["10","20","50","100"]});export{s as g};
import{cH as r}from"./index-Dv-rJwbZ.js";const s=(t,o,a,e)=>({total:t,current:o,pageSize:a,onChange:e,showSizeChanger:!0,showQuickJumper:!0,showTotal:n=>r.t("common.total",{total:n}),pageSizeOptions:["10","20","50","100"]});export{s as g};

View File

@ -1 +1 @@
import{r as f,ay as k,C as A,bk as S,bj as I}from"./index-CYM97J2V.js";import{c as _,d as J}from"./useForm-B5uILH8t.js";const G=f.createContext({});var M=function(e,l){var n={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&l.indexOf(t)<0&&(n[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,t=Object.getOwnPropertySymbols(e);r<t.length;r++)l.indexOf(t[r])<0&&Object.prototype.propertyIsEnumerable.call(e,t[r])&&(n[t[r]]=e[t[r]]);return n};function R(e){return e==="auto"?"1 1 auto":typeof e=="number"?`${e} ${e} auto`:/^\d+(\.\d+)?(px|em|rem|%)$/.test(e)?`0 0 ${e}`:e}const z=["xs","sm","md","lg","xl","xxl"],H=f.forwardRef((e,l)=>{const{getPrefixCls:n,direction:t}=f.useContext(k),{gutter:r,wrap:c}=f.useContext(G),{prefixCls:p,span:i,order:g,offset:m,push:h,pull:O,className:E,children:b,flex:x,style:C}=e,d=M(e,["prefixCls","span","order","offset","push","pull","className","children","flex","style"]),o=n("col",p),[N,P,y]=_(o),j={};let $={};z.forEach(a=>{let s={};const v=e[a];typeof v=="number"?s.span=v:typeof v=="object"&&(s=v||{}),delete d[a],$=Object.assign(Object.assign({},$),{[`${o}-${a}-${s.span}`]:s.span!==void 0,[`${o}-${a}-order-${s.order}`]:s.order||s.order===0,[`${o}-${a}-offset-${s.offset}`]:s.offset||s.offset===0,[`${o}-${a}-push-${s.push}`]:s.push||s.push===0,[`${o}-${a}-pull-${s.pull}`]:s.pull||s.pull===0,[`${o}-rtl`]:t==="rtl"}),s.flex&&($[`${o}-${a}-flex`]=!0,j[`--${o}-${a}-flex`]=R(s.flex))});const w=A(o,{[`${o}-${i}`]:i!==void 0,[`${o}-order-${g}`]:g,[`${o}-offset-${m}`]:m,[`${o}-push-${h}`]:h,[`${o}-pull-${O}`]:O},E,$,P,y),u={};if(r!=null&&r[0]){const a=typeof r[0]=="number"?`${r[0]/2}px`:`calc(${r[0]} / 2)`;u.paddingLeft=a,u.paddingRight=a}return x&&(u.flex=R(x),c===!1&&!u.minWidth&&(u.minWidth=0)),N(f.createElement("div",Object.assign({},d,{style:Object.assign(Object.assign(Object.assign({},u),C),j),className:w,ref:l}),b))});function B(e,l){const n=[void 0,void 0],t=Array.isArray(e)?e:[e,void 0],r=l||{xs:!0,sm:!0,md:!0,lg:!0,xl:!0,xxl:!0};return t.forEach((c,p)=>{if(typeof c=="object"&&c!==null)for(let i=0;i<S.length;i++){const g=S[i];if(r[g]&&c[g]!==void 0){n[p]=c[g];break}}else n[p]=c}),n}var L=function(e,l){var n={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&l.indexOf(t)<0&&(n[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,t=Object.getOwnPropertySymbols(e);r<t.length;r++)l.indexOf(t[r])<0&&Object.prototype.propertyIsEnumerable.call(e,t[r])&&(n[t[r]]=e[t[r]]);return n};function V(e,l){const[n,t]=f.useState(typeof e=="string"?e:""),r=()=>{if(typeof e=="string"&&t(e),typeof e=="object")for(let c=0;c<S.length;c++){const p=S[c];if(!l||!l[p])continue;const i=e[p];if(i!==void 0){t(i);return}}};return f.useEffect(()=>{r()},[JSON.stringify(e),l]),n}const q=f.forwardRef((e,l)=>{const{prefixCls:n,justify:t,align:r,className:c,style:p,children:i,gutter:g=0,wrap:m}=e,h=L(e,["prefixCls","justify","align","className","style","children","gutter","wrap"]),{getPrefixCls:O,direction:E}=f.useContext(k),b=I(!0,null),x=V(r,b),C=V(t,b),d=O("row",n),[o,N,P]=J(d),y=B(g,b),j=A(d,{[`${d}-no-wrap`]:m===!1,[`${d}-${C}`]:C,[`${d}-${x}`]:x,[`${d}-rtl`]:E==="rtl"},c,N,P),$={};if(y!=null&&y[0]){const s=typeof y[0]=="number"?`${y[0]/-2}px`:`calc(${y[0]} / -2)`;$.marginLeft=s,$.marginRight=s}const[w,u]=y;$.rowGap=u;const a=f.useMemo(()=>({gutter:[w,u],wrap:m}),[w,u,m]);return o(f.createElement(G.Provider,{value:a},f.createElement("div",Object.assign({},h,{className:j,style:Object.assign(Object.assign({},$),p),ref:l}),i)))});export{H as C,q as R};
import{r as f,ay as k,C as A,bk as S,bj as I}from"./index-Dv-rJwbZ.js";import{c as _,d as J}from"./useForm-43P2UNGc.js";const G=f.createContext({});var M=function(e,l){var n={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&l.indexOf(t)<0&&(n[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,t=Object.getOwnPropertySymbols(e);r<t.length;r++)l.indexOf(t[r])<0&&Object.prototype.propertyIsEnumerable.call(e,t[r])&&(n[t[r]]=e[t[r]]);return n};function R(e){return e==="auto"?"1 1 auto":typeof e=="number"?`${e} ${e} auto`:/^\d+(\.\d+)?(px|em|rem|%)$/.test(e)?`0 0 ${e}`:e}const z=["xs","sm","md","lg","xl","xxl"],H=f.forwardRef((e,l)=>{const{getPrefixCls:n,direction:t}=f.useContext(k),{gutter:r,wrap:c}=f.useContext(G),{prefixCls:p,span:i,order:g,offset:m,push:h,pull:O,className:E,children:b,flex:x,style:C}=e,d=M(e,["prefixCls","span","order","offset","push","pull","className","children","flex","style"]),o=n("col",p),[N,P,y]=_(o),j={};let $={};z.forEach(a=>{let s={};const v=e[a];typeof v=="number"?s.span=v:typeof v=="object"&&(s=v||{}),delete d[a],$=Object.assign(Object.assign({},$),{[`${o}-${a}-${s.span}`]:s.span!==void 0,[`${o}-${a}-order-${s.order}`]:s.order||s.order===0,[`${o}-${a}-offset-${s.offset}`]:s.offset||s.offset===0,[`${o}-${a}-push-${s.push}`]:s.push||s.push===0,[`${o}-${a}-pull-${s.pull}`]:s.pull||s.pull===0,[`${o}-rtl`]:t==="rtl"}),s.flex&&($[`${o}-${a}-flex`]=!0,j[`--${o}-${a}-flex`]=R(s.flex))});const w=A(o,{[`${o}-${i}`]:i!==void 0,[`${o}-order-${g}`]:g,[`${o}-offset-${m}`]:m,[`${o}-push-${h}`]:h,[`${o}-pull-${O}`]:O},E,$,P,y),u={};if(r!=null&&r[0]){const a=typeof r[0]=="number"?`${r[0]/2}px`:`calc(${r[0]} / 2)`;u.paddingLeft=a,u.paddingRight=a}return x&&(u.flex=R(x),c===!1&&!u.minWidth&&(u.minWidth=0)),N(f.createElement("div",Object.assign({},d,{style:Object.assign(Object.assign(Object.assign({},u),C),j),className:w,ref:l}),b))});function B(e,l){const n=[void 0,void 0],t=Array.isArray(e)?e:[e,void 0],r=l||{xs:!0,sm:!0,md:!0,lg:!0,xl:!0,xxl:!0};return t.forEach((c,p)=>{if(typeof c=="object"&&c!==null)for(let i=0;i<S.length;i++){const g=S[i];if(r[g]&&c[g]!==void 0){n[p]=c[g];break}}else n[p]=c}),n}var L=function(e,l){var n={};for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&l.indexOf(t)<0&&(n[t]=e[t]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,t=Object.getOwnPropertySymbols(e);r<t.length;r++)l.indexOf(t[r])<0&&Object.prototype.propertyIsEnumerable.call(e,t[r])&&(n[t[r]]=e[t[r]]);return n};function V(e,l){const[n,t]=f.useState(typeof e=="string"?e:""),r=()=>{if(typeof e=="string"&&t(e),typeof e=="object")for(let c=0;c<S.length;c++){const p=S[c];if(!l||!l[p])continue;const i=e[p];if(i!==void 0){t(i);return}}};return f.useEffect(()=>{r()},[JSON.stringify(e),l]),n}const q=f.forwardRef((e,l)=>{const{prefixCls:n,justify:t,align:r,className:c,style:p,children:i,gutter:g=0,wrap:m}=e,h=L(e,["prefixCls","justify","align","className","style","children","gutter","wrap"]),{getPrefixCls:O,direction:E}=f.useContext(k),b=I(!0,null),x=V(r,b),C=V(t,b),d=O("row",n),[o,N,P]=J(d),y=B(g,b),j=A(d,{[`${d}-no-wrap`]:m===!1,[`${d}-${C}`]:C,[`${d}-${x}`]:x,[`${d}-rtl`]:E==="rtl"},c,N,P),$={};if(y!=null&&y[0]){const s=typeof y[0]=="number"?`${y[0]/-2}px`:`calc(${y[0]} / -2)`;$.marginLeft=s,$.marginRight=s}const[w,u]=y;$.rowGap=u;const a=f.useMemo(()=>({gutter:[w,u],wrap:m}),[w,u,m]);return o(f.createElement(G.Provider,{value:a},f.createElement("div",Object.assign({},h,{className:j,style:Object.assign(Object.assign({},$),p),ref:l}),i)))});export{H as C,q as R};

View File

@ -1 +1 @@
import{bm as n}from"./index-CYM97J2V.js";async function r(t){return(await n.get("/sys/api/tenants",{params:t})).data.data}async function p(t){return(await n.post("/sys/api/tenants",t)).data.data}async function c(t,a){return(await n.put(`/sys/api/tenants/${t}`,a)).data.data}async function i(t){return(await n.delete(`/sys/api/tenants/${t}`)).data.data}export{p as c,i as d,r as l,c as u};
import{bm as n}from"./index-Dv-rJwbZ.js";async function r(t){return(await n.get("/sys/api/tenants",{params:t})).data.data}async function p(t){return(await n.post("/sys/api/tenants",t)).data.data}async function c(t,a){return(await n.put(`/sys/api/tenants/${t}`,a)).data.data}async function i(t){return(await n.delete(`/sys/api/tenants/${t}`)).data.data}export{p as c,i as d,r as l,c as u};

View File

@ -1 +1 @@
import{r as i,ds as S,B as $,cQ as E,bm as n}from"./index-CYM97J2V.js";const g=t=>typeof(t==null?void 0:t.then)=="function",x=t=>{const{type:e,children:c,prefixCls:y,buttonProps:d,close:r,autoFocus:m,emitEvent:o,isSilent:v,quitOnNullishReturnValue:D,actionFn:l}=t,u=i.useRef(!1),w=i.useRef(null),[I,h]=S(!1),p=(...a)=>{r==null||r.apply(void 0,a)};i.useEffect(()=>{let a=null;return m&&(a=setTimeout(()=>{var s;(s=w.current)===null||s===void 0||s.focus({preventScroll:!0})})),()=>{a&&clearTimeout(a)}},[m]);const T=a=>{g(a)&&(h(!0),a.then((...s)=>{h(!1,!0),p.apply(void 0,s),u.current=!1},s=>{if(h(!1,!0),u.current=!1,!(v!=null&&v()))return Promise.reject(s)}))},b=a=>{if(u.current)return;if(u.current=!0,!l){p();return}let s;if(o){if(s=l(a),D&&!g(s)){u.current=!1,p(a);return}}else if(l.length)s=l(r),u.current=!1;else if(s=l(),!g(s)){p();return}T(s)};return i.createElement($,Object.assign({},E(e),{onClick:b,loading:I,prefixCls:y},d,{ref:w}),c)};async function B(t){return(await n.get("/sys/api/dict-types",{params:t})).data.data}async function O(t){return(await n.post("/sys/api/dict-types",t)).data.data}async function P(t,e){return(await n.put(`/sys/api/dict-types/${t}`,e)).data.data}async function F(t){return(await n.delete(`/sys/api/dict-types/${t}`)).data.data}async function L(t){return(await n.get("/sys/api/dict-items",{params:{typeCode:t}})).data.data}async function j(t){return(await n.post("/sys/api/dict-items",t)).data.data}async function A(t,e){return(await n.put(`/sys/api/dict-items/${t}`,e)).data.data}async function q(t){return(await n.delete(`/sys/api/dict-items/${t}`)).data.data}async function R(t){return(await n.get(`/sys/api/dict-items/type/${t}`)).data.data}const f={};function M(t){const[e,c]=i.useState(f[t]||[]),[y,d]=i.useState(!f[t]);return i.useEffect(()=>{if(f[t]){c(f[t]),d(!1);return}let r=!0;return(async()=>{try{const o=await R(t);r&&(f[t]=o,c(o))}catch(o){console.error(`Failed to fetch dictionary ${t}:`,o)}finally{r&&d(!1)}})(),()=>{r=!1}},[t]),{items:e,loading:y}}export{x as A,L as a,P as b,O as c,F as d,q as e,B as f,A as g,j as h,M as u};
import{r as i,ds as S,B as $,cQ as E,bm as n}from"./index-Dv-rJwbZ.js";const g=t=>typeof(t==null?void 0:t.then)=="function",x=t=>{const{type:e,children:c,prefixCls:y,buttonProps:d,close:r,autoFocus:m,emitEvent:o,isSilent:v,quitOnNullishReturnValue:D,actionFn:l}=t,u=i.useRef(!1),w=i.useRef(null),[I,h]=S(!1),p=(...a)=>{r==null||r.apply(void 0,a)};i.useEffect(()=>{let a=null;return m&&(a=setTimeout(()=>{var s;(s=w.current)===null||s===void 0||s.focus({preventScroll:!0})})),()=>{a&&clearTimeout(a)}},[m]);const T=a=>{g(a)&&(h(!0),a.then((...s)=>{h(!1,!0),p.apply(void 0,s),u.current=!1},s=>{if(h(!1,!0),u.current=!1,!(v!=null&&v()))return Promise.reject(s)}))},b=a=>{if(u.current)return;if(u.current=!0,!l){p();return}let s;if(o){if(s=l(a),D&&!g(s)){u.current=!1,p(a);return}}else if(l.length)s=l(r),u.current=!1;else if(s=l(),!g(s)){p();return}T(s)};return i.createElement($,Object.assign({},E(e),{onClick:b,loading:I,prefixCls:y},d,{ref:w}),c)};async function B(t){return(await n.get("/sys/api/dict-types",{params:t})).data.data}async function O(t){return(await n.post("/sys/api/dict-types",t)).data.data}async function P(t,e){return(await n.put(`/sys/api/dict-types/${t}`,e)).data.data}async function F(t){return(await n.delete(`/sys/api/dict-types/${t}`)).data.data}async function L(t){return(await n.get("/sys/api/dict-items",{params:{typeCode:t}})).data.data}async function j(t){return(await n.post("/sys/api/dict-items",t)).data.data}async function A(t,e){return(await n.put(`/sys/api/dict-items/${t}`,e)).data.data}async function q(t){return(await n.delete(`/sys/api/dict-items/${t}`)).data.data}async function R(t){return(await n.get(`/sys/api/dict-items/type/${t}`)).data.data}const f={};function M(t){const[e,c]=i.useState(f[t]||[]),[y,d]=i.useState(!f[t]);return i.useEffect(()=>{if(f[t]){c(f[t]),d(!1);return}let r=!0;return(async()=>{try{const o=await R(t);r&&(f[t]=o,c(o))}catch(o){console.error(`Failed to fetch dictionary ${t}:`,o)}finally{r&&d(!1)}})(),()=>{r=!1}},[t]),{items:e,loading:y}}export{x as A,L as a,P as b,O as c,F as d,q as e,B as f,A as g,j as h,M as u};

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,7 @@
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>UnisBase - 智能会议系统</title>
<script type="module" crossorigin src="/assets/index-CYM97J2V.js"></script>
<script type="module" crossorigin src="/assets/index-Dv-rJwbZ.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CaWPk49l.css">
</head>
<body>

View File

@ -1,216 +1,368 @@
.login-page {
position: relative;
min-height: 100vh;
display: flex;
background: #ffffff;
min-height: 100dvh;
overflow-x: hidden;
overflow-y: auto;
background:
radial-gradient(circle at top left, rgba(139, 92, 246, 0.12), transparent 34%),
radial-gradient(circle at bottom right, rgba(59, 130, 246, 0.08), transparent 30%),
linear-gradient(180deg, #f8fafc 0%, #eef2ff 52%, #f8fafc 100%);
background-size: cover;
background-position: center;
color: #334155;
}
/* Left Hero Section */
.login-left {
flex: 1.1;
background: linear-gradient(140deg, #f0f5ff 0%, #eef5ff 40%, #f7fbff 100%);
padding: 56px 64px;
display: flex;
flex-direction: column;
justify-content: space-between;
.login-page-backdrop {
position: absolute;
inset: 0;
background:
radial-gradient(circle at 20% 18%, rgba(196, 181, 253, 0.5), transparent 24%),
radial-gradient(circle at 85% 80%, rgba(191, 219, 254, 0.42), transparent 22%),
linear-gradient(180deg, rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0.4));
}
.login-page-grid {
position: relative;
overflow: hidden;
z-index: 1;
display: grid;
min-height: 100vh;
min-height: 100dvh;
grid-template-columns: minmax(0, 980px);
justify-content: center;
align-items: center;
padding:
max(28px, env(safe-area-inset-top))
clamp(24px, 4vw, 56px)
max(28px, env(safe-area-inset-bottom));
}
.login-panel {
display: flex;
align-items: center;
justify-content: center;
}
.login-panel-card {
width: 100%;
max-width: 980px;
padding: 18px;
border-radius: 32px;
background: rgba(255, 255, 255, 0.78);
border: 1px solid rgba(226, 232, 240, 0.92);
box-shadow: 0 24px 60px rgba(15, 23, 42, 0.08);
backdrop-filter: blur(24px);
}
.login-panel-layout {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(360px, 420px);
gap: 18px;
align-items: stretch;
}
.login-left {
display: flex;
min-height: 100%;
flex-direction: column;
justify-content: center;
padding: 36px;
border-radius: 28px;
background:
radial-gradient(circle at top left, rgba(139, 92, 246, 0.14), transparent 34%),
linear-gradient(135deg, rgba(255, 255, 255, 0.92), rgba(248, 250, 252, 0.86));
border: 1px solid rgba(226, 232, 240, 0.84);
}
.login-brand {
display: flex;
align-items: center;
gap: 10px;
z-index: 1;
gap: 18px;
}
.brand-logo-wrap {
display: flex;
height: 68px;
width: 68px;
align-items: center;
justify-content: center;
overflow: hidden;
border-radius: 22px;
background: linear-gradient(135deg, #ede9fe, #ddd6fe);
border: 1px solid rgba(139, 92, 246, 0.12);
box-shadow: 0 18px 40px rgba(139, 92, 246, 0.12);
}
.brand-logo-img {
width: 34px;
height: 34px;
filter: drop-shadow(0 8px 16px rgba(45, 107, 255, 0.24));
height: 100%;
width: 100%;
object-fit: cover;
}
.brand-copy {
min-width: 0;
}
.brand-kicker {
margin: 0 0 8px;
font-size: 0.78rem;
letter-spacing: 0.24em;
text-transform: uppercase;
color: #8b5cf6;
}
.brand-name {
font-size: 20px;
font-weight: 600;
color: #2f3a4f;
letter-spacing: -0.2px;
}
.login-hero {
margin-top: -40px;
z-index: 1;
}
.hero-title {
font-size: 42px;
display: block;
margin: 0;
font-size: clamp(1.7rem, 2.4vw, 2.45rem);
font-weight: 700;
line-height: 1.2;
color: #1d2b3a;
margin-bottom: 24px;
letter-spacing: -0.5px;
text-wrap: balance;
line-height: 1.08;
color: #0f172a;
}
.hero-accent {
color: #1677ff;
position: relative;
}
.hero-desc {
font-size: 16px;
line-height: 1.8;
color: #687489;
max-width: 440px;
}
.login-left-footer {
display: flex;
align-items: center;
gap: 12px;
color: #8c97a8;
font-size: 13px;
z-index: 1;
}
.footer-divider {
width: 4px;
height: 4px;
background: #c4ccd7;
border-radius: 50%;
}
/* Right Form Section */
.login-right {
flex: 1;
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
padding: 40px;
background: #ffffff;
padding: 34px 32px;
border-radius: 28px;
background: rgba(255, 255, 255, 0.94);
border: 1px solid rgba(226, 232, 240, 0.82);
}
.login-container {
width: 100%;
max-width: 400px;
}
.login-header {
margin-bottom: 40px;
margin-bottom: 28px;
text-align: left;
}
.login-header h2 {
font-size: 28px !important;
font-weight: 700 !important;
color: #1f2a37 !important;
margin-bottom: 8px !important;
letter-spacing: -0.5px;
.login-panel-eyebrow {
margin: 0 0 10px;
color: #7c3aed;
font-size: clamp(1.4rem, 1.5vw, 1.75rem);
font-weight: 700;
line-height: 1.2;
letter-spacing: 0.04em;
}
.login-header span {
font-size: 15px;
color: #6b7280;
.login-header .ant-typography {
margin: 0;
color: #475569;
line-height: 1.7;
}
.login-form .ant-form-item {
margin-bottom: 20px;
margin-bottom: 18px;
}
.login-form .ant-input-affix-wrapper-lg,
.login-form .ant-input-lg {
min-height: 54px;
border: 1px solid rgba(148, 163, 184, 0.45);
border-radius: 16px;
background: rgba(255, 255, 255, 0.96);
font-size: 1rem;
color: #0f172a;
transition: border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease;
}
.login-form .ant-input-affix-wrapper-lg {
padding: 10px 16px;
border-radius: 8px;
padding: 0 16px;
}
.login-form .ant-input-prefix {
margin-right: 12px;
color: #94a3b8;
}
.login-form .ant-input-affix-wrapper-focused,
.login-form .ant-input-affix-wrapper:focus-within,
.login-form .ant-input-lg:focus,
.login-form .ant-input-lg:focus-within {
border-color: rgba(124, 58, 237, 0.48);
box-shadow: 0 0 0 4px rgba(139, 92, 246, 0.12);
transform: translateY(-1px);
}
.captcha-wrapper {
display: flex;
display: grid;
grid-template-columns: minmax(0, 1fr) 132px;
gap: 12px;
}
.captcha-wrapper .ant-input-affix-wrapper {
width: 100%;
}
.captcha-image-btn {
padding: 0;
width: 120px;
height: 46px;
flex-shrink: 0;
border-radius: 8px;
overflow: hidden;
display: flex;
display: inline-flex;
min-height: 52px;
align-items: center;
justify-content: center;
background: #f9fafb;
overflow: hidden;
border: 1px solid rgba(148, 163, 184, 0.45);
border-radius: 16px;
background: #ffffff;
padding: 0;
width: 132px;
box-shadow: none;
}
.captcha-image-btn:hover,
.captcha-image-btn:focus {
border-color: rgba(124, 58, 237, 0.4) !important;
background: #ffffff !important;
}
.captcha-image-btn img {
width: 100%;
height: 100%;
object-fit: cover;
transition: opacity 0.2s;
}
.captcha-image-btn:hover img {
opacity: 0.8;
}
.login-extra {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: -4px;
margin-bottom: 24px;
justify-content: space-between;
gap: 16px;
margin-bottom: 22px;
color: #475569;
font-size: 0.92rem;
}
.forgot-password {
font-size: 14px;
color: #1677ff;
.login-extra .ant-checkbox-wrapper {
color: #475569;
}
.login-submit-btn {
height: 48px;
font-size: 16px;
font-weight: 600;
border-radius: 8px;
min-height: 54px;
border: 0;
border-radius: 18px;
background: linear-gradient(135deg, #7c3aed, #4f46e5) !important;
box-shadow: 0 16px 32px rgba(124, 58, 237, 0.2);
font-size: 1rem;
font-weight: 700;
transition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease;
}
.login-footer {
margin-top: 32px;
text-align: center;
padding: 16px;
background: #f9fafb;
border-radius: 12px;
.login-submit-btn:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 20px 38px rgba(124, 58, 237, 0.24);
}
.tabular-nums {
font-variant-numeric: tabular-nums;
.login-submit-btn:disabled,
.captcha-image-btn:disabled {
opacity: 0.7;
cursor: not-allowed;
}
/* Responsive */
@media (max-width: 1024px) {
.login-left {
padding: 48px;
}
.hero-title {
font-size: 36px;
}
.login-page-grid {
grid-template-columns: minmax(0, 1fr);
gap: 0;
justify-items: center;
padding:
max(20px, env(safe-area-inset-top))
20px
max(24px, calc(20px + env(safe-area-inset-bottom)));
}
.login-panel-card {
margin: 0 auto;
max-width: 460px;
padding: 0;
background: transparent;
border: 0;
box-shadow: none;
backdrop-filter: none;
}
.login-panel-layout {
grid-template-columns: minmax(0, 1fr);
gap: 0;
}
@media (max-width: 900px) {
.login-left {
display: none;
}
.login-right {
background: #f3f4f6;
}
.login-container {
background: #ffffff;
padding: 48px 32px;
border-radius: 20px;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
padding: 30px;
}
}
@media (max-width: 480px) {
@media (max-width: 640px) {
.login-page-grid {
padding:
max(16px, env(safe-area-inset-top))
16px
max(20px, calc(16px + env(safe-area-inset-bottom)));
}
.login-panel-card {
max-width: none;
padding: 0;
}
.login-right {
padding: 20px;
padding: 20px 16px;
border-radius: 24px;
}
.login-container {
padding: 32px 20px;
.login-header {
margin-bottom: 22px;
text-align: center;
}
.login-panel-eyebrow {
font-size: 1.25rem;
line-height: 1.6;
}
.login-form .ant-form-item {
margin-bottom: 16px;
}
.login-form .ant-input-affix-wrapper-lg,
.login-form .ant-input-lg {
min-height: 50px;
border-radius: 14px;
font-size: 16px;
}
.captcha-wrapper {
grid-template-columns: 1fr;
}
.captcha-image-btn {
width: 100%;
min-height: 50px;
border-radius: 14px;
}
.login-extra {
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.login-submit-btn {
min-height: 52px;
border-radius: 16px;
}
}
@media (max-width: 400px) {
.login-page-grid {
padding-left: 12px;
padding-right: 12px;
}
.login-right {
padding-left: 14px;
padding-right: 14px;
}
}

View File

@ -7,7 +7,7 @@ import { fetchCaptcha, login, type CaptchaResponse } from "@/api/auth";
import type { SysPlatformConfig } from "@/types";
import "./index.less";
const { Title, Text, Link } = Typography;
const { Text } = Typography;
type LoginFormValues = {
username: string;
@ -110,57 +110,29 @@ export default function Login() {
}
: {};
const leftStyle = platformConfig?.loginBgUrl
? {
...loginStyle,
background: "rgba(255, 255, 255, 0.2)",
backdropFilter: "blur(10px)"
}
: {};
const rightStyle = platformConfig?.loginBgUrl
? {
background: "rgba(255, 255, 255, 0.85)",
backdropFilter: "blur(20px)"
}
: {};
return (
<div className="login-page" style={loginStyle}>
<div className="login-left" style={leftStyle}>
<div className="login-page-backdrop" />
<div className="login-page-grid">
<section className="login-panel">
<div className="login-panel-card">
<div className="login-panel-layout">
<div className="login-left">
<div className="login-brand">
<div className="brand-logo-wrap">
<img src={platformConfig?.logoUrl || "/logo.svg"} alt="Logo" className="brand-logo-img" />
</div>
<div className="brand-copy">
<p className="brand-kicker"></p>
<span className="brand-name">{platformConfig?.projectName || "UnisBase"}</span>
</div>
<div className="login-hero">
<h1 className="hero-title">
{t("login.heroTitle1")}
<br />
<span className="hero-accent">{t("login.heroTitle2")}</span>
<br />
{t("login.heroTitle3")}
</h1>
<p className="hero-desc">{platformConfig?.systemDescription || t("login.heroDesc")}</p>
</div>
<div className="login-left-footer">
<div className="footer-item">{t("login.enterpriseSecurity")}</div>
<div className="footer-divider" aria-hidden="true" />
<div className="footer-item">{t("login.multiLang")}</div>
{platformConfig?.icpInfo ? (
<>
<div className="footer-divider" aria-hidden="true" />
<div className="footer-item">{platformConfig.icpInfo}</div>
</>
) : null}
</div>
</div>
<div className="login-right" style={rightStyle}>
<div className="login-right">
<div className="login-container">
<div className="login-header">
<Title level={2}>{t("login.welcome")}</Title>
<p className="login-panel-eyebrow">{t("login.welcome")}</p>
<Text type="secondary">{t("login.subtitle")}</Text>
</div>
@ -212,7 +184,6 @@ export default function Login() {
<Form.Item name="remember" valuePropName="checked" noStyle>
<Checkbox>{t("login.rememberMe")}</Checkbox>
</Form.Item>
<Link className="forgot-password">{t("login.forgotPassword")}</Link>
</div>
<Form.Item>
@ -221,15 +192,12 @@ export default function Login() {
</Button>
</Form.Item>
</Form>
<div className="login-footer">
<Text type="secondary">
{t("login.demoAccount")} <Text strong className="tabular-nums">admin</Text> / {t("login.password")}{" "}
<Text strong className="tabular-nums">123456</Text>
</Text>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
);
}