feat: 初始化项目配置和文档- 添加 .editorconfig 文件,配置代码编辑规范

- 添加 .env 及相关文件,配置环境变量
- 添加 .eslintignore 和 .eslintrc.js 文件,配置 ESLint 规则
- 添加 .gitignore 文件,配置 Git忽略项
- 添加 .prettierignore 文件,配置 Prettier 忽略项
- 添加隐私政策文档,详细说明用户数据的收集和使用
This commit is contained in:
2025-08-23 20:31:46 +08:00
commit 37f3b6327c
1310 changed files with 210439 additions and 0 deletions

242
src/styles/animations.less Normal file
View File

@@ -0,0 +1,242 @@
// 动画样式定义
// 关键帧动画
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideInLeft {
from {
opacity: 0;
transform: translateX(-30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes slideInRight {
from {
opacity: 0;
transform: translateX(30px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
@keyframes shake {
0%, 100% {
transform: translateX(0);
}
10%, 30%, 50%, 70%, 90% {
transform: translateX(-5px);
}
20%, 40%, 60%, 80% {
transform: translateX(5px);
}
}
@keyframes pulseSuccess {
0% {
transform: scale(1);
box-shadow: 0 0 0 0 rgba(0, 125, 255, 0.7);
}
70% {
transform: scale(1.05);
box-shadow: 0 0 0 10px rgba(0, 125, 255, 0);
}
100% {
transform: scale(1);
box-shadow: 0 0 0 0 rgba(0, 125, 255, 0);
}
}
@keyframes ripple {
to {
transform: scale(4);
opacity: 0;
}
}
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-10px);
}
}
@keyframes glow {
0%, 100% {
box-shadow: 0 0 5px rgba(0, 125, 255, 0.5);
}
50% {
box-shadow: 0 0 20px rgba(0, 125, 255, 0.8);
}
}
// 动画类
.animate-fade-in-up {
animation: fadeInUp 0.6s ease-out forwards;
}
.animate-slide-in-left {
animation: slideInLeft 0.5s ease-out forwards;
}
.animate-slide-in-right {
animation: slideInRight 0.5s ease-out forwards;
}
.animate-fade-in {
animation: fadeIn 0.3s ease-out forwards;
}
.animate-fade-out {
animation: fadeOut 0.3s ease-out forwards;
}
.animate-shake {
animation: shake 0.5s ease-in-out;
}
.animate-pulse-success {
animation: pulseSuccess 1s ease-out;
}
.animate-float {
animation: float 3s ease-in-out infinite;
}
.animate-glow {
animation: glow 2s ease-in-out infinite;
}
// 波纹效果
.ripple {
position: absolute;
border-radius: 50%;
background: rgba(255, 255, 255, 0.6);
transform: scale(0);
animation: ripple 0.6s linear;
pointer-events: none;
}
// 输入框聚焦效果
.input-focused {
.ant-input,
.ant-input-password {
border-color: #007dff !important;
box-shadow: 0 0 0 2px rgba(0, 125, 255, 0.2) !important;
transform: translateY(-2px);
transition: all 0.3s ease;
}
}
// 按钮悬停效果
.dynamic-button {
position: relative;
overflow: hidden;
transition: all 0.3s ease;
&:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 125, 255, 0.3);
}
&:active {
transform: translateY(0);
}
}
// 卡片悬停效果
.dynamic-card {
transition: all 0.3s ease;
&:hover {
transform: translateY(-5px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);
}
}
// 渐变背景动画
.gradient-bg {
background: linear-gradient(-45deg, #007dff, #00d4ff, #ff6b6b, #4ecdc4);
background-size: 400% 400%;
animation: gradientShift 15s ease infinite;
}
@keyframes gradientShift {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
// 加载动画
.loading-dots {
display: inline-block;
&::after {
content: '';
animation: loadingDots 1.5s infinite;
}
}
@keyframes loadingDots {
0%, 20% {
content: '';
}
40% {
content: '.';
}
60% {
content: '..';
}
80%, 100% {
content: '...';
}
}
// 响应式动画
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}

View File

@@ -0,0 +1,6 @@
/** 按需引入 */
@import 'ant-design-vue/es/message/style/index.less';
@import 'ant-design-vue/es/notification/style/index.less';
@import 'ele-admin-pro/es/style/nprogress.less';
@import 'ele-admin-pro/es/style/display.less';
@import 'ele-admin-pro/es/style/common.less';

View File

@@ -0,0 +1,2 @@
/** 组件样式 */
//@input-item: 300px;

4
src/styles/global-import.less vendored Normal file
View File

@@ -0,0 +1,4 @@
/** 全局引入 */
@import 'cropperjs/dist/cropper.css';
@import 'ant-design-vue/dist/antd.less';
@import 'ele-admin-pro/es/style/index.less';

39
src/styles/index.less Normal file
View File

@@ -0,0 +1,39 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
/** 全局样式 */
@style-entry-file: as-needed;
@import './@{style-entry-file}.less';
@import './transition/index.less';
@import "./component.less";
// 主题
@import 'ele-admin-pro/es/style/themes/dynamic.less';
:root {
// 灰色主题
--grey-1: #1b1b1b;
--grey-2: #363636;
--grey-3: #4d4d4d;
--grey-4: #737373;
--grey-5: #a6a6a6;
--grey-6: #d9d9d9;
--grey-7: #e6e6e6;
--grey-8: #f2f2f2;
--grey-9: #f7f7f7;
--grey-10: #fafafa;
}
.ele-admin-theme-dark {
// 灰色主题
--grey-1: #fafafa;
--grey-2: #f7f7f7;
--grey-3: #f2f2f2;
--grey-4: #e6e6e6;
--grey-5: #d9d9d9;
--grey-6: #a6a6a6;
--grey-7: #737373;
--grey-8: #4d4d4d;
--grey-9: #363636;
--grey-10: #1b1b1b;
}

View File

@@ -0,0 +1,10 @@
/* 渐变 */
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.2s ease-in-out;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}

View File

@@ -0,0 +1,4 @@
/** 路由切换动画 */
@import './fade.less';
@import './slide.less';
@import './zoom.less';

View File

@@ -0,0 +1,31 @@
/* 底部消退 */
.slide-bottom-enter-active,
.slide-bottom-leave-active {
transition: opacity 0.2s ease-out, transform 0.25s ease-out;
}
.slide-bottom-enter-from {
opacity: 0;
transform: translateY(-10%);
}
.slide-bottom-leave-to {
opacity: 0;
transform: translateY(10%);
}
/* 右侧消退 */
.slide-right-leave-active,
.slide-right-enter-active {
transition: opacity 0.2s ease-out, transform 0.25s ease-out;
}
.slide-right-enter-from {
opacity: 0;
transform: translateX(-60px);
}
.slide-right-leave-to {
opacity: 0;
transform: translateX(60px);
}

View File

@@ -0,0 +1,31 @@
/* 放大渐变 */
.zoom-in-enter-active,
.zoom-in-leave-active {
transition: opacity 0.2s ease-out, transform 0.25s ease-out;
}
.zoom-in-enter-from {
opacity: 0;
transform: scale(0.9);
}
.zoom-in-leave-to {
opacity: 0;
transform: scale(1.1);
}
/* 缩小渐变 */
.zoom-out-leave-active,
.zoom-out-enter-active {
transition: opacity 0.2s ease-out, transform 0.25s ease-out;
}
.zoom-out-enter-from {
opacity: 0;
transform: scale(1.2);
}
.zoom-out-leave-to {
opacity: 0;
transform: scale(0.8);
}