Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
member
Overview
Overview
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
member
member
Commits
8257e41f
Commit
8257e41f
authored
Aug 02, 2022
by
曾经
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
冻结会员
parent
d3f1af58
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
1824 additions
and
296 deletions
+1824
-296
importDialog.vue
src/components/allCustomers/components/importDialog.vue
+1
-1
url.js
src/components/axios/url.js
+5
-1
abnormal-member.js
...s/abnormal-member/abnormal-member-list/abnormal-member.js
+42
-51
abnormal-member.vue
.../abnormal-member/abnormal-member-list/abnormal-member.vue
+16
-13
abnormal-setting.js
...bers/abnormal-member/abnormal-setting/abnormal-setting.js
+100
-124
abnormal-setting.vue
...ers/abnormal-member/abnormal-setting/abnormal-setting.vue
+14
-102
number-input.vue
...ormal-member/abnormal-setting/components/number-input.vue
+0
-0
fieldsSettingDialog.vue
...s/wechatmembers/components/dialog/fieldsSettingDialog.vue
+0
-0
freeze.vue
src/components/wechatmembers/components/dialog/freeze.vue
+2
-2
importDialog.vue
...s/wechatmembers/frozen-member/components/importDialog.vue
+241
-0
frozen-list.js
...ts/wechatmembers/frozen-member/frozen-list/frozen-list.js
+337
-0
frozen-list.less
.../wechatmembers/frozen-member/frozen-list/frozen-list.less
+195
-0
frozen-list.vue
...s/wechatmembers/frozen-member/frozen-list/frozen-list.vue
+0
-0
frozen-member.js
...echatmembers/frozen-member/frozen-member/frozen-member.js
+160
-0
frozen-member.less
...hatmembers/frozen-member/frozen-member/frozen-member.less
+152
-0
frozen-member.vue
...chatmembers/frozen-member/frozen-member/frozen-member.vue
+178
-0
white-list.js
...ents/wechatmembers/frozen-member/white-list/white-list.js
+147
-0
white-list.less
...ts/wechatmembers/frozen-member/white-list/white-list.less
+85
-0
white-list.vue
...nts/wechatmembers/frozen-member/white-list/white-list.vue
+140
-0
frozenMember.vue
src/components/wechatmembers/frozenMember.vue
+0
-0
index.js
src/router/index.js
+9
-2
No files found.
src/components/allCustomers/components/importDialog.vue
View file @
8257e41f
...
...
@@ -35,7 +35,7 @@
</el-form>
<div
class=
"dialogTips"
>
<h3>
导入规则
</h3>
<p>
1. 通过导入Excel表格的形式变更GIC已存在
会员的积分等级门店
;不支持导入新会员数据
</p>
<p>
1. 通过导入Excel表格的形式变更GIC已存在
的会员信息
;不支持导入新会员数据
</p>
<p>
2. 仅支持.xlsx 文件的导入;每次导入数据量最多为10000条;文件大小不超过1M
</p>
<p>
3. 导入类型不同,文件模板也不同,请严格按照模板内容填入会员数据,否则将会报错
</p>
<p>
4. 请仔细核对需要变更的会员数据是否准确,否则GIC校验不通过将无法执行成功
</p>
...
...
src/components/axios/url.js
View file @
8257e41f
...
...
@@ -108,7 +108,11 @@ const urlConfig = {
saveAbnormalSetting
:
'/api-member/exception-config-save'
,
// 保存异常配置
getUnfreezeCount
:
'/api-member/no_froze_member_count'
,
// 获取当前选中的异常会员的未冻结数量
getEnableDownload
:
'/api-auth/get-enable-download-data-config-by-user'
,
updateFrozen
:
'/api-member/exception-frozen'
,
updateFrozen
:
'/api-member/exception-frozen'
,
// 异常更新冻结状态
getMembersForFrozen
:
'/api-member/ajax-members-do-frozen'
,
getFrozenWhiteList
:
'/api-member/white-member-list'
,
//获取冻结白名单列表
removeFrozenWhiteMember
:
'/api-member//white-member-remove'
,
// 移出白名单
frozenMemberExportExcel
:
'/api-admin/frozen-member-export-excel'
,
// 异常会员搜索结果导出
}
const
defaultUrl
=
Object
.
assign
({},
urlConfig
);
...
...
src/components/wechatmembers/abnormal-member/abnormal-member-list/abnormal-member.js
View file @
8257e41f
...
...
@@ -2,17 +2,16 @@ import { doFetch, doFetchGet } from "@/components/axios/api";
import
url
from
"@/components/axios/url"
;
import
{
checkFalse
,
checkStatus
,
checkSuccess
}
from
"../../../../../static/js/checkStatus"
;
import
authMethods
from
"@/mixins/auth"
;
import
defaultImg
from
"../../../../../static/img/default.png"
;
import
{
formatLongTime
}
from
"@/utils/utils"
;
import
FreezeDialog
from
"../components/dialog/freeze.vue"
;
import
MemberFieldsDialog
from
"../components/dialog/fieldsSettingDialog.vue"
;
import
ExportFieldsDialog
from
"../components/dialog/fieldsSettingDialog.vue"
;
import
FreezeDialog
from
"../
../
components/dialog/freeze.vue"
;
import
MemberFieldsDialog
from
"../
../
components/dialog/fieldsSettingDialog.vue"
;
import
ExportFieldsDialog
from
"../
../
components/dialog/fieldsSettingDialog.vue"
;
export
default
{
name
:
"
forzen
list"
,
name
:
"
abnormal-member-
list"
,
components
:
{
ExportFieldsDialog
,
MemberFieldsDialog
,
...
...
@@ -30,35 +29,17 @@ export default {
return
arr
[
1
]
||
""
;
}
return
str
;
},
formatCardName
(
val
)
{
if
(
val
)
{
if
(
val
.
length
>
10
)
{
val
=
val
.
substr
(
0
,
10
)
+
"..."
;
}
}
return
val
;
},
formatMember
(
val
)
{
if
(
val
)
{
if
(
val
.
length
>
3
)
{
val
=
val
.
substr
(
0
,
3
)
+
"..."
;
}
}
return
val
;
},
formatPhone
(
value
)
{
if
(
!
value
)
{
return
"--"
;
}
if
(
value
.
length
!=
11
)
{
return
value
;
}
return
`
${
value
.
substr
(
0
,
3
)}
****
${
value
.
substr
(
7
,
4
)}
`
;
}
},
data
()
{
return
{
pickerOptions
:{
disabledDate
(
date
){
let
minDate
=
new
Date
();
minDate
.
setFullYear
(
minDate
.
getFullYear
()
-
1
);
return
date
>
new
Date
()
||
date
<
minDate
;
}
},
dateValue
:
[
''
,
''
],
freezeDialogOptions
:
{
count
:
1
,
...
...
@@ -94,21 +75,21 @@ export default {
total
:
0
,
memberFields
:
[],
// 顶部标题配置
exportFields
:
[],
// 导出顶部配置
frozenL
ist
:
[],
l
ist
:
[],
multipleList
:
[],
abnormalSettingSave
:
0
};
},
created
()
{
if
(
sessionStorage
.
getItem
(
"
frozen
ListSearchData"
))
{
if
(
sessionStorage
.
getItem
(
"
abnormal
ListSearchData"
))
{
this
.
searchData
=
JSON
.
parse
(
sessionStorage
.
getItem
(
"
frozen
ListSearchData"
)
sessionStorage
.
getItem
(
"
abnormal
ListSearchData"
)
);
}
if
(
sessionStorage
.
getItem
(
"
frozen
ListSearchDateRange"
)){
if
(
sessionStorage
.
getItem
(
"
abnormal
ListSearchDateRange"
)){
this
.
dateValue
=
JSON
.
parse
(
sessionStorage
.
getItem
(
"
frozen
ListSearchDateRange"
)
sessionStorage
.
getItem
(
"
abnormal
ListSearchDateRange"
)
);
}
},
...
...
@@ -118,7 +99,7 @@ export default {
watch
:
{
searchData
:
{
handler
(
newval
)
{
sessionStorage
.
setItem
(
"
frozen
ListSearchData"
,
JSON
.
stringify
(
newval
));
sessionStorage
.
setItem
(
"
abnormal
ListSearchData"
,
JSON
.
stringify
(
newval
));
},
deep
:
true
,
immediate
:
false
...
...
@@ -129,11 +110,11 @@ export default {
if
(
value
[
0
]
&&
value
[
1
]){
this
.
searchData
.
startDate
=
+
value
[
0
];
this
.
searchData
.
endDate
=
+
value
[
1
];
sessionStorage
.
setItem
(
"
frozen
ListSearchDateRange"
,
JSON
.
stringify
([
+
value
[
0
],
+
value
[
1
]]));
sessionStorage
.
setItem
(
"
abnormal
ListSearchDateRange"
,
JSON
.
stringify
([
+
value
[
0
],
+
value
[
1
]]));
}
else
{
this
.
searchData
.
startDate
=
''
;
this
.
searchData
.
endDate
=
''
;
sessionStorage
.
removeItem
(
"
frozen
ListSearchDateRange"
);
sessionStorage
.
removeItem
(
"
abnormal
ListSearchDateRange"
);
}
}
},
...
...
@@ -174,7 +155,7 @@ export default {
nowDate
.
getFullYear
()
==
updateDate
.
getFullYear
()
&&
nowDate
.
getMonth
()
==
updateDate
.
getMonth
()
&&
nowDate
.
getDate
()
==
updateDate
.
getDate
()
&&
exceptionRate
==
0
!
exceptionRate
)
{
resolve
(
3
);
}
else
if
(
exceptionRate
>
3
)
{
...
...
@@ -225,7 +206,11 @@ export default {
if
(
errorCode
===
0
)
{
let
{
page
,
fields
,
fieldsStr
}
=
result
||
{};
let
{
result
:
list
,
totalCount
}
=
page
||
{};
this
.
frozenList
=
list
||
[];
list
=
list
||
[];
list
.
forEach
((
item
)
=>
{
item
.
exceptionReasonList
=
(
item
.
exceptionReason
||
''
).
split
(
';'
);
})
this
.
list
=
list
||
[];
this
.
total
=
totalCount
||
0
;
}
})
...
...
@@ -254,6 +239,13 @@ export default {
this
.
searchData
.
currentPage
=
val
;
this
.
getList
();
},
handleSizeChange
(
pageSize
){
this
.
searchData
.
pageSize
=
pageSize
;
if
((
this
.
searchData
.
currentPage
-
1
)
*
this
.
searchData
.
pageSize
>
this
.
total
){
this
.
searchData
.
currentPage
=
1
;
}
this
.
getList
();
},
dateRangeChange
(){
this
.
getList
();
},
...
...
@@ -328,14 +320,6 @@ export default {
});
}
})
// this.freezeDialogOptions = {
// count: 1,
// isBatchFreeze: 0,
// visible: true,
// submit:()=>{
// console.log('item---->',item)
// }
// };
},
// 解冻
unfreezeItem
(
item
)
{
...
...
@@ -390,9 +374,16 @@ export default {
},
// 批量冻结
async
clickBatchFreeze
()
{
let
{
multipleList
}
=
this
;
let
{
multipleList
,
list
}
=
this
;
if
(
!
(
list
&&
list
.
length
)){
this
.
$message
({
message
:
"暂无数据,无法冻结"
,
type
:
"warning"
});
return
;
}
if
(
!
(
multipleList
&&
multipleList
.
length
))
{
return
this
.
$message
.
warning
(
"请勾选要修改的
商户
"
);
return
this
.
$message
.
warning
(
"请勾选要修改的
会员
"
);
}
let
count
=
await
this
.
getUnfreezeCount
();
if
(
count
)
{
...
...
@@ -449,7 +440,7 @@ export default {
doFetch
(
url
.
exceptionMemberBatchFrozen
,
data
)
.
then
(
res
=>
{
if
(
res
.
data
.
errorCode
===
0
)
{
this
.
freezeStatusChangeSuccess
();
this
.
freezeStatusChangeSuccess
(
res
.
data
.
result
);
}
})
.
finally
(()
=>
{
...
...
src/components/wechatmembers/abnormal-member/abnormal-member-list/abnormal-member.vue
View file @
8257e41f
...
...
@@ -11,7 +11,7 @@
style=
"width: 260px"
v-model=
"searchData.phoneNameCard"
prefix-icon=
"el-icon-search"
placeholder=
"输入
姓名/昵称/
手机号/会员卡号"
placeholder=
"输入手机号/会员卡号"
@
change=
"onSearchDataChange"
></el-input>
<el-select
...
...
@@ -26,12 +26,13 @@
</el-select>
<el-date-picker
v-model=
"dateValue"
style=
"margin-left: 10px"
format=
"yyyy
年 MM 月 dd 日
"
format=
"yyyy
-MM-dd
"
type=
"daterange"
range-separator=
"
至
"
range-separator=
"
~
"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
:default-time=
"['00:00:00', '23:59:59']"
:pickerOptions=
"pickerOptions"
@
change=
"dateRangeChange"
></el-date-picker>
</el-row>
<span
...
...
@@ -42,9 +43,10 @@
v-if="getCodeAuth('searchReasultDownload')"
:limit-code="getCode('searchReasultDownload')"
-->
<el-button
icon=
"el-icon-download"
@
click=
"download"
>
搜索结果导出
</el-button
>
<el-button
@
click=
"download"
>
<i
class=
"iconfont icon-xiazairizhi"
></i>
<span>
搜索结果导出
</span>
</el-button>
<!--
v-if="getCodeAuth('batchFreeze')"
:limit-code="getCode('batchFreeze')"
...
...
@@ -65,7 +67,7 @@
<el-table
v-loading=
"load"
ref=
"multipleTable"
:data=
"
frozenL
ist"
:data=
"
l
ist"
tooltip-effect=
"dark"
style=
"width: 100%"
@
sort-change=
"sortChange"
...
...
@@ -83,7 +85,7 @@
:type=
"selectPage.type"
:data-ready=
"selectPage.dataReady"
:table-vm=
"$refs.multipleTable"
:table-data=
"
frozenL
ist"
:table-data=
"
l
ist"
:total=
"total"
@
change=
"(t) => (selectPage.type = t)"
@
selection-change=
"(data) => (multipleList = data)"
...
...
@@ -324,13 +326,13 @@
<el-table-column
label=
"异常原因"
min-width=
"220"
>
<
template
slot-scope=
"{ row }"
>
<el-popover
placement=
"top-start"
width=
"200"
trigger=
"hover"
:disabled=
"!row.exceptionReason"
>
<el-row
type=
"flex"
v-for=
"(item
,index) in (row.exceptionReason||'').split(',')"
:key=
"index
"
>
<el-popover
placement=
"top-start"
trigger=
"hover"
:disabled=
"!row.exceptionReason"
>
<el-row
type=
"flex"
v-for=
"(item
) in (row.exceptionReason||'').split(';')"
:key=
"item
"
>
<div
class=
"dm-status--info"
></div>
<div>
{{
item
}}
</div>
</el-row>
<span
slot=
"reference"
>
{{
row
.
exceptionReason
||
'--'
}}
</span
>
{{
(
row
.
exceptionReason
||
''
).
split
(
';'
)[
0
]
||
'--'
}}
</span
>
</el-popover>
</
template
>
...
...
@@ -387,7 +389,8 @@
@
current-change=
"handleCurrentChange"
:current-page=
"searchData.currentPage"
:page-size=
"searchData.pageSize"
layout=
"total, prev, pager, next"
:page-sizes=
"[20, 50, 75, 100]"
layout=
"total,sizes,prev, pager, next"
:total=
"total"
>
</dm-pagination>
...
...
@@ -469,7 +472,7 @@
/>
<vue-gic-export-excel
:dataArr=
"
frozenL
ist"
:dataArr=
"
l
ist"
:dialogVisible
.
sync=
"exportData.dialogVisible"
:type=
"exportData.type"
:excelUrl=
"exportData.excelUrl"
...
...
src/components/wechatmembers/abnormal-member/abnormal-setting/abnormal-setting.js
View file @
8257e41f
import
{
doFetch
,
doFetchGet
}
from
"@/components/axios/api"
;
import
url
from
"@/components/axios/url"
;
import
{
checkFalse
,
checkStatus
,
checkSuccess
checkFalse
}
from
"../../../../../static/js/checkStatus"
;
import
AbnormalNumberInput
from
".
.
/components/number-input.vue"
;
import
AbnormalNumberInput
from
"./components/number-input.vue"
;
export
default
{
name
:
"AbnormalSetting"
,
...
...
@@ -202,65 +200,95 @@ export default {
{
configType
:
5
,
name
:
"按“有效消费次数”配置:"
,
week
:
{
key
:
"weekCount"
,
checked
:
false
,
value
:
1
,
min
:
1
,
max
:
9999
,
step
:
1
,
precision
:
0
},
month
:
{
key
:
"monthCount"
,
checked
:
false
,
value
:
1
,
min
:
1
,
max
:
9999
,
step
:
1
,
precision
:
0
},
year
:
{
key
:
"yearCount"
,
checked
:
false
,
value
:
5
,
min
:
5
,
max
:
9999
,
step
:
1
,
precision
:
0
}
list
:[
{
name
:
'单日'
,
key
:
"dayCount"
,
checked
:
false
,
value
:
1
,
min
:
1
,
max
:
9999
,
step
:
1
,
precision
:
0
},
{
name
:
'单周'
,
key
:
"weekCount"
,
checked
:
false
,
value
:
1
,
min
:
1
,
max
:
9999
,
step
:
1
,
precision
:
0
},
{
name
:
'单月'
,
key
:
"monthCount"
,
checked
:
false
,
value
:
1
,
min
:
1
,
max
:
9999
,
step
:
1
,
precision
:
0
},
{
name
:
'最近一年'
,
key
:
"yearCount"
,
checked
:
false
,
value
:
5
,
min
:
5
,
max
:
9999
,
step
:
1
,
precision
:
0
}
],
},
{
configType
:
6
,
name
:
"按“订单金额”配置:"
,
week
:
{
key
:
"weekAmount"
,
checked
:
false
,
value
:
500
,
min
:
500
,
max
:
999999
,
step
:
0.01
,
precision
:
2
},
month
:
{
key
:
"monthAmount"
,
checked
:
false
,
value
:
1000
,
min
:
1000
,
max
:
999999
,
step
:
0.01
,
precision
:
2
},
year
:
{
key
:
"yearAmount"
,
checked
:
false
,
value
:
2000
,
min
:
2000
,
max
:
999999
,
step
:
0.01
,
precision
:
2
}
list
:
[
{
name
:
'单日'
,
key
:
"dayAmount"
,
checked
:
false
,
value
:
100
,
min
:
100
,
max
:
999999
,
step
:
0.01
,
precision
:
2
},
{
name
:
'单周'
,
key
:
"weekAmount"
,
checked
:
false
,
value
:
500
,
min
:
500
,
max
:
999999
,
step
:
0.01
,
precision
:
2
},
{
name
:
'单月'
,
key
:
"monthAmount"
,
checked
:
false
,
value
:
1000
,
min
:
1000
,
max
:
999999
,
step
:
0.01
,
precision
:
2
},
{
name
:
'最近一年'
,
key
:
"yearAmount"
,
checked
:
false
,
value
:
2000
,
min
:
2000
,
max
:
999999
,
step
:
0.01
,
precision
:
2
}
],
}
]
},
...
...
@@ -342,22 +370,13 @@ export default {
case
5
:
case
6
:
configsItem
[
item
.
week
.
key
]
=
item
.
week
.
checked
?
item
.
week
.
value
:
""
;
configsItem
[
item
.
month
.
key
]
=
item
.
month
.
checked
?
item
.
month
.
value
:
""
;
configsItem
[
item
.
year
.
key
]
=
item
.
year
.
checked
?
item
.
year
.
value
:
""
;
if
(
configsItem
[
item
.
week
.
key
]
||
configsItem
[
item
.
month
.
key
]
||
configsItem
[
item
.
year
.
key
]
)
{
canSave
=
true
;
}
item
.
list
.
forEach
((
item1
)
=>
{
configsItem
[
item1
.
key
]
=
item1
.
checked
?
item1
.
value
:
''
;
if
(
configsItem
[
item1
.
key
]){
canSave
=
true
;
}
})
break
;
default
:
...
...
@@ -382,38 +401,6 @@ export default {
},
200
);
},
init
()
{
// this.updateData({
// frozen: 1,
// configs: [
// {
// configType: 1,
// dayCount: 100,
// dayAmount: 101,
// weekCount: 102,
// weekAmount: 503,
// monthCount: 104,
// monthAmount: 1005,
// yearCount: 1006,
// yearAmount: 2007
// },
// { configType: 2, continueTime: 8, weekCount: 9, weekAmount: 510 },
// {
// configType: 3,
// continueTime: 11,
// monthCount: 12,
// monthAmount: 1013
// },
// { configType: 4, skuNumber: 14, orderCount: 15 },
// { configType: 5, weekCount: 16, monthCount: 17, yearCount: 18 },
// {
// configType: 6,
// weekAmount: 519,
// monthAmount: 1020,
// yearAmount: 2021
// }
// ]
// });
doFetchGet
(
url
.
getAbnormalSetting
).
then
(
res
=>
{
console
.
log
(
"res--->"
,
res
);
let
{
errorCode
,
result
,
message
}
=
res
.
data
||
{};
...
...
@@ -490,24 +477,13 @@ export default {
case
5
:
case
6
:
if
(
configsItem
[
item
.
week
.
key
])
{
item
.
week
.
checked
=
true
;
item
.
week
.
value
=
configsItem
[
item
.
week
.
key
];
canSave
=
true
;
}
if
(
configsItem
[
item
.
month
.
key
])
{
item
.
month
.
checked
=
true
;
item
.
month
.
value
=
configsItem
[
item
.
month
.
key
];
canSave
=
true
;
}
if
(
configsItem
[
item
.
year
.
key
])
{
item
.
year
.
checked
=
true
;
item
.
year
.
value
=
configsItem
[
item
.
year
.
key
];
canSave
=
true
;
}
item
.
list
.
forEach
((
item1
)
=>
{
if
(
configsItem
[
item1
.
key
]){
item1
.
checked
=
true
;
item1
.
value
=
configsItem
[
item1
.
key
];
canSave
=
true
;
}
})
break
;
default
:
break
;
...
...
src/components/wechatmembers/abnormal-member/abnormal-setting/abnormal-setting.vue
View file @
8257e41f
...
...
@@ -277,20 +277,20 @@
<el-form-item
class=
"cell-item"
label=
"按“有效订单”配置:"
>
<div>
<el-form-item
style=
"padding: 0px 0 10px"
>
<el-checkbox
v-model=
"
formData.configs[4].week
.checked"
@
change=
"change"
>
<el-form-item
style=
"padding: 0px 0 10px"
v-for=
"(item,index) in formData.configs[4].list"
:key=
"item"
>
<el-checkbox
v-model=
"
item
.checked"
@
change=
"change"
>
<el-row
type=
"flex"
align=
"middle"
>
<span>
单周
有效订单大于等于
</span>
<span>
{{
item
.
name
}}
有效订单大于等于
</span>
<el-form-item
class=
"input-form-item"
:rules=
"
{
required:
formData.configs[4].week
.checked,
message:
'单周有效订单数不能为空'
,
required:
item
.checked,
message:
`${ item.name }有效订单数不能为空`
,
}"
:prop="
'configs[4].week.value'
"
:prop="
`configs[4].list[${ index }].value`
"
>
<abnormal-number-input
v-bind
.
sync=
"
formData.configs[4].week
"
v-bind
.
sync=
"
item
"
class=
"count-input"
/>
</el-form-item>
...
...
@@ -298,92 +298,25 @@
</el-row>
</el-checkbox>
</el-form-item>
<el-form-item
style=
"padding: 10px 0"
>
<el-checkbox
v-model=
"formData.configs[4].month.checked"
@
change=
"change"
>
<el-row
type=
"flex"
align=
"middle"
>
<span>
单月有效订单大于等于
</span>
<el-form-item
class=
"input-form-item"
:rules=
"
{
required: formData.configs[4].month.checked,
message: '单月有效订单数不能为空',
}"
:prop="'configs[4].month.value'"
>
<abnormal-number-input
v-bind
.
sync=
"formData.configs[4].month"
class=
"count-input"
/>
</el-form-item>
<span>
笔
</span>
</el-row>
</el-checkbox>
</el-form-item>
<el-form-item
style=
"padding: 10px 0"
>
<el-checkbox
v-model=
"formData.configs[4].year.checked"
@
change=
"change"
>
<el-row
type=
"flex"
align=
"middle"
>
<span>
最近一年有效订单大于等于
</span>
<el-form-item
class=
"input-form-item"
:rules=
"
{
required: formData.configs[4].year.checked,
message: '最近一年有效订单数不能为空',
}"
:prop="'configs[4].year.value'"
>
<abnormal-number-input
v-bind
.
sync=
"formData.configs[4].year"
class=
"amount-input"
/>
</el-form-item>
<span>
元
</span>
</el-row>
</el-checkbox>
</el-form-item>
</div>
</el-form-item>
<el-form-item
class=
"cell-item"
label=
"按“订单金额”配置:"
>
<div>
<el-form-item
style=
"padding: 0 0 10px"
>
<el-checkbox
v-model=
"formData.configs[5].week.checked"
@
change=
"change"
>
<el-row
type=
"flex"
align=
"middle"
>
<span>
单周订单金额大于等于
</span>
<el-form-item
class=
"input-form-item"
:rules=
"
{
required: formData.configs[5].week.checked,
message: '单周订单金额不能为空',
}"
:prop="'configs[5].week.value'"
>
<abnormal-number-input
v-bind
.
sync=
"formData.configs[5].week"
class=
"count-input"
/>
</el-form-item>
<span>
元
</span>
</el-row>
</el-checkbox>
</el-form-item>
<el-form-item
style=
"padding: 10px 0"
>
<el-checkbox
v-model=
"formData.configs[5].month.checked"
@
change=
"change"
>
<el-form-item
style=
"padding: 0px 0 10px"
v-for=
"(item,index) in formData.configs[5].list"
:key=
"item"
>
<el-checkbox
v-model=
"item.checked"
@
change=
"change"
>
<el-row
type=
"flex"
align=
"middle"
>
<span>
单月
订单金额大于等于
</span>
<span>
{{
item
.
name
}}
订单金额大于等于
</span>
<el-form-item
class=
"input-form-item"
:rules=
"
{
required:
formData.configs[5].month
.checked,
message:
'单月订单金额不能为空'
,
required:
item
.checked,
message:
`${ item.name }订单金额不能为空`
,
}"
:prop="
'configs[5].month.value'
"
:prop="
`configs[5].list[${ index }].value`
"
>
<abnormal-number-input
v-bind
.
sync=
"
formData.configs[5].month
"
v-bind
.
sync=
"
item
"
class=
"count-input"
/>
</el-form-item>
...
...
@@ -392,27 +325,6 @@
</el-checkbox>
</el-form-item>
<el-form-item
style=
"padding: 10px 0"
>
<el-checkbox
v-model=
"formData.configs[5].year.checked"
@
change=
"change"
>
<el-row
type=
"flex"
align=
"middle"
>
<span>
最近一年订单金额大于等于
</span>
<el-form-item
class=
"input-form-item"
:rules=
"
{
required: formData.configs[5].year.checked,
message: '最近一年订单金额不能为空',
}"
:prop="'configs[5].year.value'"
>
<abnormal-number-input
v-bind
.
sync=
"formData.configs[5].year"
class=
"amount-input"
/>
</el-form-item>
<span>
元
</span>
</el-row>
</el-checkbox>
</el-form-item>
</div>
</el-form-item>
</el-form>
...
...
src/components/wechatmembers/abnormal-member/components/number-input.vue
→
src/components/wechatmembers/abnormal-member/
abnormal-setting/
components/number-input.vue
View file @
8257e41f
File moved
src/components/wechatmembers/
abnormal-member/
components/dialog/fieldsSettingDialog.vue
→
src/components/wechatmembers/components/dialog/fieldsSettingDialog.vue
View file @
8257e41f
File moved
src/components/wechatmembers/
abnormal-member/
components/dialog/freeze.vue
→
src/components/wechatmembers/components/dialog/freeze.vue
View file @
8257e41f
<
template
>
<div>
<el-dialog
:title=
"
isBatchFreeze ? '批量冻结会员' : '冻结会员'
"
<el-dialog
:title=
"
title || (isBatchFreeze ? '批量冻结会员' : '冻结会员')
"
:visible
.
sync=
"visible"
width=
"600px"
@
close=
"onClose"
>
<div
v-if=
"isBatchFreeze"
class=
"freeze-tips"
>
<span>
当前已选择
</span>
...
...
@@ -40,6 +40,7 @@ export default {
visible
:
false
,
count
:
0
,
isBatchFreeze
:
false
,
// 是否批量冻结
title
:
''
,
},
data
()
{
return
{
...
...
@@ -59,7 +60,6 @@ export default {
sure
(
formName
)
{
this
.
$refs
[
formName
].
validate
((
valid
)
=>
{
if
(
valid
)
{
this
.
onClose
();
this
.
submit
&&
this
.
submit
(
this
.
submitData
);
this
.
$emit
(
'submit'
,
this
.
submitData
);
}
else
{
...
...
src/components/wechatmembers/frozen-member/components/importDialog.vue
0 → 100644
View file @
8257e41f
<
template
>
<!-- 新建导入 -->
<el-dialog
title=
"新建导入"
custom-class=
"customer-dialog"
:visible
.
sync=
"dialogImport"
width=
"600px"
@
closed=
"onDialogImportClosed"
>
<el-form
ref=
"formByImport"
:rules=
"rules"
:model=
"formByImport"
label-width=
"100px"
label-suffix=
":"
style=
"margin-bottom: 36px"
>
<el-form-item
label=
"导入类型"
prop=
"importValue"
>
<el-select
v-model=
"formByImport.importValue"
placeholder=
"请选择导入类型"
@
change=
"handleChangeType"
:disabled=
"importList.length
<
2
"
>
<el-option
:label=
"item.importValue"
:value=
"item.importType"
v-for=
"item in importList"
:key=
"item"
></el-option>
</el-select>
</el-form-item>
<el-form-item
label=
"选择文件"
prop=
"file"
required
>
<dm-import-file
:visible
.
sync=
"dialogVisible"
:options=
"options"
ref=
"importFile"
@
change=
"fileChange"
></dm-import-file>
</el-form-item>
</el-form>
<div
class=
"dialogTips"
>
<h3>
导入规则
</h3>
<p>
1. 通过导入Excel表格的形式变更GIC已存在的会员信息;不支持导入新会员数据
</p>
<p>
2. 仅支持.xlsx 文件的导入;每次导入数据量最多为10000条;文件大小不超过1M
</p>
<p>
3.
导入类型不同,文件模板也不同,请严格按照模板内容填入会员数据,否则将会报错
</p>
<p>
4. 请仔细核对需要变更的会员数据是否准确,否则GIC校验不通过将无法执行成功
</p>
<p>
5.
超管账号支持导入变更全部会员信息,已分权商户的子管理员账号仅可修改管辖范围内的会员信息
</p>
</div>
<span
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"onDialogImportClosed"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"importTable"
:disable=
"load"
>
确 定
</el-button
>
</span>
</el-dialog>
</
template
>
<
script
>
import
url
from
"@/components/axios/url"
;
import
{
checkFalse
,
checkSuccess
}
from
"../../../../../static/js/checkStatus"
;
import
{
doFetch
,
doFetchGet
}
from
"@/components/axios/api"
;
export
default
{
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
,
},
importList
:
{
type
:
Array
,
default
:
[
{
importType
:
15
,
importValue
:
"批量冻结会员"
,
},
{
importType
:
16
,
importValue
:
"批量解冻会员"
,
},
],
},
},
filters
:
{
// 模板下载文字过滤
},
data
()
{
return
{
visible
:
true
,
options
:
{
desc
:
'下载模板并完善信息后,点击此处上传文件,支持格式:.XLSX'
,
downloadTemplate
:
[],
optType
:
0
,
//required
accept
:
[
'.xlsx'
],
// 默认 ['.xlsx', '.xls', '.csv']
maxSize
:
100000
,
// 传递byte required
maxSizeDesc
:
'10M'
,
multiple
:
false
,
// 默认false
hiddleFile
:
false
,
},
actionUrl
:
url
.
uploadExecl
,
// 搜索选项值
importType
:
""
,
// 新建dialog
dialogImport
:
false
,
// 表单
formByImport
:
{
importValue
:
""
,
fileList
:
[],
},
rules
:
{
importValue
:
[
{
required
:
true
,
message
:
"请选择导入类型"
,
trigger
:
"change"
},
],
},
rows
:
0
,
// excel数据数量
// 上传验证加载
load
:
false
,
};
},
watch
:
{
importList
:{
handler
(
n
){
let
value
=
''
;
if
(
n
&&
n
.
length
){
value
=
n
[
0
].
importType
;
}
else
{
value
=
''
}
this
.
formByImport
.
importValue
=
value
;
this
.
handleChangeType
(
value
);
},
deep
:
true
,
immediate
:
true
},
dialogVisible
(
n
,
o
)
{
this
.
dialogImport
=
n
;
},
},
methods
:
{
fileChange
(
res
){
this
.
formByImport
.
fileList
=
res
.
files
||
[];
},
// batchType
// 表单清除
onDialogImportClosed
()
{
this
.
$refs
.
formByImport
.
resetFields
();
this
.
$emit
(
"update:dialogVisible"
,
false
);
},
handleChangeType
(
value
){
let
selectedImportItem
=
this
.
importList
.
find
(
item
=>
{
return
item
.
importType
==
value
;
})
this
.
options
.
downloadTemplate
=
selectedImportItem
?[{
name
:
`下载
${
selectedImportItem
.
importValue
}
模板`
,
url
:
`
${
url
.
downLoadExcelTemplate
}
?requestProject=member&batchType=
${
selectedImportItem
.
importType
}
`
}]:[]
},
// 确认导入
importTable
()
{
this
.
$refs
.
formByImport
.
validateField
(
"importValue"
,
(
err
)
=>
{
if
(
!
err
)
{
// console.log(this.formByImport.fileList);
let
{
fileList
,
importValue
}
=
this
.
formByImport
;
if
(
fileList
.
length
)
{
this
.
load
=
true
;
const
formData
=
new
FormData
();
formData
.
append
(
'file'
,
fileList
[
0
]);
formData
.
append
(
'requestProject'
,
'member'
);
formData
.
append
(
'batchType'
,
importValue
);
doFetch
(
url
.
uploadExecl
,
formData
).
then
((
res
)
=>
{
let
{
errorCode
}
=
res
.
data
;
if
(
errorCode
==
0
){
checkSuccess
(
'上传成功'
)
this
.
onDialogImportClosed
();
}
}).
finally
(()
=>
{
this
.
load
=
false
;
})
}
else
{
checkFalse
(
"请上传文件"
);
}
}
});
},
},
};
</
script
>
<
style
lang=
"scss"
scoped
>
/
deep
/
.el-dialog__footer
{
border
:
none
;
}
.dialogTips
{
padding-bottom
:
8px
;
padding-top
:
22px
;
border-top
:
1px
solid
#e4e7ed
;
color
:
#909399
;
h3
{
font-weight
:
normal
;
font-size
:
14px
;
margin-bottom
:
10px
;
}
p
{
font-size
:
12px
;
}
}
.success_icon
{
text-align
:
center
;
color
:
#52c41a
;
font-size
:
47px
;
}
.successHeader
{
text-align
:
center
;
color
:
#303133
;
font-size
:
16px
;
line-height
:
39px
;
}
.successCon
{
text-align
:
center
;
color
:
#606266
;
font-size
:
12px
;
}
.member-wechat-timer
{
width
:
20px
;
height
:
20px
;
font-size
:
10px
;
line-height
:
20px
;
padding
:
0
;
}
.dialogSuccess
/
deep
/
.el-dialog__footer
{
text-align
:
center
;
padding-bottom
:
22px
;
}
</
style
>
src/components/wechatmembers/frozen-member/frozen-list/frozen-list.js
0 → 100644
View file @
8257e41f
import
{
doFetch
,
doFetchGet
}
from
"@/components/axios/api"
;
import
url
from
"@/components/axios/url"
;
import
{
checkFalse
,
checkSuccess
}
from
"../../../../../static/js/checkStatus"
;
import
authMethods
from
"@/mixins/auth"
;
import
defaultImg
from
"../../../../../static/img/default.png"
;
import
{
formatLongTime
}
from
"@/utils/utils"
;
import
FreezeDialog
from
"../../components/dialog/freeze.vue"
;
import
MemberFieldsDialog
from
"../../components/dialog/fieldsSettingDialog.vue"
;
import
ExportFieldsDialog
from
"../../components/dialog/fieldsSettingDialog.vue"
;
export
default
{
name
:
"forzenlist"
,
components
:
{
ExportFieldsDialog
,
MemberFieldsDialog
,
FreezeDialog
},
mixins
:
[
authMethods
],
filters
:
{
formatDate
(
val
,
format
)
{
if
(
!
val
||
val
==
-
1
)
return
format
==
"hms"
?
""
:
"--"
;
let
str
=
formatLongTime
(
val
,
1
);
let
arr
=
str
.
split
(
" "
);
if
(
format
==
"ymd"
)
{
return
arr
[
0
];
}
else
if
(
format
==
"hms"
)
{
return
arr
[
1
]
||
""
;
}
return
str
;
}
},
data
()
{
return
{
freezeDialogOptions
:
{
count
:
1
,
isBatchFreeze
:
0
,
visible
:
false
},
exportData
:
{
projectName
:
"member"
,
// 当前项目名
dialogVisible
:
false
,
type
:
1
,
excelUrl
:
url
.
frozenMemberExportExcel
,
// 下载数据的地址
params
:
{}
// 传递的参数
},
dialogMemberFieldVisible
:
false
,
dialogExportFieldVisible
:
false
,
defaultImg
,
settingType
:
0
,
// 0未查询 1已设置 2未设置
selectPage
:
{
type
:
0
,
dataReady
:
true
},
searchData
:
{
frozenType
:
""
,
//会员状态
phoneNameCard
:
""
,
// 搜索字段
pageName
:
"allCustomer"
,
pageSize
:
20
,
currentPage
:
1
,
sortColName
:
""
,
// 排序字段
sortType
:
""
,
// 排序方式
},
load
:
false
,
total
:
0
,
memberFields
:
[],
// 顶部标题配置
exportFields
:
[],
// 导出顶部配置
list
:
[],
multipleList
:
[],
abnormalSettingSave
:
0
};
},
created
()
{
if
(
sessionStorage
.
getItem
(
"frozenListSearchData"
))
{
this
.
searchData
=
JSON
.
parse
(
sessionStorage
.
getItem
(
"frozenListSearchData"
)
);
}
},
beforeMount
()
{
this
.
init
();
},
watch
:
{
searchData
:
{
handler
(
newval
)
{
sessionStorage
.
setItem
(
"frozenListSearchData"
,
JSON
.
stringify
(
newval
));
},
deep
:
true
,
immediate
:
false
},
},
methods
:
{
init
()
{
this
.
load
=
true
;
this
.
getFindMemberFields
(
this
.
searchData
.
pageName
)
.
then
(
list
=>
{
this
.
memberFields
=
list
;
this
.
getList
();
})
.
catch
(()
=>
{
this
.
getList
();
});
},
getFindMemberFields
(
pageName
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
if
(
!
pageName
)
{
reject
();
}
doFetch
(
url
.
findMemberFields
,
{
pageName
})
.
then
(
res
=>
{
let
{
errorCode
,
result
}
=
res
.
data
;
if
(
errorCode
===
0
&&
Array
.
isArray
(
result
))
{
resolve
(
result
||
[]);
}
else
{
checkFalse
(
res
.
data
.
message
);
reject
(
res
);
}
})
.
catch
(
err
=>
{
reject
(
err
);
});
});
},
getList
()
{
this
.
load
=
true
;
this
.
selectPage
.
dataReady
=
false
;
doFetch
(
url
.
getFrozenList
,
this
.
searchData
)
.
then
(
res
=>
{
this
.
selectPage
.
dataReady
=
true
;
this
.
load
=
false
;
let
{
errorCode
,
result
}
=
res
.
data
||
{};
if
(
errorCode
===
0
)
{
let
{
result
:
list
,
totalCount
}
=
result
||
{};
this
.
list
=
list
||
[];
this
.
total
=
totalCount
||
0
;
}
})
.
catch
(()
=>
{
this
.
load
=
false
;
this
.
selectPage
.
dataReady
=
true
;
});
},
sortChange
(
column
)
{
let
{
prop
,
order
}
=
column
;
this
.
searchData
.
sortColName
=
prop
;
if
(
order
===
"descending"
)
{
this
.
searchData
.
sortType
=
"desc"
;
}
if
(
order
===
"ascending"
)
{
this
.
searchData
.
sortType
=
"asc"
;
}
this
.
getList
();
},
// 搜索选项改变时
onSearchDataChange
()
{
this
.
getList
();
},
handleCurrentChange
(
val
)
{
this
.
searchData
.
currentPage
=
val
;
this
.
getList
();
},
handleSizeChange
(
pageSize
){
this
.
searchData
.
pageSize
=
pageSize
;
if
((
this
.
searchData
.
currentPage
-
1
)
*
this
.
searchData
.
pageSize
>
this
.
total
){
this
.
searchData
.
currentPage
=
1
;
}
this
.
getList
();
},
dateRangeChange
(){
this
.
getList
();
},
submitMemberFields
(
fields
)
{
doFetch
(
url
.
updateFields
,
{
pageName
:
this
.
searchData
.
pageName
,
fields
}).
then
(
res
=>
{
if
(
res
.
data
.
errorCode
===
0
)
{
checkSuccess
();
// 需要对选中字段排序
this
.
init
();
}
else
{
checkFalse
(
res
.
data
.
message
);
}
});
},
// 导出选项选择完毕 点击确定
submitExportFields
(
fields
)
{
doFetch
(
url
.
updateFields
,
{
pageName
:
"memberTag"
,
fields
});
doFetch
(
url
.
getEnableDownload
).
then
(
res
=>
{
let
{
errorCode
,
result
}
=
res
.
data
;
if
(
errorCode
===
0
&&
result
==
1
)
{
this
.
exportData
.
type
=
2
;
}
else
{
this
.
exportData
.
type
=
1
;
}
});
let
{
phoneNameCard
,
frozenType
}
=
this
.
searchData
||
{};
this
.
exportData
.
params
=
{
frozenType
,
phoneNameCard
,
exportFields
:
fields
};
this
.
exportData
.
dialogVisible
=
true
;
},
freezeConfim
(
options
){
options
=
options
||
{};
this
.
freezeDialogOptions
=
options
;
},
freezeDialogHidden
(){
this
.
freezeDialogOptions
=
{
visible
:
false
}
},
// 解冻
unfreezeItem
(
item
)
{
doFetchGet
(
url
.
updateFrozen
,{
status
:
0
,
memberId
:
item
.
memberId
}).
then
(
res
=>
{
if
(
res
.
data
.
errorCode
===
0
)
{
this
.
$message
({
message
:
"解冻成功"
,
type
:
"success"
});
this
.
$nextTick
(
_
=>
{
this
.
getList
();
});
}
});
},
// 批量解冻
async
clickBatchUnfreeze
()
{
let
{
multipleList
,
list
}
=
this
;
if
(
!
(
list
&&
list
.
length
)){
this
.
$message
({
message
:
"暂无数据,无法解冻"
,
type
:
"warning"
});
return
;
}
if
(
!
(
multipleList
&&
multipleList
.
length
))
{
return
this
.
$message
.
warning
(
"请勾选要修改的会员"
);
}
this
.
$confirm
(
"确定解冻?"
,
"提示"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
}).
then
(()
=>
{
this
.
batchUnfreeze
();
});
},
batchUnfreeze
(){
let
ids
=
[];
let
{
selectPage
,
multipleList
,
searchData
}
=
this
;
let
{
phoneNameCard
}
=
searchData
;
multipleList
.
forEach
(
ele
=>
{
ids
.
push
(
ele
.
memberId
);
});
const
datas
=
{
memberIds
:
ids
.
join
(
","
),
// 会员id
remark
:
""
,
// 备注暂留
//所有会员是2 当前是1 其他是0
isCurrent
:
selectPage
.
type
==
2
?
1
:
0
,
status
:
0
,
// 1 冻结 0 解冻
phoneNameCard
,
};
doFetch
(
url
.
batchUpdateFrozen
,
datas
).
then
(
async
res
=>
{
let
{
errorCode
,
result
}
=
res
.
data
;
if
(
errorCode
===
0
)
{
this
.
$message
({
message
:
"解冻成功"
,
type
:
"success"
});
this
.
freezeStatusChangeSuccess
(
result
);
}
});
},
freezeStatusChangeSuccess
(
taskId
)
{
this
.
$confirm
(
"任务发起成功,请去【企业管理】-【任务中心】查看处理结果和执行进度"
,
"任务发起成功"
,
{
confirmButtonText
:
"去任务中心"
,
cancelButtonText
:
"取消"
,
closeOnClickModal
:
false
,
customClass
:
"import-link-confirm-content"
,
type
:
"warning"
}
)
.
then
(()
=>
{
this
.
getList
();
window
.
open
(
`/gic-web/#/taskDetail/
${
taskId
}
`
);
})
.
catch
(()
=>
{
this
.
getList
();
});
},
// 搜索结果导出
download
()
{
if
(
this
.
total
)
{
this
.
getFindMemberFields
(
"memberTag"
).
then
(
list
=>
{
this
.
exportFields
=
list
;
this
.
dialogExportFieldVisible
=
true
;
});
}
else
{
this
.
$message
.
warning
(
"无数据"
);
}
},
linkDetail
(
memberId
)
{
this
.
$router
.
push
({
path
:
"/customerDetail"
,
query
:
{
memberId
}
});
},
// 去冻结会员页
toFrozenMember
(){
this
.
$router
.
push
({
path
:
"/frozenList/frozenMember"
,
});
},
toWhiteList
(){
this
.
$router
.
push
({
path
:
"/frozenWhiteList"
,
});
},
}
};
src/components/wechatmembers/frozen-member/frozen-list/frozen-list.less
0 → 100644
View file @
8257e41f
.forzen-container {
padding: 20px;
background-color: #fff;
.search {
margin-bottom: 24px;
.top-header {
display: flex;
align-items: center;
margin-bottom: 20px;
h2 {
margin-right: 20px;
font-size: 16px;
font-weight: bold;
color: #303133;
line-height: 22px;
}
}
.search-item {
display: flex;
justify-content: space-between;
}
}
.basic-info-table {
color: #303133;
font-size: 14px;
.nick-name {
color: #909399;
font-size: 14px;
}
.basic-img {
display: inline-block;
vertical-align: middle;
height: 40px;
width: 40px;
min-width: 40px;
border-radius: 50%;
overflow: hidden;
margin-right: 10px;
}
}
}
.frozen-table {
.pager {
text-align: right;
padding: 20px 0 0;
}
/deep/.el-table-column--selection {
.cell {
padding-left: 16px;
padding-right: 0px;
}
}
/deep/.cell {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/deep/.table-select-page .cell {
padding-left: 10px;
padding-right: 0;
display: flex;
align-items: center;
.el-dropdown {
padding: 0;
}
}
}
.frozen-list {
height: 100%;
}
.no-setting-page {
height: 100%;
position: relative;
display: flex;
align-items: center;
justify-content: center;
.tips-box {
height: auto;
margin-right: 150px;
.label {
color: #0a1c2b;
font-size: 20px;
font-weight: 500;
}
.el-button--primary {
margin-top: 40px;
border-radius: 2px;
}
}
}
.no-update-page {
position: relative;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
height: 100%;
.icon {
width: 120px;
height: 120px;
margin: 0 auto 16px;
}
.label {
color: #606266;
font-size: 14px;
}
.no-update-alert{
margin-top: 15px;
/deep/.el-icon-info{
color: #2F54EB;
}
}
}
.data-abnormal-page{
position: relative;
text-align: center;
height: calc(100% - 100px);
padding: 0 30px;
.icon{
margin: 116px auto 30px;
color: #FA8C16;
width: 72px;
height: 72px;
font-size: 72px;
}
.title{
color: #303133;
font-size: 14px;
line-height: 20px;
}
.subtitle{
color: #606266;
font-size: 14px;
line-height: 20px;
}
.el-button--primary{
margin: 30px auto;
}
}
.channel-box {
display: inline-block;
+ .channel-box {
margin-left: 6px;
}
.channel-icon {
width: 20px;
height: 20px;
vertical-align: middle;
}
}
.frozen-table /deep/.el-table {
.setting-cell.el-table__cell {
display: flex;
align-items: center;
height: 65px;
padding: 0;
.cell.setting-cell {
display: flex;
justify-content: space-between;
align-items: center;
height: 65px;
padding-right: 0;
.el-icon-setting {
display: flex;
justify-content: center;
align-items: center;
width: 60px;
height: 100%;
font-size: 20px;
color: #666;
cursor: pointer;
background: #eaeaea;
&:hover {
color: #000;
}
}
}
}
/deep/.el-table__empty-block {
z-index: 1;
position: relative;
background: white;
}
}
src/components/wechatmembers/frozen-member/frozen-list/frozen-list.vue
0 → 100644
View file @
8257e41f
This diff is collapsed.
Click to expand it.
src/components/wechatmembers/frozen-member/frozen-member/frozen-member.js
0 → 100644
View file @
8257e41f
import
{
doFetch
,
doFetchGet
}
from
"@/components/axios/api"
;
import
url
from
"@/components/axios/url"
;
import
{
checkFalse
,
checkSuccess
}
from
"../../../../../static/js/checkStatus"
;
import
authMethods
from
"@/mixins/auth"
;
import
defaultImg
from
"../../../../../static/img/default.png"
;
import
ImportDialog
from
'../components/importDialog.vue'
;
import
{
formatLongTime
}
from
"@/utils/utils"
;
export
default
{
name
:
"frozen-member"
,
components
:
{
ImportDialog
},
mixins
:
[
authMethods
],
filters
:
{
formateTime
(
val
){
if
(
!
val
||
val
==
-
1
)
return
"--"
;
return
formatLongTime
(
val
,
1
);
},
},
data
()
{
return
{
dialogImportVisible
:
false
,
defaultImg
,
searchData
:
{
pageSize
:
20
,
currentPage
:
1
,
frozenType
:
-
1
,
phoneNameCard
:
''
,
wxOrPos
:
-
1
,
fieldNames
:
"name,nickName,photoUrl,cardNo,crateCardDateString,wxMember,posMember"
,
},
total
:
0
,
list
:
[],
multipleList
:
[],
formData
:{
frozenType
:
''
,
remark
:
''
}
};
},
created
()
{
this
.
loadData
();
},
watch
:
{
},
methods
:
{
loadData
(){
doFetch
(
url
.
getMembersForFrozen
,
this
.
searchData
).
then
((
res
)
=>
{
let
{
errorCode
,
result
}
=
res
.
data
;
if
(
errorCode
===
0
)
{
let
{
result
:
list
,
totalCount
}
=
result
;
this
.
list
=
list
||
[];
this
.
total
=
totalCount
||
0
;
}
else
{
checkFalse
(
res
.
data
.
message
);
}
});
},
clearSelectedAll
(){
this
.
$refs
.
multipleTable
.
clearSelection
();
},
delSelectedItem
(
item
){
this
.
$refs
.
multipleTable
.
toggleRowSelection
(
item
,
false
);
},
handleSizeChange
(
pageSize
){
this
.
searchData
.
pageSize
=
pageSize
;
if
((
this
.
searchData
.
currentPage
-
1
)
*
this
.
searchData
.
pageSize
>
this
.
total
){
this
.
searchData
.
currentPage
=
1
;
}
this
.
loadData
();
},
handleCurrentChange
(
currentPage
){
this
.
searchData
.
currentPage
=
currentPage
;
this
.
loadData
();
},
handleSelectionChange
(
selectionList
){
selectionList
=
selectionList
||
[];
this
.
multipleList
=
selectionList
;
},
resetSelected
(){
this
.
$refs
.
selectedForm
.
resetFields
();
this
.
$refs
.
multipleTable
.
clearSelection
();
},
submitForm
(
formName
)
{
// if(!(this.multipleList && this.multipleList.length)){
// this.$message.warning('请选择要冻结的会员');
// return;
// }
// this.$refs[formName].validate((valid) => {
// if (valid) {
// alert('submit!');
// } else {
// console.log('error submit!!');
// return false;
// }
// });
this
.
$confirm
(
"是否冻结所选会员?"
,
"提示"
,
{
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
,
}).
then
(()
=>
{
this
.
frozenMethod
();
});
},
frozenMethod
()
{
let
memberIds
=
this
.
multipleList
.
map
((
item
)
=>
{
return
item
.
memberId
}).
join
(
','
)
const
datas
=
{
memberIds
:
memberIds
,
// 会员id 多个拼接起来, 隔开
remark
:
this
.
formData
.
remark
,
// 备注暂留
isCurrent
:
0
,
// 所有会员是2 当前是1 其他是0
status
:
1
,
// 1 冻结 0 解冻
frozenType
:
this
.
formData
.
frozenType
,
// 101.异常冻结、102.会员主动冻结
};
this
.
loading
=
true
;
doFetch
(
url
.
batchUpdateFrozen
,
datas
)
.
then
((
res
)
=>
{
if
(
res
.
data
.
errorCode
===
0
)
{
this
.
resetSelected
();
this
.
handleToTaskCenter
(
res
.
data
.
result
);
}
else
{
checkFalse
(
res
.
data
.
message
);
}
})
.
catch
((
err
)
=>
{
this
.
loading
=
false
;
checkFalse
(
err
);
});
},
handleToTaskCenter
(
id
)
{
this
.
$confirm
(
`请去【系统】-【操作任务】-【任务中心】查看处理结果和执行进度`
,
`任务发起成功`
,
{
type
:
"success"
,
confirmButtonText
:
"去任务中心"
,
cancelButtonText
:
"取消"
,
showClose
:
false
,
}
).
then
(()
=>
{
this
.
loadData
();
window
.
open
(
`/gic-web/#/taskDetail/
${
id
}
`
);
}).
catch
(()
=>
{
this
.
loadData
();
});
},
batchUpload
(){
this
.
dialogImportVisible
=
true
;
}
}
};
src/components/wechatmembers/frozen-member/frozen-member/frozen-member.less
0 → 100644
View file @
8257e41f
.container {
// background-color: #fff;
// position: relative;
// box-sizing: border-box;
width: 100%;
display: flex;
height: 100%;
.table-box{
padding: 20px;
border-right: 1px solid #DCDFE6;
.search-box{
margin-bottom: 20px;
}
.basic-info-table {
color: #303133;
font-size: 14px;
.nick-name {
color: #909399;
font-size: 14px;
}
.basic-img {
display: inline-block;
vertical-align: middle;
height: 40px;
width: 40px;
min-width: 40px;
border-radius: 50%;
overflow: hidden;
margin-right: 10px;
}
}
.pager{
display: flex;
justify-content: flex-end;
align-items: center;
margin-top: 10px;
}
}
.page-right{
padding: 20px 20px 76px;
box-sizing: border-box;
width: 420px;
position: relative;
.selected-result-box{
height: 522px;
width: 380px;
overflow-y: scroll;
position: relative;
border: 1px solid #DCDFE6;
border-radius: 4px;
.selected-top{
display: flex;
align-items: center;
justify-content: space-between;
position: sticky;
top: 0;
z-index: 1;
width: 100%;
height: 60px;
padding: 0 16px;
.selected-count{
color: #37383A;
font-size: 14px;
}
}
.selected-list .selected-item{
display: flex;
align-items: center;
height: 40px;
&:hover{
background: #F7F8FA;
.icon-close{
background: #E5E6EB;
}
}
.user-header{
width: 30px;
height: 30px;
border-radius: 50%;
margin-left: 17px;
}
.user-name{
color: #47494C;
font-size: 14px;
margin: 0 10px;
flex: 1;
}
.icon-close{
color: #606266;
font-size: 14px;
padding: 3px;
border-radius: 50%;
margin-right: 12px;
}
}
}
.selected-bottom-box{
display: flex;
align-items: center;
justify-content: center;
height: 56px;
position: fixed;
width: 420px;
z-index: 1;
right: 0;
bottom: 0;
box-shadow: 0px -2px 8px 0px rgba(220,223,230,0.6000);
background: white;
}
}
}
.frozen-table {
.pager {
text-align: right;
padding: 20px 0 0;
}
/deep/.el-table-column--selection {
.cell {
padding-left: 16px;
padding-right: 0px;
}
}
/deep/.cell {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/deep/.table-select-page .cell {
padding-left: 10px;
padding-right: 0;
display: flex;
align-items: center;
.el-dropdown {
padding: 0;
}
}
}
/deep/.el-table {
/deep/.el-table__empty-block {
z-index: 1;
position: relative;
background: white;
}
}
src/components/wechatmembers/frozen-member/frozen-member/frozen-member.vue
0 → 100644
View file @
8257e41f
<
template
>
<el-contaniner
class=
"container"
>
<el-main
class=
"table-box"
>
<el-row
type=
"flex"
align=
"middle"
justify=
"space-between"
class=
"search-box"
>
<el-input
v-model=
"searchData.phoneNameCard"
placeholder=
"输入姓名/昵称/手机号/会员卡号"
style=
"width: 260px"
@
change=
"loadData"
>
<i
slot=
"prefix"
class=
"el-input__icon el-icon-search"
></i>
</el-input>
<el-button
plain
@
click=
"batchUpload"
><i
class=
"iconfont icon-shangchuan"
></i>
批量导入
</el-button
>
</el-row>
<el-table
:data=
"list"
tooltip-effect=
"dark"
ref=
"multipleTable"
class=
"member-table"
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
min-width=
"30"
fixed=
"left"
></el-table-column>
<el-table-column
label=
"会员信息"
>
<template
slot-scope=
"
{ row }">
<!-- 基本信息 -->
<el-row
type=
"flex"
align=
"middle"
class=
"basic-info-table"
>
<img
:src=
"row.thirdImgUrl || defaultImg"
class=
"basic-img"
/>
<div>
<div>
<span
v-if=
"row.memberName"
>
{{
row
.
memberName
}}
</span>
<span
class=
"nick-name"
v-if=
"row.nickName"
>
(
{{
row
.
nickName
}}
)
</span
>
</div>
<div
v-if=
"row.phoneNumber"
>
{{
row
.
phoneNumber
}}
</div>
</div>
</el-row>
</
template
>
</el-table-column>
<el-table-column
label=
"会员卡号"
prop=
"cardNum"
></el-table-column>
<el-table-column
label=
"开卡时间"
>
<
template
slot-scope=
"{ row }"
>
{{
row
.
crateCardDateString
|
formateTime
}}
</
template
>
</el-table-column>
</el-table>
<div
class=
"pager"
v-if=
"total > 0"
>
<dm-pagination
:page-size=
"searchData.pageSize"
:currentPage=
"searchData.currentPage"
:page-sizes=
"[20, 50, 75, 100]"
layout=
"total,sizes,prev, pager, next"
@
current-change=
"handleCurrentChange"
@
size-change=
"handleSizeChange"
:total=
"total"
>
</dm-pagination>
</div>
<import-dialog
:dialogVisible
.
sync=
"dialogImportVisible"
@
successImport=
"(taskId) => handleToTaskCenter(taskId)"
/>
</el-main>
<el-aside
width=
"420px"
class=
"page-right"
>
<div
class=
"selected-result-box"
>
<el-row
class=
"selected-top"
type=
"flex"
align=
"middle"
justify=
"space-between"
>
<div
class=
"selected-count"
>
已选:{{ multipleList.length }} 位会员
</div>
<el-button
type=
"text"
@
click=
"clearSelectedAll"
>
全部清除
</el-button>
</el-row>
<div
class=
"selected-list"
>
<div
class=
"selected-item"
v-for=
"item in multipleList"
:key=
"item"
>
<img
:src=
"item.thirdImgUrl || defaultImg"
class=
"user-header"
/>
<div
class=
"user-name"
>
<span
v-if=
"item.memberName"
>
{{ item.memberName }}
</span>
<span
class=
"nick-name"
v-if=
"item.nickName"
>
({{ item.nickName }})
</span
>
</div>
<div
class=
"el-icon-close icon-close"
@
click=
"delSelectedItem(item)"
></div>
</div>
</div>
</div>
<el-form
:model=
"formData"
label-position=
"top"
label-width=
"80px"
ref=
"selectedForm"
>
<el-form-item
label=
"冻结原因"
prop=
"frozenType"
required
:rules=
"{
required: true,
message: '请选择冻结原因',
}"
>
<el-select
v-model=
"formData.frozenType"
placeholder=
"请选择冻结原因"
style=
"width: 380px"
>
<el-option
label=
"会员主动冻结"
:value=
"1"
></el-option>
<el-option
label=
"异常冻结"
:value=
"2"
></el-option>
</el-select>
</el-form-item>
<el-form-item
label=
"原因备注"
prop=
"remark"
required
:rules=
"{
required: true,
message: '请输入原因备注',
}"
>
<el-input
v-model=
"formData.remark"
:maxlength=
"20"
show-word-limit
placeholder=
"请输入原因备注"
></el-input>
</el-form-item>
</el-form>
<div
class=
"selected-bottom-box"
>
<el-button
plain
@
click=
"$router.go(-1)"
>
取消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('selectedForm')"
:disabled=
"
!(
multipleList &&
multipleList.length &&
formData.frozenType &&
formData.remark
)
"
>
冻结选中会员
</el-button
>
</div>
</el-aside>
</el-contaniner>
</template>
<
script
src=
"./frozen-member.js"
></
script
>
<!-- <script>
import action from './abnormal-member.js';
export default { ...action };
</script> -->
<
style
lang=
"less"
>
</
style
>
<
style
lang=
"less"
scoped
src=
"./frozen-member.less"
></
style
>
src/components/wechatmembers/frozen-member/white-list/white-list.js
0 → 100644
View file @
8257e41f
import
{
doFetch
,
doFetchGet
}
from
"@/components/axios/api"
;
import
url
from
"@/components/axios/url"
;
import
{
checkFalse
,
checkSuccess
}
from
"../../../../../static/js/checkStatus"
;
import
authMethods
from
"@/mixins/auth"
;
import
defaultImg
from
"../../../../../static/img/default.png"
;
import
ImportDialog
from
'../components/importDialog.vue'
;
import
{
formatLongTime
}
from
"@/utils/utils"
;
import
FreezeDialog
from
'../../components/dialog/freeze.vue'
;
export
default
{
name
:
"frozen-member"
,
components
:
{
FreezeDialog
,
ImportDialog
},
mixins
:
[
authMethods
],
filters
:
{
formatDate
(
val
,
format
)
{
if
(
!
val
||
val
==
-
1
)
return
format
==
"hms"
?
""
:
"--"
;
let
str
=
formatLongTime
(
val
,
1
);
let
arr
=
str
.
split
(
" "
);
if
(
format
==
"ymd"
)
{
return
arr
[
0
];
}
else
if
(
format
==
"hms"
)
{
return
arr
[
1
]
||
""
;
}
return
str
;
},
formateTime
(
val
){
if
(
!
val
||
val
==
-
1
)
return
"--"
;
return
formatLongTime
(
val
,
1
);
},
},
data
()
{
return
{
freezeDialogOptions
:
{
count
:
1
,
isBatchFreeze
:
0
,
visible
:
false
},
whiteImportList
:[
{
importType
:
17
,
importValue
:
"移入白名单"
,
}
],
dialogImportVisible
:
false
,
defaultImg
,
searchData
:
{
pageSize
:
20
,
currentPage
:
1
,
cardNo
:
''
,
},
total
:
0
,
list
:
[],
multipleList
:
[],
formData
:{
frozenType
:
''
,
remark
:
''
}
};
},
created
()
{
this
.
loadData
();
},
watch
:
{
},
methods
:
{
loadData
(){
doFetchGet
(
url
.
getFrozenWhiteList
,
this
.
searchData
).
then
((
res
)
=>
{
let
{
errorCode
,
result
}
=
res
.
data
;
if
(
errorCode
===
0
)
{
let
{
result
:
list
,
totalCount
}
=
result
;
this
.
list
=
list
||
[];
this
.
total
=
totalCount
||
0
;
}
else
{
checkFalse
(
res
.
data
.
message
);
}
});
},
handleSizeChange
(
pageSize
){
this
.
searchData
.
pageSize
=
pageSize
;
if
((
this
.
searchData
.
currentPage
-
1
)
*
this
.
searchData
.
pageSize
>
this
.
total
){
this
.
searchData
.
currentPage
=
1
;
}
this
.
loadData
();
},
handleCurrentChange
(
currentPage
){
this
.
searchData
.
currentPage
=
currentPage
;
this
.
loadData
();
},
batchUpload
(){
this
.
dialogImportVisible
=
true
;
},
// 移出白名单
clickRemoveItem
(
item
){
doFetchGet
(
url
.
removeFrozenWhiteMember
,{
removeType
:
1
,
memberId
:
item
.
memberId
,
}).
then
(
res
=>
{
if
(
res
.
data
.
errorCode
)
{
this
.
$message
({
message
:
"移出成功"
,
type
:
"success"
});
this
.
$nextTick
(
_
=>
{
this
.
loadData
();
});
}
})
},
// 点击删除并冻结
clickRemoveAndFreeze
(
item
){
this
.
freezeDialogOptions
=
{
count
:
1
,
isBatchFreeze
:
0
,
visible
:
true
,
title
:
'移出并冻结'
,
submit
:
async
(
options
)
=>
{
doFetchGet
(
url
.
removeFrozenWhiteMember
,{
removeType
:
2
,
status
:
1
,
memberId
:
item
.
memberId
,
frozenType
:
options
.
frozenType
,
remark
:
options
.
remark
||
""
}).
then
((
res
)
=>
{
if
(
res
.
data
.
errorCode
===
0
){
checkSuccess
();
this
.
freezeDialogOptions
=
{
visible
:
false
};
}
})
}
}
},
linkDetail
(
memberId
){
this
.
$router
.
push
({
path
:
"/customerDetail"
,
query
:
{
memberId
}
});
}
}
};
src/components/wechatmembers/frozen-member/white-list/white-list.less
0 → 100644
View file @
8257e41f
.container {
padding: 20px;
background: white;
.top-header {
display: flex;
align-items: center;
margin-bottom: 20px;
h2 {
margin-right: 20px;
font-size: 16px;
font-weight: bold;
color: #303133;
line-height: 22px;
}
}
.search-box {
margin-bottom: 20px;
.tips-box{
margin: 0 16px;
i{
color: #2F54EB;
font-size: 14px;
}
span{
color: #606266;
font-size: 14px;
margin-left: 5px;
}
}
}
.member-table {
.basic-info-table {
color: #303133;
font-size: 14px;
.nick-name {
color: #909399;
font-size: 14px;
}
.basic-img {
display: inline-block;
vertical-align: middle;
height: 40px;
width: 40px;
min-width: 40px;
border-radius: 50%;
overflow: hidden;
margin-right: 10px;
}
}
.reason-label {
word-break: break-all;
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
}
/deep/.el-dialog__footer{
border-top: none;
padding: 10px 30px;
}
/deep/.el-dialog__body{
padding: 6px 30px 16px;
}
/deep/.el-dialog__header{
padding: 20px 30px 10px;
}
.pager {
display: flex;
justify-content: flex-end;
align-items: center;
margin-top: 10px;
}
}
/deep/.el-table {
/deep/.el-table__empty-block {
z-index: 1;
position: relative;
background: white;
}
}
src/components/wechatmembers/frozen-member/white-list/white-list.vue
0 → 100644
View file @
8257e41f
<
template
>
<div
class=
"container"
>
<div
class=
"top-header"
>
<h2>
白名单会员
{{
total
}}
人
</h2>
</div>
<el-row
type=
"flex"
align=
"middle"
justify=
"space-between"
class=
"search-box"
>
<el-row
type=
"flex"
align=
"middle"
>
<el-input
v-model=
"searchData.cardNo"
placeholder=
"输入会员卡号"
style=
"width: 260px"
@
change=
"loadData"
>
<i
slot=
"prefix"
class=
"el-input__icon el-icon-search"
></i>
</el-input>
<div
class=
"tips-box"
>
<i
class=
"el-icon-info"
></i>
<span>
处于白名单列表中的会员不会被冻结(外部接口冻结除外)
</span>
</div>
</el-row>
<el-button
plain
@
click=
"batchUpload"
><i
class=
"icon iconfont icon-shangchuan"
></i>
批量导入
</el-button
>
</el-row>
<el-table
:data=
"list"
tooltip-effect=
"dark"
ref=
"multipleTable"
class=
"member-table"
>
<el-table-column
label=
"会员信息"
>
<template
slot-scope=
"
{ row }">
<!-- 基本信息 -->
<el-row
type=
"flex"
align=
"middle"
class=
"basic-info-table"
@
click=
"linkDetail(row.memberId)"
>
<img
:src=
"row.thirdImgUrl || defaultImg"
class=
"basic-img"
/>
<div>
<div>
<span
v-if=
"row.memberName"
>
{{
row
.
memberName
}}
</span>
<span
class=
"nick-name"
v-if=
"row.nickName"
>
(
{{
row
.
nickName
}}
)
</span
>
</div>
<div
v-if=
"row.phoneNumber"
>
{{
row
.
phoneNumber
}}
</div>
</div>
</el-row>
</
template
>
</el-table-column>
<el-table-column
label=
"会员等级"
prop=
"memberGrade"
></el-table-column>
<el-table-column
label=
"会员生日"
prop=
"birth"
></el-table-column>
<el-table-column
label=
"会员卡号"
prop=
"cardNum"
></el-table-column>
<el-table-column
label=
"最近消费时间"
>
<
template
slot-scope=
"{ row }"
>
<div>
TODO
<div>
{{
row
.
createTime
|
formatDate
(
"ymd"
)
}}
</div>
<div>
{{
row
.
createTime
|
formatDate
(
"hms"
)
}}
</div>
</div>
</
template
>
</el-table-column>
<el-table-column
label=
"移入原因"
prop=
"reason"
label-class-name=
"reason-label"
></el-table-column>
<el-table-column
label=
"操作"
fixed=
"right"
width=
"220"
>
<
template
slot-scope=
"{ row }"
>
<!--
:limit-code="getCode('memberIntoCustomDetail')"
v-if="getCodeAuth('memberIntoCustomDetail')"
-->
<el-button
type=
"text"
@
click=
"linkDetail(row.memberId)"
>
查看
</el-button
>
<dm-delete
tips=
"确认移出白名单吗?"
@
confirm=
"clickRemoveItem(row)"
placement=
"top-start"
>
<el-button
type=
"text"
>
仅移出
</el-button>
</dm-delete>
<el-button
type=
"text"
@
click=
"clickRemoveAndFreeze(row)"
v-if=
"row.frozenStatus != 1"
>
移出并冻结
</el-button
>
</
template
>
</el-table-column>
</el-table>
<div
class=
"pager"
v-if=
"total > 0"
>
<dm-pagination
:page-size=
"searchData.pageSize"
:currentPage=
"searchData.currentPage"
:page-sizes=
"[20, 40, 50]"
layout=
"total,sizes,prev, pager, next"
@
current-change=
"handleCurrentChange"
@
size-change=
"handleSizeChange"
:total=
"total"
>
</dm-pagination>
</div>
<import-dialog
:importList=
"whiteImportList"
:dialogVisible
.
sync=
"dialogImportVisible"
@
successImport=
"(taskId) => handleToTaskCenter(taskId)"
/>
<freeze-dialog
v-bind
.
sync=
"freezeDialogOptions"
v-if=
"freezeDialogOptions.visible"
/>
</div>
</template>
<
script
src=
"./white-list.js"
></
script
>
<!-- <script>
import action from './abnormal-member.js';
export default { ...action };
</script> -->
<
style
lang=
"less"
>
</
style
>
<
style
lang=
"less"
scoped
src=
"./white-list.less"
></
style
>
src/components/wechatmembers/frozenMember.vue
View file @
8257e41f
This diff is collapsed.
Click to expand it.
src/router/index.js
View file @
8257e41f
...
...
@@ -120,14 +120,21 @@ export const constantRouterMap = [
},
{
path
:
'/frozenList'
,
component
:
_import
(
'wechatmembers'
,
'frozen
L
ist'
),
component
:
_import
(
'wechatmembers'
,
'frozen
-member/frozen-list/frozen-l
ist'
),
meta
:
{
title
:
'冻结会员列表'
,
},
},
{
path
:
'/frozenWhiteList'
,
component
:
_import
(
'wechatmembers'
,
'frozen-member/white-list/white-list'
),
meta
:
{
title
:
'冻结会员白名单'
,
},
},
{
path
:
'/frozenList/frozenMember'
,
component
:
_import
(
'wechatmembers'
,
'frozen
M
ember'
),
component
:
_import
(
'wechatmembers'
,
'frozen
-member/frozen-member/frozen-m
ember'
),
meta
:
{
title
:
'冻结会员'
,
},
...
...
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