1.1 轮播区域设计

重点:

垂直居中样式设计

1
2
3
display: flex;
align-items: center;
justify-content: center;

单行不换行,显示省略号 … 样式设计

1
2
3
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

scss使用父元素名称 & 表示符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
swiper {
width: 750rpx;
height: 340rpx;
&-item {
width: 100%;
height: 100%;
padding: 0 30rpx;

image {
width: 100%;
height: 100%;
border-radius: 10rpx;
}
}
}

1.2滑动区域设计

重点:

1.Grid网格布局

1
2
3
display: grid;
gap:15rpx;
grid-template-columns: repeat(3,1fr);

2.圆角与图像覆盖的解决

1
2
border-radius;
overflow:hidden

3.磨砂效果

1
2
background: rgba(250,129,90,0.7);
backdrop-filter: blur(20rpx);

4.组件Props传递不同属性 分别展示”一般”和”更多内容”的项目设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<view class="themeItem">
<navigator url="/pages/classlist/classlist" class="box" v-if="!isMore">
<image class="pic" src="../../common/images/classify1.jpg" mode="aspectFill"></image>
<view class="mask">明星美女</view>
<view class="tab">3天前更新</view>
</navigator>

<navigator url="/pages/classify/classify" open-type="reLaunch" class="box more" v-if="isMore">
<image class="pic" src="../../common/images/more.jpg" mode="aspectFill"></image>
<view class="mask">
<uni-icons type="more-filled" size="34" color="#fff"></uni-icons>
<view class="text">更多</view>
</view>
</navigator>
</view>
1
2
3
4
5
6
7
8
<script setup>
defineProps({
isMore:{
type:Boolean,
default:false
}
})
</script>

1.3底部导航tarBar设计

page.json配置好tarBar路径和图像

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"tabBar": {
"color": "#9799a5",
"selectedColor": "#28B389",
"list": [{
"text": "推荐",
"pagePath": "pages/index/index",
"iconPath": "static/images/tabBar/home.png",
"selectedIconPath": "static/images/tabBar/home-h.png"
}, {
"text": "分类",
"pagePath": "pages/classify/classify",
"iconPath": "static/images/tabBar/classify.png",
"selectedIconPath": "static/images/tabBar/classify-h.png"
}, {
"text": "我的",
"pagePath": "pages/user/user",
"iconPath": "static/images/tabBar/user.png",
"selectedIconPath": "static/images/tabBar/user-h.png"
}]
},

1.4个人主页布局设计

H5和小程序对拨打电话和联系客服的差异化编译

1
2
3
4
5
6
<!-- #ifdef MP -->
<button open-type="contact">联系客服</button>
<!-- #endif -->
<!-- #ifndef MP -->
<button @click="clickContact">拨打电话</button>
<!-- #endif -->

透明度按钮覆盖组件

因为联系客服api只能在按钮使用,所以调整按钮样式,形成透明的遮罩

1
2
3
4
5
6
7
8
button {
position: absolute;
top: 0;
left: 0;
height: 100rpx;
width: 100%;
opacity: 0;
}

渐变色背景设计

1
2
3
4
5
6
.pageBg{
background:
linear-gradient(to bottom,transparent,#fff 400rpx),
linear-gradient(to right,#beecd8 20%,#F4E2D8);
min-height: 80vh;
}

起因:

h5和小程序组件样式的不一致

小程序的组件样式是被icon里面嵌套,所以需要使用deep来穿透到子组件中去改变它的内容

1
2
3
4
5
:deep() {
.uni-icons {
color: $brand-theme-color !important;
}
}

Bug:

h5在导入样式文件后提示未引入样式表,小程序没有影响

1
@import "@/common/style/base-style.scss";

下策:在每个页面引入样式表,使h5兼容

1.5创建分类列表完成各界面跳转

跳转tarbar(也就是下方三个栏)需要配置参数

1.6预览界面设计

1.在设计 预览图片数量的部件时,需要宽度由内容填充的属性

2.设计从底向上的弹出框时防止底部安全操作栏占据空间需要用到属性safe-area

区别:

1.7头部导航栏布局设计

1.获取系统状态栏高度

我们需要使用api来获取系统信息

1
const SYSTEM_INFO = uni.getSystemInfoSync();

2.抽离公共方法用条件编译对抖音小程序适配

system.js:

在需要用到的组件(这里是custom-nav-bar.vue)中导入即可

条件编译对头条小程序和非头条小程序进行了不同的marginLeft适配,因为头条小程序多一个图标组件

3.深层解构赋值

1
2
3
4
5
6
let {
leftIcon: {
left,
width
}
} = tt.getCustomButtonBoundingClientRect();

得到组件按钮的左距离和宽度

2.1 调用网络接口在首页展示真实数据并渲染

Promise封装网络请求 ==> request.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const BASE_URL = 'https://tea.qingnian8.com/api/bizhi';

export function request(config = {}) {
let {
url,
data = {},
method = "GET",
header = {}
} = config

url = BASE_URL + url
header['access-key'] = "xzj123456"

return new Promise((resolve, reject) => {
uni.request({
url,
data,
method,
header,
success: res => {
//成功情况
if (res.data.errCode === 0) {
resolve(res.data)
//错误情况,400
} else if (res.data.errCode === 400) {
uni.showModal({
title: "错误提示",
content: res.data.errMsg,
showCancel: false
})
reject(res.data)
} else {
uni.showToast({
title: res.data.errMsg,
icon: "none"
})
reject(res.data)
}
},
fail: err => {
reject(err)
}
})
})
}

封装api简化请求数据操作 ==> apis.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//导入封装好的promise网络请求
import {
request
} from "@/utils/request.js"

//获取轮播图数据
export function apiGetBanner() {
return request({
url: "/homeBanner"
})
}

//获取每日推荐数据
export function apiGetDayRandom() {
return request({
url: "/randomWall"
})
}

//获取公告数据
export function apiGetNotice(data = {}) {
return request({
url: "/wallNewsList",
data
})
}

使用api获取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//获取轮播图数据
const getBanner = async () => {
let res = await apiGetBanner();
bannerList.value = res.data;

}
//获取每日推荐数据
const getDayRandom = async () => {
let res = await apiGetDayRandom();
randomList.value = res.data
}
//获取公告数据
const getNotice = async () => {
let res = await apiGetNotice({
select: true
});
noticeList.value = res.data
}

对封装的request请求进行传参

使用api进行传参

api中预先配置好接收数据

2.2 给专题组件通过defineProps声明变量传值渲染

theme-item.vue组件

在模板渲染出来

index.vue页面文件

2.3 从onLoad获取参数作为接口的参数获取对应的数据

在theme-item.vue组件中通过路由传参

在分类列表组件theme-item.vue中通过 onLoad生命周期获取对应参数 classid 和 name

注意点:由于onLoad生命周期在setup之后,所以需要在OnLoad周期内执行获取分类图片列表函数

2.4 触底动加载更多阻止无效的网络请求

​ 触底api加载更多图片

将新加载数据与已加载数据合并

2.5 触底加载load-more样式的展现

uni-load-more组件样式在common.scss定义,封装为统一样式

2.6 分类列表存入Storage在预览页面读取缓存展示

分类图片列表界面:

预览界面:

2.7 巧妙解决首次劝加载额外的图片网络消耗

在模板进行条件判断是否要渲染图片

加载相邻图片到数组的函数定义

在滑动处理函数和页面onLoad生命周期调用函数

2.8 对接评分接口对壁纸进行滑动提交打分

评分窗口逻辑设计

确认评分函数(这里将评分放入本地缓存,为了用户再次直接使用该评分)

在模板里对是否评分过进行判断,显示评过的分,然后对评过分的图片禁用滑动评分条和提交评分,

2.9 savelmageToPhotosAlbum保存壁纸到相册

需要用到如下这个uni api

需要对H5和非H5进行条件编译,因为H5没有这个模块功能

还需要在微信小程序平台配置好download服务器域名

可能还需要进行更新服务内容声明

2.10 try 和 catch处理同步请求下载记录异常处理

异步同步化怎么处理,把异步代码放在try里面

处理了一个Bug

由于生命周期的先后,导致onLoad时才加载数据到模板上,而一开始数据设置为null,模板自然读取不到currentInfo中的score等数据。

解决方法:

把初始对象改为空对象{},而不是null

2.10 分享onShareAppMessage分享好友和分享微信朋友圈

5月1号uniapp文档更新uni.share只有app能用

需要用到页面生命周期 onShareAppMessage

2.11 处理分享结束后无法返回的处理

对返回进行成功的回调和失败的回调,让失败重定向到首页,实现分享结束后返回

2.12 清除分类列表本地缓存

用到onUnload生命周期钩子,离开页面时清除本地分类缓存

从每日推荐跳转到预览,先加载缓存,再跳转,注意要传参

2.13 安全区设置

给popup组件添加 :safe-area=”false” 这个属性就可以解决这个问题,不用改源码

2.14 包装错误返回主页面common方法 goHome

这里goHome方法后要跟一个return,不然后面异步还是会报错

导出这个方法,在需要的地方导入

2.15 使用mp-html室文本插件渲染公告详情页面

一般小程序无法解析富文本内容,但uniapp提供了一般组件rich-text用来支持富文本

关于富文本,有很多强大的uniapp插件支持丰富的功能,比如mp-html

2.16 搜索页面布局及结合数据缓存展示搜索历史

安装两个组件,进行路由跳转传参,传递关键字,载入分类列表,设置好本地存储,对搜索结果进行响应处理,对搜索历史数组进行去重

页面结构:

data和函数:

2.17 .banner中navigator组件跳转到其他小程序及bug解决