基于java微信小程序的校园二手商城设计与实现

这是我毕设时候所写的小程序,本来也想和他们一样 写一个管理系统或者写一个网站 ,这样也好实现,可谁知道,我的导师和我说,不允许写网站或者管理系统,然后我就实在是没办法,选了个校园二手交易系统,唉 没办法,简直是写的我头疼,好在最后写的差不多。和你们分享一下吧 也希望你们能够顺利毕业。

首先介绍一下SpringSecurity安全登陆框架

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所具有的优势比如易读取,小型

等,已经使得大部分公司使用其作为后台数据库开发工具。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代码和微信小程序开发相结合结合,设计该小程序。本系统分为三个逻辑相互独立的层,每个层都有定义好的接口,整体架构图
在这里插入图片描述

系统功能模块设计

这是整个小程序系统的功能模块图。
在这里插入图片描述

数据库ER图

在这里插入图片描述

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// 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);
    }



}

猜你喜欢

转载自blog.csdn.net/weixin_44172673/article/details/107165289