主题主要是校园交友社交的微信小程序,目前开发完毕。 演示视频:https://www.bilibili.com/video/BV1kf4y127nm/
页面最开始是一个简约的蓝紫色调的欢迎界面做封面;
这里首先判断用户是否授权登录过,如果授权登陆过,则短暂停留后进入主页(心情广场);如果没有授权过,则会跳出选项,如果用户愿意授权登录,则可以直接登录,登录时小程序获取用户部分基本信息,并且在云数据库中为用户创建记录;当然用户也可以选择暂不登录,先进入小程序看看,那么程序会跳转到主页(心情广场)。
心情广场是 tabbar 的第一个页面。
年少的大学生,敢爱敢恨,总会有很多情愫希望倾诉,心情广场正是一个倾诉心情的广场,有什么开心的不满的,都可以发表在这里;让同龄人之间不同的情感发生奇妙的碰撞。页面上,上方顶部固定定位了用于发表的文本框;页面整体采用列表分页展示所有发表的说说。
上面是一个限字数200字的多行文本框,往下是上传图片的区域。上传的图片可以点击预览;图片可以分次上传,也可以从中移除不想上传的图片,但是上传图片的总数限制在9张(这里由于删除图片的叉与图片有重叠部分,所以这里需要处理一个事件冒泡,微信小程序虽然不支持 stopPropagation 防止事件冒泡的方式,但是有微信专门封装的 bindcatch 天然可以防止事件冒泡。)。写移除图片程序时,还有另外一个头疼的问题,就是图片的列表更新后,图片占据的 view 块立即减少一个,但是图片的渲染需要一段时间,在这段时间里,会导致图片仍旧呈现之前的状态,就错位了一张,可能会引起用户的误会。最终,我利用 image 组件的 bindload 绑定事件,在图片渲染完成之前,盖上一层正在加载的标识;虽然未能实现以最美观的方法解决这个问题,但是也能自然过渡,不会引起用户误会。(更美观的方法是删除需删除的节点,并且操控后面的节点平滑替代掉删除的节点;但是微信小程序不支持节点操作,只能选择适应微信小程序的其他方法。)底部则是固定定位的发表按钮,按钮显眼且固定定位可以方便用户直接点击发表,无需下拉寻找按钮。点击发表,首先检测文本框内容是否为空,确保用户确实发表了内容,如果没有内容会提示用户;然后为了首页布局方便,计算图片的长边是哪条边,也作为一个字段保存,同时也就检测了图片是否是支持的格式,如果不是则提醒用户,并且将图片移除;确保信息无误后,将发表说说的用户标识,当前的时间,图片的长短边以及需展示的内容保存至数据库,并且同时建好点赞列表和评论列表,方便以后向里添加内容。成功发表后,会跳转到主页,就能看到自己发表的说说。
展示的方式是在黄绿色的背景上,显示一个又一个的卡片,卡片上最上方是发表者的头像和昵称(点击其头像和昵称会跳转发表者的个人卡片,上面有发表者的公开个人信息);右上角三个点包括了收藏和举报的功能(收藏:将该条说说的标识存入用户的数据库中收藏的列表;举报:将说说的标识和类型传入另一个举报页面,由用户填写原因后发往后台。);下一层是发表时间;再下一层是发表的内容;再往下是图片;最后一层是点赞和评论数量(数量如果超过1000,则显示为几k),帮助用户判断说说的热度;而点击这个卡片的其他部分就可以进入详情部分,可以看到评论。心情卡片的获取逻辑是分页提取;在js中保存着一个标记页数的变量,负责用做传参提取数据库中对应页数的内容;说说的排序要根据时间顺序,而数据库中时间越新的数据在越后面,所以在取数据时必须逆向获取,按从后往前的顺序提取,提取来的数组还得进行逆序操作。(这里起初采取的策略是,数组按照顺的顺序序,在布局上利用 flex 中的 warp-reserve 属性将卡片逆过来显示,但是在获取下一页时,新数据添加到数组中的前面,使得视图直接跳到了数组中的第一条数据上,也就是最底部,导致视图效果极差;最后只好采用一开始就将数组逆序的方式,这种方式不会引起视图的异常。)
详情有作者部分,内容部分,点赞区域和评论区域。底部有固定定位的评论框,评论也可以发表图片和文字内容。点击评论框,弹出真正填写内容的文本框,并且自动获取焦点,拉起输入法,这里由于文本框并不处于页面最底部,所以会导致输入法将部分内容遮挡,需要利用 cursor-space 属性将固定区域的定位往上抬。这里还出现了一个微信内部的Bug,就是被禁用的文本框在模拟器调试上可以顺利获取绑定的点击事件,而真机就没有点击事件,或者说完全没有反应。最后只能用 view 替代禁用的文本框来避开这Bug。
匿名说整体与心情说说没有太大区别,只是不显示用户的信息,但是为了方便其他用户了解作者站在什么角度说的秘密,性别默认展示,实在介意也可以选择隐藏。这里秘密的发送和评论都是匿名,给足说悄悄话的空间。匿名说里踩的坑与心情说说相差无几,不需要再重复说明了。
无论在哪个部分的社区中,点击某个用户的头像和昵称都会跳转这个用户的个人名片,是由该用户自行填写的介绍自己的内容;其中也包含了用户的联系方式;还有关注该用户和拉黑该用户以及给该用户发送站内信的功能。
用户的数据库中包含两个列表,一个代表我关注的用户,另一个是关注我的,这两个列表都能在个人中心得到体现;当点击用户关注时,会将我的标识存入这个用户的粉丝列表,并将这个用户的标识存入我的关注列中。用户数据中还有一个黑名单列表,如果将这个用户拉黑,将用户的标识存入我的黑名单,则这个用户在给我发送站内信时就会被拦截,无法发送站内信给我。
这里跳转到专门发送站内信的页面,同时将发件人和收件人的用户标识传输过去。首先判断发件人是否被收件人拉黑,如果被拉黑则禁止发送。填写好内容后,点击发送,信件就会加入收件方的信件列表,并且将未读标识置为 true ,收件方的个人中心上"我的消息"的后方就会有红点提示。点开"我的消息",信件列表形式展示,消息内容只展示一部分,用省略号代替其余内容,点击消息内容部分,弹出对话框显示全部内容。点击发件人部分,跳转显示发件人用户名片。
若用户没有授权登录过,则不会显示详细的列表内容,而在上方头像昵称处,显示让用户登录。
如果已经授权登录,最上方会在一个弧形色块上醒目显示用户的头像及昵称。(这里弧形的色块,巧用 css 的 after 伪元素,制造一个特别大的圆,再利用定位属性进行偏移,把需要的部分留在页面里,而圆其余的部分超出了页面不会显示出来,这种巧妙的设计,使页面摆脱了必方必正,顶多就是圆角边框的死板设计,俏皮的弧形使页面多了一处独特之处。)
下方的列表功能如下。
1、头像,头像可以自主上传,用户能够查看自己当前的头像以及最近十次的历史头像,这里为了防止有人恶意上传头像,刷云空间,将历史头像的保存数限制在10个。这里的开发过程中,由于云开发的 unshift 和 pop 指令不支持在前端使用,导致了很多奇怪的报错,后通过查阅资料,了解该指令无法在前端使用,于是将程序转移至云函数中,通过调用云函数完成历史头像在超额情况下的更新。 2、昵称、个性签名、爱好、自我介绍等的设置。这些都是文字显示,统一使用一个弹出的文本框来修改。针对不同的类别有不同的字数限制。这些基本的介绍个人的信息会展示在用户的个人名片上,帮助其他人了解你。 3、性别和生日的设置,由于性别和生日需要在一定范围内选择,所以程序中采用滚动选择器,让用户在范围内进行选择。
于用户个人名片处点的关注都会体现在这里,你点的关注都在"你的关注"里,关注你的都在"你的粉丝"里,可以在列表中查看。
"我的消息"里都是我收到的站内信,包括用户首次登录就会收到一封官方的站内信,表示对用户的欢迎。
我发表的心情说说和匿名说都在"我的心情说说"和"我的匿名说"里找到,可以执行删除说说的操作。"我的收藏"里是我收藏的其他说说,点进去也可以将收藏的说说移出收藏。
"对软件的意见"就是提供了一个反馈意见的联系方式。"举报处理入口"需要管理员的权限,输对账号密码才能进入。主要是处理用户的举报,选择保留被举报的说说还是删除。