wip: upgrade dependencies

pull/6/head
DebuggerX 3 years ago
parent b7d0ec75eb
commit 58263f4548

2
api/.gitignore vendored

@ -91,7 +91,7 @@ server_log.txt
.metals/ .metals/
/config/production.yaml.bak /config/production.yaml
/config/development.yaml /config/development.yaml
*.g.dart *.g.dart

@ -1,14 +1,17 @@
FROM google/dart:latest FROM dart:stable AS build-env
LABEL stage=dart_builder
ENV PUB_HOSTED_URL="https://pub.flutter-io.cn"
ENV ANGEL_ENV=production
COPY ./ ./ COPY ./ ./
# Install dependencies, pre-build
RUN pub get RUN pub get
RUN dart compile exe bin/prod.dart -o /server
# Optionally build generaed sources. FROM scratch
# RUN pub run build_runner build WORKDIR /app
# Set environment, start server
ENV ANGEL_ENV=production ENV ANGEL_ENV=production
ADD ./views ./views
ADD ./config ./config
COPY --from=build-env /runtime/ /
COPY --from=build-env /server /app
EXPOSE 3000 EXPOSE 3000
CMD dart bin/prod.dart ENTRYPOINT ["./server", "-a", "0.0.0.0", "--port", "3000"]

@ -0,0 +1,34 @@
version: "2.1"
services:
mysql:
image: postgres:latest
restart: always
container_name: dgm_postgres
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: Dx@8917312
MYSQL_DATABASE: piwigo
MYSQL_USER: debuggerx
MYSQL_PASSWORD: dx8917312
volumes:
- /mnt/hd500/db:/var/lib/mysql
ports:
- "5432:5432"
networks:
- mynet
api:
build: .
container_name: dgm_api
links:
- dgm_postgres
ports:
- 8888:8888
networks:
- mynet
restart: unless-stopped
networks:
mynet:
driver: bridge

@ -35,9 +35,13 @@ class SchemeApis {
String user({required StringParam type}) => [path, 'user', type].joinPath(); String user({required StringParam type}) => [path, 'user', type].joinPath();
String market({required StringParam type, required IntParam page, required IntParam pageSize}) => [path, 'market', type, page, pageSize].joinPath();
String download({required StringParam schemeId}) => [path, 'download', schemeId].joinPath(); String download({required StringParam schemeId}) => [path, 'download', schemeId].joinPath();
String like({required StringParam schemeId, required StringParam isLike}) => [path, 'like', schemeId, isLike].joinPath(); String like({required StringParam schemeId, required StringParam isLike}) => [path, 'like', schemeId, isLike].joinPath();
String get userLikes => [path, 'user-likes'].joinPath();
} }
final _paramsMap = { final _paramsMap = {

@ -20,4 +20,21 @@ abstract class _LikeRecord extends BaseModel {
@Column(isNullable: false, indexType: IndexType.standardIndex) @Column(isNullable: false, indexType: IndexType.standardIndex)
@SerializableField(isNullable: false) @SerializableField(isNullable: false)
bool? get liked; bool? get liked;
}
@serializable
@Orm(tableName: 'like_records', generateMigrations: false)
abstract class _UserLikes {
@Column(isNullable: false)
@SerializableField(isNullable: false)
int? id;
@Column(isNullable: false)
@SerializableField(exclude: true)
int? get uid;
@Column(isNullable: false)
@SerializableField(exclude: true)
bool? get liked;
} }

@ -71,6 +71,9 @@ abstract class _SimpleScheme {
@serializable @serializable
abstract class _SimpleSchemeTransMetaData { abstract class _SimpleSchemeTransMetaData {
@SerializableField(isNullable: false) @SerializableField(isNullable: false)
int? id;
@SerializableField(isNullable: false)
String? get uuid; String? get uuid;
@SerializableField(isNullable: false) @SerializableField(isNullable: false)
@ -90,6 +93,7 @@ abstract class _SimpleSchemeTransMetaData {
} }
SimpleSchemeTransMetaData transSimpleSchemeMetaData(SimpleScheme scheme) => SimpleSchemeTransMetaData( SimpleSchemeTransMetaData transSimpleSchemeMetaData(SimpleScheme scheme) => SimpleSchemeTransMetaData(
id: scheme.id,
description: scheme.description, description: scheme.description,
uuid: scheme.uuid, uuid: scheme.uuid,
name: scheme.name, name: scheme.name,
@ -121,3 +125,57 @@ SchemeForDownload transSchemeForDownload(Scheme scheme) => SchemeForDownload(
description: scheme.description, description: scheme.description,
gestures: scheme.gestures, gestures: scheme.gestures,
); );
@serializable
@Orm(tableName: 'schemes', generateMigrations: false)
abstract class _MarketScheme {
@Column()
int? id;
@Column(isNullable: false, indexType: IndexType.unique)
@SerializableField(isNullable: false)
String? get uuid;
@Column(isNullable: false)
@SerializableField(isNullable: false)
String? get name;
@Column(type: ColumnType.text)
String? description;
@Column(isNullable: false)
@SerializableField(exclude: true)
bool? get shared;
@SerializableField(isNullable: true)
@Column(type: ColumnType.json)
Map<String, dynamic>? get metadata;
}
@serializable
abstract class _MarketSchemeTransMetaData {
@SerializableField(isNullable: false)
int? id;
@SerializableField(isNullable: false)
String? get uuid;
@SerializableField(isNullable: false)
String? get name;
@SerializableField(isNullable: false)
String? description;
int? get downloads;
int? get likes;
}
MarketSchemeTransMetaData transMarketSchemeMetaData(MarketScheme scheme) => MarketSchemeTransMetaData(
id: scheme.id,
description: scheme.description,
uuid: scheme.uuid,
name: scheme.name,
likes: scheme.metadata?['likes'] ?? 0,
downloads: scheme.metadata?['downloads'] ?? 0,
);

@ -62,41 +62,6 @@ Future configureServer(Angel app) async {
); );
app.get( app.get(
Apis.scheme.user.route,
chain(
[
jwtMiddleware(),
(req, res) async {
var schemeQuery = SimpleSchemeQuery();
var type = req.params['type'];
var likeRecordTableName = LikeRecordQuery().tableName;
schemeQuery.leftJoin(likeRecordTableName, SchemeFields.id, LikeRecordFields.schemeId, alias: 'lr');
switch (type) {
case 'uploaded':
schemeQuery.where!.uid.equals(req.user!.idAsInt);
break;
case 'downloaded':
var downloadHistoryTableName = DownloadHistoryQuery().tableName;
schemeQuery.leftJoin(downloadHistoryTableName, SchemeFields.id, DownloadHistoryFields.schemeId,
alias: 'dh');
schemeQuery.where!.raw('dh.${DownloadHistoryFields.uid} = ${req.user!.idAsInt}');
break;
case 'liked':
schemeQuery.where!.raw('lr.${LikeRecordFields.uid} = ${req.user!.idAsInt}');
schemeQuery.where!.raw('lr.${LikeRecordFields.liked} = true');
break;
default:
return res.unProcessableEntity();
}
schemeQuery.orderBy('${schemeQuery.tableName}.${SchemeFields.updatedAt}', descending: true);
return schemeQuery.get(req.queryExecutor).then((value) => value.map(transSimpleSchemeMetaData).toList());
},
],
),
);
app.get(
Apis.scheme.download.route, Apis.scheme.download.route,
chain( chain(
[ [
@ -185,4 +150,100 @@ Future configureServer(Angel app) async {
], ],
), ),
); );
app.get(
Apis.scheme.user.route,
chain(
[
jwtMiddleware(),
(req, res) async {
var schemeQuery = SimpleSchemeQuery();
var type = req.params['type'];
var likeRecordTableName = LikeRecordQuery().tableName;
schemeQuery.leftJoin(likeRecordTableName, SchemeFields.id, LikeRecordFields.schemeId, alias: 'lr');
switch (type) {
case 'uploaded':
schemeQuery.where!.uid.equals(req.user!.idAsInt);
break;
case 'downloaded':
var downloadHistoryTableName = DownloadHistoryQuery().tableName;
schemeQuery.leftJoin(downloadHistoryTableName, SchemeFields.id, DownloadHistoryFields.schemeId,
alias: 'dh');
schemeQuery.where!.raw('dh.${DownloadHistoryFields.uid} = ${req.user!.idAsInt}');
break;
case 'liked':
schemeQuery.where!.raw('lr.${LikeRecordFields.uid} = ${req.user!.idAsInt}');
schemeQuery.where!.raw('lr.${LikeRecordFields.liked} = true');
break;
default:
return res.unProcessableEntity();
}
schemeQuery.orderBy('${schemeQuery.tableName}.${SchemeFields.updatedAt}', descending: true);
return schemeQuery.get(req.queryExecutor).then((value) => value.map(transSimpleSchemeMetaData).toList());
},
],
),
);
const recommend = "(metadata->'recommends') is null ,(metadata->'recommends')::int";
const updated = "updated_at";
const likes = "(metadata->'likes') is null ,(metadata->'likes')::int";
const downloads = "(metadata->'downloads') is null ,(metadata->'downloads')::int";
app.get(Apis.scheme.market.route, (req, res) async {
var schemeQuery = MarketSchemeQuery();
var type = req.params['type'];
var page = req.params['page'] as int;
var pageSize = req.params['pageSize'] as int;
schemeQuery.where?.shared.equals(true);
late List<String> orders;
switch (type) {
case 'recommend':
// orders = [recommend, likes, downloads, SchemeFields.id];
orders = [recommend];
break;
case 'updated':
orders = [updated];
break;
case 'likes':
// orders = [likes, recommend, downloads, SchemeFields.id];
orders = [likes];
break;
case 'downloads':
// orders = [downloads, recommend, likes, SchemeFields.id];
orders = [downloads];
break;
default:
return res.unProcessableEntity();
}
for (var order in orders) {
schemeQuery.orderBy(order, descending: true);
}
schemeQuery.offset(page * pageSize);
schemeQuery.limit(pageSize + 1);
return schemeQuery.get(req.queryExecutor).then((value) {
var hasMore = value.length > pageSize;
if (hasMore) value.removeLast();
return {
'hasMore': hasMore,
'items': value.map(transMarketSchemeMetaData).toList(),
};
});
});
app.get(
Apis.scheme.userLikes,
chain(
[
jwtMiddleware(),
(req, res) async => (UserLikesQuery()
..where?.uid.equals(req.user!.idAsInt)
..where?.liked.equals(true))
.get(req.queryExecutor)
.then((value) => value.map((e) => e.id).toList()),
],
),
);
} }

@ -13,7 +13,6 @@ dependencies:
angel3_orm_postgres: ^3.3.0 angel3_orm_postgres: ^3.3.0
angel3_serialize: ^4.1.0 angel3_serialize: ^4.1.0
angel3_production: ^3.1.2 angel3_production: ^3.1.2
angel3_static: ^4.1.0
belatuk_pretty_logging: ^4.0.0 belatuk_pretty_logging: ^4.0.0
optional: ^6.0.0 optional: ^6.0.0
logging: ^1.0.0 logging: ^1.0.0

@ -0,0 +1,7 @@
#!/usr/bin/env bash
docker build -t dgm_api_image .
docker image prune -f --filter label=stage=dart_builder
docker rm -f dgm_api
docker run -d --restart=always --name dgm_api -p 3000:3000 dgm_api_image
docker image prune -f

@ -3,7 +3,7 @@ import 'package:flutter/cupertino.dart';
/// [UOS](https://docs.uniontech.com/zh/content/t_dbG3kBK9iDf9B963ok) /// [UOS](https://docs.uniontech.com/zh/content/t_dbG3kBK9iDf9B963ok)
const double localManagerPanelWidth = 260; const double localManagerPanelWidth = 260;
const double marketOrMePanelWidth = 300; const double marketOrMePanelWidth = 450;
const shortDuration = const Duration(milliseconds: 100); const shortDuration = const Duration(milliseconds: 100);

@ -4,6 +4,7 @@ import 'package:dde_gesture_manager/models/configs.provider.dart';
import 'package:dde_gesture_manager/models/content_layout.provider.dart'; import 'package:dde_gesture_manager/models/content_layout.provider.dart';
import 'package:dde_gesture_manager/widgets/dde_button.dart'; import 'package:dde_gesture_manager/widgets/dde_button.dart';
import 'package:dde_gesture_manager/widgets/login.dart'; import 'package:dde_gesture_manager/widgets/login.dart';
import 'package:dde_gesture_manager/widgets/market.dart';
import 'package:dde_gesture_manager/widgets/me.dart'; import 'package:dde_gesture_manager/widgets/me.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -18,15 +19,14 @@ class MarketOrMe extends StatelessWidget {
var layoutProvider = context.watch<ContentLayoutProvider>(); var layoutProvider = context.watch<ContentLayoutProvider>();
bool isOpen = layoutProvider.marketOrMeOpened == true; bool isOpen = layoutProvider.marketOrMeOpened == true;
bool isMarket = layoutProvider.isMarket; bool isMarket = layoutProvider.isMarket;
bool showLogin = context.watch<ConfigsProvider>().accessToken.isNull && !isMarket;
return AnimatedContainer( return AnimatedContainer(
duration: mediumDuration, duration: mediumDuration,
curve: Curves.easeInOut, curve: Curves.easeInOut,
width: isOpen ? marketOrMePanelWidth * (showLogin ? 1.5 : 1) : 0, width: isOpen ? marketOrMePanelWidth * 1 : 0,
child: OverflowBox( child: OverflowBox(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
maxWidth: marketOrMePanelWidth * (showLogin ? 1.5 : 1), maxWidth: marketOrMePanelWidth,
minWidth: marketOrMePanelWidth * (showLogin ? 1.5 : 1), minWidth: marketOrMePanelWidth,
child: Material( child: Material(
color: context.t.backgroundColor, color: context.t.backgroundColor,
elevation: isOpen ? 10 : 0, elevation: isOpen ? 10 : 0,
@ -85,7 +85,5 @@ class MarketOrMe extends StatelessWidget {
return Expanded(child: MeWidget()); return Expanded(child: MeWidget());
} }
Widget buildMarketContent(BuildContext context) { Widget buildMarketContent(BuildContext context) => Expanded(child: MarketWidget());
return Container();
}
} }

@ -0,0 +1,102 @@
import 'package:dde_gesture_manager/constants/constants.dart';
import 'package:dde_gesture_manager/widgets/dde_button.dart';
import 'package:flutter/material.dart';
import 'package:dde_gesture_manager/extensions.dart';
enum MarketSortType {
recommend,
updated,
likes,
downloads,
}
class MarketWidget extends StatefulWidget {
const MarketWidget({Key? key}) : super(key: key);
@override
_MarketWidgetState createState() => _MarketWidgetState();
}
class _MarketWidgetState extends State<MarketWidget> {
MarketSortType _type = MarketSortType.recommend;
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Padding(
padding: const EdgeInsets.only(top: 15, bottom: 2),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
MarketSortType.recommend,
MarketSortType.updated,
MarketSortType.likes,
MarketSortType.downloads,
]
.map(
(e) => Flexible(
flex: 1,
fit: FlexFit.tight,
child: MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onTap: () {
setState(() {
_type = e;
});
},
child: Center(
child: Text(
'${LocaleKeys.market_sort_types}.${e.name}'.tr(),
style: _type == e ? TextStyle(fontWeight: FontWeight.bold, fontSize: 15) : null,
),
),
),
),
),
)
.toList(),
),
),
Expanded(
child: Container(
decoration: BoxDecoration(
border: Border.all(
width: .3,
color: context.t.dividerColor,
),
borderRadius: BorderRadius.circular(defaultBorderRadius),
),
child: Column(
children: [Text('asd')],
),
),
),
Padding(
padding: const EdgeInsets.only(top: 5),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
DButton.like(
enabled: true,
onTap: () {},
),
DButton.download(
enabled: true,
onTap: () {},
),
]
.map((e) => Padding(
padding: const EdgeInsets.only(right: 4),
child: e,
))
.toList(),
),
),
],
);
}
}

@ -1,4 +1,5 @@
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:dde_gesture_manager/constants/constants.dart'; import 'package:dde_gesture_manager/constants/constants.dart';
import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/extensions.dart';
@ -9,6 +10,8 @@ import 'package:dde_gesture_manager/utils/notificator.dart';
import 'package:dde_gesture_manager_api/models.dart'; import 'package:dde_gesture_manager_api/models.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_platform_alert/flutter_platform_alert.dart'; import 'package:flutter_platform_alert/flutter_platform_alert.dart';
import 'package:markdown_editor_ot/markdown_editor.dart';
import 'package:numeral/fun.dart';
import 'dde_button.dart'; import 'dde_button.dart';
@ -137,60 +140,102 @@ class _MeWidgetState extends State<MeWidget> {
), ),
borderRadius: BorderRadius.circular(defaultBorderRadius), borderRadius: BorderRadius.circular(defaultBorderRadius),
), ),
child: Padding( child: Column(
padding: EdgeInsets.symmetric(horizontal: 1, vertical: 2), children: [
child: ListView.builder( Flexible(
itemBuilder: (context, index) => GestureDetector( child: Padding(
onTap: () { padding: EdgeInsets.symmetric(horizontal: 1, vertical: 2),
setState(() { child: ListView.builder(
_selected = _schemes[index].uuid; itemBuilder: (context, index) => GestureDetector(
}); onTap: () {
}, setState(() {
child: MouseRegion( _selected = _schemes[index].uuid;
cursor: SystemMouseCursors.click, });
onEnter: (_) { },
setState(() { child: MouseRegion(
_hovering = _schemes[index].uuid; cursor: SystemMouseCursors.click,
}); onEnter: (_) {
}, setState(() {
child: Container( _hovering = _schemes[index].uuid;
color: _getItemBackgroundColor(index, _schemes[index].uuid), });
child: Padding( },
padding: const EdgeInsets.only(left: 6, right: 12.0), child: Container(
child: DefaultTextStyle( color: _getItemBackgroundColor(index, _schemes[index].uuid),
style: context.t.textTheme.bodyText2!.copyWith( child: Padding(
color: _selected == _schemes[index].uuid ? Colors.white : null, padding: const EdgeInsets.only(left: 6, right: 12.0),
), child: DefaultTextStyle(
child: Row( style: context.t.textTheme.bodyText2!.copyWith(
mainAxisAlignment: MainAxisAlignment.spaceBetween, color: _selected == _schemes[index].uuid ? Colors.white : null,
children: [ ),
Text(_schemes[index].name ?? ''), child: Row(
Row( mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text('${_schemes[index].downloads ?? 0}'.padLeft(4)), Text(_schemes[index].name ?? ''),
Icon( Row(
Icons.file_download, children: [
size: 18, SizedBox(
), width: 50,
Text('${_schemes[index].likes ?? 0}'.padLeft(4)), child: Align(
Icon(_schemes[index].liked == true ? Icons.thumb_up : Icons.thumb_up_off_alt, alignment: Alignment.centerRight,
size: 17), child: AutoSizeText(
] '${numeral(_schemes[index].downloads ?? 0, fractionDigits: 1)}'
.map((e) => Padding( .padLeft(5),
padding: const EdgeInsets.only(right: 3), ),
child: e, ),
)) ),
.toList(), Icon(
Icons.file_download,
size: 18,
),
SizedBox(
width: 50,
child: Align(
alignment: Alignment.centerRight,
child: AutoSizeText(
'${numeral(_schemes[index].likes ?? 0, fractionDigits: 1)}'.padLeft(5),
),
),
),
Icon(_schemes[index].liked == true ? Icons.thumb_up : Icons.thumb_up_off_alt,
size: 17),
]
.map((e) => Padding(
padding: const EdgeInsets.only(right: 3),
child: e,
))
.toList(),
),
],
),
), ),
], ),
), ),
), ),
), ),
itemCount: _schemes.length,
), ),
), ),
), ),
itemCount: _schemes.length, Divider(thickness: .5),
), Flexible(
child: Padding(
padding: const EdgeInsets.only(left: 8),
child: MdPreview(
text: _schemes.firstWhereOrNull((e) => e.uuid == _selected)?.description ?? '',
widgetImage: (imageUrl) => CachedNetworkImage(
imageUrl: imageUrl,
placeholder: (context, url) => const SizedBox(
width: double.infinity,
height: 300,
child: Center(child: CircularProgressIndicator()),
),
errorWidget: (context, url, error) => const Icon(Icons.error),
),
onCodeCopied: () {},
),
),
)
],
), ),
), ),
), ),

@ -23,25 +23,26 @@ environment:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
cupertino_icons: ^1.0.2 cupertino_icons: ^1.0.4
window_manager: ^0.0.5 window_manager: ^0.1.3
localstorage: ^4.0.0+1 localstorage: ^4.0.0+1
shared_preferences: ^2.0.7 shared_preferences: ^2.0.12
xdg_directories: 0.2.0 xdg_directories: ^0.2.0
gsettings: 0.2.0 gsettings: 0.2.3
provider: ^6.0.0 provider: ^6.0.2
package_info_plus: ^1.0.6 package_info_plus: ^1.3.0
easy_localization: ^3.0.0 easy_localization: ^3.0.0
glass_kit: ^2.0.1 glass_kit: ^2.0.1
rect_getter: ^1.0.0 rect_getter: ^1.0.0
path_provider: ^2.0.5 path_provider: ^2.0.8
uuid: ^3.0.5 uuid: ^3.0.5
adaptive_scrollbar: ^2.1.0 adaptive_scrollbar: ^2.1.0
flutter_platform_alert: ^0.2.1 flutter_platform_alert: ^0.2.1
cached_network_image: ^3.2.0 cached_network_image: ^3.2.0
url_launcher: ^6.0.17 url_launcher: ^6.0.18
flutter_login: ^3.1.0 flutter_login: ^3.1.0
auto_size_text: ^3.0.0 auto_size_text: ^3.0.0
numeral: ^1.2.5
markdown_editor_ot: markdown_editor_ot:
path: 3rd_party/markdown_editor_ot path: 3rd_party/markdown_editor_ot
cherry_toast: cherry_toast:
@ -54,8 +55,8 @@ dependencies:
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
build_runner: 2.1.2 build_runner: 2.1.7
source_gen: 1.1.0 source_gen: 1.2.1
# For information on the generic Dart part of this file, see the # For information on the generic Dart part of this file, see the

@ -20,7 +20,13 @@
"tip": "Display help documentation" "tip": "Display help documentation"
}, },
"market": { "market": {
"title": "Scheme market" "title": "Scheme market",
"sort_types": {
"recommend": "Recommend",
"updated": "updated",
"likes": "likes",
"downloads": "downloads"
}
}, },
"local_manager": { "local_manager": {
"title": "Local scheme management", "title": "Local scheme management",

@ -20,7 +20,13 @@
"tip": "显示帮助文档" "tip": "显示帮助文档"
}, },
"market": { "market": {
"title": "方案市场" "title": "方案市场",
"sort_types": {
"recommend": "推荐",
"updated": "最近更新",
"likes": "点赞数",
"downloads": "下载量"
}
}, },
"local_manager": { "local_manager": {
"title": "本地方案管理", "title": "本地方案管理",

Loading…
Cancel
Save