微信小程序项目总结-记账小程序(包括后端)
一、小程序部分
这是理财系统的前端,江苏海洋大学微信小程序比赛,最后获得了一等奖
GitHub:https://github.com/GeorgeLeoo/finance
1. 项目描述
(1). 此项目为记账小程序
(2). 包括账单、图表、搜索、用户等多个子模块
(3). 使用微信小程序技术
(4). 采用模块化、组件化、工程化等模式开发
2. 项目功能界面
在 1.0.2版本中删除了扇形图
3. 项目目录
* pages:页面
* components:组件
* utils:工具类
|-- util.js:工具类
|-- wxcharts.js:图表插件
* images:资源图片
* config:配置文件
* filter:过滤器
* http:网络请求
|-- http.js:对 wx.request 的封装
|-- api.js:对网络请求接口的封装
4. 请求封装
一开始使用 wx.request 对数据进行网络请求,可写完后,发现太过冗余,也太麻烦,故对其做了封装。
通过创建一个函数返回 Promise 对象,就可以屏蔽公共的部分
// http/http.js
/**
* 对微信普通网络请求封装
* @param url 请求地址
* @param data 请求的参数
* @param method 请求的方法类型
* @param headers 头部信息,在这里主要是 token 认证功能
* @returns {Promise<unknown>} 返回请求的 Promise 对象
*/
function http({url, data, method, headers = {}}) {
return new Promise((resolve, reject) => {
wx.request({
url,
method,
data,
header: {
Authorization: headers.token,
expiresIn: headers.expiresIn
},
success: (result) => {
const res = result.data;
if (res.code === 0) {
resolve(res.data);
} else if (res.code === 1) {
reject(res.msg);
}
// 隐藏 loading
wx.hideLoading();
},
fail: (err) => {
console.error('server error', err);
}
});
})
}
/**
* 对文件上传接口封装
* @param url 请求地址
* @param fileOptions 文件配置项
* @param data 请求发送的数据
* @param headers 头部信息,在这里主要是 token 认证功能
* @returns {Promise<unknown>} 返回请求的 Promise 对象
*/
function uploadFile({url, fileOptions, data, headers = {}}) {
return new Promise(((resolve, reject) => {
wx.uploadFile({
url: url,
filePath: fileOptions.filePath,
name: fileOptions.name || 'file',
header: {
Authorization: headers.token,
expiresIn: headers.expiresIn
},
formData: data,
success: (res) => {
console.log(res.data);
if (JSON.parse(res.data).code === 0) {
resolve(res.data);
} else if (res.code === 1) {
reject(res.msg);
}
},
fail: (err) => {
console.error('server error', err);
}
})
}))
}
module.exports = {
http,
uploadFile
};
5. 遇到的问题
(1). 在更新账单数据后,如何更新账单界面的数据?
这个问题我的解决方案是,在 globalData 中添加一个全部变量 isRefreshBills,默认为 false,
当更新账单数据成功后,将 isRefreshBills 修改为 true,同时返回到账单界面,在账单界面的
onShow()方法中,判断 isRefreshBills 是否为 true,若为 true 则重新请求数据,同时将 isRefreshBills
设为 false,否则不请求。这样就避免了没有更新数据的情况下多次请求数据。
对这个解法,还有一种更加节流的方法,就是更新后不去请求,而是对原来的获取到的数据进行个别删除。比如当
更新数据成功后,获取一个被更新的这条数据的id,然后在账单页面的 onShow() 方法中,遍历找到这个 id 对应的
数据,并删除这条数据也能达到数据更新的效果
(2). 在进行类别添加的时候,自定义的类别会出现双倍?
由于我有一分部初始数据是存在 globalData 中的,每次从服务器获取自定义类别时,都会对其进行拼接,
在拼接的时候修改了原来的 globalData 中的值,所以每次添加后都会请求一次自定义数据,进行拼接。
解决方案:禁止更新 globalData 中的数据
(3). 返回哪个页面问题?
在账单页面可以进去修改账单的页面,在搜索页面也可以进入修改账单账单的页面,他们用的是同一个组件,
那么如何保证在账单页面进入修改账单页面后返回到账单页面,在搜索页面进入修改账单页面后返回到搜索页面。
首先在路由跳转的时候添加当前路由信息,然后在修改账单页面中接受这个路由信息,最后通过这个路由信息返回到原来的路由
6. 总结
这个项目是我5月份参加学校微信小程序的项目,两个礼拜仓促的做了这么一个项目,前后端都有,最后荣获一等奖。
在之前比赛用的版本中其实有很多的 bug 以及卡顿现象居多,故这两天我有对这个项目进行了一定的维护,发现原来的代码实在
惨不忍睹,现在经过升级,页面卡顿现象减少,若后期再想维护,也相对于之前的版本好维护多了,但是还有很多可以维护的空间。
其实我并不对这个项目很满意,比如之前我没做分页加载, 现在想加个分页加载的功能,我发现并不是一下子就能搞定的,
因为我的数据结构不是很合理,因为后端返回的数据和前端要显示的数据格式是不一致,故前端要重新定义数据结构,
所以对分页来说就有一定的困难。在我对项目进行维护后,代码比以前更简洁,可读性相对于之前的版本来说要更加好。
二、服务器部分
1.简述
这个项目是微信小程序记账 app 的后端代码,使用技术:MongoDB+Express。
GitHub:https://github.com/GeorgeLeoo/finance-server
这个项目的目录是这样的
- config: 配置文件
- routes: 路由配置
- utils: 工具类
- db: 操作数据库的代码
- controller: 控制是当前地址否要 token 验证
- service: 如何调用操作数据库函数(我也不知道为什么要写controller,service,感觉这两个写一个就可以了)
2.遇到的问题
(1). token 验证问题?
关于 token 验证问题我使用了 jsonwebtoken 插件,故先用 npm 安装这个插件。
token 验证流程大概如下图:
使用这个插件: 定义两个方法,一个用来生成 token,另一个用来验证 token。
/**
* 生成token
* @param {object} content 对某个内容生成 token
*/
const access_token=function (content) {
let secret = 'jizhangxitongfinancegeorgeleeo'; // 秘钥
let expiresIn = Math.round((new Date().getTime()/1000)) + 3600; // 过期时间
let token = jwt.sign(content, secret, { expiresIn });
return {
token,
expiresIn
};
}
/**
* 验证token
* @param {string} token token值
*/
const check_token= function (token) {
let secret = 'jizhangxitongfinancegeorgeleeo'; // 秘钥,根生成的 token 要一致
return new Promise((resolve, reject) => {
jwt.verify(token, secret, (err, decode) => {
if (err) {
//时间失效或伪造 token 或 token 不存在
reject({
status: 10010,
error: 'invalid_token'
});
} else {
resolve();
}
});
})
}
在controller.js 中,去判断 token 验证成功与否
function billController(method, options, req, res) {
// 验证 token
utils.check_token(req.headers.authorization, res).then(() => {
// token验证成功,调用操作数据库的方法
billService[method](options).then((data) => {
res.json(data);
}).catch((err) => {
res.json(err)
});
}).catch((err) => {
// token 验证失败
res.json(err)
})
}
(2). 文件上传问题?
在这个项目中,有使用文件上传的功能,express 默认是带这个功能的,所以就必须使用 npm
安装 express-fileupload 这个插件,然后再 app.js 中引入并注册这个插件
var fileUpload = require('express-fileupload');
app.use(fileUpload());
当前端发送文件时,后端从 req.files['name']获取 file 对象,然后通过 file.mv()方法进行文件存储
file.mv(fileSavePath, function (e) {
if (e) {
// 失败时
} else {
// 成功时
}
});
比如我的项目中,上传图片代码抽取出来就是
// 小程序代码
wx.uploadFile({
url: 'http://localhost:3000/users/avatar',
filePath: 'XXXXXXX',
name: 'avatar',
header: {
Authorization: headers.token,
expiresIn: headers.expiresIn
},
formData: data,
success: (res) => {},
fail: (err) => {}
});
// 服务器代码
let file = req.files.avatar
file.mv('upload/a.png', function (e) {
if (e) {
// 失败时
} else {
// 成功时
}
});
(3). 关于前端读取upload中图片的问题
本来想用服务器的 ip 来读取项目中 upload 中的图片,但是发现并不能读取,或显示404,故最后将 upload 文件放在了项目的外边,
然后对这个 upload 文件单独开了一个服务,把他当做图片服务器来使用。
3. 总结
当初选用 Express + MongoDB 的唯一原因就是开发快,因为基本上每天都满课,所以快速开发是我的需要。
在这个项目中其实还有很多可以优化的地方,还有一定的冗余,比如在操作数据的时候,所有的查询成功或失败的函数
都可以存放到一个公共类里面,而不是每一对应的文件里都有一个这个方法。
Github:
小程序:https://github.com/GeorgeLeoo/finance
服务器:https://github.com/GeorgeLeoo/finance-server
微信小程序项目总结-记账小程序(包括后端)的更多相关文章
- ASP.NET web 应用程序项目
ASP.NET web 应用程序项目 .ashx .ashx.cs aspx包括前台一些代码要处理,ashx可以看作是没有aspx页面中前台代码的后台.cs文件. 没有了前台代码,服务器负担少一点, ...
- 开发一个微信小程序项目教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可.2.注册成功后进入首页,在 小程序发布流程->小程序开 ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉
前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05-日历组件的实现 4. 微信小程序开发04-打造自 ...
- 微信小程序开发01 --- 微信小程序项目结构介绍
一.微信小程序简单介绍: 微信官方介绍微信小程序是一个不需要下载安装就可使用(呵呵,JS代码不用下载吗?展示的UI不用下载吗?)的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用. ...
- 高仿Readhub小程序 微信小程序项目【原】
# News #### 项目介绍微信小程序项目涉及功能 https://gitee.com/richard1015/News https://github.com/richard1015/News 高 ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 微信小程序项目实战之天气预报
概述 微信小程序项目实战之天气预报 详细 代码下载:http://www.demodashi.com/demo/10634.html 一.准备工作 1.注册微信小程序 2.注册和风天气账号 3.注册百 ...
- 微信小程序项目实战之豆瓣天气
概述 微信小程序项目实战之豆瓣天气 详细 代码下载:http://www.demodashi.com/demo/10943.html 一.准备工作 1.注册微信小程序 2.在小程序设置中设置reque ...
- 微信小程序——初始化一个小程序项目
最近准备学习一下微信小程序,因为之前有react native项目经验,学习起来应该困难不大 微信小程序官网地址:https://mp.weixin.qq.com/debug/wxadoc/dev/i ...
随机推荐
- 搭建Spring Initializr服务器
前言 按照网上很多教程,出错特别多.首先是GitHub和maven仓库的网络环境比较差,踩了很多坑:其次是SpringInitializr更新迭代几个版本,0.7.0我也没能弄成功.索性就用了旧版本0 ...
- vue组件之间的传值——中央事件总线与跨组件之间的通信($attrs、$listeners)
vue组件之间的通信有很多种方式,最常用到的就是父子组件之间的传值,但是当项目工程比较大的时候,就会出现兄弟组件之间的传值,跨级组件之间的传值.不可否认,这些都可以类似父子组件一级一级的转换传递,但是 ...
- 【HDOJ】2007平方和与立方和
Problem Description 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和. Input 输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成. ...
- Redis(二)--- Redis的底层数据结构
1.Redis的数据结构 Redis 的底层数据结构包含简单的动态字符串(SDS).链表.字典.压缩列表.整数集合等等:五大数据类型(数据对象)都是由一种或几种数结构构成. 在命令行中可以使用 OBJ ...
- 【MySQL】(七)事务
我的个人博客 http://www.haxianhe.com/ 数据库系统引入事务的主要目的:事务会把数据库从一种状态转换为另一种一致状态.在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所 ...
- C#中Tuple的使用
鉴于MSDN上面的机器翻译实在太烂,还是自己翻译吧,虽然麻烦了点(-_-). 定义:元组是具有 特定数量和序列 的元素 的数据结构 (注意断句哈!) 元组通常有四种使用方式︰ 一.表示一组数据 例如 ...
- 《VR入门系列教程》之13---相机与立体渲染
相机.透视图.视口.投影 渲染好的场景都需要一个可以供用户查看的视图,我们通常在3D场景中用相机来提供这种需求.相机相对场景有位置和方向,就像我们生活中的相机一样,它也提供透视图查看方式,这种 ...
- linux初学者-MariaDB图形管理篇
linux初学者-MariaDB图形管理篇 MariaDB不仅有文本管理方式,也有借助工具的图形管理方式.其图形管理的工具是"phpmyadmin".这个软件可以在"p ...
- Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题
在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...
- 记一次远程CMD开发过程
开发初衷: 有些同学电脑老是要出问题,但又不是什么大问题,通常几句cmd就能搞定.之前解决方案有2:一是远程演示,我口述别人操作:一是我写个cmd脚本,但毕竟不在本机不好调试.(吐槽一下常用的远程控制 ...