19年毕业时做的一个基于SSM框架+微信小程序的校园二手商城系统,工作以后一直没抽出时间来整理一下,现在有时间了,专门写一篇文章汇总整理一下。
前台:微信小程序
后台:采用Spring+SpringMVC+Mybatis框架进行开发,使用Spring的拦截器功能进行未登录拦截,或其他信息拦截,极大提高了系统被攻击的危险系数,保证了系统的安全性。
开发工具:Eclipse
数据库:采用MySQL,只有超级管理员以及指定了操作权限的用户才有权限进行表的数据操作,保证了数据存储的安全性。
服务器:该系统部署在腾讯云服务器上,由腾讯云提供的服务器和数据库环境可以增强系统的稳定性。服务器采用Tomcat9,通过配置部署描述器(web.xml)来对某些内容进行访问控制,只有通过身份验证的用户才能查看想要访问的servlet资源。
正式演示我是用的腾讯云试用30天,前期开发的话使用本地Tomcat服务器完全够用。
我给我的校园二手商城系统起名叫“小二郎”,取的二手商品的“二”字,图标如下:
【图标】
统计最近一周的用户新增和商品增减情况,采用百度Echarts插件来实现。主要包括新增用户数量统计,统计每日新增登录系统的人数;商品出售发布数量统计,统计每日用户发布二手商品数量;商品求购发布数量统计,统计每日二手商品求购数量;商品成交数量统计,统计每日商品交易成功数量。以上这几种数量统计我采用折线图的方式进行展示,直观清晰,可以直观的反映出用户增加以及商品增减数量的变化情况。
违规投诉管理界面,主要负责展示用户提交的违规投诉信息。主要包括商品编号,投诉用户,违规用户,违规次数,投诉理由,投诉状态等。还可以查看违规用户查看违规商品,确认违规后点击“确认违规”按钮,则后台自动记录用户违规次数,累计达到三次进行账户冻结操作,若无违规现象点击“无违规”按钮。
微信小程序端的我买到的界面,主要负责展示用户购买的二手商品的订单信息,并且可以动态展示订单的状态信息。
//获取用户信息
app.requestFun(
app.globalData.apiConfig.getUserInfoById,
'GET',
{
'id': userInfo.mid
},
function (res) {
if (!that.data.isPullDownRefresh) {
//初步加载
wx.hideLoading();
} else {
//下拉刷新
that.setData({
'isPullDownRefresh': false
})
wx.hideNavigationBarLoading() //完成停止加载
wx.stopPullDownRefresh() //停止下拉刷新
}
if (res.statusCode == 200) {
wx.hideLoading();
if (res.data.code == 1) {
res.data.data.avatarUrl = res.data.data.headimg;
var imgArr = [];
if (res.data.data.idCardImg!=null){
for (var i = 0; i < res.data.data.idCardImg.split(",").length; i++) {
imgArr.push(
res.data.data.idCardImg.split(",")[i]
)
}
}
if (res.data.data.status == '1011'){//已认证
that.setData({
closeStyle:'display:none'
})
}
that.setData({
userInfo: res.data.data,
photos: imgArr
})
}
}
}
)
/**
* 处理登录请求
*/
@RequestMapping(value = "/getOpenid")
@ResponseBody
public Map getOpenid(String encryptedData, String iv, String code) {
Map map = new HashMap();
//登录凭证不能为空
if (code == null || code.length() == 0) {
map.put("code", 0);
map.put("msg", "code 不能为空");
return map;
}
//小程序唯一标识 (在微信小程序管理后台获取)
String wxspAppid = appID;
//小程序的 app secret (在微信小程序管理后台获取)
String wxspSecret = appSecret;
//授权(必填)
String grant_type = "authorization_code";
String grant_type2 = "client_credential";
//////////////// 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid ////////////////
//请求参数
String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
String params2 = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&grant_type=" + grant_type2;
//发送请求
String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
String sr2 = HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/token", params2);
//解析相应内容(转换成json对象)
JSONObject json = JSONObject.fromObject(sr);
JSONObject json2 = JSONObject.fromObject(sr2);
//获取会话密钥(session_key)
String session_key = json.get("session_key").toString();
String access_token = json2.get("access_token").toString();
//用户的唯一标识(openid)
String openid = (String) json.get("openid");
//////////////// 2、对encryptedData加密数据进行AES解密 ////////////////
try {
String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
if (null != result && result.length() > 0) {
map.put("code", 1);
map.put("msg", "解密成功");
JSONObject userInfoJSON = JSONObject.fromObject(result);
User user = new User();
user.setNickName((String)userInfoJSON.get("nickName"));
user.setHeadimg((String)userInfoJSON.get("avatarUrl"));
user.setOpenId((String) userInfoJSON.get("openId"));
user.setGender((int)userInfoJSON.get("gender"));
User user1=userService.selectUserByOpenId(user.getOpenId());
if(user1!=null) {
userService.updateUserInfo(user);
user.setId(user1.getId());
}else {
userService.addWXUserInfo(user);
}
Map userInfo = new HashMap();
userInfo.put("openId", userInfoJSON.get("openId"));
userInfo.put("nickName", userInfoJSON.get("nickName"));
userInfo.put("gender", userInfoJSON.get("gender"));
userInfo.put("city", userInfoJSON.get("city"));
userInfo.put("province", userInfoJSON.get("province"));
userInfo.put("country", userInfoJSON.get("country"));
userInfo.put("avatarUrl", userInfoJSON.get("avatarUrl"));
userInfo.put("unionId", userInfoJSON.get("unionId"));
userInfo.put("accessToken",access_token);
userInfo.put("id",user.getId());
if(user1!=null) {
userInfo.put("qq",user1.getQq());
userInfo.put("email",user1.getEmail());
userInfo.put("phone",user1.getPhone());
userInfo.put("schoolId",user1.getSchoolId());
userInfo.put("schoolName",user1.getSchoolName());
userInfo.put("deptId",user1.getDeptId());
userInfo.put("deptName",user1.getDeptName());
userInfo.put("majorId",user1.getMajorId());
userInfo.put("majorName",user1.getMajorName());
userInfo.put("addr",user1.getAddr());
userInfo.put("remark",user1.getRemark());
userInfo.put("userName",user1.getUserName());
userInfo.put("idNum,",user1.getIdNum());
userInfo.put("status,",user1.getStatus());
}
map.put("userInfo", userInfo);
return map;
}
} catch (Exception e) {
e.printStackTrace();
}
map.put("code", 0);
map.put("msg", "解密失败");
return map;
}