从键盘到云端:一个小码农的"防秃"小说创作神器开发记
前言 - 我的"代码修仙"之路
最近为了缓解工作压力,开始利用业余时间边学代码,边构思小说。也许兴趣到了,学起来才轻松,不过写着写着就发现——笔下人物一多,关系网乱得堪比我家猫玩过的毛线团。上周刚给主角安排了个失散多年的妹妹,这周就发现辈分对不上,气得差点把键盘摔了。正当我对着满屏人物名字抓狂时,突然福至心灵:咱好歹也是个学Python的萌新,干嘛不自己造个"防头秃神器"?
说干就干!抄起VSCode就开始用Flask搭架子。你猜怎么着?昨天突发奇想问了下Deepseek:"那些爆款网文到底有多少角色啊?"结果吓得我奶茶都喷了——人家百万字起步的大作,平均每万字就蹦出4-6个新角色!这要手动梳理关系,怕是要把自己写成小说里的悲剧配角了。
现在我的"修仙法宝"已经初具雏形,不仅能自动生成人物关系网,还能像玩消消乐一样随时调整阵营。下次再给男主安排个前世恋人,系统立马跳提示:“警告!该角色已与第三章的反派有杀父之仇”——这才是科技改变创作的正确打开方式嘛!
-
目前我开发的小说人物关系生成器可以实现:
-
📝 门派/人物信息录入
-
🕸️ 自动生成关系图谱
-
🔄 数据的增删改查
-
📥 导入导出数据
- 那么接下来需要做什么呢,当然是目前已在本地跑通(VSCode编码 + PowerShell运行),界面虽然简陋但功能完整。就像刚学会御剑飞行的小修士,现在我想把"本命法宝"送上云端,让更多人通过网页访问它!怎样实现我的“宏图大业”呢,下面进入正题:
一、项目现状全景图
开发环境:
- 主力装备:Windows 10 64位 + VSCode 1.97.2
- 技术栈:Python 3.12.9 + Flask 3.1.0 + Bootstrap 5
- 运行方式:PowerShell执行
python app.py
- 当前进度:本地功能测试通过
二、Windows环境部署指南
Step 1:选择云服务器
- 新手推荐:腾讯云Windows Server 2022镜像(系统自动激活)
- 配置建议:2核4G + 50GB SSD(约118元/月,可按需暂停)
Step 2:远程桌面配置
- 购买后获取公网IP和密码
- 本地按
Win+R
输入mstsc
打开远程桌面 - 输入IP连接后,在服务器上安装:
- Python环境(勾选Add to PATH)
- Git for Windows(方便代码同步)
Step 3:项目部署
# 克隆你的代码仓库
git clone https://github.com/yourname/novel-relation.git
# 创建虚拟环境(避免依赖冲突)
python -m venv venv
.\venv\Scripts\activate
# 安装依赖(提前整理requirements.txt)
pip install -r requirements.txt
# 使用生产级服务器(替代Flask自带的开发服务器)
pip install waitress
waitress-serve --port=5000 app:app
Step 4:开放端口
- 服务器防火墙 - 高级设置
- 新建入站规则:允许TCP 5000端口
- 浏览器访问测试:
http://你的公网IP:5000
可选优化:
- 安装Nginx for Windows做反向代理
- 使用Let’s Encrypt申请免费SSL证书
三、移动端开发详细路线图(分阶段实施)
阶段一:快速原型(2周)
技术选型:Flutter(跨平台)+ Flask RESTful API
- API改造:
# 原路由:/character/<id>
# 改造为返回JSON格式
@app.route('/api/character/<int:id>')
def get_character(id):
character = Character.query.get(id)
return jsonify({
'name': character.name,
'faction': character.faction,
'relations': [r.to_dict() for r in character.relations]
})
- 创建Flutter项目:
# 安装Flutter SDK(需提前配置Android环境)
flutter create novel_app
cd novel_app
flutter run -d chrome # 在浏览器调试
- 实现基础功能:
// 人物列表页示例
FutureBuilder(
future: fetchCharacters(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(snapshot.data![index]['name']),
subtitle: Text(snapshot.data![index]['faction']),
);
}
);
}
return CircularProgressIndicator();
},
)
阶段二:功能完善(4周)
核心功能开发:
-
关系图谱实现:
- 使用
flutter_svg
渲染矢量图 - 或通过
CustomPaint
自定义绘制
- 使用
-
数据同步机制:
// 网络请求封装
Future<List<Character>> fetchCharacters() async {
final response = await http.get(Uri.parse('http://API地址/characters'));
if (response.statusCode == 200) {
return (json.decode(response.body) as List)
.map((data) => Character.fromJson(data))
.toList();
} else {
throw Exception('加载失败');
}
}
- 离线模式实现:
- 使用
hive
存储本地数据 - 通过
connectivity
监听网络状态
- 使用
阶段三:性能优化(2周)
- 复杂计算处理:
// 使用Isolate处理关系计算
void calculateRelations() async {
final receivePort = ReceivePort();
await Isolate.spawn(_relationCalculator, receivePort.sendPort);
}
- 图片缓存策略:
# pubspec.yaml添加依赖
dependencies:
cached_network_image: ^3.2.3
避坑清单
问题类型 | 解决方案 |
---|---|
跨域问题 | Flask端安装flask-cors 扩展 |
HTTPS适配 | 使用Dio配置证书校验 |
数据版本冲突 | 使用时间戳标记数据版本 |
四、开发环境迁移贴士
- Windows路径处理:
from pathlib import Path
UPLOAD_FOLDER = Path(__file__).parent / 'uploads'
- 进程守护方案:
- 使用NSSM创建Windows服务
- 编写批处理脚本:
@echo off
:loop
tasklist | findstr "waitress-serve" > nul
if errorlevel 1 (
echo 服务未运行,正在启动...
call .\venv\Scripts\activate
waitress-serve --port=5000 app:app
)
timeout /t 60 > nul
goto loop
五、资源直达车
六、萌新修炼心得
- 调试比写代码更耗时:曾经花3小时找出一处缩进错误,现在养成了即时commit的好习惯
- 善用AI辅助:用DeepSeek-Coder解释报错信息效率翻倍
- 不要重复造轮子:Bootstrap五分钟让界面从"石器时代"进化到"工业时代"
- 小步快跑:每实现一个功能就做本地测试,避免最后"牵一发而动全身"
🔮 接下来要搞的大事情
我准备用Electron把这网页版"塞进"电脑桌面,让它变成个正经软件!就像把流浪小猫领回家,给它做个专属小窝~
开发功能剧透:
📦 本地数据加密存储
🖨️ 一键导出门派、人物信息及关系
🔄时间线、故事线管理
📝构思记录本地暂存(免传服务器)
⏰ 每日催更提醒(对自己狠一点)
💌 写给读者的话
要是你觉得这工具能拯救你写小说时的头发,赶紧在评论区举个爪!等正式上线那天:
🎁 前50个留言的伙伴直接白嫖终身VIP
📌 现在留言的以后都是元老用户(尊享神秘特权)
如果觉得这篇干货对你所借鉴:
👍 帮忙点个赞就当请我喝虚拟奶茶
⭐ 收藏一下当个"防走失标签"
💬 吐槽建议我照单全收
你们的小红心就是我熬夜debug的动力源泉!💪