Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
T
taobao-mini-template
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
2
Issues
2
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
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
qinhaitao
taobao-mini-template
Commits
191f4049
Commit
191f4049
authored
Nov 06, 2020
by
zhaofei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
s
parent
e7e4fa08
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
172 additions
and
63 deletions
+172
-63
items-dialog.acss
client/components/dialog/items-dialog/items-dialog.acss
+4
-2
items-dialog.js
client/components/dialog/items-dialog/items-dialog.js
+8
-2
prize-dialog.js
client/components/dialog/prize-dialog/prize-dialog.js
+28
-6
tb-range-picker.js
client/components/form/tb-range-picker/tb-range-picker.js
+27
-18
probability-prize-table.axml
...rize/probability-prize-table/probability-prize-table.axml
+2
-0
probability-prize-table.js
.../prize/probability-prize-table/probability-prize-table.js
+2
-1
mixins.js
client/pages/activity/add/mixins.js
+3
-3
validate.js
client/pages/activity/add/validate.js
+1
-1
validate.js
client/utils/validate.js
+77
-24
mini.project.json
mini.project.json
+7
-4
activityconfig.service.ts
server/duibats/src/service/activityconfig.service.ts
+13
-2
No files found.
client/components/dialog/items-dialog/items-dialog.acss
View file @
191f4049
...
...
@@ -13,7 +13,7 @@
.choose-content-tab {
padding:10px 20px;
flex-grow:1;
overflow
-y:scroll
;
overflow
:hidden
;
height:350px;
}
.choose-content-tab .choose-content-tab-view{
...
...
@@ -43,7 +43,9 @@
.choose-content-tab-baby-wrap{
display:flex;
max-height:300px;
overflow:scroll;
overflow:hidden;
overflow-y: auto;
padding-bottom: 70px;
flex-wrap:wrap;
/* justify-content: space-between; */
}
...
...
client/components/dialog/items-dialog/items-dialog.js
View file @
191f4049
...
...
@@ -97,8 +97,14 @@ Component({
}
},
searchBabyList
()
{
const
{
searchInfo
}
=
this
.
data
;
this
.
getBabyList
(
searchInfo
,
this
.
data
.
chooseId
);
this
.
setData
({
searchInfo
:
{
...
this
.
data
.
searchInfo
,
pageNo
:
1
,
},
}),()
=>
{
this
.
getBabyList
(
this
.
data
.
searchInfo
,
this
.
data
.
chooseId
);
};
},
changePagination
(
e
)
{
this
.
setData
({
...
...
client/components/dialog/prize-dialog/prize-dialog.js
View file @
191f4049
...
...
@@ -3,7 +3,7 @@ const { function: fc } = cloud;
const
plugin
=
requirePlugin
(
"myPlugin"
);
import
{
bizCode
}
from
"/config"
;
import
{
queryBenefitByEname
}
from
"/api"
;
import
{
chooseImage
,
getImageInfo
,
validateRangeNumber
}
from
"/utils"
;
import
{
chooseImage
,
getImageInfo
,
validateRangeNumber
,
isDot
}
from
"/utils"
;
import
{
passUrlList
,
urlCheck
}
from
"../../../utils/helper"
;
const
EQUITY_TYPE
=
1
;
const
CREDITS_TYPE
=
2
;
...
...
@@ -107,6 +107,8 @@ Component({
visible
:
false
,
hasEditPrize
:
false
,
datasource
:
[],
prizeDataType
:
null
,
conditionKeys
:
[],
onCloseDialog
:
function
()
{
},
onUpdate
:
function
()
{
},
},
...
...
@@ -452,9 +454,11 @@ Component({
let
isRankPass
=
dialogType
==
"rank"
?
rankArr
.
length
==
2
?
+
rankArr
[
0
]
<=
+
rankArr
[
1
]
&&
/^
[
1-9
]
+
[
0-9
]
*$/
.
test
(
+
rankArr
[
0
])
&&
/^
[
1-9
]
+
[
0-9
]
*$/
.
test
(
+
rankArr
[
1
])
?
+
rankArr
[
0
]
<=
+
rankArr
[
1
]
&&
/^
[
1-9
]
+
[
0-9
]
*$/
.
test
(
+
rankArr
[
0
])
&&
/^
[
1-9
]
+
[
0-9
]
*$/
.
test
(
+
rankArr
[
1
])
&&
isDot
(
rankArr
[
0
])
&&
isDot
(
rankArr
[
1
])
:
false
:
true
;
if
(
dialogType
===
"rank"
)
{
...
...
@@ -478,6 +482,7 @@ Component({
useUrlTips
,
prizeDescTips
,
goodsIdTips
,
rankValueTips
}
=
this
.
data
;
const
isImagePass
=
image
&&
imageTips
.
status
!==
"error"
;
...
...
@@ -489,6 +494,7 @@ Component({
probabilityTips
.
status
!==
"error"
&&
prizeNumberTips
.
status
!==
"error"
&&
useUrlTips
.
status
!==
"error"
&&
rankValueTips
.
status
!==
"error"
&&
prizeDescTips
.
status
!==
"error"
;
const
isObjectPass
=
type
==
OBJECT_TYPE
&&
...
...
@@ -497,6 +503,8 @@ Component({
isImagePass
&&
probabilityTips
.
status
!==
"error"
&&
prizeNumberTips
.
status
!==
"error"
&&
rankValueTips
.
status
!==
"error"
&&
goodsIdTips
.
status
!==
"error"
&&
prizeDescTips
.
status
!==
"error"
;
const
isCreditsPass
=
...
...
@@ -508,7 +516,9 @@ Component({
creditsValueTips
.
status
!==
"error"
;
//限制库存时,限制库存一定要大于发放库存
if
(
isEquietyPass
||
isObjectPass
||
isCreditsPass
)
{
const
{
isEdit
,
prizeDialogData
,
onUpdate
,
onAdd
}
=
this
.
props
;
const
{
isEdit
,
prizeDialogData
,
onUpdate
,
onAdd
,
prizeDataType
,
conditionKeys
}
=
this
.
props
;
let
prizeData
=
{
image
,
desc
,
...
...
@@ -522,9 +532,21 @@ Component({
useStock
:
+
useStock
,
rank
,
switchStock
,
prizeDataType
,
...
rest
,
};
// 自定义新增字段
if
(
conditionKeys
&&
conditionKeys
.
length
)
{
const
conditions
=
{}
conditionKeys
.
forEach
(
item
=>
{
conditions
[
item
.
key
]
=
conditions
[
item
.
value
]
});
prizeData
=
{
...
prizeData
,
...
conditions
}
}
if
(
isEdit
)
{
console
.
log
(
prizeData
,
"--prizeData--"
);
onUpdate
&&
onUpdate
(
prizeData
,
prizeDialogData
.
index
);
...
...
client/components/form/tb-range-picker/tb-range-picker.js
View file @
191f4049
...
...
@@ -13,7 +13,7 @@ Component({
// 用于活动开始后,不可更改开始时间的备份
originalStartTime
:
''
,
disabled
:
false
,
onChange
:
()
=>
{},
onChange
:
()
=>
{
},
disableStartTime
:
false
},
didMount
()
{
...
...
@@ -22,9 +22,9 @@ Component({
didUpdate
(
prevProps
)
{
this
.
changeTime
(
prevProps
,
this
.
props
)
},
didUnmount
()
{},
didUnmount
()
{
},
methods
:
{
// 初始化时间, 默认开始时间为当前时间后的10分钟 结束时间为7天之后
initTime
()
{
const
{
timeRange
}
=
this
.
props
;
...
...
@@ -40,13 +40,13 @@ Component({
let
endNow
=
dayjs
(
nowTime
+
tenMinutes
+
sevenDays
).
format
(
"YYYY-MM-DD HH:mm:ss"
);
// 配置了初始时间,则使用初始时间
if
(
defaultStartTime
)
{
if
(
defaultStartTime
)
{
startNow
=
defaultStartTime
;
}
defaultEndTime
&&
(
endNow
=
defaultEndTime
);
this
.
setData
({
innerTimeRange
:
[
startNow
,
endNow
]
innerTimeRange
:
[
startNow
,
endNow
]
})
this
.
confrimChangeTime
([
new
Date
(
startNow
).
getTime
(),
new
Date
(
endNow
).
getTime
()])
},
...
...
@@ -57,11 +57,11 @@ Component({
let
prevEndTime
=
prevProps
.
timeRange
[
1
];
let
currentEndTime
=
currentProps
.
timeRange
[
1
];
const
isTimeChange
=
currentStartTime
!==
prevStartTime
||
currentEndTime
!==
prevEndTime
;
if
(
isTimeChange
)
{
const
isTimeChange
=
currentStartTime
!==
prevStartTime
||
currentEndTime
!==
prevEndTime
;
if
(
isTimeChange
)
{
this
.
setData
({
innerTimeRange
:
[
innerTimeRange
:
[
dayjs
(
currentStartTime
).
format
(
"YYYY-MM-DD HH:mm:ss"
),
dayjs
(
currentEndTime
).
format
(
"YYYY-MM-DD HH:mm:ss"
)
]
...
...
@@ -70,9 +70,9 @@ Component({
},
pickerChange
(
e
)
{
const
[
startTime
,
endTime
]
=
e
.
detail
.
value
;
const
innerTimeRange
=
[
startTime
||
''
,
endTime
||
''
];
if
(
!
startTime
&&
!
endTime
)
{
this
.
confrimChangeTime
([
''
,
''
],
'请
输入活动
时间'
)
const
innerTimeRange
=
[
startTime
||
''
,
endTime
||
''
];
if
(
!
startTime
&&
!
endTime
)
{
this
.
confrimChangeTime
([
''
,
''
],
'请
选择
时间'
)
}
this
.
setData
({
...
...
@@ -80,12 +80,12 @@ Component({
})
},
// 确认时间
// 确认时间
checkoutTime
(
startTime
,
endTime
)
{
const
{
disableStartTime
,
originalStartTime
}
=
this
.
props
;
const
isStart
=
originalStartTime
<
Date
.
now
();
// 编辑活动时,如果活动已经开始, 开始时间不能编辑
if
(
disableStartTime
&&
isStart
)
{
this
.
confrimChangeTime
([
dayjs
(
originalStartTime
).
format
(
"YYYY-MM-DD HH:mm:ss"
),
endTime
])
...
...
@@ -98,14 +98,14 @@ Component({
if
(
timeHasSame
||
timeIsCantChoose
||
timeBeginError
)
{
let
errTips
=
''
;
if
(
timeIsCantChoose
&&
!
disableStartTime
)
{
errTips
=
`
活动开始时间不能小
于当前时间`
console
.
log
(
'error'
,
'
活动开始时间不能小
于当前时间'
)
errTips
=
`
开始时间需大
于当前时间`
console
.
log
(
'error'
,
'
开始时间需大
于当前时间'
)
}
if
(
timeHasSame
)
{
errTips
=
`开始时间不能等于结束时间`
console
.
log
(
'error'
,
'开始时间不能等于结束时间'
)
}
if
(
timeBeginError
)
{
if
(
timeBeginError
)
{
errTips
=
`开始时间不能大于结束时间`
;
console
.
log
(
'error'
,
'开始时间不能大于结束时间'
);
}
...
...
@@ -129,7 +129,16 @@ Component({
}
},
confrimChangeTime
([
startTime
,
endTime
],
error
)
{
this
.
props
.
onChange
&&
this
.
props
.
onChange
([
new
Date
(
startTime
).
getTime
()
||
''
,
new
Date
(
endTime
).
getTime
()
||
''
],
error
);
const
{
startTimeKeys
=
''
,
endTimeKeys
=
''
}
=
this
.
props
;
// 页面重新赋值
this
.
setData
({
innerTimeRange
:
[
dayjs
(
startTime
).
format
(
"YYYY-MM-DD HH:mm:ss"
),
dayjs
(
endTime
).
format
(
"YYYY-MM-DD HH:mm:ss"
)
]
});
this
.
props
.
onChange
&&
this
.
props
.
onChange
([
new
Date
(
startTime
).
getTime
()
||
''
,
new
Date
(
endTime
).
getTime
()
||
''
],
error
,
[
startTimeKeys
,
endTimeKeys
]);
}
}
});
client/components/prize/probability-prize-table/probability-prize-table.axml
View file @
191f4049
...
...
@@ -41,6 +41,8 @@
isEdit="{{isEdit}}"
prizeDialogData="{{prizeDialogData}}"
onClose="onCloseDialog"
type="probablity"
imageLimit="{{imageLimit}}"
prizeDataType="{{prizeDataType}}"
onUpdate="onPrizeUpdate"
onAdd="onPrizeAdd"/>
\ No newline at end of file
client/components/prize/probability-prize-table/probability-prize-table.js
View file @
191f4049
...
...
@@ -10,7 +10,8 @@ Component({
list
:
[],
onChange
:
()
=>
{
},
dataName
:
''
,
imageLimit
:
[
250
,
250
]
imageLimit
:
[
250
,
250
],
prizeDataType
:
null
},
didMount
()
{
},
didUpdate
()
{
},
...
...
client/pages/activity/add/mixins.js
View file @
191f4049
...
...
@@ -6,15 +6,15 @@ export const methods = {
const
{
value
}
=
e
.
detail
;
this
.
setDataByKey
(
value
,
name
);
},
onTimeChange
(
timeRange
,
error
)
{
onTimeChange
(
timeRange
,
error
,
timeKeys
)
{
const
{
formState
}
=
this
.
data
;
this
.
setData
({
timeRange
,
startTime
:
timeRange
[
0
],
endTime
:
timeRange
[
1
],
[
timeKeys
[
0
]
||
'startTime'
]
:
timeRange
[
0
],
[
timeKeys
[
1
]
||
'endTime'
]
:
timeRange
[
1
],
formState
:
{
...
formState
,
timeRange
:
{
...
...
client/pages/activity/add/validate.js
View file @
191f4049
import
{
rankTableValidator
,
validateRangeNumber
}
from
"../../../utils/validate"
;
import
{
rankTableValidator
,
validateRangeNumber
,
rankTimeValidator
,
isNumber
,
validatePositiveInteger
,
validateInteger
,
urlCheck
}
from
"../../../utils/validate"
;
// 使用 async-validator 校验
// 文档地址: https://github.com/yiminghe/async-validator
...
...
client/utils/validate.js
View file @
191f4049
import
{
passUrlList
}
from
"./helper"
;
// 正整数
export
const
validatePositiveInteger
=
number
=>
/^
[
1-9
]\d
*$/
.
test
(
number
);
...
...
@@ -9,32 +11,32 @@ export const isNumber = val => {
var
regPos
=
/^
\d
+
(\.\d
+
)?
$/
;
//非负浮点数
var
regNeg
=
/^
(
-
(([
0-9
]
+
\.[
0-9
]
*
[
1-9
][
0-9
]
*
)
|
([
0-9
]
*
[
1-9
][
0-9
]
*
\.[
0-9
]
+
)
|
([
0-9
]
*
[
1-9
][
0-9
]
*
)))
$/
;
//负浮点数
if
(
regPos
.
test
(
val
)
&&
regNeg
.
test
(
val
))
{
return
true
;
}
else
{
return
false
;
if
(
regPos
.
test
(
val
)
&&
regNeg
.
test
(
val
))
{
return
true
;
}
else
{
return
false
;
}
}
/**
*
* 验证一定范围内数,支持整数或小数
* @param {*} number
* @param {*} [ min, max ] 范围 [0,99] [-Infinity, 0] [999, Infinity]
* @param {number} [fixed=0] 小数位数 0时为整数
* @returns { boolean }
*/
export
const
validateRangeNumber
=
(
number
,
[
min
,
max
]
=
[],
fixed
=
0
)
=>
{
/**
*
* 验证一定范围内数,支持整数或小数
* @param {*} number
* @param {*} [ min, max ] 范围 [0,99] [-Infinity, 0] [999, Infinity]
* @param {number} [fixed=0] 小数位数 0时为整数
* @returns { boolean }
*/
export
const
validateRangeNumber
=
(
number
,
[
min
,
max
]
=
[],
fixed
=
0
)
=>
{
const
pattern
=
new
RegExp
(
`^-?[0-9]+(\\.[0-9]{0,
${
fixed
}
})?$`
);
if
(
min
>
max
)
{
if
(
min
>
max
)
{
console
.
error
(
'数字范围的最小值不能大于最大值'
);
return
;
}
if
(
!
pattern
.
test
(
number
)
||
number
===
''
)
return
false
;
if
(
!
pattern
.
test
(
number
)
||
number
===
''
)
return
false
;
if
(
number
<
min
||
number
>
max
)
return
false
;
if
(
number
<
min
||
number
>
max
)
return
false
;
return
true
;
}
...
...
@@ -47,11 +49,11 @@ export const validateRangeNumber = (number, [ min, max ] = [], fixed = 0) => {
// 排名表格验证
export
const
rankTableValidator
=
(
rule
,
value
,
callback
,
source
,
options
)
=>
{
if
(
!
value
.
length
)
return
new
Error
(
'请配置至少一项奖品配置'
);
if
(
!
value
.
length
)
return
new
Error
(
'请配置至少一项奖品配置'
);
// rank字段不存在或为0
if
(
value
.
some
(
v
=>
!
v
.
rank
))
return
new
Error
(
'名次配置错误, 请检查'
);
if
(
value
.
some
(
v
=>
!
v
.
name
))
return
new
Error
(
'名次配置错误, 请检查'
);
if
(
value
.
some
(
v
=>
!
v
.
rank
))
return
new
Error
(
'名次配置错误, 请检查'
);
if
(
value
.
some
(
v
=>
!
v
.
name
))
return
new
Error
(
'名次配置错误, 请检查'
);
const
rankArr
=
(
value
.
map
(
v
=>
v
.
rank
.
split
(
'-'
)));
...
...
@@ -62,20 +64,71 @@ export const rankTableValidator = (rule, value, callback, source, options) => {
};
rankArr
.
forEach
((
rank
,
i
)
=>
{
if
(
i
===
0
)
return
;
let
lastRank
=
rankArr
[
i
-
1
][
rankArr
[
i
-
1
].
length
-
1
];
if
(
i
===
0
)
return
;
let
lastRank
=
rankArr
[
i
-
1
][
rankArr
[
i
-
1
].
length
-
1
];
let
curRank
=
rank
[
0
];
if
(
curRank
-
lastRank
===
0
)
{
if
(
curRank
-
lastRank
===
0
)
{
validInfo
=
{
status
:
false
,
message
:
'请勿对重复的名次添加奖品'
}
}
if
(
validInfo
.
status
&&
(
curRank
-
lastRank
!==
1
))
{
if
(
validInfo
.
status
&&
(
curRank
-
lastRank
!==
1
))
{
validInfo
.
status
=
false
;
}
})
if
(
!
validInfo
.
status
)
return
new
Error
(
validInfo
.
message
);
if
(
!
validInfo
.
status
)
return
new
Error
(
validInfo
.
message
);
return
callback
()
}
// 活动时间验证
export
const
rankTimeValidator
=
(
rule
,
value
,
callback
,
source
,
options
)
=>
{
if
(
value
&&
value
.
length
==
2
)
{
const
[
startTime
,
endTime
]
=
value
;
if
(
!
startTime
||
!
endTime
)
{
return
new
Error
(
'请选择完整活动时间'
);
}
// 活动未开始 | 新建活动
if
(
+
source
.
originalStartTime
>
Date
.
now
()
||
!
source
.
originalStartTime
)
{
if
(
new
Date
().
getTime
()
>
startTime
)
{
return
new
Error
(
'活动开始时间需大于当前时间'
);
}
if
(
endTime
===
startTime
)
{
return
new
Error
(
'活动开始时间不能等于结束时间'
);
}
if
(
startTime
>
endTime
)
{
return
new
Error
(
'活动开始时间不能大于结束时间'
);
}
}
}
return
callback
();
}
// 判断网站域名
export
const
urlCheck
=
(
rule
,
value
,
callback
,
source
,
options
)
=>
{
if
(
!
value
)
return
new
Error
(
'请配置链接'
);
if
(
!
value
.
startsWith
(
"http://"
)
&&
!
value
.
startsWith
(
"https://"
))
return
new
Error
(
'请配置链接'
);
let
passUrl
=
false
;
passUrlList
.
some
((
i
)
=>
{
if
(
~
value
.
indexOf
(
i
))
{
passUrl
=
true
return
true
;
}
});
if
(
!
passUrl
)
{
return
new
Error
(
'域名校验不通过'
);
}
return
callback
();
}
// 判断是否含有小数点
export
const
isDot
=
(
num
)
=>
{
var
result
=
(
num
.
toString
()).
indexOf
(
"."
);
if
(
result
!=
-
1
)
{
return
false
}
else
{
return
true
}
}
\ No newline at end of file
mini.project.json
View file @
191f4049
{
"cloud"
:
{
"type"
:
"CLOUDAPP"
},
"miniprogramRoot"
:
"client"
"cloud"
:
{
"type"
:
"CLOUDAPP"
},
"miniprogramRoot"
:
"client"
,
"exclude"
:
[
"server/**"
]
}
server/duibats/src/service/activityconfig.service.ts
View file @
191f4049
...
...
@@ -414,10 +414,21 @@ export default class ActivityConfigService {
* @memberof ActivityConfigService
*/
formatPrizeConfig
(
prizeConfig
:
Array
<
IActivityPrize
>
)
{
return
{
// level 根据level排序
prizeList
:
prizeConfig
.
sort
((
a
,
b
)
=>
a
.
level
-
b
.
level
)
let
prizeList
=
prizeConfig
.
sort
((
a
,
b
)
=>
a
.
level
-
b
.
level
)
prizeData
=
{
<%
for
(
var
i
=
0
;
i
<
configList
.
length
;
++
i
)
{
%>
<%-
configList
[
i
].
sort
==
'prizePool'
&&
`
${
configList
[
i
].
key
}
:' prizeList.filter(item=> { return item.prizeDataType ==
${
configList
[
i
].
prizeDataType
}
})',`
%><%
}
%>
}
<%
for
(
var
i
=
0
;
i
<
configList
.
length
;
++
i
)
{
%>
<%
for
(
var
j
=
0
;
j
<
configList
[
i
].
conditionKeys
.
length
;
++
j
)
{
%>
<%-
`
prizeData['
${
configList
[
i
].
key
}
'].filter(item=> return item['
${
configList
[
i
].
conditionKeys
[
j
].
key
}
' ==
${
configList
[
i
].
conditionKeys
[
j
].
value
}
])
`
%>
<%
}
%>
<%
}
%>
return
prizeData
}
// 概率奖品配置 properiodfrom properiodto
setPrizeProbalityRange
(
prizes
:
IActivityPrize
[])
{
...
...
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