项目简介
ProjIntro
项目名称为闲蛋不是咸蛋
,主要功能为发布二手闲置物品,便于交易。
该项目于2023
年12
月1
日创立,于2023
年12
月13
日接近开发尾声,并于同月16
日完成最终开发测试,共历时约为16
天。
该项目前端使用微信小程序开发者工具进行开发,后端API
使用node.js
进行开发,使用到以下模块:
No. | 模块 | 描述 |
---|---|---|
1 | express | 中间件 |
2 | request-promise | 发出请求 |
3 | body-parser | 解析json |
4 | mysql | 连接数据库 |
0x01 开发背景
随着互联网的普及和信息技术的发展,二手交易平台逐渐成为一个热门话题,而闲蛋不是咸蛋
项目由此孕育而生,主要用于帮助卖家将自己闲置物品发布到此平台,帮助有购买二手需求的买家选购。
0x02 开发意义
闲蛋不是咸蛋
交易平台的出现,能解决在交易二手闲置物品时的部分问题,例如能大幅减少卖家的时间和精力,给买卖双方提供更加安全、便捷、高效的交易平台,提供更好的交易体验。
开发技术统计
DevTechStatistics
0x03 代码量统计
- 结构框架代码
(.wxml)
共计约494
行 - 排版样式代码
(.wxss)
共计约928
行 - 逻辑处理代码
(.js)
共计约1530
行 - 后端API代码
(.js)
共计约557
行
0x04 数据库统计
共计存在1
个数据库,内含3
张表
No. | 表名 | 描述 |
---|---|---|
1 | items | 商品数据 |
2 | item_images | 商品详细图数据 |
3 | users | 用户数据 |
0x05 后端API
列表统计(已脱敏)
共计存在15
个API
接口
No. | 接口地址 | 请求方式 | 功能描述 |
---|---|---|---|
1 | /items | GET | 获取全部商品数据 |
2 | /users | GET | 获取全部用户数据 |
3 | /query | GET | 关键字查询 |
4 | /categoryQuery | GET | 分类查询 |
5 | /itemsdetail | GET | 商品详情查询 |
6 | /usersdetail | GET | 用户信息数据 |
7 | /userPostedDetail | GET | 获取用户发布数据 |
8 | /userSoldDetail | GET | 获取用户售出数据 |
9 | /userBoughtDetail | GET | 获取用户购买数据 |
10 | /itemManage | GET | 商品管理 |
11 | /login | GET | 用户登录 |
12 | /auth | GET | 用户登录 |
13 | /postNewItem | POST | 发布新商品 |
14 | /updateInfo | POST | 用户资料更改 |
15 | /buyItem | POST | 用户购买功能 |
0x06 当前已知存在BUG(待补充)
BugsConfirmed(To be supplemented)
- 首页列表组件
<grid-view>
底部留有大空白,经测试结合微信开放社区反馈,断定为微信组件BUG,至今仍未修复。 - 交易发布页面少有存在图片异步处理异常,非必然出现。
项目设计
ProjDesign
0x07 主要功能
实现已登录用户进行商品发布、购买主要功能,附加资料修改、商品管理等子功能
0x08 主要页面
0x08-1 页面一[(index)
]--实现首页展示所有上架商品列表
使用wx.request
请求API
的/items
接口,获取已上架商品列表JSON
,并用JSON.parse
进行解析,传回小程序,小程序接收到json
后开始通过wx:for
遍历渲染,以瀑布流形式进行展示,宽度固定,高度自适应,实现动态布局,错位排版,更为美观。
0x08-2 页面二[(itemsDetail)
]--实现商品详情页展示
使用wx.request
传递itemID
参数请求API
的/itemsdetail
接口,获取该商品发布者信息,包括头像、用户名,获取该商品的发布日期、价格、是否包邮、描述、分类、成色状态、封面图、详细图。
0x08-3 页面三[(search)
]--搜索结果展示
通过首页传递的搜索关键字参数,在API
的/query
接口进行请求,回调得到搜索结果列表,并以瀑布流形式渲染在搜索结果页面上。
0x08-4 页面四[(user)
]--用户个人中心
个人中心展示用户头像、昵称、闲蛋钱包、交易统计、发布新商品子页面、资料修改接口子页面、用户协议子页面、关于子页面。
0x08-5 页面五[(myTransaction)
]--交易详情页
"我发布的"页面展示当前已登录用户发布的商品列表,并能进行管理[上/下架,删除],点击可跳转至商品详情页。
"我卖出的"页面展示当前已登录用户卖出的商品列表。
"我买到的"页面展示当前已登录用户购买的商品列表。
0x09 数据库结构
0x09-1 items
数据表
字段名 | 类型 | 空 | 默认 | 注释 | 额外 |
---|---|---|---|---|---|
itemID | int | 否 | 无 | 商品ID[主键] | Auto_Increment |
itemName | varchar | 否 | 无 | 商品名称 | |
itemCoverImg | varchar | 否 | 无 | 商品封面图 | |
itemInfo | varchar | 否 | 无 | 商品详情 | |
itemPrice | float | 否 | 无 | 商品价格 | |
itemState | varchar | 否 | 未定义成色 | 商品成色 | |
itemShowStatus | tinyint | 否 | 1 | 上架状态 | |
itemBoughtStatus | tinyint | 否 | 0 | 商品被购买状态 | |
itemTime | datetime | 否 | Current_TimeStamp | 商品上架时间 | Default_Generated |
itemCategory | varchar | 是 | 未分类 | 商品分类 | |
itemBaoYou | tinyint | 否 | 0 | 是否包邮 | |
ownerUserID | int | 否 | 无 | 所有者用户ID | |
purchaserUserID | int | 是 | NULL | 购买者用户ID |
0x09-2 users
数据表
字段名 | 类型 | 空 | 默认 | 注释 | 额外 |
---|---|---|---|---|---|
userID | int | 否 | 无 | 用户ID[主键] | Auto_Increment |
isOP | tinyint | 否 | 0 | 管理身份 | |
isBan | tinyint | 否 | 0 | 封禁状态 | |
userOpenID | varchar | 否 | 无 | 用户openid | |
userName | varchar | 否 | 未登录 | 用户名 | |
userAvatar | varchar | 否 | 默认头像图片URL | 用户头像 | |
userWallet | float | 否 | 0 | 用户钱包 | |
authCode | varchar | 是 | NULL | 授权码 |
0x09-3 item_images
数据表
字段名 | 类型 | 空 | 默认 | 注释 | 额外 |
---|---|---|---|---|---|
imageID | int | 否 | 无 | 图片ID[主键] | Auto_Increment |
itemID | int | 否 | 无 | 商品ID[外键] | |
imageURL1 | varchar | 是 | NULL | 商品图片URL1 | |
imageURL2 | varchar | 是 | NULL | 商品图片URL2 | |
imageURL3 | varchar | 是 | NULL | 商品图片URL3 | |
imageURL4 | varchar | 是 | NULL | 商品图片URL4 |
项目开发
ProjDev
0x0A 项目界面
0x0A-1 主页商品列表浏览
0x0A-2 商品详情页
0x0A-3 搜索结果页
0x0A-4 个人中心(未登录)
0x0A-5 个人中心(已登录)
0x0A-6 用户发布列表
0x0A-7 用户出售列表
0x0A-8 用户购买列表
0x0A-9 用户新发布页面
0x0A-A 用户个人资料更改
0x0A-B 用户协议
0x0A-C 关于
0x0B 功能实现部分代码片段
0x0B-1 一键注册登录功能
0x0B-1-1 实现原理
通过调用[wx.login]获取临时code
,再用该code
通过请求微信获取Sessiond
的API
([code2Session]),通过传递appid
、secret
、js_code
、grant_type
参数来得到当前微信用户的openid
,此openid
具有唯一性,可作为登录凭证,将openid
添加到数据库并生成新的userID
,即可完成一键注册登录功能
0x0B-1-2 部分代码(已脱敏)
wx.login({
success(loginRes) {
var js_code = loginRes.code
// 获取用户信息
wx.request({
// 微信开发文档说明code2Session须在后端进行调用,禁止在小程序调用,需自建API
url: 'API/login?js_code=' + js_code,
method: 'GET',
success(res) })
}
})
0x0B-2 子页面实现
0x0B-2-1 实现原理
使用微信官方提供的[page-container]组件,加上显示控制条件show
,来确保子页面该何时显示。
0x0B-1-2 部分代码
//show组件控制子页面是否显示
//duration组件控制子也买呢弹出动画时长
//overlay组件控制是否显示遮罩层
//position组件控制弹出位置,可选值为 top bottom right center
//round组件控制是否显示圆角
//close-on-slide-down组件控制是否在下滑一段距离后关闭
//custom-style组件控制自定义弹出层样式
//overlay-style组件控制自定义遮罩层样式
<page-container show="{{show}}" duration="{{duration}}" overlay="{{overlay}}" position="bottom" round="true" close-on-slide-down="{{true}}" custom-style="{{customStyle}}" overlay-style="{{overlayStyle}}" bind:clickoverlay="onClickOverlay" bind:afterleave="onAfterLeave">
<view>Write Sth Here</view>
</page-container>
0xB-3 异步处理
0xB-3-1 实现原理
定义Promise对象,通过setTimeout进行延时,待Promies传出resolve之后再进行then操作,从而实现异步处理
0xB-3-2 部分代码
var newUserAvatar = new Promise((resolve) => {
wx.showToast({
title: '更新中🚀',
icon: 'loading',
duration: 2000
})
setTimeout(() => {
···
···
···
resolve(xx)
})
})
newUserAvatar.then((xx) => {
···
···
···
})
info 评论功能已经关闭了呐!