flu-cli-core 1.0.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 (56) hide show
  1. package/README.md +60 -0
  2. package/dist/chunk-FOMWV2YP.js +378 -0
  3. package/dist/chunk-SW6YDKXI.js +112 -0
  4. package/dist/factory-6DDXZYQP.js +6 -0
  5. package/dist/index.cjs +4668 -0
  6. package/dist/index.d.cts +644 -0
  7. package/dist/index.d.ts +644 -0
  8. package/dist/index.js +4037 -0
  9. package/dist/upgrade_snippets-XFR7Q444.js +8 -0
  10. package/locales/en-US.json +59 -0
  11. package/locales/zh-CN.json +59 -0
  12. package/package.json +52 -0
  13. package/templates/README.md +129 -0
  14. package/templates/core_files/base/base_list_page.dart.template +225 -0
  15. package/templates/core_files/base/base_list_viewmodel.dart.template +164 -0
  16. package/templates/core_files/base/base_page.dart.template +252 -0
  17. package/templates/core_files/base/base_viewmodel.dart.template +68 -0
  18. package/templates/core_files/base/index.dart.template +5 -0
  19. package/templates/core_files/config/app_config.dart.template +142 -0
  20. package/templates/core_files/config/app_initializer.dart.template +74 -0
  21. package/templates/core_files/config/index.dart.template +3 -0
  22. package/templates/core_files/index.dart.template +8 -0
  23. package/templates/core_files/network/README.md +378 -0
  24. package/templates/core_files/network/app_error_code.dart.template +49 -0
  25. package/templates/core_files/network/app_http.dart.template +306 -0
  26. package/templates/core_files/network/app_response.dart.template +81 -0
  27. package/templates/core_files/network/index.dart.template +12 -0
  28. package/templates/core_files/network/interceptors/app_response_interceptor.dart.template +44 -0
  29. package/templates/core_files/network/interceptors/auth_interceptor.dart.template +30 -0
  30. package/templates/core_files/network/interceptors/error_interceptor.dart.template +48 -0
  31. package/templates/core_files/network/interceptors/index.dart.template +6 -0
  32. package/templates/core_files/network/interceptors/log_interceptor.dart.template +97 -0
  33. package/templates/core_files/network/interceptors/network_error_interceptor.dart.template +58 -0
  34. package/templates/core_files/network/interceptors/retry_interceptor.dart.template +69 -0
  35. package/templates/core_files/network/response_adapter.dart.template +69 -0
  36. package/templates/core_files/router/app_routes.dart.template +32 -0
  37. package/templates/core_files/router/index.dart.template +3 -0
  38. package/templates/core_files/router/navigator_util_getx.dart.template +131 -0
  39. package/templates/core_files/router/navigator_util_material.dart.template +191 -0
  40. package/templates/core_files/storage/index.dart.template +3 -0
  41. package/templates/core_files/storage/storage_keys.dart.template +34 -0
  42. package/templates/core_files/storage/storage_util.dart.template +102 -0
  43. package/templates/core_files/theme/app_theme.dart.template +37 -0
  44. package/templates/core_files/theme/index.dart.template +3 -0
  45. package/templates/core_files/theme/status_views_theme.dart.template +40 -0
  46. package/templates/core_files/utils/index.dart.template +2 -0
  47. package/templates/core_files/utils/loading_util.dart.template +55 -0
  48. package/templates/core_files/utils/toast_util.dart.template +128 -0
  49. package/templates/examples/eg_list_page.dart.template +340 -0
  50. package/templates/examples/eg_list_viewmodel.dart.template +31 -0
  51. package/templates/examples/eg_service.dart.template +78 -0
  52. package/templates/examples/mock_data.dart.template +50388 -0
  53. package/templates/examples/tu_chong_model.dart.template +633 -0
  54. package/templates/request_helper.dart.template +59 -0
  55. package/templates/snippets/flu-cli.code-snippets +268 -0
  56. package/templates/snippets/flu-cli.code-snippets.backup +268 -0
@@ -0,0 +1,268 @@
1
+ {
2
+ "InkWell": {
3
+ "prefix": "ik",
4
+ "body": [
5
+ "InkWell(",
6
+ "\tonTap: () {",
7
+ "\t\t$0",
8
+ "\t},",
9
+ "\tchild: ${1:child},",
10
+ ");"
11
+ ]
12
+ },
13
+ "by": {
14
+ "prefix": "by",
15
+ "body": [
16
+ "Widget body = Container();",
17
+ "return body;"
18
+ ]
19
+ },
20
+ "flu.stPage": {
21
+ "prefix": "stPage",
22
+ "description": "Stateful 页面(使用 BasePage)",
23
+ "body": [
24
+ "import 'package:flutter/material.dart';",
25
+ "import '${relative_core_path}';",
26
+ "import '../viewmodels/${1:${2/(.*)/${1:/downcase}/}_viewmodel}.dart';",
27
+ "",
28
+ "class ${2:Name}Page extends BasePage<${2:Name}ViewModel> {",
29
+ " const ${2:Name}Page({super.key});",
30
+ "",
31
+ " @override",
32
+ " State<${2:Name}Page> createState() => _${2:Name}PageState();",
33
+ "}",
34
+ "",
35
+ "class _${2:Name}PageState extends BasePageState<${2:Name}ViewModel, ${2:Name}Page> {",
36
+ " // ==================== UI 配置 ====================",
37
+ " @override",
38
+ " String get title => '${3:Title}';",
39
+ "",
40
+ " // ==================== ViewModel ====================",
41
+ " @override",
42
+ " ${2:Name}ViewModel createViewModel() => ${2:Name}ViewModel();",
43
+ "",
44
+ " // ==================== UI 构建 ====================",
45
+ " @override",
46
+ " Widget buildContent(BuildContext context) {",
47
+ " return const Center(",
48
+ " child: Text('${2:Name}Page'),",
49
+ " );",
50
+ " }",
51
+ "}",
52
+ ""
53
+ ]
54
+ },
55
+ "flu.lessPage": {
56
+ "prefix": "lessPage",
57
+ "description": "Stateless 页面(简单)",
58
+ "body": [
59
+ "import 'package:flutter/material.dart';",
60
+ "",
61
+ "class ${1:Name}Page extends StatelessWidget {",
62
+ " const ${1:Name}Page({super.key});",
63
+ "",
64
+ " @override",
65
+ " Widget build(BuildContext context) {",
66
+ " return Scaffold(",
67
+ " appBar: AppBar(",
68
+ " title: const Text('${2:Title}'),",
69
+ " ),",
70
+ " body: const Center(",
71
+ " child: Text('${1:Name}Page'),",
72
+ " ),",
73
+ " );",
74
+ " }",
75
+ "}",
76
+ ""
77
+ ]
78
+ },
79
+ "flu.stWidget": {
80
+ "prefix": "stWidget",
81
+ "description": "Stateful 组件",
82
+ "body": [
83
+ "import 'package:flutter/material.dart';",
84
+ "",
85
+ "class ${1:Name}Widget extends StatefulWidget {",
86
+ " const ${1:Name}Widget({super.key});",
87
+ "",
88
+ " @override",
89
+ " State<${1:Name}Widget> createState() => _${1:Name}WidgetState();",
90
+ "}",
91
+ "",
92
+ "class _${1:Name}WidgetState extends State<${1:Name}Widget> {",
93
+ " @override",
94
+ " Widget build(BuildContext context) {",
95
+ " return Container();",
96
+ " }",
97
+ "}",
98
+ ""
99
+ ]
100
+ },
101
+ "flu.lessWidget": {
102
+ "prefix": "lessWidget",
103
+ "description": "Stateless 组件",
104
+ "body": [
105
+ "import 'package:flutter/material.dart';",
106
+ "",
107
+ "class ${1:Name}Widget extends StatelessWidget {",
108
+ " const ${1:Name}Widget({super.key});",
109
+ "",
110
+ " @override",
111
+ " Widget build(BuildContext context) {",
112
+ " return Container();",
113
+ " }",
114
+ "}",
115
+ ""
116
+ ]
117
+ },
118
+ "flu.viewmodel": {
119
+ "prefix": "viewmodel",
120
+ "description": "ViewModel(使用 BaseViewModel)",
121
+ "body": [
122
+ "import '${relative_core_path}';",
123
+ "",
124
+ "class ${1:Name}ViewModel extends BaseViewModel {",
125
+ " /// 初始化",
126
+ " @override",
127
+ " Future<void> onInit() async {",
128
+ " await super.onInit();",
129
+ " // TODO: 初始化逻辑",
130
+ " }",
131
+ "",
132
+ " /// 刷新数据",
133
+ " @override",
134
+ " Future<void> refreshData() async {",
135
+ " // TODO: 刷新逻辑",
136
+ " }",
137
+ "}",
138
+ ""
139
+ ]
140
+ },
141
+ "flu.model": {
142
+ "prefix": "model",
143
+ "description": "基础 Model(JSON 序列化)",
144
+ "body": [
145
+ "class ${1:Name}Model {",
146
+ " final String id;",
147
+ " final String name;",
148
+ "",
149
+ " const ${1:Name}Model({",
150
+ " required this.id,",
151
+ " required this.name,",
152
+ " });",
153
+ "",
154
+ " factory ${1:Name}Model.fromJson(Map<String, dynamic> json) {",
155
+ " return ${1:Name}Model(",
156
+ " id: json['id'] as String,",
157
+ " name: json['name'] as String,",
158
+ " );",
159
+ " }",
160
+ "",
161
+ " Map<String, dynamic> toJson() {",
162
+ " return {",
163
+ " 'id': id,",
164
+ " 'name': name,",
165
+ " };",
166
+ " }",
167
+ "}",
168
+ ""
169
+ ]
170
+ },
171
+ "flu.listPage": {
172
+ "prefix": "listPage",
173
+ "description": "List Page (BaseListPage)",
174
+ "body": [
175
+ "import 'package:flutter/material.dart';",
176
+ "import '${relative_core_path}';",
177
+ "import '../viewmodels/${1:${2/(.*)/${1:/downcase}/}_viewmodel}.dart';",
178
+ "import '../models/${3:${4/(.*)/${1:/downcase}/}_model}.dart';",
179
+ "",
180
+ "class ${2:Name}Page extends BaseListPage<${2:Name}ViewModel, ${4:ModelName}> {",
181
+ " const ${2:Name}Page({super.key});",
182
+ "",
183
+ " @override",
184
+ " State<${2:Name}Page> createState() => _${2:Name}PageState();",
185
+ "}",
186
+ "",
187
+ "class _${2:Name}PageState extends BaseListPageState<${2:Name}ViewModel, ${4:ModelName}, ${2:Name}Page> {",
188
+ " @override",
189
+ " String get title => '${5:Title}';",
190
+ "",
191
+ " @override",
192
+ " ${2:Name}ViewModel createViewModel() => ${2:Name}ViewModel();",
193
+ "",
194
+ " @override",
195
+ " Widget buildItem(BuildContext context, ${4:ModelName} item, int index) {",
196
+ " return ListTile(",
197
+ " title: Text(item.name),",
198
+ " );",
199
+ " }",
200
+ "}",
201
+ ""
202
+ ]
203
+ },
204
+ "flu.listViewModel": {
205
+ "prefix": "listViewModel",
206
+ "description": "List ViewModel (BaseListViewModel)",
207
+ "body": [
208
+ "import '${relative_core_path}';",
209
+ "import '../models/${1:${2/(.*)/${1:/downcase}/}_model}.dart';",
210
+ "",
211
+ "class ${2:Name}ViewModel extends BaseListViewModel<${1:ModelName}> {",
212
+ " @override",
213
+ " Future<List<${1:ModelName}>> fetchPage({required int page, required int pageSize}) async {",
214
+ " // TODO: Load data from service",
215
+ " await Future.delayed(const Duration(seconds: 1));",
216
+ " return [];",
217
+ " }",
218
+ "}",
219
+ ""
220
+ ]
221
+ },
222
+ "flu.service": {
223
+ "prefix": "service",
224
+ "description": "Service (服务层)",
225
+ "body": [
226
+ "import '${relative_core_path}';",
227
+ "",
228
+ "class ${1:Name}Service {",
229
+ " /// 获取列表数据",
230
+ " Future<List<dynamic>> fetchList({",
231
+ " int page = 1,",
232
+ " int pageSize = 10,",
233
+ " }) async {",
234
+ " // TODO: 实现网络请求",
235
+ " await Future.delayed(const Duration(seconds: 1));",
236
+ " return [];",
237
+ " }",
238
+ "",
239
+ " /// 根据 ID 获取详情",
240
+ " Future<dynamic> fetchById(String id) async {",
241
+ " // TODO: 实现网络请求",
242
+ " return null;",
243
+ " }",
244
+ "}",
245
+ ""
246
+ ]
247
+ },
248
+ "flu.component": {
249
+ "prefix": "component",
250
+ "description": "通用组件",
251
+ "body": [
252
+ "import 'package:flutter/material.dart';",
253
+ "",
254
+ "class ${1:Name}Component extends StatelessWidget {",
255
+ " const ${1:Name}Component({super.key});",
256
+ "",
257
+ " @override",
258
+ " Widget build(BuildContext context) {",
259
+ " return Container(",
260
+ " padding: const EdgeInsets.all(16),",
261
+ " child: const Text('${1:Name}Component'),",
262
+ " );",
263
+ " }",
264
+ "}",
265
+ ""
266
+ ]
267
+ }
268
+ }
@@ -0,0 +1,268 @@
1
+ {
2
+ "InkWell": {
3
+ "prefix": "ik",
4
+ "body": [
5
+ "InkWell(",
6
+ "\tonTap: () {",
7
+ "\t\t$0",
8
+ "\t},",
9
+ "\tchild: ${1:child},",
10
+ ");"
11
+ ]
12
+ },
13
+ "by": {
14
+ "prefix": "by",
15
+ "body": [
16
+ "Widget body = Container();",
17
+ "return body;"
18
+ ]
19
+ },
20
+ "flu.stPage": {
21
+ "prefix": "stPage",
22
+ "description": "Stateful 页面(使用 BasePage)",
23
+ "body": [
24
+ "import 'package:flutter/material.dart';",
25
+ "import '../core/index.dart';",
26
+ "import '../viewmodels/${1:${2/(.*)/${1:/downcase}/}_viewmodel}.dart';",
27
+ "",
28
+ "class ${2:Name}Page extends BasePage<${2:Name}ViewModel> {",
29
+ " const ${2:Name}Page({super.key});",
30
+ "",
31
+ " @override",
32
+ " State<${2:Name}Page> createState() => _${2:Name}PageState();",
33
+ "}",
34
+ "",
35
+ "class _${2:Name}PageState extends BasePageState<${2:Name}ViewModel, ${2:Name}Page> {",
36
+ " // ==================== UI 配置 ====================",
37
+ " @override",
38
+ " String get title => '${3:Title}';",
39
+ "",
40
+ " // ==================== ViewModel ====================",
41
+ " @override",
42
+ " ${2:Name}ViewModel createViewModel() => ${2:Name}ViewModel();",
43
+ "",
44
+ " // ==================== UI 构建 ====================",
45
+ " @override",
46
+ " Widget buildContent(BuildContext context) {",
47
+ " return const Center(",
48
+ " child: Text('${2:Name}Page'),",
49
+ " );",
50
+ " }",
51
+ "}",
52
+ ""
53
+ ]
54
+ },
55
+ "flu.lessPage": {
56
+ "prefix": "lessPage",
57
+ "description": "Stateless 页面(简单)",
58
+ "body": [
59
+ "import 'package:flutter/material.dart';",
60
+ "",
61
+ "class ${1:Name}Page extends StatelessWidget {",
62
+ " const ${1:Name}Page({super.key});",
63
+ "",
64
+ " @override",
65
+ " Widget build(BuildContext context) {",
66
+ " return Scaffold(",
67
+ " appBar: AppBar(",
68
+ " title: const Text('${2:Title}'),",
69
+ " ),",
70
+ " body: const Center(",
71
+ " child: Text('${1:Name}Page'),",
72
+ " ),",
73
+ " );",
74
+ " }",
75
+ "}",
76
+ ""
77
+ ]
78
+ },
79
+ "flu.stWidget": {
80
+ "prefix": "stWidget",
81
+ "description": "Stateful 组件",
82
+ "body": [
83
+ "import 'package:flutter/material.dart';",
84
+ "",
85
+ "class ${1:Name}Widget extends StatefulWidget {",
86
+ " const ${1:Name}Widget({super.key});",
87
+ "",
88
+ " @override",
89
+ " State<${1:Name}Widget> createState() => _${1:Name}WidgetState();",
90
+ "}",
91
+ "",
92
+ "class _${1:Name}WidgetState extends State<${1:Name}Widget> {",
93
+ " @override",
94
+ " Widget build(BuildContext context) {",
95
+ " return Container();",
96
+ " }",
97
+ "}",
98
+ ""
99
+ ]
100
+ },
101
+ "flu.lessWidget": {
102
+ "prefix": "lessWidget",
103
+ "description": "Stateless 组件",
104
+ "body": [
105
+ "import 'package:flutter/material.dart';",
106
+ "",
107
+ "class ${1:Name}Widget extends StatelessWidget {",
108
+ " const ${1:Name}Widget({super.key});",
109
+ "",
110
+ " @override",
111
+ " Widget build(BuildContext context) {",
112
+ " return Container();",
113
+ " }",
114
+ "}",
115
+ ""
116
+ ]
117
+ },
118
+ "flu.viewmodel": {
119
+ "prefix": "viewmodel",
120
+ "description": "ViewModel(使用 BaseViewModel)",
121
+ "body": [
122
+ "import '../core/index.dart';",
123
+ "",
124
+ "class ${1:Name}ViewModel extends BaseViewModel {",
125
+ " /// 初始化",
126
+ " @override",
127
+ " Future<void> onInit() async {",
128
+ " await super.onInit();",
129
+ " // TODO: 初始化逻辑",
130
+ " }",
131
+ "",
132
+ " /// 刷新数据",
133
+ " @override",
134
+ " Future<void> refreshData() async {",
135
+ " // TODO: 刷新逻辑",
136
+ " }",
137
+ "}",
138
+ ""
139
+ ]
140
+ },
141
+ "flu.model": {
142
+ "prefix": "model",
143
+ "description": "基础 Model(JSON 序列化)",
144
+ "body": [
145
+ "class ${1:Name}Model {",
146
+ " final String id;",
147
+ " final String name;",
148
+ "",
149
+ " const ${1:Name}Model({",
150
+ " required this.id,",
151
+ " required this.name,",
152
+ " });",
153
+ "",
154
+ " factory ${1:Name}Model.fromJson(Map<String, dynamic> json) {",
155
+ " return ${1:Name}Model(",
156
+ " id: json['id'] as String,",
157
+ " name: json['name'] as String,",
158
+ " );",
159
+ " }",
160
+ "",
161
+ " Map<String, dynamic> toJson() {",
162
+ " return {",
163
+ " 'id': id,",
164
+ " 'name': name,",
165
+ " };",
166
+ " }",
167
+ "}",
168
+ ""
169
+ ]
170
+ },
171
+ "flu.listPage": {
172
+ "prefix": "listPage",
173
+ "description": "List Page (BaseListPage)",
174
+ "body": [
175
+ "import 'package:flutter/material.dart';",
176
+ "import '../core/index.dart';",
177
+ "import '../viewmodels/${1:${2/(.*)/${1:/downcase}/}_viewmodel}.dart';",
178
+ "import '../models/${3:${4/(.*)/${1:/downcase}/}_model}.dart';",
179
+ "",
180
+ "class ${2:Name}Page extends BaseListPage<${2:Name}ViewModel, ${4:ModelName}> {",
181
+ " const ${2:Name}Page({super.key});",
182
+ "",
183
+ " @override",
184
+ " State<${2:Name}Page> createState() => _${2:Name}PageState();",
185
+ "}",
186
+ "",
187
+ "class _${2:Name}PageState extends BaseListPageState<${2:Name}ViewModel, ${4:ModelName}, ${2:Name}Page> {",
188
+ " @override",
189
+ " String get title => '${5:Title}';",
190
+ "",
191
+ " @override",
192
+ " ${2:Name}ViewModel createViewModel() => ${2:Name}ViewModel();",
193
+ "",
194
+ " @override",
195
+ " Widget buildItem(BuildContext context, ${4:ModelName} item, int index) {",
196
+ " return ListTile(",
197
+ " title: Text(item.name),",
198
+ " );",
199
+ " }",
200
+ "}",
201
+ ""
202
+ ]
203
+ },
204
+ "flu.listViewModel": {
205
+ "prefix": "listViewModel",
206
+ "description": "List ViewModel (BaseListViewModel)",
207
+ "body": [
208
+ "import '../core/index.dart';",
209
+ "import '../models/${1:${2/(.*)/${1:/downcase}/}_model}.dart';",
210
+ "",
211
+ "class ${2:Name}ViewModel extends BaseListViewModel<${1:ModelName}> {",
212
+ " @override",
213
+ " Future<List<${1:ModelName}>> fetchPage({required int page, required int pageSize}) async {",
214
+ " // TODO: Load data from service",
215
+ " await Future.delayed(const Duration(seconds: 1));",
216
+ " return [];",
217
+ " }",
218
+ "}",
219
+ ""
220
+ ]
221
+ }
222
+ },
223
+ "flu.service": {
224
+ "prefix": "service",
225
+ "description": "Service (服务层)",
226
+ "body": [
227
+ "import '../core/index.dart';",
228
+ "",
229
+ "class ${1:Name}Service {",
230
+ " /// 获取列表数据",
231
+ " Future<List<dynamic>> fetchList({",
232
+ " int page = 1,",
233
+ " int pageSize = 10,",
234
+ " }) async {",
235
+ " // TODO: 实现网络请求",
236
+ " await Future.delayed(const Duration(seconds: 1));",
237
+ " return [];",
238
+ " }",
239
+ "",
240
+ " /// 根据 ID 获取详情",
241
+ " Future<dynamic> fetchById(String id) async {",
242
+ " // TODO: 实现网络请求",
243
+ " return null;",
244
+ " }",
245
+ "}",
246
+ ""
247
+ ]
248
+ },
249
+ "flu.component": {
250
+ "prefix": "component",
251
+ "description": "通用组件",
252
+ "body": [
253
+ "import 'package:flutter/material.dart';",
254
+ "",
255
+ "class ${1:Name}Component extends StatelessWidget {",
256
+ " const ${1:Name}Component({super.key});",
257
+ "",
258
+ " @override",
259
+ " Widget build(BuildContext context) {",
260
+ " return Container(",
261
+ " padding: const EdgeInsets.all(16),",
262
+ " child: const Text('${1:Name}Component'),",
263
+ " );",
264
+ " }",
265
+ "}",
266
+ ""
267
+ ]
268
+ }