Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
G
gmalpha_flutter
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mobile
gmalpha_flutter
Commits
ea808210
Commit
ea808210
authored
Oct 16, 2019
by
林生雨
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
commit
parent
23ce2864
Show whitespace changes
Inline
Side-by-side
Showing
44 changed files
with
460 additions
and
243 deletions
+460
-243
AndroidManifest.xml
android/app/src/main/AndroidManifest.xml
+9
-0
MainActivity.kt
...c/main/kotlin/com/example/gmalpha_flutter/MainActivity.kt
+1
-0
file_paths.xml
android/app/src/main/res/xml/file_paths.xml
+7
-0
AppDelegate.m
ios/Runner/AppDelegate.m
+1
-1
ActivityReportModel.dart
lib/ActivityReportModel/page/ActivityReportModel.dart
+0
-1
ActivityReportPage.dart
lib/ActivityReportModel/page/ActivityReportPage.dart
+8
-8
AlbumModel.dart
lib/AlbumModel/page/album/AlbumModel.dart
+1
-1
AlbumPage.dart
lib/AlbumModel/page/album/AlbumPage.dart
+1
-2
temp.dart
lib/AlbumModel/page/temp.dart
+0
-5
BuriedCenter.dart
lib/BuriedLib/buried/BuriedCenter.dart
+0
-3
SendTask.dart
lib/BuriedLib/buried/SendTask.dart
+1
-2
ReputationsModel.dart
lib/PrestigeModel/page/reputation/ReputationsModel.dart
+0
-2
TestPage.dart
lib/TestPage.dart
+1
-1
GMBase.dart
lib/commonModel/GMBase.dart
+17
-0
app_module.dart
lib/commonModel/app_module.dart
+0
-7
AppBase.dart
lib/commonModel/base/AppBase.dart
+0
-0
BaseComponent.dart
lib/commonModel/base/BaseComponent.dart
+17
-1
BasePage.dart
lib/commonModel/base/BasePage.dart
+0
-2
BaseState.dart
lib/commonModel/base/BaseState.dart
+0
-20
BaseUtil.dart
lib/commonModel/base/BaseUtil.dart
+6
-0
NativeChannel.dart
lib/commonModel/base/NativeChannel.dart
+0
-16
Api.dart
lib/commonModel/net/Api.dart
+2
-0
phobos_flutter.dart
lib/commonModel/phobos/phobos_flutter.dart
+0
-62
ALCommon.dart
lib/commonModel/ui/ALCommon.dart
+0
-68
ALDevice.dart
lib/commonModel/ui/ALDevice.dart
+0
-17
main.dart
lib/main.dart
+1
-4
message_notification_item.dart
lib/messageModel/home/message_notification_item.dart
+1
-1
GMRes.dart
lib/res/GMRes.dart
+12
-0
Anim.dart
lib/res/anim/Anim.dart
+1
-1
ALColors.dart
lib/res/value/ALColors.dart
+0
-0
ALFont.dart
lib/res/value/ALFont.dart
+0
-0
ALString.dart
lib/res/value/ALString.dart
+6
-0
Other.dart
lib/userModel/page/Other.dart
+0
-5
CommentSuggestPage.dart
lib/userModel/page/comment/CommentSuggestPage.dart
+3
-4
CountryModel.dart
lib/userModel/page/country/CountryModel.dart
+32
-0
CountryPage.dart
lib/userModel/page/country/CountryPage.dart
+119
-0
UserSettingModel.dart
lib/userModel/page/userSetting/UserSettingModel.dart
+43
-0
UserSettingPage.dart
lib/userModel/page/userSetting/UserSettingPage.dart
+29
-9
UserRepository.dart
lib/userModel/service/UserRepository.dart
+5
-0
UserRemote.dart
lib/userModel/service/remote/UserRemote.dart
+6
-0
UserApi.dart
lib/userModel/service/remote/api/UserApi.dart
+4
-0
UserApi.serv.dart
lib/userModel/service/remote/api/UserApi.serv.dart
+11
-0
CountryBean.dart
lib/userModel/service/remote/entity/CountryBean.dart
+101
-0
JumpUtil.dart
lib/userModel/util/JumpUtil.dart
+14
-0
No files found.
android/app/src/main/AndroidManifest.xml
View file @
ea808210
...
...
@@ -21,5 +21,14 @@
android:value=
"true"
/>
</activity>
<activity
android:name=
".Temp"
/>
<provider
android:name=
"android.support.v4.content.FileProvider"
android:authorities=
"com.example.gmalpha_flutter"
android:exported=
"false"
android:grantUriPermissions=
"true"
>
<meta-data
android:name=
"android.support.FILE_PROVIDER_PATHS"
android:resource=
"@xml/file_paths"
/>
</provider>
</application>
</manifest>
android/app/src/main/kotlin/com/example/gmalpha_flutter/MainActivity.kt
View file @
ea808210
...
...
@@ -64,6 +64,7 @@ class MainActivity : FlutterActivity() {
}
else
if
(
call
.
method
==
"INIT_PARAMS"
)
{
val
map
=
HashMap
<
String
,
String
>()
map
.
put
(
"buildConfig"
,
"debug"
)
map
.
put
(
"provider"
,
"com.example.gmalpha_flutter"
)
//HERE
// map.put("proxy", "172.30.9.84:6666");
result
.
success
(
map
)
...
...
android/app/src/main/res/xml/file_paths.xml
0 → 100644
View file @
ea808210
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--path:需要临时授权访问的路径(.代表所有路径)-->
<!--name:就是你给这个访问路径起个名字-->
<external-path
name=
"InstructiveRide"
path=
"."
/>
</paths>
\ No newline at end of file
ios/Runner/AppDelegate.m
View file @
ea808210
...
...
@@ -65,7 +65,7 @@
[
dict
setObject
:
@"sessionid=9odo0sov71x66ke9dlphibnq9i9gduxj;_gtid=3fbe9b78d2cb11e98bc1525400e82fab5270; _gm_token=db88861568285036"
forKey
:
@"cookie"
];
[
dict
setObject
:
@"debug"
forKey
:
@"buildConfig"
];
//HERE
[
dict
setObject
:
@"172.30.9.84:6666"
forKey
:
@"proxy"
];
//
[dict setObject:@"172.30.9.84:6666" forKey:@"proxy"];
result
(
dict
);
}
}];
...
...
lib/ActivityReportModel/page/ActivityReportModel.dart
View file @
ea808210
...
...
@@ -5,7 +5,6 @@
import
'package:flutter/material.dart'
;
import
'package:gmalpha_flutter/ActivityReportModel/service/ActivityReportRepository.dart'
;
import
'package:gmalpha_flutter/ActivityReportModel/service/remote/entity/ActivityReportEntity.dart'
;
import
'package:gmalpha_flutter/commonModel/base/Temp.dart'
;
import
'package:gmalpha_flutter/commonModel/live/BaseModel.dart'
;
import
'package:gmalpha_flutter/commonModel/live/LiveData.dart'
;
import
'package:gmalpha_flutter/commonModel/net/DioUtil.dart'
;
...
...
lib/ActivityReportModel/page/ActivityReportPage.dart
View file @
ea808210
...
...
@@ -10,10 +10,8 @@ import 'package:gmalpha_flutter/ActivityReportModel/service/remote/entity/Activi
import
'package:flutter/material.dart'
;
import
'package:gmalpha_flutter/ActivityReportModel/page/ActivityReportModel.dart'
;
import
'package:gmalpha_flutter/Annotations/RouterCenterRestore.mark.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BasePage.dart'
;
import
'package:gmalpha_flutter/commonModel/base/Temp.dart'
;
import
'package:gmalpha_flutter/commonModel/ui/ALColors.dart'
;
import
'package:gmalpha_flutter/commonModel/GMBase.dart'
;
import
'package:gmalpha_flutter/res/GMRes.dart'
;
final
_goldenColor
=
Color
(
0xFFB9A689
);
ActivityReportState
state
;
...
...
@@ -243,7 +241,8 @@ class TopCard extends StatelessWidget {
SizedBox
(
height:
ScreenUtil
.
instance
.
setHeight
(
8.5
),
child:
Container
(
margin:
EdgeInsets
.
only
(
top:
ScreenUtil
.
instance
.
setHeight
(.
5
)),
margin:
EdgeInsets
.
only
(
top:
ScreenUtil
.
instance
.
setHeight
(.
5
)),
color:
ALColors
.
Color323232
,
),
),
...
...
@@ -412,8 +411,8 @@ class PictorialCard extends StatelessWidget {
children:
<
Widget
>[
Container
(
width:
ScreenUtil
.
instance
.
setWidth
(
343
),
padding:
EdgeInsets
.
only
(
bottom:
ScreenUtil
.
instance
.
setHeight
(
11.0
)),
padding:
EdgeInsets
.
only
(
bottom:
ScreenUtil
.
instance
.
setHeight
(
11.0
)),
child:
Wrap
(
spacing:
6
,
children:
list
),
),
Container
(
...
...
@@ -574,7 +573,8 @@ class AnimationCharacterState extends State<AnimationCharacter>
if
(
percent
<
frist
)
{
double
tempPercent
=
percent
/
frist
;
nowValue
=
(
target
*
tempPercent
).
ceil
();
margin
=
ScreenUtil
.
instance
.
setWidth
(
10.0
+
(
25.8
*
nowValue
).
ceil
());
margin
=
ScreenUtil
.
instance
.
setWidth
(
10.0
+
(
25.8
*
nowValue
).
ceil
());
if
(
index
!=
nowValue
)
{
item
[
'url'
]
=
'images/dark_grey_person.png'
;
}
else
{
...
...
lib/AlbumModel/page/album/AlbumModel.dart
View file @
ea808210
...
...
@@ -179,7 +179,7 @@ class AlbumModel extends BaseModel {
void
onNext
(
BuildContext
context
)
{
if
(
_selectList
.
isEmpty
)
{
Navigator
.
pop
(
context
,
""
);
Navigator
.
pop
(
context
,
null
);
}
else
{
Navigator
.
pop
(
context
,
_selectList
);
}
...
...
lib/AlbumModel/page/album/AlbumPage.dart
View file @
ea808210
...
...
@@ -38,7 +38,7 @@ class AlbumState extends State<AlbumPage> {
return
Scaffold
(
appBar:
AppBar
(
leading:
GestureDetector
(
onTap:
()
=>
Navigator
.
pop
(
context
,
""
),
onTap:
()
=>
Navigator
.
pop
(
context
,
null
),
child:
Center
(
child:
Container
(
padding:
EdgeInsets
.
fromLTRB
(
16
,
0
,
0
,
0
),
...
...
@@ -108,7 +108,6 @@ class AlbumState extends State<AlbumPage> {
void
dispose
()
{
super
.
dispose
();
_model
.
dispose
();
}
mainView
()
{
...
...
lib/AlbumModel/page/temp.dart
deleted
100644 → 0
View file @
23ce2864
/*
* @author lsy
* @date 2019-09-09
**/
\ No newline at end of file
lib/BuriedLib/buried/BuriedCenter.dart
View file @
ea808210
...
...
@@ -3,10 +3,7 @@
* @date 2019-09-30
**/
import
'package:gmalpha_flutter/BuriedLib/buried/SendTask.dart'
;
import
'package:gmalpha_flutter/BuriedLib/buried/constant/Constant.dart'
;
import
'package:gmalpha_flutter/BuriedLib/proto/burying.pbgrpc.dart'
;
import
'package:gmalpha_flutter/commonModel/app_module.dart'
;
import
'package:gmalpha_flutter/commonModel/cache/CacheManager.dart'
;
const
BURIED_TAG
=
"BURIED"
;
...
...
lib/BuriedLib/buried/SendTask.dart
View file @
ea808210
...
...
@@ -4,8 +4,7 @@
**/
import
'package:gmalpha_flutter/BuriedLib/buried/constant/Constant.dart'
;
import
'package:gmalpha_flutter/BuriedLib/proto/burying.pbgrpc.dart'
;
import
'package:gmalpha_flutter/commonModel/app_module.dart'
;
import
'package:gmalpha_flutter/commonModel/base/Temp.dart'
;
import
'package:gmalpha_flutter/commonModel/GMBase.dart'
;
import
'package:gmalpha_flutter/commonModel/cache/CacheManager.dart'
;
import
'package:gmalpha_flutter/commonModel/net/Api.dart'
;
import
'package:grpc/grpc.dart'
;
...
...
lib/PrestigeModel/page/reputation/ReputationsModel.dart
View file @
ea808210
...
...
@@ -5,10 +5,8 @@
import
'package:flutter/material.dart'
;
import
'package:gmalpha_flutter/PrestigeModel/service/PrestigeRepository.dart'
;
import
'package:gmalpha_flutter/PrestigeModel/service/remote/entity/PrestigeEntity.dart'
;
import
'package:gmalpha_flutter/commonModel/base/Temp.dart'
;
import
'package:gmalpha_flutter/commonModel/live/BaseModel.dart'
;
import
'package:gmalpha_flutter/commonModel/live/LiveData.dart'
;
import
'package:gmalpha_flutter/commonModel/net/DioUtil.dart'
;
import
'package:gmalpha_flutter/commonModel/toast/toast.dart'
;
class
ReputationsModel
extends
BaseModel
{
...
...
lib/TestPage.dart
View file @
ea808210
...
...
@@ -5,9 +5,9 @@
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/material.dart'
;
import
'package:gmalpha_flutter/Annotations/RouterCenterRestore.mark.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gmalpha_flutter/commonModel/net/Api.dart'
;
import
'package:gmalpha_flutter/res/anim/Anim.dart'
;
import
'commonModel/GMBase.dart'
;
class
TestPage
extends
StatelessWidget
{
TestPage
()
{
...
...
lib/commonModel/GMBase.dart
0 → 100644
View file @
ea808210
/*
* @author lsy
* @date 2019-10-15
**/
library
GMBase
;
export
'base/AppBase.dart'
;
export
'base/BaseBuried.dart'
;
export
'base/BaseComponent.dart'
;
export
'base/BasePage.dart'
;
export
'base/BaseUtil.dart'
;
export
'live/BaseModel.dart'
;
export
'live/LiveData.dart'
;
export
'net/Api.dart'
;
export
'net/DioUtil.dart'
;
export
'net/Responce/SimpleResponce.dart'
;
export
'net/ALNetWork.dart'
;
lib/commonModel/app_module.dart
deleted
100644 → 0
View file @
23ce2864
import
'package:gmalpha_flutter/commonModel/base/Temp.dart'
;
import
'package:gmalpha_flutter/commonModel/sp/SpUtil.dart'
;
SpUtil
spUtil
=
SpUtil
.
getInstance
()
as
SpUtil
;
lib/commonModel/base/
Temp
.dart
→
lib/commonModel/base/
AppBase
.dart
View file @
ea808210
File moved
lib/commonModel/base/BaseComponent.dart
View file @
ea808210
...
...
@@ -7,7 +7,10 @@ import 'package:flutter/material.dart';
import
'package:flutter_svg/flutter_svg.dart'
;
AppBar
baseAppBar
(
{
String
title
,
List
<
Widget
>
action
,
bool
centerTitle
,
VoidCallback
backClick
})
{
{
String
title
,
List
<
Widget
>
action
,
bool
centerTitle
,
VoidCallback
backClick
})
{
return
AppBar
(
title:
title
==
null
?
Container
()
:
baseText
(
title
,
16
,
0xff323232
),
centerTitle:
centerTitle
,
...
...
@@ -29,3 +32,16 @@ Text baseText(String text, double fontSize, int color) {
style:
TextStyle
(
fontSize:
fontSize
,
color:
Color
(
color
)),
);
}
Widget
loadingItem
(
)
{
//TODO
return
Center
(
child:
CircularProgressIndicator
());
}
Widget
netErrorItem
(
){
}
//TODO
lib/commonModel/base/BasePage.dart
View file @
ea808210
...
...
@@ -5,8 +5,6 @@
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/material.dart'
;
import
'package:gmalpha_flutter/Annotations/RouterCenterRestore.mark.dart'
;
import
'package:gmalpha_flutter/commonModel/base/Temp.dart'
;
import
'package:gmalpha_flutter/commonModel/cache/CacheManager.dart'
;
abstract
class
BasePage
<
T
extends
StatefulWidget
>
extends
State
<
T
>
{
var
startTime
;
...
...
lib/commonModel/base/BaseState.dart
deleted
100644 → 0
View file @
23ce2864
/*
* @author lsy
* @date 2019-09-24
**/
import
'package:flutter/material.dart'
;
abstract
class
BaseState
<
T
extends
StatefulWidget
>
extends
State
<
T
>{
@override
void
initState
()
{
super
.
initState
();
}
@override
void
dispose
()
{
super
.
dispose
();
}
}
\ No newline at end of file
lib/commonModel/base/BaseUtil.dart
View file @
ea808210
...
...
@@ -3,8 +3,14 @@
* @date 2019-10-14
**/
import
'dart:ui'
;
import
'package:flutter/material.dart'
;
double
screenWidth
=
window
.
physicalSize
.
width
;
double
screenHeight
=
window
.
physicalSize
.
height
;
void
jumpToPage
(
Widget
page
,
BuildContext
context
)
{
Navigator
.
push
(
context
,
MaterialPageRoute
(
builder:
((
context
)
{
return
page
;
...
...
lib/commonModel/base/NativeChannel.dart
deleted
100644 → 0
View file @
23ce2864
/*
* @author lsy
* @date 2019-09-30
**/
import
'package:flutter/services.dart'
;
const
platform
=
const
MethodChannel
(
'gengmei_flutter_native_channel'
);
class
NativeChannel
{
static
void
getNativeArguements
()
{
platform
.
invokeMethod
(
"get_native_data"
).
then
((
value
)
{
print
(
"VALUE=-="
);
});
}
}
lib/commonModel/net/Api.dart
View file @
ea808210
...
...
@@ -24,6 +24,7 @@ const String APP_HOST_DEV = "http://earth.alpha.newdev";
class
Api
{
static
String
BUILD_CONFIG
;
static
String
PROVIDER_NAME
;
static
Api
intance
=
new
Api
.
_
();
...
...
@@ -42,6 +43,7 @@ class Api {
return
false
;
}
BUILD_CONFIG
=
buildConfig
;
PROVIDER_NAME
=
params
[
"provider"
];
String
baseUrl
=
getBaseUrl
(
buildConfig
)
+
"/"
;
if
(
baseUrl
==
null
)
{
return
false
;
...
...
lib/commonModel/phobos/phobos_flutter.dart
deleted
100644 → 0
View file @
23ce2864
import
'package:flutter/services.dart'
;
// flutter 埋点方案
class
PhobosFlutter
{
static
const
MethodChannel
_channel
=
const
MethodChannel
(
'phobos_flutter_plugin'
);
///
/// track
/// 灰度信息
///
/// @param GreyType 事件名.
///
/// 使用示例:
/// PhobosFlutter.getGreyType();
///
static
Future
<
String
>
get
getGreyType
async
{
return
await
_channel
.
invokeMethod
(
'getGreyType'
);
}
///当前API
static
Future
<
String
>
get
getServerAPI
async
{
return
await
_channel
.
invokeMethod
(
'getServerAPI'
);
}
/// signingType 包的类型
static
Future
<
String
>
get
getSigningType
async
{
return
await
_channel
.
invokeMethod
(
'getServerAPI'
);
}
/// userId
static
Future
<
String
>
get
getUserId
async
{
return
await
_channel
.
invokeMethod
(
'getUserId'
);
}
///
/// track
/// 事件追踪
///
/// @param eventName String 事件名.
/// @param properties Map<String,dynamic> 事件属性.
///
/// 使用示例:
/// PhobosFlutter.track('eventname',{'key1':'value1','key2':'value2'});
///
static
void
track
(
String
eventName
,
Map
<
String
,
dynamic
>
properties
)
{
assert
(
eventName
!=
null
);
List
<
dynamic
>
params
=
[
eventName
,
properties
];
_channel
.
invokeMethod
(
'track'
,
params
);
}
static
void
trackSendNow
(
String
eventName
,
Map
<
String
,
dynamic
>
properties
)
{
assert
(
eventName
!=
null
);
List
<
dynamic
>
params
=
[
eventName
,
properties
];
_channel
.
invokeMethod
(
'track'
,
params
);
}
}
\ No newline at end of file
lib/commonModel/ui/ALCommon.dart
deleted
100644 → 0
View file @
23ce2864
//
// ALCommon
//
// gmalpha_flutter
// Created by lxrent on 2019/2/19.
// Copyright © 2019 Gengmei. All rights reserved.
//
import
'package:flutter/material.dart'
;
import
'ALColors.dart'
;
class
ALAlphaButton
extends
FlatButton
{
// factory ALAlphaButton
/// Create a simple text button.
const
ALAlphaButton
({
Key
key
,
@required
VoidCallback
onPressed
,
ValueChanged
<
bool
>
onHighlightChanged
,
ButtonTextTheme
textTheme
,
Color
textColor
,
Color
disabledTextColor
,
Color
color
,
Color
disabledColor
,
Color
highlightColor
,
Color
splashColor
,
double
minWidth
,
Brightness
colorBrightness
,
EdgeInsetsGeometry
padding
,
ShapeBorder
shape
,
Clip
clipBehavior
=
Clip
.
none
,
MaterialTapTargetSize
materialTapTargetSize
,
@required
Widget
child
,
})
:
super
(
key:
key
,
onPressed:
onPressed
,
onHighlightChanged:
onHighlightChanged
,
textTheme:
textTheme
,
textColor:
textColor
,
disabledTextColor:
disabledTextColor
,
color:
color
,
disabledColor:
disabledColor
,
highlightColor:
highlightColor
,
splashColor:
splashColor
,
colorBrightness:
colorBrightness
,
padding:
padding
,
shape:
shape
,
clipBehavior:
clipBehavior
,
materialTapTargetSize:
materialTapTargetSize
,
child:
child
,
);
@override
Widget
build
(
BuildContext
context
)
{
// TODO: implement build
return
FlatButton
(
textTheme:
textTheme
,
padding:
padding
,
child:
child
,
onPressed:
onPressed
,
textColor:
ALColors
.
Color323232
,
highlightColor:
ALColors
.
Color323232
,
color:
ALColors
.
ColorFFFFFF
,
shape:
OutlineInputBorder
(
borderRadius:
BorderRadius
.
all
(
Radius
.
circular
(
0
)),
borderSide:
BorderSide
(
color:
ALColors
.
Color323232
)),
);
}
}
lib/commonModel/ui/ALDevice.dart
deleted
100644 → 0
View file @
23ce2864
//
// ALDevice
//
// gm_alpha_flutter
// Created by lxrent on 2019/1/30.
// Copyright © 2019 Gengmei. All rights reserved.
//
import
'dart:ui'
;
class
ALDevice
{
ALDevice
.
_
();
static
bool
debug
=
!
const
bool
.
fromEnvironment
(
"dart.vm.product"
);
static
double
width
=
window
.
physicalSize
.
width
;
static
double
height
=
window
.
physicalSize
.
height
;
}
\ No newline at end of file
lib/main.dart
View file @
ea808210
...
...
@@ -6,12 +6,11 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import
'package:gmalpha_flutter/Annotations/RouterCenterRestore.mark.dart'
;
import
'package:gmalpha_flutter/Error_Page.dart'
;
import
'package:gmalpha_flutter/TestPage.dart'
;
import
'package:gmalpha_flutter/commonModel/app_module.dart'
;
import
'package:gmalpha_flutter/commonModel/base/Temp.dart'
;
import
'package:gmalpha_flutter/commonModel/cache/CacheManager.dart'
;
import
'package:gmalpha_flutter/commonModel/net/Api.dart'
;
import
'package:gmalpha_flutter/messageModel/home/message_home.dart'
;
import
'commonModel/GMBase.dart'
;
void
main
(
)
{
initParams
(()
=>
runApp
(
MyApp
()));
...
...
@@ -106,5 +105,3 @@ class _MyAppState extends State<MyApp> {
print
(
"PUSHED
$pageName
"
);
}
}
lib/messageModel/home/message_notification_item.dart
View file @
ea808210
import
'package:flutter/material.dart'
;
import
'package:gmalpha_flutter/commonModel/ui/ALColors.dart'
;
import
'package:gmalpha_flutter/messageModel/model/message/message.dart'
;
import
'package:gmalpha_flutter/res/value/ALColors.dart'
;
class
MessageNotificationItem
extends
StatelessWidget
{
final
NotificationItem
notification
;
...
...
lib/res/GMRes.dart
0 → 100644
View file @
ea808210
/*
* @author lsy
* @date 2019-10-15
**/
library
GMRes
;
export
'anim/Anim.dart'
;
export
'value/ALColors.dart'
;
export
'value/ALFont.dart'
;
lib/res/anim/Anim.dart
View file @
ea808210
...
...
@@ -11,7 +11,7 @@ class CustomRoute extends PageRouteBuilder{
CustomRoute
(
this
.
widget
)
:
super
(
// 设置过度时间
transitionDuration:
Duration
(
milliseconds:
5
00
),
transitionDuration:
Duration
(
milliseconds:
2
00
),
// 构造器
pageBuilder:
(
// 上下文和动画
...
...
lib/
commonModel/ui
/ALColors.dart
→
lib/
res/value
/ALColors.dart
View file @
ea808210
File moved
lib/
commonModel/ui
/ALFont.dart
→
lib/
res/value
/ALFont.dart
View file @
ea808210
File moved
lib/res/value/ALString.dart
0 → 100644
View file @
ea808210
/*
* @author lsy
* @date 2019-10-15
**/
const
ST_SELECT_COUNTRY
=
"选择国家"
;
lib/userModel/page/Other.dart
deleted
100644 → 0
View file @
23ce2864
/*
* @author lsy
* @date 2019-09-04
**/
\ No newline at end of file
lib/userModel/page/comment/CommentSuggestPage.dart
View file @
ea808210
...
...
@@ -11,10 +11,9 @@ import 'package:flutter_boost/flutter_boost.dart';
import
'package:flutter/material.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BasePage.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseState.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseUtil.dart'
;
import
'package:gmalpha_flutter/res/value/ALColors.dart'
;
import
'package:gmalpha_flutter/userModel/page/comment/CommentModel.dart'
;
import
'../../../commonModel/ui/ALColors.dart'
;
import
'../../../commonModel/ui/ALDevice.dart'
;
class
CommentSuggestPage
extends
StatefulWidget
{
var
_model
;
...
...
@@ -105,7 +104,7 @@ class _CommentSuggestPageState extends BasePage<CommentSuggestPage> {
left:
30
,
right:
30
,
bottom:
30
,
top:
180
),
// padding: EdgeInsets.all(0),
constraints:
BoxConstraints
(
minWidth:
ALDevice
.
w
idth
,
minHeight:
45
),
BoxConstraints
(
minWidth:
screenW
idth
,
minHeight:
45
),
child:
FlatButton
(
onPressed:
()
{
_model
.
confirmClick
(
...
...
lib/userModel/page/country/CountryModel.dart
0 → 100644
View file @
ea808210
/*
* @author lsy
* @date 2019-10-15
**/
import
'package:flutter/cupertino.dart'
;
import
'package:gmalpha_flutter/commonModel/GMBase.dart'
;
import
'package:gmalpha_flutter/commonModel/toast/toast.dart'
;
import
'package:gmalpha_flutter/userModel/service/UserRepository.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/CountryBean.dart'
;
class
CountryModel
extends
BaseModel
{
LiveData
<
CountryBean
>
liveData
=
new
LiveData
();
final
String
refer
;
String
selectCity
;
CountryModel
(
this
.
refer
);
getCountries
(
BuildContext
context
)
{
UserRepository
.
getInstance
().
getCountries
().
listen
((
value
)
{
liveData
.
notifyView
(
value
);
}).
onError
((
error
)
{
Toast
.
debugShow
(
context
,
error
);
print
(
error
);
});
}
@override
void
dispose
()
{
liveData
.
dispost
();
}
}
lib/userModel/page/country/CountryPage.dart
0 → 100644
View file @
ea808210
/*
* @author lsy
* @date 2019-10-15
**/
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_screenutil/flutter_screenutil.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BasePage.dart'
;
import
'package:gmalpha_flutter/res/GMRes.dart'
;
import
'package:gmalpha_flutter/userModel/page/country/CountryModel.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/CountryBean.dart'
;
class
CountryPage
extends
StatefulWidget
{
CountryModel
_model
;
CountryPage
(
String
refer
)
{
_model
=
new
CountryModel
(
refer
);
}
@override
State
<
StatefulWidget
>
createState
()
=>
CountryState
(
_model
);
}
class
CountryState
extends
BasePage
{
CountryModel
_model
;
CountryState
(
this
.
_model
);
ScrollController
_scrollController
=
new
ScrollController
();
@override
void
initState
()
{
super
.
initState
();
_model
.
getCountries
(
context
);
_scrollController
.
addListener
(()
{
print
(
"lsyy
${_scrollController.positions}
OFF
${_scrollController.offset}
"
);
});
}
@override
Widget
build
(
BuildContext
context
)
{
ScreenUtil
.
instance
=
ScreenUtil
(
width:
375
,
height:
667
)..
init
(
context
);
return
Scaffold
(
appBar:
baseAppBar
(
centerTitle:
true
,
title:
"选择国家"
,
backClick:
()
{
Navigator
.
pop
(
context
,
_model
.
selectCity
);
}),
body:
StreamBuilder
<
CountryBean
>(
stream:
_model
.
liveData
.
stream
,
initialData:
_model
.
liveData
.
data
,
builder:
(
con
,
data
)
{
if
(
data
.
data
==
null
)
{
return
loadingItem
();
}
else
{
return
ListView
.
builder
(
controller:
_scrollController
,
itemCount:
data
.
data
?.
data
?.
length
,
itemBuilder:
(
con
,
index
)
{
List
<
Widget
>
list
=
[];
list
.
add
(
headItem
(
data
.
data
.
data
[
index
].
title
));
for
(
int
i
=
0
;
i
<
data
.
data
.
data
[
index
].
countries
.
length
;
i
++)
{
Countries
countriy
=
data
.
data
.
data
[
index
].
countries
[
i
];
list
.
add
(
countryItem
(
countriy
));
}
return
Column
(
children:
list
,
);
});
}
},
),
);
}
headItem
(
String
head
)
{
return
Container
(
color:
Color
(
0x22000000
),
alignment:
Alignment
.
centerLeft
,
height:
ScreenUtil
.
instance
.
setHeight
(
25
),
padding:
EdgeInsets
.
only
(
left:
ScreenUtil
.
instance
.
setWidth
(
12
),
),
child:
baseText
(
head
,
15
,
0xFF323232
),
);
}
countryItem
(
Countries
country
)
{
return
GestureDetector
(
onTap:
()
{
Navigator
.
pop
(
context
,
country
.
name
);
},
child:
Container
(
alignment:
Alignment
.
centerLeft
,
height:
ScreenUtil
.
instance
.
setHeight
(
50
),
margin:
EdgeInsets
.
only
(
left:
ScreenUtil
.
instance
.
setWidth
(
12
),
),
child:
baseText
(
country
.
name
,
15
,
0xFF323232
),
));
}
@override
String
pageName
()
{
// TODO: implement pageName
return
null
;
}
@override
String
referrer
()
{
// TODO: implement referrer
return
null
;
}
}
lib/userModel/page/userSetting/UserSettingModel.dart
View file @
ea808210
...
...
@@ -8,11 +8,13 @@ import 'package:flutter/material.dart';
import
'package:gmalpha_flutter/Annotations/RouterCenterRestore.mark.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseUtil.dart'
;
import
'package:gmalpha_flutter/commonModel/live/BaseModel.dart'
;
import
'package:gmalpha_flutter/commonModel/net/Api.dart'
;
import
'package:gmalpha_flutter/commonModel/net/Responce/SimpleResponce.dart'
;
import
'package:gmalpha_flutter/commonModel/toast/toast.dart'
;
import
'package:gmalpha_flutter/userModel/service/UserRepository.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/UserEntity.user.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/UserResultBean.dart'
;
import
'package:gmalpha_flutter/userModel/util/JumpUtil.dart'
;
import
'../../../commonModel/live/LiveData.dart'
;
...
...
@@ -24,6 +26,7 @@ class UserSettingModel extends BaseModel {
final
String
userid
;
final
String
refere
;
String
selectImgPath
,
defultName
,
defultCity
;
UserSettingModel
(
this
.
userid
,
this
.
refere
);
...
...
@@ -36,6 +39,8 @@ class UserSettingModel extends BaseModel {
nameLive
.
notifyView
(
data
?.
data
?.
nickName
);
cityLive
.
notifyView
(
data
?.
data
?.
countryInfo
?.
name
);
headImgLive
.
notifyView
(
data
?.
data
?.
profilePic
);
defultName
=
data
?.
data
?.
nickName
;
defultCity
=
data
?.
data
?.
countryInfo
?.
name
;
}).
onError
((
error
)
{
print
(
error
);
Toast
.
show
(
context
,
error
);
...
...
@@ -43,6 +48,7 @@ class UserSettingModel extends BaseModel {
}
else
{
UserEntityImpl
().
getnickName
().
listen
((
data
)
{
print
(
"NICK
$data
"
);
defultName
=
data
;
nameLive
.
notifyView
(
data
);
}).
onError
((
error
)
{
print
(
error
);
...
...
@@ -50,6 +56,7 @@ class UserSettingModel extends BaseModel {
});
UserEntityImpl
().
getcountryInfoName
().
listen
((
data
)
{
print
(
"con
$data
"
);
defultCity
=
data
;
cityLive
.
notifyView
(
data
);
}).
onError
((
error
)
{
print
(
error
);
...
...
@@ -66,6 +73,16 @@ class UserSettingModel extends BaseModel {
});
}
void
detectUpdate
()
{
if
(
defultName
!=
nameLive
.
data
||
defultCity
!=
cityLive
.
data
||
selectImgPath
!=
null
)
{
saveLive
.
notifyView
(
true
);
}
else
{
saveLive
.
notifyView
(
false
);
}
}
@override
void
dispose
()
{
nameLive
.
dispost
();
...
...
@@ -73,4 +90,30 @@ class UserSettingModel extends BaseModel {
cityLive
.
dispost
();
saveLive
.
dispost
();
}
void
jumpToCAM
(
BuildContext
context
)
{
jumpToCamera
(
context
,
refere
,
Api
.
PROVIDER_NAME
,
true
,
1
,
null
)
.
then
((
value
)
{
if
(
value
!=
null
)
{
selectImgPath
=
value
[
0
];
headImgLive
.
notifyView
(
selectImgPath
);
detectUpdate
();
}
}).
catchError
((
error
)
{
Toast
.
debugShow
(
context
,
error
);
print
(
error
);
});
}
void
jumpToCTY
(
BuildContext
context
,
String
pageName
)
{
jumpToCountry
(
context
,
pageName
).
then
((
value
)
{
if
(
value
!=
null
)
{
cityLive
.
notifyView
(
value
);
detectUpdate
();
}
}).
catchError
((
error
)
{
Toast
.
debugShow
(
context
,
error
);
print
(
error
);
});
}
}
lib/userModel/page/userSetting/UserSettingPage.dart
View file @
ea808210
...
...
@@ -3,10 +3,13 @@
* @date 2019-09-04
**/
import
'dart:io'
;
import
'package:cached_network_image/cached_network_image.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_screenutil/flutter_screenutil.dart'
;
import
'package:flutter_svg/flutter_svg.dart'
;
import
'package:gmalpha_flutter/commonModel/GMBase.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseBuried.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BaseComponent.dart'
;
import
'package:gmalpha_flutter/commonModel/base/BasePage.dart'
;
...
...
@@ -90,14 +93,16 @@ class UserState extends BasePage<UserSettingPage> {
),
Container
(
width:
ScreenUtil
.
instance
.
setWidth
(
127
),
height:
ScreenUtil
.
instance
.
set
Height
(
127
),
height:
ScreenUtil
.
instance
.
set
Width
(
127
),
margin:
EdgeInsets
.
fromLTRB
(
ScreenUtil
.
instance
.
setWidth
(
26
),
ScreenUtil
.
instance
.
setWidth
(
23
),
0
,
ScreenUtil
.
instance
.
setWidth
(
23
)),
child:
GestureDetector
(
onTap:
()
{},
onTap:
()
{
_model
.
jumpToCAM
(
context
);
},
child:
Stack
(
alignment:
Alignment
.
bottomRight
,
children:
<
Widget
>[
...
...
@@ -106,12 +111,25 @@ class UserState extends BasePage<UserSettingPage> {
initialData:
_model
.
headImgLive
.
data
,
builder:
(
con
,
data
)
{
if
(
data
.
data
==
null
||
data
.
data
.
isEmpty
)
{
return
SvgPicture
.
asset
(
"images/replace_head.svg"
);
// return SvgPicture.asset("images/replace_head.svg");
return
Container
();
}
else
{
return
ClipOval
(
child:
CachedNetworkImage
(
return
Container
(
alignment:
Alignment
.
center
,
width:
ScreenUtil
.
instance
.
setWidth
(
127
),
height:
ScreenUtil
.
instance
.
setWidth
(
127
),
child:
ClipOval
(
child:
_model
.
selectImgPath
==
null
?
CachedNetworkImage
(
imageUrl:
data
.
data
,
));
)
:
SizedBox
(
height:
double
.
maxFinite
,
width:
double
.
maxFinite
,
child:
Image
.
file
(
File
(
data
.
data
),
fit:
BoxFit
.
cover
,
))));
}
},
),
...
...
@@ -137,8 +155,9 @@ class UserState extends BasePage<UserSettingPage> {
),
false
),
divideLine
(),
baseItem
(
()
{},
baseItem
(()
{
_model
.
jumpToCTY
(
context
,
pageName
());
},
"国家"
,
StreamBuilder
<
String
>(
stream:
_model
.
cityLive
.
stream
,
...
...
@@ -201,11 +220,12 @@ class UserState extends BasePage<UserSettingPage> {
right:
ScreenUtil
.
instance
.
setWidth
(
30
),
left:
ScreenUtil
.
instance
.
setWidth
(
30
)),
height:
60
,
width:
double
.
maxFinite
,
child:
Row
(
children:
<
Widget
>[
baseText
(
left
,
13
,
0xff323232
),
Expanded
(
child:
SizedBox
(
),
child:
Text
(
""
),
),
center
??
Container
(),
needRight
...
...
lib/userModel/service/UserRepository.dart
View file @
ea808210
...
...
@@ -6,6 +6,7 @@ import 'package:gmalpha_flutter/commonModel/net/Responce/SimpleResponce.dart';
import
'package:gmalpha_flutter/userModel/service/local/UserLocal.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/UserRemote.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/CommentBean.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/CountryBean.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/TestUserEntity.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/UserEntity.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/UserEntity.user.dart'
;
...
...
@@ -42,4 +43,8 @@ class UserRepository {
Observable
<
CommentBean
>
commentSuggest
(
String
content
,
String
phone
)
{
return
_remote
.
commentSuggest
(
content
,
phone
);
}
Observable
<
CountryBean
>
getCountries
()
{
return
_remote
.
getCountrise
();
}
}
lib/userModel/service/remote/UserRemote.dart
View file @
ea808210
...
...
@@ -10,6 +10,8 @@ import 'package:gmalpha_flutter/userModel/service/remote/entity/UserEntity.dart'
import
'package:gmalpha_flutter/userModel/service/remote/entity/UserResultBean.dart'
;
import
'package:rxdart/rxdart.dart'
;
import
'entity/CountryBean.dart'
;
class
UserRemote
{
static
UserRemote
_userRemote
;
...
...
@@ -29,4 +31,8 @@ class UserRemote {
Observable
<
CommentBean
>
commentSuggest
(
String
content
,
String
phone
)
{
return
UserApiImpl
().
comment
(
content
,
phone
);
}
Observable
<
CountryBean
>
getCountrise
()
{
return
UserApiImpl
().
getCountrys
();
}
}
lib/userModel/service/remote/api/UserApi.dart
View file @
ea808210
...
...
@@ -8,6 +8,7 @@ import 'package:gmalpha_flutter/Annotations/anno/Query.dart';
import
'package:gmalpha_flutter/Annotations/anno/ServiceCenter.dart'
;
import
'package:gmalpha_flutter/commonModel/net/Responce/SimpleResponce.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/CommentBean.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/CountryBean.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/TestUserEntity.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/UserEntity.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/UserResultBean.dart'
;
...
...
@@ -19,4 +20,7 @@ abstract class UserApi {
@Post
(
"api/v1/suggestion"
)
CommentBean
comment
(
@Query
(
"content"
)
String
content
,
@Query
(
"phone"
)
String
phone
);
@Get
(
"api/v1/countries"
)
CountryBean
getCountrys
();
}
lib/userModel/service/remote/api/UserApi.serv.dart
View file @
ea808210
...
...
@@ -12,6 +12,7 @@ import 'package:rxdart/rxdart.dart';
import
'package:gmalpha_flutter/userModel/service/remote/entity/UserResultBean.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/CommentBean.dart'
;
import
'package:gmalpha_flutter/userModel/service/remote/entity/CountryBean.dart'
;
import
'package:gmalpha_flutter/commonModel/net/DioUtil.dart'
;
...
...
@@ -48,4 +49,14 @@ class UserApiImpl {
}
});
}
Observable
<
CountryBean
>
getCountrys
()
{
return
Observable
.
fromFuture
(
DioUtil
().
get
(
'api/v1/countries'
))
.
map
((
value
)
{
if
(
value
!=
null
&&
value
.
statusCode
==
200
)
{
Map
map
=
json
.
decode
(
value
.
toString
());
return
CountryBean
.
fromJson
(
map
);
}
});
}
}
lib/userModel/service/remote/entity/CountryBean.dart
0 → 100644
View file @
ea808210
/*
* @author lsy
* @date 2019-10-15
**/
class
CountryBean
{
int
error
;
String
message
;
Null
extra
;
List
<
Data
>
data
;
UserType
userType
;
CountryBean
({
this
.
error
,
this
.
message
,
this
.
extra
,
this
.
data
,
this
.
userType
});
CountryBean
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
error
=
json
[
'error'
];
message
=
json
[
'message'
];
extra
=
json
[
'extra'
];
if
(
json
[
'data'
]
!=
null
)
{
data
=
new
List
<
Data
>();
json
[
'data'
].
forEach
((
v
)
{
data
.
add
(
new
Data
.
fromJson
(
v
));
});
}
userType
=
json
[
'user_type'
]
!=
null
?
new
UserType
.
fromJson
(
json
[
'user_type'
])
:
null
;
}
Map
<
String
,
dynamic
>
toJson
()
{
final
Map
<
String
,
dynamic
>
data
=
new
Map
<
String
,
dynamic
>();
data
[
'error'
]
=
this
.
error
;
data
[
'message'
]
=
this
.
message
;
data
[
'extra'
]
=
this
.
extra
;
if
(
this
.
data
!=
null
)
{
data
[
'data'
]
=
this
.
data
.
map
((
v
)
=>
v
.
toJson
()).
toList
();
}
if
(
this
.
userType
!=
null
)
{
data
[
'user_type'
]
=
this
.
userType
.
toJson
();
}
return
data
;
}
}
class
Data
{
String
title
;
List
<
Countries
>
countries
;
Data
({
this
.
title
,
this
.
countries
});
Data
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
title
=
json
[
'title'
];
if
(
json
[
'countries'
]
!=
null
)
{
countries
=
new
List
<
Countries
>();
json
[
'countries'
].
forEach
((
v
)
{
countries
.
add
(
new
Countries
.
fromJson
(
v
));
});
}
}
Map
<
String
,
dynamic
>
toJson
()
{
final
Map
<
String
,
dynamic
>
data
=
new
Map
<
String
,
dynamic
>();
data
[
'title'
]
=
this
.
title
;
if
(
this
.
countries
!=
null
)
{
data
[
'countries'
]
=
this
.
countries
.
map
((
v
)
=>
v
.
toJson
()).
toList
();
}
return
data
;
}
}
class
Countries
{
String
id
;
String
name
;
String
language
;
Countries
({
this
.
id
,
this
.
name
,
this
.
language
});
Countries
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
id
=
json
[
'id'
];
name
=
json
[
'name'
];
language
=
json
[
'language'
];
}
Map
<
String
,
dynamic
>
toJson
()
{
final
Map
<
String
,
dynamic
>
data
=
new
Map
<
String
,
dynamic
>();
data
[
'id'
]
=
this
.
id
;
data
[
'name'
]
=
this
.
name
;
data
[
'language'
]
=
this
.
language
;
return
data
;
}
}
class
UserType
{
UserType
();
UserType
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{}
Map
<
String
,
dynamic
>
toJson
()
{
final
Map
<
String
,
dynamic
>
data
=
new
Map
<
String
,
dynamic
>();
return
data
;
}
}
lib/userModel/util/JumpUtil.dart
View file @
ea808210
...
...
@@ -5,9 +5,23 @@
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/material.dart'
;
import
'package:gmalpha_flutter/Annotations/RouterCenterRestore.mark.dart'
;
import
'package:gmalpha_flutter/res/anim/Anim.dart'
;
import
'package:gmalpha_flutter/userModel/page/comment/CommentSuggestPage.dart'
;
import
'package:gmalpha_flutter/userModel/page/country/CountryPage.dart'
;
void
jumpToComment
(
BuildContext
context
,
String
refer
)
{
Navigator
.
push
(
context
,
new
CustomRoute
(
CommentSuggestPage
(
refer
)));
}
Future
jumpToCamera
(
BuildContext
context
,
String
refer
,
String
provider
,
bool
showCamera
,
int
bigSelectImage
,
List
<
String
>
selectedImages
)
{
return
Navigator
.
push
(
context
,
CustomRoute
(
RouterCenterImpl
().
findAlbumRouter
()?.
getAlbumPage
(
provider
,
showCamera
,
bigSelectImage
,
selectedImages
)));
}
Future
jumpToCountry
(
BuildContext
context
,
String
refer
)
{
return
Navigator
.
push
(
context
,
CustomRoute
(
CountryPage
(
refer
)));
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment