mirror of
https://github.com/simon-ding/polaris.git
synced 2026-05-27 21:17:50 +08:00
feat: remove sperate movie page and add default storage
This commit is contained in:
17
db/db.go
17
db/db.go
@@ -43,6 +43,7 @@ func Open() (*Client, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
c.generateJwtSerectIfNotExist()
|
c.generateJwtSerectIfNotExist()
|
||||||
|
c.generateDefaultLocalStorage()
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,6 +56,22 @@ func (c *Client) generateJwtSerectIfNotExist() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) generateDefaultLocalStorage() {
|
||||||
|
n, _ := c.ent.Storage.Query().Count(context.TODO())
|
||||||
|
if n != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.AddStorage(&StorageInfo{
|
||||||
|
Name: "local",
|
||||||
|
Implementation: "local",
|
||||||
|
Default: true,
|
||||||
|
Settings: map[string]string{
|
||||||
|
"tv_path": "/data/tv",
|
||||||
|
"movie_path": "/data/movies",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) GetSetting(key string) string {
|
func (c *Client) GetSetting(key string) string {
|
||||||
v, err := c.ent.Settings.Query().Where(settings.Key(key)).Only(context.TODO())
|
v, err := c.ent.Settings.Query().Where(settings.Key(key)).Only(context.TODO())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:quiver/strings.dart';
|
import 'package:quiver/strings.dart';
|
||||||
import 'package:ui/providers/login.dart';
|
import 'package:ui/providers/login.dart';
|
||||||
import 'package:ui/tv_watchlist.dart';
|
import 'package:ui/welcome_page.dart';
|
||||||
|
|
||||||
class LoginScreen extends ConsumerWidget {
|
class LoginScreen extends ConsumerWidget {
|
||||||
static const route = '/login';
|
static const route = '/login';
|
||||||
@@ -30,7 +30,7 @@ class LoginScreen extends ConsumerWidget {
|
|||||||
ref.read(authSettingProvider.notifier).login(data.name, data.password);
|
ref.read(authSettingProvider.notifier).login(data.name, data.password);
|
||||||
},
|
},
|
||||||
onSubmitAnimationCompleted: () {
|
onSubmitAnimationCompleted: () {
|
||||||
context.go(TvWatchlistPage.route);
|
context.go(WelcomePage.routeTv);
|
||||||
},
|
},
|
||||||
onRecoverPassword: _recoverPassword,
|
onRecoverPassword: _recoverPassword,
|
||||||
userValidator: (value) => isBlank(value)? "不能为空":null,
|
userValidator: (value) => isBlank(value)? "不能为空":null,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import 'package:ui/providers/APIs.dart';
|
|||||||
import 'package:ui/search.dart';
|
import 'package:ui/search.dart';
|
||||||
import 'package:ui/system_settings.dart';
|
import 'package:ui/system_settings.dart';
|
||||||
import 'package:ui/tv_details.dart';
|
import 'package:ui/tv_details.dart';
|
||||||
import 'package:ui/tv_watchlist.dart';
|
import 'package:ui/welcome_page.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
runApp(const MyApp());
|
runApp(const MyApp());
|
||||||
@@ -80,11 +80,11 @@ class MyApp extends StatelessWidget {
|
|||||||
routes: [
|
routes: [
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: "/",
|
path: "/",
|
||||||
redirect: (context, state) => TvWatchlistPage.route,
|
redirect: (context, state) => WelcomePage.routeTv,
|
||||||
),
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: TvWatchlistPage.route,
|
path: WelcomePage.routeTv,
|
||||||
builder: (context, state) => const TvWatchlistPage(),
|
builder: (context, state) => const WelcomePage(),
|
||||||
),
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: TvDetailsPage.route,
|
path: TvDetailsPage.route,
|
||||||
@@ -92,8 +92,8 @@ class MyApp extends StatelessWidget {
|
|||||||
TvDetailsPage(seriesId: state.pathParameters['id']!),
|
TvDetailsPage(seriesId: state.pathParameters['id']!),
|
||||||
),
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: MovieWatchlistPage.route,
|
path: WelcomePage.routeMoivie,
|
||||||
builder: (context, state) => const MovieWatchlistPage(),
|
builder: (context, state) => const WelcomePage(),
|
||||||
),
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: MovieDetailsPage.route,
|
path: MovieDetailsPage.route,
|
||||||
@@ -117,7 +117,6 @@ class MyApp extends StatelessWidget {
|
|||||||
|
|
||||||
final _router = GoRouter(
|
final _router = GoRouter(
|
||||||
navigatorKey: APIs.navigatorKey,
|
navigatorKey: APIs.navigatorKey,
|
||||||
initialLocation: TvWatchlistPage.route,
|
|
||||||
routes: [
|
routes: [
|
||||||
_shellRoute,
|
_shellRoute,
|
||||||
GoRoute(
|
GoRoute(
|
||||||
|
|||||||
@@ -8,55 +8,6 @@ import 'package:ui/providers/welcome_data.dart';
|
|||||||
import 'package:ui/utils.dart';
|
import 'package:ui/utils.dart';
|
||||||
import 'package:ui/widgets/progress_indicator.dart';
|
import 'package:ui/widgets/progress_indicator.dart';
|
||||||
|
|
||||||
class MovieWatchlistPage extends ConsumerWidget {
|
|
||||||
static const route = "/movies";
|
|
||||||
|
|
||||||
const MovieWatchlistPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
|
||||||
final data = ref.watch(movieWatchlistDataProvider);
|
|
||||||
|
|
||||||
return switch (data) {
|
|
||||||
AsyncData(:final value) => SingleChildScrollView(
|
|
||||||
child: Wrap(
|
|
||||||
spacing: 20,
|
|
||||||
children: List.generate(value.length, (i) {
|
|
||||||
var item = value[i];
|
|
||||||
return Card(
|
|
||||||
margin: const EdgeInsets.all(4),
|
|
||||||
clipBehavior: Clip.hardEdge,
|
|
||||||
child: InkWell(
|
|
||||||
//splashColor: Colors.blue.withAlpha(30),
|
|
||||||
onTap: () {
|
|
||||||
context.go(MovieDetailsPage.toRoute(item.id!));
|
|
||||||
//showDialog(context: context, builder: builder)
|
|
||||||
},
|
|
||||||
child: Column(
|
|
||||||
children: <Widget>[
|
|
||||||
SizedBox(
|
|
||||||
width: 160,
|
|
||||||
height: 240,
|
|
||||||
child: Image.network(
|
|
||||||
"${APIs.imagesUrl}/${item.id}/poster.jpg",
|
|
||||||
fit: BoxFit.fill,
|
|
||||||
headers: APIs.authHeaders,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
item.name!,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 14, fontWeight: FontWeight.bold, height: 2.5),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}))),
|
|
||||||
_ => const MyProgressIndicator(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MovieDetailsPage extends ConsumerStatefulWidget {
|
class MovieDetailsPage extends ConsumerStatefulWidget {
|
||||||
static const route = "/movie/:id";
|
static const route = "/movie/:id";
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:ui/activity.dart';
|
import 'package:ui/activity.dart';
|
||||||
import 'package:ui/movie_watchlist.dart';
|
|
||||||
import 'package:ui/search.dart';
|
import 'package:ui/search.dart';
|
||||||
import 'package:ui/system_settings.dart';
|
import 'package:ui/system_settings.dart';
|
||||||
import 'package:ui/tv_watchlist.dart';
|
import 'package:ui/welcome_page.dart';
|
||||||
|
|
||||||
class NavDrawer extends StatefulWidget {
|
class NavDrawer extends StatefulWidget {
|
||||||
const NavDrawer({super.key});
|
const NavDrawer({super.key});
|
||||||
@@ -27,9 +26,9 @@ class _NavDrawerState extends State<NavDrawer> {
|
|||||||
_counter = value;
|
_counter = value;
|
||||||
});
|
});
|
||||||
if (value == 0) {
|
if (value == 0) {
|
||||||
context.go(MovieWatchlistPage.route);
|
context.go(WelcomePage.routeMoivie);
|
||||||
} else if (value == 1) {
|
} else if (value == 1) {
|
||||||
context.go(TvWatchlistPage.route);
|
context.go(WelcomePage.routeTv);
|
||||||
} else if (value == 2) {
|
} else if (value == 2) {
|
||||||
context.go(SearchPage.route);
|
context.go(SearchPage.route);
|
||||||
} else if (value == 3) {
|
} else if (value == 3) {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import 'package:ui/providers/APIs.dart';
|
|||||||
import 'package:ui/providers/series_details.dart';
|
import 'package:ui/providers/series_details.dart';
|
||||||
import 'package:ui/providers/settings.dart';
|
import 'package:ui/providers/settings.dart';
|
||||||
import 'package:ui/utils.dart';
|
import 'package:ui/utils.dart';
|
||||||
import 'package:ui/tv_watchlist.dart';
|
import 'package:ui/welcome_page.dart';
|
||||||
import 'package:ui/widgets/progress_indicator.dart';
|
import 'package:ui/widgets/progress_indicator.dart';
|
||||||
|
|
||||||
class TvDetailsPage extends ConsumerStatefulWidget {
|
class TvDetailsPage extends ConsumerStatefulWidget {
|
||||||
@@ -179,7 +179,7 @@ class _TvDetailsPageState extends ConsumerState<TvDetailsPage> {
|
|||||||
),
|
),
|
||||||
const Text(""),
|
const Text(""),
|
||||||
Text(
|
Text(
|
||||||
details!.overview!,
|
details.overview!,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
@@ -192,7 +192,7 @@ class _TvDetailsPageState extends ConsumerState<TvDetailsPage> {
|
|||||||
seriesId)
|
seriesId)
|
||||||
.notifier)
|
.notifier)
|
||||||
.delete();
|
.delete();
|
||||||
context.go(TvWatchlistPage.route);
|
context.go(WelcomePage.routeTv);
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.delete))
|
icon: const Icon(Icons.delete))
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,19 +1,28 @@
|
|||||||
import 'package:flutter/material.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:go_router/go_router.dart';
|
||||||
|
import 'package:ui/movie_watchlist.dart';
|
||||||
import 'package:ui/providers/APIs.dart';
|
import 'package:ui/providers/APIs.dart';
|
||||||
import 'package:ui/providers/welcome_data.dart';
|
import 'package:ui/providers/welcome_data.dart';
|
||||||
import 'package:ui/tv_details.dart';
|
import 'package:ui/tv_details.dart';
|
||||||
import 'package:ui/widgets/progress_indicator.dart';
|
import 'package:ui/widgets/progress_indicator.dart';
|
||||||
|
|
||||||
class TvWatchlistPage extends ConsumerWidget {
|
class WelcomePage extends ConsumerWidget {
|
||||||
static const route = "/series";
|
static const routeTv = "/series";
|
||||||
|
static const routeMoivie = "/movies";
|
||||||
|
|
||||||
const TvWatchlistPage({super.key});
|
const WelcomePage({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final data = ref.watch(tvWatchlistDataProvider);
|
var uri = GoRouterState.of(context).uri.toString();
|
||||||
|
|
||||||
|
AsyncValue<List<MediaDetail>> data;
|
||||||
|
if (uri == routeMoivie) {
|
||||||
|
data = ref.watch(movieWatchlistDataProvider);
|
||||||
|
} else {
|
||||||
|
data = ref.watch(tvWatchlistDataProvider);
|
||||||
|
}
|
||||||
|
|
||||||
return switch (data) {
|
return switch (data) {
|
||||||
AsyncData(:final value) => SingleChildScrollView(
|
AsyncData(:final value) => SingleChildScrollView(
|
||||||
@@ -27,24 +36,31 @@ class TvWatchlistPage extends ConsumerWidget {
|
|||||||
child: InkWell(
|
child: InkWell(
|
||||||
//splashColor: Colors.blue.withAlpha(30),
|
//splashColor: Colors.blue.withAlpha(30),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
context.go(TvDetailsPage.toRoute(item.id!));
|
if (uri == routeMoivie) {
|
||||||
//showDialog(context: context, builder: builder)
|
context.go(MovieDetailsPage.toRoute(item.id!));
|
||||||
|
} else {
|
||||||
|
context.go(TvDetailsPage.toRoute(item.id!));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 160,
|
width: 160,
|
||||||
height: 240,
|
height: 240,
|
||||||
child:Image.network(
|
child: ClipRRect(
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
child: Image.network(
|
||||||
"${APIs.imagesUrl}/${item.id}/poster.jpg",
|
"${APIs.imagesUrl}/${item.id}/poster.jpg",
|
||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
headers: APIs.authHeaders,
|
headers: APIs.authHeaders,
|
||||||
),
|
),
|
||||||
),
|
)),
|
||||||
Text(
|
Text(
|
||||||
item.name!,
|
item.name!,
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 14, fontWeight: FontWeight.bold, height: 2.5),
|
fontSize: 14,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
height: 2.5),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -52,7 +68,7 @@ class TvWatchlistPage extends ConsumerWidget {
|
|||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
_ => MyProgressIndicator(),
|
_ => const MyProgressIndicator(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user