This commit is contained in:
DelLevin-Home
2026-06-25 02:11:11 +08:00
parent 5b7823cb78
commit 00e948e580
4 changed files with 65 additions and 33 deletions

View File

@@ -8,16 +8,16 @@ http://docmost.iletter.top/share/ropwljpyvn/p/mook-note-lHmPTswdDC
## 应用预览 ## 应用预览
| 影视列表 | 书籍列表 | 笔记界面 | | 影视列表 | 书籍列表 | 笔记界面 |
|:---:|:---:|:---:| | :------------------------------------------------------------: | :------------------------------------------------------------: | :------------------------------------------------------------: |
| <img src="proj-img/Screenshot_1781866410.png" width="240"> | <img src="proj-img/Screenshot_1781866427.png" width="240"> | <img src="proj-img/Screenshot_1781866432.png" width="240"> | | `<img src="proj-img/Screenshot_1781866410.png" width="240">` | `<img src="proj-img/Screenshot_1781866427.png" width="240">` | `<img src="proj-img/Screenshot_1781866432.png" width="240">` |
更多预览图片请到**应用功能详情预览**里面查看 更多预览图片请到**应用功能详情预览**里面查看
## 功能特性 ## 功能特性
### 影视管理 ### 影视管理
- 影视增删改查,支持海报、导演、演员、类型等信息录入 - 影视增删改查,支持海报、导演、演员、类型等信息录入
- 影评撰写与管理,支持星级评分 - 影评撰写与管理,支持星级评分
- 影视海报墙浏览(瀑布流布局) - 影视海报墙浏览(瀑布流布局)
@@ -26,6 +26,7 @@ http://docmost.iletter.top/share/ropwljpyvn/p/mook-note-lHmPTswdDC
- 影视状态筛选(想看 / 在看 / 已看) - 影视状态筛选(想看 / 在看 / 已看)
### 书籍管理 ### 书籍管理
- 书籍增删改查,支持封面、作者、出版社等信息 - 书籍增删改查,支持封面、作者、出版社等信息
- 书评撰写与管理 - 书评撰写与管理
- 书摘 / 摘录记录 - 书摘 / 摘录记录
@@ -33,11 +34,13 @@ http://docmost.iletter.top/share/ropwljpyvn/p/mook-note-lHmPTswdDC
- 书籍状态筛选 - 书籍状态筛选
### 笔记管理 ### 笔记管理
- 笔记增删改查,支持 Markdown 编辑与实时渲染 - 笔记增删改查,支持 Markdown 编辑与实时渲染
- 笔记分享卡片 - 笔记分享卡片
- Markdown 阅读器支持暗色模式与字体大小调节 - Markdown 阅读器支持暗色模式与字体大小调节
### 通用功能 ### 通用功能
- 全局搜索(影视 / 书籍 / 笔记) - 全局搜索(影视 / 书籍 / 笔记)
- 标签管理与分类 - 标签管理与分类
- 数据统计与可视化图表(月度趋势 / 类型分布) - 数据统计与可视化图表(月度趋势 / 类型分布)
@@ -51,11 +54,11 @@ http://docmost.iletter.top/share/ropwljpyvn/p/mook-note-lHmPTswdDC
## 技术栈 ## 技术栈
| 类别 | 技术 | | 类别 | 技术 |
|------|------| | ---------- | ----------------- |
| 框架 | Flutter 3.5+ | | 框架 | Flutter 3.5+ |
| 语言 | Dart | | 语言 | Dart |
| 状态管理 | Provider | | 状态管理 | Provider |
| 本地数据库 | SQLitesqflite | | 本地数据库 | SQLitesqflite |
## 项目结构 ## 项目结构
@@ -145,18 +148,21 @@ flutter build appbundle --release
## 应用功能详情预览 ## 应用功能详情预览
| 数据统计 | 侧边栏 | 我的界面 | | 数据统计 | 侧边栏 | 我的界面 |
|:---:|:---:|:---:| | :-------------------------------------------------------------: | :------------------------------------------------------------: | :-------------------------------------------------------------------: |
| <img src="proj-img/Screenshot_1781866461.png" width="240" > | <img src="proj-img/Screenshot_1781866436.png" width="240"> | <img src="./assets/README/Screenshot_1781866417.png" width="240"> | | `<img src="proj-img/Screenshot_1781866461.png" width="240" >` | `<img src="proj-img/Screenshot_1781866436.png" width="240">` | `<img src="./assets/README/Screenshot_1781866417.png" width="240">` |
| 详情界面1 | 详情界面2 | 编辑笔记 |
| :------------------------------------------: | :------------------------------------------: | :------------------------------------------: |
| `<img src="proj-img/xq1.png" width="240">` | `<img src="proj-img/xq2.png" width="240">` | `<img src="proj-img/bj1.png" width="240">` |
| 详情界面1 | 详情界面2 | 编辑笔记 | | 分享界面1 | 分享界面2 | 预览笔记 |
|:---:|:---:|:---:| | :------------------------------------------: | :------------------------------------------: | :------------------------------------------: |
| <img src="proj-img/xq1.png" width="240"> | <img src="proj-img/xq2.png" width="240"> | <img src="proj-img/bj1.png" width="240"> | | `<img src="proj-img/fx1.png" width="240">` | `<img src="proj-img/fx2.png" width="240">` | `<img src="proj-img/bj2.png" width="240">` |
| 分享界面1 | 分享界面2 | 预览笔记 | ## 数据对接
|:---:|:---:|:---:|
| <img src="proj-img/fx1.png" width="240"> | <img src="proj-img/fx2.png" width="240"> | <img src="proj-img/bj2.png" width="240"> | 数据已对接6w+影视基础数据以及300w+书籍基础信息,如需对接接口,或技术交流请联系作者。
## 开源协议 ## 开源协议

View File

@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import '../utils/user_prefs.dart'; import '../utils/user_prefs.dart';
import '../utils/server_config.dart'; import '../utils/server_config.dart';
import 'legal_page.dart';
/// 增强搜索设置页面 /// 增强搜索设置页面
class EnhancedSearchSettingsPage extends StatefulWidget { class EnhancedSearchSettingsPage extends StatefulWidget {
@@ -392,19 +393,33 @@ class _EnhancedSearchSettingsPageState
} }
Widget _buildSaveButton(ColorScheme colors) { Widget _buildSaveButton(ColorScheme colors) {
return GestureDetector( return Column(
onTap: _saveAndVerify, crossAxisAlignment: CrossAxisAlignment.stretch,
child: Container( children: [
width: double.infinity, GestureDetector(
padding: const EdgeInsets.symmetric(vertical: 12), onTap: _saveAndVerify,
decoration: BoxDecoration( child: Container(
color: colors.primary, width: double.infinity,
borderRadius: BorderRadius.circular(10), padding: const EdgeInsets.symmetric(vertical: 12),
decoration: BoxDecoration(
color: colors.primary,
borderRadius: BorderRadius.circular(10),
),
child: Center(
child: Text('保存并验证', style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: colors.onPrimary)),
),
),
), ),
child: Center( const SizedBox(height: 8),
child: Text('保存并验证', style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: colors.onPrimary)), Align(
alignment: Alignment.centerRight,
child: GestureDetector(
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (_) => const LegalPage(slug: 'token_doc', title: '获取Token'))),
child: Text('点击获取 Token', style: TextStyle(fontSize: 12, color: colors.primary)),
),
), ),
), ],
); );
} }

View File

@@ -123,7 +123,7 @@ class _OnlineSearchPageState extends State<OnlineSearchPage> {
final url = final url =
'${ServerConfig.vipBaseUrl}/api/movie/list?movieName=${Uri.encodeComponent(keyword)}&token=$token&page=$page'; '${ServerConfig.vipBaseUrl}/api/movie/list?movieName=${Uri.encodeComponent(keyword)}&token=$token&page=$page';
final resp = final resp =
await http.get(Uri.parse(url)).timeout(const Duration(seconds: 10)); await http.get(Uri.parse(url)).timeout(const Duration(seconds: 20));
if (!mounted) return; if (!mounted) return;
if (resp.statusCode == 200) { if (resp.statusCode == 200) {
@@ -156,7 +156,12 @@ class _OnlineSearchPageState extends State<OnlineSearchPage> {
return; return;
} }
} }
} catch (_) {} } catch (e) {
if (mounted) {
final msg = e.toString().contains('TimeoutException') ? '搜索超时,请稍后重试' : '搜索失败,请检查网络';
ToastUtil.show(context, msg);
}
}
if (mounted) { if (mounted) {
setState(() { setState(() {
@@ -186,7 +191,7 @@ class _OnlineSearchPageState extends State<OnlineSearchPage> {
final url = final url =
'${ServerConfig.vipBaseUrl}/api/book/list?title=${Uri.encodeComponent(keyword)}&token=$token&page=$page'; '${ServerConfig.vipBaseUrl}/api/book/list?title=${Uri.encodeComponent(keyword)}&token=$token&page=$page';
final resp = final resp =
await http.get(Uri.parse(url)).timeout(const Duration(seconds: 10)); await http.get(Uri.parse(url)).timeout(const Duration(seconds: 20));
if (!mounted) return; if (!mounted) return;
if (resp.statusCode == 200) { if (resp.statusCode == 200) {
@@ -219,7 +224,12 @@ class _OnlineSearchPageState extends State<OnlineSearchPage> {
return; return;
} }
} }
} catch (_) {} } catch (e) {
if (mounted) {
final msg = e.toString().contains('TimeoutException') ? '搜索超时,请稍后重试' : '搜索失败,请检查网络';
ToastUtil.show(context, msg);
}
}
if (mounted) { if (mounted) {
setState(() { setState(() {

View File

@@ -11,6 +11,7 @@ class ServerConfig {
static final String apiBase = '$baseUrl/api'; static final String apiBase = '$baseUrl/api';
static final String vipBaseUrl = kDebugMode static final String vipBaseUrl = kDebugMode
// ? 'http://vipapi.mooknote.iletter.top'
? 'http://192.168.31.48:8081' ? 'http://192.168.31.48:8081'
: 'http://vipapi.mooknote.iletter.top'; : 'http://vipapi.mooknote.iletter.top';
} }