提交 26984f6d authored 作者: 王鹏飞's avatar 王鹏飞

UI 2.0

上级 7a02fd42
...@@ -277,3 +277,8 @@ export function getMessage(id) { ...@@ -277,3 +277,8 @@ export function getMessage(id) {
export function readMessage(id) { export function readMessage(id) {
return httpRequest.post(`/api/alumni/v1/student/messages/read/${id}`) return httpRequest.post(`/api/alumni/v1/student/messages/read/${id}`)
} }
// 获取热门推荐
export function getPopular() {
return httpRequest.get('/api/alumni/v1/organization/recommend')
}
...@@ -92,9 +92,8 @@ html { ...@@ -92,9 +92,8 @@ html {
body { body {
font-size: 14px; font-size: 14px;
line-height: 1.4; line-height: 1.4;
color: #222; color: #1b1b1b;
font-family: -apple-system-font, 'Helvetica Neue', 'PingFang SC', font-family: -apple-system-font, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
background-color: #f4f4f4; background-color: #f4f4f4;
} }
input[type='search']::-webkit-search-cancel-button { input[type='search']::-webkit-search-cancel-button {
...@@ -124,11 +123,7 @@ input[type='search']::-webkit-search-cancel-button { ...@@ -124,11 +123,7 @@ input[type='search']::-webkit-search-cancel-button {
line-height: 40px; line-height: 40px;
text-align: center; text-align: center;
color: #fff; color: #fff;
background: linear-gradient( background: #af1b40;
180deg,
rgba(255, 201, 44, 1) 0%,
rgba(255, 116, 42, 1) 100%
);
border-radius: 20px; border-radius: 20px;
cursor: pointer; cursor: pointer;
} }
...@@ -139,17 +134,14 @@ input[type='search']::-webkit-search-cancel-button { ...@@ -139,17 +134,14 @@ input[type='search']::-webkit-search-cancel-button {
line-height: 40px; line-height: 40px;
text-align: center; text-align: center;
color: #fff; color: #fff;
background: linear-gradient( background: #af1b40;
180deg,
rgba(255, 201, 44, 1) 0%,
rgba(255, 116, 42, 1) 100%
);
border-radius: 20px; border-radius: 20px;
cursor: pointer; cursor: pointer;
} }
.empty { .empty {
margin-top: 50px; margin: 20px 0;
padding-top: 170px; padding-top: 170px;
padding-bottom: 20px;
font-size: 14px; font-size: 14px;
color: #999; color: #999;
background: url('~@/assets/img/icon_empty.png') no-repeat center top; background: url('~@/assets/img/icon_empty.png') no-repeat center top;
...@@ -201,7 +193,7 @@ input[type='search']::-webkit-search-cancel-button { ...@@ -201,7 +193,7 @@ input[type='search']::-webkit-search-cancel-button {
border-color: #f1f1f1; border-color: #f1f1f1;
} }
.van-tabs__line { .van-tabs__line {
background-color: #ff6767; background-color: #af1b40;
} }
.van-popup--bottom { .van-popup--bottom {
...@@ -224,7 +216,7 @@ input[type='search']::-webkit-search-cancel-button { ...@@ -224,7 +216,7 @@ input[type='search']::-webkit-search-cancel-button {
} */ } */
.main { .main {
margin: 0 20px; margin: 0 15px;
} }
.main::after { .main::after {
content: ''; content: '';
......
src/assets/img/my_message.png

959 Bytes | W: | H:

src/assets/img/my_message.png

1.1 KB | W: | H:

src/assets/img/my_message.png
src/assets/img/my_message.png
src/assets/img/my_message.png
src/assets/img/my_message.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/img/my_settings.png

1.4 KB | W: | H:

src/assets/img/my_settings.png

1.2 KB | W: | H:

src/assets/img/my_settings.png
src/assets/img/my_settings.png
src/assets/img/my_settings.png
src/assets/img/my_settings.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/img/tab_home.png

1.6 KB | W: | H:

src/assets/img/tab_home.png

902 Bytes | W: | H:

src/assets/img/tab_home.png
src/assets/img/tab_home.png
src/assets/img/tab_home.png
src/assets/img/tab_home.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/img/tab_home_hover.png

1.8 KB | W: | H:

src/assets/img/tab_home_hover.png

619 Bytes | W: | H:

src/assets/img/tab_home_hover.png
src/assets/img/tab_home_hover.png
src/assets/img/tab_home_hover.png
src/assets/img/tab_home_hover.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/img/tab_my.png

1.6 KB | W: | H:

src/assets/img/tab_my.png

1.1 KB | W: | H:

src/assets/img/tab_my.png
src/assets/img/tab_my.png
src/assets/img/tab_my.png
src/assets/img/tab_my.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/img/tab_my_hover.png

1.7 KB | W: | H:

src/assets/img/tab_my_hover.png

771 Bytes | W: | H:

src/assets/img/tab_my_hover.png
src/assets/img/tab_my_hover.png
src/assets/img/tab_my_hover.png
src/assets/img/tab_my_hover.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/img/top_01.png

4.8 KB | W: | H:

src/assets/img/top_01.png

5.0 KB | W: | H:

src/assets/img/top_01.png
src/assets/img/top_01.png
src/assets/img/top_01.png
src/assets/img/top_01.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/img/top_02.png

5.3 KB | W: | H:

src/assets/img/top_02.png

3.5 KB | W: | H:

src/assets/img/top_02.png
src/assets/img/top_02.png
src/assets/img/top_02.png
src/assets/img/top_02.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/img/top_03.png

5.2 KB | W: | H:

src/assets/img/top_03.png

5.1 KB | W: | H:

src/assets/img/top_03.png
src/assets/img/top_03.png
src/assets/img/top_03.png
src/assets/img/top_03.png
  • 2-up
  • Swipe
  • Onion skin
<template> <template>
<div class="activity-item" @click="onClick"> <div class="activity-item" @click="onClick">
<div class="activity-item-index" :class="topClass" v-if="showIndex"> <div class="activity-item-index" :class="topClass" v-if="showIndex && index < 3"></div>
<template v-if="!topClass"> <div class="activity-item-pic">
{{ currentIndex }} <img :src="data.activity_image" v-if="data.activity_image" />
</template>
</div>
<div class="activity-item-pic" v-if="data.activity_image">
<img :src="data.activity_image" />
</div> </div>
<div class="activity-item-main"> <div class="activity-item-main">
<div class="activity-item-title">{{ data.activity_name }}</div> <div class="activity-item-title">{{ data.activity_name }}</div>
<div class="activity-item-content"> <div class="activity-item-content">
<p class="activity-item-content__city">{{ data.activity_city }}</p> <p>{{ data.activity_city }} · {{data.initiator}} · {{ data.stu_nums }}人参与</p>
<p class="activity-item-content__ft"> <p>{{ data.activity_time | dateFormat }}</p>
<span>{{ data.activity_time | dateFormat }}</span>
<span>{{ data.stu_nums }}人报名</span>
</p>
</div> </div>
<div class="status" v-html="statusText"></div>
</div> </div>
</div> </div>
</template> </template>
...@@ -37,6 +31,11 @@ export default { ...@@ -37,6 +31,11 @@ export default {
}, },
topClass() { topClass() {
return this.currentIndex <= 3 ? `top${this.currentIndex}` : '' return this.currentIndex <= 3 ? `top${this.currentIndex}` : ''
},
statusText() {
return dayjs().isAfter(dayjs(this.data.activity_time), 'day')
? '<span class="is-finish">已结束</span>'
: '<span class="is-processing">进行中</span>'
} }
}, },
filters: { filters: {
...@@ -53,15 +52,16 @@ export default { ...@@ -53,15 +52,16 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.activity-item { .activity-item {
position: relative;
display: flex; display: flex;
padding-bottom: 10px; margin-bottom: 15px;
margin-bottom: 10px;
border-bottom: 1px solid #f5f5f5;
} }
.activity-item-pic { .activity-item-pic {
width: 120px; width: 120px;
height: 62px; height: 75px;
margin-right: 10px; margin-right: 15px;
background-color: #f3f4f5;
border-radius: 4px;
overflow: hidden; overflow: hidden;
img { img {
width: 100%; width: 100%;
...@@ -75,30 +75,31 @@ export default { ...@@ -75,30 +75,31 @@ export default {
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
overflow: hidden; overflow: hidden;
padding: 10px 0;
} }
.activity-item-title { .activity-item-title {
font-size: 14px; font-size: 15px;
color: #222; color: #1b1b1b;
line-height: 1;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
} }
.activity-item-content { .activity-item-content {
p { p {
color: #999; margin-top: 8px;
font-size: 12px;
color: #a0a0a0;
line-height: 1;
} }
} }
.activity-item-content__ft {
display: flex;
justify-content: space-between;
}
.activity-item-index { .activity-item-index {
position: absolute;
left: 3px;
top: 3px;
width: 25px; width: 25px;
margin-right: 10px; height: 25px;
font-size: 14px; z-index: 2;
color: #999;
line-height: 62px;
text-align: center;
} }
.top1 { .top1 {
background: url('~@/assets/img/top_01.png') no-repeat center; background: url('~@/assets/img/top_01.png') no-repeat center;
...@@ -112,4 +113,26 @@ export default { ...@@ -112,4 +113,26 @@ export default {
background: url('~@/assets/img/top_03.png') no-repeat center; background: url('~@/assets/img/top_03.png') no-repeat center;
background-size: contain; background-size: contain;
} }
.status {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
::v-deep span {
height: 15px;
padding: 0 4px;
font-size: 12px;
line-height: 15px;
border-radius: 2px;
display: inline-block;
}
::v-deep .is-finish {
color: #ce0022;
background: #ffedf0;
}
::v-deep .is-processing {
color: #1f78d4;
background: #e2f0ff;
}
}
</style> </style>
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
<div class="card"> <div class="card">
<div class="card-hd"> <div class="card-hd">
<h3 class="card-hd__title">{{ title }}</h3> <h3 class="card-hd__title">{{ title }}</h3>
<div class="card-hd__aside"><slot name="aside"></slot></div> <div class="card-hd__aside">
<slot name="aside"></slot>
</div>
</div> </div>
<div class="card-bd"> <div class="card-bd">
<slot></slot> <slot></slot>
...@@ -20,20 +22,14 @@ export default { ...@@ -20,20 +22,14 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
.card {
}
.card-hd { .card-hd {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
padding: 10px 0 20px; padding: 10px 0;
} }
.card-hd__title { .card-hd__title {
padding-bottom: 5px; font-size: 17px;
font-size: 16px; font-weight: 500;
font-weight: 600; color: #1b1b1b;
color: #333;
border-bottom: 3px solid #ff6767;
}
.card-bd {
} }
</style> </style>
<template> <template>
<div class="group-item" @click="onClick"> <div class="group-item" @click="onClick">
<div class="group-item-index" :class="topClass" v-if="showIndex"> <div class="group-item-index" :class="topClass" v-if="showIndex && index < 3"></div>
<template v-if="!topClass"> <div class="group-item-pic">
{{ currentIndex }} <img :src="data.logo" v-if="data.logo" />
</template>
</div>
<div class="group-item-pic" v-if="data.logo">
<img :src="data.logo" />
</div> </div>
<div class="group-item-main"> <div class="group-item-main">
<div class="group-item-title line-clamp">{{ data.org_name }}</div> <div class="group-item-title line-clamp">{{ data.org_name }}</div>
<div class="group-item-content"> <div class="group-item-content">{{ data.num }}成员 · {{ data.hot }}热度</div>
<p class="group-item-content__num">
<template v-if="data.num">{{ data.num }}</template>
</p>
<p class="group-item-content__city">{{ data.org_city }}</p>
<p class="group-item-content__hot">{{ data.hot }}</p>
</div>
</div> </div>
</div> </div>
</template> </template>
...@@ -46,20 +36,21 @@ export default { ...@@ -46,20 +36,21 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.group-item { .group-item {
position: relative;
display: flex; display: flex;
padding-bottom: 20px; margin-bottom: 15px;
margin-bottom: 20px;
border-bottom: 1px solid #f5f5f5;
} }
.group-item-pic { .group-item-pic {
width: 120px; width: 120px;
height: 62px; height: 75px;
margin-right: 10px; margin-right: 15px;
background-color: #f3f4f5;
border-radius: 4px;
overflow: hidden; overflow: hidden;
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain; object-fit: cover;
} }
} }
.group-item-main { .group-item-main {
...@@ -68,37 +59,25 @@ export default { ...@@ -68,37 +59,25 @@ export default {
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
overflow: hidden; overflow: hidden;
padding: 10px 0;
} }
.group-item-title { .group-item-title {
font-size: 14px; font-size: 15px;
color: #222; color: #1b1b1b;
line-height: 1;
} }
.group-item-content { .group-item-content {
display: flex; font-size: 12px;
color: #999; color: #a0a0a0;
} line-height: 1;
.group-item-content__num {
flex: 1;
}
.group-item-content__city {
margin: 0 10px;
max-width: 70px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.group-item-content__hot {
background: url('~@/assets/img/icon_hot.png') no-repeat left center;
background-size: 8px auto;
padding-left: 10px;
} }
.group-item-index { .group-item-index {
position: absolute;
left: 3px;
top: 3px;
width: 25px; width: 25px;
margin-right: 10px; height: 25px;
font-size: 14px; z-index: 2;
color: #999;
line-height: 62px;
text-align: center;
} }
.top1 { .top1 {
background: url('~@/assets/img/top_01.png') no-repeat center; background: url('~@/assets/img/top_01.png') no-repeat center;
......
<template> <template>
<div class="list"> <div class="list">
<van-list <van-list v-model="loading" :finished="finished" @load="onLoad" v-if="list.length">
v-model="loading"
:finished="finished"
@load="onLoad"
v-if="list.length"
>
<group-item <group-item
v-for="(item, index) in list" v-for="(item, index) in list"
:data="item" :data="item"
...@@ -70,8 +65,7 @@ export default { ...@@ -70,8 +65,7 @@ export default {
}) })
}, },
onLoad() { onLoad() {
this.requestParams.offset = this.requestParams.offset = this.requestParams.offset + this.requestParams.limit
this.requestParams.offset + this.requestParams.limit
this.getList() this.getList()
}, },
// 刷新 // 刷新
......
<template> <template>
<div class="my-activity-item" @click="onClick"> <div class="my-activity-item" @click="onClick">
<div class="my-activity-item-bd"> <div class="my-activity-item-bd">
<div class="my-activity-item-pic">
<img :src="data.activity_image" v-if="data.activity_image" />
</div>
<div class="my-activity-item-main"> <div class="my-activity-item-main">
<div class="my-activity-item-title"> <div class="my-activity-item-title">{{ data.activity_name }}</div>
{{ data.activity_demand_type_str }}
</div>
<div class="my-activity-item-content"> <div class="my-activity-item-content">
<p> <p>{{ data.activity_city }} · {{data.initiator}} · {{ data.stu_nums }}人参与</p>
<b>地点:</b><span>{{ data.activity_city }}</span> <p>{{ data.activity_time }}</p>
</p>
<p>
<b>时间:</b><span>{{ data.activity_time }}</span>
</p>
<p>
<b>主题:</b><span>{{ data.activity_name }}</span>
</p>
<p>
<b>审核状态:</b
><span :class="statusClass">{{ data.approve_status_str }}</span>
</p>
</div> </div>
</div> <div class="status" v-html="statusText"></div>
<div class="my-activity-item-pic" v-if="data.activity_image">
<img :src="data.activity_image" />
</div> </div>
</div> </div>
<div class="my-activity-item-ft"> <!-- <div class="my-activity-item-ft">
<ul> <ul>
<li v-if="data.is_mine && data.approve_status !== '1'"> <li v-if="data.is_mine && data.approve_status !== '1'">
<div <div
...@@ -33,9 +21,7 @@ ...@@ -33,9 +21,7 @@
@click.stop=" @click.stop="
$router.push({ name: 'activityUpdate', params: { id: data.id } }) $router.push({ name: 'activityUpdate', params: { id: data.id } })
" "
> >管理</div>
管理
</div>
</li> </li>
<li v-else> <li v-else>
<div class="button default-button">详情</div> <div class="button default-button">详情</div>
...@@ -46,16 +32,16 @@ ...@@ -46,16 +32,16 @@
@click.stop=" @click.stop="
$router.push({ name: 'activityMember', params: { id: data.id } }) $router.push({ name: 'activityMember', params: { id: data.id } })
" "
> >成员列表</div>
成员列表
</div>
</li> </li>
</ul> </ul>
</div> </div>-->
</div> </div>
</template> </template>
<script> <script>
import dayjs from 'dayjs'
export default { export default {
name: 'MyActivityItem', name: 'MyActivityItem',
props: { data: Object, isCheck: Boolean }, props: { data: Object, isCheck: Boolean },
...@@ -67,6 +53,11 @@ export default { ...@@ -67,6 +53,11 @@ export default {
'status-success': status === '1' || status === '2', 'status-success': status === '1' || status === '2',
'status-warning': status === '0' 'status-warning': status === '0'
} }
},
statusText() {
return dayjs().isAfter(dayjs(this.data.activity_time), 'day')
? '<span class="is-finish">已结束</span>'
: '<span class="is-processing">进行中</span>'
} }
}, },
methods: { methods: {
...@@ -78,49 +69,50 @@ export default { ...@@ -78,49 +69,50 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.my-activity-item { .my-activity-item {
margin-bottom: 10px; position: relative;
padding: 20px; display: flex;
box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.05); margin-bottom: 15px;
border-radius: 6px;
} }
.my-activity-item-bd { .my-activity-item-bd {
display: flex; display: flex;
overflow: hidden; overflow: hidden;
} }
.my-activity-item-pic {
width: 120px;
height: 75px;
margin-right: 15px;
background-color: #f3f4f5;
border-radius: 4px;
overflow: hidden;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.my-activity-item-main { .my-activity-item-main {
flex: 1; flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
overflow: hidden;
padding: 10px 0;
} }
.my-activity-item-title { .my-activity-item-title {
font-size: 15px; font-size: 15px;
color: #222; color: #1b1b1b;
line-height: 1;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
} }
.my-activity-item-content { .my-activity-item-content {
color: #999;
p { p {
margin-top: 10px; margin-top: 8px;
display: flex; font-size: 12px;
b { color: #a0a0a0;
color: #999; line-height: 1;
white-space: nowrap;
}
span {
margin-left: 5px;
flex: 1;
color: #222;
overflow: 1;
}
}
}
.my-activity-item-pic {
width: 100px;
height: 100px;
margin-left: 10px;
border-radius: 6px;
overflow: hidden;
img {
width: 100%;
height: 100%;
object-fit: contain;
} }
} }
.my-activity-item-ft { .my-activity-item-ft {
...@@ -145,11 +137,29 @@ export default { ...@@ -145,11 +137,29 @@ export default {
font-size: 12px; font-size: 12px;
color: #fff; color: #fff;
line-height: 30px; line-height: 30px;
background: linear-gradient( background: linear-gradient(180deg, rgba(255, 201, 44, 1) 0%, rgba(255, 116, 42, 1) 100%);
180deg, }
rgba(255, 201, 44, 1) 0%, }
rgba(255, 116, 42, 1) 100% .status {
); position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
::v-deep span {
height: 15px;
padding: 0 4px;
font-size: 12px;
line-height: 15px;
border-radius: 2px;
display: inline-block;
}
::v-deep .is-finish {
color: #ce0022;
background: #ffedf0;
}
::v-deep .is-processing {
color: #1f78d4;
background: #e2f0ff;
} }
} }
</style> </style>
<template> <template>
<div class="my-group-item" @click="onClick"> <div class="my-group-item" @click="onClick">
<div class="my-group-item-bd"> <div class="my-group-item-bd">
<div class="my-group-item-pic">
<img :src="data.logo" v-if="data.logo" />
</div>
<div class="my-group-item-main"> <div class="my-group-item-main">
<div class="my-group-item-title line-clamp">{{ data.org_name }}</div> <div class="my-group-item-title line-clamp">{{ data.org_name }}</div>
<div class="my-group-item-content"> <div class="my-group-item-content">
<p> <p></p>
<b>类型:</b>
<span>{{ data.org_type_str }}</span>
</p>
<p v-if="data.org_city">
<b>地点:</b>
<span>{{ data.org_city }}</span>
</p>
<p v-if="data.industry">
<b>行业:</b>
<span>{{ data.industry }}</span>
</p>
<p v-if="data.purpose">
<b>宗旨:</b>
<span>{{ data.purpose }}</span>
</p>
<p>
<b>审核状态:</b>
<span :class="statusClass">{{ data.approve_status_str }}</span>
</p>
</div> </div>
</div> </div>
<div class="my-group-item-pic" v-if="data.logo"> <div class="hot">活跃度</div>
<img :src="data.logo" />
</div>
</div> </div>
<div class="my-group-item-ft"> <!-- <div class="my-group-item-ft">
<ul> <ul>
<li v-if="data.is_mine && data.approve_status === '-1'"> <li v-if="data.is_mine && data.approve_status === '-1'">
<div <div
...@@ -38,9 +20,7 @@ ...@@ -38,9 +20,7 @@
@click.stop=" @click.stop="
$router.push({ name: 'groupUpdate', params: { id: data.id } }) $router.push({ name: 'groupUpdate', params: { id: data.id } })
" "
> >编辑</div>
编辑
</div>
</li> </li>
<li v-else> <li v-else>
<div class="button default-button">详情</div> <div class="button default-button">详情</div>
...@@ -48,16 +28,8 @@ ...@@ -48,16 +28,8 @@
<li> <li>
<div <div
class="button default-button" class="button default-button"
@click.stop=" @click.stop="$router.push({ name: 'groupMember', params: { id: data.id }, query: { is_mine: `${data.is_mine}` } })"
$router.push({ >成员列表</div>
name: 'groupMember',
params: { id: data.id },
query: { is_mine: `${data.is_mine}` }
})
"
>
成员列表
</div>
</li> </li>
<li> <li>
<div <div
...@@ -65,30 +37,18 @@ ...@@ -65,30 +37,18 @@
@click.stop=" @click.stop="
$router.push({ name: 'groupActivity', params: { id: data.id } }) $router.push({ name: 'groupActivity', params: { id: data.id } })
" "
> >活动</div>
活动
</div>
</li> </li>
</ul> </ul>
</div> </div>-->
</div> </div>
</template> </template>
<script> <script>
export default { export default {
name: 'Card', name: 'MyGroupItem',
props: { props: { data: Object },
data: Object,
index: Number,
showIndex: { type: Boolean, default: false }
},
computed: { computed: {
currentIndex() {
return this.index + 1
},
topClass() {
return this.currentIndex <= 3 ? `top${this.currentIndex}` : ''
},
statusClass() { statusClass() {
const status = this.data.approve_status const status = this.data.approve_status
return { return {
...@@ -107,52 +67,47 @@ export default { ...@@ -107,52 +67,47 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.my-group-item { .my-group-item {
margin-bottom: 10px; position: relative;
padding: 20px; display: flex;
box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.05); margin-bottom: 15px;
border-radius: 6px;
} }
.my-group-item-bd { .my-group-item-bd {
display: flex; display: flex;
// align-items: flex-start;
overflow: hidden; overflow: hidden;
} }
.my-group-item-pic {
width: 120px;
height: 75px;
margin-right: 15px;
background-color: #f3f4f5;
border-radius: 4px;
overflow: hidden;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.my-group-item-main { .my-group-item-main {
flex: 1; flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
overflow: hidden;
padding: 10px 0;
} }
.my-group-item-title { .my-group-item-title {
font-size: 15px; font-size: 15px;
color: #222; color: #1b1b1b;
line-height: 1;
} }
.my-group-item-content { .my-group-item-content {
color: #999; font-size: 12px;
p { color: #a0a0a0;
margin-top: 10px; line-height: 1;
display: flex;
b {
color: #999;
white-space: nowrap;
}
span {
margin-left: 5px;
flex: 1;
color: #222;
overflow: 1;
}
}
}
.my-group-item-pic {
width: 100px;
height: 100px;
margin-left: 10px;
border-radius: 6px;
overflow: hidden;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
} }
.my-group-item-ft { .my-group-item-ft {
margin-top: 20px; margin-top: 20px;
ul { ul {
...@@ -175,11 +130,20 @@ export default { ...@@ -175,11 +130,20 @@ export default {
font-size: 12px; font-size: 12px;
color: #fff; color: #fff;
line-height: 30px; line-height: 30px;
background: linear-gradient( background: linear-gradient(180deg, rgba(255, 201, 44, 1) 0%, rgba(255, 116, 42, 1) 100%);
180deg,
rgba(255, 201, 44, 1) 0%,
rgba(255, 116, 42, 1) 100%
);
} }
} }
.hot {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
height: 15px;
padding: 0 4px;
font-size: 12px;
line-height: 15px;
border-radius: 2px;
color: #ce0022;
background: #ffedf0;
}
</style> </style>
<template> <template>
<div class="list"> <div class="list">
<van-list <van-list v-model="loading" :finished="finished" @load="onLoad" v-if="list.length">
v-model="loading" <my-group-item v-for="item in list" :data="item" :key="item.id"></my-group-item>
:finished="finished"
@load="onLoad"
v-if="list.length"
>
<my-group-item
v-for="item in list"
:data="item"
:key="item.id"
></my-group-item>
</van-list> </van-list>
<template v-else> <template v-else>
<slot name="empty"> <slot name="empty">
......
<template> <template>
<div class="search-bar"> <div class="search-bar">
<form action="" @submit.prevent="onSearch"> <form action @submit.prevent="onSearch">
<input <input
type="search" type="search"
class="search-input" class="search-input"
:class="classes"
:placeholder="placeholder" :placeholder="placeholder"
v-model="currentValue" v-model="currentValue"
v-bind="$attrs" v-bind="$attrs"
...@@ -19,7 +20,7 @@ export default { ...@@ -19,7 +20,7 @@ export default {
props: { props: {
value: String, value: String,
focus: { type: Boolean, default: false }, focus: { type: Boolean, default: false },
placeholder: { type: String, default: '搜索' } placeholder: { type: String, default: '' }
}, },
data() { data() {
return { return {
...@@ -35,6 +36,11 @@ export default { ...@@ -35,6 +36,11 @@ export default {
computed: { computed: {
formInput() { formInput() {
return this.$refs.formInput return this.$refs.formInput
},
classes() {
return {
'is-focus': this.currentValue
}
} }
}, },
methods: { methods: {
...@@ -57,17 +63,19 @@ export default { ...@@ -57,17 +63,19 @@ export default {
<style lang="scss"> <style lang="scss">
.search-bar { .search-bar {
padding: 10px 0; padding: 10px 0 15px;
} }
.search-input { .search-input {
display: block; display: block;
width: 100%; width: 100%;
height: 32px; height: 30px;
line-height: 32px; line-height: 30px;
background: url('~@/assets/img/icon_search.png') no-repeat 22px center; background: #f3f4f5 url('~@/assets/img/icon_search.png') no-repeat center center;
background-size: 16px; background-size: 15px;
padding-left: 50px; padding: 0 20px;
border: 1px solid #f1f1f1; border-radius: 15px;
border-radius: 16px; &.is-focus {
background: #f3f4f5;
}
} }
</style> </style>
...@@ -6,26 +6,15 @@ ...@@ -6,26 +6,15 @@
class="tab-bar-item tab-bar-item__home" class="tab-bar-item tab-bar-item__home"
:class="{ 'is-active': isActive('home') }" :class="{ 'is-active': isActive('home') }"
@click="$router.push('home')" @click="$router.push('home')"
> >首页</li>
首页 <li class="tab-bar-item" @click="$router.push({ name: 'createActivity' })" v-if="hasCreate">
</li> <div class="tab-bar-item-create"></div>
<li
class="tab-bar-item"
@click="$router.push({ name: 'createActivity' })"
v-if="hasCreate"
>
<div class="tab-bar-item-create">
<div class="tab-bar-item-create__icon"></div>
<div class="tab-bar-item-create__title">创建</div>
</div>
</li> </li>
<li <li
class="tab-bar-item tab-bar-item__my" class="tab-bar-item tab-bar-item__my"
:class="{ 'is-active': isActive('my') }" :class="{ 'is-active': isActive('my') }"
@click="$router.push('my')" @click="$router.push('my')"
> >我的</li>
我的
</li>
</ul> </ul>
</div> </div>
</div> </div>
...@@ -67,7 +56,7 @@ export default { ...@@ -67,7 +56,7 @@ export default {
<style lang="scss"> <style lang="scss">
.tab-bar { .tab-bar {
height: 80px; height: 50px;
} }
.tab-bar-inner { .tab-bar-inner {
position: fixed; position: fixed;
...@@ -80,34 +69,30 @@ export default { ...@@ -80,34 +69,30 @@ export default {
margin: 0 auto; margin: 0 auto;
padding-bottom: env(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom);
box-sizing: content-box; box-sizing: content-box;
box-shadow: 0px -8px 16px 0px rgba(0, 0, 0, 0.05); box-shadow: 0px -3px 8px 0px rgba(0, 0, 0, 0.2);
} }
.tab-bar-list { .tab-bar-list {
display: flex; display: flex;
padding-top: 5px;
} }
.tab-bar-item { .tab-bar-item {
flex: 1; flex: 1;
font-size: 12px; font-size: 12px;
color: #999; color: #444;
text-align: center; text-align: center;
line-height: 1;
} }
.tab-bar-item.is-active { .tab-bar-item.is-active {
color: #ff6767; color: #af1b40;
} }
.tab-bar-item-create { .tab-bar-item-create {
margin: -20px auto 0; width: 40px;
} height: 40px;
.tab-bar-item-create__icon {
width: 60px;
height: 60px;
margin: 0 auto; margin: 0 auto;
background: #fff url('~@/assets/img/tab_create.png') no-repeat center center; background: #fff url('~@/assets/img/tab_create.png') no-repeat center center;
background-size: 100%; background-size: 100%;
border-radius: 50%; border-radius: 50%;
} }
.tab-bar-item-create__title {
margin-top: -10px;
}
.tab-bar-item__home { .tab-bar-item__home {
padding-top: 30px; padding-top: 30px;
background: url('~@/assets/img/tab_home.png') no-repeat center 2px; background: url('~@/assets/img/tab_home.png') no-repeat center 2px;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<!-- 搜索 --> <!-- 搜索 -->
<search-bar readonly @click.native="onSearch"></search-bar> <search-bar readonly @click.native="onSearch"></search-bar>
<card :title="title"> <card :title="title">
<activity-list :show-index="!type" :params="{ type }"></activity-list> <activity-list :show-index="!type" :params="{ type }" :showIndex="true"></activity-list>
</card> </card>
</div> </div>
</template> </template>
...@@ -31,7 +31,7 @@ export default { ...@@ -31,7 +31,7 @@ export default {
4: '找工作', 4: '找工作',
5: '运动家' 5: '运动家'
} }
return typeMap[this.type] || '活动热度榜' return typeMap[this.type] || '活动排行榜'
} }
}, },
methods: { methods: {
......
<template> <template>
<div class="detail"> <div class="main">
<!-- 封面 -->
<div class="detail-pic" v-if="detail.activity_image">
<img :src="detail.activity_image" />
</div>
<!-- 标题 --> <!-- 标题 -->
<div class="detail-title"> <div class="detail-title">
<h1>{{ detail.activity_name }}</h1> <h1>{{ detail.activity_name }}</h1>
</div> </div>
<!-- 作者 --> <!-- 作者 -->
<div class="detail-user" v-if="detail.initiator"> <!-- <div class="detail-user" v-if="detail.initiator">
<div class="detail-user__pic"> <div class="detail-user__pic">
<img :src="detail.initiator.avatar | avatar" /> <img :src="detail.initiator.avatar | avatar" />
</div> </div>
...@@ -14,59 +18,49 @@ ...@@ -14,59 +18,49 @@
<p>{{ datetimeText }}</p> <p>{{ datetimeText }}</p>
</div> </div>
<div class="detail-user__tool" v-if="canJoin"> <div class="detail-user__tool" v-if="canJoin">
<span <span class="join-button" @click="joinActivity" v-if="detail.button_show === 1">报名</span>
class="join-button" <span class="join-button" v-if="detail.button_show === 2" @click="cancelJoinActivity">已报名</span>
@click="joinActivity"
v-if="detail.button_show === 1"
>报名</span
>
<span
class="join-button"
v-if="detail.button_show === 2"
@click="cancelJoinActivity"
>已报名</span
>
</div> </div>
</div> </div>-->
<!-- 封面 -->
<div class="detail-pic" v-if="detail.activity_image">
<img :src="detail.activity_image" />
</div>
<!-- 内容 -->
<div class="detail-content" v-html="contentHtml"></div>
<div class="detail-form" v-if="detail.activity_type === '10'"> <div class="detail-form" v-if="detail.activity_type === '10'">
<div class="detail-form__item" v-if="detail.initiator">
<div class="detail-form__label">组织:</div>
<div class="detail-form__content">{{ detail.initiator.nickname }}</div>
</div>
<div class="detail-form__item" v-if="detail.activity_time"> <div class="detail-form__item" v-if="detail.activity_time">
<div class="detail-form__label"> <div class="detail-form__label">时间:</div>
<span class="detail-form-icon detail-form-icon__clock"></span>
时间:
</div>
<div class="detail-form__content">{{ detail.activity_time }}</div> <div class="detail-form__content">{{ detail.activity_time }}</div>
</div> </div>
<div class="detail-form__item" v-if="detail.activity_address"> <div class="detail-form__item" v-if="detail.activity_address">
<div class="detail-form__label"> <div class="detail-form__label">地点:</div>
<span class="detail-form-icon detail-form-icon__address"></span> <div class="detail-form__content">{{detail.activity_city}} · {{ detail.activity_address }}</div>
地点: </div>
</div> <div class="detail-form__item" v-if="detail.participator_limit">
<div class="detail-form__content">{{ detail.activity_address }}</div> <div class="detail-form__label">人数:</div>
<div class="detail-form__content">{{ detail.participator_limit }}</div>
</div> </div>
<!-- <div class="detail-form__item" v-if="detail.participator_limit">
<div class="detail-form__label">
<span class="detail-form-icon detail-form-icon__peoples"></span>
希望人数:
</div>
<div class="detail-form__content">
{{ detail.participator_limit }}
</div>
</div> -->
</div> </div>
<!-- 内容 -->
<div class="detail-content" v-html="contentHtml"></div>
<!-- 评论 --> <!-- 评论 -->
<div class="detail-comments" v-if="hasComment"> <div class="detail-comments" v-if="hasComment">
<comment-list <comment-list relatedType="1" :activityId="pid" :data="commentList" @update="getCommentList"></comment-list>
relatedType="1" </div>
:activityId="pid" <div class="buttons" v-if="canJoin">
:data="commentList" <input
@update="getCommentList" type="button"
></comment-list> class="button button-primary"
value="报名"
@click="joinActivity"
v-if="detail.button_show === 1"
/>
<input
type="button"
class="button button-default"
value="已报名"
v-if="detail.button_show === 2"
@click="cancelJoinActivity"
/>
</div> </div>
</div> </div>
</template> </template>
...@@ -100,7 +94,8 @@ export default { ...@@ -100,7 +94,8 @@ export default {
return !!this.detail.is_mine return !!this.detail.is_mine
}, },
hasComment() { hasComment() {
return this.detail.comment_switch === '1' // return this.detail.comment_switch === '1'
return false
}, },
contentHtml() { contentHtml() {
const content = this.detail.activity_contents || '' const content = this.detail.activity_contents || ''
...@@ -108,11 +103,7 @@ export default { ...@@ -108,11 +103,7 @@ export default {
}, },
canJoin() { canJoin() {
// 1显示报名2显示取消3均不显示 // 1显示报名2显示取消3均不显示
return ( return this.isPass && !this.isMyPublished && [1, 2].includes(this.detail.button_show)
this.isPass &&
!this.isMyPublished &&
[1, 2].includes(this.detail.button_show)
)
} }
}, },
methods: { methods: {
...@@ -159,12 +150,11 @@ export default { ...@@ -159,12 +150,11 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.detail { .detail {
padding: 10px 20px; margin: 0 20px;
} }
.detail-pic { .detail-pic {
margin-left: -20px; margin-left: -15px;
margin-right: -20px; margin-right: -15px;
margin-top: 20px;
img { img {
width: 100%; width: 100%;
} }
...@@ -199,39 +189,36 @@ export default { ...@@ -199,39 +189,36 @@ export default {
padding: 0 20px; padding: 0 20px;
line-height: 30px; line-height: 30px;
color: #fff; color: #fff;
background: linear-gradient( background: linear-gradient(180deg, rgba(255, 201, 44, 1) 0%, rgba(255, 116, 42, 1) 100%);
180deg,
rgba(255, 201, 44, 1) 0%,
rgba(255, 116, 42, 1) 100%
);
box-shadow: 0px 5px 20px 0px rgba(253, 3, 20, 0.3); box-shadow: 0px 5px 20px 0px rgba(253, 3, 20, 0.3);
border-radius: 20px; border-radius: 20px;
cursor: pointer; cursor: pointer;
} }
.detail-title { .detail-title {
padding: 18px 0 6px;
h1 { h1 {
font-size: 18px; font-size: 17px;
color: #333; color: #313131;
line-height: 26px; line-height: 2;
} }
} }
.detail-content { .detail-content {
margin-top: 10px; margin-top: 12px;
font-size: 15px; padding: 16px 0;
color: #222; font-size: 13px;
line-height: 30px; color: #313131;
line-height: 18px;
border-top: 1px solid #c9c9c9;
p { p {
font-size: 14px; font-size: 13px;
color: #222; color: #313131;
line-height: 30px; line-height: 18px;
text-indent: 2em;
} }
} }
.detail-form__item { .detail-form__item {
display: flex; display: flex;
align-items: flex-start; font-size: 12px;
margin-top: 20px; line-height: 18px;
line-height: 20px;
} }
.detail-form__label { .detail-form__label {
display: flex; display: flex;
...@@ -240,22 +227,28 @@ export default { ...@@ -240,22 +227,28 @@ export default {
flex: 1; flex: 1;
overflow: hidden; overflow: hidden;
} }
.detail-form-icon { .buttons {
display: inline-block; position: fixed;
width: 20px; left: 0;
height: 20px; right: 0;
margin-right: 10px; bottom: 34px;
text-align: center;
} }
.detail-form-icon__clock { .button {
background: url('~@/assets/img/icon_clock.png') no-repeat center; display: inline-block;
background-size: contain; min-width: 200px;
height: 40px;
padding: 0 16px;
line-height: 40px;
color: #fff;
text-align: center;
border-radius: 20px;
margin: 0 10px;
} }
.detail-form-icon__address { .button-default {
background: url('~@/assets/img/icon_address.png') no-repeat center; background: #ccc;
background-size: contain;
} }
.detail-form-icon__peoples { .button-primary {
background: url('~@/assets/img/icon_peoples.png') no-repeat center; background: #af1b40;
background-size: contain;
} }
</style> </style>
...@@ -2,12 +2,7 @@ ...@@ -2,12 +2,7 @@
<div class="main"> <div class="main">
<card title="创建活动"> <card title="创建活动">
<v-form ref="form" :model="formModel" :fields="fields" @submit="onSubmit"> <v-form ref="form" :model="formModel" :fields="fields" @submit="onSubmit">
<input <input type="button" value="确认创建,提交审核" class="submit-button" @click="handleSubmit" />
type="button"
value="确认创建,提交审核"
class="submit-button"
@click="handleSubmit"
/>
</v-form> </v-form>
</card> </card>
</div> </div>
...@@ -37,7 +32,8 @@ export default { ...@@ -37,7 +32,8 @@ export default {
name: 'activity_image', name: 'activity_image',
label: '封面', label: '封面',
required: true, required: true,
placeholder: '请上传活动封面' placeholder: '请上传活动封面',
rules: [{ required: true, message: '请上传活动封面' }]
}, },
{ {
type: 'textarea', type: 'textarea',
......
<template> <template>
<div class="main"> <card title="举办活动">
<card title="活动列表"> <van-list v-model="loading" :finished="finished" @load="onLoad" v-if="list.length">
<van-list <activity-item v-for="item in list" :data="item" :key="item.id"></activity-item>
v-model="loading" </van-list>
:finished="finished" <div class="empty" v-else>暂时没有内容哦,去别处看看吧~</div>
@load="onLoad" </card>
v-if="list.length"
>
<activity-item
v-for="item in list"
:data="item"
:key="item.id"
></activity-item>
</van-list>
<div class="empty" v-else>暂时没有内容哦,去别处看看吧~</div>
</card>
</div>
</template> </template>
<script> <script>
...@@ -56,8 +45,7 @@ export default { ...@@ -56,8 +45,7 @@ export default {
}) })
}, },
onLoad() { onLoad() {
this.requestParams.offset = this.requestParams.offset = this.requestParams.offset + this.requestParams.limit
this.requestParams.offset + this.requestParams.limit
this.getList() this.getList()
}, },
// 刷新 // 刷新
......
<template> <template>
<div class="main"> <div class="main">
<!-- 搜索 --> <!-- 搜索 -->
<search-bar <search-bar readonly @click.native="$router.push({ name: 'search' })"></search-bar>
readonly
@click.native="$router.push({ name: 'search' })"
></search-bar>
<card title="组织排行榜"> <card title="组织排行榜">
<group-list :show-index="true"></group-list> <group-list :show-index="true"></group-list>
</card> </card>
......
<template> <template>
<div class="main"> <div class="main">
<card title="组织详情" v-if="detail"> <div class="bg">
<img :src="detail.logo" class="group-avatar" />
<h1 class="group-name">{{detail.org_name}}</h1>
</div>
<card :title="detail.org_name">
<template #aside> <template #aside>
<h6 <h6
class="leave-group" class="leave-group"
v-if="detail.button_show === 3 && !detail.is_mine" v-if="detail.button_show === 3 && !detail.is_mine"
@click="onLeave" @click="onLeave"
> >退出组织</h6>
退出组织
</h6>
</template> </template>
<div class="info"> <div class="group-count">活动 · 成员 · 热度</div>
<template v-for="item in fields"> <div class="group-info">{{detail.goal}}</div>
<div class="info-item" :key="item.name" v-if="detail[item.name]"> </card>
<div class="info-item__label">{{ item.label }}</div> <group-activity></group-activity>
<div class="info-item__content"> <div class="buttons">
<template v-if="item.computed"> <!-- <input
<div v-html="item.computed(detail[item.name], detail)"></div>
</template>
<template v-else>
{{ detail[item.name] }}
</template>
</div>
</div>
</template>
</div>
<div class="buttons">
<input
type="button"
class="button button-info"
value="查看更多活动"
v-if="detail.button_show === 3"
@click="$router.push({ name: 'groupActivity', params: { id: pid } })"
/>
<!-- <input
type="button" type="button"
class="button button-primary" class="button button-primary"
value="创建活动" value="创建活动"
...@@ -44,35 +28,35 @@ ...@@ -44,35 +28,35 @@
query: { org_id: detail.id } query: { org_id: detail.id }
}) })
" "
/> --> />-->
<input <input
type="button" type="button"
class="button button-primary" class="button button-primary"
value="申请加入" value="申请加入"
@click="joinGroup" @click="joinGroup"
v-if="detail.button_show === 1" v-if="detail.button_show === 1"
/> />
<input <input
type="button" type="button"
class="button button-default" class="button button-default"
value="已申请,等待审核" value="已申请,等待审核"
v-if="detail.button_show === 2" v-if="detail.button_show === 2"
@click="onCancelJoin" @click="onCancelJoin"
/> />
</div> </div>
</card>
</div> </div>
</template> </template>
<script> <script>
import Card from '@/components/Card' import Card from '@/components/Card'
import GroupActivity from './Activity'
import * as api from '@/api' import * as api from '@/api'
export default { export default {
name: 'Group', name: 'Group',
components: { Card }, components: { Card, GroupActivity },
data() { data() {
return { return {
detail: null, detail: {},
fields: [ fields: [
{ name: 'org_name', label: '名称' }, { name: 'org_name', label: '名称' },
{ name: 'org_type_str', label: '类型' }, { name: 'org_type_str', label: '类型' },
...@@ -83,14 +67,7 @@ export default { ...@@ -83,14 +67,7 @@ export default {
{ name: 'goal', label: '目的' }, { name: 'goal', label: '目的' },
{ name: 'initiator', label: '主要发起人' }, { name: 'initiator', label: '主要发起人' },
{ name: 'rules', label: '组织章程' }, { name: 'rules', label: '组织章程' },
{ name: 'plan', label: '活动计划' }, { name: 'plan', label: '活动计划' }
{
name: 'logo',
label: '头像',
computed(value) {
return `<img src="${value}" class="group-avatar">`
}
}
] ]
} }
}, },
...@@ -156,6 +133,41 @@ export default { ...@@ -156,6 +133,41 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.bg {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 2.1rem;
margin-left: -15px;
margin-right: -15px;
background: url('~@/assets/img/group_bg.png') no-repeat;
background-size: cover;
}
.group-avatar {
width: 1.12rem;
height: 1.12rem;
object-fit: cover;
border-radius: 50%;
overflow: hidden;
}
.group-name {
margin-top: 0.18rem;
font-size: 0.17rem;
color: #fff;
}
.group-count {
font-size: 12px;
color: #a0a0a0;
line-height: 2;
border-bottom: 1px solid #c9c9c9;
}
.group-info {
padding: 14px 0;
font-size: 13px;
color: #313131;
line-height: 18px;
}
.info-item { .info-item {
margin-bottom: 20px; margin-bottom: 20px;
display: flex; display: flex;
...@@ -172,15 +184,18 @@ export default { ...@@ -172,15 +184,18 @@ export default {
margin-left: 20px; margin-left: 20px;
} }
.buttons { .buttons {
margin: 20px 0; position: fixed;
left: 0;
right: 0;
bottom: 34px;
text-align: center; text-align: center;
} }
.button { .button {
display: inline-block; display: inline-block;
min-width: 128px; min-width: 200px;
height: 30px; height: 40px;
padding: 0 16px; padding: 0 16px;
line-height: 30px; line-height: 40px;
color: #fff; color: #fff;
text-align: center; text-align: center;
border-radius: 20px; border-radius: 20px;
...@@ -190,24 +205,7 @@ export default { ...@@ -190,24 +205,7 @@ export default {
background: #ccc; background: #ccc;
} }
.button-primary { .button-primary {
background: linear-gradient( background: #af1b40;
180deg,
rgba(2, 236, 228, 1) 0%,
rgba(18, 186, 244, 1) 100%
);
}
.button-info {
background: linear-gradient(
180deg,
rgba(255, 201, 44, 1) 0%,
rgba(255, 116, 42, 1) 100%
);
}
::v-deep .group-avatar {
width: 100px;
height: 100px;
border-radius: 6px;
object-fit: contain;
} }
.leave-group { .leave-group {
font-size: 12px; font-size: 12px;
......
<template> <template>
<div class="main"> <div class="main">
<!-- 搜索 --> <!-- 搜索 -->
<search-bar <search-bar readonly @click.native="$router.push({ name: 'search' })"></search-bar>
readonly
@click.native="$router.push({ name: 'search' })"
></search-bar>
<!-- banner --> <!-- banner -->
<div class="banner"><img src="img/home_banner.png" /></div> <div class="banner">
<img src="img/home_banner.png" />
</div>
<!-- 导航 --> <!-- 导航 -->
<div class="nav"> <div class="nav">
<ul class="nav-list"> <ul class="nav-list">
...@@ -16,7 +15,9 @@ ...@@ -16,7 +15,9 @@
:key="index" :key="index"
@click="handleNavClick(item)" @click="handleNavClick(item)"
> >
<div class="pic"><img :src="item.url" /></div> <div class="pic">
<img :src="item.url" />
</div>
<div class="title">{{ item.title }}</div> <div class="title">{{ item.title }}</div>
</li> </li>
</ul> </ul>
...@@ -24,20 +25,23 @@ ...@@ -24,20 +25,23 @@
<!-- 排行榜 --> <!-- 排行榜 -->
<div class="top-bar"> <div class="top-bar">
<ul class="top-bar-list"> <ul class="top-bar-list">
<li <li class="top-bar-item top-bar-item__group" @click="$router.push({ name: 'group' })">组织排行</li>
class="top-bar-item top-bar-item__group"
@click="$router.push({ name: 'group' })"
>
组织排行榜
</li>
<li <li
class="top-bar-item top-bar-item__activity" class="top-bar-item top-bar-item__activity"
@click="$router.push({ name: 'activity' })" @click="$router.push({ name: 'activity' })"
> >活动排行</li>
活动热度榜
</li>
</ul> </ul>
</div> </div>
<card title="热门推荐">
<div class="popular-list">
<div class="popular-item" v-for="item in popularList" :key="item.id">
<div class="popular-item-pic">
<img :src="item.logo" />
</div>
<div class="popular-item-main">{{item.org_name}}</div>
</div>
</div>
</card>
<card title="最新活动"> <card title="最新活动">
<activity-list :params="{ newest: 1 }"></activity-list> <activity-list :params="{ newest: 1 }"></activity-list>
</card> </card>
...@@ -51,9 +55,12 @@ import SearchBar from '@/components/SearchBar' ...@@ -51,9 +55,12 @@ import SearchBar from '@/components/SearchBar'
import TabBar from '@/components/TabBar' import TabBar from '@/components/TabBar'
import Card from '@/components/Card' import Card from '@/components/Card'
import ActivityList from '@/components/ActivityList' import ActivityList from '@/components/ActivityList'
import * as api from '@/api'
export default { export default {
name: 'HomeIndex', name: 'HomeIndex',
components: { SearchBar, TabBar, Card, ActivityList }, components: { SearchBar, TabBar, Card, ActivityList },
data() { data() {
return { return {
navList: [ navList: [
...@@ -62,32 +69,45 @@ export default { ...@@ -62,32 +69,45 @@ export default {
{ url: 'img/home_nav_03.png', title: '直播课', type: 3 }, { url: 'img/home_nav_03.png', title: '直播课', type: 3 },
// { url: 'img/home_nav_04.png', title: '找工作', type: 4 }, // { url: 'img/home_nav_04.png', title: '找工作', type: 4 },
{ url: 'img/home_nav_04.png', title: '运动家', type: 5 } { url: 'img/home_nav_04.png', title: '运动家', type: 5 }
] ],
popularList: []
} }
}, },
methods: { methods: {
handleNavClick({ type }) { handleNavClick({ type }) {
this.$router.push({ name: 'activity', query: { type } }) this.$router.push({ name: 'activity', query: { type } })
},
getPopular() {
api.getPopular().then(response => {
this.popularList = response
})
} }
},
beforeMount() {
this.getPopular()
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.banner { .banner {
margin: 10px 0; margin: 0 -15px;
img { img {
width: 100%; width: 100%;
} }
} }
.nav { .nav {
padding: 10px 0; padding: 30px 0 20px;
} }
.nav-list { .nav-list {
display: flex; display: flex;
justify-content: space-between; justify-content: center;
align-items: center;
} }
.nav-item { .nav-item {
flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
...@@ -103,38 +123,63 @@ export default { ...@@ -103,38 +123,63 @@ export default {
color: #666; color: #666;
} }
} }
.top-bar {
padding: 20px 0;
}
.top-bar-list { .top-bar-list {
margin-bottom: 10px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.top-bar-item { .top-bar-item {
width: 42%; flex: 1;
height: 40px; height: 70px;
font-size: 14px; font-size: 16px;
font-weight: 600; font-weight: 400;
line-height: 40px; line-height: 70px;
color: #fff; color: #fff;
text-align: center; text-align: center;
border-radius: 40px;
cursor: pointer; cursor: pointer;
} }
.top-bar-item__group { .top-bar-item__group {
background: linear-gradient( background: url('~@/assets/img/home_group_bg.png') no-repeat center;
180deg, background-size: cover;
rgba(255, 201, 44, 1) 0%,
rgba(255, 116, 42, 1) 100%
);
box-shadow: 0px 5px 20px 0px rgba(253, 3, 20, 0.3);
} }
.top-bar-item__activity { .top-bar-item__activity {
background: linear-gradient( background: url('~@/assets/img/home_activity_bg.png') no-repeat center;
180deg, background-size: cover;
rgba(2, 236, 228, 1) 0%, }
rgba(18, 186, 244, 1) 100% .popular-list {
); display: flex;
box-shadow: 0px 5px 20px 0px rgba(17, 187, 243, 0.3); overflow-x: auto;
overflow-y: hidden;
margin-left: -15px;
margin-right: -15px;
-webkit-overflow-scrolling: touch;
}
.popular-item {
flex-shrink: 0;
margin-bottom: 18px;
margin-right: 15px;
width: 165px;
height: 140px;
background: #ffffff;
box-shadow: 0px 2px 6px 0px rgba(74, 9, 25, 0.05);
border-radius: 6px;
overflow: hidden;
&:first-child {
margin-left: 15px;
}
}
.popular-item-pic {
height: 95px;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
.popular-item-main {
font-size: 13px;
color: #1b1b1b;
text-align: center;
padding: 8px 10px;
} }
</style> </style>
...@@ -115,7 +115,7 @@ export default { ...@@ -115,7 +115,7 @@ export default {
color: #fff; color: #fff;
line-height: 20px; line-height: 20px;
text-align: center; text-align: center;
background-color: #ff6767; background-color: #AF1B40;
border-radius: 50%; border-radius: 50%;
overflow: hidden; overflow: hidden;
} }
......
<template> <template>
<div class="main my"> <div class="main my">
<div class="tools"> <div class="my-header">
<ul class="tools-list"> <div class="tools">
<li class="tools-item" @click="$router.push({ name: 'settings' })"> <ul class="tools-list">
<img src="~@/assets/img/my_settings.png" width="20" /> <li class="tools-item" @click="$router.push({ name: 'settings' })">
</li> <img src="~@/assets/img/my_settings.png" width="20" />
<li class="tools-item" @click="$router.push({ name: 'message' })"> </li>
<img src="~@/assets/img/my_message.png" width="13" /> <li class="tools-item" @click="$router.push({ name: 'message' })">
</li> <img src="~@/assets/img/my_message.png" width="20" />
</ul> </li>
</div> </ul>
<div class="user">
<div class="user-avatar">
<img :src="user.avatar | avatar" />
</div> </div>
<div class="user-content"> <div class="user">
<div class="user-content__name"> <div class="user-avatar">
{{ user.nickname || user.personal_name }} <img :src="user.avatar | avatar" />
</div> </div>
<div class="user-content__info">{{ user.class_name }}</div> <div class="user-content">
</div> <div class="user-content__name">{{ user.nickname || user.personal_name }}</div>
<div class="user-aside"> <div class="user-content__info">{{ user.class_name }}</div>
</div>
<!-- <div class="user-aside">
<dl @click="$router.push({ name: 'myGroup' })"> <dl @click="$router.push({ name: 'myGroup' })">
<dt>{{ detail.org_stu_total }}</dt> <dt>{{ detail.org_stu_total }}</dt>
<dd>组织</dd> <dd>组织</dd>
...@@ -29,20 +28,29 @@ ...@@ -29,20 +28,29 @@
<dt>{{ detail.act_stu_total }}</dt> <dt>{{ detail.act_stu_total }}</dt>
<dd>活动</dd> <dd>活动</dd>
</dl> </dl>
<!-- <dl @click="$router.push({ name: 'myApprove' })"> <dl @click="$router.push({ name: 'myApprove' })">
<dt> <dt>
{{ detail.act_check_total }} {{ detail.act_check_total }}
<span class="badge" v-if="hasBadge"></span> <span class="badge" v-if="hasBadge"></span>
</dt> </dt>
<dd>审批</dd> <dd>审批</dd>
</dl>--> </dl>
</div>-->
</div> </div>
</div> </div>
<van-tabs v-model="tabActive" :line-height="2"> <van-tabs v-model="tabActive" class="my-tab" :ellipsis="false">
<van-tab title="我的组织" name="0"> <van-tab name="0">
<template #title>
<div class="name">我的组织</div>
<div class="num">{{ detail.org_stu_total }}</div>
</template>
<my-group-list></my-group-list> <my-group-list></my-group-list>
</van-tab> </van-tab>
<van-tab title="我的活动" name="1"> <van-tab name="1">
<template #title>
<div class="name">我的活动</div>
<div class="num">{{ detail.act_stu_total }}</div>
</template>
<my-activity-list></my-activity-list> <my-activity-list></my-activity-list>
</van-tab> </van-tab>
<!-- <van-tab title="我的审批" name="2"> <!-- <van-tab title="我的审批" name="2">
...@@ -108,14 +116,22 @@ export default { ...@@ -108,14 +116,22 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
.my-header {
margin-left: -15px;
margin-right: -15px;
padding: 0 20px;
height: 190px;
background: url('~@/assets/img/my_bg.png') no-repeat center top;
background-size: cover;
}
.tools-list { .tools-list {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
align-items: center; align-items: center;
padding: 10px 0 20px; padding: 20px 0;
} }
.tools-item { .tools-item {
margin-left: 30px; margin-left: 20px;
} }
.user { .user {
display: flex; display: flex;
...@@ -139,15 +155,17 @@ export default { ...@@ -139,15 +155,17 @@ export default {
height: 60px; height: 60px;
flex: 1; flex: 1;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: center;
margin-left: 10px; margin-left: 10px;
color: #fff;
line-height: 1;
} }
.user-content__name { .user-content__name {
font-size: 17px; font-size: 15px;
color: #222;
} }
.user-content__info { .user-content__info {
color: #999; margin-top: 6px;
font-size: 12px;
} }
.user-aside { .user-aside {
display: flex; display: flex;
...@@ -166,8 +184,41 @@ export default { ...@@ -166,8 +184,41 @@ export default {
top: -15px; top: -15px;
} }
} }
.my-tab {
margin-top: -50px;
.van-tabs__nav {
background-color: transparent;
}
&.van-tabs--line .van-tabs__wrap {
height: 50px;
}
.van-tabs__wrap--scrollable .van-tabs__nav--complete {
padding: 0;
}
.van-tabs__line {
display: none;
}
.van-tab {
border-top-left-radius: 6px;
border-top-right-radius: 6px;
background-color: #eaeef0;
}
.van-tab--active {
background-color: #fff;
}
.name {
font-size: 12px;
color: #707070;
text-align: center;
}
.num {
font-size: 24px;
color: #313131;
text-align: center;
}
}
.my .list { .my .list {
margin-top: 20px; padding: 40px 0;
} }
.badge { .badge {
position: relative; position: relative;
......
...@@ -10,11 +10,10 @@ ...@@ -10,11 +10,10 @@
> >
<i class="icon"></i> <i class="icon"></i>
<span>创建新组织</span> <span>创建新组织</span>
</div> --> </div>-->
<p class="tips"> <p class="tips">
没有更多啦,<router-link :to="{ name: 'group' }" 没有更多啦,
>去逛逛排行榜吧~</router-link <router-link :to="{ name: 'group' }">去逛逛排行榜吧~</router-link>
>
</p> </p>
</template> </template>
</card> </card>
......
<template> <template>
<div class="main"> <div class="main">
<search-bar <search-bar placeholder :focus="true" v-model="searchValue" @search="onSearch" ref="searchBar"></search-bar>
placeholder=""
:focus="true"
v-model="searchValue"
@search="onSearch"
ref="searchBar"
></search-bar>
<van-tabs v-model="tabActive" :line-height="2" @click="onTabClick"> <van-tabs v-model="tabActive" :line-height="2" @click="onTabClick">
<div class="line"></div>
<van-tab title="组织" name="0"> <van-tab title="组织" name="0">
<group-list <group-list
:params="{ keywords: searchValue }" :params="{ keywords: searchValue }"
ref="list" ref="list"
v-if="tabActive === '0'" v-if="tabActive === '0' && searchValue"
> >
<template #empty> <template #empty>
<div class="search-empty">暂时没有内容哦,换个搜索词试试吧~</div> <div class="search-empty">暂时没有内容哦,换个搜索词试试吧~</div>
...@@ -31,31 +26,32 @@ ...@@ -31,31 +26,32 @@
>我的组织~</router-link >我的组织~</router-link
> >
</p> </p>
</div> --> </div>-->
</template> </template>
</group-list> </group-list>
</van-tab> </van-tab>
<van-tab title="个人" name="1">
<member-list <van-tab title="活动" name="2">
<activity-list
:params="{ keywords: searchValue }" :params="{ keywords: searchValue }"
ref="list" ref="list"
v-if="tabActive === '1'" v-if="tabActive === '2' && searchValue"
> >
<template #empty> <template #empty>
<div class="search-empty">暂时没有内容哦,换个搜索词试试吧~</div> <div class="search-empty">暂时没有内容哦,换个搜索词试试吧~</div>
</template> </template>
</member-list> </activity-list>
</van-tab> </van-tab>
<van-tab title="活动" name="2"> <van-tab title="个人" name="1">
<activity-list <member-list
:params="{ keywords: searchValue }" :params="{ keywords: searchValue }"
ref="list" ref="list"
v-if="tabActive === '2'" v-if="tabActive === '1' && searchValue"
> >
<template #empty> <template #empty>
<div class="search-empty">暂时没有内容哦,换个搜索词试试吧~</div> <div class="search-empty">暂时没有内容哦,换个搜索词试试吧~</div>
</template> </template>
</activity-list> </member-list>
</van-tab> </van-tab>
</van-tabs> </van-tabs>
</div> </div>
...@@ -124,9 +120,29 @@ export default { ...@@ -124,9 +120,29 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.line {
height: 1px;
background-color: #dcdcdc;
margin-left: -15px;
margin-right: -15px;
margin-top: -1px;
}
::v-deep .list { ::v-deep .list {
margin-top: 20px; margin-top: 20px;
} }
::v-deep .van-tab {
flex: inherit;
margin-right: 30px;
font-size: 15px;
color: #313131;
}
::v-deep .van-tab--active {
font-size: 18px;
color: #af1b40;
}
::v-deep .van-tabs__nav {
background-color: transparent;
}
.search-empty { .search-empty {
margin-top: 50px; margin-top: 50px;
padding-top: 200px; padding-top: 200px;
...@@ -156,11 +172,7 @@ export default { ...@@ -156,11 +172,7 @@ export default {
line-height: 30px; line-height: 30px;
color: #fff; color: #fff;
text-align: center; text-align: center;
background: linear-gradient( background: linear-gradient(180deg, rgba(255, 201, 44, 1) 0%, rgba(255, 116, 42, 1) 100%);
180deg,
rgba(255, 201, 44, 1) 0%,
rgba(255, 116, 42, 1) 100%
);
border-radius: 20px; border-radius: 20px;
} }
.button:disabled { .button:disabled {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论