skyline пре 2 недеља
родитељ
комит
3662f2888f
31 измењених фајлова са 1012 додато и 389 уклоњено
  1. 14 14
      admin-web-new/README.en-US.md
  2. 14 14
      admin-web-new/README.md
  3. 1 1
      admin-web-new/index.html
  4. 2 2
      admin-web-new/locales/en.yaml
  5. 2 2
      admin-web-new/locales/zh-CN.yaml
  6. 1 1
      admin-web-new/mock/mine.ts
  7. 5 14
      admin-web-new/package.json
  8. 334 129
      admin-web-new/pnpm-lock.yaml
  9. 8 0
      admin-web-new/pnpm-workspace.yaml
  10. 1 1
      admin-web-new/public/platform-config.json
  11. 2 2
      admin-web-new/src/assets/iconfont/iconfont.json
  12. BIN
      admin-web-new/src/assets/login/bg.png
  13. 0 0
      admin-web-new/src/assets/login/illustration.svg
  14. 7 0
      admin-web-new/src/components/ReInteractiveHoverButton/index.ts
  15. 38 0
      admin-web-new/src/components/ReInteractiveHoverButton/src/index.vue
  16. 1 1
      admin-web-new/src/layout/components/lay-footer/index.vue
  17. 224 78
      admin-web-new/src/style/login.css
  18. 1 1
      admin-web-new/src/utils/README.md
  19. 1 1
      admin-web-new/src/utils/localforage/index.ts
  20. 1 1
      admin-web-new/src/views/able/qrcode.vue
  21. 1 1
      admin-web-new/src/views/able/watermark.vue
  22. 6 30
      admin-web-new/src/views/about/columns.tsx
  23. 1 1
      admin-web-new/src/views/about/index.vue
  24. 1 1
      admin-web-new/src/views/components/timeline.vue
  25. 1 1
      admin-web-new/src/views/home/index.vue
  26. 270 0
      admin-web-new/src/views/login/components/LoginCharacters.vue
  27. 68 84
      admin-web-new/src/views/login/index.vue
  28. 1 3
      admin-web-new/src/views/login/utils/static.ts
  29. 1 1
      admin-web-new/src/views/table/high/excel/columns.tsx
  30. 3 3
      admin-web-new/types/global.d.ts
  31. 2 2
      admin-web-new/vite.config.ts

+ 14 - 14
admin-web-new/README.en-US.md

@@ -1,4 +1,4 @@
-<h1>vue-pure-admin</h1>
+<h1>超级进化</h1>
 
 ![GitHub license](https://img.shields.io/github/license/pure-admin/vue-pure-admin?style=flat)
 ![GitHub stars](https://img.shields.io/github/stars/pure-admin/vue-pure-admin?color=fa6470&style=flat)
@@ -8,7 +8,7 @@
 
 ## Introduction
 
-`vue-pure-admin` is an open source, free and out-of-the-box middle and backend management system template. Completely adopts `ECMAScript` module (`ESM`) specifications to write and organize code, using the latest `Vue3`, `Vite`, `Element-Plus`, `TypeScript`, `Pinia`, `Tailwindcss` and other mainstream technologies develop
+`超级进化` is an open source, free and out-of-the-box middle and backend management system template. Completely adopts `ECMAScript` module (`ESM`) specifications to write and organize code, using the latest `Vue3`, `Vite`, `Element-Plus`, `TypeScript`, `Pinia`, `Tailwindcss` and other mainstream technologies develop
 
 ## R&D philosophy
 
@@ -50,23 +50,23 @@ The simplified version is based on the shelf extracted from [vue-pure-admin](htt
 `PC`
 
 <p align="center">
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/1.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/1.jpg">
   <br />
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/2.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/2.jpg">
 </p>
 
 `DarkMode`
 
 <p align="center">
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/3.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/3.jpg">
   <br />
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/4.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/4.jpg">
 </p>
 
 `Mobile`
 
 <p align="center">
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/5.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/5.jpg">
 </p>
 
 ### Use Gitpod
@@ -113,7 +113,7 @@ git clone https://gitee.com/yiming_chang/vue-pure-admin.git
 ### Install dependencies
 
 ```bash
-cd vue-pure-admin
+cd super-evolution-admin
 
 pnpm install
 ```
@@ -132,16 +132,16 @@ pnpm build
 
 ## Docker support
 
-1. Customize the image named `vue-pure-admin` (please note that there is a dot `.` at the end of the command below, indicating that the `Dockerfile` file in the current path is used, and the path can be specified according to the actual situation)
+1. Customize the image named `super-evolution-admin` (please note that there is a dot `.` at the end of the command below, indicating that the `Dockerfile` file in the current path is used, and the path can be specified according to the actual situation)
 
 ```bash
-docker build -t vue-pure-admin .
+docker build -t super-evolution-admin .
 ```
 
-2. Port mapping and start the `docker` container (`8080:80`: indicates that the `80` port is used in the container, and the port is forwarded to the `8080` port of the host; `pure-admin`: indicates a custom container name; `vue-pure-admin`: indicates the custom image name)
+2. Port mapping and start the `docker` container (`8080:80`: indicates that the `80` port is used in the container, and the port is forwarded to the `8080` port of the host; `super-evolution-admin`: indicates a custom container name; `super-evolution-admin`: indicates the custom image name)
 
 ```bash
-docker run -dp 8080:80  --name pure-admin vue-pure-admin
+docker run -dp 8080:80  --name super-evolution-admin super-evolution-admin
 ```
 
 After operating the above two commands, open `http://localhost:8080` in the browser to preview
@@ -170,7 +170,7 @@ You are very welcome to join![Raise an issue](https://github.com/pure-admin/vu
 
 ## Special code contributions
 
-Thank you very much for your in-depth understanding of the source code and your outstanding contributions to the `pure-admin` organization ❤️
+Thank you very much for your in-depth understanding of the source code and your outstanding contributions to the `超级进化` organization ❤️
 
 |                 **Contributor**                 |                                 **SpecificCode**                                 |
 | :---------------------------------------------: | :------------------------------------------------------------------------------: |
@@ -222,7 +222,7 @@ For more detailed browser compatibility support, please see [Which browsers does
 
 Completely free and open source
 
-[MIT © 2020-present, pure-admin](./LICENSE)
+[MIT © 2020-present, 超级进化](./LICENSE)
 
 ## `Star`
 

+ 14 - 14
admin-web-new/README.md

@@ -1,4 +1,4 @@
-<h1>vue-pure-admin</h1>
+<h1>超级进化</h1>
 
 ![GitHub license](https://img.shields.io/github/license/pure-admin/vue-pure-admin?style=flat)
 ![GitHub stars](https://img.shields.io/github/stars/pure-admin/vue-pure-admin?color=fa6470&style=flat)
@@ -8,7 +8,7 @@
 
 ## 简介
 
-`vue-pure-admin` 是一款开源免费且开箱即用的中后台管理系统模版。完全采用 `ECMAScript` 模块(`ESM`)规范来编写和组织代码,使用了最新的 `Vue3`、
+`超级进化` 是一款开源免费且开箱即用的中后台管理系统模版。完全采用 `ECMAScript` 模块(`ESM`)规范来编写和组织代码,使用了最新的 `Vue3`、
 `Vite`、`Element-Plus`、`TypeScript`、`Pinia`、`Tailwindcss` 等主流技术开发
 
 ## 研发理念
@@ -51,23 +51,23 @@
 `PC` 端
 
 <p align="center">
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/1.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/1.jpg">
   <br />
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/2.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/2.jpg">
 </p>
 
 暗色风格
 
 <p align="center">
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/3.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/3.jpg">
   <br />
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/4.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/4.jpg">
 </p>
 
 移动端
 
 <p align="center">
-  <img alt="PureAdmin" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/5.jpg">
+  <img alt="超级进化" src="https://xiaoxian521.github.io/hyperlink/img/vue-pure-admin/5.jpg">
 </p>
 
 ### 使用 `Gitpod`
@@ -114,7 +114,7 @@ git clone https://gitee.com/yiming_chang/vue-pure-admin.git
 ### 安装依赖
 
 ```bash
-cd vue-pure-admin
+cd super-evolution-admin
 
 pnpm install
 ```
@@ -133,16 +133,16 @@ pnpm build
 
 ## Docker 支持
 
-1. 自定义镜像名为 `vue-pure-admin` 的镜像(请注意下面命令末尾有一个点 `.` 表示使用当前路径下的 `Dockerfile` 文件,可根据实际情况指定路径)
+1. 自定义镜像名为 `super-evolution-admin` 的镜像(请注意下面命令末尾有一个点 `.` 表示使用当前路径下的 `Dockerfile` 文件,可根据实际情况指定路径)
 
 ```bash
-docker build -t vue-pure-admin .
+docker build -t super-evolution-admin .
 ```
 
-2. 端口映射并启动 `docker` 容器(`8080:80`:表示在容器中使用 `80` 端口,并将该端口转发到主机的 `8080` 端口;`pure-admin`:表示自定义容器名;`vue-pure-admin`:表示自定义镜像名)
+2. 端口映射并启动 `docker` 容器(`8080:80`:表示在容器中使用 `80` 端口,并将该端口转发到主机的 `8080` 端口;`super-evolution-admin`:表示自定义容器名;`super-evolution-admin`:表示自定义镜像名)
 
 ```bash
-docker run -dp 8080:80  --name pure-admin vue-pure-admin
+docker run -dp 8080:80  --name super-evolution-admin super-evolution-admin
 ```
 
 操作完上面两个命令后,在浏览器打开 `http://localhost:8080` 即可预览
@@ -171,7 +171,7 @@ docker run -dp 8080:80  --name pure-admin vue-pure-admin
 
 ## 特别代码贡献
 
-非常感谢你们能深入了解源码并对 `pure-admin` 组织作出优秀贡献 ❤️
+非常感谢你们能深入了解源码并对 `超级进化` 组织作出优秀贡献 ❤️
 
 |                   **贡献人**                    |                                   **具体代码**                                   |
 | :---------------------------------------------: | :------------------------------------------------------------------------------: |
@@ -223,7 +223,7 @@ docker run -dp 8080:80  --name pure-admin vue-pure-admin
 
 完全免费开源
 
-[MIT © 2020-present, pure-admin](./LICENSE)
+[MIT © 2020-present, 超级进化](./LICENSE)
 
 ## `Star`
 

+ 1 - 1
admin-web-new/index.html

@@ -8,7 +8,7 @@
       name="viewport"
       content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
     />
-    <title>vue-pure-admin</title>
+    <title>超级进化</title>
     <link rel="icon" href="/favicon.ico" />
   </head>
 

+ 2 - 2
admin-web-new/locales/en.yaml

@@ -148,8 +148,8 @@ menus:
   pureExternalPage: External Page
   pureExternalDoc: Docs External
   pureEmbeddedDoc: Docs Embedded
-  pureExternalLink: Vue-Pure-Admin
-  pureUtilsLink: Pure-Admin-Utils
+  pureExternalLink: 超级进化
+  pureUtilsLink: 超级进化-Utils
   pureColorHuntDoc: ColorHunt
   pureUiGradients: UiGradients
   pureEpDoc: Element-Plus

+ 2 - 2
admin-web-new/locales/zh-CN.yaml

@@ -148,8 +148,8 @@ menus:
   pureExternalPage: 外部页面
   pureExternalDoc: 文档外链
   pureEmbeddedDoc: 文档内嵌
-  pureExternalLink: vue-pure-admin
-  pureUtilsLink: pure-admin-utils
+  pureExternalLink: 超级进化
+  pureUtilsLink: 超级进化-utils
   pureColorHuntDoc: 调色板
   pureUiGradients: 渐变色
   pureEpDoc: element-plus

+ 1 - 1
admin-web-new/mock/mine.ts

@@ -13,7 +13,7 @@ export default defineFakeRoute([
           avatar: "https://avatars.githubusercontent.com/u/44761321",
           username: "admin",
           nickname: "小铭",
-          email: "pureadmin@163.com",
+          email: "admin@chaosjinhua.com",
           phone: "15888886789",
           description: "一个热爱开源的前端工程师"
         }

+ 5 - 14
admin-web-new/package.json

@@ -1,5 +1,5 @@
 {
-  "name": "vue-pure-admin",
+  "name": "super-evolution-admin",
   "version": "6.3.0",
   "private": true,
   "type": "module",
@@ -22,32 +22,22 @@
     "preinstall": "npx only-allow pnpm"
   },
   "keywords": [
-    "vue-pure-admin",
+    "超级进化",
     "element-plus",
     "tailwindcss",
-    "pure-admin",
     "typescript",
     "pinia",
     "vue3",
     "vite",
     "esm"
   ],
-  "homepage": "https://github.com/pure-admin/vue-pure-admin",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/pure-admin/vue-pure-admin.git"
-  },
-  "bugs": {
-    "url": "https://github.com/pure-admin/vue-pure-admin/issues"
-  },
   "license": "MIT",
   "author": {
-    "name": "xiaoxian521",
-    "email": "pureadmin@163.com",
-    "url": "https://github.com/xiaoxian521"
+    "name": "超级进化"
   },
   "dependencies": {
     "@amap/amap-jsapi-loader": "^1.0.1",
+    "@element-plus/icons-vue": "^2.3.2",
     "@howdyjs/mouse-menu": "^2.1.7",
     "@infectoone/vue-ganttastic": "^2.3.2",
     "@logicflow/core": "^1.2.28",
@@ -92,6 +82,7 @@
     "responsive-storage": "^2.2.0",
     "sortablejs": "^1.15.6",
     "swiper": "^12.0.3",
+    "tippy.js": "^6.3.7",
     "typeit": "^8.8.7",
     "v-contextmenu": "^3.2.0",
     "v3-infinite-loading": "^1.3.2",

Разлика између датотеке није приказан због своје велике величине
+ 334 - 129
admin-web-new/pnpm-lock.yaml


+ 8 - 0
admin-web-new/pnpm-workspace.yaml

@@ -0,0 +1,8 @@
+allowBuilds:
+  '@parcel/watcher': true
+  core-js: true
+  es5-ext: true
+  esbuild: true
+  typeit: true
+  vue-demi: true
+  vue3-danmaku: true

+ 1 - 1
admin-web-new/public/platform-config.json

@@ -1,6 +1,6 @@
 {
   "Version": "6.3.0",
-  "Title": "PureAdmin",
+  "Title": "超级进化",
   "FixedHeader": true,
   "HiddenSideBar": false,
   "MultiTagsCache": false,

+ 2 - 2
admin-web-new/src/assets/iconfont/iconfont.json

@@ -1,9 +1,9 @@
 {
   "id": "2208059",
-  "name": "pure-admin",
+  "name": "super-evolution",
   "font_family": "iconfont",
   "css_prefix_text": "pure-iconfont-",
-  "description": "pure-admin-iconfont",
+  "description": "超级进化-iconfont",
   "glyphs": [
     {
       "icon_id": "20594647",

BIN
admin-web-new/src/assets/login/bg.png


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
admin-web-new/src/assets/login/illustration.svg


+ 7 - 0
admin-web-new/src/components/ReInteractiveHoverButton/index.ts

@@ -0,0 +1,7 @@
+import { withInstall } from "@pureadmin/utils";
+import reInteractiveHoverButton from "./src/index.vue";
+
+/** 悬浮交互按钮 */
+export const ReInteractiveHoverButton = withInstall(reInteractiveHoverButton);
+
+export default ReInteractiveHoverButton;

+ 38 - 0
admin-web-new/src/components/ReInteractiveHoverButton/src/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <button
+    type="button"
+    :disabled="disabled || loading"
+    class="group relative w-full cursor-pointer overflow-hidden rounded-[4px] border border-[rgb(5_5_5_/_6%)] bg-[#fefefe] py-2.5 text-center font-semibold select-none disabled:opacity-60 disabled:cursor-not-allowed"
+    @click="$emit('click')"
+  >
+    <span class="inline-block transition-all duration-300 group-hover:translate-x-10 group-hover:opacity-0">
+      <slot />
+    </span>
+    <span
+      class="absolute inset-0 z-10 flex items-center justify-center gap-1.5 bg-[#C83A35] text-white opacity-0 transition-all duration-300 group-hover:opacity-100 rounded-[4px]"
+    >
+      <svg v-if="loading" class="inline-block size-4 animate-spin" viewBox="0 0 24 24" fill="none">
+        <circle cx="12" cy="12" r="10" stroke="rgb(255 255 255 / 25%)" stroke-width="3" />
+        <path d="M12 2a10 10 0 0 1 10 10" stroke="white" stroke-width="3" stroke-linecap="round" />
+      </svg>
+      <template v-else>
+        <slot />
+        <svg class="size-4 transition-transform duration-300 group-hover:translate-x-1" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+          <path d="M5 12h14" />
+          <path d="m12 5 7 7-7 7" />
+        </svg>
+      </template>
+    </span>
+  </button>
+</template>
+
+<script setup lang="ts">
+defineProps<{
+  loading?: boolean;
+  disabled?: boolean;
+}>();
+
+defineEmits<{
+  click: [];
+}>();
+</script>

+ 1 - 1
admin-web-new/src/layout/components/lay-footer/index.vue

@@ -11,7 +11,7 @@ const TITLE = getConfig("Title");
     Copyright © 2020-present
     <a
       class="hover:text-primary!"
-      href="https://github.com/pure-admin"
+      href="#"
       target="_blank"
     >
       &nbsp;{{ TITLE }}

+ 224 - 78
admin-web-new/src/style/login.css

@@ -1,114 +1,260 @@
-.wave {
-  position: fixed;
-  height: 100%;
-  width: 80%;
-  left: 0;
-  bottom: 0;
-  z-index: -1;
-}
-
-.login-container {
-  width: 100vw;
-  height: 100vh;
-  max-width: 100%;
+/* ========== 根布局 ========== */
+.login-page {
   display: grid;
-  grid-template-columns: repeat(2, 1fr);
-  grid-gap: 8rem;
-  padding: 0 2rem;
+  grid-template-columns: 1fr;
+  min-height: 100vh;
+  max-height: 100vh;
+  overflow: hidden;
+}
+
+@media (min-width: 1024px) {
+  .login-page {
+    grid-template-columns: 1fr 1fr;
+  }
+}
+
+/* ========== 左侧品牌区 ========== */
+.login-brand-panel {
+  display: none;
+  position: relative;
+  flex-direction: column;
+  justify-content: space-between;
+  padding: 48px;
+  background: linear-gradient(
+    160deg,
+    #1a2332 0%,
+    #1e2d3d 40%,
+    #172030 100%
+  );
+  color: rgb(255 255 255 / 85%);
+  overflow: hidden;
+}
+
+@media (min-width: 1024px) {
+  .login-brand-panel {
+    display: flex;
+  }
 }
 
-.img {
+/* 品牌区 Logo */
+.login-brand-logo {
+  position: relative;
+  z-index: 20;
   display: flex;
-  justify-content: flex-end;
   align-items: center;
+  gap: 10px;
+  font-size: 18px;
+  font-weight: 600;
+  letter-spacing: 0.02em;
 }
 
-.img img {
-  width: 500px;
+.login-brand-logo img {
+  width: 32px;
+  height: 32px;
+}
+
+/* 角色动画区 */
+.login-characters-area {
+  position: relative;
+  z-index: 20;
+  display: flex;
+  align-items: flex-end;
+  justify-content: center;
+  height: 500px;
 }
 
-.login-box {
+/* 品牌区底部链接 */
+.login-brand-footer {
+  position: relative;
+  z-index: 20;
   display: flex;
   align-items: center;
-  text-align: center;
-  overflow: hidden;
+  gap: 32px;
+  font-size: 13px;
+  color: rgb(255 255 255 / 35%);
 }
 
-.login-form {
-  width: 360px;
+.login-brand-footer a {
+  color: inherit;
+  text-decoration: none;
+  transition: color 0.2s;
 }
 
-.avatar {
-  width: 350px;
-  height: 80px;
+.login-brand-footer a:hover {
+  color: rgb(255 255 255 / 75%);
 }
 
-.login-form h2 {
-  margin: 20px 0 28px;
-  color: #303133;
-  font-weight: 600;
-  font-size: 22px;
-  font-family:
-    "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
-    "Microsoft YaHei", sans-serif;
-  letter-spacing: 0.02em;
+/* 左侧装饰:网格纹理 */
+.login-brand-grid {
+  position: absolute;
+  inset: 0;
+  pointer-events: none;
+  background-image: radial-gradient(circle, rgb(255 255 255 / 5%) 1px, transparent 1px);
+  background-size: 20px 20px;
+  z-index: 0;
 }
 
-@media screen and (max-width: 1180px) {
-  .login-container {
-    grid-gap: 6rem;
-  }
+/* 左侧装饰:模糊光球 */
+.login-brand-orb {
+  position: absolute;
+  border-radius: 50%;
+  filter: blur(80px);
+  pointer-events: none;
+}
 
-  .login-form {
-    width: 290px;
-  }
+.login-brand-orb--1 {
+  width: 256px;
+  height: 256px;
+  top: 25%;
+  right: 25%;
+  background: rgb(255 255 255 / 5%);
+}
 
-  .login-form h2 {
-    font-size: 20px;
-    margin: 12px 0 24px;
-  }
+.login-brand-orb--2 {
+  width: 384px;
+  height: 384px;
+  bottom: 25%;
+  left: 25%;
+  background: rgb(255 255 255 / 3%);
+}
 
-  .img img {
-    width: 360px;
-  }
+/* ========== 右侧表单区 ========== */
+.login-form-panel {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 32px;
+  background: #fefefe;
+}
 
-  .avatar {
-    width: 280px;
-    height: 80px;
-  }
+.login-form-wrap {
+  width: 100%;
+  max-width: 420px;
+}
+
+/* ========== 登录卡片(移动端可见) ========== */
+.login-card {
+  width: 100%;
+  opacity: 0;
+  animation: login-card-enter 0.35s ease-out forwards;
+}
+
+@keyframes login-card-enter {
+  from { opacity: 0; transform: translateY(8px); }
+  to { opacity: 1; transform: translateY(0); }
+}
+
+/* ========== Logo 与标题 ========== */
+.login-mobile-logo {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  gap: 10px;
+  font-size: 18px;
+  font-weight: 600;
+  margin-bottom: 48px;
+}
+
+.login-mobile-logo img {
+  width: 32px;
+  height: 32px;
 }
 
-@media screen and (max-width: 968px) {
-  .wave {
+@media (min-width: 1024px) {
+  .login-mobile-logo {
     display: none;
   }
+}
+
+.login-header {
+  text-align: center;
+  margin-bottom: 40px;
+}
+
+.login-header h1 {
+  margin: 0 0 8px;
+  font-size: 28px;
+  font-weight: 700;
+  color: #303133;
+  letter-spacing: -0.01em;
+  line-height: 1.3;
+}
+
+.login-header p {
+  margin: 0;
+  font-size: 14px;
+  color: #909399;
+}
+
+/* ========== 表单 ========== */
+.login-form .el-form-item {
+  margin-bottom: 20px;
+}
+
+.login-form .el-form-item:last-of-type {
+  margin-bottom: 0;
+}
+
+/* ========== 暗色模式 ========== */
+html.dark .login-brand-panel {
+  background: linear-gradient(
+    160deg,
+    oklch(85% 0.01 260) 0%,
+    oklch(90% 0.008 250) 40%,
+    oklch(88% 0.01 270) 100%
+  );
+  color: oklch(20% 0.01 260);
+}
+
+html.dark .login-brand-grid {
+  background-image: radial-gradient(circle, rgb(0 0 0 / 6%) 1px, transparent 1px);
+}
 
-  .img {
+html.dark .login-brand-orb--1 {
+  background: rgb(0 0 0 / 8%);
+}
+
+html.dark .login-brand-orb--2 {
+  background: rgb(0 0 0 / 5%);
+}
+
+html.dark .login-brand-footer {
+  color: oklch(20% 0.01 260 / 40%);
+}
+
+html.dark .login-brand-footer a:hover {
+  color: oklch(20% 0.01 260 / 70%);
+}
+
+html.dark .login-form-panel {
+  background: oklch(16% 0.008 260);
+}
+
+html.dark .login-header h1 {
+  color: oklch(90% 0.005 30);
+}
+
+html.dark .login-header p {
+  color: oklch(70% 0.005 30);
+}
+
+/* ========== 响应式 ========== */
+@media (max-width: 1023px) {
+  .login-brand-panel {
     display: none;
   }
+}
 
-  .login-container {
-    grid-template-columns: 1fr;
+@media (max-width: 480px) {
+  .login-form-panel {
+    padding: 24px 16px;
   }
 
-  .login-box {
-    justify-content: center;
+  .login-header h1 {
+    font-size: 22px;
   }
-}
-
-/* Brand Red 按钮覆盖 */
-.login-form .el-button--primary {
-  --el-button-bg-color: #C83A35;
-  --el-button-border-color: #C83A35;
-  --el-button-hover-bg-color: oklch(45% 0.16 25);
-  --el-button-hover-border-color: oklch(45% 0.16 25);
-  --el-button-active-bg-color: oklch(38% 0.15 25);
-  --el-button-active-border-color: oklch(38% 0.15 25);
-  letter-spacing: 0.15em;
-  transition: background-color 0.2s ease;
-}
 
-.login-form .el-button--primary:focus-visible {
-  outline: 2px solid #C83A35;
-  outline-offset: 2px;
+  .login-form .el-form-item {
+    margin-bottom: 16px;
+  }
 }

+ 1 - 1
admin-web-new/src/utils/README.md

@@ -1,5 +1,5 @@
 ### 注意
 
-- `vue-pure-admin` 从 `3.3.0` 版本之后(不包括 `3.3.0` 版本),大部分工具和 `hooks` 都集成到了 [@pureadmin/utils](https://pure-admin-utils.netlify.app/)
+- `超级进化` 从 `3.3.0` 版本之后(不包括 `3.3.0` 版本),大部分工具和 `hooks` 都集成到了 [@pureadmin/utils](https://pure-admin-utils.netlify.app/)
 - [npm](https://www.npmjs.com/package/@pureadmin/utils)
 - [文档代码地址](https://github.com/pure-admin/pure-admin-utils-docs)

+ 1 - 1
admin-web-new/src/utils/localforage/index.ts

@@ -8,7 +8,7 @@ class StorageProxy implements ProxyStorage {
     this.storage.config({
       // 首选IndexedDB作为第一驱动,不支持IndexedDB会自动降级到localStorage(WebSQL被弃用,详情看https://developer.chrome.com/blog/deprecating-web-sql)
       driver: [this.storage.INDEXEDDB, this.storage.LOCALSTORAGE],
-      name: "pure-admin"
+      name: "super-evolution-admin"
     });
   }
 

+ 1 - 1
admin-web-new/src/views/able/qrcode.vue

@@ -7,7 +7,7 @@ defineOptions({
   name: "QrCode"
 });
 
-const qrcodeText = "vue-pure-admin";
+const qrcodeText = "超级进化";
 
 const asyncTitle = ref("");
 setTimeout(() => {

+ 1 - 1
admin-web-new/src/views/able/watermark.vue

@@ -9,7 +9,7 @@ defineOptions({
 const local = ref();
 const preventLocal = ref();
 const color = ref("#409EFF");
-const value = ref("vue-pure-admin");
+const value = ref("超级进化");
 const { setWatermark, clear } = useWatermark();
 const { setWatermark: setLocalWatermark, clear: clearLocal } =
   useWatermark(local);

+ 6 - 30
admin-web-new/src/views/about/columns.tsx

@@ -47,56 +47,32 @@ export function useColumns() {
       }
     },
     {
-      label: "完整版代码地址",
+      label: "技术框架",
       minWidth: 140,
       className: "pure-version",
       cellRenderer: () => {
         return (
-          <a
-            href="https://github.com/pure-admin/vue-pure-admin"
-            target="_blank"
-          >
-            <span style="color: var(--el-color-primary)">完整版代码链接</span>
-          </a>
+          <span style="color: var(--el-color-primary)">Vue3 + Vite + Element-Plus</span>
         );
       }
     },
     {
-      label: "精简版代码地址",
+      label: "品牌",
       minWidth: 140,
       className: "pure-version",
       cellRenderer: () => {
         return (
-          <a
-            href="https://github.com/pure-admin/pure-admin-thin"
-            target="_blank"
-          >
-            <span style="color: var(--el-color-primary)">精简版代码链接</span>
-          </a>
+          <span style="color: var(--el-color-primary)">超级进化</span>
         );
       }
     },
     {
-      label: "文档地址",
+      label: "版本",
       minWidth: 100,
       className: "pure-version",
       cellRenderer: () => {
         return (
-          <a href="https://pure-admin.cn/" target="_blank">
-            <span style="color: var(--el-color-primary)">文档链接</span>
-          </a>
-        );
-      }
-    },
-    {
-      label: "预览地址",
-      minWidth: 100,
-      className: "pure-version",
-      cellRenderer: () => {
-        return (
-          <a href="https://pure-admin.github.io/vue-pure-admin" target="_blank">
-            <span style="color: var(--el-color-primary)">预览链接</span>
-          </a>
+          <span style="color: var(--el-color-primary)">{version}</span>
         );
       }
     }

+ 1 - 1
admin-web-new/src/views/about/index.vue

@@ -62,7 +62,7 @@ Object.keys(devDependencies).forEach(key => {
   <div>
     <el-card class="mb-4 box-card" shadow="never">
       <span>
-        vue-pure-admin 是一款开源免费且开箱即用的中后台管理系统模版。完全采用
+        超级进化 是一款开源免费且开箱即用的中后台管理系统模版。完全采用
         ECMAScript 模块(ESM)规范来编写和组织代码,使用了最新的
         Vue3、Vite、Element-Plus、TypeScript、Pinia、Tailwindcss
         等主流技术开发。

+ 1 - 1
admin-web-new/src/views/components/timeline.vue

@@ -89,7 +89,7 @@ const activities = [
           placement="bottom"
         >
           <div class="message">
-            vue-pure-admin 第{{ activities.length - index }}个版本发布啦
+            超级进化 第{{ activities.length - index }}个版本发布啦
           </div>
         </el-timeline-item>
       </el-timeline>

+ 1 - 1
admin-web-new/src/views/home/index.vue

@@ -46,7 +46,7 @@
               class="text-6xl text-primary mb-4"
             />
             <div class="text-xl text-gray-600">
-              管理系统已成功迁移至 vue-pure-admin v6.3.0
+              管理系统已成功迁移至 超级进化 v6.3.0
             </div>
             <div class="text-gray-400 mt-2">
               后续将逐步迁移各业务模块

+ 270 - 0
admin-web-new/src/views/login/components/LoginCharacters.vue

@@ -0,0 +1,270 @@
+<template>
+  <div class="characters-stage" style="width:550px;height:400px">
+    <!-- Red tall character - back layer -->
+    <div ref="redRef" class="ch" :style="redStyle">
+      <div class="eyes-wrap" :style="redEyesStyle">
+        <div class="eye" :style="{ width: '18px', height: isRedBlink ? '2px' : '18px' }">
+          <div class="pupil-dot" style="width:7px;height:7px" />
+        </div>
+        <div class="eye" :style="{ width: '18px', height: isRedBlink ? '2px' : '18px' }">
+          <div class="pupil-dot" style="width:7px;height:7px" />
+        </div>
+      </div>
+    </div>
+
+    <!-- Dark character - middle layer -->
+    <div ref="darkRef" class="ch" :style="darkStyle">
+      <div class="eyes-wrap" :style="darkEyesStyle">
+        <div class="eye" :style="{ width: '16px', height: isDarkBlink ? '2px' : '16px' }">
+          <div class="pupil-dot" style="width:6px;height:6px" />
+        </div>
+        <div class="eye" :style="{ width: '16px', height: isDarkBlink ? '2px' : '16px' }">
+          <div class="pupil-dot" style="width:6px;height:6px" />
+        </div>
+      </div>
+    </div>
+
+    <!-- Terracotta semi-circle - front left -->
+    <div ref="terraRef" class="ch" :style="terraStyle">
+      <div class="eyes-wrap" style="gap:32px" :style="terraEyesStyle">
+        <div class="pup-solo" style="width:12px;height:12px" />
+        <div class="pup-solo" style="width:12px;height:12px" />
+      </div>
+    </div>
+
+    <!-- Gold semi-circle - front right -->
+    <div ref="goldRef" class="ch" :style="goldStyle">
+      <div class="eyes-wrap" style="gap:32px" :style="goldEyesStyle">
+        <div class="pup-solo" style="width:12px;height:12px" />
+        <div class="pup-solo" style="width:12px;height:12px" />
+      </div>
+      <div class="mouth" :style="mouthStyle" />
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted, watch } from "vue";
+
+const props = defineProps<{
+  isTyping?: boolean;
+  showPassword?: boolean;
+  passwordLength?: number;
+}>();
+
+// Mouse position
+const mx = ref(0);
+const my = ref(0);
+function onMouseMove(e: MouseEvent) { mx.value = e.clientX; my.value = e.clientY; }
+
+// Blink state
+const isRedBlink = ref(false);
+const isDarkBlink = ref(false);
+
+// Behavior state
+const isLook = ref(false);
+
+// Refs
+const redRef = ref<HTMLElement>();
+const darkRef = ref<HTMLElement>();
+const terraRef = ref<HTMLElement>();
+const goldRef = ref<HTMLElement>();
+
+// Computed flags
+const hidePw = computed(() => (props.passwordLength ?? 0) > 0 && !props.showPassword);
+const showPw = computed(() => (props.passwordLength ?? 0) > 0 && props.showPassword);
+
+// Face tracking data
+const red = reactive({ fx: 0, fy: 0, sk: 0 });
+const dark = reactive({ fx: 0, fy: 0, sk: 0 });
+const terra = reactive({ fx: 0, fy: 0, sk: 0 });
+const gold = reactive({ fx: 0, fy: 0, sk: 0 });
+
+function calcFace(el: HTMLElement | undefined) {
+  if (!el) return { fx: 0, fy: 0, sk: 0 };
+  const r = el.getBoundingClientRect();
+  return {
+    fx: Math.max(-15, Math.min(15, (mx.value - (r.left + r.width / 2)) / 20)),
+    fy: Math.max(-10, Math.min(10, (my.value - (r.top + r.height / 3)) / 30)),
+    sk: Math.max(-6, Math.min(6, -(mx.value - (r.left + r.width / 2)) / 120)),
+  };
+}
+
+// Vue 3.4+ 推荐使用 getter 函数数组
+watch([() => mx.value, () => my.value], () => {
+  Object.assign(red, calcFace(redRef.value));
+  Object.assign(dark, calcFace(darkRef.value));
+  Object.assign(terra, calcFace(terraRef.value));
+  Object.assign(gold, calcFace(goldRef.value));
+});
+
+// --- Character styles ---
+
+const redStyle = computed(() => ({
+  left: '70px',
+  width: '180px',
+  height: props.isTyping || hidePw.value ? '440px' : '400px',
+  backgroundColor: '#C83A35',
+  borderRadius: '10px 10px 0 0',
+  zIndex: 1,
+  transform: showPw.value
+    ? 'skewX(0deg)'
+    : props.isTyping || hidePw.value
+      ? `skewX(${red.sk - 12}deg) translateX(40px)`
+      : `skewX(${red.sk}deg)`,
+  transformOrigin: 'bottom center',
+}));
+
+const redEyesStyle = computed(() => ({
+  left: `${showPw.value ? 20 : isLook.value ? 55 : 45 + red.fx}px`,
+  top: `${showPw.value ? 35 : isLook.value ? 65 : 40 + red.fy}px`,
+}));
+
+const darkStyle = computed(() => ({
+  left: '240px',
+  width: '120px',
+  height: '310px',
+  backgroundColor: '#2D2D2D',
+  borderRadius: '8px 8px 0 0',
+  zIndex: 2,
+  transform: showPw.value
+    ? 'skewX(0deg)'
+    : isLook.value
+      ? `skewX(${dark.sk * 1.5 + 10}deg) translateX(20px)`
+      : `skewX(${dark.sk}deg)`,
+  transformOrigin: 'bottom center',
+}));
+
+const darkEyesStyle = computed(() => ({
+  left: `${showPw.value ? 10 : isLook.value ? 32 : 26 + dark.fx}px`,
+  top: `${showPw.value ? 28 : isLook.value ? 12 : 32 + dark.fy}px`,
+}));
+
+const terraStyle = computed(() => ({
+  left: '0px',
+  width: '240px',
+  height: '200px',
+  zIndex: 3,
+  backgroundColor: '#c4958a',
+  borderRadius: '120px 120px 0 0',
+  transform: showPw.value ? 'skewX(0deg)' : `skewX(${terra.sk}deg)`,
+  transformOrigin: 'bottom center',
+}));
+
+const terraEyesStyle = computed(() => ({
+  left: `${showPw.value ? 50 : 82 + terra.fx}px`,
+  top: `${showPw.value ? 85 : 90 + terra.fy}px`,
+}));
+
+const goldStyle = computed(() => ({
+  left: '310px',
+  width: '140px',
+  height: '230px',
+  backgroundColor: '#c4a86a',
+  borderRadius: '70px 70px 0 0',
+  zIndex: 4,
+  transform: showPw.value ? 'skewX(0deg)' : `skewX(${gold.sk}deg)`,
+  transformOrigin: 'bottom center',
+}));
+
+const goldEyesStyle = computed(() => ({
+  left: `${showPw.value ? 20 : 52 + gold.fx}px`,
+  top: `${showPw.value ? 35 : 40 + gold.fy}px`,
+}));
+
+const mouthStyle = computed(() => ({
+  left: `${showPw.value ? 10 : 40 + gold.fx}px`,
+  top: `${showPw.value ? 88 : 88 + gold.fy}px`,
+}));
+
+// --- Typing reaction ---
+watch(
+  () => props.isTyping,
+  (v) => {
+    if (v) {
+      isLook.value = true;
+      window.setTimeout(() => { isLook.value = false; }, 800);
+    }
+  }
+);
+
+// --- Password peek reaction ---
+let peekT = 0;
+watch(
+  [() => props.passwordLength, () => props.showPassword],
+  ([len, show]) => {
+    clearTimeout(peekT);
+    if ((len ?? 0) > 0 && show) {
+      const sched = () => {
+        peekT = window.setTimeout(() => {
+          peekT = window.setTimeout(() => { sched(); }, 800);
+        }, Math.random() * 3000 + 2000);
+      };
+      sched();
+    }
+  }
+);
+
+// --- Blink timers ---
+const timers: number[] = [];
+function scheduleBlink(setter: (v: boolean) => void) {
+  const tick = () => {
+    timers.push(window.setTimeout(() => {
+      setter(true);
+      timers.push(window.setTimeout(() => { setter(false); tick(); }, 150));
+    }, Math.random() * 4000 + 3000));
+  };
+  tick();
+}
+
+onMounted(() => {
+  window.addEventListener("mousemove", onMouseMove);
+  scheduleBlink((v) => (isRedBlink.value = v));
+  scheduleBlink((v) => (isDarkBlink.value = v));
+});
+
+onUnmounted(() => {
+  window.removeEventListener("mousemove", onMouseMove);
+  timers.forEach(clearTimeout);
+  clearTimeout(peekT);
+});
+</script>
+
+<style scoped>
+.characters-stage { position: relative; }
+.ch {
+  position: absolute;
+  bottom: 0;
+  transition: all 0.7s ease-in-out;
+}
+.eyes-wrap {
+  position: absolute;
+  display: flex;
+  transition: all 0.2s ease-out;
+}
+.eye {
+  background: white;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  overflow: hidden;
+  transition: height 0.15s ease;
+}
+.pupil-dot {
+  background: #2D2D2D;
+  border-radius: 50%;
+}
+.pup-solo {
+  background: #2D2D2D;
+  border-radius: 50%;
+}
+.mouth {
+  position: absolute;
+  width: 80px;
+  height: 4px;
+  background: #2D2D2D;
+  border-radius: 999px;
+  transition: all 0.2s ease-out;
+}
+</style>

+ 68 - 84
admin-web-new/src/views/login/index.vue

@@ -2,35 +2,33 @@
 import { useRouter } from "vue-router";
 import { message } from "@/utils/message";
 import { useNav } from "@/layout/hooks/useNav";
-import TypeIt from "@/components/ReTypeit";
 import { useEventListener } from "@vueuse/core";
 import type { FormInstance } from "element-plus";
 import { useLayout } from "@/layout/hooks/useLayout";
 import { useUserStoreHook } from "@/store/modules/user";
 import { initRouter, getTopMenu } from "@/router/utils";
-import { bg, avatar, illustration } from "./utils/static";
-import { ref, reactive } from "vue";
+import { avatar } from "./utils/static";
+import { ref, reactive, computed } from "vue";
 import { useRenderIcon } from "@/components/ReIcon/src/hooks";
 import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
+import ReInteractiveHoverButton from "@/components/ReInteractiveHoverButton";
+import LoginCharacters from "./components/LoginCharacters.vue";
 
 import dayIcon from "@/assets/svg/day.svg?component";
 import darkIcon from "@/assets/svg/dark.svg?component";
 import Lock from "~icons/ri/lock-fill";
 import User from "~icons/ri/user-3-fill";
 
-// RSA 加密
 import { JSEncrypt } from "jsencrypt";
 
 const encryptPassword = (password: string) => {
   const encryptor = new JSEncrypt();
-  const publicKey = import.meta.env.VITE_PUBLIC_KEY || '';
+  const publicKey = import.meta.env.VITE_PUBLIC_KEY || "";
   encryptor.setPublicKey(publicKey);
   return encryptor.encrypt(password) || password;
 };
 
-defineOptions({
-  name: "Login"
-});
+defineOptions({ name: "Login" });
 
 const router = useRouter();
 const loading = ref(false);
@@ -43,27 +41,33 @@ const { dataTheme, themeMode, dataThemeChange } = useDataThemeChange();
 dataThemeChange(themeMode.value);
 const { title } = useNav();
 
-const ruleForm = reactive({
-  username: "",
-  password: ""
-});
+const ruleForm = reactive({ username: "", password: "" });
+
+// 角色动画状态
+const isTyping = ref(false);
+const showPassword = ref(false);
+const passwordLength = computed(() => ruleForm.password.length);
+
+// 监听密码可见性 (Element Plus show-password 切换)
+function onPasswordToggle() {
+  showPassword.value = !showPassword.value;
+}
 
 const onLogin = async (formEl: FormInstance | undefined) => {
   if (!formEl) return;
-  await formEl.validate(valid => {
+  await formEl.validate((valid) => {
     if (valid) {
       loading.value = true;
       useUserStoreHook()
         .loginByUsername({
           mobilePhone: ruleForm.username,
-          password: encryptPassword(ruleForm.password)
+          password: encryptPassword(ruleForm.password),
         })
-        .then(res => {
+        .then((res) => {
           if (res.success) {
             return initRouter().then(() => {
               disabled.value = true;
               const topMenu = getTopMenu(true);
-              // 默认跳转到运营管理仪表盘
               const targetPath = topMenu?.path || "/admin/dashboard";
               router
                 .push(targetPath)
@@ -76,7 +80,7 @@ const onLogin = async (formEl: FormInstance | undefined) => {
             message("登录失败", { type: "error" });
           }
         })
-        .catch(error => {
+        .catch((error) => {
           message(error?.message || "登录失败", { type: "error" });
         })
         .finally(() => (loading.value = false));
@@ -85,82 +89,62 @@ const onLogin = async (formEl: FormInstance | undefined) => {
 };
 
 useEventListener(document, "keydown", ({ code }) => {
-  if (
-    ["Enter", "NumpadEnter"].includes(code) &&
-    !disabled.value &&
-    !loading.value
-  )
+  if (["Enter", "NumpadEnter"].includes(code) && !disabled.value && !loading.value)
     onLogin(ruleFormRef.value);
 });
 </script>
 
 <template>
-  <div class="select-none">
-    <img :src="bg" class="wave" />
-    <div class="flex-c absolute right-5 top-3">
-      <!-- 主题切换 -->
-      <el-switch
-        v-model="dataTheme"
-        inline-prompt
-        :active-icon="dayIcon"
-        :inactive-icon="darkIcon"
-        @change="dataThemeChange"
-      />
-    </div>
-    <div class="login-container">
-      <div class="img">
-        <component :is="illustration" />
+  <div class="login-page">
+    <div class="login-brand-panel">
+      <div class="login-brand-logo">
+        <component :is="avatar" />
+        <span>{{ title }}</span>
+      </div>
+      <div class="login-characters-area">
+        <LoginCharacters
+          :is-typing="isTyping"
+          :show-password="showPassword"
+          :password-length="passwordLength"
+        />
       </div>
-      <div class="login-box">
-        <div class="login-form">
-          <avatar class="avatar" />
-          <h2 class="outline-hidden">
-            <TypeIt
-              :options="{ strings: [title], cursor: false, speed: 100 }"
-            />
-          </h2>
+      <div class="login-brand-footer">
+        <span>&copy; {{ new Date().getFullYear() }} {{ title }}</span>
+      </div>
+      <div class="login-brand-grid" />
+      <div class="login-brand-orb login-brand-orb--1" />
+      <div class="login-brand-orb login-brand-orb--2" />
+    </div>
 
-          <el-form
-            ref="ruleFormRef"
-            :model="ruleForm"
-            size="large"
-          >
-            <el-form-item
-              :rules="[{ required: true, message: '请输入用户名', trigger: 'blur' }]"
-              prop="username"
-            >
-              <el-input
-                v-model="ruleForm.username"
-                clearable
-                placeholder="请输入用户名"
-                :prefix-icon="useRenderIcon(User)"
-              />
+    <div class="login-form-panel">
+      <div class="absolute right-5 top-3" style="z-index: 10">
+        <el-switch
+          v-model="dataTheme"
+          inline-prompt
+          :active-icon="dayIcon"
+          :inactive-icon="darkIcon"
+          @change="dataThemeChange"
+        />
+      </div>
+      <div class="login-form-wrap">
+        <div class="login-card">
+          <div class="login-mobile-logo">
+            <component :is="avatar" />
+            <span>{{ title }}</span>
+          </div>
+          <div class="login-header">
+            <h1>欢迎回来</h1>
+            <p>请输入您的账号信息</p>
+          </div>
+          <el-form ref="ruleFormRef" :model="ruleForm" class="login-form" size="large">
+            <el-form-item :rules="[{ required: true, message: '请输入用户名', trigger: 'blur' }]" prop="username">
+              <el-input v-model="ruleForm.username" clearable placeholder="请输入用户名" :prefix-icon="useRenderIcon(User)" @focus="isTyping = true" @blur="isTyping = false" />
             </el-form-item>
-
-            <el-form-item
-              :rules="[{ required: true, message: '请输入密码', trigger: 'blur' }]"
-              prop="password"
-            >
-              <el-input
-                v-model="ruleForm.password"
-                clearable
-                show-password
-                placeholder="请输入密码"
-                :prefix-icon="useRenderIcon(Lock)"
-              />
+            <el-form-item :rules="[{ required: true, message: '请输入密码', trigger: 'blur' }]" prop="password">
+              <el-input v-model="ruleForm.password" clearable show-password placeholder="请输入密码" :prefix-icon="useRenderIcon(Lock)" @click="onPasswordToggle" />
             </el-form-item>
-
             <el-form-item>
-              <el-button
-                class="w-full"
-                size="default"
-                type="primary"
-                :loading="loading"
-                :disabled="disabled"
-                @click="onLogin(ruleFormRef)"
-              >
-                登 录
-              </el-button>
+              <ReInteractiveHoverButton :loading="loading" :disabled="disabled" @click="onLogin(ruleFormRef)">登录</ReInteractiveHoverButton>
             </el-form-item>
           </el-form>
         </div>
@@ -169,6 +153,6 @@ useEventListener(document, "keydown", ({ code }) => {
   </div>
 </template>
 
-<style scoped>
+<style>
 @import url("@/style/login.css");
 </style>

+ 1 - 3
admin-web-new/src/views/login/utils/static.ts

@@ -1,5 +1,3 @@
-import bg from "@/assets/login/bg.png";
 import avatar from "@/assets/login/avatar.svg?component";
-import illustration from "@/assets/login/illustration.svg?component";
 
-export { bg, avatar, illustration };
+export { avatar };

+ 1 - 1
admin-web-new/src/views/table/high/excel/columns.tsx

@@ -38,7 +38,7 @@ export function useColumns() {
     const workSheet = utils.aoa_to_sheet(res);
     const workBook = utils.book_new();
     utils.book_append_sheet(workBook, workSheet, "数据报表");
-    writeFile(workBook, "pure-admin-table.xlsx");
+    writeFile(workBook, "超级进化-table.xlsx");
     message("导出成功", {
       type: "success"
     });

+ 3 - 3
admin-web-new/types/global.d.ts

@@ -61,7 +61,7 @@ declare global {
 
   /**
    * 全局自定义环境变量的类型声明
-   * @see {@link https://pure-admin.cn/pages/config/#%E5%85%B7%E4%BD%93%E9%85%8D%E7%BD%AE}
+   * @see {@link https://pure-admin.cn/pages/config/#%E5%85%B7%E4%BD%93%E9%85%8D%E7%BD%AE | 框架配置文档}
    */
   interface ViteEnv {
     VITE_PORT: number;
@@ -79,7 +79,7 @@ declare global {
 
   /**
    * 对应 `public/platform-config.json` 文件的类型声明
-   * @see {@link https://pure-admin.cn/pages/config/#platform-config-json}
+   * @see {@link https://pure-admin.cn/pages/config/#platform-config-json | platform-config.json 配置文档}
    */
   interface PlatformConfigs {
     Version?: string;
@@ -120,7 +120,7 @@ declare global {
 
   /**
    * 与 `PlatformConfigs` 类型不同,这里是缓存到浏览器本地存储的类型声明
-   * @see {@link https://pure-admin.cn/pages/config/#platform-config-json}
+   * @see {@link https://pure-admin.cn/pages/config/#platform-config-json | platform-config.json 配置文档}
    */
   interface StorageConfigs {
     version?: string;

+ 2 - 2
admin-web-new/vite.config.ts

@@ -9,7 +9,7 @@ import {
   __APP_INFO__
 } from "./build/utils";
 
-export default ({ mode }: ConfigEnv): UserConfigExport => {
+export default async ({ mode }: ConfigEnv): Promise<UserConfigExport> => {
   const { VITE_CDN, VITE_PORT, VITE_COMPRESSION, VITE_PUBLIC_PATH } =
     wrapperEnv(loadEnv(mode, root));
   return {
@@ -30,7 +30,7 @@ export default ({ mode }: ConfigEnv): UserConfigExport => {
         clientFiles: ["./index.html", "./src/{views,components}/*"]
       }
     },
-    plugins: getPluginsList(VITE_CDN, VITE_COMPRESSION),
+    plugins: await getPluginsList(VITE_CDN, VITE_COMPRESSION),
     // https://cn.vitejs.dev/config/dep-optimization-options.html#dep-optimization-options
     optimizeDeps: {
       include,

Неке датотеке нису приказане због велике количине промена