forked from lxm_tools/flutter-picgo
feature:can list qiniu repo item
This commit is contained in:
46
lib/model/qiniu_content.dart
Normal file
46
lib/model/qiniu_content.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user