技术:
目前发现存在的一些问题:
严重账号登录和注册中验证码注意:
这里之所以没有实现,是因为需要接入云平台的短信服务。 后期可能接入腾讯的短信服务。
缺失优惠券功能缺失商品评价中管理员回复功能,进一步地用户之间相互评价回复缺失后台服务返回的token存在有效期,小商场应该自动刷新缺失账号多次登录失败,应该小商城出现图片验证码限制,或者后台账号锁定改善商品搜索中采用更好的搜索机制改善商品搜索中,支持热门搜索"换一批"改善地址优化,目前每一次点击都会请求后台,应该缓存已有的数据改善商品数量和规格中,如果货品数量不足,则显示效果,通常是是两种效果
改善商品好评计算与显示,例如90%好评改善商品的评论列表中显示评价的评论分数、商品规格改善商品的评论列表中的图片点击可放大,同时用户评价的多个图片可以选择左右滑动查看。改善当一些页面查询数据没有跟新时,底部显示相应的提醒,例如“没有更多数据”。改善个人页面中实现订单部件,显示用户订单数量,同时点击以后跳转到订单的相应页面。改善商品的订单中支持订单号搜索功能改善在一些内容比较多的页面中支持“顶部”功能功能目前已经有账号登录页面,可以再支持手机短信登录方式。功能个人页面支持联系客服功能个人页面支持帮助中心功能推荐功能,基于用户的一些信息,在合适的页面给出推荐商品开发者小商场开发环境以后,启动后台服务,小程序端可以 显示数据和图片,但是微信登录会失败,因为appid不是 开发者自己的,这里进一步介绍开发者需要设置的小商场环境。
开发者在微信小程序官网申请以后,可以有app-id和app-secret信息。
在litemall-wx-api模块的src/main/resources的资源文件中设置
wx.app-id=开发者申请的app-id
wx.app-secret=开发者申请的app-secret
在litemall-wx模块的project.config.json文件中设置
"appid": "开发者申请的app-id",
启动后台服务
建议开发者关闭当前项目,重新打开(因为此时litemall-wx模块的appid可能未更新)。 编译运行,尝试微信登录
开发者在微信支付平台申请以后,可以有app-id和app-secret信息。
在litemall-wx-api模块的src/main/resources的资源文件中设置
wx.mch-id=开发者申请的mch-id
wx.mch-key=开发者申请的mch-key
wx.notify-url=开发者部署服务的微信支付成功回调地址
注意
- notify-url是微信支付平台向小商场后台服务发送支付结果的地址。 因此这就要求该地址是可访问的。
- 目前小商场后台服务的默认request mapping是
/wx/order/pay-notify(见WxOrderController类的payNotify), 因此notify-url应该设置的地址类似于http://www.example.com/wx/order/pay-notify- 当开发者真正上线后台服务时,强烈建议默认request mapping要重新命名,不能对外公开。
启动后台服务
部署后台服务到云主机
litemall-wx的api.js设置云主机的公网IP。 编译运行,尝试微信支付。
目前账号注册只是简单的根据用户名和密码新建一个账号。
这里缺失一个重要的属性,即用户邮箱或者手机号,来限制用户随意注册。
用户的搜索采用和商品的关键字属性匹配来查找商品。 因此需要管理员添加商品时设置关键字值。
这里只是简单的搜索,更好地做法可能是进一步搜索商品的名字、简介。 或者采用更为专业的搜索算法。
订单费用小于88时,则需要运费8元; 否则运费0元。
目前运费8元是写在后台代码中,未来可能允许设置管理员设置其他值; 或者采用更加符合实际情况的运费计算方式。
用户下单以后但是未付款,
这里,订单超时未付款则系统会自动取消订单。
在实现上,则是采用Spring定时功能查询数据库内订单的时间和状态, 如果发现超时了,则自动取消订单,而取消订单的具体操作可以简单 采用“用户手动取消”相同的操作。
目前这里取消状态码是一样的,因此最终可能并不能分别订单取消是因为 何种原因而取消的。
用户付款以后再申请取消订单比较复杂,涉及微信退款操作,因此这里并没有 简单作为“取消订单”,而是一种独立的功能。
用户收到货物以后可能并不会积极地进行“确认收货”操作,因此有必要实现 一定时间以后订单自动确认收货。
“订单超时确认”的起始时间如何来设计
准备采用weixin-java-tools工具简化微信支付代码的开发。 由于需要商户相关信息,目前没有开发。
用户登录成功以后,后端会返回token,之后用户的请求都会携带token。
目前token的失效和跟新机制没有涉及。
如果litemall-admin-api不配置CROS,则Spring Boot会失败。 但是,这里litemall-wx-api没有配置CROS,Spring Boot却不会报错,需要进一步研究。
如果是微信登录,那么无需账号和密码。
而如果用户采用了账号和密码的形式登录,那么后端需要把用户密码加盐。
如果采用账号密码登录,那么登录失败一定次数,应该限制登录。
进一步地,如果项目启用了短信功能,应该短信提醒用户,防止他人登录。
目前这里没有实现,仅列出。
目前有些业务需要定时任务:
定时任务技术上采用Spring的任务机制,即@EnableScheduling和@Scheduled注解。
目前需要讨论存在的限制或者问题:
定时任务是定时启动,而不是针对任务中具体的工作定时处理,因此会带来延时问题。
例如,订单未付款工作检测是基于半小时超时时间,但是因为订单是相隔半个小时才启动, 因此会导致实际最长一个小时才能检测订单超时。
当然,这个问题可能并不严重。
目前这里的两个定时任务都是简单的查询数据库以后处理所有符合情况的订单。 理论上可能存在大量符合情况的订单,这样在定时任务处理大量工作可能不是很好。 但是,本项目的场景是小微型企业,因此设想的订单业务量不会很大,因此这里简化。
如果两台云主机都部署小商城后台服务,那么这里也会出现两个相同的定时任务。 虽然相同定时任务导致的并发问题可以通过锁机制解决,对系统实际业务不会造成影响, 但是相同定时任务同时存在仍然是不合理的,因此应该避免。可行做法是从小商场后台 模块中剥离这些定时任务形成一个独立任务模块,然后单独部署,从而保证分布式环境 下定时任务是唯一存在的。通常,这个任务模块是基于quartz技术。
但是目前本项目设想场景是小商场后台仅部署一台主机,同时系统中定时任务不是很多, 因此这里定时任务仍然是耦合在小商城后台服务模块中。因此开发者需要注意到这里 存在的潜在问题。
参考2.2.8 乐观锁
当乐观锁更新失败时采用多次尝试方案。
当小商城后台服务开发中因为测试或者debug可能需要经常性重启应用,此时 一旦重启,将导致小商场的小程序段的token失效,因此要求用户再次登录。 这里,介绍一个小技巧: 开发时,
这里的代码基于nideshop-mini-program,但是做了一定的修改:
具体变化可以采用工具进行对比。
注意
目前litemall-wx项目代码基于nideshop-mini-program的commit版本acbf6276eb27abc6a48887cddd223d7261f0088e。由于改动变化较大,因此之后litemall-wx将独立开发,nideshop-mini-program的跟新不一定会合并到litemall-wx中。
业务API存放在config/api.js。
但是可以发现这样的代码:
// 本机开发时使用
var WxApiRoot = 'http://localhost:8082/wx/';
// 局域网测试使用
// var WxApiRoot = 'http://192.168.0.101:8082/wx/';
// 云平台部署时使用
// var WxApiRoot = 'http://122.152.206.172:8082/wx/';
也就是说这里存在三种类型的API服务地址,这里是考虑到开发存在三种情况:
因此,开发阶段开发者可以按照具体情况切换1,2或3的选项。
按照官方文档,开发者采用wx.login方法即可实现登录操作;
然而,由于wx.login只能返回临时登录凭证code,从服务器也只能返回对应的sessionId,
因此虽然已经可以视作登录,但是在小程序中不能显示有意义的登录状态,
因此实际很多小程序是继续采用wx.getUserInfo来进一步请求用户信息。
因此本模块中,用户的登录状态也是由wx.login和wx.getUserInfo组成。
开发者可以采用user.checkLogin来检查是否已登录,而其检测逻辑是:
userInfo和tokenwx.checkSession也成功。但是如果每次都使用checkLogin可能也不太好,因此目前机制是:
注意:
这里的逻辑可能有点乱。。。,但是目前实际效果看没有问题。
登录请求用户信息的时机存在两种设计:
目前采用第二张实现,可以分成两种情况:
用户主动登录,指的是我的页面中用户没有登录显示点击登录的效果。
用户被动登录,指的是用户想购买商品或者需要用户登录才能操作的行为,
此时因为向服务器请求时token没有设置,因此服务器拒绝用户的请求,同时返回401业务代码。
目前需要检测用户登录的页面有:
讨论:
对于第二张情况,原nideshop-mini-program项目是采取一种自动登录的方式。 这里则采用跳转登录页面的方式。
如前面讨论,这里的登录操作实际包含两个操作wx.login和wx.getUserInfo。
开发者可以采用user.loginByWeixin来进行登录操作。
按照官网文档,用户登录前应该检测以下,来避免频繁无意义的登录操作, 因此较合适的做法如下所示:
user.checkLogin().catch(() => {
user.loginByWeixin().then(res => {
this.setData({
userInfo: res.data.userInfo,
});
}).catch((err) => {
util.showErrorToast('登录失败');
});
});
还存在一个问题,当用户登录时,会出现"微信授权"的对话框。 如果用户选择”拒绝“,那么之后用户的登录操作总是失败的。
目前的做法是,用户拒绝授权后,如果再次登录,则:
本模块中采用storage来存储一些数据,以及组件间进行通信。
本章节介绍如何开发新的微信小程序功能。