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

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

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

文章目录

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


一、项目展示

心情记事本是一款可以记录当前心情和生活的记事本

用户可以选择当前的心情(开心、平淡、伤心)和表情

并结合自己想要描述的文字

就可以记录当前的心情了

为了更好的展现用户的心情

项目罗列了大量的精美表情

缩略图如下:

项目的展示图如下:

二、首页

首页主要由日历组件和自制的记录组件结合而成

主要代码如下:

<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()
    }
})

三、效果图

具体的效果展示如下


文末

具体的介绍就到这里了

有兴趣的同学可以继续研究

代码放到下面链接里了

点击下载 小程序

相关文章
|
1月前
|
监控 小程序 安全
【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(2)
小程序提供便捷的鲜花选购和配送服务,汇聚全球优质鲜花品种,确保新鲜送达。用户可轻松挑选花束,享受个性化配送,并通过地图功能查看配送位置。此外,物流功能实时更新,保证鲜花安全快速到达。代码示例展示了地图和物流信息的页面布局与交互实现。 ### 配送与物流功能亮点 1. **地图功能**:使用`map.wxml`, `map.wxss`, 和 `map.js` 实现定位与导航,确保精准配送。 2. **物流追踪**:通过`logistics.wxml`, `logistics.wxss`, 和 `logistics.js` 显示详细物流状态,提供流畅的用户体验。
47 1
【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(2)
|
18天前
|
移动开发 开发框架 小程序
开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
开发H5程序或者小程序的时候,后端Web API项目在IISExpress调试中使用IP地址,便于开发调试
|
6天前
|
前端开发 JavaScript API
微信公众号项目,实现微信支付(具体流程和参数)
微信公众号项目,实现微信支付(具体流程和参数)
|
1月前
|
小程序 安全 搜索推荐
【微信小程序开发实战项目】——个人中心页面的制作
本文介绍了如何设计和实现一个网上花店的微信小程序,包括个人中心、我的订单和我的地址等功能模块。个人中心让用户能够查看订单历史、管理地址和与客服互动。代码示例展示了`own.wxml`、`own.wxss`和`own.js`文件,用于构建个人中心界面,包括用户信息、订单链接、收藏、地址、客服和版本信息。我的订单部分展示了订单详情,包括商品图片、名称、销量、价格和订单状态,用户可以查看和管理订单。我的地址功能允许用户输入和编辑收货信息,包括联系人、性别、电话、城市和详细地址。每个功能模块都附有相应的WXML和WXSS代码,以及简洁的样式设计。
72 0
【微信小程序开发实战项目】——个人中心页面的制作
|
1月前
|
小程序 安全 搜索推荐
【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(3)
这是一篇关于微信小程序开发的文章摘要,作者介绍了如何创建一个网上花店小程序,旨在提供便捷的购花体验。小程序包含鲜花分类功能,允许用户按品种、颜色和用途筛选,确保快速找到合适的鲜花。它还提供了配送服务,保证鲜花的新鲜度。文章展示了`cash.wxml`、`cash.wxss`和`cash.js`的部分代码,用于实现分类和商品展示,以及`qin.wxml`、`qin.wxss`和`qin.js`,涉及商品详情和购买付款流程。代码示例展示了商品列表渲染和交互逻辑,包括页面跳转、数据传递和点击事件处理。文章最后提到了购买付款界面,强调了安全和便捷的支付体验。
68 0
【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(3)
|
2月前
|
程序员 开发者
黑马程序员 苍穹外卖项目 Day微信支付问题解决与生成订单号超出上限问题
黑马程序员 苍穹外卖项目 Day微信支付问题解决与生成订单号超出上限问题
38 5
|
29天前
|
小程序 API
跨端技术问题之哪些形态可以通过getApp()获取全局App实例
跨端技术问题之哪些形态可以通过getApp()获取全局App实例
|
2月前
|
小程序 前端开发 JavaScript
计算机Python项目|django傣族节日及民间故事推广小程序
计算机Python项目|django傣族节日及民间故事推广小程序
|
1月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的业财票务一体项目管理系统 附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的业财票务一体项目管理系统 附带文章源码部署视频讲解等
28 0
|
1月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法

热门文章

最新文章