diff --git a/lib/fluent/app.dart b/lib/fluent/app.dart deleted file mode 100644 index 8ae277e..0000000 --- a/lib/fluent/app.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:fluent_ui/fluent_ui.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:momo/fluent/router.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -class MyFluentApp extends ConsumerWidget { - const MyFluentApp({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context, WidgetRef ref) { - // final String token = ref.watch(tokenProvider); - Future loadToken() async { - final prefs = await SharedPreferences.getInstance(); - String? tk = prefs.getString("token"); - return tk; - } - - return FutureBuilder( - future: loadToken(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - MyFluentRouterConfig myFluentRouterConfig = - MyFluentRouterConfig(snapshot.data); - return FluentApp.router( - routeInformationParser: - myFluentRouterConfig.router.routeInformationParser, - routerDelegate: myFluentRouterConfig.router.routerDelegate, - color: Colors.blue, - ); - } else { - return const FluentApp( - home: ScaffoldPage( - content: Placeholder(), - ), - ); - } - }); - } -} diff --git a/lib/fluent/home.dart b/lib/fluent/home.dart deleted file mode 100644 index df04215..0000000 --- a/lib/fluent/home.dart +++ /dev/null @@ -1,172 +0,0 @@ -import 'package:fluent_ui/fluent_ui.dart'; -import 'package:fluentui_system_icons/fluentui_system_icons.dart' - as fluentui_system_icons; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:momo/provider/token.dart'; - -class HomePage extends ConsumerStatefulWidget { - const HomePage({Key? key}) : super(key: key); - - @override - ConsumerState createState() => _HomePageState(); -} - -class _HomePageState extends ConsumerState { - int _selected = 0; - - @override - Widget build( - BuildContext context, - ) { - // String token = ref.watch(tokenProvider); - - return MediaQuery.of(context).size.width > 640 - ? NavigationView( - appBar: NavigationAppBar(title: Text('momo')), - pane: NavigationPane( - displayMode: PaneDisplayMode.auto, - selected: _selected, - leading: const Icon( - fluentui_system_icons.FluentIcons.backpack_12_filled), - header: const Text("111"), - onChanged: (idx) { - setState(() { - _selected = idx; - }); - }, - autoSuggestBox: const AutoSuggestBox( - placeholder: "查找", - trailingIcon: Center( - child: Icon( - fluentui_system_icons.FluentIcons.search_12_filled), - ), - items: [], - ), - items: [ - PaneItem( - icon: const Icon(fluentui_system_icons - .FluentIcons.network_adapter_16_regular), - title: const Text('代理'), - // body: DeferredWidget - body: ScaffoldPage( - header: PageHeader( - title: Text("213"), - ), - content: Center( - child: FilledButton( - onPressed: () { - // ref.watch(tokenProvider.notifier).removeToken(); - GoRouter.of(context).go("/login"); - }, - child: Text("退出"), - ), - ), - )), - PaneItem( - icon: const Icon(fluentui_system_icons - .FluentIcons.settings_48_regular), - title: const Text('用户'), - body: ScaffoldPage( - header: const PageHeader( - title: Text("用户"), - ), - // bottomBar: BottomNavigationBarItem(), - // header: HeadingElement.h1(), - content: ListView.separated( - itemCount: 2, - itemBuilder: (context, index) { - return const Card( - margin: EdgeInsets.fromLTRB(12, 0, 12, 0), - padding: EdgeInsets.zero, - child: ListTile( - // tileColor: - // ButtonState.all(const Color(0xffeeeeee)), - leading: Icon(fluentui_system_icons - .FluentIcons - .serial_port_24_regular), - title: Text("端口"), - trailing: SizedBox( - width: 100, - child: TextBox( - placeholder: "端口", - ), - ))); - }, - separatorBuilder: (context, index) => - const SizedBox( - height: 2, - )))) - ]), - ) - : Container( - color: Colors.white, - child: ScaffoldPage( - header: PageHeader( - leading: IconButton( - icon: const Icon(fluentui_system_icons - .FluentIcons.arrow_hook_up_left_28_filled), - onPressed: () {}, - ), - title: Text("用户"), - ), - content: Column( - children: [ - Expanded( - child: ListView(), - ), - BottomNavigation( - index: _selected, - onChanged: (idx) { - setState(() { - _selected = idx; - }); - }, - items: const [ - BottomNavigationItem( - title: Text("相册"), - icon: Icon(fluentui_system_icons - .FluentIcons.fingerprint_48_regular)), - BottomNavigationItem( - title: Text("用户"), - icon: Icon(fluentui_system_icons - .FluentIcons.person_48_regular)) - ], - ) - ], - ), - ), - ); - // Column( - // children: [ - // Expanded( - // child: ScaffoldPage( - // header: PageHeader( - // title: Text("用户"), - // ), - // content: Container( - // color: Colors.white, - // ), - // )), - // BottomNavigation( - // index: _selected, - // onChanged: (idx) { - // setState(() { - // _selected = idx; - // }); - // }, - // items: const [ - // BottomNavigationItem( - // title: Text("相册"), - // icon: Icon(fluentui_system_icons - // .FluentIcons.fingerprint_48_regular)), - // BottomNavigationItem( - // title: Text("用户"), - // icon: Icon( - // fluentui_system_icons.FluentIcons.person_48_regular)) - // ], - // ) - // ], - // ); - } -} diff --git a/lib/fluent/login.dart b/lib/fluent/login.dart deleted file mode 100644 index 3ece356..0000000 --- a/lib/fluent/login.dart +++ /dev/null @@ -1,91 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; -import 'dart:math'; - -import 'package:fluent_ui/fluent_ui.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; -import 'package:momo/models/login_resp.dart'; -import 'package:momo/provider/token.dart'; -import 'package:provider/provider.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -class LoginPage extends StatelessWidget { - const LoginPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - // padding: EdgeInsets.all(100), - color: Colors.white, - child: const ScaffoldPage( - header: PageHeader( - title: Text("登录"), - ), - content: LoginForm(), - ), - ); - } -} - -class LoginForm extends StatefulWidget { - const LoginForm({Key? key}) : super(key: key); - - @override - State createState() => _LoginFormState(); -} - -class _LoginFormState extends State { - TextEditingController usernameController = TextEditingController(); - TextEditingController passwordController = TextEditingController(); - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.fromLTRB(50, 0, 50, 0), - child: ListView( - children: [ - TextBox( - controller: usernameController, - header: "账号", - placeholder: "请输入账号", - ), - TextBox( - controller: passwordController, - header: "密码", - placeholder: "请输入密码", - ), - FilledButton( - child: Text('登录'), - onPressed: () { - if (usernameController.text.isNotEmpty && - passwordController.text.isNotEmpty) { - http - .post(Uri.parse("http://192.168.110.156:8080/user/login"), - headers: {"Content-Type": "application/json"}, - body: jsonEncode({ - "username": usernameController.text, - "password": passwordController.text - })) - .then((resp) { - print(resp.body); - if (resp.statusCode == HttpStatus.ok) { - LoginResp loginResp = - LoginResp.fromJson(jsonDecode(resp.body)); - print(loginResp.token); - // Provider.of(context).setToken(loginResp.token); - context.go("/"); - // SharedPreferences.getInstance().then((prefs) { - // prefs.setString("token", loginResp.token); - // }); - // .then((value) { - // }); - } - }); - } - }) - ], - ), - ); - } -} diff --git a/lib/fluent/router.dart b/lib/fluent/router.dart deleted file mode 100644 index c94c05c..0000000 --- a/lib/fluent/router.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:fluent_ui/fluent_ui.dart'; -import 'package:go_router/go_router.dart'; -import 'package:momo/fluent/home.dart'; -import 'package:momo/fluent/login.dart'; - -class MyFluentRouterConfig { - late GoRouter router; - - MyFluentRouterConfig(String? token) { - router = GoRouter( - routes: [ - GoRoute( - path: '/', - builder: (BuildContext context, GoRouterState state) { - return const HomePage(); - }, - redirect: (BuildContext context, GoRouterState state) { - if (token == null || token.isEmpty) { - return "/login"; - } - return null; - }, - ), - GoRoute( - path: "/login", - builder: (BuildContext context, GoRouterState state) { - return const LoginPage(); - }) - ], - ); - } -} - -class TextLogin extends StatelessWidget { - const TextLogin({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ScaffoldPage( - content: Center( - child: FilledButton( - child: Text("logi"), - onPressed: () { - context.go("/"); - }), - ), - ); - } -} diff --git a/lib/main.dart b/lib/main.dart index 6d6d563..85272d7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -38,17 +38,6 @@ void main() async { child: const MyApp(), ), ); - // runApp((child: MyApp(token: tk))); - // runApp(MultiProvider( - // providers: [ - // ChangeNotifierProvider( - // create: (context) => Secret(), - // ), - // ], - // child: MyApp( - // token: tk, - // ), - // )); } class MyApp extends StatelessWidget { @@ -58,8 +47,6 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - // Provider.of(context, listen: false).setToken(token); - return const MyMaterialApp(); } } diff --git a/lib/material/app.dart b/lib/material/app.dart index 463eadb..0adcfbb 100644 --- a/lib/material/app.dart +++ b/lib/material/app.dart @@ -5,7 +5,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:momo/material/router.dart'; import 'package:momo/provider/token.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:provider/provider.dart'; class MyMaterialApp extends ConsumerWidget { const MyMaterialApp({Key? key}) : super(key: key); diff --git a/lib/material/detail.dart b/lib/material/detail.dart new file mode 100644 index 0000000..915e001 --- /dev/null +++ b/lib/material/detail.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class ImageDetail extends StatefulWidget { + const ImageDetail({Key? key}) : super(key: key); + + @override + State createState() => _ImageDetailState(); +} + +class _ImageDetailState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/material/gallery.dart b/lib/material/gallery.dart index 81e3cd6..dd4678c 100644 --- a/lib/material/gallery.dart +++ b/lib/material/gallery.dart @@ -1,17 +1,9 @@ -import 'dart:convert'; - import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; import 'package:momo/models/image_list_resp.dart'; import 'package:momo/models/image_resp.dart'; -import 'package:momo/provider/token.dart'; - -// import 'package:flutter_riverpod/flutter_riverpod.dart'; -// import 'package:go_router/go_router.dart'; -// import 'package:momo/provider/token.dart'; -// import 'package:provider/provider.dart'; +import 'package:momo/request/http_client.dart'; class Gallery extends ConsumerStatefulWidget { const Gallery({Key? key}) : super(key: key); @@ -20,15 +12,17 @@ class Gallery extends ConsumerStatefulWidget { ConsumerState createState() => _GalleryState(); } -class _GalleryState extends ConsumerState { - Future loadImages(tk) async { - http.Response resp = await http.get( - Uri.parse("http://192.168.110.156:8080/image/history"), - headers: {"Authorization": tk}); - return resp.body; - } +List imageList = []; - List imageList = []; +class _GalleryState extends ConsumerState { + Future loadImages() async { + var resp = await dio.get("/image/history"); + if (mounted) { + setState(() { + imageList = ImageListResp.fromJson(resp.data).list; + }); + } + } @override void dispose() { @@ -36,18 +30,15 @@ class _GalleryState extends ConsumerState { super.dispose(); } + @override + void initState() { + // TODO: implement initState + super.initState(); + loadImages(); + } + @override Widget build(BuildContext context) { - String? tk = ref.watch(tokenProvider); - if (tk != null) { - loadImages(tk).then((bd) { - if (mounted) { - setState(() { - imageList = ImageListResp.fromJson(jsonDecode(bd)).list; - }); - } - }); - } return GridView.builder( itemCount: imageList.length, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( @@ -58,7 +49,7 @@ class _GalleryState extends ConsumerState { context.go("/detail"); }, child: Image.network( - "http://192.168.110.156:8080/image/thumbnail/${imageList[index].file_path}", + "${dio.options.baseUrl}/image/thumbnail/${imageList[index].file_path}", fit: BoxFit.cover, ), ); diff --git a/lib/material/home.dart b/lib/material/home.dart index be9d13d..97e10b1 100644 --- a/lib/material/home.dart +++ b/lib/material/home.dart @@ -5,7 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:http_parser/http_parser.dart'; import 'package:mime/mime.dart'; -import 'package:momo/provider/token.dart'; +import 'package:momo/request/http_client.dart'; class HomePage extends ConsumerStatefulWidget { const HomePage({Key? key, required this.content}) : super(key: key); @@ -18,29 +18,31 @@ class HomePage extends ConsumerStatefulWidget { class _HomePageState extends ConsumerState { int selectedIndex = 0; final tabList = [ - { - "path": "/", - }, - {"path": "/profile"} + {"path": "/", "title": "相册"}, + {"path": "/profile", "title": "用户"} ]; @override Widget build(BuildContext context) { - String? token = ref.watch(tokenProvider); return Scaffold( appBar: AppBar( - title: const Text( - "App Header", - style: TextStyle(fontWeight: FontWeight.bold), + leading: ["/", "/profile"].contains(GoRouterState.of(context).location) + ? null + : IconButton( + icon: const Icon(Icons.keyboard_arrow_left), + onPressed: () { + context.go("/"); + }, + ), + title: Text( + tabList[selectedIndex]["title"] ?? "", + style: const TextStyle(fontWeight: FontWeight.bold), ), elevation: 10, ), floatingActionButton: selectedIndex == 0 ? FloatingActionButton( onPressed: () async { - if (token == null) { - return; - } FilePickerResult? result = await FilePicker.platform.pickFiles(type: FileType.image); @@ -49,7 +51,6 @@ class _HomePageState extends ConsumerState { if (filePath == null) { return; } - Dio dio = Dio(); String? mimeType = lookupMimeType(filePath); FormData data = FormData.fromMap({ "pic": await MultipartFile.fromFile(filePath, @@ -57,10 +58,23 @@ class _HomePageState extends ConsumerState { contentType: MediaType(mimeType!.split("/").first, mimeType.split("/").last)) }); - Response resp = await dio.post( - "http://192.168.110.156:8080/image/upload", - data: data, - options: Options(headers: {"Authorization": token})); + await dio.post("/image/upload", data: data); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: const [ + Icon( + Icons.check_circle, + color: Colors.white, + ), + SizedBox( + width: 10, + ), + Text("上传成功") + ], + ), + backgroundColor: Colors.lightGreen, + )); } else {} // context.go("/login"); @@ -109,6 +123,7 @@ class _HomePageState extends ConsumerState { setState(() { selectedIndex = idx; }); + context.go(tabList[idx]["path"] ?? ""); }, items: const [ BottomNavigationBarItem( diff --git a/lib/material/login.dart b/lib/material/login.dart index d4ef28d..02a9c04 100644 --- a/lib/material/login.dart +++ b/lib/material/login.dart @@ -1,16 +1,11 @@ -import 'dart:convert'; import 'dart:io'; +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; - -// import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; import 'package:momo/models/login_resp.dart'; import 'package:momo/provider/token.dart'; -import 'package:provider/provider.dart'; -import 'package:shared_preferences/shared_preferences.dart'; +import 'package:momo/request/http_client.dart'; class LoginPage extends StatelessWidget { const LoginPage({Key? key}) : super(key: key); @@ -61,7 +56,9 @@ class _LoginFormState extends ConsumerState { height: 20, ), TextFormField( + obscureText: true, controller: passwordController, + // keyboardType: TextInputType., decoration: const InputDecoration( enabledBorder: OutlineInputBorder(borderSide: BorderSide()), focusedBorder: OutlineInputBorder(borderSide: BorderSide()), @@ -76,26 +73,29 @@ class _LoginFormState extends ConsumerState { ElevatedButton( child: const Text("登录"), onPressed: () async { - if (usernameController.text.isNotEmpty && - passwordController.text.isNotEmpty) { - http - .post(Uri.parse("http://192.168.110.156:8080/user/login"), - headers: {"Content-Type": "application/json"}, - body: jsonEncode({ - "username": usernameController.text, - "password": passwordController.text - })) - .then((resp) { - if (resp.statusCode == HttpStatus.ok) { - LoginResp loginResp = - LoginResp.fromJson(jsonDecode(resp.body)); - ref.watch(tokenProvider.notifier).setToken(loginResp.token); - // context.go("/"); - // }); - } - }).catchError((err) { - print(err.toString()); + if (usernameController.text.isEmpty || + passwordController.text.isEmpty) { + return; + } + try { + Response resp = await dio.post("/user/login", data: { + "username": usernameController.text, + "password": passwordController.text }); + if (resp.statusCode == HttpStatus.ok) { + LoginResp loginResp = LoginResp.fromJson(resp.data); + ref.watch(tokenProvider.notifier).setToken(loginResp.token); + } else { + print(resp.statusCode); + } + } catch (e) { + // print(e is DioError); + // DioError err = e; + if (e is DioError) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(e.response?.data["msg"] ?? "请求错误"))); + // print(e.response?.data["msg"] ?? "请求错误"); + } } }), ], diff --git a/lib/material/router.dart b/lib/material/router.dart index 630979f..476e784 100644 --- a/lib/material/router.dart +++ b/lib/material/router.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:momo/material/detail.dart'; import 'package:momo/material/gallery.dart'; import 'package:momo/material/home.dart'; import 'package:momo/material/login.dart'; @@ -35,10 +36,7 @@ class MyMaterialRouterConfig { GoRoute( path: "/detail", pageBuilder: (BuildContext context, GoRouterState state) => - const NoTransitionPage( - child: Center( - child: Text("detail"), - ))) + const NoTransitionPage(child: ImageDetail())), ], ), GoRoute( @@ -52,24 +50,6 @@ class MyMaterialRouterConfig { } return null; }), - // ShellRoute( - // builder: (BuildContext context, GoRouterState state, Widget child) { - // return Scaffold( - // appBar: AppBar( - // title: Text("nest"), - // ), - // body: child, - // ); - // }, - // routes: [ - // GoRoute( - // path: '/', - // builder: (BuildContext context, GoRouterState state) { - // return Center( - // child: Text("login"), - // ); - // }) - // ]), ], ); } diff --git a/lib/provider/token.dart b/lib/provider/token.dart index 51b63c0..6ca5861 100644 --- a/lib/provider/token.dart +++ b/lib/provider/token.dart @@ -1,4 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:momo/request/http_client.dart'; import 'package:shared_preferences/shared_preferences.dart'; class TokenNotifier extends Notifier { @@ -9,6 +10,7 @@ class TokenNotifier extends Notifier { setToken(String? token) { state = token; + dio.options.headers["Authorization"] = token; SharedPreferences.getInstance().then((prefs) { prefs.setString("token", token ?? ""); }); diff --git a/lib/request/http_client.dart b/lib/request/http_client.dart index 946b3e8..5bdcf6c 100644 --- a/lib/request/http_client.dart +++ b/lib/request/http_client.dart @@ -1,11 +1,5 @@ -import 'package:http/http.dart' as http; +import 'package:dio/dio.dart'; -class HttpClient { - HttpClient(this.header); - - Map? header; - - Future post(Uri url) { - return http.post(url); - } -} +var dio = Dio(BaseOptions( + baseUrl: "http://localhost:8080", +)); diff --git a/lib/router.dart b/lib/router.dart index d00eefb..aa37466 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -16,7 +16,7 @@ class MyRouterConfig { // drawer: Drawer(), bottomNavigationBar: MediaQuery.of(context).size.width <= 640 ? BottomNavigationBar( - items: [ + items: const [ BottomNavigationBarItem( icon: Icon(Icons.add), label: "333333333"), BottomNavigationBarItem( @@ -28,7 +28,7 @@ class MyRouterConfig { children: [ MediaQuery.of(context).size.width > 640 ? NavigationRail( - destinations: [ + destinations: const [ NavigationRailDestination( icon: Icon(Icons.add), label: Text("123")), NavigationRailDestination(