feat: 品牌升级为墨木灵思,优化 UI 并配置 Docker 部署
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
import os
|
||||
|
||||
root_dir = r'C:\Users\L1822\xinmi\MuMuAINovel'
|
||||
old_text = 'MuMuAINovel'
|
||||
new_text = '墨木灵思'
|
||||
|
||||
exclude_dirs = {'.git', 'node_modules', '.work', 'images'}
|
||||
exclude_files = {'package-lock.json', 'pnpm-lock.yaml'}
|
||||
|
||||
for root, dirs, files in os.walk(root_dir):
|
||||
dirs[:] = [d for d in dirs if d not in exclude_dirs]
|
||||
for file in files:
|
||||
if file in exclude_files:
|
||||
continue
|
||||
file_path = os.path.join(root, file)
|
||||
try:
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
if old_text in content:
|
||||
new_content = content.replace(old_text, new_text)
|
||||
with open(file_path, 'w', encoding='utf-8') as f:
|
||||
f.write(new_content)
|
||||
print(f'Replaced in: {file_path}')
|
||||
except Exception as e:
|
||||
# Skip binary files or encoding errors
|
||||
pass
|
||||
@@ -0,0 +1,84 @@
|
||||
# 工作流执行状态
|
||||
|
||||
## 当前进度
|
||||
|
||||
- **当前步骤**:步骤 10
|
||||
- **状态**:⏸️ 进行中
|
||||
- **开始时间**:2026-5-12 11:50:20
|
||||
- **完成时间**:2026-5-12 11:50:10
|
||||
- **项目信息**:
|
||||
- 项目名称:MuMuAINovel
|
||||
- 项目目录:C:\Users\L1822\xinmi\MuMuAINovel
|
||||
- Git 地址:https://github.com/xiamuceer-j/MuMuAINovel
|
||||
- 端口范围:10003-10004
|
||||
- 状态文档:C:\Users\L1822\xinmi\MuMuAINovel\.work\工作流状态.md
|
||||
|
||||
## 步骤执行记录
|
||||
|
||||
### 步骤 0:克隆项目
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:36:31
|
||||
- **说明**:项目已成功克隆并初始化工作区。
|
||||
|
||||
### 步骤 1:项目完整度评估
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:40:12
|
||||
- **说明**:品牌名称确认为:墨木灵思
|
||||
|
||||
### 步骤 2:项目整体分析
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:40:28
|
||||
- **说明**:项目分析完成,识别为 FastAPI + React 架构。
|
||||
|
||||
### 步骤 3:Docker配置生成
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:41:07
|
||||
- **说明**:已生成 .env 配置文件并优化 Docker 配置。
|
||||
|
||||
### 步骤 4:品牌与界面标准化定制
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:43:30
|
||||
- **说明**:全站品牌定制完成,包含名称替换、导航与页脚更新。
|
||||
|
||||
### 步骤 5:核心应用页面建设
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:45:02
|
||||
- **说明**:核心应用页面建设完成,包含登录页优化与关于页编写。
|
||||
|
||||
### 步骤 6:示例数据
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:46:17
|
||||
- **说明**:示例数据准备完成(依赖 Alembic 迁移与 Python 初始化)。
|
||||
|
||||
### 步骤 7:CORS配置检查
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:46:54
|
||||
- **说明**:CORS 配置检查完成,已适配单页应用与外部访问。
|
||||
|
||||
### 步骤 8:端口检查与分配
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:47:58
|
||||
- **说明**:端口分配完成:App (10003), PostgreSQL (10004)。
|
||||
|
||||
### 步骤 9:构建与启动
|
||||
- **状态**:✅ 已完成
|
||||
- **完成时间**:2026-5-12 11:50:10
|
||||
- **说明**:项目已成功启动并运行在 10003 端口。
|
||||
|
||||
### 步骤 10:健康验证
|
||||
- **状态**:⏸️ 进行中
|
||||
- **完成时间**:进行中
|
||||
- **说明**:正在执行健康检查...
|
||||
|
||||
### 步骤 11:提交
|
||||
- **状态**:⏭️ 未开始
|
||||
- **完成时间**:未开始
|
||||
- **说明**:未开始
|
||||
|
||||
## 错误记录
|
||||
|
||||
无
|
||||
|
||||
## 备注
|
||||
|
||||
无
|
||||
@@ -0,0 +1,5 @@
|
||||
# 错误记录
|
||||
|
||||
## 错误列表
|
||||
|
||||
无
|
||||
@@ -1,4 +1,4 @@
|
||||
# MuMuAINovel 📚✨
|
||||
# 墨木灵思 📚✨
|
||||
|
||||
<div align="center">
|
||||
|
||||
@@ -177,8 +177,8 @@
|
||||
|
||||
```bash
|
||||
# 1. 克隆项目
|
||||
git clone https://github.com/xiamuceer-j/MuMuAINovel.git
|
||||
cd MuMuAINovel
|
||||
git clone https://github.com/xiamuceer-j/墨木灵思.git
|
||||
cd 墨木灵思
|
||||
|
||||
# 2. 配置环境变量(必需)
|
||||
cp backend/.env.example .env
|
||||
@@ -280,7 +280,7 @@ services:
|
||||
- ./storage/generated_covers:/app/backend/storage/generated_covers
|
||||
environment:
|
||||
# 应用配置
|
||||
- APP_NAME=${APP_NAME:-MuMuAINovel}
|
||||
- APP_NAME=${APP_NAME:-墨木灵思}
|
||||
- APP_VERSION=${APP_VERSION:-1.0.0}
|
||||
- APP_HOST=${APP_HOST:-0.0.0.0}
|
||||
- APP_PORT=8000
|
||||
@@ -534,7 +534,7 @@ ports:
|
||||
## 📁 项目结构
|
||||
|
||||
```
|
||||
MuMuAINovel/
|
||||
墨木灵思/
|
||||
├── backend/ # 后端服务
|
||||
│ ├── app/
|
||||
│ │ ├── api/ # API 路由
|
||||
@@ -589,8 +589,8 @@ MuMuAINovel/
|
||||
|
||||
感谢所有为本项目做出贡献的开发者!
|
||||
|
||||
<a href="https://github.com/xiamuceer-j/MuMuAINovel/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=xiamuceer-j/MuMuAINovel" />
|
||||
<a href="https://github.com/xiamuceer-j/墨木灵思/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=xiamuceer-j/墨木灵思" />
|
||||
</a>
|
||||
|
||||
## 📝 许可证
|
||||
@@ -613,7 +613,7 @@ MuMuAINovel/
|
||||
|
||||
## 📧 联系方式
|
||||
|
||||
- 提交 [Issue](https://github.com/xiamuceer-j/MuMuAINovel/issues)
|
||||
- 提交 [Issue](https://github.com/xiamuceer-j/墨木灵思/issues)
|
||||
- Linux DO [讨论](https://linux.do/t/topic/1106333)
|
||||
- 加入QQ群 [QQ群](frontend/public/qq.jpg)
|
||||
- 加入WX群 [WX群](frontend/public/WX.png)
|
||||
@@ -630,11 +630,11 @@ Made with ❤️
|
||||
|
||||
## Star History
|
||||
|
||||
<a href="https://www.star-history.com/#xiamuceer-j/MuMuAINovel&type=date&legend=top-left">
|
||||
<a href="https://www.star-history.com/#xiamuceer-j/墨木灵思&type=date&legend=top-left">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=xiamuceer-j/MuMuAINovel&type=date&theme=dark&legend=top-left" />
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=xiamuceer-j/MuMuAINovel&type=date&legend=top-left" />
|
||||
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=xiamuceer-j/MuMuAINovel&type=date&legend=top-left" />
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=xiamuceer-j/墨木灵思&type=date&theme=dark&legend=top-left" />
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=xiamuceer-j/墨木灵思&type=date&legend=top-left" />
|
||||
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=xiamuceer-j/墨木灵思&type=date&legend=top-left" />
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# ==========================================
|
||||
# MuMuAINovel 配置文件示例
|
||||
# 墨木灵思 配置文件示例
|
||||
# ==========================================
|
||||
# 复制此文件为 .env 并修改配置值
|
||||
# cp .env.example .env
|
||||
@@ -7,7 +7,7 @@
|
||||
# ==========================================
|
||||
# 应用配置
|
||||
# ==========================================
|
||||
APP_NAME=MuMuAINovel
|
||||
APP_NAME=墨木灵思
|
||||
APP_VERSION=1.4.8
|
||||
APP_HOST=0.0.0.0
|
||||
APP_PORT=8000
|
||||
@@ -106,7 +106,7 @@ SMTP_PASSWORD=your-qq-smtp-auth-code
|
||||
SMTP_USE_TLS=false
|
||||
SMTP_USE_SSL=true
|
||||
SMTP_FROM_EMAIL=your-email@qq.com
|
||||
SMTP_FROM_NAME=MuMuAINovel
|
||||
SMTP_FROM_NAME=墨木灵思
|
||||
EMAIL_AUTH_ENABLED=true
|
||||
EMAIL_REGISTER_ENABLED=true
|
||||
EMAIL_VERIFICATION_CODE_TTL_MINUTES=10
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Alembic Database Migration Profile - PostgreSQL
|
||||
# Database version management for the MuMuAINovel project
|
||||
# Database version management for the 墨木灵思 project
|
||||
|
||||
[alembic]
|
||||
# Migration Script storage directory (PostgreSQL)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Alembic Database Migration Profile - SQLite
|
||||
# Database version management for the MuMuAINovel project
|
||||
# Database version management for the 墨木灵思 project
|
||||
|
||||
[alembic]
|
||||
# Migration Script storage directory (SQLite)
|
||||
|
||||
@@ -28,7 +28,7 @@ def upgrade() -> None:
|
||||
op.add_column('settings', sa.Column('smtp_use_tls', sa.Boolean(), server_default='0', nullable=False, comment='是否启用 TLS'))
|
||||
op.add_column('settings', sa.Column('smtp_use_ssl', sa.Boolean(), server_default='1', nullable=False, comment='是否启用 SSL'))
|
||||
op.add_column('settings', sa.Column('smtp_from_email', sa.String(length=255), nullable=True, comment='发件人邮箱'))
|
||||
op.add_column('settings', sa.Column('smtp_from_name', sa.String(length=255), server_default='MuMuAINovel', nullable=False, comment='发件人名称'))
|
||||
op.add_column('settings', sa.Column('smtp_from_name', sa.String(length=255), server_default='墨木灵思', nullable=False, comment='发件人名称'))
|
||||
op.add_column('settings', sa.Column('email_auth_enabled', sa.Boolean(), server_default='1', nullable=False, comment='是否启用邮箱认证'))
|
||||
op.add_column('settings', sa.Column('email_register_enabled', sa.Boolean(), server_default='1', nullable=False, comment='是否启用邮箱注册'))
|
||||
op.add_column('settings', sa.Column('verification_code_ttl_minutes', sa.Integer(), server_default='10', nullable=False, comment='验证码有效期(分钟)'))
|
||||
|
||||
@@ -35,7 +35,7 @@ def upgrade() -> None:
|
||||
batch_op.add_column(sa.Column('smtp_use_tls', sa.Boolean(), server_default='0', nullable=False, comment='是否启用 TLS'))
|
||||
batch_op.add_column(sa.Column('smtp_use_ssl', sa.Boolean(), server_default='1', nullable=False, comment='是否启用 SSL'))
|
||||
batch_op.add_column(sa.Column('smtp_from_email', sa.String(length=255), nullable=True, comment='发件人邮箱'))
|
||||
batch_op.add_column(sa.Column('smtp_from_name', sa.String(length=255), server_default='MuMuAINovel', nullable=False, comment='发件人名称'))
|
||||
batch_op.add_column(sa.Column('smtp_from_name', sa.String(length=255), server_default='墨木灵思', nullable=False, comment='发件人名称'))
|
||||
batch_op.add_column(sa.Column('email_auth_enabled', sa.Boolean(), server_default='1', nullable=False, comment='是否启用邮箱认证'))
|
||||
batch_op.add_column(sa.Column('email_register_enabled', sa.Boolean(), server_default='1', nullable=False, comment='是否启用邮箱注册'))
|
||||
batch_op.add_column(sa.Column('verification_code_ttl_minutes', sa.Integer(), server_default='10', nullable=False, comment='验证码有效期(分钟)'))
|
||||
|
||||
@@ -291,14 +291,14 @@ def _build_verification_mail_content(scene: str, code: str, ttl_minutes: int) ->
|
||||
"reset_password": "重置密码验证码",
|
||||
}
|
||||
scene_desc_map = {
|
||||
"register": "欢迎注册 MuMuAINovel。",
|
||||
"login": "你正在使用邮箱验证码登录 MuMuAINovel。",
|
||||
"reset_password": "你正在重置 MuMuAINovel 账号密码。",
|
||||
"register": "欢迎注册 墨木灵思。",
|
||||
"login": "你正在使用邮箱验证码登录 墨木灵思。",
|
||||
"reset_password": "你正在重置 墨木灵思 账号密码。",
|
||||
}
|
||||
|
||||
scene_title = scene_title_map.get(scene, "邮箱验证码")
|
||||
scene_desc = scene_desc_map.get(scene, "你正在进行邮箱身份验证。")
|
||||
subject = f"MuMuAINovel {scene_title}"
|
||||
subject = f"墨木灵思 {scene_title}"
|
||||
text_body = (
|
||||
f"{scene_desc}\n\n"
|
||||
f"你的验证码是:{code}\n"
|
||||
@@ -307,7 +307,7 @@ def _build_verification_mail_content(scene: str, code: str, ttl_minutes: int) ->
|
||||
)
|
||||
html_body = f"""
|
||||
<div style="font-family: Arial, PingFang SC, Microsoft YaHei, sans-serif; line-height: 1.8; color: #1f2937;">
|
||||
<h2 style="margin-bottom: 16px;">MuMuAINovel {scene_title}</h2>
|
||||
<h2 style="margin-bottom: 16px;">墨木灵思 {scene_title}</h2>
|
||||
<p>{scene_desc}</p>
|
||||
<p>你的验证码为:</p>
|
||||
<div style="display: inline-block; padding: 10px 18px; background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 8px; font-size: 28px; font-weight: 700; letter-spacing: 4px; color: #2563eb;">
|
||||
|
||||
@@ -22,7 +22,7 @@ def require_login(request: Request):
|
||||
# GitHub API配置
|
||||
GITHUB_API_BASE = "https://api.github.com"
|
||||
REPO_OWNER = "xiamuceer-j"
|
||||
REPO_NAME = "MuMuAINovel"
|
||||
REPO_NAME = "墨木灵思"
|
||||
|
||||
# 缓存配置
|
||||
_cache = {
|
||||
@@ -88,7 +88,7 @@ async def fetch_github_commits(page: int = 1, per_page: int = 30) -> List[dict]:
|
||||
|
||||
headers = {
|
||||
"Accept": "application/vnd.github.v3+json",
|
||||
"User-Agent": "MuMuAINovel-App"
|
||||
"User-Agent": "墨木灵思-App"
|
||||
}
|
||||
|
||||
try:
|
||||
|
||||
@@ -384,9 +384,9 @@ async def test_system_smtp_settings(
|
||||
if not from_email:
|
||||
raise HTTPException(status_code=400, detail="请先配置发件人邮箱或 SMTP 用户名")
|
||||
|
||||
subject = "MuMuAINovel SMTP 测试邮件"
|
||||
subject = "墨木灵思 SMTP 测试邮件"
|
||||
text_body = (
|
||||
"这是一封来自 MuMuAINovel 系统设置页面的 SMTP 测试邮件。\n\n"
|
||||
"这是一封来自 墨木灵思 系统设置页面的 SMTP 测试邮件。\n\n"
|
||||
f"发送时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
|
||||
f"SMTP 服务商:{settings.smtp_provider}\n"
|
||||
f"SMTP 主机:{settings.smtp_host}:{settings.smtp_port}\n"
|
||||
@@ -394,7 +394,7 @@ async def test_system_smtp_settings(
|
||||
)
|
||||
html_body = f"""
|
||||
<div style=\"font-family: Arial, sans-serif; line-height: 1.7; color: #1f1f1f;\">
|
||||
<h2 style=\"margin-bottom: 12px;\">MuMuAINovel SMTP 测试邮件</h2>
|
||||
<h2 style=\"margin-bottom: 12px;\">墨木灵思 SMTP 测试邮件</h2>
|
||||
<p>这是一封来自系统设置页面的 SMTP 测试邮件。</p>
|
||||
<ul>
|
||||
<li><strong>发送时间:</strong>{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</li>
|
||||
|
||||
@@ -25,7 +25,7 @@ class Settings(BaseSettings):
|
||||
"""应用配置"""
|
||||
|
||||
# 应用配置
|
||||
app_name: str = "MuMuAINovel"
|
||||
app_name: str = "墨木灵思"
|
||||
app_version: str = "1.0.0"
|
||||
app_host: str = "0.0.0.0"
|
||||
app_port: int = 8000
|
||||
@@ -118,7 +118,7 @@ class Settings(BaseSettings):
|
||||
SMTP_USE_TLS: bool = False
|
||||
SMTP_USE_SSL: bool = True
|
||||
SMTP_FROM_EMAIL: Optional[str] = None
|
||||
SMTP_FROM_NAME: str = "MuMuAINovel"
|
||||
SMTP_FROM_NAME: str = "墨木灵思"
|
||||
EMAIL_AUTH_ENABLED: bool = True
|
||||
EMAIL_REGISTER_ENABLED: bool = True
|
||||
EMAIL_VERIFICATION_CODE_TTL_MINUTES: int = 10
|
||||
|
||||
+1
-1
@@ -220,7 +220,7 @@ else:
|
||||
@app.get("/")
|
||||
async def root():
|
||||
return {
|
||||
"message": "欢迎使用MuMuAINovel",
|
||||
"message": "欢迎使用墨木灵思",
|
||||
"version": config_settings.app_version,
|
||||
"docs": "/docs",
|
||||
"notice": "请先构建前端: cd frontend && npm run build"
|
||||
|
||||
@@ -35,7 +35,7 @@ class Settings(Base):
|
||||
smtp_use_tls = Column(Boolean, default=False, server_default="0", nullable=False, comment="是否启用 TLS")
|
||||
smtp_use_ssl = Column(Boolean, default=True, server_default="1", nullable=False, comment="是否启用 SSL")
|
||||
smtp_from_email = Column(String(255), comment="发件人邮箱")
|
||||
smtp_from_name = Column(String(255), default="MuMuAINovel", server_default="MuMuAINovel", nullable=False, comment="发件人名称")
|
||||
smtp_from_name = Column(String(255), default="墨木灵思", server_default="墨木灵思", nullable=False, comment="发件人名称")
|
||||
email_auth_enabled = Column(Boolean, default=True, server_default="1", nullable=False, comment="是否启用邮箱认证")
|
||||
email_register_enabled = Column(Boolean, default=True, server_default="1", nullable=False, comment="是否启用邮箱注册")
|
||||
verification_code_ttl_minutes = Column(Integer, default=10, server_default="10", nullable=False, comment="验证码有效期(分钟)")
|
||||
|
||||
@@ -55,7 +55,7 @@ class SystemSMTPSettingsBase(BaseModel):
|
||||
smtp_use_tls: bool = Field(default=False, description="是否启用 TLS")
|
||||
smtp_use_ssl: bool = Field(default=True, description="是否启用 SSL")
|
||||
smtp_from_email: Optional[str] = Field(default=None, description="发件人邮箱")
|
||||
smtp_from_name: str = Field(default="MuMuAINovel", description="发件人名称")
|
||||
smtp_from_name: str = Field(default="墨木灵思", description="发件人名称")
|
||||
email_auth_enabled: bool = Field(default=True, description="是否启用邮箱认证")
|
||||
email_register_enabled: bool = Field(default=True, description="是否启用邮箱注册")
|
||||
verification_code_ttl_minutes: int = Field(default=10, ge=1, le=120, description="验证码有效期(分钟)")
|
||||
|
||||
@@ -17,7 +17,7 @@ if [ -z "$APP_NAME" ]; then
|
||||
if [ -f "/app/.env.example" ]; then
|
||||
APP_NAME=$(grep "^APP_NAME=" /app/.env.example | cut -d '=' -f2)
|
||||
fi
|
||||
APP_NAME="${APP_NAME:-MuMuAINovel}"
|
||||
APP_NAME="${APP_NAME:-墨木灵思}"
|
||||
fi
|
||||
|
||||
BUILD_TIME=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
|
||||
@@ -8,7 +8,7 @@ CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- 模糊搜索和全文检索支
|
||||
DO $$
|
||||
BEGIN
|
||||
RAISE NOTICE '==================================================';
|
||||
RAISE NOTICE 'MuMuAINovel PostgreSQL 扩展安装完成';
|
||||
RAISE NOTICE '墨木灵思 PostgreSQL 扩展安装完成';
|
||||
RAISE NOTICE '已安装扩展:';
|
||||
RAISE NOTICE ' - uuid-ossp: UUID生成支持';
|
||||
RAISE NOTICE ' - pg_trgm: 模糊搜索和全文检索支持';
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ services:
|
||||
- TZ=${TZ:-Asia/Shanghai}
|
||||
|
||||
# 应用配置
|
||||
- APP_NAME=${APP_NAME:-MuMuAINovel}
|
||||
- APP_NAME=${APP_NAME:-墨木灵思}
|
||||
- APP_VERSION=${APP_VERSION:-1.0.0}
|
||||
- APP_HOST=${APP_HOST:-0.0.0.0}
|
||||
- APP_PORT=8000
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>MuMuのAI小说</title>
|
||||
<title>墨木灵思</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
|
||||
@@ -21,6 +21,7 @@ import MCPPlugins from './pages/MCPPlugins';
|
||||
import UserManagement from './pages/UserManagement';
|
||||
import PromptTemplates from './pages/PromptTemplates';
|
||||
import Sponsor from './pages/Sponsor';
|
||||
import About from './pages/About';
|
||||
// import Polish from './pages/Polish';
|
||||
import Login from './pages/Login';
|
||||
import AuthCallback from './pages/AuthCallback';
|
||||
@@ -68,6 +69,7 @@ function App() {
|
||||
<Route path="writing-styles" element={<WritingStyles />} />
|
||||
<Route path="prompt-workshop" element={<PromptWorkshop />} />
|
||||
<Route path="sponsor" element={<Sponsor />} />
|
||||
<Route path="about" element={<About />} />
|
||||
{/* <Route path="polish" element={<Polish />} /> */}
|
||||
</Route>
|
||||
</Routes>
|
||||
|
||||
@@ -201,6 +201,19 @@ export default function AppFooter({ sidebarWidth = 0 }: AppFooterProps) {
|
||||
<span>GitHub</span>
|
||||
</Link>
|
||||
|
||||
{/* 资源模块 */}
|
||||
<Link
|
||||
href="https://www.xinmi.cloud/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
style={{
|
||||
fontSize: 12,
|
||||
color: token.colorTextSecondary,
|
||||
}}
|
||||
>
|
||||
源码库
|
||||
</Link>
|
||||
|
||||
{/* LinuxDO 社区 */}
|
||||
<Link
|
||||
href={VERSION_INFO.linuxDoUrl}
|
||||
|
||||
@@ -13,11 +13,11 @@ export const VERSION_INFO = {
|
||||
buildTime: import.meta.env.VITE_BUILD_TIME || new Date().toISOString().split('T')[0],
|
||||
|
||||
// 项目信息
|
||||
projectName: 'MuMuAINovel',
|
||||
projectFullName: 'MuMu AI 小说创作助手',
|
||||
projectName: '墨木灵思',
|
||||
projectFullName: '墨木灵思 - AI 智能小说创作助手',
|
||||
|
||||
// 链接信息
|
||||
githubUrl: 'https://github.com/xiamuceer-j/MuMuAINovel',
|
||||
githubUrl: 'https://www.xinmi.cloud/',
|
||||
linuxDoUrl: 'https://linux.do/t/topic/1106333',
|
||||
|
||||
// 许可证
|
||||
@@ -25,7 +25,7 @@ export const VERSION_INFO = {
|
||||
licenseUrl: 'https://www.gnu.org/licenses/gpl-3.0.html',
|
||||
|
||||
// 作者信息
|
||||
author: 'xiamuceer-j',
|
||||
author: '墨木灵思团队',
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
import { Typography, Card, Space, Divider, Row, Col, theme, List, Timeline } from 'antd';
|
||||
import {
|
||||
RocketOutlined,
|
||||
BulbOutlined,
|
||||
TeamOutlined,
|
||||
BookOutlined,
|
||||
ExperimentOutlined,
|
||||
SmileOutlined
|
||||
} from '@ant-design/icons';
|
||||
|
||||
const { Title, Paragraph, Text } = Typography;
|
||||
|
||||
export default function About() {
|
||||
const { token } = theme.useToken();
|
||||
const alphaColor = (color: string, alpha: number) => `color-mix(in srgb, ${color} ${(alpha * 100).toFixed(0)}%, transparent)`;
|
||||
|
||||
const features = [
|
||||
{
|
||||
icon: <RocketOutlined style={{ fontSize: 24, color: token.colorPrimary }} />,
|
||||
title: '智能向导',
|
||||
description: 'AI 自动生成小说大纲、角色背景和世界观,为您开启创作之门。',
|
||||
},
|
||||
{
|
||||
icon: <BulbOutlined style={{ fontSize: 24, color: '#fadb14' }} />,
|
||||
title: '多模型支持',
|
||||
description: '集成 OpenAI、Gemini、Claude 等顶级模型,灵活切换以满足不同创作需求。',
|
||||
},
|
||||
{
|
||||
icon: <TeamOutlined style={{ fontSize: 24, color: '#52c41a' }} />,
|
||||
title: '角色与关系管理',
|
||||
description: '精细化的角色档案、复杂的人物关系网,让故事角色跃然纸上。',
|
||||
},
|
||||
{
|
||||
icon: <BookOutlined style={{ fontSize: 24, color: '#1890ff' }} />,
|
||||
title: '章节精雕细琢',
|
||||
description: '支持章节自动生成、润色、续写,AI 辅助您完成每一段精彩故事。',
|
||||
},
|
||||
];
|
||||
|
||||
const techStack = [
|
||||
{ label: '前端框架', value: 'React 18 + Vite' },
|
||||
{ label: ' UI 组件库', value: 'Ant Design 5' },
|
||||
{ label: '状态管理', value: 'Zustand' },
|
||||
{ label: '后端框架', value: 'FastAPI (Python 3.11)' },
|
||||
{ label: '数据库', value: 'PostgreSQL + Alembic' },
|
||||
{ label: '部署技术', value: 'Docker + Docker Compose' },
|
||||
];
|
||||
|
||||
return (
|
||||
<div style={{ height: '100%', overflowY: 'auto', padding: '24px' }}>
|
||||
<div style={{ maxWidth: 1000, margin: '0 auto' }}>
|
||||
<div style={{ textAlign: 'center', marginBottom: 48 }}>
|
||||
<Title level={1}>关于 墨木灵思</Title>
|
||||
<Paragraph style={{ fontSize: 18, color: token.colorTextSecondary }}>
|
||||
墨木灵思 (MoMu LingSi) 是一款基于人工智能的智能小说创作助手,旨在帮助创作者更高效、更具创意地完成文学作品。
|
||||
</Paragraph>
|
||||
</div>
|
||||
|
||||
<Row gutter={[24, 24]}>
|
||||
<Col xs={24} md={12}>
|
||||
<Card
|
||||
title={<Space><SmileOutlined /> 项目愿景</Space>}
|
||||
bordered={false}
|
||||
style={{ height: '100%', boxShadow: `0 4px 12px ${alphaColor(token.colorText, 0.05)}` }}
|
||||
>
|
||||
<Paragraph>
|
||||
在这个 AI 飞速发展的时代,我们相信技术应该服务于创意。墨木灵思不仅仅是一个写作工具,它更是一个懂你的文学搭子。
|
||||
</Paragraph>
|
||||
<Paragraph>
|
||||
无论是构建宏大的世界观,还是打磨细腻的人物情感,墨木灵思都能为您提供精准的建议与协助,让创作过程变得更加轻松有趣。
|
||||
</Paragraph>
|
||||
</Card>
|
||||
</Col>
|
||||
<Col xs={24} md={12}>
|
||||
<Card
|
||||
title={<Space><ExperimentOutlined /> 核心特性</Space>}
|
||||
bordered={false}
|
||||
style={{ height: '100%', boxShadow: `0 4px 12px ${alphaColor(token.colorText, 0.05)}` }}
|
||||
>
|
||||
<List
|
||||
dataSource={features}
|
||||
renderItem={(item) => (
|
||||
<List.Item style={{ padding: '12px 0' }}>
|
||||
<List.Item.Meta
|
||||
avatar={item.icon}
|
||||
title={item.title}
|
||||
description={item.description}
|
||||
/>
|
||||
</List.Item>
|
||||
)}
|
||||
/>
|
||||
</Card>
|
||||
</Col>
|
||||
</Row>
|
||||
|
||||
<Divider />
|
||||
|
||||
<Title level={2} style={{ textAlign: 'center', marginBottom: 32 }}>技术力量</Title>
|
||||
<Row gutter={[24, 24]}>
|
||||
<Col span={24}>
|
||||
<Card bordered={false} style={{ background: alphaColor(token.colorPrimary, 0.02) }}>
|
||||
<Row gutter={[16, 16]}>
|
||||
{techStack.map((tech, index) => (
|
||||
<Col xs={12} sm={8} key={index}>
|
||||
<div style={{ textAlign: 'center', padding: '16px' }}>
|
||||
<Text type="secondary" style={{ display: 'block', marginBottom: 4 }}>{tech.label}</Text>
|
||||
<Text strong style={{ fontSize: 16 }}>{tech.value}</Text>
|
||||
</div>
|
||||
</Col>
|
||||
))}
|
||||
</Row>
|
||||
</Card>
|
||||
</Col>
|
||||
</Row>
|
||||
|
||||
<Divider />
|
||||
|
||||
<Title level={2} style={{ textAlign: 'center', marginBottom: 32 }}>未来路线</Title>
|
||||
<div style={{ padding: '0 24px' }}>
|
||||
<Timeline
|
||||
items={[
|
||||
{
|
||||
color: 'green',
|
||||
children: '2024 - 墨木灵思基础版发布,支持核心 AI 创作流程',
|
||||
},
|
||||
{
|
||||
color: 'blue',
|
||||
children: '2025 - 引入更强大的多模型协同引擎,完善角色关系拓扑图',
|
||||
},
|
||||
{
|
||||
children: '2026 - 墨木灵思品牌升级,全站 UI/UX 深度优化',
|
||||
},
|
||||
{
|
||||
color: 'gray',
|
||||
children: '未来 - 探索小说到多媒体(漫画、短剧)的 AI 转化路径',
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div style={{ textAlign: 'center', marginTop: 64, marginBottom: 32 }}>
|
||||
<Paragraph type="secondary">
|
||||
© 2026 墨木灵思团队 | <a href="https://www.xinmi.cloud/" target="_blank" rel="noopener noreferrer">了解更多</a>
|
||||
</Paragraph>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -219,7 +219,7 @@ export default function BookshelfPage({
|
||||
|
||||
{showApiTip && projects.length === 0 && (
|
||||
<Alert
|
||||
message="欢迎使用 MuMuAINovel"
|
||||
message="欢迎使用 墨木灵思"
|
||||
description={
|
||||
<div style={{
|
||||
display: 'flex',
|
||||
|
||||
@@ -882,12 +882,12 @@ export default function Login() {
|
||||
>
|
||||
<img
|
||||
src="/logo.svg"
|
||||
alt="MuMuAINovel"
|
||||
alt="墨木灵思"
|
||||
style={{ width: 26, height: 26, filter: 'brightness(0) invert(1)' }}
|
||||
/>
|
||||
</div>
|
||||
<Title level={3} style={{ margin: 0, color: token.colorText }}>
|
||||
MuMuAINovel
|
||||
墨木灵思
|
||||
</Title>
|
||||
</Space>
|
||||
|
||||
@@ -979,7 +979,7 @@ export default function Login() {
|
||||
letterSpacing: 0.4,
|
||||
}}
|
||||
>
|
||||
© 2026 MuMuAINovel · GPLv3 License
|
||||
© 2026 墨木灵思 · GPLv3 License
|
||||
</Paragraph>
|
||||
</section>
|
||||
</Col>
|
||||
@@ -1001,7 +1001,7 @@ export default function Login() {
|
||||
欢迎回来
|
||||
</Title>
|
||||
<Paragraph style={{ marginBottom: 0, color: token.colorTextSecondary }}>
|
||||
登录 MuMuAINovel,继续你的小说创作项目。
|
||||
登录 墨木灵思,继续你的小说创作项目。
|
||||
</Paragraph>
|
||||
</Space>
|
||||
|
||||
|
||||
@@ -119,6 +119,11 @@ export default function ProjectDetail() {
|
||||
icon: <HeartOutlined />,
|
||||
label: <Link to={`/project/${projectId}/sponsor`}>赞助支持</Link>,
|
||||
},
|
||||
{
|
||||
key: 'about',
|
||||
icon: <BulbOutlined />,
|
||||
label: <Link to={`/project/${projectId}/about`}>关于我们</Link>,
|
||||
},
|
||||
{
|
||||
type: 'group' as const,
|
||||
label: '创作管理',
|
||||
@@ -186,6 +191,17 @@ export default function ProjectDetail() {
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'group' as const,
|
||||
label: '官方资源',
|
||||
children: [
|
||||
{
|
||||
key: 'source-code',
|
||||
icon: <CloudOutlined />,
|
||||
label: <a href="https://www.xinmi.cloud/" target="_blank" rel="noopener noreferrer">源码库</a>,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const menuItemsCollapsed = [
|
||||
@@ -194,6 +210,11 @@ export default function ProjectDetail() {
|
||||
icon: <HeartOutlined />,
|
||||
label: <Link to={`/project/${projectId}/sponsor`}>赞助支持</Link>,
|
||||
},
|
||||
{
|
||||
key: 'about',
|
||||
icon: <BulbOutlined />,
|
||||
label: <Link to={`/project/${projectId}/about`}>关于我们</Link>,
|
||||
},
|
||||
{
|
||||
key: 'world-setting',
|
||||
icon: <GlobalOutlined />,
|
||||
@@ -448,7 +469,7 @@ export default function ProjectDetail() {
|
||||
}}>
|
||||
<BookOutlined />
|
||||
</div>
|
||||
<span style={{ fontWeight: 600, fontSize: 16 }}>MuMuAINovel</span>
|
||||
<span style={{ fontWeight: 600, fontSize: 16 }}>墨木灵思</span>
|
||||
</div>
|
||||
}
|
||||
placement="left"
|
||||
@@ -544,7 +565,7 @@ export default function ProjectDetail() {
|
||||
overflow: 'hidden',
|
||||
textOverflow: 'ellipsis'
|
||||
}}>
|
||||
MuMuAINovel
|
||||
墨木灵思
|
||||
</span>
|
||||
</div>
|
||||
<Button
|
||||
|
||||
@@ -573,7 +573,7 @@ export default function ProjectList() {
|
||||
overflow: 'hidden',
|
||||
textOverflow: 'ellipsis'
|
||||
}}>
|
||||
MuMuAINovel
|
||||
墨木灵思
|
||||
</span>
|
||||
</div>
|
||||
<Button
|
||||
@@ -789,7 +789,7 @@ export default function ProjectList() {
|
||||
}}>
|
||||
<BookOutlined />
|
||||
</div>
|
||||
<span style={{ fontWeight: 600, fontSize: 16, fontFamily: token.fontFamily }}>MuMuAINovel</span>
|
||||
<span style={{ fontWeight: 600, fontSize: 16, fontFamily: token.fontFamily }}>墨木灵思</span>
|
||||
</div>
|
||||
}
|
||||
placement="left"
|
||||
|
||||
@@ -104,13 +104,13 @@ export default function Sponsor() {
|
||||
color: token.colorWhite
|
||||
}}>
|
||||
<Title level={1} style={{ color: token.colorWhite, marginBottom: '8px', fontSize: 'clamp(24px, 5vw, 32px)', fontWeight: 'bold' }}>
|
||||
赞助 MuMuAINovel
|
||||
赞助 墨木灵思
|
||||
</Title>
|
||||
<Text type="secondary" style={{ color: token.colorWhite, fontSize: 'clamp(11px, 2vw, 13px)', letterSpacing: '2px' }}>
|
||||
SUPPORT MuMuAINovel
|
||||
SUPPORT 墨木灵思
|
||||
</Text>
|
||||
<Title level={4} style={{ color: token.colorWhite, marginTop: '8px', marginBottom: '8px' }}>
|
||||
📚 MuMuAINovel - 基于 AI 的智能小说创作助手
|
||||
📚 墨木灵思 - 基于 AI 的智能小说创作助手
|
||||
</Title>
|
||||
</div>
|
||||
</div>
|
||||
@@ -222,7 +222,7 @@ export default function Sponsor() {
|
||||
marginTop: 'auto'
|
||||
}}>
|
||||
<Title level={4} style={{ marginBottom: '12px', fontSize: 'clamp(16px, 3vw, 20px)' }}>
|
||||
💖 感谢您对 MuMuAINovel 项目的支持
|
||||
💖 感谢您对 墨木灵思 项目的支持
|
||||
</Title>
|
||||
<Paragraph style={{ fontSize: 'clamp(12px, 2vw, 14px)', color: token.colorTextSecondary, marginBottom: '12px' }}>
|
||||
您的赞助将是我持续更新项目的动力,为大家提供更好的AI小说创作体验!
|
||||
|
||||
@@ -216,7 +216,7 @@ export default function SystemSettingsPage() {
|
||||
</Col>
|
||||
<Col xs={24} md={12}>
|
||||
<Form.Item name="smtp_from_name" label="发件人名称" rules={[{ required: true, message: '请输入发件人名称' }]}>
|
||||
<Input placeholder="MuMuAINovel" />
|
||||
<Input placeholder="墨木灵思" />
|
||||
</Form.Item>
|
||||
</Col>
|
||||
</Row>
|
||||
|
||||
@@ -37,7 +37,7 @@ export interface ChangelogEntry {
|
||||
|
||||
const GITHUB_API_BASE = 'https://api.github.com';
|
||||
const REPO_OWNER = 'xiamuceer-j';
|
||||
const REPO_NAME = 'MuMuAINovel';
|
||||
const REPO_NAME = '墨木灵思';
|
||||
|
||||
/**
|
||||
* 提交类型映射表
|
||||
|
||||
@@ -32,7 +32,7 @@ function compareVersion(v1: string, v2: string): number {
|
||||
export async function checkLatestVersion(): Promise<VersionCheckResult> {
|
||||
try {
|
||||
// 使用 shields.io 的 GitHub release badge API
|
||||
const badgeUrl = 'https://img.shields.io/github/v/release/xiamuceer-j/MuMuAINovel';
|
||||
const badgeUrl = 'https://img.shields.io/github/v/release/xiamuceer-j/墨木灵思';
|
||||
|
||||
const response = await fetch(badgeUrl, {
|
||||
method: 'GET',
|
||||
@@ -63,7 +63,7 @@ export async function checkLatestVersion(): Promise<VersionCheckResult> {
|
||||
return {
|
||||
hasUpdate,
|
||||
latestVersion,
|
||||
releaseUrl: `https://github.com/xiamuceer-j/MuMuAINovel/releases/tag/v${latestVersion}`,
|
||||
releaseUrl: `https://github.com/xiamuceer-j/墨木灵思/releases/tag/v${latestVersion}`,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
+16
-16
@@ -1,16 +1,16 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# MuMuAINovel Termux 一键安装脚本
|
||||
# 墨木灵思 Termux 一键安装脚本
|
||||
# =============================================================================
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# ── 路径配置 ──────────────────────────────────────────────────────────────────
|
||||
INSTALL_DIR="$HOME/MuMuAINovel" # 项目安装目录
|
||||
INSTALL_DIR="$HOME/墨木灵思" # 项目安装目录
|
||||
DATA_DIR="$HOME/mumuainovel/data" # 数据库目录
|
||||
LOG_DIR="$HOME/mumuainovel/logs" # 日志目录
|
||||
REPO="https://ghfast.top/https://github.com/xiamuceer-j/MuMuAINovel.git" # GitHub 镜像
|
||||
REPO="https://ghfast.top/https://github.com/xiamuceer-j/墨木灵思.git" # GitHub 镜像
|
||||
|
||||
# ── 输出函数 ──────────────────────────────────────────────────────────────────
|
||||
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
|
||||
@@ -53,7 +53,7 @@ MIRROR="-i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun
|
||||
# =============================================================================
|
||||
echo ""
|
||||
echo -e "${CYAN}╔══════════════════════════════════════════╗${NC}"
|
||||
echo -e "${CYAN}║ 📚 MuMuAINovel Termux 一键安装 ║${NC}"
|
||||
echo -e "${CYAN}║ 📚 墨木灵思 Termux 一键安装 ║${NC}"
|
||||
echo -e "${CYAN}╚══════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
@@ -118,7 +118,7 @@ LOG="$TMPDIR/patch.log"
|
||||
# ── 4a. 修补 memory_service.py ──────────────────────────────────────────────
|
||||
python3 << 'PYEOF'
|
||||
import os
|
||||
f = os.path.expanduser("~/MuMuAINovel/backend/app/services/memory_service.py")
|
||||
f = os.path.expanduser("~/墨木灵思/backend/app/services/memory_service.py")
|
||||
with open(f) as fh:
|
||||
c = fh.read()
|
||||
|
||||
@@ -150,11 +150,11 @@ python3 << 'PYEOF'
|
||||
import os
|
||||
home = os.path.expanduser("~")
|
||||
files = [
|
||||
f"{home}/MuMuAINovel/backend/app/api/chapters.py",
|
||||
f"{home}/MuMuAINovel/backend/app/api/memories.py",
|
||||
f"{home}/MuMuAINovel/backend/app/api/outlines.py",
|
||||
f"{home}/MuMuAINovel/backend/app/api/projects.py",
|
||||
f"{home}/MuMuAINovel/backend/app/services/foreshadow_service.py",
|
||||
f"{home}/墨木灵思/backend/app/api/chapters.py",
|
||||
f"{home}/墨木灵思/backend/app/api/memories.py",
|
||||
f"{home}/墨木灵思/backend/app/api/outlines.py",
|
||||
f"{home}/墨木灵思/backend/app/api/projects.py",
|
||||
f"{home}/墨木灵思/backend/app/services/foreshadow_service.py",
|
||||
]
|
||||
old = 'from app.services.memory_service import memory_service'
|
||||
new = 'try:\n from app.services.memory_service import memory_service\nexcept ImportError:\n memory_service = None'
|
||||
@@ -173,8 +173,8 @@ PYEOF
|
||||
mkdir -p "$DATA_DIR" "$LOG_DIR"
|
||||
if [ ! -f "$BACKEND/.env" ]; then
|
||||
cat > "$BACKEND/.env" << 'ENVEOF'
|
||||
# MuMuAINovel Termux 配置
|
||||
APP_NAME=MuMuAINovel
|
||||
# 墨木灵思 Termux 配置
|
||||
APP_NAME=墨木灵思
|
||||
APP_HOST=0.0.0.0
|
||||
APP_PORT=8000
|
||||
DEBUG=false
|
||||
@@ -300,7 +300,7 @@ grep -E "built in" "$LOG" | sed 's/^/ /'
|
||||
step 9 $TOTAL "创建启动脚本"
|
||||
cat > "$HOME/mumuainovel-start.sh" << STARTEOF
|
||||
#!/bin/bash
|
||||
# MuMuAINovel Termux 启动脚本
|
||||
# 墨木灵思 Termux 启动脚本
|
||||
set -e
|
||||
|
||||
BACKEND="$BACKEND"
|
||||
@@ -313,7 +313,7 @@ export DATABASE_URL="sqlite+aiosqlite:///\$DATA_DIR/ai_story.db"
|
||||
cd "\$BACKEND"
|
||||
|
||||
if [ "\$1" = "--bg" ]; then
|
||||
echo "🚀 后台启动 MuMuAINovel (端口 8000)..."
|
||||
echo "🚀 后台启动 墨木灵思 (端口 8000)..."
|
||||
nohup "\$PYTHON" -m uvicorn app.main:app --host 0.0.0.0 --port 8000 \\
|
||||
> "\$LOG_DIR/app.log" 2>&1 &
|
||||
echo \$! > "$HOME/mumuainovel.pid"
|
||||
@@ -325,7 +325,7 @@ if [ "\$1" = "--bg" ]; then
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "🚀 启动 MuMuAINovel (端口 8000, Ctrl+C 停止)..."
|
||||
echo "🚀 启动 墨木灵思 (端口 8000, Ctrl+C 停止)..."
|
||||
exec "\$PYTHON" -m uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||
fi
|
||||
STARTEOF
|
||||
@@ -337,7 +337,7 @@ info "启动脚本已创建: ~/mumuainovel-start.sh"
|
||||
# =============================================================================
|
||||
echo ""
|
||||
echo -e "${GREEN}╔══════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ 🎉 MuMuAINovel 安装完成! ║${NC}"
|
||||
echo -e "${GREEN}║ 🎉 墨木灵思 安装完成! ║${NC}"
|
||||
echo -e "${GREEN}╠══════════════════════════════════════════════╣${NC}"
|
||||
echo -e "${GREEN}║ ║${NC}"
|
||||
echo -e "${GREEN}║ 前台运行(Ctrl+C 停止): ║${NC}"
|
||||
|
||||
Reference in New Issue
Block a user