update:1.更新readme文档 2.更新项目版本号
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
@@ -41,18 +41,42 @@
|
|||||||
- 💾 **PostgreSQL** - 生产级数据库,多用户数据隔离
|
- 💾 **PostgreSQL** - 生产级数据库,多用户数据隔离
|
||||||
- 🐳 **Docker 部署** - 一键启动,开箱即用
|
- 🐳 **Docker 部署** - 一键启动,开箱即用
|
||||||
|
|
||||||
|
## 📸 项目预览
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
### 登录界面
|
||||||
|

|
||||||
|
|
||||||
|
### 主界面
|
||||||
|

|
||||||
|
|
||||||
|
### 项目管理
|
||||||
|

|
||||||
|
|
||||||
|
### 赞助我 💖
|
||||||
|

|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
## 📋 TODO List
|
## 📋 TODO List
|
||||||
|
|
||||||
|
### ✅ 已完成功能
|
||||||
|
|
||||||
- [x] **灵感模式** - 创作灵感和点子生成
|
- [x] **灵感模式** - 创作灵感和点子生成
|
||||||
- [x] **自定义写作风格** - 支持自定义 AI 写作风格
|
- [x] **自定义写作风格** - 支持自定义 AI 写作风格
|
||||||
- [x] **数据导入导出** - 项目数据的导入导出
|
- [x] **数据导入导出** - 项目数据的导入导出
|
||||||
- [ ] **Prompt 调整界面** - 可视化编辑 Prompt 模板
|
- [x] **Prompt 调整界面** - 可视化编辑 Prompt 模板
|
||||||
- [x] **章节字数限制** - 用户可设置生成字数
|
- [x] **章节字数限制** - 用户可设置生成字数
|
||||||
- [ ] **设定追溯与矛盾检测** - 自动检测设定冲突
|
- [x] **思维链与章节关系图谱** - 可视化章节逻辑关系
|
||||||
- [ ] **思维链与章节关系图谱** - 可视化章节逻辑关系
|
|
||||||
- [x] **根据分析一键重写** - 根据分析建议重新生成
|
- [x] **根据分析一键重写** - 根据分析建议重新生成
|
||||||
- [x] **Linux DO 自动创建账号** - OAuth 登录自动生成账号
|
- [x] **Linux DO 自动创建账号** - OAuth 登录自动生成账号
|
||||||
|
|
||||||
|
### 📝 规划中功能
|
||||||
|
|
||||||
|
- [ ] **职业等级体系** - 小说世界观中的职业和等级系统
|
||||||
|
- [ ] **角色/组织卡片导入导出** - 单独导出角色和组织数据
|
||||||
|
|
||||||
> 💡 欢迎提交 Issue 或 Pull Request!
|
> 💡 欢迎提交 Issue 或 Pull Request!
|
||||||
|
|
||||||
## 🚀 快速开始
|
## 🚀 快速开始
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
# 应用配置
|
# 应用配置
|
||||||
# ==========================================
|
# ==========================================
|
||||||
APP_NAME=MuMuAINovel
|
APP_NAME=MuMuAINovel
|
||||||
APP_VERSION=1.1.2
|
APP_VERSION=1.1.3
|
||||||
APP_HOST=0.0.0.0
|
APP_HOST=0.0.0.0
|
||||||
APP_PORT=8000
|
APP_PORT=8000
|
||||||
DEBUG=false
|
DEBUG=false
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "frontend",
|
"name": "frontend",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.1.2",
|
"version": "1.1.3",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -21,13 +21,13 @@ export default function AuthCallback() {
|
|||||||
// 后端会通过 Cookie 自动设置认证信息
|
// 后端会通过 Cookie 自动设置认证信息
|
||||||
// 这里只需要验证登录状态
|
// 这里只需要验证登录状态
|
||||||
await authApi.getCurrentUser();
|
await authApi.getCurrentUser();
|
||||||
|
|
||||||
// 检查密码状态
|
// 检查密码状态
|
||||||
const pwdStatus = await authApi.getPasswordStatus();
|
const pwdStatus = await authApi.getPasswordStatus();
|
||||||
setPasswordStatus(pwdStatus);
|
setPasswordStatus(pwdStatus);
|
||||||
|
|
||||||
setStatus('success');
|
setStatus('success');
|
||||||
|
|
||||||
// 只有在用户完全没有密码时才显示密码设置提示
|
// 只有在用户完全没有密码时才显示密码设置提示
|
||||||
// 如果已经有密码(无论是默认密码还是自定义密码),都不再提示
|
// 如果已经有密码(无论是默认密码还是自定义密码),都不再提示
|
||||||
if (!pwdStatus.has_password) {
|
if (!pwdStatus.has_password) {
|
||||||
@@ -36,16 +36,16 @@ export default function AuthCallback() {
|
|||||||
}, 1000);
|
}, 1000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从 sessionStorage 获取重定向地址
|
// 从 sessionStorage 获取重定向地址
|
||||||
const redirect = sessionStorage.getItem('login_redirect') || '/';
|
const redirect = sessionStorage.getItem('login_redirect') || '/';
|
||||||
sessionStorage.removeItem('login_redirect');
|
sessionStorage.removeItem('login_redirect');
|
||||||
|
|
||||||
// 检查是否永久隐藏公告或今日已隐藏
|
// 检查是否永久隐藏公告或今日已隐藏
|
||||||
const hideForever = localStorage.getItem('announcement_hide_forever');
|
const hideForever = localStorage.getItem('announcement_hide_forever');
|
||||||
const hideToday = localStorage.getItem('announcement_hide_today');
|
const hideToday = localStorage.getItem('announcement_hide_today');
|
||||||
const today = new Date().toDateString();
|
const today = new Date().toDateString();
|
||||||
|
|
||||||
if (hideForever === 'true' || hideToday === today) {
|
if (hideForever === 'true' || hideToday === today) {
|
||||||
// 延迟一下再跳转,让用户看到成功提示
|
// 延迟一下再跳转,让用户看到成功提示
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -74,7 +74,7 @@ export default function AuthCallback() {
|
|||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
minHeight: '100vh',
|
minHeight: '100vh',
|
||||||
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
background: 'linear-gradient(135deg, #4D8088 0%, #5F9EA8 100%)',
|
||||||
}}>
|
}}>
|
||||||
<div style={{ textAlign: 'center' }}>
|
<div style={{ textAlign: 'center' }}>
|
||||||
<Spin size="large" />
|
<Spin size="large" />
|
||||||
@@ -93,7 +93,7 @@ export default function AuthCallback() {
|
|||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
minHeight: '100vh',
|
minHeight: '100vh',
|
||||||
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
background: 'linear-gradient(135deg, #4D8088 0%, #5F9EA8 100%)',
|
||||||
}}>
|
}}>
|
||||||
<Result
|
<Result
|
||||||
status="error"
|
status="error"
|
||||||
@@ -147,15 +147,15 @@ export default function AuthCallback() {
|
|||||||
await authApi.setPassword(newPassword);
|
await authApi.setPassword(newPassword);
|
||||||
message.success('密码设置成功');
|
message.success('密码设置成功');
|
||||||
setShowPasswordModal(false);
|
setShowPasswordModal(false);
|
||||||
|
|
||||||
// 继续后续流程
|
// 继续后续流程
|
||||||
const redirect = sessionStorage.getItem('login_redirect') || '/';
|
const redirect = sessionStorage.getItem('login_redirect') || '/';
|
||||||
sessionStorage.removeItem('login_redirect');
|
sessionStorage.removeItem('login_redirect');
|
||||||
|
|
||||||
const hideForever = localStorage.getItem('announcement_hide_forever');
|
const hideForever = localStorage.getItem('announcement_hide_forever');
|
||||||
const hideToday = localStorage.getItem('announcement_hide_today');
|
const hideToday = localStorage.getItem('announcement_hide_today');
|
||||||
const today = new Date().toDateString();
|
const today = new Date().toDateString();
|
||||||
|
|
||||||
if (hideForever === 'true' || hideToday === today) {
|
if (hideForever === 'true' || hideToday === today) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
navigate(redirect);
|
navigate(redirect);
|
||||||
@@ -174,15 +174,15 @@ export default function AuthCallback() {
|
|||||||
|
|
||||||
const handleSkipPasswordSetting = () => {
|
const handleSkipPasswordSetting = () => {
|
||||||
setShowPasswordModal(false);
|
setShowPasswordModal(false);
|
||||||
|
|
||||||
// 继续后续流程
|
// 继续后续流程
|
||||||
const redirect = sessionStorage.getItem('login_redirect') || '/';
|
const redirect = sessionStorage.getItem('login_redirect') || '/';
|
||||||
sessionStorage.removeItem('login_redirect');
|
sessionStorage.removeItem('login_redirect');
|
||||||
|
|
||||||
const hideForever = localStorage.getItem('announcement_hide_forever');
|
const hideForever = localStorage.getItem('announcement_hide_forever');
|
||||||
const hideToday = localStorage.getItem('announcement_hide_today');
|
const hideToday = localStorage.getItem('announcement_hide_today');
|
||||||
const today = new Date().toDateString();
|
const today = new Date().toDateString();
|
||||||
|
|
||||||
if (hideForever === 'true' || hideToday === today) {
|
if (hideForever === 'true' || hideToday === today) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
navigate(redirect);
|
navigate(redirect);
|
||||||
@@ -202,7 +202,7 @@ export default function AuthCallback() {
|
|||||||
onDoNotShowToday={handleDoNotShowToday}
|
onDoNotShowToday={handleDoNotShowToday}
|
||||||
onNeverShow={handleNeverShow}
|
onNeverShow={handleNeverShow}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Modal
|
<Modal
|
||||||
title="设置账号密码"
|
title="设置账号密码"
|
||||||
open={showPasswordModal}
|
open={showPasswordModal}
|
||||||
@@ -224,7 +224,7 @@ export default function AuthCallback() {
|
|||||||
borderRadius: 4,
|
borderRadius: 4,
|
||||||
marginTop: 12
|
marginTop: 12
|
||||||
}}>
|
}}>
|
||||||
<strong>账号:</strong>{passwordStatus.username}<br/>
|
<strong>账号:</strong>{passwordStatus.username}<br />
|
||||||
<strong>默认密码:</strong><code style={{
|
<strong>默认密码:</strong><code style={{
|
||||||
background: '#fff',
|
background: '#fff',
|
||||||
padding: '2px 8px',
|
padding: '2px 8px',
|
||||||
@@ -235,7 +235,7 @@ export default function AuthCallback() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style={{ marginTop: 20 }}>
|
<div style={{ marginTop: 20 }}>
|
||||||
<div style={{ marginBottom: 12 }}>
|
<div style={{ marginBottom: 12 }}>
|
||||||
<label>新密码(至少6个字符):</label>
|
<label>新密码(至少6个字符):</label>
|
||||||
@@ -263,7 +263,7 @@ export default function AuthCallback() {
|
|||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
minHeight: '100vh',
|
minHeight: '100vh',
|
||||||
background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
|
background: 'linear-gradient(135deg, #4D8088 0%, #5F9EA8 100%)',
|
||||||
}}>
|
}}>
|
||||||
<Result
|
<Result
|
||||||
status="success"
|
status="success"
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 177 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 644 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 334 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 235 KiB |
Reference in New Issue
Block a user