慕课网Spring Boot企业微信点餐系统
-
慕课网Spring Boot企业微信点餐系统开发源码,大体写法和视频一样,部分地方以个人理解做了适当更改
参考资料:
慕课视频https://coding.imooc.com/class/117.html
微信公众平台公众号开发
微信开放平台——用于第三方微信登录
github轮子,用于调用微信公众号接口 https://github.com/Wechat-Group/weixin-java-tools
github轮子,用于调用微信支付接口 https://github.com/Pay-Group/best-pay-sdk -
代码写于:2018-08-01
JDK:JDK1.8版本,
IDE:IDEA 2017.3.3,
操作系统为:Windows10
SpringBoot:2.0.2.RELEASE -
写在前面:支付和微信扫码登录功能可能有bug:因为没有合适的商户号可以使用支付和第三方登录接口,所以只是跟着视频操作了一波
-
注意事项:
1.数据库设计
一般项目id可以用自增类型的
但一些敏感项目,id可以使用varchar,手动生成ID,避免暴露数据库中的数据数量
2.关于JPA的findOne方法
SB2.0以后不再指出repository.findOne(id),所以要么降低SB版本,要么使用repository.findById(id).get()
3.关于商品单价
I、涉及金额的项目,都应该使用BigDecimal而不使用Double:
Double类型的数据使用二进制表示的,它不可能将0.1或者10的其他任何次负幂,精确表示为一个有限长度的二进制小数
所以:1.51-1.38出现0.13000000000000012
使用BigDecimal类,会自动映射数据库中的Decimal属性
II、关于价格的数据,不能从前端获取(防止被篡改),应该直接从数据库中获取。
4.如果希望Controller返回的Json为自定义名称而不是变量名,可使用@JsonProperty,如下,返回的Json数据为name,而不是categoryName:
@JsonProperty("name")
private String categoryName;
5.有时domain层实体类的某些信息比较 敏感/私密/无用 ,则不返回给前端,重新定义一个对象(该对象去掉实体类的敏感信息即可)用于响应
6.如果两个类的很多属性名都相同的话,不用一个个set,可以使用 BeanUtils.copyProperties(source,target);直接拷贝源目标的值给目标对象
如: BeanUtils.copyProperties(pi,productInfoVO);
注意:属性拷贝会覆盖所有公有属性值,所以谨慎使用
========================以下可观看视频5.4=============================
访问服务器地址: 如:192.168.123.200(在服务器使用ifconfig查看服务器地址,教程中已经把该ip在host文件中改为sell.com)访问首页,
若要pc端正常访问可以设置一个openid的cookie,方法如下:
先访问http://192.168.123.200/#/order (因为这个页面不跳转),然后在cookie中添加openid,值任意
然后会发现,list接口请求失败,这是因为nginx代理配置未修改
修改nginx配置:
vim /usr/local/nginx/conf/nginx.conf
location /sell/处将ip修改为本机ip地址(因为代码是在本地开发的,让虚拟机能够访问自己的电脑)
nginx -s reload
因为微信限制,有时不能用ip访问,所以最好改为域名访问,方法如下(如要将服务器改为sell.com访问):
修改nginx配置: vim /usr/local/nginx/conf/nginx.conf
将 server_name 改为 sell.com
nginx -s reload
修改本机host文件:192.168.123.200(虚拟机地址) sell.com
========================以下可观看视频7.6========================
服务器配置:
在/opt/code/sell_fe_buyer/config路径下修改index.js文件
将openidUrl改为http://cx.s1.natapp.cc(自己的内网映射隧道名,我用的是natapp)/sell/wechat/authorize
重新构建:
cd .. (回到/opt/code/sell_fe_buyer)
npm run build(构建好的文件在dist目录下,将该目录的所有文件拷贝到网站的根目录下)
cp -r dist/* /opt/data/wwwroot/sell/ (然后全填y)
然后即可使用手机微信端访问服务器地址:192.168.123.200
注意:虚拟机必须同网段才能访问,所以要使用代理(需要使用fiddler工具,将手机所有请求转发到电脑,通过电脑访问详情见7.6)或者手机和电脑连接同一wifi
========================以下可观看视频8.4========================
为了使支付按钮有效,需要在服务器配置文件中更改配置:
在/opt/code/sell_fe_buyer/config路径下修改index.js文件
将wechatPayUrl改为http://cx.s1.natapp.cc(自己的内网映射隧道名)/sell/pay/create
重新构建:
cd .. (回到/opt/code/sell_fe_buyer)
npm run build(构建好的文件在dist目录下,将该目录的所有文件拷贝到网站的根目录下)
cp -r dist/* /opt/data/wwwroot/sell/ (然后全填y)
========================以下可观看视频8.7========================
退款接口需要下载证书,证书下载地址为:商户平台->账户中心->API安全->API证书
使用p12结尾的证书 并放到服务器var/weixin_cert(该路径为自己定义的,和配置文件中的keyPath相同即可)目录中
========================以下可观看视频9.2========================
ibootstrap引用链接,引用后缀为bootstrap.min.css即可
========================以下可观看视频11.3========================
为什么图片上传不使用上传文件的方式?
因为该项目需要支持分布式,使用上传文件的方式只能上传到某一台服务器上(所以,要么使用第三方CDN存储,要么专门搭一台文件服务器,所以简化处理了)
========================以下可观看视频12.5========================
PC端微信扫码登录功能不可用
因为微信开放平台需要提供公司认证,并花300元认证才能获取openAppId和openAppSecret,所以本项目扫码登录部分没有校验,无法保证正确性
========================以下可观看视频12.7========================
登录网址为:http://cx.s1.natapp.cc/sell/wechat/qrAuthorize?returnUrl=http://cx.s1.natapp.cc/sell/seller/login
登录成功后即跳转到http://cx.s1.natapp.cc/sell/seller/login?openid=xxx,成功获取openid
注意:第一次登录会失败,因为数据库里没有该用户的openid,所以需要手动添加openid进数据库后才能登录成功
========================以下可观看视频13.8========================
个人感觉RedisLock类中的unlock方法写的有问题
在加锁时,假如有多个进程执行了getAndSet(key, value)方法,则key的value是最后一个进程的,但实际上真正获得锁的是第一个进程
所以在解锁时,可能redis的value和实际value不同,个人认为:解锁时不用验证value是否相当,直接解锁就行
因为只有获得锁才有资格继续往下执行,才有可能执行解锁操作,既然获得了锁,那么自然也有资格解锁了。
========================以下可观看视频13.9========================
引用插件GenerateSerialVersionUID,可以去File->setting->Plugins中下载,可以通过快捷键自动生成唯一序列化ID,也可自己写,但较麻烦
最后注意:因为项目后台系统验证身份时会跳转到外网映射地址,而外网映射工具映射的是本地IP,而非服务器端IP
所以,想要成功运行项目,要么就在服务端设置外网映射,要么更改application-prod,全指向服务器地址,而不指向外网映射网址,要么运行本地项目