【超详细】手搓一个微信日记本


🎀 文章作者:二土电子

🌸 关注公众号获取更多资料!

🐸 期待大家一起学习交流!


  这里对之前的微信记事本小程序进行了重新编写,增加了更加详细的步骤描述,将全部图片都改成了本地图片,针对一些细节进行了补充,本文完整工程可关注文末公众号获取。

实现效果

文章目录

  • 一、安装开发工具
  • 二、新建小程序项目
  • 三、文件夹详解
  • 四、新建/删除页面
    • 4.1 删除页面
    • 4.2 添加页面
  • 五、新建图标文件夹
  • 六、全局配置
  • 七、index页面设计
    • 7.1 设置页面背景
    • 7.2 添加日记本图标
    • 7.3 点击图标跳转
  • 八、list页面设计
    • 8.1 添加日记按钮
    • 8.2 显示全部日记
    • 8.3 删除日记
  • 九、add页面设计
    • 9.1 添加文本输入框
    • 9.2 添加保存按钮
  • 十、details页面设计
    • 10.1 跳转实现
    • 10.2 详情页面实现
  • 十一、注意事项

一、安装开发工具

注册这里就不再赘述了,可以直接到微信公众平台注册账号。注册完成后进入页面,点击左侧的“开发工具”,下载自己所需的版本即可。


下载开发工具

二、新建小程序项目

新建时我们选择不使用云服务,选择TS-基础模板。

新建项目

三、文件夹详解

第二步点击确定后,我们就进入了微信小程序开发的页面。其中有许多文件夹,这里我们简单介绍一下各个文件夹的作用。

微信小程序开发文件夹

  • pages
    存放所有的小程序页面,这里只有两个页面,分别是index和logs。
  • utils
    用来存放工具性质的模块,比如时间格式化。
  • app.json
    小程序的全局配置文件。
  • app.ts
    小程序的全局逻辑文件
  • app.wxss
    小程序的全局样式文件

除了上述描述的文件,每一个页面都有自己的.jison、.ts、.wxml和.wxss文件

  • .jison
    jison是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色。值得注意的是,.jison文件中不能添加注释。
  • .wxml
    类似于.html,我们看到的一些控件都是在这里添加的。
  • .ts
    逻辑文件,一些功能的函数实现。
  • .wxss
    样式文件,用来调整整体页面一些控件或文字的样式。

四、新建/删除页面

我们要设计的记账本主要有个页面

  • index
    引导页面,有一个日记本图标,点击可进入下一个页面。
  • list
    全部日记列表页面,可在本页面点击添加日记、删除日记或者进入日记详情。
  • add
    添加日记页面。
  • details
    日记详情页面。

我们首先需要删除掉原先自带的logs页面,然后新建其他几个页面。

4.1 删除页面

删除比较简单,我们选中logs页面的文件夹,右键删除即可,但是不要忘记,我们还需要在app.jison文件中将logs页面的路径删掉。

删除页面

4.2 添加页面

添加页面也非常简单,并不需要我们手动新建文件夹,添加文件夹下面的其他文件。我们只需要在app.jison文件中写入我们想要添加的页面,保存之后就会自动在pages文件夹中生成页面文件夹,非常的方便。这里给大家演示一下。

添加页面

五、新建图标文件夹

此次设计的日记本,使用的是本地图标,因此这里介绍的是如何添加本地图标,当然也可以自己去网上找一些网页图片添加进来,这里就不再做详细介绍了。

如果想使用本地图标,我们需要给所有的图标准备一个文件夹,这里我们直接新建到微信小程序工程文件所在的文件夹里。

新建图标文件夹

六、全局配置

首先我们简单的对我们小程序全局进行简单的美化,实际也就是在app.jison文件中,修改窗口的一些参数。

我们修改了导航栏的背景颜色,导航栏的文字和字体颜色。
导航栏配置

这里贴一下程序,方便复制粘贴

  "window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#c8b4eb","navigationBarTitleText": "ertu电子","navigationBarTextStyle": "white"},

七、index页面设计

7.1 设置页面背景

我们上面说了,本次使用的图片全部是本地图片,这里准备了一个背景图片,存放在images文件夹,添加进来即可。

.wxml文件程序

<view><image class="bg-image" src="/images/background.jpg"></image>
</view>

.wxss文件程序

/* 背景图片样式 */
.bg-image{width: 100%;height: 100%;position: fixed;z-index: -1;   /* 放在最底层 */
}

至此,背景图片添加完成,可以看一下效果。

添加背景图片

7.2 添加日记本图标

添加日记图标与上面的操作类似,下载好图标后,创建样式,添加到页面。程序如下

.wxml程序

<image class="appicon" src="/images/diaryicon.png"></image>

.wxss程序

/* App图标样式 */
.appicon{margin: 5%;   /* 设置上、下、左、右间距 */width: 100rpx;height: 100rpx;position: fixed;
}

实现效果如下

添加日记图标

为了提示该图标功能为日记本,这里添加一个文字提示,.wxml文件添加下面的程序

  <text style="color: white; font-size: medium; position: relative; left: 36rpx; top: 145rpx">日记本</text>

7.3 点击图标跳转

接下来我们需要实现,点击日记本图标,跳转到日记列表页面。实际就是给日记本图标添加一个点击事件的处理函数。

首先修改.wxml文件程序,给图片的点击事件添加一个处理函数。

<image class="appicon" src="/images/diaryicon.png" bind:tap="gotolistpage"></image>

然后在.ts文件中编写详细的函数实现。

  gotolistpage(){wx.navigateTo({url: '../list/list'   //跳转链接})}
})

实现效果如下

点击图标跳转

八、list页面设计

8.1 添加日记按钮

首先按照上面介绍的方法,修改list页面的背景,添加一个添加日记的图标,给图标的点击事件添加一个跳转功能,跳转到添加日记页面。实现效果如下

添加日记跳转

8.2 显示全部日记

显示全部日记首先需要在.wxml文件中添加一个滚动的控件用来显示全部日记列表,程序如下

  <!--底部滚动--><scroll-view class="des-scr" scroll-y="true"><!--循环显示所有日记内容--><block wx:for="{{totalDiaryConcent}}"><!-- 利用data-将当前的索引传递到删除或者打开详情的函数 --><view class="des-view" bindtap="diary_detail" bindlongtap="delet" data-content="{{item}}" data-saveid="{{index}}"><text class="des-text">{{item.des}}</text><text class="des-tiemText">{{index + 1}}</text></view><!-- </navigator> --></block></scroll-view>

通过上面的程序我们可以看出,我们给每一条日记增加了一个点击事件处理函数和长按事件处理函数,功能会在后面介绍。

然后在.ts文件中,实现获取当前本地缓存的全部日记功能。首先在.ts文件中添加用到的数据

  data: {id: '',totalDiaryConcent: []   // 全部日记},

然后实现获取全部本地缓存日记功能

  // 全部日记显示onShow: function () {// 获取当前全部日记内容// 必须要新定义一个再赋值才能正常显示,原因未知var arryTemp = wx.getStorageSync('totalDiaryConcent');this.setData({totalDiaryConcent: arryTemp})},

8.3 删除日记

长按日记,会弹出提示框,点击确定后会删除对应日记,这里有两个重点问题,首先是如何知道用户选择的是哪一条日记,其次是如何删除用户选择的日记。

首先说一下如何知道用户选择的哪一条日记,这里利用data-将用户选中的日记ID传给.ts文件。

其次说一下知道了用户想要删除哪一条日记之后如何将该条日记删除掉,这里用的方法个人觉得比较巧妙。定义一个新的数组,获取到传递过来的日记ID后利用for循环将除了想要删除的日记外的之前的本地缓存日记全部重新缓存到新的数组,然后缓存到本地缓存中。

但是需要注意的是,这样虽然在本地缓存中删除了想要删除的日记,但是会发现主页面中它并没有消失,此时需要我们在删除完成后重新渲染一次页面。

  // 删除日记内容delet:function(e:any){// 进行作用域外部指向let that = this;wx.showModal({title: '温馨提示',content: '是否要删除这条日记?',// 点击确定后删除掉对应缓存success (res) {if (res.confirm) {// 获取传递过来的索引var curId = e.currentTarget.dataset.saveid;// 获取全部日记内容var arryTemp = wx.getStorageSync('totalDiaryConcent');// 设置一个新的数组var newDiaryContent = [];// 利用for循环将不需要删除的存储起来for (var i = 0;i < arryTemp.length;i ++) {if (i != curId) {newDiaryContent.push(arryTemp[i])}}// 重新更新全部日记内容,其中不包含要删除的日记// 一定注意这里不要将新的日记内容用单引号引起来,否则会出现删除一条日记后冒出来很多条空日记// 而且之后也不能再添加新日记wx.setStorageSync('totalDiaryConcent',newDiaryContent);}// 利用onShow中同样的方法重新渲染页面var arryTemp = wx.getStorageSync('totalDiaryConcent');that.setData({totalDiaryConcent: arryTemp})}})},

九、add页面设计

下面我们来设计一下添加日记的页面。

9.1 添加文本输入框

.wxml程序如下

  <!-- 输入长度默认限制为140,maxlength为-1时表示不限制最大长度 --><textarea class= "the-textarea"  bindinput="getInputText" style="  margin: 5%;width: 90%;height: 90%" maxlength="-1"></textarea>

文本输入框的输入时间由函数“getInputText”来处理,用来回去输入的内容,函数实现在.ts文件。

  // 文字输入框getInputText(e:any) {//记录输入的文字   this.setData({inputText: e.detail.value})},

9.2 添加保存按钮

  <!-- 保存按钮 --><button class="the-btn" bindtap="saveButton">保存心情</button>

保存按钮的点击事件由“saveButton”函数来处理,函数实现在.ts文件,注释比较明确,这里就不再赘述了。

  // 保存按钮saveButton() {// 如果输入是空if (this.data.inputText.length == 0) {return;}// 输入内容不为空else {// 获取本地缓存的之前的所有日记内容var diaryContent = wx.getStorageSync('totalDiaryConcent');// 如果之前有日记内容if (diaryContent != null && diaryContent != '') {// 获取当前日记总条数var curTotalNum = wx.getStorageSync('totalDiaryNum');// 日记总条数加1作为下一条日记idvar nextDiaryId = curTotalNum + 1;// 添加新日记,id为之前日记总条数加1diaryContent.push({ 'des': this.data.inputText, 'diaryid': nextDiaryId });// 存储新日记总条数wx.setStorageSync('totalDiaryNum', 'nextDiaryId');}// 之前没有日记内容,是第一条日记else {diaryContent = [{ 'des': this.data.inputText, 'diaryid': 0 }];// 保存第一条日记wx.setStorageSync('totalDiaryNum', '0');this.setData({id: '0'})}}// 将输入内容存入缓存wx.setStorageSync('totalDiaryConcent', diaryContent);// 跳转回上一页面wx.navigateBack({})},

在.ts文件中,需要先定义好用到的数据

  data: {inputText: '',   // 存储输入内容diaryid: ''},

至此,我们来看一下目前实现的效果

实现效果

十、details页面设计

最后我们来设计日记详情页面,也就是点击日记,会跳转到日记详情。

10.1 跳转实现

在日记列表也就是list页面,点击日记我们应该能够跳转到日记详情页面。所以我们给每一条日记都增加一个点击函数“diary_detail”,函数实现是在list的.ts文件中。

  // 查看日记详情diary_detail:function(e:any){// 获取点击的日记的内容var item = e.currentTarget.dataset.content// 将点击到的日记的内容传递到下一个页面var url = '/pages/details/details?des=' + item.deswx.navigateTo({url: url,})},

10.2 详情页面实现

日记详情显示较为简单,需要解决的问题主要有两个,一个是如何确定用户想要查看的是哪条日记内容,这个在删除日记中已经解决。第二个就是如何将用户想要查看的日记详情显示出来,这里说白了就是如何实现页面间的传值,将获取到的日记内容从主页传递到详情页面,然后把它渲染到页面就好啦。

.wxml文件程序如下

<view class="diary-detail"><text>{{showContent}}</text>
</view>

.wxss文件程序如下

.diary-detail{font-size: large;color: #8B4513;/* 多文本自动换行 */word-break:break-all;
}

.ts文件中加入获取日记内容的函数

  /*** 生命周期函数--监听页面加载* 获取点击的日记内容*/onLoad(options) {this.setData({showContent: options.des})}

十一、注意事项

  • 本地图片路径中不要有中文!
  • 当前的一些样式布局是根据IPhon5布局,对于其他机型某些地方可能会出现比例失调或者错位的情况,可以自行根据需要修改。
  • 本程序中的日记全部存储在本地缓存中,只能本机看到,其他用户无法看到。

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

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

相关文章

用EasyAVFilter将网络文件或者本地文件推送RTMP出去的时候发现CPU占用好高,用的也是vcodec copy呀,什么原因?

最近同事在用EasyAVFilter集成在EasyDarwin中做视频拉流转推RTMP流的功能的时候&#xff0c;发现怎么做CPU占用都会很高&#xff0c;但是视频没有调用转码&#xff0c;vcodec用的就是copy&#xff0c;这是什么原因呢&#xff1f; 我们用在线的RTSP流就不会出现这种情况&#x…

SSM个性化旅游管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 个性化旅游管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B…

raid磁盘阵列

在单机时代&#xff0c;采用单块磁盘进行数据存储和读写的方式&#xff0c;由于寻址和读写的时间消耗&#xff0c;导致I/O性能非常低&#xff0c;且存储容量还会受到限制。另外&#xff0c;单块磁盘极其容易出现物理故障&#xff0c;经常导致数据的丢失。此时&#xff0c;RAID技…

新材料制造ERP用哪个好?企业应当如何挑选适用的

有些新材料存在特殊性&#xff0c;并且在制造过程中对车间、设备、工艺、人员等方面提出更高的要求。还有些新材料加工流程复杂&#xff0c;涉及多种材料的请购、出入库、使用和管理等环节&#xff0c;解决各个业务环节无缝衔接问题是很多制造企业面临的管理难题。 新材料制造…

牙科诊所小程序开发案例

一、背景&#xff1a; 针对传统口腔医疗领域中口腔诊所推广难,纸质信息保存难等问题&#xff0c;设计并开发了基于微信小程序实现口腔服务助手平台。为了给人们提供便捷&#xff0c;快速的预约方式&#xff0c;提高社会人群对口腔健康的关注力度。通过微信小程序互联网技术&…

文旅虚拟人IP:数字时代的传统文化推荐官

近几年&#xff0c;随着文旅虚拟人频“上岗”&#xff0c;虚拟人逐渐成为了文旅品牌的一种新颖的传统文化传播思路。 文旅品牌定制化推出虚拟人&#xff0c;本质原因是2023旅游业全面复苏&#xff0c;各文旅玩法同质化现象严重&#xff0c;在这样的境遇下&#xff0c;文旅品牌开…

OpenMLDB v0.8.4 诊断工具全面升级

新的v0.8.4版本中&#xff0c;我们对于诊断工具进行了全面系统化的升级&#xff0c;以提供更加完整和智能化的诊断报告&#xff0c;有助于高效排查 OpenMLDB 集群问题&#xff0c;大幅提升运维效率。 相比于之前的版本&#xff0c;新的诊断工具增添一键诊断功能&#xff0c;使…

首个央企量子云计算项目,中标!

6月29日&#xff0c;北京玻色量子科技有限公司&#xff08;简称“玻色量子”&#xff09;成功中标中国移动云能力中心“2023—2024年量子算法及光量子算力接入关键技术研究项目”&#xff0c;这是玻色量子继与移动云签订“五岳量子云计算创新加速计划”后&#x1f517;&#xf…

杰发科技AC7801——EEP内存分布情况

简介 按照文档进行配置 核心代码如下 /*!* file sweeprom_demo.c** brief This file provides sweeprom demo test function.**//* Includes */ #include <stdlib.h> #include "ac780x_sweeprom.h" #include "ac780x_debugout.h"/* Define …

Python,FastAPI,mLB网关,无法访问/docs

根源就是js和ccs文件访问路由的问题&#xff0c;首先你要有本地的文件&#xff0c;详情看https://qq742971636.blog.csdn.net/article/details/134587010。 其次&#xff0c;你需要这么写&#xff1a; /unicontorlblip就是我配置的mLB网关路由。 app FastAPI(titleoutpaint…

【力扣:421,2935】数组内最大异或对问题

思路&#xff1a;从最高位向低位构造&#xff0c;对每一位利用哈希表寻找是否存在可使此位为1的数 第一轮找1&#xff1a;清空哈希表&#xff0c;1&#xff0c;2存1&#xff0c;到3发现1^01&#xff0c;res|1<<3 第二轮找11&#xff1a;清空哈希表&#xff0c;1存10&…

如何开发洗鞋店用的小程序

随着人们生活水平的提高&#xff0c;洗护行业是越来越细分化了&#xff0c;从最开始的干洗店包含洗护行业的所有服务到现在有专门为洗鞋开的店&#xff0c;如果开发一款洗鞋店用的小程序&#xff0c;可以实现用户在家下单直接有人上门取鞋的话&#xff0c;应该如何去开发呢&…

将 Spring 微服务与 BI 工具集成:最佳实践

软件开发领域是一个不断发展的领域&#xff0c;新的范式和技术不断涌现。其中&#xff0c;微服务架构和商业智能&#xff08;BI&#xff09;工具的采用是两项关键进步。随着 Spring Boot 和 Spring Cloud 在构建强大的微服务方面的普及&#xff0c;了解这些微服务如何与 BI 工具…

11-@Transaction与AOP冲突解决

如题&#xff0c;最近碰到了一个问题&#xff0c;在public方法上添加Transaction没有生效&#xff0c;事务没有回滚。 我自己模拟了一个功能&#xff0c;向数据库表User里面插入用户数据。说一下代码背景&#xff0c; 数据库MySQL&#xff0c;持久化层Mybatis&#xff0c;项目使…

Vue3(setup)中使用vue-cropper图片上传裁剪插件,复制代码直接使用

最近在项目中用到上传裁剪&#xff0c;看了一下代码&#xff0c;觉得这插件可可以。梳理了一下代码分享给大家 前端UI组件element-plus 如果你也用到了 &#xff0c;快速帮你解决了问题,别忘记点赞收藏 1.首先看效果图 因为版本vue-cropper 众多 &#xff0c;虽然网上有各…

阿里云windwos 安装oracle数据库,外部用工具连接不上,只能在服务器本机通过127.0.0.1 连接

1. 首先检查阿里云服务器安全组端口是否开放 oracle 数据库端口 2. 其次找到oracle 安装的目录&#xff0c;打开这俩个文件&#xff0c;将localhost 修改为 服务器本机名称 3.重启oracle 监听服务&#xff0c;就可以连接了

技术部工作职能规划分析

前言 技术部的职能。以下是一个基本的框架,其中涵盖了技术部在公司中的关键职能和子职能。 主要职能 技术部门的主要职能分为以下几个板块: - 技术规划与战略: 制定技术规划和战略,与业务团队合作确定技术需求。 研究和预测技术趋势,引领公司在技术创新和数字化转型方…

基于springboot实现智慧党建系统项目【项目源码】计算机毕业设计

基于springboot实现智慧党建系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以…

【Unity细节】Unity中为什么用字符串加载对象,检查多便都加载不出来—(命名细节)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

【Python】itertools模块,补充:可迭代对象、迭代器

Python中 itertools模块创建高效迭代器、处理序列数据集。 此模块所有函数返回迭代器&#xff0c;可用for循环获取迭代器中的内容&#xff0c;也可用list(...)用列表形式显示内容。 import itertools[ x for x in dir(itertools) if not x.startswith(_)] # 结果&#xff1a;…