Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
cloud-platform
Project
Project
Details
Activity
Releases
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
youjj
cloud-platform
Commits
5a4c61d6
Commit
5a4c61d6
authored
Jul 08, 2019
by
jiaorz
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'base-modify' of
http://113.105.137.151:22280/youjj/cloud-platform
into base-modify
parents
5885e121
e69383ca
Changes
25
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
2431 additions
and
60 deletions
+2431
-60
pom.xml
ace-common/pom.xml
+45
-0
UUIDUtils.java
...va/com/github/wxiaoqi/security/common/util/UUIDUtils.java
+19
-0
Excel2003Reader.java
...b/wxiaoqi/security/common/util/excel/Excel2003Reader.java
+275
-0
Excel2007Reader.java
...b/wxiaoqi/security/common/util/excel/Excel2007Reader.java
+667
-0
Excel2Html.java
...github/wxiaoqi/security/common/util/excel/Excel2Html.java
+426
-0
ExcelExport.java
...ithub/wxiaoqi/security/common/util/excel/ExcelExport.java
+610
-0
ExcelImport.java
...ithub/wxiaoqi/security/common/util/excel/ExcelImport.java
+152
-0
XssfDataType.java
...thub/wxiaoqi/security/common/util/excel/XssfDataType.java
+12
-0
systemconfig.properties
...mon/src/main/resources/properties/systemconfig.properties
+9
-9
AppUserDetail.java
...m/github/wxiaoqi/security/admin/entity/AppUserDetail.java
+20
-0
BaseUserRelation.java
...ithub/wxiaoqi/security/admin/entity/BaseUserRelation.java
+50
-0
AppUserDTO.java
...m/github/wxiaoqi/security/admin/feign/dto/AppUserDTO.java
+35
-0
AppUserManageVo.java
...com/github/wxiaoqi/security/admin/vo/AppUserManageVo.java
+7
-6
AppUserVo.java
.../java/com/github/wxiaoqi/security/admin/vo/AppUserVo.java
+35
-0
AppUserController.java
...github/wxiaoqi/security/admin/rest/AppUserController.java
+0
-4
AppPermissionService.java
...aoqi/security/admin/rpc/service/AppPermissionService.java
+5
-0
AppUserDetailMapper.xml
...e-admin/src/main/resources/mapper/AppUserDetailMapper.xml
+36
-26
AppVersionController.java
...java/com/xxfc/platform/app/rest/AppVersionController.java
+2
-2
BaseOrderBiz.java
...c/main/java/com/xxfc/platform/order/biz/BaseOrderBiz.java
+1
-1
OrderRentVehicleService.java
.../xxfc/platform/order/service/OrderRentVehicleService.java
+1
-1
TourUserController.java
.../java/com/xxfc/platform/tour/rest/TourUserController.java
+8
-3
WXPrepay.java
...java/com/xxfc/platform/universal/weixin/api/WXPrepay.java
+1
-1
VehicleModelBiz.java
...n/java/com/xxfc/platform/vehicle/biz/VehicleModelBiz.java
+5
-1
VehicleController.java
...ava/com/xxfc/platform/vehicle/rest/VehicleController.java
+2
-3
VehicleModelController.java
...om/xxfc/platform/vehicle/rest/VehicleModelController.java
+8
-3
No files found.
ace-common/pom.xml
View file @
5a4c61d6
...
...
@@ -24,6 +24,7 @@
</build>
<properties>
<mapper.version>
3.4.0
</mapper.version>
<poi.version>
3.15
</poi.version>
</properties>
<dependencies>
...
...
@@ -125,6 +126,50 @@
<scope>
compile
</scope>
</dependency>
<!-- excel 组件 -->
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi
</artifactId>
<version>
${poi.version}
</version>
</dependency>
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi-ooxml
</artifactId>
<version>
${poi.version}
</version>
</dependency>
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi-ooxml-schemas
</artifactId>
<version>
${poi.version}
</version>
<exclusions>
<exclusion>
<artifactId>
stax-api
</artifactId>
<groupId>
stax
</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi-ooxml
</artifactId>
<version>
${poi.version}
</version>
</dependency>
<dependency>
<groupId>
org.apache.xmlbeans
</groupId>
<artifactId>
xmlbeans
</artifactId>
<version>
2.6.0
</version>
<exclusions>
<exclusion>
<artifactId>
stax-api
</artifactId>
<groupId>
stax
</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
<optional>
true
</optional>
</dependency>
</dependencies>
...
...
ace-common/src/main/java/com/github/wxiaoqi/security/common/util/UUIDUtils.java
View file @
5a4c61d6
...
...
@@ -14,6 +14,13 @@ public class UUIDUtils {
"W"
,
"X"
,
"Y"
,
"Z"
};
public
static
String
[]
chars1
=
new
String
[]
{
"a"
,
"b"
,
"c"
,
"d"
,
"e"
,
"f"
,
"g"
,
"h"
,
"i"
,
"j"
,
"k"
,
"l"
,
"m"
,
"n"
,
"p"
,
"q"
,
"r"
,
"s"
,
"t"
,
"u"
,
"v"
,
"w"
,
"x"
,
"y"
,
"z"
,
"1"
,
"2"
,
"3"
,
"4"
,
"5"
,
"6"
,
"7"
,
"8"
,
"9"
,
"A"
,
"B"
,
"C"
,
"D"
,
"E"
,
"F"
,
"G"
,
"H"
,
"I"
,
"J"
,
"K"
,
"L"
,
"M"
,
"N"
,
"P"
,
"Q"
,
"R"
,
"S"
,
"T"
,
"U"
,
"V"
,
"W"
,
"X"
,
"Y"
,
"Z"
};
public
static
String
generateShortUuid
()
{
StringBuffer
shortBuffer
=
new
StringBuffer
();
String
uuid
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
...
...
@@ -25,4 +32,16 @@ public class UUIDUtils {
return
shortBuffer
.
toString
();
}
public
static
String
genCodes
(
int
length
)
{
StringBuffer
shortBuffer
=
new
StringBuffer
();
String
uuid
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
String
str
=
uuid
.
substring
(
i
*
4
,
i
*
4
+
4
);
int
x
=
Integer
.
parseInt
(
str
,
16
);
shortBuffer
.
append
(
chars1
[
x
%
0x3E
]);
}
return
shortBuffer
.
toString
();
}
}
ace-common/src/main/java/com/github/wxiaoqi/security/common/util/excel/Excel2003Reader.java
0 → 100644
View file @
5a4c61d6
package
com
.
github
.
wxiaoqi
.
security
.
common
.
util
.
excel
;
import
org.apache.poi.hssf.eventusermodel.*
;
import
org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener
;
import
org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord
;
import
org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord
;
import
org.apache.poi.hssf.model.HSSFFormulaParser
;
import
org.apache.poi.hssf.record.*
;
import
org.apache.poi.hssf.usermodel.HSSFWorkbook
;
import
org.apache.poi.poifs.filesystem.POIFSFileSystem
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* Excel2003格式解析
*
* @author lipengjun
* @email 939961241@qq.com
* @date 2017年10月28日 13:11:27
*/
public
class
Excel2003Reader
implements
HSSFListener
{
private
int
minColumns
=
-
1
;
private
POIFSFileSystem
fs
;
/**
* 最后一行行号
*/
private
int
lastRowNumber
;
/**
* 最后一列列号
*/
private
int
lastColumnNumber
;
/**
* Should we output the formula, or the value it has?
*/
private
boolean
outputFormulaValues
=
true
;
/**
* For parsing Formulas
*/
private
SheetRecordCollectingListener
workbookBuildingListener
;
// 工作薄
private
HSSFWorkbook
stubWorkbook
;
// Records we pick up as we process
private
SSTRecord
sstRecord
;
private
FormatTrackingHSSFListener
formatListener
;
// 表索引
private
int
sheetIndex
=
-
1
;
private
BoundSheetRecord
[]
orderedBSRs
;
@SuppressWarnings
(
"rawtypes"
)
private
ArrayList
boundSheetRecords
=
new
ArrayList
();
// For handling formulas with string results
private
int
nextRow
;
private
int
nextColumn
;
private
boolean
outputNextStringRecord
;
// 存储行记录的容器
private
List
<
String
>
rowlist
=
new
ArrayList
<
String
>();
;
// 单Sheet数据
private
List
<
String
[]>
sheetData
=
new
ArrayList
<
String
[]>();
// 多Sheet数据
private
Map
<
Integer
,
List
<
String
[]>>
workData
=
new
HashMap
<
Integer
,
List
<
String
[]>>();
/**
* 遍历excel下所有的sheet
*
* @param fileStream 处理文件流
* @throws IOException 抛出IO异常
*/
public
void
process
(
InputStream
fileStream
)
throws
IOException
{
this
.
fs
=
new
POIFSFileSystem
(
fileStream
);
MissingRecordAwareHSSFListener
listener
=
new
MissingRecordAwareHSSFListener
(
this
);
formatListener
=
new
FormatTrackingHSSFListener
(
listener
);
HSSFEventFactory
factory
=
new
HSSFEventFactory
();
HSSFRequest
request
=
new
HSSFRequest
();
if
(
outputFormulaValues
)
{
request
.
addListenerForAllRecords
(
formatListener
);
}
else
{
workbookBuildingListener
=
new
SheetRecordCollectingListener
(
formatListener
);
request
.
addListenerForAllRecords
(
workbookBuildingListener
);
}
factory
.
processWorkbookEvents
(
request
,
fs
);
}
/**
* HSSFListener 监听方法,处理 Record
*
* @param record 行记录
*/
@SuppressWarnings
(
"unchecked"
)
@Override
public
void
processRecord
(
Record
record
)
{
int
thisRow
=
-
1
;
int
thisColumn
=
-
1
;
String
thisStr
=
null
;
String
value
=
null
;
switch
(
record
.
getSid
())
{
case
BoundSheetRecord
.
sid
:
boundSheetRecords
.
add
(
record
);
break
;
case
BOFRecord
.
sid
:
BOFRecord
br
=
(
BOFRecord
)
record
;
if
(
br
.
getType
()
==
BOFRecord
.
TYPE_WORKSHEET
)
{
// 如果有需要,则建立子工作薄
if
(
workbookBuildingListener
!=
null
&&
stubWorkbook
==
null
)
{
stubWorkbook
=
workbookBuildingListener
.
getStubHSSFWorkbook
();
}
if
(
sheetIndex
>=
0
)
{
List
<
String
[]>
data
=
new
ArrayList
<
String
[]>();
data
.
addAll
(
sheetData
);
workData
.
put
(
sheetIndex
,
data
);
sheetData
.
clear
();
}
sheetIndex
++;
if
(
orderedBSRs
==
null
)
{
orderedBSRs
=
BoundSheetRecord
.
orderByBofPosition
(
boundSheetRecords
);
}
}
break
;
case
SSTRecord
.
sid
:
sstRecord
=
(
SSTRecord
)
record
;
break
;
case
BlankRecord
.
sid
:
BlankRecord
brec
=
(
BlankRecord
)
record
;
thisRow
=
brec
.
getRow
();
thisColumn
=
brec
.
getColumn
();
thisStr
=
""
;
rowlist
.
add
(
thisColumn
,
thisStr
);
break
;
case
BoolErrRecord
.
sid
:
// 单元格为布尔类型
BoolErrRecord
berec
=
(
BoolErrRecord
)
record
;
thisRow
=
berec
.
getRow
();
thisColumn
=
berec
.
getColumn
();
thisStr
=
berec
.
getBooleanValue
()
+
""
;
rowlist
.
add
(
thisColumn
,
thisStr
);
break
;
case
FormulaRecord
.
sid
:
// 单元格为公式类型
FormulaRecord
frec
=
(
FormulaRecord
)
record
;
thisRow
=
frec
.
getRow
();
thisColumn
=
frec
.
getColumn
();
if
(
outputFormulaValues
)
{
if
(
Double
.
isNaN
(
frec
.
getValue
()))
{
// Formula result is a string
// This is stored in the next record
outputNextStringRecord
=
true
;
nextRow
=
frec
.
getRow
();
nextColumn
=
frec
.
getColumn
();
}
else
{
thisStr
=
formatListener
.
formatNumberDateCell
(
frec
);
}
}
else
{
thisStr
=
'"'
+
HSSFFormulaParser
.
toFormulaString
(
stubWorkbook
,
frec
.
getParsedExpression
())
+
'"'
;
}
rowlist
.
add
(
thisColumn
,
thisStr
);
break
;
case
StringRecord
.
sid
:
// 单元格中公式的字符串
if
(
outputNextStringRecord
)
{
// String for formula
StringRecord
srec
=
(
StringRecord
)
record
;
thisStr
=
srec
.
getString
();
thisRow
=
nextRow
;
thisColumn
=
nextColumn
;
outputNextStringRecord
=
false
;
}
break
;
case
LabelRecord
.
sid
:
LabelRecord
lrec
=
(
LabelRecord
)
record
;
thisColumn
=
lrec
.
getColumn
();
value
=
lrec
.
getValue
().
trim
();
value
=
value
.
equals
(
""
)
?
" "
:
value
;
this
.
rowlist
.
add
(
thisColumn
,
value
);
break
;
case
LabelSSTRecord
.
sid
:
// 单元格为字符串类型
LabelSSTRecord
lsrec
=
(
LabelSSTRecord
)
record
;
thisColumn
=
lsrec
.
getColumn
();
if
(
sstRecord
==
null
)
{
rowlist
.
add
(
thisColumn
,
" "
);
}
else
{
value
=
sstRecord
.
getString
(
lsrec
.
getSSTIndex
()).
toString
().
trim
();
value
=
value
.
equals
(
""
)
?
" "
:
value
;
rowlist
.
add
(
thisColumn
,
value
);
}
break
;
case
NumberRecord
.
sid
:
// 单元格为数字类型
NumberRecord
numrec
=
(
NumberRecord
)
record
;
thisColumn
=
numrec
.
getColumn
();
value
=
formatListener
.
formatNumberDateCell
(
numrec
).
trim
();
value
=
value
.
equals
(
""
)
?
" "
:
value
;
// 向容器加入列值
rowlist
.
add
(
thisColumn
,
value
);
break
;
default
:
break
;
}
// 遇到新行的操作
if
(
thisRow
!=
-
1
&&
thisRow
!=
lastRowNumber
)
{
lastColumnNumber
=
-
1
;
}
// 空值的操作
if
(
record
instanceof
MissingCellDummyRecord
)
{
MissingCellDummyRecord
mc
=
(
MissingCellDummyRecord
)
record
;
thisColumn
=
mc
.
getColumn
();
rowlist
.
add
(
thisColumn
,
""
);
}
// 更新行和列的值
if
(
thisRow
>
-
1
)
{
lastRowNumber
=
thisRow
;
}
if
(
thisColumn
>
-
1
)
{
lastColumnNumber
=
thisColumn
;
}
// 行结束时的操作
if
(
record
instanceof
LastCellOfRowDummyRecord
)
{
if
(
minColumns
>
0
)
{
// 列值重新置空
if
(
lastColumnNumber
==
-
1
)
{
lastColumnNumber
=
0
;
}
}
lastColumnNumber
=
-
1
;
// 每行结束时, 数据写入集合
sheetData
.
add
(
rowlist
.
toArray
(
new
String
[]{}));
// 清空容器
rowlist
.
clear
();
}
}
/**
* 获取数据(单Sheet)
*
* @param sheetIndex sheet下标
* @return List<String[]> 数据
*/
public
List
<
String
[]>
getSheetData
(
Integer
sheetIndex
)
{
return
workData
.
get
(
sheetIndex
);
}
/**
* 获取数据(多Sheet)
*
* @return Map<Integer, List<String[]>> 多sheet的数据
*/
public
Map
<
Integer
,
List
<
String
[]>>
getSheetData
()
{
return
workData
;
}
}
\ No newline at end of file
ace-common/src/main/java/com/github/wxiaoqi/security/common/util/excel/Excel2007Reader.java
0 → 100644
View file @
5a4c61d6
This diff is collapsed.
Click to expand it.
ace-common/src/main/java/com/github/wxiaoqi/security/common/util/excel/Excel2Html.java
0 → 100644
View file @
5a4c61d6
This diff is collapsed.
Click to expand it.
ace-common/src/main/java/com/github/wxiaoqi/security/common/util/excel/ExcelExport.java
0 → 100644
View file @
5a4c61d6
This diff is collapsed.
Click to expand it.
ace-common/src/main/java/com/github/wxiaoqi/security/common/util/excel/ExcelImport.java
0 → 100644
View file @
5a4c61d6
package
com
.
github
.
wxiaoqi
.
security
.
common
.
util
.
excel
;
import
org.springframework.web.multipart.MultipartFile
;
import
java.io.IOException
;
import
java.util.List
;
import
java.util.Map
;
/**
* Excel文件导入的基本功能类
* 可导入EXCEL2003 和 EXCEL2007格式。
*
* @author lipengjun
* @email 939961241@qq.com
* @date 2017年10月28日 13:11:27
*/
public
class
ExcelImport
{
/**
* excel2003扩展名
*/
public
static
final
String
EXCEL03_EXTENSION
=
".xls"
;
/**
* excel2007扩展名
*/
public
static
final
String
EXCEL07_EXTENSION
=
".xlsx"
;
private
ExcelImport
()
{
}
/**
* 解析EXCEL数据为 List<String[]>
*
* @param excelFile 要解析的上传EXCEL文件
* @return List<String[]) 行(列)
*/
public
static
List
<
String
[]>
getExcelData07
(
MultipartFile
excelFile
)
{
List
<
String
[]>
resultList
=
null
;
if
(
null
==
excelFile
||
excelFile
.
isEmpty
())
{
throw
new
RuntimeException
(
"文件内容为空!"
);
}
Excel2007Reader
excel07
=
new
Excel2007Reader
();
try
{
excel07
.
process
(
excelFile
.
getInputStream
(),
false
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"excel解析失败!"
);
}
resultList
=
excel07
.
getSheetData
(
0
);
return
resultList
;
}
/**
* 解析EXCEL数据为 List<String[]>
*
* @param excelFile 要解析的上传EXCEL文件
* @return List<String[]) 行(列)
*/
public
static
List
<
String
[]>
getExcelData03
(
MultipartFile
excelFile
)
{
List
<
String
[]>
resultList
=
null
;
if
(
null
==
excelFile
||
excelFile
.
isEmpty
())
{
throw
new
RuntimeException
(
"文件内容为空!"
);
}
Excel2003Reader
excel03
=
new
Excel2003Reader
();
// 实例化excel处理对象
try
{
excel03
.
process
(
excelFile
.
getInputStream
());
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
"excel解析失败!"
);
}
resultList
=
excel03
.
getSheetData
(
0
);
return
resultList
;
}
/**
* 通过解析MultipartFile对象获取excel内容,并且将其拼装为List<String[]>对象返回
*
* @param excelFile
* @return
* @throws Exception
*/
public
static
List
<
String
[]>
getExcelData
(
MultipartFile
excelFile
)
throws
RuntimeException
{
List
<
String
[]>
resultList
=
null
;
if
(!
excelFile
.
isEmpty
())
{
// 上传的文件不能为空
String
excelFileName
=
excelFile
.
getOriginalFilename
();
// 文件名(带后缀)
if
(
excelFileName
.
toLowerCase
().
endsWith
(
EXCEL03_EXTENSION
))
{
// 如果文件是以.xls为后缀
Excel2003Reader
excel03
=
new
Excel2003Reader
();
// 实例化excel处理对象
try
{
excel03
.
process
(
excelFile
.
getInputStream
());
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
"excel解析失败!"
);
}
resultList
=
excel03
.
getSheetData
(
0
);
}
else
if
(
excelFileName
.
toLowerCase
().
endsWith
(
EXCEL07_EXTENSION
))
{
// 如果文件是以.xlsx为后缀
Excel2007Reader
excel07
=
new
Excel2007Reader
();
try
{
excel07
.
process
(
excelFile
.
getInputStream
(),
false
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"excel解析失败!"
);
}
resultList
=
excel07
.
getSheetData
(
0
);
}
}
return
resultList
;
}
/**
* 通过解析MultipartFile对象获取excel内容,并且将其拼装为Map<Integer, List<String[]>>对象返回
*
* @param excelFile
* @return
* @throws Exception
*/
public
static
Map
<
Integer
,
List
<
String
[]>>
getExcelDataAll
(
MultipartFile
excelFile
)
throws
RuntimeException
{
Map
<
Integer
,
List
<
String
[]>>
result
=
null
;
if
(!
excelFile
.
isEmpty
())
{
// 上传的文件不能为空
String
excelFileName
=
excelFile
.
getOriginalFilename
();
// 文件名(带后缀)
if
(
excelFileName
.
toLowerCase
().
endsWith
(
EXCEL03_EXTENSION
))
{
// 如果文件是以.xls为后缀
Excel2003Reader
excel03
=
new
Excel2003Reader
();
// 实例化excel处理对象
try
{
excel03
.
process
(
excelFile
.
getInputStream
());
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
"excel解析失败!"
);
}
result
=
excel03
.
getSheetData
();
}
else
if
(
excelFileName
.
toLowerCase
().
endsWith
(
EXCEL07_EXTENSION
))
{
// 如果文件是以.xlsx为后缀
Excel2007Reader
excel07
=
new
Excel2007Reader
();
try
{
excel07
.
process
(
excelFile
.
getInputStream
(),
true
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"excel解析失败!"
);
}
result
=
excel07
.
getSheetData
();
}
}
return
result
;
}
}
ace-common/src/main/java/com/github/wxiaoqi/security/common/util/excel/XssfDataType.java
0 → 100644
View file @
5a4c61d6
package
com
.
github
.
wxiaoqi
.
security
.
common
.
util
.
excel
;
/**
* XSSFDataType
*
* @author lipengjun
* @email 939961241@qq.com
* @date 2017年10月28日 13:11:27
*/
public
enum
XssfDataType
{
BOOL
,
ERROR
,
FORMULA
,
INLINESTR
,
SSTINDEX
,
NUMBER
,
DATE
,
DATETIME
,
TIME
,
}
ace-common/src/main/resources/properties/systemconfig.properties
View file @
5a4c61d6
...
...
@@ -13,24 +13,24 @@ USER_HEADER_URL_DEFAULT=https://xxtest.upyuns.com/image/app/default_%20avatar.pn
#默认昵称
USER_NIKENAME_DEFAULT
=
XX_
#短信机
ACCESSKEYID
=
LTAI
lXrgxOBAj2Ny
ACCESSKEYSECRET
=
zo8OkOCF4iygqOjYYoxRKfVRxDvgTI
TEMPLATECODE
=
SMS_1
66480010
SIGNNAME
=
升云
ACCESSKEYID
=
LTAI
nxMDwHQL8yg9
ACCESSKEYSECRET
=
OCKDEiwKGjePCZgPeWMEUFGwGbKYLA
TEMPLATECODE
=
SMS_1
70070101
SIGNNAME
=
滴房车
#微信支付配置
WINXIN_AppID
=
wxcc2c9b7c87439a6d
WINXIN_AppSecret
=
279796e8c2963c8a5ddc8270ef642b29
WINXIN_PARTNER_KEY
=
CNITR89201000CNITR89201000FUWUSH
WINXIN_PARTNER
=
15
1213624
1
WINXIN_PARTNER_KEY
=
xxfcXXDfangche74upyuns3AD4334533
WINXIN_PARTNER
=
15
3968920
1
#ios
APP_ID_IOS
=
wx3f51779d49171d63
APP_PARTNER_IOS
=
1492557632
APP_PARTNER_KEY_IOS
=
89201002892010008920100quanzinet
APP_TRADE_TYPE_IOS
=
APP
#andoir
APP_ID
=
wx9
c9d978e5698d00f
APP_PARTNER
=
15
1458308
1
APP_PARTNER_KEY
=
qwelkjuoivc1398767lkj834123kljic
APP_ID
=
wx9
ed5e51251cf7c61
APP_PARTNER
=
15
3968920
1
APP_PARTNER_KEY
=
xxfcXXDfangche74upyuns3AD4334533
APP_TRADE_TYPE
=
APP
#支付回调
weixinHost
=
xxtest.upyuns.com
...
...
ace-modules/ace-admin-api/src/main/java/com/github/wxiaoqi/security/admin/entity/AppUserDetail.java
View file @
5a4c61d6
package
com
.
github
.
wxiaoqi
.
security
.
admin
.
entity
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
javax.persistence.Column
;
...
...
@@ -31,6 +32,7 @@ public class AppUserDetail {
private
Long
createtime
;
private
Long
updatetime
;
private
Integer
isdel
;
//渠道来源;1-app;2-小程序
private
Integer
channel
;
/**
* 省份编号
...
...
@@ -54,4 +56,22 @@ public class AppUserDetail {
*/
@Column
(
name
=
"upd_host"
)
private
String
updHost
;
@ApiModelProperty
(
value
=
"用户职位"
)
@Column
(
name
=
"position_id"
)
private
Integer
positionId
;
@ApiModelProperty
(
value
=
"用户来源:0-自来,1-用户邀请"
)
@Column
(
name
=
"source"
)
private
Integer
source
;
@ApiModelProperty
(
value
=
"邀请码"
)
@Column
(
name
=
"code"
)
private
String
code
;
@ApiModelProperty
(
value
=
"邀请人id:"
)
@Column
(
name
=
"inviter_account"
)
private
String
inviterAccount
;
}
ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/entity/BaseUserRelation.java
→
ace-modules/ace-admin
-api
/src/main/java/com/github/wxiaoqi/security/admin/entity/BaseUserRelation.java
View file @
5a4c61d6
package
com
.
github
.
wxiaoqi
.
security
.
admin
.
entity
;
import
lombok.Data
;
import
javax.persistence.Column
;
import
javax.persistence.Id
;
import
javax.persistence.Table
;
import
java.io.Serializable
;
import
javax.persistence.*
;
/**
...
...
@@ -11,6 +14,7 @@ import javax.persistence.*;
* @email 463540703@qq.com
* @date 2019-06-04 14:29:29
*/
@Data
@Table
(
name
=
"base_user_relation"
)
public
class
BaseUserRelation
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
...
...
@@ -42,90 +46,5 @@ public class BaseUserRelation implements Serializable {
//是否删除;0-正常;1-删除
@Column
(
name
=
"is_del"
)
private
Integer
isDel
;
/**
* 设置:主键id
*/
public
void
setId
(
Integer
id
)
{
this
.
id
=
id
;
}
/**
* 获取:主键id
*/
public
Integer
getId
()
{
return
id
;
}
/**
* 设置:用户id
*/
public
void
setUserId
(
Integer
userId
)
{
this
.
userId
=
userId
;
}
/**
* 获取:用户id
*/
public
Integer
getUserId
()
{
return
userId
;
}
/**
* 设置:小程序用户id
*/
public
void
setToUid
(
Integer
toUid
)
{
this
.
toUid
=
toUid
;
}
/**
* 获取:小程序用户id
*/
public
Integer
getToUid
()
{
return
toUid
;
}
/**
* 设置:是否有效;0-有效;1-无效
*/
public
void
setStaus
(
Integer
staus
)
{
this
.
staus
=
staus
;
}
/**
* 获取:是否有效;0-有效;1-无效
*/
public
Integer
getStaus
()
{
return
staus
;
}
/**
* 设置:创建时间
*/
public
void
setCrtTime
(
Long
crtTime
)
{
this
.
crtTime
=
crtTime
;
}
/**
* 获取:创建时间
*/
public
Long
getCrtTime
()
{
return
crtTime
;
}
/**
* 设置:更新时间
*/
public
void
setUpdTime
(
Long
updTime
)
{
this
.
updTime
=
updTime
;
}
/**
* 获取:更新时间
*/
public
Long
getUpdTime
()
{
return
updTime
;
}
/**
* 设置:是否删除;0-正常;1-删除
*/
public
void
setIsDel
(
Integer
isDel
)
{
this
.
isDel
=
isDel
;
}
/**
* 获取:是否删除;0-正常;1-删除
*/
public
Integer
getIsDel
()
{
return
isDel
;
}
}
ace-modules/ace-admin-api/src/main/java/com/github/wxiaoqi/security/admin/feign/dto/AppUserDTO.java
View file @
5a4c61d6
package
com
.
github
.
wxiaoqi
.
security
.
admin
.
feign
.
dto
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
...
...
@@ -20,6 +21,40 @@ public class AppUserDTO {
private
String
birthday
;
private
String
personSign
;
private
String
remark
;
//渠道来源;1-app;2-小程序
private
Integer
channel
;
/**
* 省份编号
*/
private
Integer
provinceCode
;
/**
* 市编号
*/
private
Integer
cityCode
;
/**
* 创建ip
*/
private
String
crtHost
;
/**
* 更新ip
*/
private
String
updHost
;
@ApiModelProperty
(
value
=
"用户职位"
)
private
Integer
positionId
;
@ApiModelProperty
(
value
=
"用户来源:0-自来,1-用户邀请"
)
private
Integer
source
;
@ApiModelProperty
(
value
=
"邀请码"
)
private
String
code
;
@ApiModelProperty
(
value
=
"邀请人id:"
)
private
String
inviterAccount
;
private
Integer
imUserid
;
private
String
wxOpenid
;
private
String
unionid
;
...
...
ace-modules/ace-admin-api/src/main/java/com/github/wxiaoqi/security/admin/vo/AppUserManageVo.java
View file @
5a4c61d6
...
...
@@ -54,15 +54,16 @@ public class AppUserManageVo {
/**
* 邀请人id
*/
@Column
(
name
=
"Inviter_account"
)
private
Integer
InviterAccount
;
@Column
(
name
=
"inviter_account"
)
private
Integer
inviterAccount
;
/**
*
账号申请所在地
*
上
*/
@Column
(
name
=
"
address
"
)
private
String
address
;
@Column
(
name
=
"
province_code
"
)
private
String
provinceCode
;
@Column
(
name
=
"city_code"
)
private
String
cityCode
;
/**
* 用户性别
*/
...
...
ace-modules/ace-admin-api/src/main/java/com/github/wxiaoqi/security/admin/vo/AppUserVo.java
View file @
5a4c61d6
package
com
.
github
.
wxiaoqi
.
security
.
admin
.
vo
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
...
...
@@ -46,5 +47,39 @@ public class AppUserVo {
private
String
personSign
;
//备注
private
String
remark
;
//渠道来源;1-app;2-小程序
private
Integer
channel
;
/**
* 省份编号
*/
private
Integer
provinceCode
;
/**
* 市编号
*/
private
Integer
cityCode
;
/**
* 创建ip
*/
private
String
crtHost
;
/**
* 更新ip
*/
private
String
updHost
;
@ApiModelProperty
(
value
=
"用户职位"
)
private
Integer
positionId
;
@ApiModelProperty
(
value
=
"用户来源:0-自来,1-用户邀请"
)
private
Integer
source
;
@ApiModelProperty
(
value
=
"邀请码"
)
private
String
code
;
@ApiModelProperty
(
value
=
"邀请人id:"
)
private
String
inviterAccount
;
}
ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rest/AppUserController.java
View file @
5a4c61d6
...
...
@@ -8,7 +8,6 @@ import com.github.wxiaoqi.security.admin.biz.BaseUserMemberBiz;
import
com.github.wxiaoqi.security.admin.entity.*
;
import
com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO
;
import
com.github.wxiaoqi.security.admin.vo.AppUserGroups
;
import
com.github.wxiaoqi.security.admin.vo.AppUserInfoVo
;
import
com.github.wxiaoqi.security.admin.vo.AppUserVo
;
import
com.github.wxiaoqi.security.admin.vo.UserMemberVo
;
import
com.github.wxiaoqi.security.auth.client.config.UserAuthConfig
;
...
...
@@ -20,11 +19,8 @@ import com.github.wxiaoqi.security.common.util.Query;
import
com.github.wxiaoqi.security.common.util.process.ResultCode
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.beanutils.BeanUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
...
...
ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/service/AppPermissionService.java
View file @
5a4c61d6
...
...
@@ -15,6 +15,7 @@ import com.github.wxiaoqi.security.api.vo.user.AppUserInfo;
import
com.github.wxiaoqi.security.common.msg.BaseResponse
;
import
com.github.wxiaoqi.security.common.msg.ObjectRestResponse
;
import
com.github.wxiaoqi.security.common.util.EmojiFilter
;
import
com.github.wxiaoqi.security.common.util.UUIDUtils
;
import
com.github.wxiaoqi.security.common.util.VerificationUtils
;
import
com.github.wxiaoqi.security.common.util.process.ResultCode
;
import
com.github.wxiaoqi.security.common.util.process.SystemConfig
;
...
...
@@ -248,6 +249,8 @@ public class AppPermissionService {
rsUserDetail
.
setIsdel
(
0
);
rsUserDetail
.
setCrtHost
(
getIp
());
setCreateIPInfo
(
rsUserDetail
);
//生成邀请码
rsUserDetail
.
setCode
(
UUIDUtils
.
genCodes
(
6
));
appUserDetailBiz
.
insertSelective
(
rsUserDetail
);
log
.
error
(
"注册:新增用户详情: "
+
userid
);
//自动登录获取优惠卷
...
...
@@ -754,6 +757,8 @@ public class AppPermissionService {
rsUserDetail
.
setCreatetime
(
now
);
rsUserDetail
.
setUpdatetime
(
now
);
rsUserDetail
.
setIsdel
(
0
);
//生成邀请码
rsUserDetail
.
setCode
(
UUIDUtils
.
genCodes
(
6
));
//设置来源
rsUserDetail
.
setChannel
(
UserSourceEnum
.
APPLET
.
getCode
());
rsUserDetail
.
setCrtHost
(
getIp
());
...
...
ace-modules/ace-admin/src/main/resources/mapper/AppUserDetailMapper.xml
View file @
5a4c61d6
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.github.wxiaoqi.security.admin.mapper.AppUserDetailMapper"
>
<resultMap
id=
"AppUserVoMap"
type=
"com.github.wxiaoqi.security.admin.vo.AppUserVo"
>
<result
column=
"id"
property=
"id"
/>
<result
column=
"userid"
property=
"userid"
/>
<result
column=
"im_userid"
property=
"imUserid"
/>
<result
column=
"username"
property=
"username"
/>
<result
column=
"wx_openid"
property=
"wxOpenid"
/>
<result
column=
"unionid"
property=
"unionid"
/>
<result
column=
"openid"
property=
"openid"
/>
<result
column=
"status"
property=
"status"
/>
<result
column=
"id_number"
property=
"idNumber"
/>
<result
column=
"certification_status"
property=
"certificationStatus"
/>
<result
column=
"is_member"
property=
"isMember"
/>
<result
column=
"nickname"
property=
"nickname"
/>
<result
column=
"realname"
property=
"realname"
/>
<result
column=
"headimgurl"
property=
"headimgurl"
/>
<result
column=
"birthday"
property=
"birthday"
/>
<result
column=
"email"
property=
"email"
/>
<result
column=
"sex"
property=
"sex"
/>
<result
column=
"person_sign"
property=
"personSign"
/>
<result
column=
"remark"
property=
"remark"
/>
</resultMap>
<resultMap
id=
"AppUserVoMap"
type=
"com.github.wxiaoqi.security.admin.vo.AppUserVo"
>
<result
column=
"id"
property=
"id"
/>
<result
column=
"userid"
property=
"userid"
/>
<result
column=
"im_userid"
property=
"imUserid"
/>
<result
column=
"username"
property=
"username"
/>
<result
column=
"wx_openid"
property=
"wxOpenid"
/>
<result
column=
"unionid"
property=
"unionid"
/>
<result
column=
"openid"
property=
"openid"
/>
<result
column=
"status"
property=
"status"
/>
<result
column=
"id_number"
property=
"idNumber"
/>
<result
column=
"certification_status"
property=
"certificationStatus"
/>
<result
column=
"is_member"
property=
"isMember"
/>
<result
column=
"nickname"
property=
"nickname"
/>
<result
column=
"realname"
property=
"realname"
/>
<result
column=
"headimgurl"
property=
"headimgurl"
/>
<result
column=
"birthday"
property=
"birthday"
/>
<result
column=
"email"
property=
"email"
/>
<result
column=
"sex"
property=
"sex"
/>
<result
column=
"person_sign"
property=
"personSign"
/>
<result
column=
"remark"
property=
"remark"
/>
<result
column=
"channel"
property=
"channel"
/>
<result
column=
"province_code"
property=
"provinceCode"
/>
<result
column=
"city_code"
property=
"cityCode"
/>
<result
column=
"crt_host"
property=
"crtHost"
/>
<result
column=
"upd_host"
property=
"updHost"
/>
<result
column=
"position_id"
property=
"positionId"
/>
<result
column=
"source"
property=
"source"
/>
<result
column=
"code"
property=
"code"
/>
<result
column=
"invitera_ccount"
property=
"inviterAccount"
/>
</resultMap>
<!-- 获取用户信息 -->
<select
id=
"getUserInfo"
resultMap=
"AppUserVoMap"
>
<!-- 获取用户信息 -->
<select
id=
"getUserInfo"
resultMap=
"AppUserVoMap"
>
select l.im_userid,l.username,l.wx_openid,l.unionid,l.openid,l.status,l.id_number,l.certification_status,d.* from app_user_login l
left join app_user_detail d
on d.userid = l.id
...
...
@@ -43,7 +52,8 @@
d.nickname,
d.source,
d.Inviter_account,
d.address,
d.province_code,
d.city_code,
d.sex,
d.email,
l.username,
...
...
@@ -75,7 +85,7 @@
base_user_member_level ml
on
ml.id = b.member_level
)
m
) m
on
l.id = m.user_id
where 1=1
...
...
@@ -97,7 +107,7 @@
</if>
</select>
</select>
</mapper>
\ No newline at end of file
xx-app/xx-app-server/src/main/java/com/xxfc/platform/app/rest/AppVersionController.java
View file @
5a4c61d6
...
...
@@ -59,8 +59,8 @@ public class AppVersionController extends BaseController<AppVersionBiz,AppVersio
@ApiOperation
(
"查询"
)
@RequestMapping
(
value
=
"/{id}"
,
method
=
RequestMethod
.
GET
)
public
ObjectRestResponse
<
AppVersion
>
get
(
@PathVariable
Integer
id
){
@RequestMapping
(
value
=
"/
getAppVersion/
{id}"
,
method
=
RequestMethod
.
GET
)
public
ObjectRestResponse
<
AppVersion
>
get
AppVersion
(
@PathVariable
Integer
id
){
return
ObjectRestResponse
.
succ
(
baseBiz
.
get
(
id
));
}
...
...
xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/biz/BaseOrderBiz.java
View file @
5a4c61d6
...
...
@@ -285,7 +285,7 @@ public class BaseOrderBiz extends BaseBiz<BaseOrderMapper,BaseOrder> {
//符合范围
if
(
IntervalUtil
.
staticIsInTheInterval
(
hourLag
.
toString
(),
names
[
0
])){
refundGoodsAmont
=
new
BigDecimal
((
(
Double
)
IntervalUtil
.
evaluate
(
dic
.
getDetail
(),
new
MapContext
(){{
refundGoodsAmont
=
new
BigDecimal
((
IntervalUtil
.
evaluate
(
dic
.
getDetail
(),
new
MapContext
(){{
//ga : goodsAmount
set
(
"ga"
,
baseOrder
.
getGoodsAmount
());
}})).
toString
());
...
...
xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/service/OrderRentVehicleService.java
View file @
5a4c61d6
...
...
@@ -166,7 +166,7 @@ public class OrderRentVehicleService extends AbstractOrderHandle<OrderRentVehicl
VehicleModel
vehicleModel
=
vehicleFeign
.
get
(
detail
.
getModelId
()).
getData
();
//如果用户存在,并且为会员,并且车辆有优惠价
if
(
null
!=
dto
&&
!
NONE
.
equals
(
detail
.
getAppUserDTO
())
&&
!
DISCOUNT_STATUS_NONE
.
equals
(
vehicleModel
.
getRentDiscountStatus
()))
{
if
(
null
!=
dto
&&
!
NONE
.
getCode
().
equals
(
dto
.
getMemberLevel
())
&&
!
DISCOUNT_STATUS_NONE
.
equals
(
vehicleModel
.
getRentDiscountStatus
()))
{
String
[]
prices
=
StrUtil
.
isBlank
(
vehicleModel
.
getRentDiscountPrice
())
?
new
String
[]{
vehicleModel
.
getPrice
().
toString
(),
vehicleModel
.
getPrice
().
toString
(),
vehicleModel
.
getPrice
().
toString
()}
:
vehicleModel
.
getRentDiscountPrice
().
split
(
","
);
...
...
xx-tour/xx-tour-server/src/main/java/com/xxfc/platform/tour/rest/TourUserController.java
View file @
5a4c61d6
...
...
@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiOperation;
import
io.swagger.annotations.ApiParam
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.interceptor.TransactionAspectSupport
;
import
org.springframework.web.bind.annotation.*
;
import
tk.mybatis.mapper.entity.Example
;
import
tk.mybatis.mapper.weekend.WeekendSqls
;
...
...
@@ -93,14 +94,14 @@ public class TourUserController extends TourBaseController<TourUserBiz> {
}
/**
*
添加和更新
* @param
id
*
删除
* @param
* @return
*/
@ApiOperation
(
"删除"
)
@PostMapping
(
value
=
"/app/del"
)
@Transactional
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
ObjectRestResponse
<
TourUser
>
del
(
@RequestBody
TourUser
tourUser
){
try
{
...
...
@@ -148,4 +149,8 @@ public class TourUserController extends TourBaseController<TourUserBiz> {
}
}
\ No newline at end of file
xx-universal/xx-universal-api/src/main/java/com/xxfc/platform/universal/weixin/api/WXPrepay.java
View file @
5a4c61d6
...
...
@@ -75,7 +75,7 @@ public class WXPrepay {
if
(
httpEntity
!=
null
)
{
// 打印响应内容
String
result
=
EntityUtils
.
toString
(
httpEntity
,
"UTF-8"
);
//
System.out.println(result);
System
.
out
.
println
(
result
);
// 过滤
result
=
result
.
replaceAll
(
"<![CDATA[|]]>"
,
""
);
String
prepay_id
=
Jsoup
.
parse
(
result
).
select
(
"prepay_id"
).
html
();
...
...
xx-vehicle/xx-vehicle-server/src/main/java/com/xxfc/platform/vehicle/biz/VehicleModelBiz.java
View file @
5a4c61d6
...
...
@@ -105,7 +105,11 @@ public class VehicleModelBiz extends BaseBiz<VehicleModelMapper, VehicleModel> {
Page
<
VehicleModel
>
pages
=
PageHelper
.
startPage
(
page
,
limit
);
Example
example
=
Example
.
builder
(
VehicleModel
.
class
)
.
where
(
WeekendSqls
.<
VehicleModel
>
custom
().
andEqualTo
(
VehicleModel:
:
getIsdel
,
0
)).
orderByDesc
(
"hot_sign"
).
build
();
.
where
(
WeekendSqls
.<
VehicleModel
>
custom
()
.
andEqualTo
(
VehicleModel:
:
getIsdel
,
0
)
.
andEqualTo
(
VehicleModel:
:
getHotSign
,
1
)
).
orderByDesc
(
"id"
).
build
();
selectByExample
(
example
);
PageInfo
<
VehicleModel
>
pageInfo
=
PageInfo
.
of
(
pages
.
getResult
());
...
...
xx-vehicle/xx-vehicle-server/src/main/java/com/xxfc/platform/vehicle/rest/VehicleController.java
View file @
5a4c61d6
...
...
@@ -376,10 +376,9 @@ public class VehicleController extends BaseController<VehicleBiz> {
vpcMap
.
put
(
vpc
.
getParentId
(),
vpcs
);
}
dto
.
setCatas
(
vpcMap
);
//设置显示是否有车
//dto.setYearNo4Where(Boolean.TRUE);
}
//设置显示是否有车
dto
.
setYearNo4Where
(
Boolean
.
TRUE
);
return
new
ObjectRestResponse
<>().
data
(
vehicleBiz
.
searchUsableModel
(
dto
)).
rel
(
true
);
}
...
...
xx-vehicle/xx-vehicle-server/src/main/java/com/xxfc/platform/vehicle/rest/VehicleModelController.java
View file @
5a4c61d6
...
...
@@ -96,7 +96,7 @@ public class VehicleModelController extends BaseController<VehicleModelBiz, Vehi
* @return
*/
@ApiOperation
(
"车型列表"
)
@PostMapping
(
value
=
"/app/unauth
find
/findVehicleModelPage"
)
@PostMapping
(
value
=
"/app/unauth/findVehicleModelPage"
)
public
ObjectRestResponse
<
VehicleModelVo
>
findVehicleModelPageUnauthfind
(
@RequestBody
@ApiParam
(
"查询条件"
)
VehicleModelQueryCondition
vmqc
,
HttpServletRequest
request
)
{
...
...
@@ -281,8 +281,13 @@ public class VehicleModelController extends BaseController<VehicleModelBiz, Vehi
return
ObjectRestResponse
.
succ
(
baseBiz
.
selectList
(
vehicleModel
));
}
@ApiOperation
(
"查询所有"
)
/**
* 优质车型
* @param page
* @param limit
* @return
*/
@ApiOperation
(
"优质车型"
)
@GetMapping
(
value
=
"/goodList"
)
public
List
<
GoodDataVO
>
goodList
(
@RequestParam
(
"page"
)
Integer
page
,
@RequestParam
(
"limit"
)
Integer
limit
){
return
baseBiz
.
goodList
(
page
,
limit
);
...
...
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