diff --git a/.env b/.env new file mode 100644 index 0000000..af0e54c --- /dev/null +++ b/.env @@ -0,0 +1,192 @@ +# +====================================================================== +# | 模块: 环境配置文件模板 +# | 说明: 提供完整的 .env 配置示例,包含应用、数据库、缓存、JWT、验证码等 +# +====================================================================== + +# ============================================================ +# 基础配置 +# ============================================================ + +# 应用名称 - 用于界面显示和系统标识 +FASTAPI_NAME=FastAPI+EleVue旗舰版 +# 应用版本 - 当前版本号 +FASTAPI_VERSION=v3.0.0 +# 应用运行地址 - 服务绑定的IP地址,127.0.0.1表示仅本地访问 +FASTAPI_HOST=127.0.0.1 +# 应用运行端口 - 服务监听的端口号 +FASTAPI_PORT=8031 +# 应用启动文件 - 项目入口Python文件 +FASTAPI_APP=main.py +# 应用环境变量 - 运行环境:development/production/testing +FASTAPI_ENV=development +# 是否DEBUG模式 - True:开启调试(详细错误日志),False:关闭 +FASTAPI_DEBUG=True +# 是否DEMO模式 - True:演示模式(限制写操作),False:正常模式 +FASTAPI_DEMO=True +# 应用文件上传路径 - 用户上传文件的物理存储目录 +# 默认取项目根目录下的 uploads +FASTAPI_UPLOAD_DIR=/data/apps/uploads +# 文件访问域名 - 文件资源的CDN/访问域名 +FASTAPI_FILE_URL='http://images.fastapi.elevue.djangoadmin.cn' + +# 允许上传的文件扩展名 - 逗号分隔,带点号 +# 生产环境务必配置,防止上传.py、.exe、.sh等危险文件 +UPLOAD_ALLOWED_EXTS=.jpg,.jpeg,.png,.gif,.bmp,.ico,.txt,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.mp3,.mp4,.zip,.rar,.7z + +# 上传文件大小上限(MB)- 超过此大小将被拒绝上传 +UPLOAD_MAX_SIZE_MB=10 + + +# ============================================================ +# 数据库配置 +# ============================================================ + +# 数据库驱动 - 可选 mysql/postgresql/mssql/oracle/sqlite +# 示例: +# MySQL: DB_DRIVER=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=*** +# PostgreSQL: DB_DRIVER=postgresql DB_HOST=127.0.0.1 DB_PORT=5432 DB_USERNAME=postgres DB_PASSWORD=*** +# SQL Server: DB_DRIVER=mssql DB_HOST=127.0.0.1 DB_PORT=1433 DB_USERNAME=sa DB_PASSWORD=*** +# Oracle: DB_DRIVER=oracle DB_HOST=127.0.0.1 DB_PORT=1521 DB_USERNAME= DB_PASSWORD=*** +# (DB_DATABASE 即服务名 service_name,schema 是连接用户) +# SQLite: DB_DRIVER=sqlite DB_DATABASE=dev.db(DB_DATABASE 即数据库文件完整路径) +DB_DRIVER='mysql' +# 数据库地址 - 数据库服务器IP或域名(sqlite 时忽略) +DB_HOST='127.0.0.1' +# 数据库端口 - MySQL:3306 / PostgreSQL:5432 / SQL Server:1433 / Oracle:1521 +DB_PORT=3308 +# 数据库名称 - 要连接的数据库名;Oracle 时即服务名 service_name;SQLite 时作为数据库文件路径 +DB_DATABASE='djangoadmin.fastapi.elevue' +# 数据库账号 - 连接数据库的用户名(sqlite 时忽略) +DB_USERNAME='root' +# 数据库密码 - 连接数据库的密码(sqlite 时忽略) +DB_PASSWORD='root' +# 数据表前缀 - 所有数据表统一前缀 +DB_PREFIX='fastapi_' +# 是否开启调试模式 - True:输出SQL执行日志,False:不输出 +DB_DEBUG=True + + +# ============================================================ +# 缓存配置 +# ============================================================ + +# 缓存服务地址 - Redis服务器IP或域名 +REDIS_HOST='127.0.0.1' +# 缓存服务端口 - Redis默认端口6379 +REDIS_PORT=6379 +# 缓存服务密码 - Redis认证密码(REDIS_AUTH为True时生效) +REDIS_PASSWORD="123456" +# 缓存库索引 - Redis数据库编号(0-15) +REDIS_INDEX=0 +# 是否启用用户认证 - True:需要密码验证,False:无需验证 +REDIS_AUTH=True +# 是否自动解码响应 - True:返回字符串,False:返回字节数据 +REDIS_DECODE_RESPONSES=True + + +# ============================================================ +# JWT令牌配置 +# ============================================================ + +# JWT密钥 - 用于令牌签名和验证,至少32字节,务必使用强随机密钥 +# 生成方式:python -c "import secrets; print(secrets.token_urlsafe(48))" +JWT_SALT='VHMlRyV000Tx8xbGtV7k0JG7RhRPE90_oPmUU3c2IzG_3B1ApWIJt1LGLWe83vOG' + +# JWT令牌过期时间(分钟)- 默认20分钟 +JWT_EXPIRE_MINUTES=20 + +# 登录失败次数上限 - 同一IP+用户名连续失败超过此次数后锁定 +LOGIN_FAIL_MAX=5 +# 登录锁定时间(秒)- 锁定期间禁止该IP+用户名登录 +LOGIN_LOCK_SECONDS=300 + + +# ============================================================ +# 验证码配置 +# ============================================================ + +# 验证码字符长度(4-6位) +CAPTCHA_LENGTH=6 +# 验证码过期时间(秒),默认5分钟 +CAPTCHA_EXPIRE=300 +# 验证码防刷窗口期(秒) +CAPTCHA_RATE_WINDOW=60 +# 验证码防刷上限(窗口期内最大获取次数) +CAPTCHA_RATE_LIMIT=10 +# 验证码字符集(去除易混淆字符) +CAPTCHA_CHARS=ABCDEFGHJKLMNPQRSTUVWXYZ2346789 +# 验证码字体路径 +CAPTCHA_FONT_PATH=static/fonts/Vera.ttf +# 验证码图片宽度(像素) +CAPTCHA_IMAGE_WIDTH=160 +# 验证码图片高度(像素) +CAPTCHA_IMAGE_HEIGHT=50 +# 验证码字体大小 +CAPTCHA_FONT_SIZE=28 +# 干扰线数量 +CAPTCHA_NOISE_LINES=6 +# 噪点数量 +CAPTCHA_NOISE_DOTS=30 + + +# ============================================================ +# CORS 与代理配置 +# ============================================================ + +# CORS允许的源 - 逗号分隔 +CORS_ALLOWED_ORIGINS=http://localhost:8001 + +# 可信代理层数 - 0=不信任X-Forwarded-For,>=1 表示在反向代理后 +TRUSTED_PROXY_COUNT=0 + + +# ============================================================ +# 邮件配置 +# ============================================================ + +# 邮件传输代理 +MAIL_MAILER='smtp' +# 邮件服务地址 +MAIL_SERVER='smtp.163.com' +# 邮件服务端口 +MAIL_PORT=465 +# 是否启用SSL加密 +MAIL_USE_SSL=True +# 授权邮箱用户名 +MAIL_USERNAME='' +# 授权邮箱授权码 +MAIL_PASSWORD='' +# 邮件加密串 +MAIL_ENCRYPTION='' +# 邮件发件人名称 +MAIL_FROM_NAME='' +# 邮件发件人地址 +MAIL_FROM_ADDRESS='' + + +# ============================================================ +# 短信配置 +# ============================================================ + +# 短信服务地址 +SMS_URL='' +# 短信服务API密钥 +SMS_API_KEY='' +# 短信签名 +SMS_SIGN='' +# 短信模板ID +SMS_TEMPLATE_ID='' + + +# ============================================================ +# 请求限流(可选,默认关闭) +# ============================================================ + +# 是否启用请求级 IP 限流中间件 +# RATE_LIMIT_ENABLED=False +# 单窗口内每个 IP 最大请求数 +# RATE_LIMIT_LIMIT=100 +# 统计窗口时长(秒) +# RATE_LIMIT_WINDOW_SECONDS=60 +# Redis 计数 key 前缀 +# RATE_LIMIT_KEY_PREFIX=rl: \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6d76268..b4381b2 100644 --- a/.gitignore +++ b/.gitignore @@ -22,9 +22,9 @@ evui/ document/* !document/数据库迁移_runbook.md # ---- DjangoAdmin refactor additions ---- -.env -.env.* -!.env.example +#.env +#.env.* +#!.env.example __pycache__/ *.py[cod] .pytest_cache/ diff --git a/.jenkins/.env.yml b/.jenkins/.env.yml new file mode 100644 index 0000000..a17137b --- /dev/null +++ b/.jenkins/.env.yml @@ -0,0 +1,16 @@ +masterProfiles: ['','uat','prod'] +Profiles: ['','dev'] +jobConfigFile: "djangoadminConfig.yml" +npmCompileCMD: | + export PATH=/usr/local/node/bin:$PATH + set -e \ + && yarn config set registry https://registry.npmmirror.com \ + && yarn config get registry \ + && yarn config set strict-ssl false \ + && yarn config set sass_binary_site https://repo.huaweicloud.com/node-sass/node-sass \ + && rm -rf package-lock.json \ + && rm -rf node_modules/.cache 2>/dev/null || true \ + && yarn cache clean --force \ + && yarn global add node-gyp@10.3.1 \ + && yarn install --unsafe-perm --legacy-peer-deps --network-timeout 300000 \ + && yarn run build:${PROFILE} \ No newline at end of file diff --git a/ui/.env b/ui/.env new file mode 100644 index 0000000..3cb03d8 --- /dev/null +++ b/ui/.env @@ -0,0 +1,11 @@ +# port +VITE_PORT = 8001 + +# spa-title +VITE_GLOB_APP_TITLE = FastAPI+ElementPlus版 + +# spa shortname +VITE_GLOB_APP_SHORT_NAME = DjangoAdmin + +# 生产环境 开启mock +VITE_GLOB_PROD_MOCK = false diff --git a/ui/.env.dev b/ui/.env.dev new file mode 100644 index 0000000..dd2304d --- /dev/null +++ b/ui/.env.dev @@ -0,0 +1,32 @@ +# 只在开发模式中被载入 +VITE_PORT = 8001 + +# 网站根目录 +VITE_PUBLIC_PATH = / + +# 是否开启mock +VITE_USE_MOCK = false + +# 是否删除console +VITE_DROP_CONSOLE = true + +# 跨域代理,可以配置多个,请注意不要换行 +VITE_PROXY=[["/api","http://192.168.124.127:9010/api"]] + +# API 接口地址 +VITE_GLOB_API_URL = + +# 图片上传地址 +VITE_GLOB_UPLOAD_URL= + +# 图片前缀地址 +VITE_GLOB_IMG_URL= +# 是否启用gzip压缩或brotli压缩 +# 可选: gzip | brotli | none +# 如果你需要多种形式,你可以用','来分隔 +VITE_BUILD_COMPRESS = 'none' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false +# 接口前缀 +VITE_GLOB_API_URL_PREFIX = /api diff --git a/ui/.env.development b/ui/.env.development new file mode 100644 index 0000000..8df6148 --- /dev/null +++ b/ui/.env.development @@ -0,0 +1,32 @@ +# 只在开发模式中被载入 +VITE_PORT = 8001 + +# 网站根目录 +VITE_PUBLIC_PATH = / + +# 是否开启mock +VITE_USE_MOCK = false + +# 是否删除console +VITE_DROP_CONSOLE = true + +# 跨域代理,可以配置多个,请注意不要换行 +VITE_PROXY=[["/api", "http://127.0.0.1:8031/api/v1"]] + +# API 接口地址 +VITE_GLOB_API_URL = + +# 图片上传地址 +VITE_GLOB_UPLOAD_URL= + +# 图片前缀地址 +VITE_GLOB_IMG_URL= +# 是否启用gzip压缩或brotli压缩 +# 可选: gzip | brotli | none +# 如果你需要多种形式,你可以用','来分隔 +VITE_BUILD_COMPRESS = 'none' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false +# 接口前缀 +VITE_GLOB_API_URL_PREFIX = /api diff --git a/ui/.env.production b/ui/.env.production new file mode 100644 index 0000000..68a2f06 --- /dev/null +++ b/ui/.env.production @@ -0,0 +1,28 @@ +# 是否开启mock +VITE_USE_MOCK = false + +# 网站根目录 +VITE_PUBLIC_PATH = / + +# 是否删除console +VITE_DROP_CONSOLE = true + +# API +VITE_GLOB_API_URL = + +# 图片上传地址 +VITE_GLOB_UPLOAD_URL= + +# 图片前缀地址 +VITE_GLOB_IMG_URL= + +# 接口前缀 +VITE_GLOB_API_URL_PREFIX = /api + +# 是否启用gzip压缩或brotli压缩 +# 可选: gzip | brotli | none +# 如果你需要多种形式,你可以用','来分隔 +VITE_BUILD_COMPRESS = 'none' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false diff --git a/ui/.env.test b/ui/.env.test new file mode 100644 index 0000000..3fc6928 --- /dev/null +++ b/ui/.env.test @@ -0,0 +1,31 @@ +# 是否开启mock +VITE_USE_MOCK = false + +# 网站根目录 +VITE_PUBLIC_PATH = / + +# 网站前缀 +VITE_BASE_URL = / + +# 是否删除console +VITE_DROP_CONSOLE = true + +# API +VITE_GLOB_API_URL = + +# 图片上传地址 +VITE_GLOB_UPLOAD_URL = + +# 图片前缀地址 +VITE_GLOB_IMG_URL = + +# 接口前缀 +VITE_GLOB_API_URL_PREFIX = /api + +# 是否启用gzip压缩或brotli压缩 +# 可选: gzip | brotli | none +# 如果你需要多种形式,你可以用','来分隔 +VITE_BUILD_COMPRESS = 'none' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false diff --git a/ui/.env.uat b/ui/.env.uat new file mode 100644 index 0000000..3fc6928 --- /dev/null +++ b/ui/.env.uat @@ -0,0 +1,31 @@ +# 是否开启mock +VITE_USE_MOCK = false + +# 网站根目录 +VITE_PUBLIC_PATH = / + +# 网站前缀 +VITE_BASE_URL = / + +# 是否删除console +VITE_DROP_CONSOLE = true + +# API +VITE_GLOB_API_URL = + +# 图片上传地址 +VITE_GLOB_UPLOAD_URL = + +# 图片前缀地址 +VITE_GLOB_IMG_URL = + +# 接口前缀 +VITE_GLOB_API_URL_PREFIX = /api + +# 是否启用gzip压缩或brotli压缩 +# 可选: gzip | brotli | none +# 如果你需要多种形式,你可以用','来分隔 +VITE_BUILD_COMPRESS = 'none' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false