feat: 品牌升级为墨木灵思,优化 UI 并配置 Docker 部署

This commit is contained in:
yi
2026-05-12 12:19:13 +08:00
parent 728bc1de77
commit df33ce2f18
33 changed files with 375 additions and 75 deletions
+26
View File
@@ -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
+84
View File
@@ -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 架构。
### 步骤 3Docker配置生成
- **状态**:✅ 已完成
- **完成时间**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 初始化)。
### 步骤 7CORS配置检查
- **状态**:✅ 已完成
- **完成时间**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:提交
- **状态**:⏭️ 未开始
- **完成时间**:未开始
- **说明**:未开始
## 错误记录
## 备注
+5
View File
@@ -0,0 +1,5 @@
# 错误记录
## 错误列表
+12 -12
View File
@@ -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>
+3 -3
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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='验证码有效期(分钟)'))
+5 -5
View File
@@ -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;">
+2 -2
View File
@@ -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:
+3 -3
View File
@@ -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>
+2 -2
View File
@@ -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
View File
@@ -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"
+1 -1
View File
@@ -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="验证码有效期(分钟)")
+1 -1
View File
@@ -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="验证码有效期(分钟)")
+1 -1
View File
@@ -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')
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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>
+2
View File
@@ -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>
+13
View File
@@ -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}
+4 -4
View File
@@ -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: '墨木灵思团队',
};
/**
+149
View File
@@ -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>
);
}
+1 -1
View File
@@ -219,7 +219,7 @@ export default function BookshelfPage({
{showApiTip && projects.length === 0 && (
<Alert
message="欢迎使用 MuMuAINovel"
message="欢迎使用 墨木灵思"
description={
<div style={{
display: 'flex',
+4 -4
View File
@@ -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>
+23 -2
View File
@@ -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
+2 -2
View File
@@ -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"
+4 -4
View File
@@ -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小说创作体验!
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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 = '墨木灵思';
/**
* 提交类型映射表
+2 -2
View File
@@ -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
View File
@@ -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}"