feature:can list qiniu repo item

This commit is contained in:
hackycy
2020-08-16 01:17:11 +08:00
parent 7345d29178
commit 8f906f6d21
3 changed files with 158 additions and 6 deletions

View File

@@ -0,0 +1,46 @@
import 'package:flutter_picgo/components/manage_item.dart';
class QiniuContent {
FileContentType type;
/// FILE 时为空, DIR时不能为空
String url;
String key;
String hash;
int fsize;
String mimeType;
int putTime;
String md5;
int status;
QiniuContent(
{this.type,
this.key,
this.hash,
this.fsize,
this.mimeType,
this.putTime,
this.md5,
this.status});
QiniuContent.fromJson(Map<String, dynamic> json) {
key = json['key'];
hash = json['hash'];
fsize = json['fsize'];
mimeType = json['mimeType'];
putTime = json['putTime'];
md5 = json['md5'];
status = json['status'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['key'] = this.key;
data['hash'] = this.hash;
data['fsize'] = this.fsize;
data['mimeType'] = this.mimeType;
data['putTime'] = this.putTime;
data['md5'] = this.md5;
data['status'] = this.status;
return data;
}
}

View File

@@ -1,6 +1,13 @@
import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';
import 'package:flutter_picgo/components/manage_item.dart';
import 'package:flutter_picgo/model/qiniu_content.dart';
import 'package:flutter_picgo/routers/application.dart';
import 'package:flutter_picgo/routers/routers.dart';
import 'package:flutter_picgo/views/manage_page/base_loading_page_state.dart';
import 'package:flutter_picgo/views/manage_page/qiniu_page/qiniu_repo_page_presenter.dart';
import 'package:toast/toast.dart';
import 'package:url_launcher/url_launcher.dart';
class QiniuRepoPage extends StatefulWidget {
final String prefix;
@@ -12,6 +19,7 @@ class _QiniuRepoPageState extends BaseLoadingPageState<QiniuRepoPage>
implements QiniuRepoPageContract {
String errorMsg;
String _prefix;
List<QiniuContent> contents = [];
QiniuRepoPagePresenter _presenter;
_QiniuRepoPageState(this._prefix) {
@@ -21,7 +29,7 @@ class _QiniuRepoPageState extends BaseLoadingPageState<QiniuRepoPage>
@override
void initState() {
super.initState();
_presenter.doLoadContents();
_presenter.doLoadContents(this._prefix);
}
@override
@@ -77,6 +85,74 @@ class _QiniuRepoPageState extends BaseLoadingPageState<QiniuRepoPage>
@override
Widget buildSuccess() {
return Center();
return ListView.builder(
itemCount: contents.length,
itemBuilder: (context, index) {
return ManageItem(
Key('$index'),
contents[index].url,
contents[index].key,
'${contents[index].fsize ?? 0}k',
contents[index].type,
onTap: () {
if (contents[index].type == FileContentType.DIR) {
Application.router.navigateTo(context,
'${Routes.settingPbQiniuRepo}?path=${Uri.encodeComponent(contents[index].key)}',
transition: TransitionType.cupertino);
} else {
launch(contents[index].url);
}
},
confirmDismiss: (direction) async {
if (contents[index].type == FileContentType.DIR) {
Toast.show('暂不支持删除文件夹', context);
return false;
}
bool result = await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('确定删除吗'),
content: Text('删除后无法恢复'),
actions: <Widget>[
FlatButton(
child: Text('确定'),
onPressed: () {
Navigator.pop(context, true);
}),
],
);
});
if (!(result ?? false)) {
return false;
}
return false;
// var del = await _presenter.doDeleteContents(
// _path, _prePath, contents[index].name, contents[index].sha);
// return del;
},
);
});
}
@override
void loadError(String msg) {
Toast.show(msg, context);
}
@override
void loadSuccess(List<QiniuContent> data) {
if (data != null && data.length > 0) {
setState(() {
this.state = LoadState.SUCCESS;
this.contents.clear();
this.contents.addAll(data);
});
} else {
setState(() {
this.state = LoadState.EMTPY;
});
}
}
}

View File

@@ -1,33 +1,63 @@
import 'dart:convert';
import 'package:flutter_picgo/api/qiniu_api.dart';
import 'package:flutter_picgo/components/manage_item.dart';
import 'package:flutter_picgo/model/qiniu_config.dart';
import 'package:flutter_picgo/model/qiniu_content.dart';
import 'package:flutter_picgo/resources/pb_type_keys.dart';
import 'package:flutter_picgo/utils/image_upload.dart';
import 'package:flutter_picgo/utils/strings.dart';
import 'package:path/path.dart' as pathlib;
abstract class QiniuRepoPageContract {}
abstract class QiniuRepoPageContract {
void loadSuccess(List<QiniuContent> data);
void loadError(String msg);
}
class QiniuRepoPagePresenter {
QiniuRepoPageContract _view;
QiniuRepoPagePresenter(this._view);
doLoadContents() async {
doLoadContents(String prefix) async {
try {
String configStr = await ImageUploadUtils.getPBConfig(PBTypeKeys.qiniu);
QiniuConfig config = QiniuConfig.fromJson(json.decode(configStr));
print(configStr);
if (isBlank(config.accessKey) || isBlank(config.secretKey)) {
_view.loadError('读取配置文件错误');
return;
}
var result = await QiniuApi.list({
'bucket': config.bucket,
'prefix': '',
'prefix': prefix == '/' ? '' : prefix,
'delimiter': Uri.decodeComponent('/'),
}, config.accessKey, config.secretKey);
print(json.encode(result));
List data = (result['items'] as List<dynamic>).map((e) {
print(e);
QiniuContent c = QiniuContent.fromJson(e);
c.type = FileContentType.FILE;
c.url = pathlib.joinAll([
config.url,
prefix == '/' ? '' : prefix,
c.key,
]);
return c;
}).toList();
if (result['commonPrefixes'] != null) {
(result['commonPrefixes'] as List<dynamic>).forEach((element) {
QiniuContent c = QiniuContent();
c.type = FileContentType.DIR;
c.url = element;
c.key = element;
data.add(c);
});
}
_view.loadSuccess(data);
} catch (e) {
print(e);
_view.loadError('$e');
}
}
}