uni-app--》打造个性化壁纸预览应用平台(二)

news2024/12/23 22:10:21

🏙️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名前端工程师

🌄个人主页:亦世凡华、

🌆系列专栏:uni-app

🌇座右铭:人生亦可燃烧,亦可腐败,我愿燃烧,耗尽所有光芒。

👀引言

⚓经过web前端的学习,相信大家对于前端开发有了一定深入的了解,今天我开设了uni-app专栏,对于想从移动端开发方向进一步发展的朋友,希望看到我文章的朋友能对你有所帮助。

        今天开始使用vue3+uni-app搭建一个电商购物的小程序,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多前端uni-app知识。

        如果是第一次接触uni-app并且想学习uni-app的朋友,我是不建议直接从此次实战项目开始看起,可以先阅读一下我以前的基础文章:什么是uniapp?如何开发uniapp?按部就班的学习可以让学习变得更轻松更容易上手哦,闲话少说我们直接开始今天的uni-app实战篇。

目录

🏔️分类列表页面

🌋预览壁纸页面

🗻定义头部导航

🏕️公告页面布局


🏔️分类列表页面

当我们点击首页的壁纸图片的时候,肯定是要跳转到对应的详情页面的,这里我们创建一个分类列表页面,用于存放具体的壁纸信息,由于不仅仅只是首页需要跳转,别的页面也是需要该分类页面,所以这里我们就创建与首页平齐的文件夹,如下所示:

创建好分类页面之后,接下来我们开始创建对应的文件内容样式,这里暂时用静态图片代替:

<template>
	<view class="classlist">
		<view class="content">
			<navigator url="" class="item" v-for="item in 10" :key="item">
				<image src="../../common/image/2.jpg" mode="aspectFill"></image>
			</navigator>
		</view>
	</view>
</template>

<script setup></script>

<style scoped lang="scss">
.classlist {
	.content {
		display: grid;
		grid-template-columns: repeat(3, 1fr);
		gap: 5rpx;
		padding: 5rpx;
		.item {
			height: 440rpx;
			image {
				width: 100%;
				height: 100%;
				display: block;
			}
		}
	}
}
</style>

然后我们在我们上篇文章讲解到的内容选择区域设置的公共组件处设置跳转链接,这里我们直接传入对应的路径即可,如下所示:

因为首页和分类页面采用相同的组件,所以实现的方式是一致的,呈现的效果如下所示:

🌋预览壁纸页面

接下来开始对预览页面的内容进行开发,这里仍然需要在pages目录下新建一个页面,老生常谈的事这里就不再赘述了,因为壁纸要全屏展示,所以这里我们给创建的页面设置一下自定义导航栏,默认导航栏就会被去除掉:

基础的页面布局如下所示,这里我们设置了一下壁纸的一些遮罩内容,当点击图片的时候,遮罩内容消失,然后用户就可以手动滑动图片了,当再次点击壁纸,遮罩又出现了,具体的实现代码如下所示:

<template>
	<view class="preview">
		<swiper circular>
			<swiper-item v-for="item in 5" :key="item">
				<image @tap="maskChange" src="../../common/image/2.jpg" mode="aspectFill"></image>
			</swiper-item>
		</swiper>
		<view class="mask" v-show="maskState">
			<view class="goBack"></view>
			<view class="count">3 / 9</view>
			<view class="time">
				<uni-dateformat :date="new Date()" format="hh:mm"></uni-dateformat>
			</view>
			<view class="date">
				<uni-dateformat :date="new Date()" format="MM月dd日"></uni-dateformat>
			</view>
			<view class="footer">
				<view class="box" v-for="item in information" :key="item">
					<uni-icons :type="item.icon" size="28" :color="item.color"></uni-icons>
					<view class="text">{{ item.name }}</view>
				</view>
			</view>
		</view>ri
	</view>
</template>

<script setup>
import { ref} from 'vue'

// 默认显示遮罩内容
const maskState = ref(true)
// 文本信息
let information = ref([
	{ name: '信息', icon: 'info', color: 'orange' },
	{ name: '5分', icon: 'star', color: 'yellow' },
	{ name: '下载', icon: 'download', color: 'green' },
])

// 点击图片取消遮罩内容
const maskChange = () => {
	maskState.value = !maskState.value
}
</script>

最终呈现的效果如下所示:

信息弹窗:然后接下来我们要给这个壁纸设置一个弹出层,用来告知用户当前壁纸的一些相关信息,这里我们用到了uni官网提供的弹出层组件,如下我们需要进行安装:

然后这里我们用到了一个评分的功能,这里我们也可以使用uni官网提供的插件,如下:

设置的代码效果如下所示:

<!-- 弹出层 -->
<uni-popup ref="infoPopup" type="bottom" :safe-area="false">
	<view class="infoPopup">
		<view class="popHeader">
			<view></view>
			<view class="title">壁纸信息</view>
			<view class="close" @tap="handleClose">
				<uni-icons type="closeempty" size="18" color="#999"></uni-icons>
			</view>
		</view>
		<scroll-view scroll-y>
			<view class="content">
				<view class="row" v-for="item in popData" :key="item">
					<view class="label">{{ item.label }}</view>
					<view class="value roteBox" v-if="item.label == '评分:'">
						<uni-rate readonly touchable value="3.5" size="16" />
						<text class="score">{{ item.value }}</text>
					</view>
					<view class="value tabs" v-else-if="item.label == '标签:'">
						<view class="tab" v-for="tab in item.tabs" :key="tab">{{ tab }}</view>
					</view>
					<text v-else selectable class="value">{{ item.value }}</text>
				</view>
				<view class="copyright">声明:仅用于学习,切勿商业用途</view>
			</view>
		</scroll-view>
	</view>
</uni-popup>

最终呈现的效果如下所示:

评分弹窗:评分弹窗的话也是需要借助上面的uni提供的组件进行设置,具体的代码如下所示:

<!-- 评分弹出层 -->
<uni-popup ref="scorePopup" :is-mask-click="false">
	<view class="scorePopup">
		<view class="popHeader">
			<view></view>
			<view class="title">壁纸评分</view>
			<view class="close" @tap="handleScoreClose">
				<uni-icons type="closeempty" size="18" color="#999"></uni-icons>
			</view>
		</view>
		<view class="content">
			<uni-rate v-model="userScore" allowHalf />
			<text class="text">{{ userScore }}分</text>
		</view>
		<view class="footer">
			<button @tap="submitScore" :disabled="!userScore" type="default" size="mini" plain="">确认评分</button>
		</view>
	</view>
</uni-popup>

最终呈现的效果如下所示:

返回按钮:这里我们在左上角做一个返回的按钮进行返回上一层的回调事件,这里用到了一个计算高度的函数,在下面的标题中将着重讲解一下:

<view class="goBack" :style="{ top: getStatusBarHeight() + 'px' }" @tap="goBack">
	<uni-icons type="back" size="24" color="#fff"></uni-icons>
</view>
// 点击返回按钮
const goBack = () => {
	uni.navigateBack()
}

最终呈现的效果如下所示:

🗻定义头部导航

在首页顶部的地方,我们需要做一个头部的导航搜索栏,便于用户进行搜索操作,这里我们也做一个公共的组件,便于使用,如下所示:

因为我们要自定义导航栏的内容,所以在首页页面,我们也需要对其的pages文件设置自定义导航栏,如下所示:

然后我们开始设置自定义导航栏的内容,这里我们需要通过借助uni提供的API来计算手机顶部的高度:

<template>
	<view class="custom-nav-bar">
		 <view class="navbar">
		 	<view class="statusBar" :style="{ height: statusBarHeight+'px' }"></view>
			<view class="titleBar" :style="{ height: titleBarHeight+'px' }">
				<view class="title">标题</view>
				<view class="search">
					<uni-icons class="icon" type="search" size="18" color="#888"></uni-icons>
					<text class="text">搜索</text>
				</view>
			</view>
		 </view>
		 <view class="fill" :style="{ height: statusBarHeight + titleBarHeight + 'px' }"></view>
	</view>
</template>

<script setup>
import { ref } from 'vue'
// 获取手机系统相关信息
let system = uni.getSystemInfoSync() 
// 获取内容距离手机顶部的高度
let statusBarHeight = ref(system.statusBarHeight)
// 获取胶囊按钮的顶部距离及其自身高度
let { top, height } = uni.getMenuButtonBoundingClientRect() 
let titleBarHeight = ref(height + (top - statusBarHeight.value)*2)
</script>

最终呈现的效果如下所示:

因为获取系统相关信息可能是通用的功能,这里我们可以通过将其抽离出一个单独的钩子函数来进行操作,如下所示:

// 获取手机系统相关信息
const system = uni.getSystemInfoSync() 
// 获取内容距离手机顶部的高度
export const getStatusBarHeight = () => system.statusBarHeight || 0
// 获取胶囊按钮的高度操作
export const getTitleBarHeight = () => {
	if (uni.getMenuButtonBoundingClientRect) {
		let { top, height } = uni.getMenuButtonBoundingClientRect()
		return height + (top - getStatusBarHeight())*2
	} else {
		return 40
	}
}
// 整体的nav高度操作
export const getNavBarHeight = () => getStatusBarHeight() + getTitleBarHeight()

然后我们在相应的组件中进行引入然后使用即可,也能达到相同的效果:

然后我们可以给我们设置的公共nav组件设置一个props来传递不同的title展示不同的标题:

🏕️公告页面布局

接下来完成首页中对公告部分内容,点击跳转到具体的公告页面的内容进行相应的布局,这里我们仍然要创建一个页面出来,这里我们使用到了uni官网提供的一个标签,如下所示:

然后页面我们简单的布局一下:

<template>
	<view class="notice">
		<view class="title">
			<view class="tag">
				<uni-tag inverted text="置顶" type="error" />
			</view>
			<view class="font">这个区域填写标题</view>
		</view>
		<view class="info">
			<view class="item">author</view>
			<view class="item">
				<uni-dateformat :date="Date.now()" format="yyyy-MM-dd hh:mm:ss" />
			</view>
		</view>
		<view class="content">
			内容区域
		</view>
		<view class="count">
			阅读 5888
		</view>
	</view>
</template>

<script setup></script>

<style scoped lang="scss">
.notice {
	padding: 30rpx;
	.title {
		font-size: 40rpx;
		color: #111;
		line-height: 20rpx;
		padding-bottom: 30rpx;
		display: flex;
		.tag {
			transform: scale(0.8);
			transform-origin: left center;
			flex-shrink: 0;
		}
		.font {
			padding-left: 6rpx;
		}
	}
	
}
</style>

然后我们在首页给公告栏的文字内容套上navigator属性进行页面跳转,如下所示:

最终呈现的效果如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python语言day7 函数式编程 面向对象编程

Java 函数式编程_java函数式编程-CSDN博客 25.Java函数式编程-CSDN博客 函数式编程&#xff1a; 通过调用函数send_email()&#xff0c;完成业务需求。将具体的业务需求封装成一个函数这样的一种解决问题的思想称它为函数式编程。 在java中本来没有函数的概念&#xff0c;因为…

指针详解

目录 1. 内存 2. 编址​编辑 3. 指针变量和地址 1&#xff09;取地址操作符&#xff08;&&#xff09; 2&#xff09;指针变量 3&#xff09;指针类型 4&#xff09;解引用操作符 4. 指针变量的大小 5. 指针变量类型的意义 1&#xff09;指针的解引用 6. 指针 -…

Java使用XXL-Job-Admin创建和管理调度任务的指南

文章目录 一、调度中心添加任务的基本方法二、配置文件中的任务配置三、创建并调用调度任务的客户端四、配置RestTemplate 总结 在日常开发中&#xff0c;我们经常需要处理各种定时任务&#xff0c;而XXL-Job作为一款强大的分布式任务调度平台&#xff0c;为我们提供了简单易用…

进程与线程(6)

有名管道&#xff1a; 目录 有名管道&#xff1a; 1.创建&#xff08;mkfifo&#xff09;&#xff1a; 2。打开&#xff08;open&#xff09;&#xff1a; 3.读写&#xff08;read /write&#xff09;&#xff1a; 4.关闭&#xff08;close&#xff09;&#xff1a; 5.卸…

presto高级用法(grouping、grouping sets)

目录 准备工作&#xff1a; 在hive中建表 在presto中计算 分解式 按照城市分组 统计人数 按照性别分组 统计人数 ​编辑 按照爱好分组 统计人数 ​编辑 按照城市和性别分组 统计人数 按照城市和爱好分组 统计人数 按照性别和爱好分组 统计人数 按照城市和性别还有…

【Qt开发】创建并打开子窗口(QWidget)的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案

【Qt开发】创建并打开子窗口&#xff08;QWidget&#xff09;的注意事项 禁止其他窗口点击、隐藏窗口、子窗口不退出的配置和解决方案 文章目录 新建QWidget测试注意事项不要用多线程方式运行子窗口不要在打开子窗口后用阻塞死等不要用临时变量定义子窗口 禁止其他窗口的点击隐…

【Qt】常用控件QPushButton

常用控件QPushButton QWidget中涉及的各种属性/函数/使用方法&#xff0c;对Qt中的各种控件都是有效的。 QPushButton继承自QAbstractButton。这个类是抽象类&#xff0c;是其他按钮的父类。 QAbstractButton中和QPushButton相关性比较大的属性。 属性说明 text 按钮中的⽂本…

Vue中下载内容为word文档

1.使用 html-docx-js&#xff1a;这是一个将 HTML 转换为 Word 文档的库。 2. 利用 Blob 和 FileSaver.js&#xff1a;创建并下载生成的 Word 文档。 在 Vue.js 中实现步骤如下: 1. npm 安装 html-docx-js 和 file-saver npm install html-docx-js npm install file-saver2.…

CAS-ViT:面向高效移动应用的卷积加性自注意力视觉Transformer

摘要 https://arxiv.org/pdf/2408.03703 视觉转换器&#xff08;Vision Transformers&#xff0c;ViTs&#xff09;以其标记混合器强大的全局上下文能力&#xff0c;在神经网络领域取得了革命性的进展。然而&#xff0c;尽管以往的工作已做出相当大的努力&#xff0c;但成对标…

终于来了!中国首个接入大模型的Linux开源操作系统正式发布!

在AI飞速发展的今天&#xff0c;谁不希望自己的电脑里住着一个AI助手&#xff0c;我们动动嘴皮子就能指挥电脑干活&#xff0c;省时省力&#xff1f;但是Windows Copilot锁了区&#xff0c;很多用户只能“望洋兴叹”。 而现在&#xff0c;国产站出来了&#xff0c;说我们也有A…

Python常用的模块

一、logging模块 一&#xff09;日志级别 critical50 error40 waring30 info20 debug10 notset0 二&#xff09;默认的日志级别是waring&#xff08;30&#xff09;&#xff0c;默认的输出目标是终端 logging输出的目标有两种&#xff1a;1、终端&#xff1b;2、文件 高于warn…

如何查看麒麟系统下的CPU信息

如何查看麒麟系统下的CPU信息 一、使用lscpu命令二、使用cat /proc/cpuinfo命令 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在麒麟&#xff08;Kylin&#xff09;Linux系统中&#xff0c;了解CPU的详细信息对于系统性能调优、故障诊断以…

转债违约,是实体经济高质量发展的一大步?

8月14日&#xff0c;岭南股份公告其发行的可转债无法按期兑付&#xff0c;出现实质违约。8月16日&#xff0c;证券时报发表了一篇“雄文”《国企可转债的刚兑信仰该放下了》&#xff0c;引爆了舆论。 文章内容总结下&#xff0c;就是对投资者一顿批评教育&#xff0c;批评投资者…

leetcode-461. 汉明距离

题目描述 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0) …

Spring7中事务传播机制形象图解

一、Spring的7种事务传播机制 Spring事务传播机制是指在多个事务方法相互调用的情况下&#xff0c;事务如何在方法之间进行传播和管理的机制。通过事务传播机制&#xff0c;可以控制事务的范围和行为&#xff0c;保证多个事务方法的一致性和完整性。Spring提供了七种事务传播行…

Linux系统挂载U盘方法

第一步&#xff1a; 插入U盘&#xff0c;如果能够识别出U盘&#xff0c;则会**出一些信息 第二步&#xff1a; 查看U盘系统分配给U盘的设备名&#xff1b;输入如下命令进行查看&#xff1a; 使用fdisk -l命令查看一下U盘是否有被识别到&#xff0c;及识别的U盘是在哪个位置 …

8.15 day bug

bug1 一个按钮折腾了 两个小时 一直点第一个按钮&#xff0c;然后进去后发现根本没有课程&#xff0c;需要创建workspace&#xff0c;然后各种问题&#xff0c;还是没把课程启动起来&#xff0c;然后去看gitpod使用文档&#xff0c;搞懂工作区到底是怎么回事&#xff0c;一通操…

实用篇| 如何快速搭建“二手系统”的数据库

对于一些程序员最痛苦的是接手一些“二手系统“&#xff0c; 由于年久失修&#xff0c; 加上裁员离职&#xff0c;系统文档不完善等原因&#xff0c; 只留下服务器配置和代码。 接手人&#xff0c;只能对着这些仅存的代码和服务器硬刚&#xff0c; 对服务器硬刚的第二步&#x…

Golang | Leetcode Golang题解之第343题整数拆分

题目&#xff1a; 题解&#xff1a; func integerBreak(n int) int {if n < 3 {return n - 1}quotient : n / 3remainder : n % 3if remainder 0 {return int(math.Pow(3, float64(quotient)))} else if remainder 1 {return int(math.Pow(3, float64(quotient - 1))) * …

学习日志--NAT(Network Address Translation)网络地址转换

目录 一、什么是NAT网络地址转换 二、配置并检查实验环境 三、NAT实现原理 四、NAT实现静态配置一对一 五、NAT实现动态配置一对一 六、PAT端口地址转换一对多 七、NAT优化easyIP的问题 八、NAT网络地址转换PAT多对多转换&#xff08;特殊情况&#xff09; 九、NAT---…