这是我毕设时候所写的小程序,本来也想和他们一样 写一个管理系统或者写一个网站 ,这样也好实现,可谁知道,我的导师和我说,不允许写网站或者管理系统,然后我就实在是没办法,选了个校园二手交易系统,唉 没办法,简直是写的我头疼,好在最后写的差不多。和你们分享一下吧 也希望你们能够顺利毕业。
Spring 是一个非常流行和成功的java应用开发框架。
Spring Security 基于Spring 框架,提供了一套web应用安全性的完整解决方案。
一般来说,Web 应用的安全性包括两部分:
1. 用户认证(Authentication)
用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。
2. 用户授权(Authorization)
用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。
一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。
对于上面提到的两种应用情景,Spring Security 框架都有很好的支持。
在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。
在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。
小程序是一种建立在微信公众平台基础上的可即时打开的应用程序,他实现了腾讯所提到的“触手可及”的梦想,小程序不需要下载其他App,只需要打开微信扫一扫或者搜一下便可打开应用[7]。他的英文名称是Wechat Mini Program。自16年上线到现在一直是人
们开发设计的重点。已经有超过150万的开发者投入到了小程序的设计开发中。人们将
商店,游戏,便捷操作等等功能都添加到了小程序中,微信applet应用的发展,近年来
带动了业界许多人士,也给社会有关方面的人才提供了一个很好的就业平台。
微信applet是腾讯公司在微信基础上新增的功能模块,个人或团体通过对这个平台可以
进行开发来实现和特定群体的信息沟通互动。小程序和传统的App相比,具有以下几
个特定的优势[8]。
(1)小程序的开发相对于传统App来说,成本低,效益高,方便使用。
(2)小程序由于是建立在微信的基础上,所以更容易获得用户的亲睐。
(3)传统App开发周期长,成本高,小程序的门槛底,提高创业机率。
(4)App的排名竞争十分激烈,小程序不需要和他们竞争,其发展空间很大,对未来有着十分重大的影响。
MySQL数据库支持多种语言开发,使得开发者能够使用许多不同的编程语言
去访问和连接。常见的数据库中,MySQL所具有的优势比如易读取,小型
等,已经使得大部分公司使用其作为后台数据库开发工具。MySQL存储、读
取和更新数据效率很快,例如在系统中,能够很快地对商品的详细信息、用
户的个人信息等做出一个很迅速的反应,使开发的效率和用户的体验等效率
得到了很大提高[11]。MySQL使用的结构化查询语句,既保留了传统且经典
的DML即查询、检索或者修改数据,DDL即对数据库中存在对象的创建、修
改或者删除,DCL即根据用户对数据的需求来做出的权限等操作,又会在数
据类型定义上增加全新的功能,使得数据更加精炼和准确,以便让用户得到
最好的体验。
MySQL数据库具有以下特点:
(1)算法优化查询SQL语句,搜索速度快。
(2)可以在多种操作系统上运行。有很好的可变性。
(3)可供各种各样的编程语言的API编写。
(4)所使用的CPU资源支持多线程进程。
(5)InnoDB作为默认的存储引擎,采用C++编写。
(6)任何独立的编程环境可通过网络上的客户端和服务器来编程,也可使用 在数据表和其他软件访问中嵌入时用作的名称。
(7)所使用的管理工具十分方便,并且数据库优化的操作也易上手。
(8)数据库内存大,可存放成千上万条数据信息的记录。
主要分游客和管理员两个角色,游客进入微信小程序只能简单的浏览商品和查看商品的信息。用户需要授权登陆之后才可以进行商品购买收藏等操作。
后台管理员部分是单独的分离开来,用账号密码进行登陆到网页进行管理
本系统前端采用的微信小程序,后端是基于SpringBoot框架来设计的后台系统,数据库采用关系型数据库MySQL,用Navicate可视化软件来进行数据库的分析和设计。后端的图表采用的Echarts,把Java代码和微信小程序开发相结合结合,设计该小程序。本系统分为三个逻辑相互独立的层,每个层都有定义好的接口,整体架构图
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
这是登录到小程序首页的效果图
商品发布
消息沟通交流
我的信息资料
首先是登陆部分的实现,代码太多 !!!!!!!
/**
* @author ddj
*/
@Slf4j
@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private CurrentUser currentUser;
@Autowired
private UserRepository userRepository;
@Value("${weChat.appid}")
String appid;
@Value("${weChat.secret}")
String secret;
/**
* code登录获取用户openid
* @param @RequestBody LoginUser loginUser
* @return
* @throws Exception
*/
@PostMapping("/login")
public ResponseResult login(@RequestBody LoginUser loginUser)throws Exception{
JSONObject sessionInfo = JSONObject.parseObject(jcode2Session(loginUser.getCode()));
String openid =sessionInfo.getString("openid");
String sessionkey=sessionInfo.getString("session_key");
User optionalUser = userRepository.findByOpenid(openid);
if (optionalUser==null){
optionalUser = new User();
optionalUser.setOpenid(openid);
}
optionalUser.setSessienkey(sessionkey);
optionalUser.setNickname(loginUser.getNickName());
optionalUser.setHeadurl(loginUser.getHeadUrl());
optionalUser=userRepository.save(optionalUser);
ArrayList roles=new ArrayList<String>();
roles.add("user");
String token = JwtTokenUtils.createToken(optionalUser.getSessienkey(),roles);
return ResponseResult.ok("登录成功",token);
}
/**
* code登录获取用户openid
* @param @RequestBody LoginUser loginUser
* @return
* @throws Exception
*/
@PostMapping("/info")
public ResponseResult info()throws Exception{
return ResponseResult.ok("success",userRepository.findBySessienkey(currentUser.getCurrentUser().getUsername()));
}
/**
* 登录凭证校验
* @param code
* @return
* @throws Exception
*/
private String jcode2Session(String code)throws Exception{
String sessionInfo = Jcode2SessionUtil.jscode2session(appid,secret,code,"authorization_code");//登录grantType固定
log.info(sessionInfo);
return sessionInfo;
}
}
商品的上下架处理以及收藏的实现
/**
* @ddj
*/
@RestController
@RequestMapping("/api/goods")
public class ApiGoodsController {
@Autowired
GoodsRepository goodsRepository;
@Autowired
CurrentUser currentUser;
@Autowired
UserRepository userRepository;
@Autowired
LoveRecordRepository loveRecordRepository;
@Autowired
OrderRepository orderRepository;
@GetMapping("/all")
public ResponseResult getPageData() {
return ResponseResult.ok(goodsRepository.findAll());
}
@PostMapping("/publish")
public ResponseResult save(@RequestBody Goods categories) {
categories.setPublishUserId(currentUser.getCurrentUser().getUserInfo().getId());
categories.setStatus(1);
goodsRepository.save(categories);
return ResponseResult.ok(categories);
}
@GetMapping("/publish_list")
public ResponseResult publishList(@RequestParam(value = "page", defaultValue = "1") int pageNum) {
int user_id= currentUser.getCurrentUser().getUserInfo().getId();
return ResponseResult.ok(goodsRepository.findByPublishUserId(user_id,PageRequest.of(pageNum-1, 20)));
}
@GetMapping("/down")
public ResponseResult down(@RequestParam(value = "goods_id", defaultValue = "1") int goods_id,@RequestParam(value = "status", defaultValue = "0") int status) {
Goods goods = goodsRepository.findById(goods_id).get();
goods.setStatus(status);
goodsRepository.save(goods);
return ResponseResult.ok("下架成功");
}
@GetMapping("/getdetail")
public ResponseResult detail(@RequestParam(value = "goods_id", defaultValue = "1") int goods_id) {
Optional<Goods> optional= goodsRepository.findById(goods_id);
if(optional.isPresent()){
Goods good= optional.get();
User user= userRepository.findById(good.getPublishUserId()).get();
user.setOpenid("");
user.setStatus(null);
user.setSessienkey(null);
GoodsDetailsInfo goodsInfo =new GoodsDetailsInfo();
goodsInfo.setGoods(good);
goodsInfo.setUser(user);
goodsInfo.set_loved(loveRecordRepository.findByGoodsidAndUserid(goods_id,user.getId()).isPresent());
goodsInfo.setRecommends(goodsRepository.findRecommandGoods(good.getCategoriesId()));
goodsInfo.setOrders(orderRepository.getEvaluation(good.getPublishUserId()));
return ResponseResult.ok(goodsInfo);
}
return ResponseResult.error(40003,"没有该商品");
}
@GetMapping("/love")
public ResponseResult love(@RequestParam(value = "goods_id", defaultValue = "1") int goods_id) {
int user_id= currentUser.getCurrentUser().getUserInfo().getId();
Optional<LoveRecord> optional= loveRecordRepository.findByGoodsidAndUserid(goods_id,user_id);
if (optional.isPresent()){
loveRecordRepository.delete(optional.get());
return ResponseResult.ok("取消收藏成功",false);
}else{
LoveRecord lr=new LoveRecord();
lr.setGoodsid(goods_id);
lr.setUserid(user_id);
loveRecordRepository.save(lr);
return ResponseResult.ok("收藏成功");
}
}
@GetMapping("/lovelist")
public ResponseResult lovelist(@RequestParam(value = "page", defaultValue = "1") int pageNum) {
int user_id= currentUser.getCurrentUser().getUserInfo().getId();
return ResponseResult.ok(goodsRepository.lovegoodslist(user_id,PageRequest.of(pageNum-1, 20)));
}
@GetMapping("/getlist")
public ResponseResult list(@RequestParam(value = "page", defaultValue = "1") int pageNum,
@RequestParam(value = "categories_id",defaultValue = "1") int categories_id) {
return ResponseResult.ok(goodsRepository.findByCategoriesId(categories_id,PageRequest.of(pageNum-1, 100)));
}
@GetMapping("/search")
public ResponseResult search(@RequestParam(value = "page", defaultValue = "1") int pageNum,
@RequestParam(value = "key",defaultValue = "") String searchKey) {
return ResponseResult.ok(goodsRepository.searchGoods(searchKey,PageRequest.of(pageNum-1, 100)));
}
}
这是地址部分的代码
/**
* @ddj
*/
@Slf4j
@RestController
@RequestMapping("/api/address")
public class AddressController {
@Autowired
private CurrentUser currentUser;
@Autowired
private AddressRepository addressRepository;
@GetMapping("/all")
public ResponseResult getPageData() {
return ResponseResult.ok(addressRepository.findAll());
}
@PostMapping("/save")
public ResponseResult save(@RequestBody Address categories) {
categories.setUser_id(currentUser.getCurrentUser().getUserInfo().getId());
addressRepository.save(categories);
return ResponseResult.ok(categories);
}
@GetMapping("/delete")
public ResponseResult deleteAddress(@RequestParam(value = "id", defaultValue = "1") int id) {
addressRepository.deleteById(id);
return ResponseResult.ok("删除成功");
}
@GetMapping("/set_default")
public ResponseResult set_default(@RequestParam(value = "id") int id,@RequestParam(value = "is_default") int is_default) {
addressRepository.clear_default(currentUser.getCurrentUser().getUserInfo().getId());
if (is_default==1){
addressRepository.set_default(id);
}
return ResponseResult.ok("设置成功");
}
}
订单部分代码
/**
* @ddj
*/
@RestController
@RequestMapping("/api/order")
public class OrderController {
@Autowired
CurrentUser currentUser;
@Autowired
UserRepository userRepository;
@Autowired
GoodsRepository goodsRepository ;
@Autowired
OrderRepository orderRepository ;
@GetMapping("/create")
public ResponseResult publishList(@RequestParam(value = "goods_id") int goods_id,@RequestParam(value = "address_id") int address_id) {
Goods goods = goodsRepository.findById(goods_id).get();
User seller = userRepository.findById(goods.getPublishUserId()).get();
User buyer = userRepository.findById(currentUser.getCurrentUser().getUserInfo().getId()).get();
if (goods.getStatus()==1){
Order order=new Order();
order.setGoodsId(goods_id);
order.setUserId(currentUser.getCurrentUser().getUserInfo().getId());
order.setSn(generateOrderNumber());
order.setAddress_id(address_id);
order.setStatus(1);
order.setCreate_time(DateUtils.format(new Date(),DateUtils.ISO8601_DATETIME_PATTERN));
int id=orderRepository.save(order).getId();
goods.setStatus(2);
goodsRepository.save(goods);
buyer.setBuyTimes(buyer.getBuyTimes()+1);
seller.setSellCount(seller.getSellCount()+1);
userRepository.save(buyer);
userRepository.save(seller);
return ResponseResult.ok("下单成功",id);
}else{
return ResponseResult.error(5003,"下单失败");
}
}
@GetMapping("/getdetail")
public ResponseResult detail(@RequestParam(value = "order_id", defaultValue = "1") int order_id) {
Optional<Order> optional= orderRepository.findById(order_id);
if(optional.isPresent()){
Order order = optional.get();
Goods good= goodsRepository.findById(order.getGoodsId()).get();
User publisher= userRepository.findById(good.getPublishUserId()).get();
User buyer= userRepository.findById(order.getUserId()).get();
buyer.setOpenid("");
buyer.setStatus(null);
buyer.setSessienkey(null);
publisher.setOpenid("");
publisher.setStatus(null);
publisher.setSessienkey(null);
OrdertDetailsInfo odi =new OrdertDetailsInfo();
odi.setGoods(good);
odi.setPublisher(publisher);
odi.setBuyer(buyer);
odi.setOrder(order);
odi.setIsbuyer(buyer.getId()==currentUser.getCurrentUser().getUserInfo().getId());
return ResponseResult.ok(odi);
}
return ResponseResult.error(40003,"没有该商品");
}
@GetMapping("/getbuylist")
public ResponseResult lovelist(@RequestParam(value = "page", defaultValue = "1") int pageNum) {
int user_id= currentUser.getCurrentUser().getUserInfo().getId();
return ResponseResult.ok(orderRepository.getBuyList(user_id,PageRequest.of(pageNum-1, 20)));
}
@GetMapping("/getselllist")
public ResponseResult sellout(@RequestParam(value = "page", defaultValue = "1") int pageNum) {
int user_id= currentUser.getCurrentUser().getUserInfo().getId();
return ResponseResult.ok(orderRepository.getSellOutrList(user_id,PageRequest.of(pageNum-1, 20)));
}
@GetMapping("/sendout")
public ResponseResult sendout(@RequestParam(value = "order_id", defaultValue = "1") int order_id,@RequestParam(value = "wldh", defaultValue = "1") String wldh) {
Order order = orderRepository.findById(order_id).get();
order.setKddh(wldh);
order.setStatus(2);
order.setSend_time(DateUtils.format(new Date(),DateUtils.ISO8601_DATETIME_PATTERN));
orderRepository.save(order);
return ResponseResult.ok("发货成功");
}
@GetMapping("/receive")
public ResponseResult receive(@RequestParam(value = "order_id", defaultValue = "1") int order_id,@RequestParam(value = "evaluation", defaultValue = "") String evaluation) {
Order order = orderRepository.findById(order_id).get();
order.setStatus(3);
order.setEvaluation(evaluation);
order.setFinish_time(DateUtils.format(new Date(),DateUtils.ISO8601_DATETIME_PATTERN));
orderRepository.save(order);
return ResponseResult.ok("收货成功");
}
public static String generateOrderNumber() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
String timeStr = DateUtils.format(cal.getTime(), "yyyyMMddHHmmssSSS");
return timeStr + CharUtil.getRandomNum(6);
}
}