generated from dellevin/template
1111
This commit is contained in:
42
README.md
42
README.md
@@ -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 |
|
||||||
| 本地数据库 | SQLite(sqflite) |
|
| 本地数据库 | SQLite(sqflite) |
|
||||||
|
|
||||||
## 项目结构
|
## 项目结构
|
||||||
@@ -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+书籍基础信息,如需对接接口,或技术交流请联系作者。
|
||||||
|
|
||||||
## 开源协议
|
## 开源协议
|
||||||
|
|
||||||
|
|||||||
@@ -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)),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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(() {
|
||||||
|
|||||||
@@ -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';
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user