页面逻辑
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import 'package:chat/models/moment/moment_model.dart';
|
import 'package:chat/models/moment/moment_model.dart';
|
||||||
import 'package:chat/routes/moments_routes.dart';
|
import 'package:chat/routes/moments_routes.dart';
|
||||||
import 'package:chat/services/moment_service.dart';
|
import 'package:chat/providers/moment_provider.dart';
|
||||||
import 'package:chat/utils/ui_tools.dart';
|
import 'package:chat/utils/ui_tools.dart';
|
||||||
import 'package:chat/views/moments/index/widgets/quick_reply_bar.dart';
|
import 'package:chat/views/moments/index/widgets/quick_reply_bar.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -43,7 +43,7 @@ class MomentController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> refreshList() async {
|
Future<void> refreshList() async {
|
||||||
final res = await MomentService.fetchMomentList();
|
final res = await MomentProvider.fetchMomentList();
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
momentData.value = res;
|
momentData.value = res;
|
||||||
}
|
}
|
||||||
@@ -51,7 +51,7 @@ class MomentController extends GetxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> loadMoreList() async {
|
Future<void> loadMoreList() async {
|
||||||
final res = await MomentService.fetchMomentList(
|
final res = await MomentProvider.fetchMomentList(
|
||||||
momentData.value?.data?.last.createdAt);
|
momentData.value?.data?.last.createdAt);
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
final data = res.data ?? [];
|
final data = res.data ?? [];
|
||||||
@@ -70,7 +70,7 @@ class MomentController extends GetxController {
|
|||||||
|
|
||||||
// 点赞
|
// 点赞
|
||||||
Future<void> likeMoment(MomentItemModel item) async {
|
Future<void> likeMoment(MomentItemModel item) async {
|
||||||
final result = await MomentService.likeMoment(item.dynamicId!);
|
final result = await MomentProvider.likeMoment(item.dynamicId!);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
if (item.isLike != result && result && item.likerCount != null) {
|
if (item.isLike != result && result && item.likerCount != null) {
|
||||||
item.likerCount = item.likerCount! + 1;
|
item.likerCount = item.likerCount! + 1;
|
||||||
@@ -84,7 +84,7 @@ class MomentController extends GetxController {
|
|||||||
|
|
||||||
// 删除动态
|
// 删除动态
|
||||||
Future<void> delMoment(MomentItemModel item) async {
|
Future<void> delMoment(MomentItemModel item) async {
|
||||||
final result = await MomentService.delMoment(item.dynamicId!);
|
final result = await MomentProvider.delMoment(item.dynamicId!);
|
||||||
if (result == true) {
|
if (result == true) {
|
||||||
final moment = momentData.value?.data?.indexWhere(
|
final moment = momentData.value?.data?.indexWhere(
|
||||||
(e) => e.dynamicId == item.dynamicId,
|
(e) => e.dynamicId == item.dynamicId,
|
||||||
@@ -101,7 +101,7 @@ class MomentController extends GetxController {
|
|||||||
int dynamicId, [
|
int dynamicId, [
|
||||||
Comment? comment,
|
Comment? comment,
|
||||||
]) async {
|
]) async {
|
||||||
final result = await MomentService.delComment(
|
final result = await MomentProvider.delComment(
|
||||||
dynamicId,
|
dynamicId,
|
||||||
comment?.id,
|
comment?.id,
|
||||||
);
|
);
|
||||||
@@ -123,7 +123,7 @@ class MomentController extends GetxController {
|
|||||||
String content, [
|
String content, [
|
||||||
Comment? comment,
|
Comment? comment,
|
||||||
]) async {
|
]) async {
|
||||||
final result = await MomentService.replyComment(
|
final result = await MomentProvider.replyComment(
|
||||||
dynamicId,
|
dynamicId,
|
||||||
content,
|
content,
|
||||||
comment?.id,
|
comment?.id,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:chat/controllers/moment_controller.dart';
|
import 'package:chat/controllers/moment_controller.dart';
|
||||||
import 'package:chat/models/upload_model.dart';
|
import 'package:chat/models/upload_model.dart';
|
||||||
import 'package:chat/routes/moments_routes.dart';
|
import 'package:chat/routes/moments_routes.dart';
|
||||||
import 'package:chat/services/moment_service.dart';
|
import 'package:chat/providers/moment_provider.dart';
|
||||||
import 'package:chat/utils/ui_tools.dart';
|
import 'package:chat/utils/ui_tools.dart';
|
||||||
import 'package:chat/views/moments/publish/widgets/delete_dialog.dart';
|
import 'package:chat/views/moments/publish/widgets/delete_dialog.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -46,7 +46,7 @@ class PublishController extends GetxController {
|
|||||||
EasyLoading.show(status: '上传中', maskType: EasyLoadingMaskType.black);
|
EasyLoading.show(status: '上传中', maskType: EasyLoadingMaskType.black);
|
||||||
final result = await uploadAllFile();
|
final result = await uploadAllFile();
|
||||||
if (!result) return;
|
if (!result) return;
|
||||||
final res = await MomentService.publishMoment(
|
final res = await MomentProvider.publishMoment(
|
||||||
description: publishContent.value,
|
description: publishContent.value,
|
||||||
pictures: uploadedFileList.map((e) => e.item2!.url).toList(),
|
pictures: uploadedFileList.map((e) => e.item2!.url).toList(),
|
||||||
);
|
);
|
||||||
@@ -66,7 +66,7 @@ class PublishController extends GetxController {
|
|||||||
(e) => (e.item1 == file.hashCode && e.item2?.url != null),
|
(e) => (e.item1 == file.hashCode && e.item2?.url != null),
|
||||||
);
|
);
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
final res = await MomentService.uploadFile((await file.file)!.path);
|
final res = await MomentProvider.uploadFile((await file.file)!.path);
|
||||||
if (res == null) throw Exception('上传失败');
|
if (res == null) throw Exception('上传失败');
|
||||||
for (var index = 0; index < uploadedFileList.length; index++) {
|
for (var index = 0; index < uploadedFileList.length; index++) {
|
||||||
final uploaded = uploadedFileList[index];
|
final uploaded = uploadedFileList[index];
|
||||||
|
|||||||
@@ -20,4 +20,12 @@ class UserInfoModel {
|
|||||||
avatar: json['avatar'],
|
avatar: json['avatar'],
|
||||||
address: json['address'],
|
address: json['address'],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
factory UserInfoModel.empty() => UserInfoModel(
|
||||||
|
userId: 0,
|
||||||
|
username: '',
|
||||||
|
nickname: '',
|
||||||
|
avatar: '',
|
||||||
|
address: '',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,7 @@ import 'package:chat/models/upload_model.dart';
|
|||||||
import 'package:chat/utils/request/http.dart';
|
import 'package:chat/utils/request/http.dart';
|
||||||
import 'package:chat/utils/ui_tools.dart';
|
import 'package:chat/utils/ui_tools.dart';
|
||||||
|
|
||||||
class MomentService {
|
class MomentProvider {
|
||||||
MomentService._();
|
|
||||||
|
|
||||||
/// 获取“发现”列表数据
|
/// 获取“发现”列表数据
|
||||||
///
|
///
|
||||||
/// [createAt] 最后一列的create_at
|
/// [createAt] 最后一列的create_at
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:chat/views/conversation/index_page.dart';
|
|
||||||
import 'package:chat/views/home/index_page.dart';
|
import 'package:chat/views/home/index_page.dart';
|
||||||
import 'package:chat/views/public/app_page.dart';
|
import 'package:chat/views/public/app_page.dart';
|
||||||
import 'package:chat/views/public/scan_page.dart';
|
import 'package:chat/views/public/scan_page.dart';
|
||||||
import 'package:chat/views/public/transit_page.dart';
|
import 'package:chat/views/public/transit_page.dart';
|
||||||
|
import 'package:chat/views/search/index_page.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
/// 这里是为了定义别名路由的名称,
|
/// 这里是为了定义别名路由的名称,
|
||||||
@@ -34,7 +34,7 @@ abstract class AppRoutes {
|
|||||||
),
|
),
|
||||||
GetPage(
|
GetPage(
|
||||||
name: AppRoutes.search,
|
name: AppRoutes.search,
|
||||||
page: () => const ConversationPage(),
|
page: () => const SearchPage(),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
import 'package:chat/middleware/auth_middleware.dart';
|
import 'package:chat/middleware/auth_middleware.dart';
|
||||||
import 'package:chat/views/contact/index/index_page.dart';
|
import 'package:chat/views/contact/index/index_page.dart';
|
||||||
import 'package:chat/views/user/qr_code/index_page.dart';
|
import 'package:chat/views/user/qr_code/index_page.dart';
|
||||||
|
import 'package:chat/views/user/setting/index_page.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
abstract class UserRoutes {
|
abstract class UserRoutes {
|
||||||
/// 身份验证页面
|
/// 身份验证页面
|
||||||
static const String index = '/user';
|
static const String index = '/user';
|
||||||
static const String qrCode = '/user/qrCode';
|
static const String qrCode = '/user/qrCode';
|
||||||
|
static const String setting = '/user/setting';
|
||||||
|
static const String share = '/user/share';
|
||||||
|
|
||||||
static GetPage router = GetPage(
|
static GetPage router = GetPage(
|
||||||
name: UserRoutes.index,
|
name: UserRoutes.index,
|
||||||
@@ -19,6 +22,10 @@ abstract class UserRoutes {
|
|||||||
name: '/qrCode',
|
name: '/qrCode',
|
||||||
page: () => const UserQrCodePage(),
|
page: () => const UserQrCodePage(),
|
||||||
),
|
),
|
||||||
|
GetPage(
|
||||||
|
name: '/setting',
|
||||||
|
page: () => const UserSettingPage(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:chat/models/user_info_model.dart';
|
||||||
import 'package:chat/routes/auth_routes.dart';
|
import 'package:chat/routes/auth_routes.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:get_storage/get_storage.dart';
|
import 'package:get_storage/get_storage.dart';
|
||||||
@@ -19,10 +20,10 @@ class AuthService extends GetxService {
|
|||||||
late String userSig = '';
|
late String userSig = '';
|
||||||
|
|
||||||
/// 获取存储的token,这个可以做到持久化存储
|
/// 获取存储的token,这个可以做到持久化存储
|
||||||
String get _userSig =>
|
String get _userSig => _box.read('userSig') ?? '';
|
||||||
_box.read('userSig') ??
|
String get _userId => _box.read('userId') ?? '';
|
||||||
'eJwtzEELgjAYxvHvsnPIu7VNJ3ToIIKsIAp2ljbrRYylJs3ou2fq8fk98P*Qiz5Hg2tJSlgEZDNvtO7RY4UzixU7W5feoyUp5QAxVVzR5XFvj62bXAjBAGDRHpu-SSnZlseKrxW8TU1p9sV4v3YJoyFrDrV*QYu5yrQ*2cqUzyHkPpixOMbJjnx-EqUv9A__';
|
|
||||||
String get _userId => _box.read('userId') ?? '5';
|
Rx<UserInfoModel> userInfo = UserInfoModel.empty().obs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
@@ -44,8 +45,8 @@ class AuthService extends GetxService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> login(String address) async {
|
Future<bool> login(String address) async {
|
||||||
_box.write('userId', '5');
|
_box.write('userId', '');
|
||||||
userId = '5';
|
userId = '';
|
||||||
isLogin.value = true;
|
isLogin.value = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -58,6 +59,7 @@ class AuthService extends GetxService {
|
|||||||
_box.remove('userId');
|
_box.remove('userId');
|
||||||
userSig = '';
|
userSig = '';
|
||||||
userId = '';
|
userId = '';
|
||||||
|
userInfo.value = UserInfoModel.empty();
|
||||||
isLogin.value = false;
|
isLogin.value = false;
|
||||||
Get.offAllNamed(AuthRoutes.index);
|
Get.offAllNamed(AuthRoutes.index);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class TimService extends GetxService {
|
|||||||
return TencentImSDKPlugin.v2TIMManager;
|
return TencentImSDKPlugin.v2TIMManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdkAppID = 1400719491;
|
int sdkAppID = 1400673817;
|
||||||
|
|
||||||
String get _userSig => AuthService.to.userSig;
|
String get _userSig => AuthService.to.userSig;
|
||||||
|
|
||||||
|
|||||||
57
lib/views/search/index_page.dart
Normal file
57
lib/views/search/index_page.dart
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import 'package:chat/configs/app_colors.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class SearchPage extends StatefulWidget {
|
||||||
|
const SearchPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SearchPage> createState() => _SearchPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SearchPageState extends State<SearchPage> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: AppColors.white,
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Container(
|
||||||
|
constraints: const BoxConstraints(
|
||||||
|
maxHeight: 32,
|
||||||
|
),
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: BorderRadius.circular(32),
|
||||||
|
child: TextField(
|
||||||
|
onChanged: (e) async {},
|
||||||
|
autofocus: true,
|
||||||
|
decoration: const InputDecoration(
|
||||||
|
hintText: '请输入搜索内容',
|
||||||
|
hintStyle: TextStyle(
|
||||||
|
fontSize: 14,
|
||||||
|
color: AppColors.unactive,
|
||||||
|
),
|
||||||
|
border: InputBorder.none,
|
||||||
|
focusedBorder: InputBorder.none,
|
||||||
|
fillColor: AppColors.white,
|
||||||
|
filled: true,
|
||||||
|
contentPadding: EdgeInsets.only(
|
||||||
|
bottom: 14,
|
||||||
|
left: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
cursorColor: AppColors.primary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
actions: <Widget>[
|
||||||
|
IconButton(
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.search,
|
||||||
|
color: AppColors.black,
|
||||||
|
),
|
||||||
|
onPressed: () {},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
|
import 'package:chat/routes/user_routes.dart';
|
||||||
|
import 'package:chat/services/auth_service.dart';
|
||||||
|
import 'package:chat/widgets/custom_avatar.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
class UserPage extends StatefulWidget {
|
class UserPage extends StatefulWidget {
|
||||||
const UserPage({Key? key}) : super(key: key);
|
const UserPage({Key? key}) : super(key: key);
|
||||||
@@ -10,9 +14,55 @@ class UserPage extends StatefulWidget {
|
|||||||
class _UserPageState extends State<UserPage> {
|
class _UserPageState extends State<UserPage> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return SafeArea(
|
||||||
appBar: AppBar(
|
child: Scaffold(
|
||||||
title: const Text('我的'),
|
body: Column(
|
||||||
|
children: [
|
||||||
|
GetX<AuthService>(builder: (_) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
CustomAvatar(
|
||||||
|
_.userInfo.value.avatar,
|
||||||
|
size: 72,
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
Text(_.userInfo.value.nickname),
|
||||||
|
Text('${_.userInfo.value.address}'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Expanded(child: Container()),
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
Get.toNamed(UserRoutes.qrCode);
|
||||||
|
},
|
||||||
|
child: Row(
|
||||||
|
children: const [
|
||||||
|
Icon(Icons.qr_code),
|
||||||
|
Icon(Icons.arrow_forward_ios),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
ListTile(
|
||||||
|
onTap: () {
|
||||||
|
Get.toNamed(UserRoutes.share);
|
||||||
|
},
|
||||||
|
title: const Text('分享邀请'),
|
||||||
|
),
|
||||||
|
ListTile(
|
||||||
|
onTap: () {
|
||||||
|
Get.toNamed(UserRoutes.setting);
|
||||||
|
},
|
||||||
|
title: const Text('设置中心'),
|
||||||
|
),
|
||||||
|
const ListTile(
|
||||||
|
title: Text('检查更新'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
30
lib/views/user/setting/index_page.dart
Normal file
30
lib/views/user/setting/index_page.dart
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import 'package:chat/services/auth_service.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class UserSettingPage extends StatefulWidget {
|
||||||
|
const UserSettingPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_UserSettingPageState createState() => _UserSettingPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _UserSettingPageState extends State<UserSettingPage> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text('设置中心'),
|
||||||
|
),
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
AuthService.to.logout();
|
||||||
|
},
|
||||||
|
child: const Text('退出登录'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
20
lib/views/user/share/index_page.dart
Normal file
20
lib/views/user/share/index_page.dart
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class UserSharePage extends StatefulWidget {
|
||||||
|
const UserSharePage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<UserSharePage> createState() => _UserSharePageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _UserSharePageState extends State<UserSharePage> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text('分享邀请'),
|
||||||
|
),
|
||||||
|
body: Container(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user