
7 changed files with 3898 additions and 7394 deletions
File diff suppressed because it is too large
After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,272 @@ |
|||
<template> |
|||
<aside class="sidebar"> |
|||
<ul> |
|||
<li v-for="(item, index) in menuList" :key="item.path"> |
|||
<div :class="[$route.path == item.path ? 'active' : '', 'flex', $route.path == item.path ? curIndex = index : '']" |
|||
@click="gotoPath(item.path,index)"> |
|||
<img v-if="$route.path == item.path" :src="item.imgActive" alt=""> |
|||
<img v-else :src="item.img" alt=""> |
|||
{{ item.name }} |
|||
</div> |
|||
<p :class="['flex', activeFloor == item1.desc ? 'curActive' : '']" |
|||
v-for="(item1) in item.list" @click="setActiveCur(item1.desc,item)" :key="item1.name">{{ item1.name }}</p> |
|||
</li> |
|||
</ul> |
|||
</aside> |
|||
</template> |
|||
|
|||
<script> |
|||
// :class="[$route.path != item.path ? 'not-point' : '', 'flex', activeFloor == item1.desc ? 'curActive' : '']" |
|||
import { mapState } from 'vuex'; |
|||
import store from '../../store'; |
|||
export default { |
|||
name: 'Sidebar', |
|||
props: { |
|||
// menuList: { |
|||
// type: Array, |
|||
// required: true |
|||
// }, |
|||
// activeFloor:{ |
|||
// type:String |
|||
// }, |
|||
// curIndex:{ |
|||
// type:Number |
|||
// } |
|||
}, |
|||
data() { |
|||
return { |
|||
activeFloor: null, |
|||
curIndex: 0, |
|||
scrollLock: false, |
|||
menuList: [ |
|||
{ |
|||
name: '总利润', |
|||
img: require('@/assets/super/ranking-menu.svg'), |
|||
imgActive: require('@/assets/super/ranking-menu.svg'), |
|||
list: [ |
|||
{ |
|||
name: '年排行', |
|||
path: '/super/ranking/yearProfit', |
|||
desc: 'siteMessage1' |
|||
}, |
|||
{ |
|||
name: '月排行', |
|||
path: '/super/ranking/yearProfit', |
|||
desc: 'siteMessage2' |
|||
}, |
|||
] |
|||
}, |
|||
{ |
|||
name: '产品', |
|||
img: require('@/assets/super/ranking-menu.svg'), |
|||
imgActive: require('@/assets/super/ranking-menu.svg'), |
|||
list: [ |
|||
{ |
|||
name: '毛利润排行', |
|||
path: '/super/ranking/yearProfit', |
|||
desc: 'siteMessage4' |
|||
}, |
|||
{ |
|||
name: '订单数排行', |
|||
path: '/super/ranking/yearProfit', |
|||
desc: 'siteMessage5' |
|||
}, |
|||
{ |
|||
name: '退单数排行', |
|||
path: '/super/ranking/yearProfit', |
|||
desc: 'siteMessage6' |
|||
}, |
|||
] |
|||
}, |
|||
{ |
|||
name: '代理商', |
|||
img: require('@/assets/super/ranking-menu.svg'), |
|||
imgActive: require('@/assets/super/ranking-menu.svg'), |
|||
list: [ |
|||
{ |
|||
name: '毛利润排行', |
|||
path: '/super/ranking/yearProfit', |
|||
desc: 'siteMessage9' |
|||
}, |
|||
{ |
|||
name: '充值排行', |
|||
path: '/super/ranking/yearProfit', |
|||
desc: 'siteMessage10' |
|||
}, |
|||
{ |
|||
name: '新加盟', |
|||
path: '/super/ranking/yearProfit', |
|||
desc: 'siteMessage11' |
|||
}, |
|||
] |
|||
}, |
|||
] |
|||
} |
|||
}, |
|||
mounted() { |
|||
// console.log(this.curIndex,'this.curIndex'); |
|||
this.activeFloor = this.menuList[this.curIndex]['list'][0]['desc']; |
|||
this.calculateFloorOffsets(); |
|||
this.$nextTick(() => { |
|||
// console.log(this.$parent.$refs.scrollContainer, 'this.$refs.scrollContainer--'); |
|||
}) |
|||
this.$parent.$refs.scrollContainer.addEventListener('scroll', this.handleScroll); |
|||
}, |
|||
created() { |
|||
// console.log(this.$parent.$refs.scrollContainer,'this.$refs.sc--rollContainer--'); |
|||
}, |
|||
computed: { |
|||
...mapState(['pageTitle']) // 从Vuex映射showSidebar状态到组件的计算属性中 |
|||
}, |
|||
beforeDestroy() { |
|||
this.$parent.$refs.scrollContainer.removeEventListener('scroll', this.handleScroll); |
|||
}, |
|||
methods: { |
|||
calculateFloorOffsets() { |
|||
this.menuList.forEach(item => { |
|||
item.list.forEach(every => { |
|||
const el = document.getElementById(every.desc); |
|||
if (el) { |
|||
every.offsetTop = el.offsetTop; |
|||
} |
|||
}) |
|||
}); |
|||
}, |
|||
handleScroll() { |
|||
if (this.scrollLock) return |
|||
const scrollContainer = this.$parent.$refs.scrollContainer; |
|||
const scrollHeight = scrollContainer.scrollTop; |
|||
let activeFloor = this.menuList[this.curIndex]['list'][0]['desc']; |
|||
this.menuList[this.curIndex]['list'].forEach(item => { |
|||
if (scrollHeight + 72 >= item.offsetTop) { |
|||
activeFloor = item.desc; // 更新当前激活的楼层ID |
|||
} else { |
|||
return false; // 一旦找到第一个小于当前滚动位置的楼层,停止循环 |
|||
} |
|||
}); |
|||
this.activeFloor = activeFloor; // 更新数据以触发视图更新 |
|||
}, |
|||
setActiveCur(dom,item) { |
|||
if(this.$route.path != item.path){ |
|||
this.$router.push(item.path) |
|||
store.commit('SET_PAGETITLE', item.name); |
|||
} |
|||
setTimeout(()=>{ |
|||
this.activeFloor = dom; |
|||
this.setHighActive(dom) |
|||
},500) |
|||
}, |
|||
gotoPath(path,index) { |
|||
if(this.$route.path != path){ |
|||
this.curIndex = index |
|||
this.scrollLock = false; |
|||
this.handleScroll() |
|||
// 重置页面滚动高度 |
|||
const dom = document.getElementById('main-content') |
|||
dom.scrollTop = 0 |
|||
this.$router.push(path) |
|||
} |
|||
}, |
|||
activeArea(type) { |
|||
console.log(type); |
|||
}, |
|||
setHighActive(dom) { |
|||
this.scrollLock = true; |
|||
const ele = document.getElementById(dom) |
|||
if(!ele)return |
|||
ele.classList.add('ceshi') |
|||
ele.scrollIntoView({ behavior: 'smooth', block: 'start' }) |
|||
setTimeout(() => { |
|||
ele.classList.remove('ceshi') |
|||
}, 1000) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang="scss"> |
|||
.sidebar { |
|||
width: 158px; |
|||
padding: 21px; |
|||
box-sizing: border-box; |
|||
background: #FFFFFF; |
|||
box-shadow: 0px 0px 11px 2px rgba(147, 147, 147, 0.11); |
|||
} |
|||
|
|||
.ceshi { |
|||
// animation: fadeInOut 2s infinite; |
|||
} |
|||
|
|||
ul { |
|||
list-style: none; |
|||
padding: 0; |
|||
} |
|||
|
|||
.not-point { |
|||
pointer-events: none; |
|||
/* 阻止鼠标事件 */ |
|||
opacity: 0.5; |
|||
/* 可选,降低透明度以视觉上表示不可用 */ |
|||
cursor: not-allowed; |
|||
/* 改变鼠标光标样式,表示不可用 */ |
|||
} |
|||
|
|||
li { |
|||
margin-bottom: 10px; |
|||
|
|||
div { |
|||
letter-spacing: 0.08em; |
|||
color: #1E2226; |
|||
margin: 11px 0; |
|||
cursor: pointer; |
|||
|
|||
img { |
|||
margin-right: 6px; |
|||
} |
|||
} |
|||
|
|||
p { |
|||
margin: 9px 0; |
|||
letter-spacing: 0.08em; |
|||
line-height: 18px; |
|||
color: #8A9099; |
|||
cursor: pointer; |
|||
|
|||
&:hover { |
|||
color: #006AFF; |
|||
} |
|||
} |
|||
|
|||
.curActive { |
|||
color: #006AFF; |
|||
} |
|||
} |
|||
|
|||
/* { |
|||
display: block; |
|||
padding: 8px 12px; |
|||
text-decoration: none; |
|||
color: #333; |
|||
border-radius: 4px; |
|||
} */ |
|||
/* |
|||
:hover { |
|||
background: #e0e0e0; |
|||
} */ |
|||
|
|||
.active { |
|||
font-weight: bold; |
|||
letter-spacing: 0.08em; |
|||
color: #006AFF; |
|||
} |
|||
|
|||
.item-active { |
|||
color: #006AFF; |
|||
} |
|||
|
|||
/* |
|||
.exact-active { |
|||
background: #1976d2; |
|||
color: white; |
|||
} */ |
|||
</style> |
@ -0,0 +1,54 @@ |
|||
<template> |
|||
<div class="siteSetting-wrap"> |
|||
<RankingLeftMenu /> |
|||
<!--:menuList="menuList" :activeFloor="activeFloor" :curIndex="curIndex" --> |
|||
<!-- 主内容区域 --> |
|||
<main class="main-content" ref="scrollContainer"> |
|||
<router-view></router-view> |
|||
<Footer></Footer> |
|||
</main> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
import Footer from '@/components/Footer.vue'; |
|||
import RankingLeftMenu from '@/components/super/RankingLeftMenu.vue' |
|||
export default { |
|||
// 站点设置 |
|||
name: '', |
|||
props: [''], |
|||
components: { |
|||
Footer, |
|||
RankingLeftMenu, |
|||
}, |
|||
data() { |
|||
return { |
|||
path:'' |
|||
} |
|||
}, |
|||
mounted(){ |
|||
this.path =this.$route.path; |
|||
console.log(this.$route.path,'090-9090'); |
|||
// this.$refs.scrollContainer.scrollTo(0) |
|||
}, |
|||
methods: { |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped lang="scss"> |
|||
.siteSetting-wrap { |
|||
display: flex; |
|||
height: 100%; |
|||
} |
|||
|
|||
// .sidebar { |
|||
// width: 250px; |
|||
// background: #f5f5f5; |
|||
// padding: 20px; |
|||
// } |
|||
|
|||
.main-content { |
|||
flex: 1; |
|||
padding: 12px; |
|||
overflow-y: auto; |
|||
} |
|||
</style> |
@ -0,0 +1,166 @@ |
|||
<template> |
|||
<div class="demo-wrap min-flex-right"> |
|||
<div class="flex-between"> |
|||
<h2>总利润 - 年排行</h2> |
|||
<el-form :model="form"> |
|||
<GuipSelect v-model="form.payword" :defaultValue="form.payword" prop="payword" width="100%" |
|||
:options="options_payword" /> |
|||
</el-form> |
|||
</div> |
|||
<div class=" flex-common" id=""> |
|||
<el-form> |
|||
<el-table :data="tableData.slice((currentPage - 1) * pageSize, currentPage * pageSize)" |
|||
style="width: 100%" :key="random()"> |
|||
<el-table-column type="index" label="排序" width="100"> |
|||
<template slot-scope="scope"> |
|||
{{ scope.row.sort }} |
|||
</template> |
|||
</el-table-column> |
|||
<!-- 其他列 --> |
|||
<el-table-column prop="name" label="年份"> |
|||
<template slot-scope="scope"> |
|||
{{ scope.row.value_1 }} |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="count" label="总利润/元" sortable> |
|||
<template slot-scope="scope"> |
|||
<div class="flex"> |
|||
{{ scope.row.value_2 }} |
|||
{{scope.row.value }}%上年持平 |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column prop="count" label="代理商排行"> |
|||
<template slot-scope="scope"> |
|||
<div class="flex"> |
|||
{{ scope.row.value_1 }} |
|||
<span class="flex"><img class="edit_icon" src="../../../assets/site/form_link.svg" alt=""></span> |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<el-pagination background @size-change='handleSizeChange' @current-change='handleCurrentChange' |
|||
:current-page="currentPage" :page-size=pageSize layout="prev, pager, next,jumper" |
|||
:total="tableData.length"> |
|||
</el-pagination> |
|||
</el-form> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
import GuipSelect from '@/components/GuipSelect.vue' |
|||
export default { |
|||
// 站点设置 |
|||
name: '', |
|||
props: [''], |
|||
components: { |
|||
GuipSelect, |
|||
// GuipSelectFilter, |
|||
}, |
|||
data() { |
|||
return { |
|||
phoneService: [ |
|||
{ |
|||
text: '不限', |
|||
value: '0' |
|||
}, |
|||
{ |
|||
text: 'H5', |
|||
value: '1' |
|||
}, |
|||
{ |
|||
text: '小程序', |
|||
value: '2' |
|||
}, |
|||
{ |
|||
text: 'H5以及小程序', |
|||
value: '3' |
|||
}, |
|||
], |
|||
currentPage: 1, //当前页 |
|||
pageSize: 20, //每页的容量 |
|||
total: 0, //列表总数 |
|||
options_payword: [ |
|||
{ |
|||
label: '按篇', value: '0' |
|||
}, |
|||
{ |
|||
label: '按字符', value: '1' |
|||
}, |
|||
], |
|||
options: [ |
|||
{ label: '选项1', value: '1' }, |
|||
{ label: '选项2', value: '2' }, |
|||
{ label: '选项3', value: '3' }, |
|||
// 更多选项... |
|||
], |
|||
filteredOptions: this.options, |
|||
|
|||
phoneServicelist: |
|||
{ |
|||
0: '不限', |
|||
1: ' H5', |
|||
2: '小程序', |
|||
3: '无手机服务' |
|||
|
|||
}, |
|||
tableData: [], |
|||
form: { |
|||
payword: '0', |
|||
} |
|||
} |
|||
}, |
|||
mounted() { |
|||
// this.$refs.scrollContainer.scrollTo(0) |
|||
this.getRankingData(); |
|||
}, |
|||
methods: { |
|||
getRankingData(){ |
|||
const that = this |
|||
this.$http('POST', this.reqUri + '/super/ajax_get_rank_detail',{ |
|||
rank_type:1, |
|||
}).then(response => { |
|||
that.tableData = response.data.list |
|||
console.log(response.data.list, '0001') |
|||
}) |
|||
.catch(error => { |
|||
console.error(error, '-----') |
|||
}) |
|||
}, |
|||
// 列筛选 |
|||
filterHandler(value, row, column) { |
|||
// console.log(value, row, column,'======'); |
|||
const property = column['property']; |
|||
if (value == 0) { |
|||
return row[property] != value |
|||
} |
|||
return row[property] === value; |
|||
}, |
|||
// 自定义搜索筛选 |
|||
customFilter(keyword, options) { |
|||
if (!keyword) return options |
|||
return options.filter(item => { |
|||
// 自定义筛选逻辑 |
|||
return item.label.includes(keyword) || item.value.includes(keyword) |
|||
}) |
|||
}, |
|||
handleSizeChange(val) { |
|||
this.pageSize = val |
|||
}, |
|||
handleCurrentChange(val) { |
|||
this.currentPage = val |
|||
}, |
|||
random() { |
|||
var randomNumber = Math.random(); |
|||
return randomNumber |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped lang="scss"> |
|||
.demo-wrap { |
|||
width: 100%; |
|||
letter-spacing: 0.08em; |
|||
} |
|||
</style> |
Loading…
Reference in new issue