Commit c5ceb2e4 authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

parents 72fe358f 42c3a718
...@@ -82,9 +82,10 @@ ...@@ -82,9 +82,10 @@
</a-button> --> </a-button> -->
</a-form-model-item> </a-form-model-item>
<a-form-model-item label="应用类型" prop="appType"> <a-form-model-item label="应用类型" prop="appType">
<a-radio-group v-model="form.appType"> <a-radio-group v-model="form.appType" @change="changeAppType">
<a-radio :value="1"> 应用程序 </a-radio> <a-radio :value="1"> 应用程序 </a-radio>
<a-radio :value="2"> URL </a-radio> <a-radio :value="2"> URL </a-radio>
<a-radio :value="3" v-if="form.type != 1"> 微信小程序 </a-radio>
</a-radio-group> </a-radio-group>
</a-form-model-item> </a-form-model-item>
<a-form-model-item <a-form-model-item
...@@ -200,7 +201,7 @@ export default { ...@@ -200,7 +201,7 @@ export default {
appIconPath: "", // 应用图标 appIconPath: "", // 应用图标
appThemeName: undefined, // 应用主题名称 appThemeName: undefined, // 应用主题名称
type: "", // 类型(1.终端应用,2.移动端应用) type: "", // 类型(1.终端应用,2.移动端应用)
appType: 1, // 类型(1.应用程序,2.url) appType: 1, // 类型(1.应用程序,2.url,3.微信小程序)
shelves: 0, shelves: 0,
fileName: "", // 文件名称 fileName: "", // 文件名称
filePath: "", // 文件相对路径地址 filePath: "", // 文件相对路径地址
...@@ -250,6 +251,7 @@ export default { ...@@ -250,6 +251,7 @@ export default {
], ],
}, },
fileList: [], fileList: [],
beFrom: "", // 来自终端还是移动端
}; };
}, },
computed: { computed: {
...@@ -351,6 +353,13 @@ export default { ...@@ -351,6 +353,13 @@ export default {
changeSite(value, label) { changeSite(value, label) {
this.form.siteName = label[0]; this.form.siteName = label[0];
}, },
// 改变类型
changeAppType(e) {
let val = e.target.value;
if (val == 1) {
this.form.url = "";
}
},
}, },
}; };
</script> </script>
......
This diff is collapsed.
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
"echarts": "^5.3.3", "echarts": "^5.3.3",
"element-ui": "^2.15.8", "element-ui": "^2.15.8",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"heatmap.js": "^2.0.5",
"highlight.js": "^11.5.1", "highlight.js": "^11.5.1",
"js-export-excel": "^1.1.4", "js-export-excel": "^1.1.4",
"lodash": "^4.17.21", "lodash": "^4.17.21",
......
...@@ -28,10 +28,9 @@ export function getWorkerInfo(params) { ...@@ -28,10 +28,9 @@ export function getWorkerInfo(params) {
return http.get(`${baseURL}/base/workman/info`, params); return http.get(`${baseURL}/base/workman/info`, params);
} }
//评价选项 //评价选项
export function getOptonList(params){ export function getOptonList(params) {
return http.post(`${BASEURL}/bkb/bkbset/optionlist`,params) return http.post(`${BASEURL}/bkb/bkbset/optionlist`, params);
} }
//评价数据列表 //评价数据列表
export function getEvaList(params) { export function getEvaList(params) {
...@@ -96,3 +95,45 @@ export function getCalllist(params) { ...@@ -96,3 +95,45 @@ export function getCalllist(params) {
export function getCallQueList(params) { export function getCallQueList(params) {
return http.post(`${BASEURL}/inter/reportform/callQueList`, params); return http.post(`${BASEURL}/inter/reportform/callQueList`, params);
} }
/**
* 预约报表
*/
// 获取列表
export function getOrderList(params) {
return http.post(`${BASEURL}/wechat/order_data/orderList`, params);
}
// 查看详情
export function getOrderinfo(params) {
return http.get(`${BASEURL}/wechat/order_data/orderinfo`, params);
}
/**
* 取件记录报表
*/
// 获取取件柜列表
export function getSitePickupDevice(params) {
return http.get(`${BASEURL}/pickup/reportform/siteDevice`, params);
}
// 获取取件记录报表
export function getPickupList(params) {
return http.post(`${BASEURL}/pickup/reportform/pickuplist`, params);
}
// 获取存件记录报表
export function getStorageList(params) {
return http.post(`${BASEURL}/pickup/reportform/storagelist`, params);
}
// 获取其他记录操作记录
export function getOtherList(params) {
return http.post(`${BASEURL}/pickup/reportform/otherlist`, params);
}
/**
* 微官网注册报表
*/
// 获取报表数据
export function getRigusersList(params) {
return http.get(`${BASEURL}/admin/reportforms/rigusers`, params);
}
...@@ -20,6 +20,9 @@ import * as directives from "@/directive"; ...@@ -20,6 +20,9 @@ import * as directives from "@/directive";
Object.keys(directives).forEach((name) => Object.keys(directives).forEach((name) =>
Vue.directive(name, directives[name]) Vue.directive(name, directives[name])
); );
// 引入lodash
import lodash from "lodash";
Vue.prototype.$_ = lodash;
// moment 时间处理 // moment 时间处理
import moment from "moment"; import moment from "moment";
Vue.prototype.$moment = moment; Vue.prototype.$moment = moment;
...@@ -29,8 +32,8 @@ Object.keys(filters).forEach((key) => { ...@@ -29,8 +32,8 @@ Object.keys(filters).forEach((key) => {
Vue.filter(key, filters[key]); Vue.filter(key, filters[key]);
}); });
//引入字典 //引入字典
import codeMap from "@/utils/codeMap" import codeMap from "@/utils/codeMap";
Vue.prototype.$codeMap = codeMap Vue.prototype.$codeMap = codeMap;
Vue.prototype.$bus = new Vue(); Vue.prototype.$bus = new Vue();
......
...@@ -265,7 +265,8 @@ const routes = [ ...@@ -265,7 +265,8 @@ const routes = [
{ {
path: "evaluationRecordReport", path: "evaluationRecordReport",
name: "evaluationRecordReport", name: "evaluationRecordReport",
redirect: "/home/dataManagement/evaluationRecordReport/windowsEvaluation", redirect:
"/home/dataManagement/evaluationRecordReport/windowsEvaluation",
component: () => component: () =>
import( import(
/* webpackChunkName: "evaluationRecordReport" */ "@/views/dataAdmin/components/evaluationRecordReport/module.vue" /* webpackChunkName: "evaluationRecordReport" */ "@/views/dataAdmin/components/evaluationRecordReport/module.vue"
...@@ -277,7 +278,7 @@ const routes = [ ...@@ -277,7 +278,7 @@ const routes = [
name: "windowsEvaluation", name: "windowsEvaluation",
component: () => component: () =>
import( import(
/* webpackChunkName: "windowsEvaluation" */"@/views/dataAdmin/components/evaluationRecordReport/windowEvaluation.vue" /* webpackChunkName: "windowsEvaluation" */ "@/views/dataAdmin/components/evaluationRecordReport/windowEvaluation.vue"
), ),
meta: { title: "窗口服务评价记录报表" }, meta: { title: "窗口服务评价记录报表" },
}, },
...@@ -286,7 +287,7 @@ const routes = [ ...@@ -286,7 +287,7 @@ const routes = [
name: "departmentEvaluation", name: "departmentEvaluation",
component: () => component: () =>
import( import(
/* webpackChunkName: "departmentEvaluation" */"@/views/dataAdmin/components/evaluationRecordReport/departmentEvaluation.vue" /* webpackChunkName: "departmentEvaluation" */ "@/views/dataAdmin/components/evaluationRecordReport/departmentEvaluation.vue"
), ),
meta: { title: "办事部门评价记录报表" }, meta: { title: "办事部门评价记录报表" },
}, },
...@@ -295,11 +296,11 @@ const routes = [ ...@@ -295,11 +296,11 @@ const routes = [
name: "matterEvaluation", name: "matterEvaluation",
component: () => component: () =>
import( import(
/* webpackChunkName: "matterEvaluation" */"@/views/dataAdmin/components/evaluationRecordReport/matterEvaluation.vue" /* webpackChunkName: "matterEvaluation" */ "@/views/dataAdmin/components/evaluationRecordReport/matterEvaluation.vue"
), ),
meta: { title: "办理事项评价记录报表" }, meta: { title: "办理事项评价记录报表" },
}, },
] ],
}, },
{ {
path: "sampleRecordReport", path: "sampleRecordReport",
...@@ -316,11 +317,11 @@ const routes = [ ...@@ -316,11 +317,11 @@ const routes = [
name: "sampleForm", name: "sampleForm",
component: () => component: () =>
import( import(
/* webpackChunkName: "sampleForm" */"@/views/dataAdmin/components/sampleRecordReport/sampleForm.vue" /* webpackChunkName: "sampleForm" */ "@/views/dataAdmin/components/sampleRecordReport/sampleForm.vue"
), ),
meta: { title: "样表记录报表" }, meta: { title: "样表记录报表" },
}, },
] ],
}, },
{ {
path: "fillRecordReport", path: "fillRecordReport",
...@@ -337,11 +338,11 @@ const routes = [ ...@@ -337,11 +338,11 @@ const routes = [
name: "fillForm", name: "fillForm",
component: () => component: () =>
import( import(
/* webpackChunkName: "fillForm" */"@/views/dataAdmin/components/fillRecordReport/fillForm.vue" /* webpackChunkName: "fillForm" */ "@/views/dataAdmin/components/fillRecordReport/fillForm.vue"
), ),
meta: { title: "填单记录报表" }, meta: { title: "填单记录报表" },
}, },
] ],
}, },
{ {
path: "microOfficialWebsite", path: "microOfficialWebsite",
...@@ -358,11 +359,11 @@ const routes = [ ...@@ -358,11 +359,11 @@ const routes = [
name: "microForm", name: "microForm",
component: () => component: () =>
import( import(
/* webpackChunkName: "microForm" */"@/views/dataAdmin/components/microOfficialWebsite/microForm.vue" /* webpackChunkName: "microForm" */ "@/views/dataAdmin/components/microOfficialWebsite/microForm.vue"
), ),
meta: { title: "微官网注册报表" }, meta: { title: "微官网注册报表" },
}, },
] ],
}, },
{ {
path: "networkGovernance", path: "networkGovernance",
...@@ -379,7 +380,7 @@ const routes = [ ...@@ -379,7 +380,7 @@ const routes = [
name: "networkForm", name: "networkForm",
component: () => component: () =>
import( import(
/* webpackChunkName: "networkForm" */"@/views/dataAdmin/components/networkGovernance/networkForm.vue" /* webpackChunkName: "networkForm" */ "@/views/dataAdmin/components/networkGovernance/networkForm.vue"
), ),
meta: { title: "网络理政报表" }, meta: { title: "网络理政报表" },
}, },
...@@ -388,11 +389,11 @@ const routes = [ ...@@ -388,11 +389,11 @@ const routes = [
name: "callRecordForm", name: "callRecordForm",
component: () => component: () =>
import( import(
/* webpackChunkName: "callRecordForm" */"@/views/dataAdmin/components/networkGovernance/callRecordForm.vue" /* webpackChunkName: "callRecordForm" */ "@/views/dataAdmin/components/networkGovernance/callRecordForm.vue"
), ),
meta: { title: "12345拨打记录报表" }, meta: { title: "12345拨打记录报表" },
}, },
] ],
}, },
], ],
}, },
...@@ -414,6 +415,72 @@ const routes = [ ...@@ -414,6 +415,72 @@ const routes = [
), ),
meta: { title: "数据精算" }, meta: { title: "数据精算" },
}, },
{
path: "dataActuary/behaviour",
name: "behaviour",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/behaviour/module.vue"
),
meta: { title: "使用行为分析" },
redirect: "dataActuary/behaviour/eventanalyse",
children: [
{
path: "eventanalyse",
name: "eventanalyse",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/behaviour/eventanalyse/eventanalyse.vue"
),
meta: { title: "事件分析" },
},
{
path: "product",
name: "product",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/behaviour/product/product.vue"
),
meta: { title: "产品热力图" },
},
{
path: "pageanalyse",
name: "pageanalyse",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/behaviour/pageanalyse/pageAnalyse.vue"
),
meta: { title: "页面访问分析" },
},
{
path: "pathanalyse",
name: "pathanalyse",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/behaviour/pathanalyse/pathAnalyse.vue"
),
meta: { title: "路径分析" },
},
{
path: "usinghabit",
name: "usinghabit",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/behaviour/usinghabit/usinghabit.vue"
),
meta: { title: "使用习惯" },
},
{
path: "information",
name: "information",
component: () =>
import(
/* webpackChunkName: "dataActuary" */ "@/views/dataActuary/behaviour/information/information.vue"
),
meta: { title: "信息流分析" },
},
],
},
{ {
path: "thePlatformIsSet", path: "thePlatformIsSet",
name: "thePlatformIsSet", name: "thePlatformIsSet",
......
import Heatmap from 'heatmap.js';
// import 'heatmap.js/plugins/heatmap.canvas.js';
// import 'heatmap.js/plugins/heatmap-gradient.js';
// import 'heatmap.js/plugins/heatmap-data-urls.js';
// import 'heatmap.js/plugins/leaflet-heatmap/leaflet-heatmap.js';
// import 'leaflet-heatmap/dist/leaflet-heatmap.css';
export default {
install(Vue, options) {
const heatmapContainer = document.createElement('div');
heatmapContainer.id = 'heatmap-container';
heatmapContainer.style.display = 'none';
document.body.appendChild(heatmapContainer);
const heatmapConfig = {
radius: options.radius || 30,
maxOpacity: options.maxOpacity || 0.8,
minOpacity: options.minOpacity || 0.2,
blur: options.blur || 0.85,
gradient: options.gradient || {
0.45: 'rgb(0,0,255)',
0.55: 'rgb(0,255,255)',
0.65: 'rgb(0,255,0)',
0.95: 'yellow',
1.0: 'rgb(255,0,0)',
},
};
const heatmapInstance = Heatmap.create({
container: heatmapContainer,
radius: heatmapConfig.radius,
maxOpacity: heatmapConfig.maxOpacity,
minOpacity: heatmapConfig.minOpacity,
blur: heatmapConfig.blur,
gradient: heatmapConfig.gradient,
height:1080,
width:1920
});
Vue.prototype.$heatmap = function(data) {
heatmapInstance.setData(data);
heatmapContainer.style.display = 'block';
setTimeout(() => {
heatmapContainer.style.display = 'none';
}, options.duration || 3000);
};
},
};
\ No newline at end of file
<template>
<!-- 事件分析 -->
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div class="main">
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }">
</a-table>
</div>
</div>
</template>
<script>
export default {
data() {
return {
queryform: {
value: null
},
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
columns: [{
title: "序号",
width: "70px",
customRender: (text, record, index) => `${index+1}`,
align: "center",
},
{
title: "事件",
dataIndex: "title",
align: "center",
},
{
title: '事件ID',
dataIndex: 'address',
align: "center",
},
{
title: '事件数量(日均)',
dataIndex: 'address1',
align: "center",
},
{
title: '事件平均使用时长(单次)',
dataIndex: 'address2',
align: "center",
}
],
data: []
}
}
};
</script>
<style lang="less" scoped>
.page{
padding: 15px;
}
</style>
\ No newline at end of file
<template>
<!-- 信息流分析 -->
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择一级场景">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择二级场景">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择三级场景">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div class="table-box">
<div class="mb">
<span style="margin-right: 30px;">指标筛选</span>
<a-checkbox-group v-model="queryform.value">
<a-checkbox value="1">访问人数</a-checkbox>
<a-checkbox value="2">打开次数</a-checkbox>
<a-checkbox value="3">访问页面数</a-checkbox>
</a-checkbox-group>
</div>
<div class="mb">
<span style="margin-right: 30px;">对比筛选</span>
<a-checkbox-group v-model="queryform.value">
<a-checkbox value="1">日对比</a-checkbox>
</a-checkbox-group>
</div>
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }" :pagination="pagination">
</a-table>
</div>
</div>
</template>
<script>
export default {
data() {
return {
queryform: {
value: null
},
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
columns: [{
title: "序号",
width: "70px",
customRender: (text, record, index) => `${index+1}`,
align: "center",
},
{
title: "时间",
dataIndex: "title",
align: "center",
},
{
title: '产品名称',
dataIndex: 'address',
align: "center",
},
{
title: '一级场景',
dataIndex: 'address1',
align: "center",
},
{
title: '二级场景',
dataIndex: 'address2',
align: "center",
},
{
title: '三级场景',
dataIndex: 'address3',
align: "center",
},{
title: '访问人数',
dataIndex: 'address5',
align: "center",
},{
title: '打开次数',
dataIndex: 'address4',
align: "center",
},{
title: '访问页面数',
dataIndex: 'address8',
align: "center",
}
],
data: [],
pagination: {
total: 0,
pageSize: 10, //每页中显示10条数据
showSizeChanger: true,
pageSizeOptions: ["10", "20", "50", "100"], //每页中显示的数据
showTotal: total => `共有 ${total} 条数据`, //分页中显示总的数据
},
}
}
};
</script>
<style lang="less" scoped>
.page {
height: calc(100% - 50px);
display: flex;
flex-direction: column;
/deep/.ant-form {
padding: 15px;
}
.table-box {
padding: 0 15px;
.mb{
margin-bottom: 20px;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="Container">
<div class="main">
<a-tabs v-model="tabsActive" @change="tabsChange" :forceRender="false">
<a-tab-pane
:key="item.path"
v-for="item of tabsList['children']"
:tab="item['meta']['title']"
>
</a-tab-pane>
</a-tabs>
<router-view />
</div>
</div>
</template>
<script>
import { getItemData } from "@/utils/js/common.js";
import common from "@/mixins/common";
export default {
mixins: [common],
data() {
return {
tabsActive: undefined,
};
},
computed: {
tabsList() {
console.log(
getItemData(this.$router.options.routes, "name", "behaviour")
);
return getItemData(this.$router.options.routes, "name", "behaviour");
},
},
mounted() {
this.$nextTick(() => {
this.tabsActive = this.$route.path.substr(
this.$route.path.lastIndexOf("/") + 1
);
});
},
methods: {
tabsChange(val) {
this.$router.push({
path: val,
// query: { testoption: "test001" },
});
},
},
};
</script>
<style lang="less" scoped>
@headerH: 4.5rem;
.Container {
height: 100% !important;
// background: #fac;
background: #f5f5f5;
display: flex;
flex-direction: column;
.main {
// background: #afc;
background: #ffffff;
border-radius: 6px;
flex: 1;
overflow-y: auto;
overflow-x: hidden;
margin: 1.2rem 2rem;
}
&::before {
content: "";
display: block;
width: 100%;
height: @headerH;
background: rgb(59, 135, 255);
background: -moz-linear-gradient(
174deg,
rgba(59, 135, 255, 1) 24%,
rgba(108, 53, 247, 1) 85%
);
background: -webkit-linear-gradient(
174deg,
rgba(59, 135, 255, 1) 24%,
rgba(108, 53, 247, 1) 85%
);
background: linear-gradient(
174deg,
rgba(59, 135, 255, 1) 24%,
rgba(108, 53, 247, 1) 85%
);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#3b87ff",endColorstr="#6c35f7",GradientType=1);
}
/deep/.ant-tabs-nav {
.ant-tabs-tab {
margin: 0 !important;
}
}
/deep/.ant-tabs-tab {
font-size: 1rem !important;
& + .ant-tabs-tab {
margin: 0 !important;
margin-left: 0.7rem !important;
}
}
/deep/.ant-tabs-bar{
margin: 0;
}
}
</style>
<template>
<!-- 页面分析 -->
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div class="box">
<div class="left-dv">
<div>页面访问指标趋势</div>
<div class="txt-dv">
<div>
<div class="num">4058</div>
<div>页面累计访问次数</div>
</div>
<div>
<div class="num">4058</div>
<div>日均访问次数</div>
</div>
</div>
<div id="number"></div>
</div>
<div class="right-dv">
<div class="page-box">
<div class="page-dv">
<div>人均访问深度</div>
<div class="page-num">4.00页</div>
</div>
<div class="page-dv">
<div>次均访问深度</div>
<div class="page-num">4.00页</div>
</div>
</div>
<div class="chatrs-dv">
<div>页面访问次数TOP10</div>
<div id="pages"></div>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts'
export default {
data() {
return {
queryform: {
value: null
},
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
}
},
mounted() {
this.initLine()
this.initBar()
},
methods: {
initBar() {
let chartDom = document.getElementById('pages')
let myChart = echarts.init(chartDom);
myChart.setOption({
legend: {
bottom: 0,
itemWidth:10,
itemHeight:10
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
color:['#29D090'],
grid: {
top:'3%',
left: '3%',
right: '3%',
bottom: '10%',
containLabel: true
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.01]
},
yAxis: {
type: 'category',
data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World'],
axisTick: {
show: false
}
},
series: [{
name: '访问次数',
type: 'bar',
data: [18203, 23489, 29034, 104970, 131744, 630230],
barWidth:10
}
]
})
},
initLine() {
let chartDom = document.getElementById('number')
let myChart = echarts.init(chartDom);
myChart.setOption({
legend: {
bottom: 0
},
grid: {
left: '10%',
rigth: 0,
top: '5%',
bottom: '15%'
},
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
axisTick: {
show: false
}
},
yAxis: {
type: 'value'
},
series: [{
name: '页面访问次数',
data: [150, 230, 224, 218, 135, 147, 260],
type: 'line',
markLine: {
data: [{
type: 'average',
name: '均值'
}],
label: {
position: 'insideStartTop',
formatter: '{b}:{c}'
}
}
}]
})
}
}
};
</script>
<style lang="less" scoped>
.page {
height: calc(100% - 50px);
/deep/.ant-form {
padding: 15px;
border-bottom: solid 1px #efefef;
}
.box {
height: calc(100% - 70px);
display: flex;
.left-dv {
width: 55%;
min-height: 100%;
border-right: solid 1px #efefef;
padding: 15px;
.txt-dv {
display: flex;
justify-content: space-around;
margin: 50px;
text-align: center;
.num {
font-size: 24px;
margin-bottom: 10px;
}
}
#number {
height: 350px;
}
}
.right-dv {
flex: 1;
padding: 15px;
.page-box {
display: flex;
justify-content: space-between;
margin: 20px 0;
.page-dv {
width: calc(50% - 15px);
height: 140px;
background-color: #F5FAFF;
padding: 30px;
box-sizing: border-box;
.page-num {
font-size: 24px;
margin-top: 20px;
}
}
}
.chatrs-dv {
padding: 20px;
background-color: #F6FBF7;
}
#pages {
height: 290px;
}
}
}
}
</style>
\ No newline at end of file
<template>
<!-- 路径分析 -->
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div id="path"></div>
</div>
</template>
<script>
import * as echarts from 'echarts'
export default {
data() {
return {
queryform: {
value: null
},
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
}
},
mounted() {
this.init()
},
methods: {
init() {
let chartDom = document.getElementById('path')
let myChart = echarts.init(chartDom);
myChart.setOption({
series: {
type: 'sankey',
layout: 'none',
emphasis: {
focus: 'adjacency'
},
color:['#FFCAC4','#6D86DE','#409AFE','#4DB3EA','#07CF8C'],
nodeWidth:10,
data: [{
name: 'a'
},
{
name: 'b'
},
{
name: 'a1'
},
{
name: 'a2'
},
{
name: 'b1'
},
{
name: 'c'
}
],
links: [{
source: 'a',
target: 'a1',
value: 5,
lineStyle:{
color:'source'
}
},
{
source: 'a',
target: 'a2',
value: 3,
lineStyle:{
color:'source'
}
},
{
source: 'b',
target: 'b1',
value: 8,
lineStyle:{
color:'source'
}
},
{
source: 'a',
target: 'b1',
value: 3,
lineStyle:{
color:'source'
}
},
{
source: 'b1',
target: 'a1',
value: 1,
lineStyle:{
color:'source'
}
},
{
source: 'b1',
target: 'c',
value: 2,
lineStyle:{
color:'source'
}
}
]
}
})
}
}
};
</script>
<style lang="less" scoped>
.page{
height: calc(100% - 50px);
display: flex;
flex-direction: column;
/deep/.ant-form {
padding: 15px;
}
#path{
flex: 1;
width: 70%;
margin: 0 auto;
}
}
</style>
\ No newline at end of file
<template>
<!-- 产品分析 -->
<div class="page">
<div class="img-dv">
<div id="queuing" @click="clickEvent"></div>
</div>
<div class="list-dv">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 180px" placeholder="选择产品">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
</a-form-model-item>
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 390px" placeholder="选择产品">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div class="main">
<div class="total-dv">
<div>总点击次数</div>
<div>312321</div>
</div>
<div style="margin-bottom: 20px;">事件排名Top10</div>
<a-table :columns="columns" :data-source="data" :scroll="{ y: 590 }">
</a-table>
</div>
</div>
</div>
</template>
<script>
import Heatmap from 'heatmap.js';
export default {
data() {
return {
queryform: {
value: null
},
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
columns: [{
title: "序号",
width: "70px",
customRender: (text, record, index) => `${index+1}`,
align: "center",
},
{
title: "事件",
dataIndex: "title",
align: "center",
},
{
title: '点击次数',
dataIndex: 'address',
align: "center",
},
{
title: '事件数量(日均)',
dataIndex: 'address1',
align: "center",
}
],
data: [],
heatmapInstance: null,
dataPoint: []
}
},
mounted() {
this.init('queuing')
},
methods: {
clickEvent(e) {
this.dataPoint.push({
x: e.layerX,
y: e.layerY,
value: 20
})
let data = {
max: 100,
min: 0,
data: this.dataPoint
};
this.heatmapInstance.setData(data);
},
init(el, dataPoint) {
let config = {
container: document.getElementById(el),
radius: 30,
maxOpacity: .8,
minOpacity: 0,
blur: .5
};
this.heatmapInstance = Heatmap.create(config);
}
}
};
</script>
<style lang="less" scoped>
.page {
width: 100%;
height: calc(100% - 50px);
display: flex;
.img-dv {
width: 60%;
min-height: 100%;
display: flex;
justify-content: center;
align-items: center;
#queuing {
width: 740px;
height: 370px;
background-image: url('https://cdn.pixabay.com/photo/2023/03/22/20/16/muffin-7870491_640.jpg');
background-size: 100% 100%;
}
}
.list-dv {
width: 40%;
min-height: 100%;
border-left: solid 1px #efefef;
box-sizing: border-box;
/deep/.ant-form {
padding: 15px;
border-bottom: solid 1px #efefef;
}
.main {
padding: 15px;
}
.total-dv {
display: flex;
justify-content: space-between;
padding: 20px 0;
}
}
}
</style>
\ No newline at end of file
<template>
<!-- 使用习惯分析 -->
<div class="page">
<a-form-model :model="queryform" :label-col="labelCol" :wrapper-col="wrapperCol" layout="inline">
<a-form-model-item>
<a-select v-model="queryform.value" style="width: 200px" placeholder="选择产品">
<a-select-option value="jack">
Jack
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item>
<a-range-picker valueFormat="yyyy-MM-DD" v-model="queryform.value" style="width: 300px" />
</a-form-model-item>
<a-form-model-item>
<a-button type="primary">
开始分析
</a-button>
</a-form-model-item>
</a-form-model>
<div class="charts-box">
<div id="canal"></div>
<div id="type"></div>
<div id="way"></div>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts'
export default {
data() {
return {
queryform: {
value: null
},
labelCol: {
span: 1
},
wrapperCol: {
span: 14
},
}
},
mounted() {
this.initCanal()
this.initType()
this.initWay()
},
methods: {
initWay(){
let chartDom = document.getElementById('way')
let myChart = echarts.init(chartDom);
myChart.setOption({
title: {
text: '取号方式分析',
left: 'center'
},
tooltip: {
trigger: 'item',
},
legend: {
bottom: 0,
left: 'center',
itemWidth: 10,
itemHeight: 10
},
color: ['#6395F9', '#64DAAB', '#647798', '#F6C02D', '#7567FA', '#75CBED'],
series: [{
name: 'Access From',
type: 'pie',
radius: '65%',
label: {
normal: {
formatter: '{d}%' //自定义显示格式(b:name, c:value, d:百分比)
}
},
labelLine: {
normal: {
length: 1
}
},
data: [{
value: 1048,
name: 'Search Engine'
},
{
value: 735,
name: 'Direct'
},
{
value: 580,
name: 'Email'
},
{
value: 484,
name: 'Union Ads'
},
{
value: 300,
name: 'Video Ads'
}
],
}]
})
},
initType() {
let chartDom = document.getElementById('type')
let myChart = echarts.init(chartDom);
myChart.setOption({
title: {
text: '取号类型分析',
left: 'center'
},
tooltip: {
trigger: 'item',
},
legend: {
bottom: 0,
left: 'center',
itemWidth: 10,
itemHeight: 10
},
color: ['#6395F9', '#64DAAB', '#647798', '#F6C02D', '#7567FA', '#75CBED'],
series: [{
name: 'Access From',
type: 'pie',
radius: '65%',
label: {
normal: {
formatter: '{d}%' //自定义显示格式(b:name, c:value, d:百分比)
}
},
labelLine: {
normal: {
length: 1
}
},
data: [{
value: 1048,
name: 'Search Engine'
},
{
value: 735,
name: 'Direct'
},
{
value: 580,
name: 'Email'
},
{
value: 484,
name: 'Union Ads'
},
{
value: 300,
name: 'Video Ads'
}
],
}]
})
},
initCanal() {
let chartDom = document.getElementById('canal')
let myChart = echarts.init(chartDom);
myChart.setOption({
title: {
text: '取号渠道分析',
left: 'center'
},
tooltip: {
trigger: 'item',
},
legend: {
bottom: 0,
left: 'center',
itemWidth: 10,
itemHeight: 10
},
color: ['#6395F9', '#64DAAB', '#647798', '#F6C02D', '#7567FA', '#75CBED'],
series: [{
name: 'Access From',
type: 'pie',
radius: '65%',
label: {
normal: {
formatter: '{d}%' //自定义显示格式(b:name, c:value, d:百分比)
}
},
labelLine: {
normal: {
length: 1
}
},
data: [{
value: 1048,
name: '终端取号'
},
{
value: 735,
name: '在线取号'
}
]
}]
})
}
}
};
</script>
<style lang="less" scoped>
.page {
height: calc(100% - 50px);
display: flex;
flex-direction: column;
/deep/.ant-form {
padding: 15px;
}
.charts-box {
flex: 1;
display: flex;
justify-content: space-between;
padding: 50px 0;
#canal,#type,#way {
width: 30%;
height: 100%;
}
}
}
</style>
\ No newline at end of file
...@@ -409,25 +409,24 @@ export default { ...@@ -409,25 +409,24 @@ export default {
5: "好差评", 5: "好差评",
6: "一体化评价", 6: "一体化评价",
}; };
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) { if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
this.tableSelectedRows.forEach((item) => { // 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => { Object.keys(obj).forEach((keys) => {
if (item.pjxt == keys) { if (item.pjxt == keys) {
item.pjxt = obj[keys]; item.pjxt = obj[keys];
} }
}); });
}); });
export2Excel(
this.tHeader,
this.filterVal,
this.tableSelectedRows,
"办事部门评价记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
} else { } else {
let data = await this.togetevalist({ data = this.$_.cloneDeep(
await this.togetevalist({
page: 1, page: 1,
size: -1, size: -1,
}); })
);
if (!data.length) return; if (!data.length) return;
for (let item of data) { for (let item of data) {
Object.keys(obj).forEach((key) => { Object.keys(obj).forEach((key) => {
...@@ -436,13 +435,13 @@ export default { ...@@ -436,13 +435,13 @@ export default {
} }
}); });
} }
}
export2Excel( export2Excel(
this.tHeader, this.tHeader,
this.filterVal, this.filterVal,
data, data,
"办事部门评价记录报表" + this.$moment().format("YYYYMMDDHHmmss") "办事部门评价记录报表" + this.$moment().format("YYYYMMDDHHmmss")
); );
}
this.btnLoading = false; this.btnLoading = false;
}, },
// 删除 // 删除
......
...@@ -412,25 +412,24 @@ export default { ...@@ -412,25 +412,24 @@ export default {
5: "好差评", 5: "好差评",
6: "一体化评价", 6: "一体化评价",
}; };
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) { if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
this.tableSelectedRows.forEach((item) => { // 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => { Object.keys(obj).forEach((keys) => {
if (item.pjxt == keys) { if (item.pjxt == keys) {
item.pjxt = obj[keys]; item.pjxt = obj[keys];
} }
}); });
}); });
export2Excel(
this.tHeader,
this.filterVal,
this.tableSelectedRows,
"办理事项评价记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
} else { } else {
let data = await this.togetevalist({ data = this.$_.cloneDeep(
await this.togetevalist({
page: 1, page: 1,
size: -1, size: -1,
}); })
);
if (!data.length) return; if (!data.length) return;
for (let item of data) { for (let item of data) {
Object.keys(obj).forEach((key) => { Object.keys(obj).forEach((key) => {
...@@ -439,13 +438,13 @@ export default { ...@@ -439,13 +438,13 @@ export default {
} }
}); });
} }
}
export2Excel( export2Excel(
this.tHeader, this.tHeader,
this.filterVal, this.filterVal,
data, data,
"办理事项评价记录报表" + this.$moment().format("YYYYMMDDHHmmss") "办理事项评价记录报表" + this.$moment().format("YYYYMMDDHHmmss")
); );
}
this.btnLoading = false; this.btnLoading = false;
}, },
// 删除 // 删除
......
...@@ -415,25 +415,24 @@ export default { ...@@ -415,25 +415,24 @@ export default {
5: "好差评", 5: "好差评",
6: "一体化评价", 6: "一体化评价",
}; };
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) { if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
this.tableSelectedRows.forEach((item) => { // 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => { Object.keys(obj).forEach((keys) => {
if (item.pjxt == keys) { if (item.pjxt == keys) {
item.pjxt = obj[keys]; item.pjxt = obj[keys];
} }
}); });
}); });
export2Excel(
this.tHeader,
this.filterVal,
this.tableSelectedRows,
"窗口服务评价记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
} else { } else {
let data = await this.togetevalist({ data = this.$_.cloneDeep(
await this.togetevalist({
page: 1, page: 1,
size: -1, size: -1,
}); })
);
if (!data.length) return; if (!data.length) return;
for (let item of data) { for (let item of data) {
Object.keys(obj).forEach((key) => { Object.keys(obj).forEach((key) => {
...@@ -442,13 +441,13 @@ export default { ...@@ -442,13 +441,13 @@ export default {
} }
}); });
} }
}
export2Excel( export2Excel(
this.tHeader, this.tHeader,
this.filterVal, this.filterVal,
data, data,
"窗口服务评价记录报表" + this.$moment().format("YYYYMMDDHHmmss") "窗口服务评价记录报表" + this.$moment().format("YYYYMMDDHHmmss")
); );
}
this.btnLoading = false; this.btnLoading = false;
}, },
// 删除 // 删除
......
...@@ -301,22 +301,21 @@ export default { ...@@ -301,22 +301,21 @@ export default {
1: "本地打印", 1: "本地打印",
2: "在线提交", 2: "在线提交",
}; };
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) { if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
this.tableSelectedRows.forEach((item) => { // 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => { Object.keys(obj).forEach((keys) => {
if (item.type == keys) { if (item.type == keys) {
item.type = obj[keys]; item.type = obj[keys];
} }
}); });
}); });
export2Excel(
this.tHeader,
this.filterVal,
this.tableSelectedRows,
"填单记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
} else { } else {
let data = await this.togetPrintList({ page: 1, size: -1 }); data = this.$_.cloneDeep(
await this.togetPrintList({ page: 1, size: -1 })
);
if (!data.length) return; if (!data.length) return;
for (let item of data) { for (let item of data) {
Object.keys(obj).forEach((key) => { Object.keys(obj).forEach((key) => {
...@@ -325,13 +324,13 @@ export default { ...@@ -325,13 +324,13 @@ export default {
} }
}); });
} }
}
export2Excel( export2Excel(
this.tHeader, this.tHeader,
this.filterVal, this.filterVal,
data, data,
"填单记录报表" + this.$moment().format("YYYYMMDDHHmmss") "填单记录报表" + this.$moment().format("YYYYMMDDHHmmss")
); );
}
this.btnLoading = false; this.btnLoading = false;
}, },
}, },
......
...@@ -8,50 +8,108 @@ ...@@ -8,50 +8,108 @@
<div class="top"> <div class="top">
<div class="info"> <div class="info">
<h1>预约信息</h1> <h1>预约信息</h1>
<p><span>预约编号:</span>A051511051332</p> <p><span>预约编号:</span>{{ orderInfo.number || "--" }}</p>
<p><span>预约人:</span>*黎</p> <p>
<p><span>手机号:</span>13080888888</p> <span>预约人:</span
<p><span>证件号码:</span>**********2112</p> >{{ (orderInfo.people && orderInfo.people.idcard_Name) || "--" }}
<p><span>预约时段:</span>2022-03-02 09:00:00</p> </p>
<p>
<span>手机号:</span
>{{ (orderInfo.people && orderInfo.people.phone) || "--" }}
</p>
<p>
<span>证件号码:</span
>{{
(orderInfo.people && orderInfo.people.idcard_IDCardNo) || "--"
}}
</p>
<p>
<span>预约时段:</span>{{ orderInfo.starttime }}~{{
orderInfo.endtime
}}
</p>
</div> </div>
<div class="qrcode"> <div class="qrcode">
<img src="~@/assets/images/logo.png" alt="" /> <!-- <img src="~@/assets/images/logo.png" alt="" />
<p>预约信息二维码</p> <p>预约信息二维码</p> -->
</div> </div>
</div> </div>
<ul class="bottom"> <ul class="bottom">
<li v-for="item of 4"> <li v-for="(v, key) of orderStatus" :key="key">
<p>0{{ item }}</p> <p>0{{ key }}</p>
<p>预约状态</p> <p>{{ v }}</p>
</li> </li>
</ul> </ul>
</div> </div>
<div class="right_"> <div class="right_">
<div class="box1"> <div class="box1">
<div class="left_"> <div class="left_">
<h1>生育业务</h1> <h1>{{ orderInfo.business || "--" }}</h1>
<p v-for="item of 3">事项1:生育证津贴办理</p> <!-- <p v-for="item of 3">事项1:生育证津贴办理</p> -->
</div> </div>
<div class="right_"> <div class="right_">
<span>未签到</span> <span class="status1" v-if="orderInfo.status != 1">未签到</span>
<span class="status2" v-else>排队中</span>
</div> </div>
</div> </div>
<div class="box2"> <div class="box2">
<h1>办理地点</h1> <h1>办理地点</h1>
<h2><span v-for="item of 3">办理地点:xxx政务服务中心</span></h2> <h2>
<h2><span v-for="item of 3">办理地点:xxx政务服务中心</span></h2> <span
>办理地点:{{
orderInfo.siteinfo && orderInfo.siteinfo.siteName
}}</span
>
<span
>办理窗口:{{
(orderInfo.window && orderInfo.window.join(",")) || "--"
}}</span
>
<span
>服务热线:{{
orderInfo.siteinfo && orderInfo.siteinfo.siteTel
}}</span
>
</h2>
<h2>
<span
>办理时间:{{
orderInfo.siteinfo &&
Number(orderInfo.siteinfo.amWorkStartTime) | times
}}
~
{{
orderInfo.siteinfo &&
Number(orderInfo.siteinfo.pmWorkEndTime) | times
}}</span
>
<span
>办理地址:{{
orderInfo.siteinfo && orderInfo.siteinfo.detailAddress
}}</span
>
</h2>
</div> </div>
<div class="box3"> <div class="box3">
<h1>签到信息</h1> <h1>签到信息</h1>
<h2><span v-for="item of 2">签到时间:2022-08-03 09:00:00</span></h2> <h2>
<span>签到时间:{{ orderInfo.taketime || "--" }}</span>
</h2>
<h2>
<span
>签到地址:{{
orderInfo.siteinfo && orderInfo.siteinfo.detailAddress
}}</span
>
</h2>
</div> </div>
</div> </div>
</div> </div>
<div class="footer"> <div class="footer">
<h1>操作信息</h1> <h1>操作信息</h1>
<h2> <h2>
<span>操作时间:2021-08-02 16:00:00</span> <span>操作时间:{{ orderInfo.create_time }}</span>
<span>预约方式:手机端预约系统 </span> <span>预约方式:-- </span>
<span>操作站点:-- </span> <span>操作站点:-- </span>
</h2> </h2>
</div> </div>
...@@ -59,16 +117,41 @@ ...@@ -59,16 +117,41 @@
</template> </template>
<script> <script>
import { getOrderinfo } from "@/api/dataAdmin";
let orderStatus = {
1: "预约成功",
2: "签到成功",
3: "办理中",
4: "完成",
};
let statusItem = {
0: "预约中",
1: "成功取号",
2: "超时未取号",
3: "预约取消",
};
export default { export default {
name: "PortalAdminVueRecordReportdetails", name: "PortalAdminVueRecordReportdetails",
data() { data() {
return {}; return {
orderStatus,
statusItem,
orderInfo: {}, // 预约信息
};
}, },
mounted() {}, created() {
this.getOrderinfo();
},
methods: {}, methods: {
async getOrderinfo() {
let id = this.$route.query.id;
let res = await getOrderinfo({ id });
this.orderInfo = res.data;
console.log(res.data);
},
},
}; };
</script> </script>
...@@ -236,13 +319,23 @@ export default { ...@@ -236,13 +319,23 @@ export default {
width: 100px; width: 100px;
line-height: 100px; line-height: 100px;
text-align: center; text-align: center;
border: 1px solid #fe8625;
border-radius: 50%; border-radius: 50%;
color: #fe8625;
font-weight: bold; font-weight: bold;
-webkit-transform: rotate(45deg); -webkit-transform: rotate(45deg);
transform: rotate(45deg); transform: rotate(45deg);
} }
.status1 {
color: #fe8625;
border: 1px solid #fe8625;
}
.status2 {
color: #1890ff;
border: 1px solid #1890ff;
}
.status3 {
color: #03d76f;
border: 1px solid #03d76f;
}
} }
} }
.box2 { .box2 {
......
<template> <template>
<div> <div>
<a-drawer title="用户详情" placement="right" :closable="false" :visible="visible" closable @close="onClose" <a-drawer
width="600"> title="用户详情"
:visible="visible"
width="600"
@close="Visible = false"
>
<div class="drawerMain"> <div class="drawerMain">
<div class="drawerMain-top"> <div class="drawerMain-top">
<a-avatar :size="64" icon="user" /> <a-avatar :size="64" icon="user" />
<div class="drawer-user"> <div class="drawer-user">
<span>NICKNAME</span> <span>{{ userInfo.nickname || "--" }}</span>
<span class="userTips">实名认证</span> <span class="userTips">实名认证</span>
<div class="userInfo"> <div class="userInfo">{{ userInfo.idcard_Sex }},四川,成都</div>
男,四川,成都
</div>
</div> </div>
<div class="someUserInfo"> <div class="someUserInfo">
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle">openid:</span> <span class="infoTitle">openid:</span>
<span class="infoContent">OPENID</span> <span class="infoContent">{{ userInfo.openid }}</span>
</div> </div>
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle">授权时间:</span> <span class="infoTitle">授权时间:</span>
<span class="infoContent">2022-11-07 16:00:00</span> <span class="infoContent">{{ userInfo.create_time }}</span>
</div> </div>
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle">最近访问时间:</span> <span class="infoTitle">最近访问时间:</span>
<span class="infoContent">2022-11-07 16:00:00</span> <span class="infoContent">{{ userInfo.last_time || "--" }}</span>
</div> </div>
</div> </div>
<a-divider /> <a-divider />
...@@ -34,25 +36,27 @@ ...@@ -34,25 +36,27 @@
</div> </div>
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle">姓名:</span> <span class="infoTitle">姓名:</span>
<span class="infoContent">刘德华</span> <span class="infoContent">{{ userInfo.idcard_Name }}</span>
</div> </div>
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle">身份证号:</span> <span class="infoTitle">身份证号:</span>
<span class="infoContent">513821199303021234</span> <span class="infoContent">{{ userInfo.idcard_IDCardNo }}</span>
</div> </div>
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle imgBox">身份证人像面:</span> <span class="infoTitle imgBox">身份证人像面:</span>
<span class="infoContent"> <span class="infoContent">
<img src="@/assets/images/logo.png" alt=""> <img v-if="userInfo.z_img" :src="userInfo.z_img" />
<span v-else>--</span>
</span> </span>
</div> </div>
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle imgBox">身份证国徽面:</span> <span class="infoTitle imgBox">身份证国徽面:</span>
<span class="infoContent"> <span class="infoContent">
<img src="@/assets/images/logo.png" alt=""> <img v-if="userInfo.b_img" :src="userInfo.z_img" />
<span v-else>--</span>
</span> </span>
</div> </div>
<div class="infoBox"> <!-- <div class="infoBox">
<span class="infoTitle">人脸认证:</span> <span class="infoTitle">人脸认证:</span>
<span class="infoContent"> <span class="infoContent">
<span class="state">已通过</span> <span class="state">已通过</span>
...@@ -61,14 +65,16 @@ ...@@ -61,14 +65,16 @@
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle">认证时间:</span> <span class="infoTitle">认证时间:</span>
<span class="infoContent">513821199303021234</span> <span class="infoContent">513821199303021234</span>
</div> </div> -->
</div> </div>
<a-divider /> <a-divider />
<div class="someUserInfo"> <!-- <div class="someUserInfo">
<b>区块链信息</b> <b>区块链信息</b>
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle">哈希值:</span> <span class="infoTitle">哈希值:</span>
<span class="infoContent">nd68as4d654q5w4d21ccx1cv5adsdaawqewd1c1c1zsda1s1gd2sa2</span> <span class="infoContent"
>nd68as4d654q5w4d21ccx1cv5adsdaawqewd1c1c1zsda1s1gd2sa2</span
>
</div> </div>
<div class="infoBox"> <div class="infoBox">
<span class="infoTitle">区块高度:</span> <span class="infoTitle">区块高度:</span>
...@@ -78,7 +84,7 @@ ...@@ -78,7 +84,7 @@
<span class="infoTitle">创建时间:</span> <span class="infoTitle">创建时间:</span>
<span class="infoContent">2022-11-07 16:00:00</span> <span class="infoContent">2022-11-07 16:00:00</span>
</div> </div>
</div> </div> -->
</div> </div>
</div> </div>
</a-drawer> </a-drawer>
...@@ -87,16 +93,33 @@ ...@@ -87,16 +93,33 @@
<script> <script>
export default { export default {
name:"FormDetails", name: "FormDetails",
props:{ props: {
visible:Boolean visible: {
type: Boolean,
required: true,
default: false,
}, },
methods:{ userInfo: {
onClose(){ type: Object,
this.$emit('onClose') required: true,
} default: () => {
} return {};
} },
},
},
computed: {
Visible: {
get() {
return this.visible;
},
set(val) {
this.$emit("update:visible", val);
},
},
},
methods: {},
};
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
...@@ -115,8 +138,8 @@ export default { ...@@ -115,8 +138,8 @@ export default {
position: absolute; position: absolute;
top: -2px; top: -2px;
display: inline-block; display: inline-block;
color: #1A7AF8; color: #1a7af8;
border: 1px solid #1A7AF8; border: 1px solid #1a7af8;
font-size: 12px; font-size: 12px;
border-radius: 4px; border-radius: 4px;
padding: 3px 6px; padding: 3px 6px;
...@@ -153,9 +176,9 @@ export default { ...@@ -153,9 +176,9 @@ export default {
.state { .state {
display: inline-block; display: inline-block;
padding: 0 6px; padding: 0 6px;
border: 1px solid #40A850; border: 1px solid #40a850;
border-radius: 4px; border-radius: 4px;
color: #40A850; color: #40a850;
} }
.imgBox { .imgBox {
...@@ -167,7 +190,6 @@ export default { ...@@ -167,7 +190,6 @@ export default {
width: auto; width: auto;
} }
} }
} }
} }
</style> </style>
\ No newline at end of file
...@@ -457,25 +457,24 @@ export default { ...@@ -457,25 +457,24 @@ export default {
1: "办理中", 1: "办理中",
4: "办理完成", 4: "办理完成",
}; };
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) { if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
this.tableSelectedRows.forEach((item) => { // 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => { Object.keys(obj).forEach((keys) => {
if (item.style == keys) { if (item.style == keys) {
item.style = obj[keys]; item.style = obj[keys];
} }
}); });
}); });
export2Excel(
this.tHeader,
this.filterVal,
this.tableSelectedRows,
"呼叫记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
} else { } else {
let data = await this.getCallQueListArr({ data = this.$_.cloneDeep(
await this.getCallQueListArr({
page: 1, page: 1,
size: -1, size: -1,
}); })
);
if (!data.length) return; if (!data.length) return;
for (let item of data) { for (let item of data) {
Object.keys(obj).forEach((key) => { Object.keys(obj).forEach((key) => {
...@@ -484,13 +483,13 @@ export default { ...@@ -484,13 +483,13 @@ export default {
} }
}); });
} }
}
export2Excel( export2Excel(
this.tHeader, this.tHeader,
this.filterVal, this.filterVal,
data, data,
"呼叫记录报表" + this.$moment().format("YYYYMMDDHHmmss") "呼叫记录报表" + this.$moment().format("YYYYMMDDHHmmss")
); );
}
this.btnLoading = false; this.btnLoading = false;
}, },
}, },
......
...@@ -451,22 +451,21 @@ export default { ...@@ -451,22 +451,21 @@ export default {
1: "办理中", 1: "办理中",
4: "办理完成", 4: "办理完成",
}; };
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) { if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
this.tableSelectedRows.forEach((item) => { // 深度克隆避免影响页面表格展示
data = this.$_.cloneDeep(this.tableSelectedRows);
data.forEach((item) => {
Object.keys(obj).forEach((keys) => { Object.keys(obj).forEach((keys) => {
if (item.style == keys) { if (item.style == keys) {
item.style = obj[keys]; item.style = obj[keys];
} }
}); });
}); });
export2Excel(
this.tHeader,
this.filterVal,
this.tableSelectedRows,
"排队记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
} else { } else {
let data = await this.getQueueDataArr({ page: 1, size: -1 }); data = this.$_.cloneDeep(
await this.getQueueDataArr({ page: 1, size: -1 })
);
if (!data.length) return; if (!data.length) return;
for (let item of data) { for (let item of data) {
Object.keys(obj).forEach((key) => { Object.keys(obj).forEach((key) => {
...@@ -475,13 +474,13 @@ export default { ...@@ -475,13 +474,13 @@ export default {
} }
}); });
} }
}
export2Excel( export2Excel(
this.tHeader, this.tHeader,
this.filterVal, this.filterVal,
data, data,
"排队记录报表" + this.$moment().format("YYYYMMDDHHmmss") "排队记录报表" + this.$moment().format("YYYYMMDDHHmmss")
); );
}
this.btnLoading = false; this.btnLoading = false;
}, },
}, },
......
...@@ -245,15 +245,14 @@ export default { ...@@ -245,15 +245,14 @@ export default {
// 导出 // 导出
async handleExportTable() { async handleExportTable() {
this.btnLoading = true; this.btnLoading = true;
let data = [];
if (this.tableSelectedKeys.length && this.tableSelectedRows.length) { if (this.tableSelectedKeys.length && this.tableSelectedRows.length) {
export2Excel( // 深度克隆避免影响页面表格展示
this.tHeader, data = this.$_.cloneDeep(this.tableSelectedRows);
this.filterVal,
this.tableSelectedRows,
"样表记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
} else { } else {
let data = await this.getBillList({ page: 1, size: -1 }); data = this.$_.cloneDeep(
await this.togetBillList({ page: 1, size: -1 })
);
if (!data.length) return; if (!data.length) return;
// for (let item of data) { // for (let item of data) {
// Object.keys(obj).forEach((key) => { // Object.keys(obj).forEach((key) => {
...@@ -262,13 +261,13 @@ export default { ...@@ -262,13 +261,13 @@ export default {
// } // }
// }); // });
// } // }
}
export2Excel( export2Excel(
this.tHeader, this.tHeader,
this.filterVal, this.filterVal,
data, data,
"样表记录报表" + this.$moment().format("YYYYMMDDHHmmss") "样表记录报表" + this.$moment().format("YYYYMMDDHHmmss")
); );
}
this.btnLoading = false; this.btnLoading = false;
}, },
}, },
......
This diff is collapsed.
...@@ -4610,6 +4610,108 @@ msg|String|消息|- ...@@ -4610,6 +4610,108 @@ msg|String|消息|-
``` ```
## 用户行为分析
### 客户端埋点
**请求URL:** page/bury/save
**请求方式:** POST
**内容类型:** application/json;charset=utf-8
**简要描述:** 保存或更新页面事件记录:id为空时为新增保存,否则为更新提交
**请求参数:**
参数名称|类型|必填|描述
:---|:---|:---|:-------
productId|Long|否|产品id
productName|String|否|产品名称
pageCode|String|否|页面编码(页面路由)
pageName|String|否|页面名称
sceneDepth|Integer|否|场景维度
depthValue|Integer|否|本次访问深度
eventInfo|object|否|页面事件信息
&emsp;businessCode|String|否|业务场景编码
&emsp;businessName|String|否|业务场景名称
&emsp;eventCode|String|否|事件编码
&emsp;eventName|String|否|事件名称
&emsp;takeTime|Integer|否|事件耗时(单位毫秒)
&emsp;coordinate|String|否|事件坐标(x,y)
routeInfo|object|否|页面路由信息
&emsp;sourceCode|String|否|开始页面编码(路由)
&emsp;sourceName|String|否|开始页面名称
&emsp;targetCode|String|否|目标页面编码(路由)
&emsp;targetName|String|否|目标页面名称
**请求样例:**
```
{
"productId": 7146,
"productName": "5x2mfa",
"pageCode": "gy92kw",
"pageName": "yxjkem",
"sceneDepth": 1,
"depthValue": 1,
"eventInfo": {
"businessCode": "hq6abb",
"businessName": "8996vc",
"eventCode": "u9xo59",
"eventName": "ku7l71",
"takeTime": 12345,
"coordinate": "12,13"
},
"routeInfo": {
"sourceCode": "6mq7ry",
"sourceName": "fxb3mk",
"targetCode": "fzrr3u",
"targetName": "fzrr3u"
}
}
```
**响应参数:**
参数名称 |参数类型|描述
:---|:---|:------
code|Integer|结果码(-1.失败,1.成功)
msg|String|消息
data|object|数据对象
&emsp;productId|Long|产品id
&emsp;productName|String|产品名称
&emsp;pageCode|String|页面编码(页面路由)
&emsp;pageName|String|页面名称
&emsp;sceneDepth|Integer|场景维度
&emsp;depthValue|Integer|本次访问深度
&emsp;eventInfo|object|页面事件信息
&emsp;&emsp;businessCode|String|业务场景编码
&emsp;&emsp;businessName|String|业务场景名称
&emsp;&emsp;eventCode|String|事件编码
&emsp;&emsp;eventName|String|事件名称
&emsp;&emsp;takeTime|Integer|事件耗时(单位毫秒)
&emsp;&emsp;coordinate|String|事件坐标(x,y)
&emsp;routeInfo|object|页面路由信息
&emsp;&emsp;sourceCode|String|开始页面编码(路由)
&emsp;&emsp;sourceName|String|开始页面名称
&emsp;&emsp;targetCode|String|目标页面编码(路由)
&emsp;&emsp;targetName|String|目标页面名称
**响应消息样例:**
```
{
"msg":"新增模块成功",
"code":1,
"data":{}
}
}
```
## 字典附录 ## 字典附录
### userType ### userType
字典参数key|字典参数值|其它 字典参数key|字典参数值|其它
......
package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import java.util.List;
/**
* 产品页面配置Dao
* 产品页面配置 DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
public interface PageAccessDao extends ICRUDDao<PageAccessEntity,Long>{
}
package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
import java.util.List;
/**
* 产品页面配置Dao
* 产品页面配置 DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
public interface PageAccessDepthDao extends ICRUDDao<PageAccessDepthEntity,Long>{
}
package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageEventEntity;
import java.util.List;
/**
* 页面事件记录Dao
* 页面事件记录 DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
public interface PageEventDao extends ICRUDDao<PageEventEntity,Long>{
}
package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageInfoEntity;
import java.util.List;
/**
* 产品页面配置Dao
* 产品页面配置 DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
public interface PageInfoDao extends ICRUDDao<PageInfoEntity,Long>{
}
package com.mortals.xhx.module.page.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import java.util.List;
/**
* 页面路径记录Dao
* 页面路径记录 DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
public interface PageRouteDao extends ICRUDDao<PageRouteEntity,Long>{
}
package com.mortals.xhx.module.page.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageAccessDao;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 产品页面配置DaoImpl DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
@Repository("pageAccessDao")
public class PageAccessDaoImpl extends BaseCRUDDaoMybatis<PageAccessEntity,Long> implements PageAccessDao {
}
package com.mortals.xhx.module.page.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageAccessDepthDao;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 产品页面配置DaoImpl DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
@Repository("pageAccessDepthDao")
public class PageAccessDepthDaoImpl extends BaseCRUDDaoMybatis<PageAccessDepthEntity,Long> implements PageAccessDepthDao {
}
package com.mortals.xhx.module.page.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageEventDao;
import com.mortals.xhx.module.page.model.PageEventEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 页面事件记录DaoImpl DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
@Repository("pageEventDao")
public class PageEventDaoImpl extends BaseCRUDDaoMybatis<PageEventEntity,Long> implements PageEventDao {
}
package com.mortals.xhx.module.page.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageInfoDao;
import com.mortals.xhx.module.page.model.PageInfoEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 产品页面配置DaoImpl DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
@Repository("pageInfoDao")
public class PageInfoDaoImpl extends BaseCRUDDaoMybatis<PageInfoEntity,Long> implements PageInfoDao {
}
package com.mortals.xhx.module.page.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.page.dao.PageRouteDao;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 页面路径记录DaoImpl DAO接口
*
* @author zxfei
* @date 2023-04-10
*/
@Repository("pageRouteDao")
public class PageRouteDaoImpl extends BaseCRUDDaoMybatis<PageRouteEntity,Long> implements PageRouteDao {
}
package com.mortals.xhx.module.page.model;
import java.util.List;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.vo.PageAccessDepthVo;
/**
* 产品页面配置实体对象
*
* @author zxfei
* @date 2023-04-10
*/
public class PageAccessDepthEntity extends PageAccessDepthVo {
private static final long serialVersionUID = 1L;
/**
* 产品id
*/
private Long productId;
/**
* 产品名称
*/
private String productName;
/**
* 页面编码(页面路由)
*/
private String pageCode;
/**
* 页面名称
*/
private String pageName;
/**
* 本次访问深度
*/
private Integer depthValue;
public PageAccessDepthEntity(){}
/**
* 获取 产品id
* @return Long
*/
public Long getProductId(){
return productId;
}
/**
* 设置 产品id
* @param productId
*/
public void setProductId(Long productId){
this.productId = productId;
}
/**
* 获取 产品名称
* @return String
*/
public String getProductName(){
return productName;
}
/**
* 设置 产品名称
* @param productName
*/
public void setProductName(String productName){
this.productName = productName;
}
/**
* 获取 页面编码(页面路由)
* @return String
*/
public String getPageCode(){
return pageCode;
}
/**
* 设置 页面编码(页面路由)
* @param pageCode
*/
public void setPageCode(String pageCode){
this.pageCode = pageCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getPageName(){
return pageName;
}
/**
* 设置 页面名称
* @param pageName
*/
public void setPageName(String pageName){
this.pageName = pageName;
}
/**
* 获取 本次访问深度
* @return String
*/
public Integer getDepthValue(){
return depthValue;
}
/**
* 设置 本次访问深度
* @param depthValue
*/
public void setDepthValue(Integer depthValue){
this.depthValue = depthValue;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof PageAccessDepthEntity) {
PageAccessDepthEntity tmp = (PageAccessDepthEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName());
sb.append(",pageCode:").append(getPageCode());
sb.append(",pageName:").append(getPageName());
sb.append(",depthValue:").append(getDepthValue());
return sb.toString();
}
public void initAttrValue(){
this.productId = null;
this.productName = "";
this.pageCode = "";
this.pageName = "";
this.depthValue = null;
}
}
\ No newline at end of file
package com.mortals.xhx.module.page.model;
import java.util.List;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.vo.PageAccessVo;
/**
* 产品页面配置实体对象
*
* @author zxfei
* @date 2023-04-10
*/
public class PageAccessEntity extends PageAccessVo {
private static final long serialVersionUID = 1L;
/**
* 产品id
*/
private Long productId;
/**
* 产品名称
*/
private String productName;
/**
* 页面编码(页面路由)
*/
private String pageCode;
/**
* 页面名称
*/
private String pageName;
/**
* 场景维度
*/
private Integer sceneDepth;
public PageAccessEntity(){}
/**
* 获取 产品id
* @return Long
*/
public Long getProductId(){
return productId;
}
/**
* 设置 产品id
* @param productId
*/
public void setProductId(Long productId){
this.productId = productId;
}
/**
* 获取 产品名称
* @return String
*/
public String getProductName(){
return productName;
}
/**
* 设置 产品名称
* @param productName
*/
public void setProductName(String productName){
this.productName = productName;
}
/**
* 获取 页面编码(页面路由)
* @return String
*/
public String getPageCode(){
return pageCode;
}
/**
* 设置 页面编码(页面路由)
* @param pageCode
*/
public void setPageCode(String pageCode){
this.pageCode = pageCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getPageName(){
return pageName;
}
/**
* 设置 页面名称
* @param pageName
*/
public void setPageName(String pageName){
this.pageName = pageName;
}
/**
* 获取 场景维度
* @return Integer
*/
public Integer getSceneDepth(){
return sceneDepth;
}
/**
* 设置 场景维度
* @param sceneDepth
*/
public void setSceneDepth(Integer sceneDepth){
this.sceneDepth = sceneDepth;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof PageAccessEntity) {
PageAccessEntity tmp = (PageAccessEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName());
sb.append(",pageCode:").append(getPageCode());
sb.append(",pageName:").append(getPageName());
sb.append(",sceneDepth:").append(getSceneDepth());
return sb.toString();
}
public void initAttrValue(){
this.productId = null;
this.productName = "";
this.pageCode = "";
this.pageName = "";
this.sceneDepth = 0;
}
}
\ No newline at end of file
package com.mortals.xhx.module.page.model;
import java.util.List;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.vo.PageInfoVo;
/**
* 产品页面配置实体对象
*
* @author zxfei
* @date 2023-04-10
*/
public class PageInfoEntity extends PageInfoVo {
private static final long serialVersionUID = 1L;
/**
* 产品id
*/
private Long productId;
/**
* 产品名称
*/
private String productName;
/**
* 页面编码(页面路由)
*/
private String pageCode;
/**
* 页面名称
*/
private String pageName;
/**
* 页面截图地址
*/
private String screenUrl;
public PageInfoEntity(){}
/**
* 获取 产品id
* @return Long
*/
public Long getProductId(){
return productId;
}
/**
* 设置 产品id
* @param productId
*/
public void setProductId(Long productId){
this.productId = productId;
}
/**
* 获取 产品名称
* @return String
*/
public String getProductName(){
return productName;
}
/**
* 设置 产品名称
* @param productName
*/
public void setProductName(String productName){
this.productName = productName;
}
/**
* 获取 页面编码(页面路由)
* @return String
*/
public String getPageCode(){
return pageCode;
}
/**
* 设置 页面编码(页面路由)
* @param pageCode
*/
public void setPageCode(String pageCode){
this.pageCode = pageCode;
}
/**
* 获取 页面名称
* @return String
*/
public String getPageName(){
return pageName;
}
/**
* 设置 页面名称
* @param pageName
*/
public void setPageName(String pageName){
this.pageName = pageName;
}
/**
* 获取 页面截图地址
* @return String
*/
public String getScreenUrl(){
return screenUrl;
}
/**
* 设置 页面截图地址
* @param screenUrl
*/
public void setScreenUrl(String screenUrl){
this.screenUrl = screenUrl;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof PageInfoEntity) {
PageInfoEntity tmp = (PageInfoEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",productId:").append(getProductId());
sb.append(",productName:").append(getProductName());
sb.append(",pageCode:").append(getPageCode());
sb.append(",pageName:").append(getPageName());
sb.append(",screenUrl:").append(getScreenUrl());
return sb.toString();
}
public void initAttrValue(){
this.productId = null;
this.productName = "";
this.pageCode = "";
this.pageName = "";
this.screenUrl = "";
}
}
\ No newline at end of file
package com.mortals.xhx.module.page.model.pdu;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import com.mortals.xhx.module.page.model.PageEventEntity;
import com.mortals.xhx.module.page.model.PageRouteEntity;
import lombok.Data;
/***
* 页面数据埋点信息
*/
@Data
public class BuryPointPdu {
/*** 产品id */
private Long productId;
/*** 产品名称 */
private String productName;
/*** 页面编码(页面路由) */
private String pageCode;
/** 页面名称 */
private String pageName;
/*** 场景维度 */
private Integer sceneDepth;
/*** 本次访问深度 */
private Integer depthValue;
/** 产品页面访问深度 **/
private PageEventEntity eventInfo;
/** 产品页面访问深度 **/
private PageRouteEntity routeInfo;
}
package com.mortals.xhx.module.page.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.PageAccessDepthEntity;
import java.util.ArrayList;
import java.util.List;
/**
* 产品页面配置视图对象
*
* @author zxfei
* @date 2023-04-10
*/
public class PageAccessDepthVo extends BaseEntityLong {
}
\ No newline at end of file
package com.mortals.xhx.module.page.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.PageAccessEntity;
import java.util.ArrayList;
import java.util.List;
/**
* 产品页面配置视图对象
*
* @author zxfei
* @date 2023-04-10
*/
public class PageAccessVo extends BaseEntityLong {
}
\ No newline at end of file
package com.mortals.xhx.module.page.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.page.model.PageEventEntity;
import java.util.ArrayList;
import java.util.List;
/**
* 页面事件记录视图对象
*
* @author zxfei
* @date 2023-04-10
*/
public class PageEventVo extends BaseEntityLong {
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment