flu-cli-core 1.0.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +22 -17
  2. package/dist/chunk-BGYZU6TU.js +466 -0
  3. package/dist/chunk-QGM4M3NI.js +37 -0
  4. package/dist/factory-LM2CTHPW.js +7 -0
  5. package/dist/factory-P6ABQFH3.js +7 -0
  6. package/dist/index.cjs +18901 -3313
  7. package/dist/index.d.cts +833 -72
  8. package/dist/index.d.ts +833 -72
  9. package/dist/index.js +18569 -3132
  10. package/dist/upgrade_snippets-BJ6CQY5Q.js +9 -0
  11. package/package.json +9 -4
  12. package/templates/README.md +12 -0
  13. package/templates/core_files/auth/auth_middleware.dart.template +33 -0
  14. package/templates/core_files/auth/auth_service.dart.template +22 -0
  15. package/templates/core_files/auth/auth_viewmodel_mixin.dart.template +9 -0
  16. package/templates/core_files/auth/index.dart.template +4 -0
  17. package/templates/core_files/base/base_service.dart.template +12 -0
  18. package/templates/core_files/base/index.dart.template +3 -0
  19. package/templates/core_files/config/agreement_document_page.dart.template +220 -0
  20. package/templates/core_files/config/app_agreement.dart.template +297 -0
  21. package/templates/core_files/config/app_config.dart.template +81 -22
  22. package/templates/core_files/config/app_env.dart.template +107 -0
  23. package/templates/core_files/config/app_initializer.dart.template +16 -23
  24. package/templates/core_files/config/index.dart.template +4 -1
  25. package/templates/core_files/config/privacy_dialog.dart.template +158 -0
  26. package/templates/core_files/index.dart.template +3 -0
  27. package/templates/core_files/mixins/page/keep_alive_mixin.dart.template +6 -0
  28. package/templates/core_files/mixins/page/scroll_controller_mixin.dart.template +7 -0
  29. package/templates/core_files/mixins/service/request_guard_mixin.dart.template +18 -0
  30. package/templates/core_files/mixins/viewmodel/debounce_mixin.dart.template +18 -0
  31. package/templates/core_files/network/app_http.dart.template +19 -4
  32. package/templates/core_files/network/index.dart.template +4 -0
  33. package/templates/core_files/network/interceptors/global_params_interceptor.dart.template +77 -0
  34. package/templates/core_files/network/interceptors/index.dart.template +3 -0
  35. package/templates/core_files/network/network_monitor.dart.template +18 -0
  36. package/templates/core_files/network/response_adapter.dart.template +8 -19
  37. package/templates/core_files/router/app_routes.dart.template +3 -6
  38. package/templates/core_files/storage/storage_keys.dart.template +6 -0
  39. package/templates/core_files/theme/app_color_config.dart.template +32 -0
  40. package/templates/core_files/theme/app_text_size_config.dart.template +22 -0
  41. package/templates/core_files/theme/app_text_style_config.dart.template +139 -0
  42. package/templates/core_files/theme/app_theme.dart.template +72 -12
  43. package/templates/core_files/theme/index.dart.template +3 -0
  44. package/templates/core_files/utils/loading_util.dart.template +1 -1
  45. package/templates/examples/eg_list_page.dart.template +1 -2
  46. package/templates/examples/eg_service.dart.template +27 -4
  47. package/templates/examples/home_feed_service.dart.template +37 -0
  48. package/templates/helper_examples/image_picker_example_page.dart.template +289 -0
  49. package/templates/helper_examples/index.dart.template +4 -0
  50. package/templates/helper_examples/payment_shell_example_page.dart.template +67 -0
  51. package/templates/helper_examples/permission_example_page.dart.template +365 -0
  52. package/templates/helper_examples/webview_example_page.dart.template +44 -0
  53. package/templates/helpers/image_picker/README.md.template +30 -0
  54. package/templates/helpers/image_picker/index.dart.template +73 -0
  55. package/templates/helpers/payment/README.md.template +29 -0
  56. package/templates/helpers/payment/index.dart.template +66 -0
  57. package/templates/helpers/permission/README.md.template +30 -0
  58. package/templates/helpers/permission/index.dart.template +67 -0
  59. package/templates/helpers/webview/README.md.template +29 -0
  60. package/templates/helpers/webview/index.dart.template +88 -0
  61. package/templates/snippets/flu-cli.code-snippets +35 -26
  62. package/templates/starter_project/.env.dev.template +14 -0
  63. package/templates/starter_project/.env.prod.example.template +14 -0
  64. package/templates/starter_project/.env.staging.template +14 -0
  65. package/templates/starter_project/.vscode/launch.json.template +54 -0
  66. package/templates/starter_project/DEVELOPER_GUIDE.md.template +150 -0
  67. package/templates/starter_project/README.md.template +99 -0
  68. package/templates/starter_project/analysis_options.yaml.template +28 -0
  69. package/templates/starter_project/lib/app.dart.template +22 -0
  70. package/templates/starter_project/lib/main.dart.template +34 -0
  71. package/templates/starter_project/lib/pages/splash_page.dart.template +154 -0
  72. package/templates/template_clean/lib/features/home/data/datasources/index.dart +1 -0
  73. package/templates/template_clean/lib/features/home/data/models/index.dart +1 -0
  74. package/templates/template_clean/lib/features/home/domain/index.dart +1 -0
  75. package/templates/template_clean/lib/features/home/presentation/pages/home_page.dart +290 -0
  76. package/templates/template_clean/lib/features/home/presentation/pages/index.dart +2 -0
  77. package/templates/template_clean/lib/features/home/presentation/pages/splash_page.dart +154 -0
  78. package/templates/template_clean/lib/features/home/presentation/viewmodels/home_viewmodel.dart +17 -0
  79. package/templates/template_clean/lib/features/index.dart +2 -0
  80. package/templates/template_clean/lib/features/user/data/datasources/home_feed_service.dart +37 -0
  81. package/templates/template_clean/lib/features/user/data/datasources/index.dart +4 -0
  82. package/templates/template_clean/lib/features/user/data/models/index.dart +3 -0
  83. package/templates/template_clean/lib/features/user/data/models/user.dart +15 -0
  84. package/templates/template_clean/lib/features/user/domain/index.dart +1 -0
  85. package/templates/template_clean/lib/features/user/presentation/pages/index.dart +1 -0
  86. package/templates/template_clean/lib/features/user/presentation/pages/user_list_page.dart +27 -0
  87. package/templates/template_clean/lib/features/user/presentation/viewmodels/user_list_viewmodel.dart +88 -0
  88. package/templates/template_clean/lib/features/user/presentation/widgets/user_item_card.dart +24 -0
  89. package/templates/template_clean/lib/shared/extensions/index.dart +1 -0
  90. package/templates/template_clean/lib/shared/widgets/index.dart +1 -0
  91. package/templates/template_lite/lib/models/index.dart +1 -0
  92. package/templates/template_lite/lib/pages/home_page.dart +290 -0
  93. package/templates/template_lite/lib/pages/index.dart +3 -0
  94. package/templates/template_lite/lib/pages/splash_page.dart +154 -0
  95. package/templates/template_lite/lib/pages/user_list_page.dart +29 -0
  96. package/templates/template_lite/lib/services/home_feed_service.dart +37 -0
  97. package/templates/template_lite/lib/services/index.dart +5 -0
  98. package/templates/template_lite/lib/utils/index.dart +1 -0
  99. package/templates/template_lite/lib/viewmodels/home_viewmodel.dart +34 -0
  100. package/templates/template_lite/lib/viewmodels/index.dart +2 -0
  101. package/templates/template_lite/lib/viewmodels/user_list_viewmodel.dart +103 -0
  102. package/templates/template_lite/lib/widgets/index.dart +1 -0
  103. package/templates/template_lite/lib/widgets/user_item_widget.dart +57 -0
  104. package/templates/template_modular/lib/features/home/index.dart +2 -0
  105. package/templates/template_modular/lib/features/home/models/index.dart +1 -0
  106. package/templates/template_modular/lib/features/home/pages/home_page.dart +290 -0
  107. package/templates/template_modular/lib/features/home/pages/index.dart +2 -0
  108. package/templates/template_modular/lib/features/home/pages/splash_page.dart +154 -0
  109. package/templates/template_modular/lib/features/home/services/index.dart +1 -0
  110. package/templates/template_modular/lib/features/home/viewmodels/home_viewmodel.dart +17 -0
  111. package/templates/template_modular/lib/features/index.dart +2 -0
  112. package/templates/template_modular/lib/features/user/index.dart +6 -0
  113. package/templates/template_modular/lib/features/user/pages/user_list_page.dart +26 -0
  114. package/templates/template_modular/lib/features/user/services/home_feed_service.dart +37 -0
  115. package/templates/template_modular/lib/features/user/viewmodels/user_list_viewmodel.dart +103 -0
  116. package/templates/template_modular/lib/features/user/widgets/user_item_widget.dart +24 -0
  117. package/templates/template_modular/lib/shared/utils/index.dart +1 -0
  118. package/templates/template_modular/lib/shared/widgets/index.dart +1 -0
@@ -0,0 +1,9 @@
1
+ import {
2
+ checkSnippetsVersion,
3
+ upgradeSnippets
4
+ } from "./chunk-SW6YDKXI.js";
5
+ import "./chunk-QGM4M3NI.js";
6
+ export {
7
+ checkSnippetsVersion,
8
+ upgradeSnippets
9
+ };
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "flu-cli-core",
3
- "version": "1.0.4",
3
+ "version": "1.1.0",
4
4
  "description": "Core logic for flu-cli",
5
5
  "main": "dist/index.cjs",
6
- "module": "dist/index.js",
6
+ "module": "dist/index.cjs",
7
7
  "types": "dist/index.d.ts",
8
8
  "type": "module",
9
9
  "files": [
@@ -15,7 +15,7 @@
15
15
  ".": {
16
16
  "import": {
17
17
  "types": "./dist/index.d.ts",
18
- "default": "./dist/index.js"
18
+ "default": "./dist/index.cjs"
19
19
  },
20
20
  "require": {
21
21
  "types": "./dist/index.d.cts",
@@ -35,8 +35,13 @@
35
35
  ],
36
36
  "author": "火叶工作室",
37
37
  "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://gitee.com/flu-cli/flu-cli.git",
41
+ "directory": "packages/core"
42
+ },
38
43
  "dependencies": {
39
- "@huoye/app-ship": "^0.1.1",
44
+ "@huoye/app-ship": "^0.1.2",
40
45
  "axios": "^1.13.2",
41
46
  "chalk": "^4.1.2",
42
47
  "form-data": "^4.0.5",
@@ -18,6 +18,15 @@ packages/core/templates/
18
18
  │ ├── widgets/ # 各种 Widget 变体
19
19
  │ └── ...
20
20
 
21
+ ├── helpers/ # 🔹 可选 helper 模板
22
+ │ ├── payment/ # 支付 helper 占位
23
+ │ ├── webview/ # WebView helper 占位
24
+ │ ├── permission/ # 权限 helper 占位
25
+ │ └── image_picker/ # 图片选择 helper 占位
26
+ ├── template_lite/ # 🔹 Lite 模板源
27
+ ├── template_modular/ # 🔹 Modular 模板源
28
+ ├── template_clean/ # 🔹 Clean 模板源
29
+
21
30
  └── README.md # 本文档
22
31
  ```
23
32
 
@@ -99,6 +108,7 @@ Flu-CLI 采用 **"双层架构"** 设计,确保所有架构风格的项目都
99
108
  ### 1. Skeleton (骨架)
100
109
 
101
110
  即外层提供的 `template_lite`, `template_modular` 等项目基础包。它们只包含最基础的、编译通过的 Flutter 代码。
111
+ 当前三套模板源只保留最新结构文件,不再依赖旧版 `STRUCTURE.md` 作为项目说明。
102
112
 
103
113
  ### 2. Enrichment (增强) - 位于 `core_files/`
104
114
 
@@ -106,6 +116,8 @@ Flu-CLI 采用 **"双层架构"** 设计,确保所有架构风格的项目都
106
116
 
107
117
  - **Base 层**:所有模板(Lite/Modular/Clean)使用完全相同的 `BasePage` 和 `BaseViewModel`。
108
118
  - **Network 层**:由 CLI 任务驱动,自动处理依赖注入、代码复制与示例代码生成。
119
+ - **Auth 层**:由 CLI 任务驱动,生成最小认证态工具和网络鉴权扩展。
120
+ - **Helper 层**:由 CLI 任务驱动,把 payment / webview / permission / image_picker 这类非 Core 能力投影到 `lib/helpers/`。helper 依赖由统一策略处理,普通 Flutter 与 Harmony/ohos profile 必须可区分。
109
121
  - **Router 层**:包含动态路由扫描所需的基础骨架(如自动注入业务路由的 TODO 标记)。
110
122
 
111
123
  ## 📝 开发者指南
@@ -0,0 +1,33 @@
1
+ import 'package:flutter/widgets.dart';
2
+
3
+ import 'auth_service.dart';
4
+
5
+ /// 提供最小认证守卫入口,供路由或页面进入前复用。
6
+ class AuthMiddleware {
7
+ AuthMiddleware({
8
+ AuthService? authService,
9
+ }) : _authService = authService ?? const AuthService();
10
+
11
+ final AuthService _authService;
12
+
13
+ bool canActivate() {
14
+ return _authService.isLoggedIn;
15
+ }
16
+
17
+ String? redirectRoute({
18
+ required String loginRoute,
19
+ }) {
20
+ return canActivate() ? null : loginRoute;
21
+ }
22
+
23
+ Future<void> ensureLoggedIn({
24
+ required VoidCallback onAuthorized,
25
+ required VoidCallback onUnauthorized,
26
+ }) async {
27
+ if (canActivate()) {
28
+ onAuthorized();
29
+ } else {
30
+ onUnauthorized();
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,22 @@
1
+ import '../storage/storage_util.dart';
2
+
3
+ /// 统一封装认证态读写,避免业务层直接散落操作 token。
4
+ class AuthService {
5
+ const AuthService();
6
+
7
+ static const String _tokenKey = 'auth_token';
8
+
9
+ Future<void> saveToken(String token) async {
10
+ await StorageUtil.setString(_tokenKey, token);
11
+ }
12
+
13
+ String getToken() {
14
+ return StorageUtil.getString(_tokenKey) ?? '';
15
+ }
16
+
17
+ bool get isLoggedIn => getToken().isNotEmpty;
18
+
19
+ Future<void> clear() async {
20
+ await StorageUtil.remove(_tokenKey);
21
+ }
22
+ }
@@ -0,0 +1,9 @@
1
+ import 'auth_service.dart';
2
+
3
+ /// 为 ViewModel 提供统一认证态读取入口,避免每个页面自己拼 token 判断。
4
+ mixin AuthViewModelMixin {
5
+ final AuthService authService = const AuthService();
6
+
7
+ bool get isLoggedIn => authService.isLoggedIn;
8
+ String get authToken => authService.getToken();
9
+ }
@@ -0,0 +1,4 @@
1
+ // 导出认证能力 (按字母顺序排列)
2
+ export 'auth_middleware.dart';
3
+ export 'auth_service.dart';
4
+ export 'auth_viewmodel_mixin.dart';
@@ -0,0 +1,12 @@
1
+ {{#if_base_network_service}}
2
+ import '../network/index.dart';
3
+
4
+ /// Service 基类
5
+ ///
6
+ /// 统一持有 AppHttp,业务 Service 默认继承后直接使用 http。
7
+ abstract class BaseService {
8
+ final AppHttp http;
9
+
10
+ BaseService({AppHttp? http}) : http = http ?? AppHttp();
11
+ }
12
+ {{/if_base_network_service}}
@@ -2,4 +2,7 @@
2
2
  export 'base_list_page.dart';
3
3
  export 'base_list_viewmodel.dart';
4
4
  export 'base_page.dart';
5
+ {{#if_base_network_service}}
6
+ export 'base_service.dart';
7
+ {{/if_base_network_service}}
5
8
  export 'base_viewmodel.dart';
@@ -0,0 +1,220 @@
1
+ import 'package:flutter/material.dart';
2
+
3
+ import 'app_env.dart';
4
+
5
+ /// 协议文档类型。
6
+ enum AgreementDocumentType {
7
+ userAgreement,
8
+ privacyPolicy,
9
+ }
10
+
11
+ /// 默认离线协议查看页。
12
+ ///
13
+ /// 该页面属于默认合规基座,不依赖远程 Web 页面,保证用户在首次同意前也能查看完整文本。
14
+ class AgreementDocumentPage extends StatelessWidget {
15
+ const AgreementDocumentPage({
16
+ super.key,
17
+ required this.type,
18
+ });
19
+
20
+ final AgreementDocumentType type;
21
+
22
+ bool get _isUserAgreement => type == AgreementDocumentType.userAgreement;
23
+
24
+ @override
25
+ Widget build(BuildContext context) {
26
+ final theme = Theme.of(context);
27
+ final title = _isUserAgreement ? '用户协议' : '隐私政策';
28
+ final onlineUrl =
29
+ _isUserAgreement ? EnvConfig.userAgreementUrl : EnvConfig.privacyPolicyUrl;
30
+
31
+ return Scaffold(
32
+ appBar: AppBar(
33
+ title: Text(title),
34
+ ),
35
+ body: SafeArea(
36
+ child: ListView(
37
+ padding: const EdgeInsets.fromLTRB(16, 16, 16, 24),
38
+ children: [
39
+ Container(
40
+ padding: const EdgeInsets.all(16),
41
+ decoration: BoxDecoration(
42
+ color: theme.colorScheme.surface,
43
+ borderRadius: BorderRadius.circular(18),
44
+ border: Border.all(color: theme.dividerColor),
45
+ ),
46
+ child: Column(
47
+ crossAxisAlignment: CrossAxisAlignment.start,
48
+ children: [
49
+ Text(
50
+ '${EnvConfig.appName}$title',
51
+ style: theme.textTheme.titleMedium?.copyWith(
52
+ fontWeight: FontWeight.w700,
53
+ ),
54
+ ),
55
+ const SizedBox(height: 8),
56
+ Text(
57
+ '运营主体:${EnvConfig.appOperatorName}\n'
58
+ '生效日期:${EnvConfig.agreementEffectiveDate}\n'
59
+ '联系邮箱:${EnvConfig.privacyContactEmail}',
60
+ style: theme.textTheme.bodySmall,
61
+ ),
62
+ const SizedBox(height: 12),
63
+ Text(
64
+ '该页面为应用内默认离线协议文本,便于用户在首次同意前直接查看完整内容。正式上线前,请根据你的真实业务、账号体系、第三方 SDK 与数据处理场景完成最终替换。',
65
+ style: theme.textTheme.bodySmall?.copyWith(
66
+ color: theme.colorScheme.primary,
67
+ ),
68
+ ),
69
+ ],
70
+ ),
71
+ ),
72
+ const SizedBox(height: 16),
73
+ SelectableText(
74
+ _isUserAgreement ? _defaultUserAgreement : _defaultPrivacyPolicy,
75
+ style: theme.textTheme.bodyMedium?.copyWith(height: 1.7),
76
+ ),
77
+ const SizedBox(height: 20),
78
+ Container(
79
+ padding: const EdgeInsets.all(16),
80
+ decoration: BoxDecoration(
81
+ color: theme.colorScheme.surface,
82
+ borderRadius: BorderRadius.circular(18),
83
+ border: Border.all(color: theme.dividerColor),
84
+ ),
85
+ child: Column(
86
+ crossAxisAlignment: CrossAxisAlignment.start,
87
+ children: [
88
+ Text(
89
+ '在线版本链接',
90
+ style: theme.textTheme.titleSmall?.copyWith(
91
+ fontWeight: FontWeight.w700,
92
+ ),
93
+ ),
94
+ const SizedBox(height: 8),
95
+ SelectableText(
96
+ onlineUrl,
97
+ style: theme.textTheme.bodySmall,
98
+ ),
99
+ ],
100
+ ),
101
+ ),
102
+ ],
103
+ ),
104
+ ),
105
+ );
106
+ }
107
+ }
108
+
109
+ const String _defaultUserAgreement = '''
110
+ 一、协议说明
111
+
112
+ 1. 本协议由 ${EnvConfig.appOperatorName} 与 ${EnvConfig.appName} 用户共同缔结,用于说明你使用本应用服务时的基本权利义务。
113
+ 2. 在你使用本应用前,请认真阅读本协议及《隐私政策》。你点击“同意并继续”或继续使用本应用,即表示你已阅读、理解并接受本协议全部内容。
114
+ 3. 如你不同意本协议或《隐私政策》,请立即停止使用本应用,并选择“暂不使用”退出。
115
+
116
+ 二、服务内容
117
+
118
+ 1. 本应用为 Flutter 单包 Starter 默认生成的示例工程,可包含页面展示、网络请求、协议弹窗、本地存储、可选工具能力等基础功能。
119
+ 2. 具体业务能力、展示内容、账号体系、支付、消息推送、第三方登录、上传下载等功能,以上线版本真实配置为准。
120
+ 3. 本应用保留根据业务发展调整、升级、暂停或终止部分服务的权利。
121
+
122
+ 三、账号与使用规范
123
+
124
+ 1. 你应依法合规使用本应用,不得利用本应用从事违法违规活动。
125
+ 2. 你不得干扰本应用正常运行,不得尝试入侵、抓取、攻击、反编译或以其他方式破坏服务安全。
126
+ 3. 若你在使用过程中提交内容,应保证该内容合法、真实、完整,不侵犯第三方合法权益。
127
+
128
+ 四、知识产权
129
+
130
+ 1. 本应用界面、代码、文档、图标、设计稿、品牌标识及相关内容的知识产权归运营方或相关权利人所有。
131
+ 2. 未经书面许可,你不得擅自复制、修改、传播、出租、出售或用于其他商业用途。
132
+
133
+ 五、免责与责任限制
134
+
135
+ 1. 本应用将尽合理努力保障服务稳定,但不对因不可抗力、网络异常、系统故障、第三方服务异常等原因造成的服务中断承担超出法律规定的责任。
136
+ 2. 对于因你违反法律法规、本协议或操作不当而造成的损失,由你自行承担。
137
+ 3. 如法律法规另有强制规定的,从其规定。
138
+
139
+ 六、协议更新
140
+
141
+ 1. 本协议可能根据业务变化、法规要求或产品升级进行调整。
142
+ 2. 协议内容更新后,可通过应用内弹窗、应用内页面、官网公告等方式提示你。
143
+ 3. 若更新后的协议涉及你的重大权益变化,我们将以更显著方式提示。
144
+
145
+ 七、联系我们
146
+
147
+ 如你对本协议有任何疑问、意见或建议,请通过以下方式联系:
148
+
149
+ 运营主体:${EnvConfig.appOperatorName}
150
+ 联系邮箱:${EnvConfig.privacyContactEmail}
151
+ 生效日期:${EnvConfig.agreementEffectiveDate}
152
+ ''';
153
+
154
+ const String _defaultPrivacyPolicy = '''
155
+ 一、引言
156
+
157
+ 1. 本隐私政策由 ${EnvConfig.appOperatorName} 制定,用于说明 ${EnvConfig.appName} 如何收集、使用、存储、共享与保护你的个人信息。
158
+ 2. 请在使用本应用前仔细阅读本政策,重点关注加粗或单独列示的内容。
159
+ 3. 你点击“同意并继续”后,本应用才会按照本政策说明处理你的个人信息。
160
+
161
+ 二、我们如何收集和使用个人信息
162
+
163
+ 1. 为保障基础功能运行,本应用可能处理以下信息:
164
+ - 设备基础信息:如设备型号、系统版本、应用版本、日志信息。
165
+ - 网络信息:如网络状态、请求结果、接口错误信息。
166
+ - 你主动提交的信息:如账号、昵称、反馈内容、业务表单内容。
167
+ - 你授权后提供的信息:如相机、相册、存储、位置信息、通知权限对应的数据。
168
+ 2. 我们仅在具备明确业务目的和合法基础时处理你的个人信息。
169
+ 3. 不同能力的处理范围以你实际启用和使用的功能为准。
170
+
171
+ 三、权限申请说明
172
+
173
+ 1. 本应用遵循“按业务场景、按需申请”的原则,不会在首次启动时一揽子申请所有权限。
174
+ 2. 相机、相册、麦克风、定位、通知等敏感权限,只有在你主动触发对应功能时才会请求授权。
175
+ 3. 若你拒绝授权,相关功能可能无法使用,但不影响其他无关功能。
176
+
177
+ 四、网络与第三方能力说明
178
+
179
+ 1. 本应用可能使用网络能力获取业务数据、静态资源或在线协议链接。
180
+ 2. 在你同意本政策前,默认协议查看页应优先使用应用内离线文本,不依赖在线页面完成首次阅读。
181
+ 3. 若项目后续接入统计、推送、崩溃分析、登录、支付、地图、客服等第三方 SDK,应在正式上线前补充其名称、目的、收集信息类型和隐私政策链接。
182
+
183
+ 五、信息存储与保护
184
+
185
+ 1. 我们会采取合理可行的安全措施保护你的个人信息,防止未经授权的访问、披露、篡改或丢失。
186
+ 2. 我们仅在实现处理目的所需的最短期限内保存你的个人信息,法律法规另有规定的除外。
187
+ 3. 当超出保存期限后,我们会删除或匿名化处理相关信息。
188
+
189
+ 六、信息共享、转让和公开披露
190
+
191
+ 1. 未经你的单独同意,我们不会向无关第三方共享你的个人信息,法律法规另有要求的除外。
192
+ 2. 若发生合并、分立、资产转让等情形导致信息转移,我们会要求承接方继续受本政策约束。
193
+ 3. 除法律法规规定或取得你的单独同意外,我们不会公开披露你的个人信息。
194
+
195
+ 七、你的权利
196
+
197
+ 你依法享有以下权利:
198
+
199
+ 1. 查阅、复制、更正、补充你的个人信息。
200
+ 2. 删除你的个人信息或撤回授权同意。
201
+ 3. 注销账号。
202
+ 4. 获取本政策说明和投诉反馈渠道。
203
+
204
+ 如你需要行使上述权利,请通过本政策提供的联系方式与我们联系。
205
+
206
+ 八、未成年人保护
207
+
208
+ 1. 若你是未满 14 周岁的未成年人,请在监护人陪同下阅读并决定是否同意本政策。
209
+ 2. 若我们发现未经监护人同意处理了未成年人个人信息,将依法尽快删除或匿名化处理。
210
+
211
+ 九、政策更新与联系我们
212
+
213
+ 1. 本政策可能因法规要求、业务变化或第三方能力调整而更新。
214
+ 2. 如更新影响你的重大权益,我们会通过弹窗、公告等显著方式提示。
215
+ 3. 你可通过以下方式联系我们:
216
+
217
+ 运营主体:${EnvConfig.appOperatorName}
218
+ 联系邮箱:${EnvConfig.privacyContactEmail}
219
+ 生效日期:${EnvConfig.agreementEffectiveDate}
220
+ ''';