Commit 67118e06 authored by netyouli's avatar netyouli

添加广场图片接口,我的收藏,我的作品,收藏列表,作品列表,发布广场等接口集成

parent 8bd02cb4
...@@ -12,6 +12,7 @@ import 'package:dio/dio.dart'; ...@@ -12,6 +12,7 @@ import 'package:dio/dio.dart';
import '../../entity/plan_entity.dart'; import '../../entity/plan_entity.dart';
import '../../entity/square_entity.dart'; import '../../entity/square_entity.dart';
import '../../pages/ai-draw-image-result/model.dart'; import '../../pages/ai-draw-image-result/model.dart';
import '../store/user.dart';
/// 新闻 /// 新闻
class NewsAPI { class NewsAPI {
...@@ -88,6 +89,23 @@ class NewsAPI { ...@@ -88,6 +89,23 @@ class NewsAPI {
); );
return TranslateModel.fromJson(response.data); return TranslateModel.fromJson(response.data);
} }
static Future<CommonResponse> shareImageSquare(String imgId) async {
var response = await HttpUtil().get(
'/imgInfo/shareSquare/$imgId',
);
return CommonResponse.fromJson(response);
}
// 收藏图片
static Future<CommonResponse> updateCollectImg(String imgUrl, int isCancel) async {
var response = await HttpUtil().post('/midJourney/createImageByBlend', data: {
"imgUrl": imgUrl,
"isCancel": isCancel,
"userId": "${UserStore.to.profile.id}"
});
return CommonResponse.fromJson(response);
}
// 融合图片 // 融合图片
static Future<MidJourneyModel> blendImageByMidJourney(List<String> urls) async { static Future<MidJourneyModel> blendImageByMidJourney(List<String> urls) async {
......
...@@ -6,6 +6,7 @@ import 'package:chart/common/utils/utils.dart'; ...@@ -6,6 +6,7 @@ import 'package:chart/common/utils/utils.dart';
import '../../entity/login_entity.dart'; import '../../entity/login_entity.dart';
import '../../entity/user_entity.dart'; import '../../entity/user_entity.dart';
import '../../pages/my-work/models.dart';
import '../../pages/my/models.dart'; import '../../pages/my/models.dart';
import '../entities/applePayList.dart'; import '../entities/applePayList.dart';
...@@ -239,6 +240,27 @@ class UserAPI { ...@@ -239,6 +240,27 @@ class UserAPI {
// UserLoginResponseEntity.fromJson(response); // UserLoginResponseEntity.fromJson(response);
} }
static Future<MyWorkResponse> getMyWorkImages() async {
var response = await HttpUtil().get(
'/imgInfo/getImgInfoList',
);
return MyWorkResponse.fromJson(response);
}
static Future<MyWorkResponse> getMyCollectImages() async {
var response = await HttpUtil().get(
'/imgInfo/getCollectImg',
);
return MyWorkResponse.fromJson(response);
}
static Future<MyWorkResponse> getSquareImages() async {
var response = await HttpUtil().get(
'/imgInfo/squareImgList',
);
return MyWorkResponse.fromJson(response);
}
// /api/user/info // /api/user/info
static Future<MsmEntity> sendSms( static Future<MsmEntity> sendSms(
Map<String, dynamic>? params, Map<String, dynamic>? params,
......
// baidu yapi // baidu yapi
// const SERVER_API_URL = 'https://yapi.baidu.com/mock/41008'; // const SERVER_API_URL = 'https://yapi.baidu.com/mock/41008';
const SERVER_API_URL = 'http://101.34.153.228:8083/api';//线上 // const SERVER_API_URL = 'http://101.34.153.228:8083/api';//线上
// const SERVER_API_URL = 'http://192.168.110.116:8083/api';//内 // const SERVER_API_URL = 'http://192.168.110.116:8083/api';//内
// const SERVER_API_URL = 'http://192.168.110.12:8083/api';//线上 // const SERVER_API_URL = 'http://192.168.110.12:8083/api';//线上
//http://192.168.110.12:8083/api/doc.html //http://192.168.110.12:8083/api/doc.html
...@@ -11,7 +12,7 @@ const SERVER_API_URL = 'http://101.34.153.228:8083/api';//线上 ...@@ -11,7 +12,7 @@ const SERVER_API_URL = 'http://101.34.153.228:8083/api';//线上
// http://192.168.110.66:8083/api/doc.html // http://192.168.110.66:8083/api/doc.html
// const SERVER_API_URL = 'http://192.168.110.23:8083/api'; // 大黄蜂 // const SERVER_API_URL = 'http://192.168.110.23:8083/api'; // 大黄蜂
// const SERVER_API_URL = 'http://192.168.110.116:8083/api'; // 清 const SERVER_API_URL = 'http://192.168.110.159:8083/api'; // 清
// http://192.168.110.25:8083/ // http://192.168.110.25:8083/
// const SERVER_API_URL = 'http://192.168.2.178:8083/api'; // const SERVER_API_URL = 'http://192.168.2.178:8083/api';
......
...@@ -21,6 +21,12 @@ import '../../common/store/user.dart'; ...@@ -21,6 +21,12 @@ import '../../common/store/user.dart';
import '../../common/utils/http.dart'; import '../../common/utils/http.dart';
import 'model.dart'; import 'model.dart';
enum OpearterType {
textToImage,
imageBlend,
imageResult
}
class AIDrawImageResultController extends GetxController { class AIDrawImageResultController extends GetxController {
late var sseClient; late var sseClient;
...@@ -30,10 +36,11 @@ class AIDrawImageResultController extends GetxController { ...@@ -30,10 +36,11 @@ class AIDrawImageResultController extends GetxController {
var styleName = "".obs; var styleName = "".obs;
var text = "".obs; var text = "".obs;
var enText = ""; var enText = "";
var resultImageUrl = "".obs; var resultImageUrl = "";
var progress = 0.obs; var progress = 0.obs;
var showProgressView = false.obs; var showProgressView = false.obs;
var loseTime = "0.0s".obs; var loseTime = "0.0s".obs;
var messageId = "";
Rx<Uint8List?> imageData = Rx<Uint8List?>(null); Rx<Uint8List?> imageData = Rx<Uint8List?>(null);
Uint8List? placehoderImageData; Uint8List? placehoderImageData;
...@@ -41,7 +48,7 @@ class AIDrawImageResultController extends GetxController { ...@@ -41,7 +48,7 @@ class AIDrawImageResultController extends GetxController {
var _buttonMessageId = ""; var _buttonMessageId = "";
Rx<List<String>> bottomButtonTitles = Rx<List<String>>([]); Rx<List<String>> bottomButtonTitles = Rx<List<String>>([]);
var opearter = ""; var opearter = OpearterType.textToImage;
var imageUrls = List.generate(0, (index) => ""); var imageUrls = List.generate(0, (index) => "");
Timer? _timer; Timer? _timer;
...@@ -58,6 +65,7 @@ class AIDrawImageResultController extends GetxController { ...@@ -58,6 +65,7 @@ class AIDrawImageResultController extends GetxController {
s = arguments["s"]; s = arguments["s"];
styleName.value = arguments["styleName"]; styleName.value = arguments["styleName"];
imageUrls = arguments["imageUrls"] ?? []; imageUrls = arguments["imageUrls"] ?? [];
messageId = arguments["messageId"] ?? "";
} }
@override @override
...@@ -85,6 +93,38 @@ class AIDrawImageResultController extends GetxController { ...@@ -85,6 +93,38 @@ class AIDrawImageResultController extends GetxController {
} }
} }
void shareToSquare() async {
EasyLoading.show(status: "分享到广场中...");
final res = await NewsAPI.shareImageSquare(messageId);
EasyLoading.dismiss();
if (res.status == 401) {
EasyLoading.showInfo('您还未登录,请登录后体验功能。');
Get.toNamed(AppRoutes.SIGN_IN);
} else {
if (res.status == 200) {
EasyLoading.showSuccess("分享到广场成功");
} else {
EasyLoading.showError(res.message ?? "");
}
}
}
void doCollect() async {
EasyLoading.show(status: "收藏中...");
final res = await NewsAPI.updateCollectImg(resultImageUrl, 1);
EasyLoading.dismiss();
if (res.status == 401) {
EasyLoading.showInfo('您还未登录,请登录后体验功能。');
Get.toNamed(AppRoutes.SIGN_IN);
} else {
if (res.status == 200) {
EasyLoading.showSuccess("收藏成功");
} else {
EasyLoading.showError(res.message ?? "");
}
}
}
void startTimer() { void startTimer() {
_timer?.cancel(); _timer?.cancel();
const oneSec = Duration(milliseconds: 10); const oneSec = Duration(milliseconds: 10);
...@@ -95,7 +135,7 @@ class AIDrawImageResultController extends GetxController { ...@@ -95,7 +135,7 @@ class AIDrawImageResultController extends GetxController {
}); });
} }
void loadImage(String imageUrl, int progress) async { Future<void> loadImage(String imageUrl, int progress) async {
final imageData = await HttpUtil().getData(imageUrl); final imageData = await HttpUtil().getData(imageUrl);
if (imageData != null) { if (imageData != null) {
placehoderImageData = this.imageData.value ?? imageData; placehoderImageData = this.imageData.value ?? imageData;
...@@ -103,8 +143,10 @@ class AIDrawImageResultController extends GetxController { ...@@ -103,8 +143,10 @@ class AIDrawImageResultController extends GetxController {
if (progress == 100) { if (progress == 100) {
showProgressView.value = false; showProgressView.value = false;
_timer?.cancel(); _timer?.cancel();
EasyLoading.dismiss();
} }
} }
return;
} }
// 点击v和u // 点击v和u
...@@ -131,11 +173,33 @@ class AIDrawImageResultController extends GetxController { ...@@ -131,11 +173,33 @@ class AIDrawImageResultController extends GetxController {
} }
} }
makeImage() { onClickMakeSame() {
if (opearter == "textToImage") { switch (opearter) {
makeDrawImage(); case OpearterType.textToImage:
} else { case OpearterType.imageResult:
makeBlendImage(); makeDrawImage();
break;
case OpearterType.imageBlend:
makeBlendImage();
break;
}
}
makeImage() async {
switch (opearter) {
case OpearterType.textToImage:
makeDrawImage();
break;
case OpearterType.imageBlend:
makeBlendImage();
break;
case OpearterType.imageResult: {
EasyLoading.show(status: "正在加载中");
resultImageUrl = imageUrls.isNotEmpty ? imageUrls.first : "";
await loadImage(resultImageUrl, 100);
}
break;
default:
} }
} }
...@@ -171,12 +235,16 @@ class AIDrawImageResultController extends GetxController { ...@@ -171,12 +235,16 @@ class AIDrawImageResultController extends GetxController {
makeDrawImage() async { makeDrawImage() async {
progress.value = 0; progress.value = 0;
final imageUrl = imageUrls.first;
var question = ""; var question = "";
if (imageUrl.isNotEmpty) { if (opearter == OpearterType.imageResult) {
question = '$imageUrl $enText --iw 2 --ar $ratio$s'; question = enText;
} else { } else {
question = '$enText --ar $ratio$s'; final imageUrl = imageUrls.isNotEmpty ? imageUrls.first : "";
if (imageUrl.isNotEmpty) {
question = '$imageUrl $enText --iw 2 --ar $ratio$s';
} else {
question = '$enText --ar $ratio$s';
}
} }
Logger.debugPrint("question = $question"); Logger.debugPrint("question = $question");
EasyLoading.show(status: "AI正在生成中..."); EasyLoading.show(status: "AI正在生成中...");
...@@ -236,21 +304,21 @@ class AIDrawImageResultController extends GetxController { ...@@ -236,21 +304,21 @@ class AIDrawImageResultController extends GetxController {
} }
final progressBase64 = model.progressBase64?.replaceAll("data:image/png;base64,", "") ?? ""; final progressBase64 = model.progressBase64?.replaceAll("data:image/png;base64,", "") ?? "";
if (model.response?.imageUrl != null) { if (model.response?.imageUrl != null) {
resultImageUrl.value = model.response?.imageUrl ?? "" ; resultImageUrl = model.response?.imageUrl ?? "" ;
} else if (model.progressImageUrl != null) { } else if (model.progressImageUrl != null) {
resultImageUrl.value = model.progressImageUrl ?? ""; resultImageUrl = model.progressImageUrl ?? "";
} }
if (progressBase64.isNotEmpty) { if (progressBase64.isNotEmpty) {
final decode = base64Decode(progressBase64.replaceAll('\n', '')); final decode = base64Decode(progressBase64.replaceAll('\n', ''));
placehoderImageData = imageData.value ?? decode; placehoderImageData = imageData.value ?? decode;
imageData.value = decode; imageData.value = decode;
} else { } else {
if (resultImageUrl.value.isNotEmpty) { if (resultImageUrl.isNotEmpty) {
loadImage(resultImageUrl.value, model.progress ?? 0); loadImage(resultImageUrl, model.progress ?? 0);
} }
} }
// final first = model.response?.buttons?.first ?? "";
bottomButtonTitles.value = model.response?.buttons ?? []; bottomButtonTitles.value = model.response?.buttons ?? [];
messageId = model.response?.buttonMessageId ?? "";
/* /*
if (first == "V1" || first == "U1") { if (first == "V1" || first == "U1") {
......
...@@ -141,4 +141,32 @@ class TransResult { ...@@ -141,4 +141,32 @@ class TransResult {
data['dst'] = this.dst; data['dst'] = this.dst;
return data; return data;
} }
}
class CommonResponse {
int? status;
String? message;
dynamic data;
int? timestamp;
CommonResponse({this.status, this.message, this.data, this.timestamp});
CommonResponse.fromJson(Map<String, dynamic> json) {
status = json['status'];
message = json['message'];
data = json['data'];
timestamp = json['timestamp'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
data['message'] = this.message;
data['data'] = this.data;
data['timestamp'] = this.timestamp;
return data;
}
} }
\ No newline at end of file
...@@ -113,7 +113,45 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -113,7 +113,45 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
elevation: 0, elevation: 0,
actions: [ actions: [
Container( Container(
padding: EdgeInsets.fromLTRB(0, 8, 0, 8), padding: const EdgeInsets.fromLTRB(0, 8, 0, 8),
child: InkWell(
onTap: () {
controller.shareToSquare();
},
child: Container(
width: 100,
height: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColor.primary,
borderRadius: BorderRadius.circular(20),
),
child: Text("分享到广场")
),
),
),
SizedBox(width: 10,),
Container(
padding: const EdgeInsets.fromLTRB(0, 8, 0, 8),
child: InkWell(
onTap: () {
controller.doCollect();
},
child: Container(
width: 40,
height: 40,
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColor.primary,
borderRadius: BorderRadius.circular(20),
),
child: Text("收藏")
),
),
),
SizedBox(width: 10,),
Container(
padding: const EdgeInsets.fromLTRB(0, 8, 0, 8),
child: InkWell( child: InkWell(
onTap: () { onTap: () {
controller.share(); controller.share();
...@@ -136,14 +174,6 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -136,14 +174,6 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
), ),
body: Obx(() { body: Obx(() {
return Container( return Container(
/*
decoration: BoxDecoration(
color: Colors.black,
image: DecorationImage(
image: NetworkImage(controller.imageUrl.value),
fit: BoxFit.cover,
),
),*/
child: Stack( child: Stack(
children: [ children: [
makeImageView(), makeImageView(),
...@@ -192,7 +222,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -192,7 +222,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
children: [ children: [
InkWell( InkWell(
onTap: () { onTap: () {
controller.saveNetworkImage(controller.resultImageUrl.value); controller.saveNetworkImage(controller.resultImageUrl);
}, },
child: Container( child: Container(
width: 150, width: 150,
...@@ -208,7 +238,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> { ...@@ -208,7 +238,7 @@ class AIDrawImageResultPage extends GetView<AIDrawImageResultController> {
InkWell( InkWell(
onTap: () { onTap: () {
controller.makeImage(); controller.onClickMakeSame();
}, },
child: Container( child: Container(
width: 150, width: 150,
......
...@@ -12,14 +12,18 @@ import 'package:get/get.dart'; ...@@ -12,14 +12,18 @@ import 'package:get/get.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:pinput/pinput.dart'; import 'package:pinput/pinput.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../common/apis/user.dart'; import '../../common/apis/user.dart';
import '../../common/routers/names.dart'; import '../../common/routers/names.dart';
import '../ai-draw-image-result/controller.dart';
import '../my-work/models.dart';
import 'model.dart'; import 'model.dart';
class AIDrawImageController extends GetxController { class AIDrawImageController extends GetxController {
late TabController tabController; late TabController tabController;
late TabController categoryController; late TabController categoryController;
ScrollController textToImageController = ScrollController(initialScrollOffset: 0); ScrollController textToImageController = ScrollController(initialScrollOffset: 0);
var model = AIDrawTextToImageModel(); var model = AIDrawTextToImageModel();
var ratio = "9:16".obs; var ratio = "9:16".obs;
...@@ -61,6 +65,8 @@ class AIDrawImageController extends GetxController { ...@@ -61,6 +65,8 @@ class AIDrawImageController extends GetxController {
"热门","人物","动漫","设计","未来","风景","插画","场景","脑洞","其他" "热门","人物","动漫","设计","未来","风景","插画","场景","脑洞","其他"
]; ];
var squareImgaes = Rx<List<MyWorkData>>([]);
var textCount = 0.obs; var textCount = 0.obs;
var uploadBlendImageUrls = List<String>.generate(0, (index) => ""); var uploadBlendImageUrls = List<String>.generate(0, (index) => "");
var uploadTextImageUrls = List<String>.generate(0, (index) => ""); var uploadTextImageUrls = List<String>.generate(0, (index) => "");
...@@ -89,6 +95,8 @@ class AIDrawImageController extends GetxController { ...@@ -89,6 +95,8 @@ class AIDrawImageController extends GetxController {
}); });
} }
@override @override
void onClose() { void onClose() {
// TODO: implement onClose // TODO: implement onClose
...@@ -96,6 +104,18 @@ class AIDrawImageController extends GetxController { ...@@ -96,6 +104,18 @@ class AIDrawImageController extends GetxController {
} }
onPullRefresh(RefreshController refreshController) {
Future.delayed(Duration(seconds: 3), () {
refreshController.refreshCompleted();
});
}
onLoadMore(RefreshController refreshController) {
Future.delayed(Duration(seconds: 3), () {
refreshController.loadComplete();
});
}
replaceIt() { replaceIt() {
model.descriptives.shuffle(); model.descriptives.shuffle();
randomDescriptionItems.value = []; randomDescriptionItems.value = [];
...@@ -119,6 +139,24 @@ class AIDrawImageController extends GetxController { ...@@ -119,6 +139,24 @@ class AIDrawImageController extends GetxController {
uploadTextImageUrls.clear(); uploadTextImageUrls.clear();
} }
requestSquareImages() async {
EasyLoading.show(
status: "正在加载广场图片",
dismissOnTap: false,
maskType: EasyLoadingMaskType.none,
indicator: LoadingAnimationWidget.staggeredDotsWave(
color: Colors.white,
size: 30,
));
final res = await UserAPI.getSquareImages();
EasyLoading.dismiss();
if (res.status == 200) {
squareImgaes.value = res.data ?? [];
} else {
EasyLoading.showError(res.message ?? "请求广场图片异常");
}
}
selectBlendImageUpload(ImageSource source) async { selectBlendImageUpload(ImageSource source) async {
List<XFile>? images; List<XFile>? images;
if (source == ImageSource.camera) { if (source == ImageSource.camera) {
...@@ -219,7 +257,7 @@ class AIDrawImageController extends GetxController { ...@@ -219,7 +257,7 @@ class AIDrawImageController extends GetxController {
} else { } else {
Get.toNamed(AppRoutes.AI_DRAW_IMAGE_RESULT_PAGE, Get.toNamed(AppRoutes.AI_DRAW_IMAGE_RESULT_PAGE,
arguments: { arguments: {
"opearter": "imageToImage", "opearter": OpearterType.imageBlend,
"conversionId": conversionId, "conversionId": conversionId,
"imageUrls": List<String>.from(uploadBlendImageUrls), "imageUrls": List<String>.from(uploadBlendImageUrls),
"ratio": ratio.value, "ratio": ratio.value,
...@@ -253,7 +291,7 @@ class AIDrawImageController extends GetxController { ...@@ -253,7 +291,7 @@ class AIDrawImageController extends GetxController {
} else { } else {
Get.toNamed(AppRoutes.AI_DRAW_IMAGE_RESULT_PAGE, Get.toNamed(AppRoutes.AI_DRAW_IMAGE_RESULT_PAGE,
arguments: { arguments: {
"opearter": "textToImage", "opearter": OpearterType.textToImage,
"conversionId": conversionId, "conversionId": conversionId,
"imageUrls": List<String>.from(uploadTextImageUrls), "imageUrls": List<String>.from(uploadTextImageUrls),
"enText": transformModel.transResult?.first.dst ?? textController.text, "enText": transformModel.transResult?.first.dst ?? textController.text,
......
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'controller.dart'; import 'controller.dart';
class ImageSquareListView extends StatelessWidget { class ImageSquareListView extends StatelessWidget {
late ScrollController loadingMoreController = ScrollController(initialScrollOffset: 0); late var refreshController = RefreshController();
late EasyRefreshController refreshController = EasyRefreshController();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// TODO: implement build // TODO: implement build
final controller = Get.find<AIDrawImageController>(); final controller = Get.find<AIDrawImageController>();
return Container( return SmartRefresher(
child: EasyRefresh( enablePullUp: true,
controller: refreshController, controller: refreshController,
header: ClassicalHeader( onRefresh: () => controller.onPullRefresh(refreshController),
bgColor: Colors.white, onLoading: () => controller.onLoadMore(refreshController),
textColor: Colors.pink, header: const ClassicHeader(
infoColor: Colors.pink, releaseText: "松开刷新",
refreshReadyText: '下拉刷新', refreshingText: "刷新数据中",
refreshingText: '正在努力刷新', completeText: "刷新数据成功",
refreshedText: '加载完成', idleText: "下拉刷新"
showInfo: true,
infoText: '正在加载中',
), ),
footer: ClassicalFooter( footer: const ClassicFooter(
bgColor: Colors.white, loadingText: "正在加载中...",
textColor: Colors.pink, noDataText: '没有更多数据啦'
infoColor: Colors.pink,
showInfo: true,
noMoreText: '暂时没有更多了',
loadReadyText: '上拉加载',
loadedText: '加载完毕',
loadText: '上拉加载更多',
loadingText: '正在努力加载更多',
infoText: '正在加载中',
), ),
child: MasonryGridView.count( child: Obx(() => MasonryGridView.count(
controller: loadingMoreController, itemCount: controller.squareImgaes.value.length,
itemCount: controller.randomDescriptionItems.length,
crossAxisCount: 2, crossAxisCount: 2,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return ClipRRect( return ClipRRect(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
child: Image(image: AssetImage(controller.randomDescriptionItems[index].imageUrl), child: CachedNetworkImage(
fit: BoxFit.fill, fit: BoxFit.cover,
height: index % 2 == 0 ? 260 : 200, height: index % 2 == 0 ? 260 : 200,
), imageUrl: controller.squareImgaes.value[index].minioUrl ?? "",
); placeholder: (context, url) => Container(
alignment: Alignment.center,
child: const SizedBox(
width: 30,
height: 30,
child: CircularProgressIndicator(),
),
),
errorWidget: (context, url, error) => Container(
alignment: Alignment.center,
child: Text(error.toString()),
),
)
);
}, },
mainAxisSpacing: 10.0, mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0, crossAxisSpacing: 10.0,
), ))
onLoad: () async { );
print('没有更多了.......');
},
onRefresh: () async {
print('下拉刷新~~~~');
},
),
);
} }
} }
\ No newline at end of file
...@@ -80,6 +80,7 @@ Widget makeTabContentView() { ...@@ -80,6 +80,7 @@ Widget makeTabContentView() {
Widget makeImageSquareView() { Widget makeImageSquareView() {
final controller = Get.find<AIDrawImageController>(); final controller = Get.find<AIDrawImageController>();
return ImageSquareListView();
return SwitchPageView( return SwitchPageView(
length: controller.imageSquareTitles.length, length: controller.imageSquareTitles.length,
buildCallback: (categoryController) { buildCallback: (categoryController) {
......
...@@ -109,6 +109,11 @@ class AIDrawImagePage extends GetView<AIDrawImageController> { ...@@ -109,6 +109,11 @@ class AIDrawImagePage extends GetView<AIDrawImageController> {
Get.focusScope?.unfocus(); Get.focusScope?.unfocus();
}); });
controller.tabController = tabController; controller.tabController = tabController;
tabController.addListener(() {
if (tabController.index == 2) {
controller.requestSquareImages();
}
});
return Column( return Column(
children: [ children: [
makeTopTabView(), makeTopTabView(),
......
...@@ -4,18 +4,113 @@ import 'dart:io'; ...@@ -4,18 +4,113 @@ import 'dart:io';
import 'package:chart/common/apis/apis.dart'; import 'package:chart/common/apis/apis.dart';
import 'package:chart/common/store/user.dart'; import 'package:chart/common/store/user.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:highlight/languages/awk.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:share_plus/share_plus.dart'; import 'package:share_plus/share_plus.dart';
import 'package:in_app_review/in_app_review.dart'; import 'package:in_app_review/in_app_review.dart';
import '../../common/routers/names.dart'; import '../../common/routers/names.dart';
import '../ai-draw-image-result/controller.dart';
import '../ai-draw-image/model.dart'; import '../ai-draw-image/model.dart';
import 'models.dart';
class MyWorkController extends GetxController { class MyWorkController extends GetxController {
late ScrollController loadingMoreController = ScrollController(initialScrollOffset: 0); late var refreshController = RefreshController();
late EasyRefreshController refreshController = EasyRefreshController();
var models = AIDrawTextToImageModel(); var models = AIDrawTextToImageModel();
var images = Rx<List<MyWorkData>>([]);
var title = "".obs;
@override
void onInit() {
// TODO: implement onInit
super.onInit();
final arguments = Get.arguments;
final operator = arguments["operator"];
if (operator == "work") {
title.value = "我的作品";
requestMyWorkImages();
} else {
title.value = "我的收藏";
requestMyCollectImages();
}
}
onClickImage(int index) async {
if (index >= 0 && index < images.value.length) {
final item = images.value[index];
final conversionId = await UserAPI.createConversion();
EasyLoading.dismiss();
if (conversionId == 401) {
EasyLoading.showInfo('您还为登录,请登录后体验功能。');
Get.toNamed(AppRoutes.SIGN_IN);
} else {
Get.toNamed(AppRoutes.AI_DRAW_IMAGE_RESULT_PAGE,
arguments: {
"opearter": OpearterType.imageResult,
"conversionId": conversionId,
"imageUrls": [item.minioUrl ?? ""],
"enText": item.content,
"text": item.content,
"ratio": "16:9",
"s": "",
"styleName": item.style ?? "通用风格",
"messageId": item.messageId ?? ""
});
}
}
}
requestMyWorkImages() async {
EasyLoading.show(
status: "正在加载我的作品",
dismissOnTap: false,
maskType: EasyLoadingMaskType.none,
indicator: LoadingAnimationWidget.staggeredDotsWave(
color: Colors.white,
size: 30,
));
final res = await UserAPI.getMyWorkImages();
EasyLoading.dismiss();
if (res.status == 200) {
images.value = res.data ?? [];
} else {
EasyLoading.showError(res.message ?? "请求我的作品异常");
}
}
requestMyCollectImages() async {
EasyLoading.show(
status: "正在加载我的收藏",
dismissOnTap: false,
maskType: EasyLoadingMaskType.none,
indicator: LoadingAnimationWidget.staggeredDotsWave(
color: Colors.white,
size: 30,
));
final res = await UserAPI.getMyCollectImages();
EasyLoading.dismiss();
if (res.status == 200) {
images.value = res.data ?? [];
} else {
EasyLoading.showError(res.message ?? "请求我的收藏异常");
}
}
onPullRefresh() {
Future.delayed(Duration(seconds: 3), () {
refreshController.refreshCompleted();
});
}
onLoadMore() {
Future.delayed(Duration(seconds: 3), () {
refreshController.loadComplete();
});
}
} }
\ No newline at end of file
class MyWorkResponse {
int? status;
String? message;
List<MyWorkData>? data;
MyWorkResponse({this.status, this.message, this.data});
MyWorkResponse.fromJson(Map<String, dynamic> json) {
status = json['status'];
message = json['message'];
if (json['data'] != null) {
data = [];
json['data'].forEach((v) {
data?.add(new MyWorkData.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
data['message'] = this.message;
if (this.data != null) {
data['data'] = this.data?.map((v) => v.toJson()).toList();
}
return data;
}
}
class MyWorkData {
int? id;
int? userId;
String? content;
String? imageUrl;
String? messageId;
String? minioUrl;
String? createTime;
dynamic style;
int? showSquare;
MyWorkData(
{this.id,
this.userId,
this.content,
this.imageUrl,
this.messageId,
this.minioUrl,
this.createTime,
this.style,
this.showSquare});
MyWorkData.fromJson(Map<String, dynamic> json) {
id = json['id'];
userId = json['userId'];
content = json['content'];
imageUrl = json['imageUrl'];
messageId = json['messageId'];
minioUrl = json['minioUrl'];
createTime = json['createTime'];
style = json['style'];
showSquare = json['showSquare'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['userId'] = this.userId;
data['content'] = this.content;
data['imageUrl'] = this.imageUrl;
data['messageId'] = this.messageId;
data['minioUrl'] = this.minioUrl;
data['createTime'] = this.createTime;
data['style'] = this.style;
data['showSquare'] = this.showSquare;
return data;
}
}
\ No newline at end of file
import 'package:cached_network_image/cached_network_image.dart';
import 'package:chart/common/routers/routes.dart'; import 'package:chart/common/routers/routes.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../common/style/color.dart'; import '../../common/style/color.dart';
import './controller.dart'; import './controller.dart';
class MyWorkPage extends GetView<MyWorkController> { class MyWorkPage extends GetView<MyWorkController> {
const MyWorkPage({Key? key}) : super(key: key); const MyWorkPage({Key? key}) : super(key: key);
Widget makeListView() { Widget makeListView() {
// TODO: implement build // TODO: implement build
final controller = Get.find<MyWorkController>(); final controller = Get.find<MyWorkController>();
return Container( return SmartRefresher(
child: EasyRefresh( enablePullUp: true,
controller: controller.refreshController, controller: controller.refreshController,
header: ClassicalHeader( onRefresh: controller.onPullRefresh,
bgColor: Colors.white, onLoading: controller.onLoadMore,
textColor: Colors.pink, header: const ClassicHeader(
infoColor: Colors.pink, releaseText: "松开刷新",
refreshReadyText: '下拉刷新', refreshingText: "刷新数据中",
refreshingText: '正在努力刷新', completeText: "刷新数据成功",
refreshedText: '加载完成', idleText: "下拉刷新"
showInfo: true,
infoText: '正在加载中',
), ),
footer: ClassicalFooter( footer: const ClassicFooter(
bgColor: Colors.white, loadingText: "正在加载中...",
textColor: Colors.pink, noDataText: '没有更多数据啦'
infoColor: Colors.pink,
showInfo: true,
noMoreText: '暂时没有更多了',
loadReadyText: '上拉加载',
loadedText: '加载完毕',
loadText: '上拉加载更多',
loadingText: '正在努力加载更多',
infoText: '正在加载中',
), ),
child: MasonryGridView.count( child: Obx(() => MasonryGridView.count(
controller: controller.loadingMoreController, itemCount: controller.images.value.length,
itemCount: controller.models.descriptives.length,
crossAxisCount: 2, crossAxisCount: 2,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return ClipRRect( return InkWell(
borderRadius: BorderRadius.circular(10), onTap: () {
child: Image(image: AssetImage(controller.models.descriptives[index].imageUrl), controller.onClickImage(index);
fit: BoxFit.cover, },
height: index % 2 == 0 ? 260 : 200, child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: CachedNetworkImage(
fit: BoxFit.cover,
height: index % 2 == 0 ? 260 : 200,
imageUrl: controller.images.value[index].minioUrl ?? "",
placeholder: (context, url) => Container(
alignment: Alignment.center,
child: const SizedBox(
width: 30,
height: 30,
child: CircularProgressIndicator(),
),
),
errorWidget: (context, url, error) => Container(
alignment: Alignment.center,
child: Text(error.toString()),
),
)
), ),
); );
}, },
mainAxisSpacing: 10.0, mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0, crossAxisSpacing: 10.0,
), ))
onLoad: () async { );
print('没有更多了.......');
},
onRefresh: () async {
print('下拉刷新~~~~');
},
),
);
} }
@override @override
...@@ -77,22 +76,17 @@ class MyWorkPage extends GetView<MyWorkController> { ...@@ -77,22 +76,17 @@ class MyWorkPage extends GetView<MyWorkController> {
init: MyWorkController(), init: MyWorkController(),
id: "mywork", id: "mywork",
builder: (_) { builder: (_) {
return Container( final controller = Get.find<MyWorkController>();
height: double.infinity, return Scaffold(
decoration: const BoxDecoration( backgroundColor: AppColor.black1,
color: AppColor.black1 appBar: AppBar(
), elevation: 0,
child: Scaffold( title: Obx(() => Text(controller.title.value)),
bottomOpacity: 0.1,
backgroundColor: const Color.fromARGB(0, 29, 33, 60), backgroundColor: const Color.fromARGB(0, 29, 33, 60),
appBar: AppBar( ),
elevation: 0, body: SafeArea(
title: const Text("我的作品"), child: makeListView(),
bottomOpacity: 0.1,
backgroundColor: const Color.fromARGB(0, 29, 33, 60),
),
body: SafeArea(
child: makeListView(),
),
), ),
); );
}, },
......
...@@ -39,7 +39,7 @@ class MyController extends GetxController { ...@@ -39,7 +39,7 @@ class MyController extends GetxController {
if (await inAppReview.isAvailable()) { if (await inAppReview.isAvailable()) {
inAppReview.requestReview(); inAppReview.requestReview();
} else { } else {
EasyLoading.showToast("评价异常"); EasyLoading.showToast("评价异常或者已经评价");
} }
} }
...@@ -67,17 +67,6 @@ class MyController extends GetxController { ...@@ -67,17 +67,6 @@ class MyController extends GetxController {
EasyLoading.showError(res.message ?? "获取个人信息失败"); EasyLoading.showError(res.message ?? "获取个人信息失败");
} }
userInfo.value = res.data ?? UserInfoData(username: "未登录"); userInfo.value = res.data ?? UserInfoData(username: "未登录");
/**
* if let text = chatController.userInfo?.expireTime, !text.isEmpty {
if text.isExpireTime {
cell?.detailTextLabel?.text = "已过期: \(text.expireTime)"
} else {
cell?.detailTextLabel?.text = "到期日: \(text.expireTime)"
}
} else {
cell?.detailTextLabel?.text = "可用积分: \(chatController.userInfo?.integral ?? 0)"
}
*/
final expireTime = userInfo.value.expireTime; final expireTime = userInfo.value.expireTime;
if (expireTime != null && expireTime.isNotEmpty) { if (expireTime != null && expireTime.isNotEmpty) {
final expDate = DateTime.parse(expireTime); final expDate = DateTime.parse(expireTime);
......
...@@ -45,6 +45,8 @@ class UserInfoData { ...@@ -45,6 +45,8 @@ class UserInfoData {
String? shareCode; String? shareCode;
String? deviceType; String? deviceType;
String? gopenId; String? gopenId;
int? createImgCount;
int? collectImgCount;
UserInfoData( UserInfoData(
{this.id, {this.id,
...@@ -64,7 +66,9 @@ class UserInfoData { ...@@ -64,7 +66,9 @@ class UserInfoData {
this.source, this.source,
this.shareCode, this.shareCode,
this.deviceType, this.deviceType,
this.gopenId}); this.gopenId,
this.createImgCount,
this.collectImgCount});
UserInfoData.fromJson(Map<String, dynamic> json) { UserInfoData.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
...@@ -85,6 +89,8 @@ class UserInfoData { ...@@ -85,6 +89,8 @@ class UserInfoData {
shareCode = json['shareCode']; shareCode = json['shareCode'];
deviceType = json['deviceType']; deviceType = json['deviceType'];
gopenId = json['gopenId']; gopenId = json['gopenId'];
createImgCount = json['createImgCount'];
collectImgCount = json['collectImgCount'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
...@@ -107,6 +113,8 @@ class UserInfoData { ...@@ -107,6 +113,8 @@ class UserInfoData {
data['shareCode'] = this.shareCode; data['shareCode'] = this.shareCode;
data['deviceType'] = this.deviceType; data['deviceType'] = this.deviceType;
data['gopenId'] = this.gopenId; data['gopenId'] = this.gopenId;
data['createImgCount'] = this.createImgCount;
data['collectImgCount'] = this.collectImgCount;
return data; return data;
} }
} }
\ No newline at end of file
...@@ -68,6 +68,7 @@ class MyPage extends GetView<MyController> { ...@@ -68,6 +68,7 @@ class MyPage extends GetView<MyController> {
} }
Widget makeHistoryInfoView() { Widget makeHistoryInfoView() {
final controller = Get.find<MyController>();
return Container( return Container(
padding: const EdgeInsets.fromLTRB(0, 30, 0, 30), padding: const EdgeInsets.fromLTRB(0, 30, 0, 30),
child: Row( child: Row(
...@@ -75,18 +76,18 @@ class MyPage extends GetView<MyController> { ...@@ -75,18 +76,18 @@ class MyPage extends GetView<MyController> {
Expanded( Expanded(
child: InkWell( child: InkWell(
onTap: () { onTap: () {
Get.toNamed(AppRoutes.MY_WORK); Get.toNamed(AppRoutes.MY_WORK, arguments: {"operator": "work"});
}, },
child: Column( child: Column(
children: const [ children: [
Text("2", Obx(() => Text("${controller.userInfo.value.createImgCount ?? 0}",
style: TextStyle( style: const TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 30 fontSize: 30
), ),
), ),),
SizedBox(height: 5,), const SizedBox(height: 5,),
Text("绘画作品", const Text("绘画作品",
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: 14,
color: AppColor.gray4, color: AppColor.gray4,
...@@ -105,16 +106,19 @@ class MyPage extends GetView<MyController> { ...@@ -105,16 +106,19 @@ class MyPage extends GetView<MyController> {
), ),
Expanded( Expanded(
child: InkWell( child: InkWell(
onTap: () {
Get.toNamed(AppRoutes.MY_WORK, arguments: {"operator": "collect"});
},
child: Column( child: Column(
children: const [ children: [
Text("0", Obx(() => Text("${controller.userInfo.value.collectImgCount ?? 0}",
style: TextStyle( style: const TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 30 fontSize: 30
), ),
), )),
SizedBox(height: 5,), const SizedBox(height: 5,),
Text("我的收藏", const Text("我的收藏",
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: 14,
color: AppColor.gray4, color: AppColor.gray4,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment