也许你想从前端到后台、从部署到上线都自己操作一遍;也许你只是想做个后台项目不关心前端;项目不止代码,还会有前端环境搭建、跨域处理、Https证书、Nginx部署、IPFS等知识,不管怎样,这个项目都适合你
项目地址:https://github.com/Dengqlbq/BitPic
作为一个定位适合大部分人(高手除外)的Java Web项目,本文尽量以简洁易懂的方式对其解析,无论是前后都想搞懂还是只关心后端代码,这里都会给你答案。
Nginx
作为通信代理,通过预先设计好的RESTful
接口以Json
格式进行通信。Nginx
,将Nginx
响应封装成视图返回给用户Nginx
发过来的业务请求并和数据库和文件系统交互,将结果封装成响应返回Nginx
将前端的业务请求发往后端并将后端响应返回,遇到资源请求(如略缩图)则直接从文件系统读取后返回HTTPS
通信,并采用基于Token
的身份认证机制后端共划分为四大模块,每个模块下再划分具体功能:
管理员模块处理所有的审核事务,这里将短信验证码划归管理员模块但目前调用该接口不需要管理员权限
用户模块功能繁多,包括普通用户和摄影师的功能
前端分为两个部分独立运行,均采用组件化开发
信息主要为以下三种:
个人信息改动较少,存储在Mysql
中。订单信息以及作品信息等量大且经常被查询,存储在ElasticSearch
中。Token
在每一个请求中都会被使用以进行各种认证,存储在Redis
中
系统中涉及众多类型的用户上传文件和系统生成的文件,文件的存储需要遵循一定规则才能使系统保持高效稳健的运行。
在设计文件存储规则时主要考虑以下几点:
zip
格式,购买凭证文件为txt
格式,其余文件为图片基于以上考虑,系统开辟两个文件存储区域——对外图片区域和重要文件区域。对外图片区域存储作品略缩图和用户头像,重要文件区域存储其他所有文件。取对外图片区域根路径为imgServerRoot
,取重要文件区域根路径为storeRoot
。
文件类型 | 存储路径 | 备注 |
---|---|---|
身份认证文件 | storeRoot/userId/authenticate/ | userId 为用户编号,注册时系统生成 |
作品文件 | storeRoot/userId/number/ | number 为作品编号,上传作品时系统生成 |
作品相关授权文件 | storeRoot/userId/number/check/ | |
作品略缩图 | imgServerRoot/userId/number/ | |
头像文件 | imgServerRoot/userId/avatar/ | |
作品打包文件 | storeRoot/userId/number/ | 文件名统一为0.zip |
订单下载打包文件 | storeRoot/userId/orderId/ | orderId 为订单编号,创建订单时系统生成 |
购买凭证文件 | storeRoot/userId/orderId/ | 文件名统一为certificate.txt |
在系统设计时,作品文件以及购买凭证会加密压缩后上传到IPFS
网络中,利用其不可篡改性,不可删除性保障用户和摄影师的利益。这项特性默认为关闭状态
经过前面的介绍,你已经知道如何阅读源码了,现在将它运行起来
下面是必须要做的事:
版本并不要求和项目一致,不过有概率遇到奇奇怪怪的问题
本地运行可直接使用编译好的前端静态文件,配置好Nginx
后再运行后端代码即可
注意:
Nginx
配置中修改root
路径为自己的路径application.yml
中的配置以及ThumbnailsConstant.java
中标明的配置Nginx
:8089,后端:8080,网站前台:8088,管理后台:8091# Nginx配置文件中添加以下location,均为静态文件路径
# image路径为网站前台使用
# store路径为管理后台使用
# 用户作品相关
location ~ "/images/\w{32}/\w{32}/" {
root /Volumes/H/Java;
autoindex on;
}
# 用户头像
location ~ "/images/\w{32}/avatar/" {
root /Volumes/H/Java;
autoindex on;
}
# 管理后台审核时需要原图,所以管理后台应该部署在内网环境防止原图泄露,但现在先不管
# 用户默认头像
location ~ "/images/avatar/" {
root /Volumes/H/Java;
autoindex on;
}
# 摄影师身份审核
location ~ "/store/\w{32}/authenticate/" {
root /Volumes/H/Java;
autoindex on;
}
# 摄影师作品审核
location ~ "/store/\w{32}/\w{32}/" {
root /Volumes/H/Java;
autoindex on;
}
# 摄影师作品授权文件审核
location ~ "/store/\w{32}/\w{32}/check/" {
root /Volumes/H/Java;
autoindex on;
}
此时可通过 http://localhost:8089 访问网站
与本地运行总体是一致的步骤,不同点如下:
url
并重新编译成静态文件Nginx
中需添加请求转发路径及前端静态文件路径第一点只需搭建好前端环境,然后更改代码并编译即可
搭建环境可参考项目衍生文章:Vue + iView + Webpack 前端初探
Nginx
配置如下:
# 在上一节本地运行的Nginx配置基础上加入以下location
# 请求转发
location /api {
proxy_pass http://127.0.0.1:8090; # 后端接口地址
}
# 前端(网站前台)静态文件地址,文件需放在 /var/www/bitpic文件夹内
location /bitpic {
root /var/www/;
index index.html;
}
# 前端(管理后台)静态文件地址
location /admin {
root /var/www/;
index index.html;
}
此时可通过 http://yourdomain/bitpic 访问网站
部署HTTPS可以增强网站数据通信的安全性,并且提高网站SEO和可信任度
可参考项目衍生文章:基于阿里云免费SSL证书Nginx配置HTTPS
server {
listen 443;
server_name hahaha; # 修改此处
client_max_body_size 20M;
ssl on;
root html;
index index.html index.htm;
ssl_certificate ssl/xxx.pem; # 修改此处
ssl_certificate_key ssl/xxx.key; # 修改此处
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
# data redirect
location /api {
proxy_pass http://127.0.0.1:8090;
}
# user pictures
location ~ "/images/\w{32}/\w{32}/" {
root /var/www/;
autoindex on;
}
# user avatar
location ~ "/images/\w{32}/avatar/" {
root /var/www/;
autoindex on;
}
# user default avatar
location ~ "/images/avatar/" {
root /var/www/;
autoindex on;
}
# admin authenticate
location ~ "/store/\w{32}/authenticate/" {
root /var/www/;
autoindex on;
}
# admin picture
location ~ "/store/\w{32}/\w{32}/" {
root /var/www;
autoindex on;
}
# admin pic auth
location ~ "/store/\w{32}/\w{32}/check/" {
root /var/www/;
autoindex on;
}
# bitpic
location /bitpic {
root /var/www/;
index index.html;
}
# admin
location /admin {
root /var/www/;
index index.html;
}
}
项目中注册、修改密码和支付等都需要短信验证码,但目前默认关闭
项目使用腾讯云的短信服务,可自行开通服务并修改后端application.yml
中相应配置,
然后取消SmsServiceImpl.java
中的注释即可
使用IPFS存储作品及购买凭证等是利用其不可篡改不可删除的特性保障用户及摄影师利益
因为网络环境原因默认关闭,可自行安装IPFS后取消代码中有关IPFS的注释即可
登陆成功时系统随机生成32位字符串作为Token
并写入Cookie
中,然后再以Token_userId : {Token}
的形式写入Redis
中
Cookie
以及Redis
中的Token
都有时效性,且用户退出登录会即时清除
涉及信息操作时,首先检查Cookie
中有无Token
,然后取出请求中的userId
参数值,然后以Token_userId
为key
到Redis
中查找并与Cookie
中的Token
比较,所有检查通过则放行请求
以上操作可防止未登录用户访问数据,防止已登录用户伪造userId
非法访问他人数据
下载文件首先会经过信息访问权限认证,然后系统读取相应订单信息并判断有无下载权限
在系统层次划分中有介绍拦截器层是负责解决跨域问题的
具体可参考项目衍生文章:Vue + Spring boot 跨域、传参和数据相关解决方案