微信小程序项目实例——心情记事本

news2024/11/27 11:55:05

微信小程序项目实例——心情记事本

文章目录

  • 微信小程序项目实例——心情记事本
  • 一、项目展示
  • 二、首页
  • 三、效果图
  • 文末

项目代码见文字底部,点赞关注有惊喜


一、项目展示

心情记事本是一款可以记录当前心情和生活的记事本
用户可以选择当前的心情(开心、平淡、伤心)和表情
并结合自己想要描述的文字
就可以记录当前的心情了

为了更好的展现用户的心情
项目罗列了大量的精美表情
缩略图如下:
在这里插入图片描述

项目的展示图如下:
在这里插入图片描述

二、首页

首页主要由日历组件和自制的记录组件结合而成
在这里插入图片描述
主要代码如下:

<view class="container">
    <view class="title">
        <view class="left-arrow" bindtap="prev_month"> <image src="/asset/images/left-arrow.svg" class="arrow"></image> </view>
        <picker mode="date" value="{{date}}" fields="month" start="{{start_date}}" end="{{end_date}}" bindchange="select_date">
            <view class="date-picker"> {{now_date}} </view>
        </picker>
        <view class="right-arrow" bindtap="next_month"> <image src="/asset/images/right-arrow.svg" class="arrow"></image> </view>
    </view>
    <view class="divider-box">
        <image src="/asset/images/divider.svg" class="divider"></image>
    </view>
    <view class="calender">
        <view class="calender-header">
            <image src="/asset/images/SUN.svg" class="week-item"></image>
            <image src="/asset/images/MON.svg" class="week-item"></image>
            <image src="/asset/images/TUE.svg" class="week-item"></image>
            <image src="/asset/images/WED.svg" class="week-item"></image>
            <image src="/asset/images/THU.svg" class="week-item"></image>
            <image src="/asset/images/FRI.svg" class="week-item"></image>
            <image src="/asset/images/SAT.svg" class="week-item"></image>
        </view>
        <view class="calender-body">
            <block wx:for="{{ date_arr }}" wx:key="key">
                <view class="date-item date-enabled-{{item.enabled}} date-today-{{item.today}} ">
                    <span>{{item.date}}</span>
                    <block wx:if="{{item.emotion_value}}">
                        <image src="/asset/images/circle-{{item.emotion_value}}.svg" class="circle"></image>
                    </block>
                </view>
            </block>

        </view>
    </view>

    <view class="diary">
        <view wx:for="{{ items }}" wx:key="{{key}}">
            <view class="diary-item" key="{{key}}" bindtap="detail" data-key="{{ item.key }}">
                <view class="diary-date">
                    <view class="date">{{ item.value['date']}}</view>
                    <view class="day">{{ item.value['week']}}</view>
                </view>
                <image src="/asset/images/virtical-divider.svg" class="virtical-divider"></image>
                <view class="emoji">
                    <image src="/asset/emojis/{{ item.value['emoji_type']}}.svg" class="emoji-image"></image>
                </view>
                <image src="/asset/images/virtical-divider.svg" class="virtical-divider"></image>
                <view class="text">{{ item.value['text'] }}</view>
                <image class="more-arrow" src="/asset/images/more-arrow.svg"></image>
            </view>
        </view>


    </view>
</view>
<image src="/asset/images/add-button.svg" class="add-button" bindtap="blank_modal"></image>
<view class="cover" wx:if="{{modal_visiable}}" bindtap="cancle"></view>
<view class="modal ripple bounceInDown" wx:if="{{modal_visiable}}">
    <view class="create-box">
        <image src="/asset/images/close-button.svg" class="close-button" bindtap="cancle"></image>
        <image src="/asset/emojis/{{ emoji_indicator }}.svg" class="emoji-image"></image>
        <view class="emoji-select-box">
            <picker-view indicator-style="height: 50px;" value="{{ emoji_defaul_value }}" class="emoji-picker" bindchange="select_emoji">
                <picker-view-column>
                    <view style="line-height: 50px; color: #797979">伤心的表情</view>
                    <view style="line-height: 50px; color: #797979">开心的表情</view>
                    <view style="line-height: 50px; color: #797979">平淡的表情</view>
                </picker-view-column>
                <picker-view-column>
                    <view wx:for="{{ emoji_list }}" wx:key="key">
                        <image src="/asset/emojis/{{ item }}.svg" style="height: 100%; width: 100rpx;"></image>
                    </view>
                </picker-view-column>
            </picker-view>
        </view>
        <block wx:if="{{ is_newbee }}">
            <textarea placeholder="选择表达今天心情的emoji, 或者在此写点文字, enjoy ~ ~" value="{{ text }}" bindinput="input"  placeholder-style="color:#9B9B9B;font-size:26rpx;line-height:46rpx" class="text"/>
        </block>
        <block wx:else>
            <textarea placeholder="写点什么,当然你也可以什么都不写" value="{{ text }}" bindinput="input"  placeholder-style="color:#9B9B9B;font-size:26rpx;" class="text"/>
        </block>
        <view class="button-box">
            <block wx:if="{{ delete_button_visiable}}">
                <view class="delete-button" bindtap="delete" style="visibility: show">删除</view>
            </block>
            <block wx:else>
                <view class="delete-button" bindtap="delete" style="visibility: hidden">删除</view>
            </block>
            <view class="submit-button" bindtap="save">保存</view>
        </view>
    </view>
</view>
let app = getApp()
let util = require('../../utils/util.js')
let date_formater = require('../../utils/date_formater.js')
let storage = require('../../utils/data_storage.js')


Page({
    data: {
        'date_arr': [],
        'now_date': '2017-04-11',
        'start_date': '2015-04-11',
        'end_date': '2019-04-11',
        'date': '',
        'year': 0,
        'month': 0,
        'items': [],
        'modal_visiable': false,
        'emoji_list': [],
        'emoji_indicator': 'face-with-stuck-out-tongue-and-winking-eye',
        'emoji_defaul_value': [1, 1],
        'text': '',
        'item_key': '', //当前条目的key
        'delete_button_visiable': false ,//modal中的删除按钮是否可见
        'is_newbee': false // 是不是第一次使用
    },
    // 初始化页面数据
    page_init: function(year, month) {
        console.log(year + '-' + month + ' data had initialized')

        let data = util.get_date(year, month)

        let emojis = util.get_emojis()
        this.setData({
            'date_arr': data,
            'now_date': date_formater.format_month(month) + ' ' +year,
            'date': year + '-' + date_formater.add_date_prefix(month + 1) + '-01',
            'year': year,
            'month': month,
            'start_date': year - 2 + '-' + date_formater.add_date_prefix(month + 1) + '-01',
            'end_date': year + 2 + '-' + date_formater.add_date_prefix(month + 1) + '-01',
            'items': storage.all(year, month),
            'emoji_list': emojis['positive'],
        })

    },

    onLoad: function() {
        let date = new Date()
        let year = date.getFullYear()
        let month = date.getMonth()
        let emojis = util.get_emojis()

        this.page_init(year, month)
        // let is_newbee = util.is_newbee()
        let is_newbee = false
        if(is_newbee) {
            this.blank_modal()
        }
        this.setData({
            'is_newbee': is_newbee
        })
    },

    
    select_date: function(e) {
        let date_str = e.detail.value
        let date_arr = date_str.split('-')
        let year = parseInt(date_arr[0])
        let month = parseInt(date_arr[1]) - 1
    
        this.page_init(year, month)
    },

    prev_month: function() {
        let year = this.data.year
        let month = this.data.month

        if (month - 1 < 0) {
            year = year - 1
            month = 11
        } else {
            month = month - 1
        }

        this.page_init(year, month)
    },

    next_month: function() {
        let year = this.data.year
        let month = this.data.month

        if (month + 1 > 11) {
            year = year + 1
            month = 0
        } else {
            month = month + 1
        }

        this.page_init(year, month)
    },

    modal: function() {
        this.setData({
            'modal_visiable': true,
            'delete_button_visiable': true
        })
    },

    blank_modal: function() {
        this.setData({
            'modal_visiable': true,
            'emoji_indicator': 'face-with-stuck-out-tongue-and-winking-eye',
            'emoji_defaul_value': [1, 1],
            'text': '',
            'delete_button_visiable': false
        })

    },

    select_emoji: function(e) {
        var val = e.detail.value
        let emoji_type = val[0]
        let emoji_index = val[1]
        let emojis = util.get_emojis()
        var emoji_list = []

        if(emoji_type == 0) {
            emoji_list = emojis['negative']
        }
        if(emoji_type == 1) {
            emoji_list = emojis['positive']
        }
        if(emoji_type == 2){
            emoji_list = emojis['neutral']
        }

        this.setData({
            'emoji_list': emoji_list,
            'emoji_indicator': emoji_list[emoji_index]
        })
    },

    input : function(e) {
        this.setData({
            'text': e.detail['value']
        })
        // console.log(this.data.text)
    },
    save: function(){
        let date = new Date()
        let year = date.getFullYear()
        let month = date.getMonth()
        let day = date.getDate()
        let key = year + '-' + date_formater.add_date_prefix(month + 1)+'-' + date_formater.add_date_prefix(day)
        
        storage.add(key, this.data.emoji_indicator, 0, 0, 0, this.data.text)
        this.page_init(year, month)
        this.cancle()
    },

    delete: function() {
        storage.del(this.data.item_key)
        this.page_init(this.data.year, this.data.month)
        this.cancle()
    },

    cancle: function() {
        this.setData({
            'modal_visiable': false
        })
    },

    detail: function(e) {
        let key = e.currentTarget.dataset.key
        let item = storage.get(key)
        let emoji_defaul_value = util.get_emoji_pos(item['emoji_type'])
        this.setData({
            'text': item['text'],
            'emoji_indicator': item['emoji_type'],
            'emoji_defaul_value' : emoji_defaul_value,
            'item_key': key
        })
        this.modal()
    }

})

三、效果图

具体的效果展示如下
在这里插入图片描述


文末

具体的介绍就到这里了
有兴趣的同学可以继续研究
代码放到下面链接里了

点击下载 小程序

在这里插入图片描述

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

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

相关文章

自己写一个简单的工作流引擎V1

1.需求 市面上常见的工作流组件一般都是前端通过拖拉拽配置流程图&#xff0c;后端流程引擎解析流程配置&#xff0c;这里我们手写一个简单的流程引擎&#xff0c;先实现串行流程&#xff0c;例如下&#xff1a; 小明提交了一个申请单&#xff0c;然后经过经理审批&#xff0…

【学习】Meta Learning、

文章目录一、Meta Learning什么是元学习&#xff1f;元学习–第1步元学习–第2步元学习–步骤3架构ML和Meta回顾GD学习好的初始化参数学习学习率NAS寻找网络结构data augmentationSample ReweightingFew-shot Image Classification元学习与自我监督学习元学习和知识蒸馏元学习和…

语音识别综述

语音识别的基本单位 Phoneme&#xff1a; 音位&#xff0c;音素 a unit of sound 是声音的最基本单位**&#xff0c;每个词语token的声音由多个 phoneme 组成** Grapheme&#xff08;字位&#xff09; smallest unot of a writing system 每个单词书写最基本的单位&#xff…

Vue初识系之Webpack

文章目录一 Webpack简介二 Webpack的安装和使用2.1 安装Webpack2.2 配置参数初识2.3 使用webpack一 Webpack简介 webpack本质上是一个现代JavaScript应用程序的静态模块打包器&#xff08;modulebundler&#xff09;。当webpack处理应用程序时&#xff0c;它会递归地构建一个依…

LeetCode(String)2194. Cells in a Range on an Excel Sheet

1.问题 A cell (r, c) of an excel sheet is represented as a string “” where: denotes the column number c of the cell. It is represented by alphabetical letters. For example, the 1st column is denoted by A, the 2nd by B, the 3rd by C, and so on. is the ro…

Java抽象类:概述

1.抽象类 在Java中abstract是抽象的意思&#xff0c;可以修饰类、成员方法。 abstract修饰类&#xff1a;这个类就是抽象类。 abstract修饰方法&#xff1a;这个方法就是抽象方法。 修饰符 abstract class 类名{修饰符 abstract 返回值类型 方法名(形参列表); } public ab…

助力旅游业复苏,IPIDEA让旅游资源聚合更简单

目前我国疫情防控政策的优化&#xff0c;极大的简化了出境手续&#xff0c;对于深受疫情影响的旅游业来说&#xff0c;这无疑是一个好消息。随着旅游消费需求持续的增长&#xff0c;旅游业将会逐渐进入全面复苏的新进程&#xff0c;焕发新的活力。 全球旅游市场都在关注着中国…

ABAP 内表的定义,与PERFORM传值的定义<转载>

很早之前就想总结一下内表和定义和perform的传值定义&#xff0c;结果要么没时间&#xff0c;要么有时间忘了。 今天在网上看到一个博文写的还比较清楚&#xff0c;故读书人窃来一用 ^ - ^ 原文链接&#xff1a;https://blog.csdn.net/lmf496891416/article/details/117702217 …

5 UML views and the 9+4 UML Diagrams 关系

Refer&#xff1a;UML2.5图概述-Lib教程 UML旨在通过的建模图形Diagram&#xff0c;可视化 5 种不同的视图View。 这五个视图是&#xff1a; 一、Users View : 用户视图 1. Use case Diagram&#xff1a;用例图性 二、Structural Views : 结构视图 2. Class Diagrams&#xf…

数码钢琴行业市场运行态势及投资战略规划分析

2023-2029年中国数码钢琴行业市场运行态势及投资战略规划报告 报告编号&#xff1a;1691312 免费目录下载&#xff1a;http://www.cninfo360.com/yjbg/jdhy/sxjd/20230109/1691312.html 本报告著作权归博研咨询所有&#xff0c;未经书面许可&#xff0c;任何组织和个人不得以…

C语言进阶(5)——内存操作函数的解析

1.memcpy函数 void * memcpy ( void * destination, const void * source, size_t num ); 用途&#xff1a;各种数据类型&#xff0c;从源数组拷贝num个字节到指定目标空间里面。 要点&#xff1a; &#xff08;1&#xff09;函数memcpy从source的位置开始向后复制num个字节的数…

【虹科案例】虹科数字化仪在超声波中的应用以及如何选择合适的数字化仪

图 1&#xff1a;虹科M4i.4451-x8——用于采集超声波信号的 PCIe 4 通道 14 位 500 MS/s 数字化仪 超声波是一种频率大于人类听觉范围上限的声学声压波。超声波设备的工作频率从 20 kHz 到几千兆赫兹。表 1 总结了一系列常见的超声波应用的特性。 每个应用中使用的频率范围反映…

JSP SSM 仓库租赁管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM 仓库租赁管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

C语言进阶——字符串函数和内存函数

目录 一. strlen 二. strcpy 三. strcat 四. strcmp 五. strncpy 六. strncat 七. strncmp 八. strstr 九. strtok 一. strlen 字符串以 \0 作为结束标志&#xff0c;strlen函数返回的是在字符串中 \0 前面出现的字符个数&#xff08;不包 含 \0 …

TCP/IP网络编程(1)——理解网络编程和套接字编程

文章目录一、理解网络编程和套接字编程1.1 socket套接字1.1.1 一个例子来表示TCP的网络连接1.1.2 程序实现1.2 文件操作1.2.1 文件描述符一、理解网络编程和套接字编程 1.1 socket套接字 网络编程又称为套接字编程&#xff0c;为什么要用套接字&#xff1f;我们把插头插到插座…

Linux常用命令——ngrep命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) ngrep 方便的数据包匹配和显示工具 补充说明 ngrep命令是grep命令的网络版&#xff0c;他力求更多的grep特征&#xff0c;用于搜寻指定的数据包。正由于安装ngrep需用到libpcap库&#xff0c; 所以支持大量的操…

【Java】面向对象笔记

开篇 主线 类及类的成员 属性、方法、构造器&#xff1b; 代码块&#xff0c;内部类 面向对象三大特征 继承、封装、多态 其他关键字 this,super,static,final,abstract,interface等 面向对象的两个要素 一、是什么 类&#xff1a;对一类事物的描述&#xff0c;是抽象的…

Java综合练习

Java综合练习一、涉及到的知识点二、卖飞机票三、找质数四、开发验证码五、数组元素的复制六、评委打分七、数字加密八、数字解密九、抢红包方法一&#xff1a;判断是否被抽取方法二&#xff1a;打乱数组十、模拟双色球土、二维数组一、涉及到的知识点 变量、数组运算符程序流…

python采集IP代理数据,防止数据采集IP被封情况

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 为什么要IP代理&#xff1a; 当采集数据, 批量采集数据, 请求速度过快, 网站可能会把你IP封掉 <你的网络进不去这个网站> IP代理换一个IP, 再去采集请求数据 一. 抓包分析数据来源 1. 明…

Runtime、ProcessBuilder的区别(Java中,两种方法来启动其他程序)

目录 ■Runtime、ProcessBuilder 区别&#xff1a; ■Java中提供了两种方法来启动其他程序 ■代码 ・Runtime ・ProcessBuilder ■类的方法 ・Process.waitFor()方法 ・Process.getErrorStream()方法 ・Process.redirectErrorStream(true)方法: ■可运行代码 ・java…