Browse Source

信用相关、用户行为相关模块关联,以及前端输入内容校验

main
GhubCy 2 months ago
parent
commit
6d04a90b03
  1. 171
      src/views/business/userBehaviorLog/index.vue
  2. 32
      src/views/business/userBehaviorRuleAction/index.vue
  3. 16
      src/views/business/userBehaviorRuleRisk/index.vue
  4. 114
      src/views/business/userBehaviorStats/index.vue
  5. 24
      src/views/business/userCredit/index.vue
  6. 28
      src/views/business/userCreditRecord/index.vue

171
src/views/business/userBehaviorLog/index.vue

@ -9,29 +9,33 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="动作标识" prop="action"> <el-form-item label="IP地址" prop="ip">
<el-input <el-input
v-model="queryParams.action" v-model="queryParams.ip"
placeholder="请输入具体动作标识" placeholder="请输入客户端IP地址"
clearable clearable
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="目标ID" prop="targetId"> <el-form-item label="行为类型" prop="behaviorType">
<el-input <el-select v-model="queryParams.behaviorType" placeholder="请选择行为类型" clearable>
v-model="queryParams.targetId" <el-option
placeholder="请输入目标对象ID" v-for="dict in behaviorTypeOptions"
clearable :key="dict.dictValue"
@keyup.enter.native="handleQuery" :label="dict.dictLabel"
:value="dict.dictValue"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="IP地址" prop="ip"> <el-form-item label="设备类型" prop="deviceType">
<el-input <el-select v-model="queryParams.deviceType" placeholder="请选择设备类型" clearable>
v-model="queryParams.ip" <el-option
placeholder="请输入客户端IP地址" v-for="dict in deviceTypeOptions"
clearable :key="dict.dictValue"
@keyup.enter.native="handleQuery" :label="dict.dictLabel"
:value="dict.dictValue"
/> />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="平台类型" prop="platform"> <el-form-item label="平台类型" prop="platform">
<el-select v-model="queryParams.platform" placeholder="请选择平台类型" clearable> <el-select v-model="queryParams.platform" placeholder="请选择平台类型" clearable>
@ -44,7 +48,10 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{ $t('common.button.search') }}</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{
$t('common.button.search')
}}
</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ $t('common.button.reset') }}</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ $t('common.button.reset') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -103,15 +110,28 @@
<el-table-column type="selection" width="55" align="center"/> <el-table-column type="selection" width="55" align="center"/>
<el-table-column label="ID" align="center" prop="id" v-if="true"/> <el-table-column label="ID" align="center" prop="id" v-if="true"/>
<el-table-column label="用户ID" align="center" prop="userId"/> <el-table-column label="用户ID" align="center" prop="userId"/>
<el-table-column label="行为类型" align="center" prop="behaviorType"/> <el-table-column label="用户名" align="center" prop="userName"/>
<el-table-column label="动作标识" align="center" prop="action"/> <el-table-column label="行为类型" align="center" prop="behaviorType">
<el-table-column label="目标ID" align="center" prop="targetId"/> <template slot-scope="scope">
<el-table-column label="目标对象类型" align="center" prop="targetType"/> <span>{{ getBehaviorTypeLabel(scope.row.behaviorType) }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="动作标识" align="center" prop="action"/> -->
<!-- <el-table-column label="目标ID" align="center" prop="targetId"/>
<el-table-column label="目标对象类型" align="center" prop="targetType"/> -->
<el-table-column label="IP地址" align="center" prop="ip"/> <el-table-column label="IP地址" align="center" prop="ip"/>
<el-table-column label="浏览器" align="center" prop="ua"/> <el-table-column label="浏览器" align="center" prop="ua"/>
<el-table-column label="设备类型" align="center" prop="deviceType"/> <el-table-column label="设备类型" align="center" prop="deviceType">
<el-table-column label="平台类型" align="center" prop="platform"/> <template slot-scope="scope">
<el-table-column label="地理位置" align="center" prop="location"/> <span>{{ getDeviceTypeLabel(scope.row.deviceType) }}</span>
</template>
</el-table-column>
<el-table-column label="平台类型" align="center" prop="platform">
<template slot-scope="scope">
<span>{{ getPlatformLabel(scope.row.platform) }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="地理位置" align="center" prop="location"/> -->
<!-- <el-table-column label="扩展字段,用于存储额外信息" align="center" prop="extraInfo"/> --> <!-- <el-table-column label="扩展字段,用于存储额外信息" align="center" prop="extraInfo"/> -->
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
@ -156,24 +176,54 @@
<el-form-item label="关联用户ID" prop="userId"> <el-form-item label="关联用户ID" prop="userId">
<el-input v-model="form.userId" placeholder="请输入关联用户ID"/> <el-input v-model="form.userId" placeholder="请输入关联用户ID"/>
</el-form-item> </el-form-item>
<el-form-item label="具体动作标识" prop="action"> <!-- <el-form-item label="具体动作标识" prop="action">
<el-input v-model="form.action" placeholder="请输入具体动作标识"/> <el-input v-model="form.action" placeholder="请输入具体动作标识"/>
</el-form-item> </el-form-item> -->
<el-form-item label="目标对象ID" prop="targetId"> <!-- <el-form-item label="目标对象ID" prop="targetId">
<el-input v-model="form.targetId" placeholder="请输入目标对象ID"/> <el-input v-model="form.targetId" placeholder="请输入目标对象ID"/>
</el-form-item> </el-form-item> -->
<el-form-item label="客户端IP地址" prop="ip"> <el-form-item label="客户端IP地址" prop="ip">
<el-input v-model="form.ip" placeholder="请输入客户端IP地址"/> <el-input v-model="form.ip" placeholder="请输入客户端IP地址"/>
</el-form-item> </el-form-item>
<el-form-item label="浏览器" prop="ua"> <el-form-item label="浏览器" prop="ua">
<el-input v-model="form.ua" type="textarea" placeholder="请输入内容"/> <el-input v-model="form.ua" placeholder="请输入内容"/>
</el-form-item>
<el-form-item label="行为类型" prop="behaviorType">
<el-select v-model="form.behaviorType" placeholder="请选择行为类型">
<el-option
v-for="dict in behaviorTypeOptions"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="form.deviceType" placeholder="请选择设备类型">
<el-option
v-for="dict in deviceTypeOptions"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="平台类型" prop="platform"> <el-form-item label="平台类型" prop="platform">
<el-input v-model="form.platform" placeholder="请输入平台类型"/> <el-select v-model="form.platform" placeholder="请选择平台类型">
<el-option
v-for="dict in platformOptions"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">{{ $t('common.button.confirm') }}</el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm">{{
$t('common.button.confirm')
}}
</el-button>
<el-button @click="cancel">{{ $t('common.button.cancel') }}</el-button> <el-button @click="cancel">{{ $t('common.button.cancel') }}</el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -184,20 +234,29 @@
<el-form-item label="关联用户ID:"> <el-form-item label="关联用户ID:">
{{ form.userId }} {{ form.userId }}
</el-form-item> </el-form-item>
<el-form-item label="具体动作标识:"> <el-form-item label="用户名:">
{{ form.action }} {{ form.userName }}
</el-form-item> </el-form-item>
<el-form-item label="目标对象ID:"> <!-- <el-form-item label="具体动作标识:">
{{ form.action }}
</el-form-item> -->
<!-- <el-form-item label="目标对象ID:">
{{ form.targetId }} {{ form.targetId }}
</el-form-item> </el-form-item> -->
<el-form-item label="客户端IP地址:"> <el-form-item label="客户端IP地址:">
{{ form.ip }} {{ form.ip }}
</el-form-item> </el-form-item>
<el-form-item label="浏览器:"> <el-form-item label="浏览器:">
{{ form.ua }} {{ form.ua }}
</el-form-item> </el-form-item>
<el-form-item label="行为类型:">
{{ getBehaviorTypeLabel(form.behaviorType) }}
</el-form-item>
<el-form-item label="设备类型:">
{{ getDeviceTypeLabel(form.deviceType) }}
</el-form-item>
<el-form-item label="平台类型:"> <el-form-item label="平台类型:">
{{ form.platform }} {{ getPlatformLabel(form.platform) }}
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
@ -261,15 +320,29 @@ export default {
// //
form: {}, form: {},
platformOptions: [ platformOptions: [
{dictValue: 'PC', dictLabel: 'PC'}, {dictValue: '1', dictLabel: 'Web'},
{dictValue: 'Mobile', dictLabel: 'Mobile'}, {dictValue: '2', dictLabel: 'iOS'},
{dictValue: 'Tablet', dictLabel: 'Tablet'}, {dictValue: '3', dictLabel: 'Android'},
{dictValue: 'WebApp', dictLabel: 'WebApp'}, ],
{dictValue: 'Other', dictLabel: 'Other'} behaviorTypeOptions: [
{dictValue: '1', dictLabel: '登录'},
{dictValue: '2', dictLabel: '支付'},
{dictValue: '3', dictLabel: '实名认证'},
{dictValue: '4', dictLabel: '点击操作'},
{dictValue: '5', dictLabel: '访问页面'},
{dictValue: '6', dictLabel: '登出'}
],
deviceTypeOptions: [
{dictValue: '1', dictLabel: 'PC'},
{dictValue: '2', dictLabel: '移动设备'},
{dictValue: '3', dictLabel: '平板设备'}
], ],
// //
rules: { rules: {
} userId: [
{ required: true, message: "用户关联ID不能为空", trigger: "blur" },
{ pattern: /^\d+$/, message: "用户关联ID必须为数字", trigger: "blur" }
],}
}; };
}, },
created() { created() {
@ -400,7 +473,23 @@ export default {
this.download('business/userBehaviorLog/export', { this.download('business/userBehaviorLog/export', {
...this.queryParams ...this.queryParams
}, `userBehaviorLog_${new Date().getTime()}.xlsx`) }, `userBehaviorLog_${new Date().getTime()}.xlsx`)
},
//
getBehaviorTypeLabel(value) {
const item = this.behaviorTypeOptions.find(dict => dict.dictValue == value);
return item ? item.dictLabel : value;
},
//
getDeviceTypeLabel(value) {
const item = this.deviceTypeOptions.find(dict => dict.dictValue == value);
return item ? item.dictLabel : value;
},
//
getPlatformLabel(value) {
const item = this.platformOptions.find(dict => dict.dictValue == value);
return item ? item.dictLabel : value;
} }
} }
}; };
</script> </script>

32
src/views/business/userBehaviorRuleAction/index.vue

@ -9,6 +9,17 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="行动类型" prop="actionType">
<el-select
v-model="queryParams.actionType"
placeholder="请选择"
clearable
>
<el-option label="通知用户" value="1" />
<el-option label="暂停操作并联系用户" value="2" />
<el-option label="增强身份验证" value="3" />
</el-select>
</el-form-item>
<el-form-item label="行动描述" prop="description"> <el-form-item label="行动描述" prop="description">
<el-input <el-input
v-model="queryParams.description" v-model="queryParams.description"
@ -80,7 +91,14 @@
<el-table-column type="selection" width="55" align="center"/> <el-table-column type="selection" width="55" align="center"/>
<el-table-column label="ID" align="center" prop="id" v-if="true"/> <el-table-column label="ID" align="center" prop="id" v-if="true"/>
<el-table-column label="风险识别ID" align="center" prop="riskRuleId"/> <el-table-column label="风险识别ID" align="center" prop="riskRuleId"/>
<el-table-column label="行动类型" align="center" prop="actionType"/> <el-table-column label="行动类型" align="center">
<template slot-scope="scope">
<span v-if="scope.row.actionType === '1'">通知用户</span>
<span v-else-if="scope.row.actionType === '2'">暂停操作并联系用户</span>
<span v-else-if="scope.row.actionType === '3'">增强身份验证</span>
<span v-else>{{ scope.row.actionType }}</span>
</template>
</el-table-column>
<el-table-column label="行动描述" align="center" prop="description"/> <el-table-column label="行动描述" align="center" prop="description"/>
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
@ -125,12 +143,11 @@
<el-form-item label="风险Id" prop="riskRuleId"> <el-form-item label="风险Id" prop="riskRuleId">
<el-input v-model="form.riskRuleId" placeholder="请输入"/> <el-input v-model="form.riskRuleId" placeholder="请输入"/>
</el-form-item> </el-form-item>
<!-- 下拉框选项 ('BLOCK_USER', 'ALERT_ADMIN', 'CAPTCHA_REQUIRED')-->
<el-form-item label="行动类型" prop="actionType"> <el-form-item label="行动类型" prop="actionType">
<el-select v-model="form.actionType" placeholder="请选择"> <el-select v-model="form.actionType" placeholder="请选择">
<el-option label="用户冻结" value="BLOCK_USER"/> <el-option label="通知用户" value="1" />
<el-option label="向管理员告警" value="ALERT_ADMIN"/> <el-option label="暂停操作并联系用户" value="2" />
<el-option label="发送验证码" value="CAPTCHA_REQUIRED"/> <el-option label="增强身份验证" value="3" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="行动描述" prop="description"> <el-form-item label="行动描述" prop="description">
@ -212,10 +229,15 @@ export default {
actionType: undefined, actionType: undefined,
description: undefined, description: undefined,
}, },
// //
form: {}, form: {},
// //
rules: { rules: {
riskRuleId: [
{required: true, message: "行动类型不能为空", trigger: "change"},
{ pattern: /^\d+$/, message: "风险ID必须为数字", trigger: "blur" }
],
actionType: [ actionType: [
{required: true, message: "行动类型不能为空", trigger: "change"} {required: true, message: "行动类型不能为空", trigger: "change"}
], ],

16
src/views/business/userBehaviorRuleRisk/index.vue

@ -94,8 +94,12 @@
<el-table-column label="触发条件" align="center" prop="triggerCondition"/> <el-table-column label="触发条件" align="center" prop="triggerCondition"/>
<el-table-column label="规则优先级" align="center" prop="priority"/> <el-table-column label="规则优先级" align="center" prop="priority"/>
<el-table-column label="规则描述" align="center" prop="description"/> <el-table-column label="规则描述" align="center" prop="description"/>
<el-table-column label="是否启用" align="center" prop="isEnabled"/> <el-table-column label="是否启用" align="center" prop="isEnabled">
<el-table-column label="规则状态" align="center" prop="status"/> <template slot-scope="scope">
{{ scope.row.isEnabled == '1' ? '是' : '否' }}
</template>
</el-table-column>
<!-- <el-table-column label="规则状态" align="center" prop="status"/> -->
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@ -146,7 +150,10 @@
<el-input v-model="form.description" type="textarea" placeholder="请输入内容"/> <el-input v-model="form.description" type="textarea" placeholder="请输入内容"/>
</el-form-item> </el-form-item>
<el-form-item label="是否启用" prop="isEnabled"> <el-form-item label="是否启用" prop="isEnabled">
<el-input v-model="form.isEnabled" placeholder="请输入是否启用"/> <el-radio-group v-model="form.isEnabled">
<el-radio label="1"></el-radio>
<el-radio label="0"></el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
@ -166,10 +173,9 @@
</el-form-item> </el-form-item>
<el-form-item label="规则描述:"> <el-form-item label="规则描述:">
{{ form.description }} {{ form.description }}
</el-form-item> </el-form-item>
<el-form-item label="是否启用:"> <el-form-item label="是否启用:">
{{ form.isEnabled }} {{ form.isEnabled == '1' ? '是' : '否' }}
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">

114
src/views/business/userBehaviorStats/index.vue

@ -9,14 +9,14 @@
placeholder="请选择统计日期"> placeholder="请选择统计日期">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="动作标识" prop="action"> <!-- <el-form-item label="动作标识" prop="action">
<el-input <el-input
v-model="queryParams.action" v-model="queryParams.action"
placeholder="请输入具体动作标识符" placeholder="请输入具体动作标识符"
clearable clearable
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item> -->
<el-form-item label="维度值" prop="dimensionValue"> <el-form-item label="维度值" prop="dimensionValue">
<el-input <el-input
v-model="queryParams.dimensionValue" v-model="queryParams.dimensionValue"
@ -33,14 +33,14 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="独立用户" prop="uniqueUsers"> <!-- <el-form-item label="独立用户" prop="uniqueUsers">
<el-input <el-input
v-model="queryParams.uniqueUsers" v-model="queryParams.uniqueUsers"
placeholder="请输入独立用户数" placeholder="请输入独立用户数"
clearable clearable
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item> -->
<el-form-item label="停留时间" prop="avgDuration"> <el-form-item label="停留时间" prop="avgDuration">
<el-input <el-input
v-model="queryParams.avgDuration" v-model="queryParams.avgDuration"
@ -49,6 +49,16 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="行为类型" prop="behaviorType">
<el-select v-model="queryParams.behaviorType" placeholder="请选择行为类型" clearable>
<el-option
v-for="dict in behaviorTypeOptions"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{ $t('common.button.search') }}</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{ $t('common.button.search') }}</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ $t('common.button.reset') }}</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{ $t('common.button.reset') }}</el-button>
@ -104,12 +114,16 @@
<el-table v-loading="loading" :data="userBehaviorStatsList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="userBehaviorStatsList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" v-if="true"/> <el-table-column label="ID" align="center" prop="id" v-if="true"/>
<el-table-column label="行为类型" align="center" prop="behaviorType" /> <el-table-column label="行为类型" align="center" prop="behaviorType">
<el-table-column label="动作标识符" align="center" prop="action" /> <template slot-scope="scope">
<span>{{ getBehaviorTypeLabel(scope.row.behaviorType) }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="动作标识符" align="center" prop="action" /> -->
<el-table-column label="维度类型" align="center" prop="dimensionType" /> <el-table-column label="维度类型" align="center" prop="dimensionType" />
<el-table-column label="维度值" align="center" prop="dimensionValue" /> <el-table-column label="维度值" align="center" prop="dimensionValue" />
<el-table-column label="行为总数" align="center" prop="total" /> <el-table-column label="行为总数" align="center" prop="total" />
<el-table-column label="独立用户数" align="center" prop="uniqueUsers" /> <!-- <el-table-column label="独立用户数" align="center" prop="uniqueUsers" /> -->
<el-table-column label="平均停留时间" align="center" prop="avgDuration" /> <el-table-column label="平均停留时间" align="center" prop="avgDuration" />
<el-table-column label="扩展统计数据" align="center" prop="extraData" /> <el-table-column label="扩展统计数据" align="center" prop="extraData" />
<el-table-column label="统计日期" align="center" prop="statDate" width="180"> <el-table-column label="统计日期" align="center" prop="statDate" width="180">
@ -154,29 +168,39 @@
<!-- 添加或修改用户行为统计聚合对话框 --> <!-- 添加或修改用户行为统计聚合对话框 -->
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="auto"> <el-form ref="form" :model="form" :rules="rules" label-width="auto">
<el-form-item label="统计日期" prop="statDate"> <el-form-item label="行为类型" prop="behaviorType">
<el-date-picker clearable <el-select v-model="form.behaviorType" placeholder="请选择行为类型">
v-model="form.statDate" <el-option
type="datetime" v-for="dict in behaviorTypeOptions"
value-format="yyyy-MM-dd HH:mm:ss" :key="dict.dictValue"
placeholder="请选择统计日期"> :label="dict.dictLabel"
</el-date-picker> :value="dict.dictValue"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="具体动作标识符" prop="action"> <!-- <el-form-item label="具体动作标识符" prop="action">
<el-input v-model="form.action" placeholder="请输入具体动作标识符" /> <el-input v-model="form.action" placeholder="请输入具体动作标识符" />
</el-form-item> </el-form-item> -->
<el-form-item label="维度值" prop="dimensionValue"> <el-form-item label="维度值" prop="dimensionValue">
<el-input v-model="form.dimensionValue" placeholder="请输入维度值" /> <el-input v-model="form.dimensionValue" placeholder="请输入维度值" />
</el-form-item> </el-form-item>
<el-form-item label="行为总次数" prop="total"> <el-form-item label="行为总次数" prop="total">
<el-input v-model="form.total" placeholder="请输入行为总次数" /> <el-input v-model="form.total" placeholder="请输入行为总次数" />
</el-form-item> </el-form-item>
<el-form-item label="独立用户数" prop="uniqueUsers"> <!-- <el-form-item label="独立用户数" prop="uniqueUsers">
<el-input v-model="form.uniqueUsers" placeholder="请输入独立用户数" /> <el-input v-model="form.uniqueUsers" placeholder="请输入独立用户数" />
</el-form-item> </el-form-item> -->
<el-form-item label="平均停留时间" prop="avgDuration"> <el-form-item label="平均停留时间" prop="avgDuration">
<el-input v-model="form.avgDuration" placeholder="请输入平均停留时间" /> <el-input v-model="form.avgDuration" placeholder="请输入平均停留时间" />
</el-form-item> </el-form-item>
<el-form-item label="统计日期" prop="statDate">
<el-date-picker clearable
v-model="form.statDate"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择统计日期">
</el-date-picker>
</el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm">{{ $t('common.button.confirm') }}</el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm">{{ $t('common.button.confirm') }}</el-button>
@ -195,8 +219,11 @@
placeholder="请选择统计日期"> placeholder="请选择统计日期">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="具体动作标识符:"> <!-- <el-form-item label="具体动作标识符:">
{{form.action}} {{form.action}}
</el-form-item> -->
<el-form-item label="行为类型:">
{{ getBehaviorTypeLabel(form.behaviorType) }}
</el-form-item> </el-form-item>
<el-form-item label="维度值:"> <el-form-item label="维度值:">
{{form.dimensionValue}} {{form.dimensionValue}}
@ -204,9 +231,9 @@
<el-form-item label="行为总次数:"> <el-form-item label="行为总次数:">
{{form.total}} {{form.total}}
</el-form-item> </el-form-item>
<el-form-item label="独立用户数:"> <!-- <el-form-item label="独立用户数:">
{{form.uniqueUsers}} {{form.uniqueUsers}}
</el-form-item> </el-form-item> -->
<el-form-item label="平均停留时间:"> <el-form-item label="平均停留时间:">
{{form.avgDuration}} {{form.avgDuration}}
</el-form-item> </el-form-item>
@ -225,6 +252,15 @@ export default {
name: "UserBehaviorStats", name: "UserBehaviorStats",
data() { data() {
return { return {
//
behaviorTypeOptions: [
{dictValue: '1', dictLabel: '登录'},
{dictValue: '2', dictLabel: '支付'},
{dictValue: '3', dictLabel: '实名认证'},
{dictValue: '4', dictLabel: '点击操作'},
{dictValue: '5', dictLabel: '访问页面'},
{dictValue: '6', dictLabel: '登出'}
],
// loading // loading
buttonLoading: false, buttonLoading: false,
// //
@ -265,36 +301,7 @@ export default {
form: {}, form: {},
// //
rules: { rules: {
id: [
{ required: true, message: "不能为空", trigger: "blur" }
],
statDate: [
{ required: true, message: "统计日期不能为空", trigger: "blur" }
],
behaviorType: [
{ required: true, message: "行为类型不能为空", trigger: "change" }
],
action: [
{ required: true, message: "具体动作标识符不能为空", trigger: "blur" }
],
dimensionType: [
{ required: true, message: "维度类型不能为空", trigger: "change" }
],
dimensionValue: [
{ required: true, message: "维度值不能为空", trigger: "blur" }
],
total: [
{ required: true, message: "行为总次数不能为空", trigger: "blur" }
],
uniqueUsers: [
{ required: true, message: "独立用户数不能为空", trigger: "blur" }
],
avgDuration: [
{ required: true, message: "平均停留时间不能为空", trigger: "blur" }
],
extraData: [
{ required: true, message: "扩展统计数据不能为空", trigger: "blur" }
],
} }
}; };
}, },
@ -303,6 +310,11 @@ export default {
}, },
methods: { methods: {
/** 查询用户行为统计聚合列表 */ /** 查询用户行为统计聚合列表 */
getBehaviorTypeLabel(value) {
if (!value) return '';
const item = this.behaviorTypeOptions.find(dict => dict.dictValue == value);
return item ? item.dictLabel : value;
},
getList() { getList() {
this.loading = true; this.loading = true;
listUserBehaviorStats(this.queryParams).then(response => { listUserBehaviorStats(this.queryParams).then(response => {

24
src/views/business/userCredit/index.vue

@ -141,16 +141,16 @@
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="auto"> <el-form ref="form" :model="form" :rules="rules" label-width="auto">
<el-form-item label="用户ID" prop="userId"> <el-form-item label="用户ID" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户ID"/> <el-input v-model.number="form.userId" placeholder="请输入用户ID" />
</el-form-item> </el-form-item>
<el-form-item label="用户的信用评分" prop="score"> <el-form-item label="用户的信用评分" prop="score">
<el-input v-model="form.score" placeholder="请输入用户的信用评分"/> <el-input v-model.number="form.score" placeholder="请输入用户的信用评分"/>
</el-form-item> </el-form-item>
<el-form-item label="累计违规次数" prop="violationNum"> <el-form-item label="累计违规次数" prop="violationNum">
<el-input v-model="form.violationNum" placeholder="请输入累计违规次数"/> <el-input v-model.number="form.violationNum" placeholder="请输入累计违规次数" />
</el-form-item> </el-form-item>
<el-form-item label="违规次数比例(%)" prop="violationPro"> <el-form-item label="违规次数比例(%)" prop="violationPro">
<el-input v-model="form.violationPro" placeholder="请输入违规次数比例"/> <el-input v-model.number="form.violationPro" placeholder="请输入违规次数比例" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
@ -230,14 +230,24 @@ export default {
form: {}, form: {},
// //
rules: { rules: {
userId: [
{required: true, message: "用户ID不能为空", trigger: "blur"},
{type: "number", message: "用户ID必须为数字", trigger: "blur"}
],
score: [ score: [
{required: true, message: "用户的信用评分不能为空", trigger: "blur"} {required: true, message: "用户的信用评分不能为空", trigger: "blur"},
{type: "number", message: "信用评分必须为数字", trigger: "blur"},
{type: "number", min: 0, max: 100, message: "信用评分必须在0到100之间", trigger: "blur"}
], ],
violationNum: [ violationNum: [
{required: true, message: "累计违规次数不能为空", trigger: "blur"} {required: true, message: "累计违规次数不能为空", trigger: "blur"},
{type: "number", message: "累计违规次数必须为数字", trigger: "blur"},
{type: "number", min: 0, message: "累计违规次数不能小于0", trigger: "blur"}
], ],
violationPro: [ violationPro: [
{required: true, message: "违规次数比例不能为空", trigger: "blur"} {required: true, message: "违规次数比例不能为空", trigger: "blur"},
{type: "number", message: "违规次数比例必须为数字", trigger: "blur"},
{type: "number", min: 0, max: 100, message: "违规次数比例必须在0到100之间", trigger: "blur"}
], ],
} }
}; };

28
src/views/business/userCreditRecord/index.vue

@ -105,7 +105,7 @@
<el-table-column label="用户Id" align="center" prop="userId"/> <el-table-column label="用户Id" align="center" prop="userId"/>
<el-table-column label="用户名" align="center" prop="userName"/> <el-table-column label="用户名" align="center" prop="userName"/>
<el-table-column label="违规订单号" align="center" prop="violationOrd"/> <el-table-column label="违规订单号" align="center" prop="violationOrd"/>
<el-table-column label="规则Id" align="center" prop="creditRuleId"/> <el-table-column label="信用规则Id" align="center" prop="creditRuleId"/>
<!-- <el-table-column label="违规类型" align="center" prop="violationType"/>--> <!-- <el-table-column label="违规类型" align="center" prop="violationType"/>-->
<el-table-column label="订单金额" align="center" prop="violationSum"/> <el-table-column label="订单金额" align="center" prop="violationSum"/>
<!-- <el-table-column label="违规级别" align="center" prop="violationLevel"/>--> <!-- <el-table-column label="违规级别" align="center" prop="violationLevel"/>-->
@ -150,16 +150,16 @@
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="auto"> <el-form ref="form" :model="form" :rules="rules" label-width="auto">
<el-form-item label="用户Id" prop="userId"> <el-form-item label="用户Id" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户Id"/> <el-input v-model.number="form.userId" placeholder="请输入用户Id"/>
</el-form-item> </el-form-item>
<el-form-item label="规则触发Id" prop="violationBus"> <el-form-item label="信用规则Id" prop="creditRuleId">
<el-input v-model="form.creditRuleId" placeholder="请输入违规业务"/> <el-input v-model.number="form.creditRuleId" placeholder="请输入触发规则Id"/>
</el-form-item> </el-form-item>
<el-form-item label="违规订单号" prop="violationOrd"> <el-form-item label="违规订单号" prop="violationOrd">
<el-input v-model="form.violationOrd" placeholder="请输入违规订单号"/> <el-input v-model.number="form.violationOrd" placeholder="请输入违规订单号"/>
</el-form-item> </el-form-item>
<el-form-item label="订单金额" prop="violationSum"> <el-form-item label="订单金额" prop="violationSum">
<el-input v-model="form.violationSum" placeholder="请输入订单金额"/> <el-input v-model.number="form.violationSum" placeholder="请输入订单金额"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
@ -186,7 +186,7 @@
<el-form-item label="违规订单号:"> <el-form-item label="违规订单号:">
{{ form.violationOrd }} {{ form.violationOrd }}
</el-form-item> </el-form-item>
<el-form-item label="违规订单号:"> <el-form-item label="信用规则Id:">
{{ form.creditRuleId }} {{ form.creditRuleId }}
</el-form-item> </el-form-item>
<el-form-item label="订单金额:"> <el-form-item label="订单金额:">
@ -258,13 +258,21 @@ export default {
// //
rules: { rules: {
userId: [ userId: [
{required: true, message: "用户Id不能为空", trigger: "blur"} {required: true, message: "用户Id不能为空", trigger: "blur"},
{type: "number", message: "用户Id必须为数字", trigger: "blur"}
],
creditRuleId: [
{required: true, message: "触发规则 Id 不能为空", trigger: "blur"},
{type: "number", message: "触发规则 Id必须为数字", trigger: "blur"}
], ],
violationOrd: [ violationOrd: [
{required: true, message: "违规订单号不能为空", trigger: "blur"} {required: true, message: "违规订单号不能为空", trigger: "blur"},
{type: "number", message: "违规订单号必须为数字", trigger: "blur"}
], ],
violationSum: [ violationSum: [
{required: true, message: "订单金额不能为空", trigger: "blur"} {required: true, message: "订单金额不能为空", trigger: "blur"},
{type: "number", message: "订单金额必须为数字", trigger: "blur"},
{type: "number", min: 0, message: "订单金额不能小于0", trigger: "blur"}
], ],
} }
}; };

Loading…
Cancel
Save