当前位置: 首页 > news >正文

SpringBoot+Vue实现前后端分离网上药店平台

文末获取源码

开发语言:Java

框架:springboot+vue

Node:node.js

JDK版本:JDK1.8

服务器:tomcat7

数据库:mysql 5.7/8.0

数据库工具:Navicat11

开发软件:eclipse/idea,Visual 

Maven包:Maven3.3.9

浏览器:谷歌浏览器

目录

一、前言介绍

二、系统功能 

三、系统实现 

3.1前台首页模块​

3.2药品资讯模块

3.4药品商城模块

3.5商品详情模块

3.6个人资料模块

四、管理员功能模块 

4.1轮播图模块

4.2顾客模块

4.3药品资讯模块

4.4商品管理模块

4.5配送信息模块

五、部分核心代码

5.1用户登录关键代码

5.2找回密码关键代码

5.3用户注册关键代码

5.4商品管理界面代码

5.5订单管理界面代码

5.6购买订单的关键代码


一、前言介绍

本系统前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router和Vuex实现动态路由和全局状态管理,Ajax实现前后端通信,Element UI组件库时页面快速成型。后端部分:采用SpringBoot作为开发框架,同时集成MyBatis、Redis等相关技术。

系统管理也都将通过计算机进行整体智能化操作,对于网上药店平台所牵扯的管理及数据保存都是非常多的,例如管理员; 首页,站点管理(轮播图、公告栏),用户管理(管理员、顾客、骑手),内容管理(药品资讯、资讯分类列表),商城管理(商品管理、分类列表、订单列表),更多管理(跑腿订单、配送信息、配送评价)。这给管理者的工作带来了巨大的挑战,面对大量的信息,传统的管理系统,都是通过笔记的方式进行详细信息的统计,后来出现电脑,通过电脑输入软件将纸质的信息统计到电脑上,这种方式比较传统,而且想要统计数据信息比较麻烦,还受时间和空间的影响,所以为此开发了网上药店平台;为用户提供了方便管理平台,方便管理员查看及维护,并且可以通过需求进行内容的编辑及维护等;对于用户而言,可以随时进行查询所需信息,管理员可以足不出户就可以获取到系统的数据信息等,而且还能节省用户很多时间,所以开发网上药店平台给管理者带来了很大的方便,同时也方便管理员对用户信息进行处理。

二、系统功能 

本网上药店平台系统主要包括三大功能模块,即顾客功能模块和管理员功能模块、骑手功能模块。

(1)管理员模块:系统中的核心用户是管理员,管理员登录后,通过管理员来管理后台系统。主要功能有:首页,站点管理(轮播图、公告栏),用户管理(管理员、顾客、骑手),内容管理(药品资讯、资讯分类列表),商城管理(商品管理、分类列表、订单列表),更多管理(跑腿订单、配送信息、配送评价)等功能。 

(2)骑手模块:更多管理(跑腿订单、配送信息、配送评价)

(3)前台顾客:首页、公告消息、药品资讯、药品商城、购物车、我的(我的账户、我的收藏、我的地址、我的购物车、我的订单、个人中心、退出)。

三、系统实现 

3.1前台首页模块

3.2药品资讯模块

3.4药品商城模块

3.5商品详情模块

3.6个人资料模块

四、管理员功能模块 

4.1轮播图模块

4.2顾客模块

4.3药品资讯模块

4.4商品管理模块

4.5配送信息模块

五、部分核心代码

5.1用户登录关键代码

/**
     * 登录
     * @param data
     * @param httpServletRequest
     * @return
     */
    @PostMapping("login")
    public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
        log.info("[执行登录接口]");

        String username = data.get("username");
        String email = data.get("email");
        String phone = data.get("phone");
        String password = data.get("password");

        List resultList = null;
        Map<String, String> map = new HashMap<>();
        if(username != null && "".equals(username) == false){
            map.put("username", username);
            resultList = service.select(map, new HashMap<>()).getResultList();
        }
        else if(email != null && "".equals(email) == false){
            map.put("email", email);
            resultList = service.select(map, new HashMap<>()).getResultList();
        }
        else if(phone != null && "".equals(phone) == false){
            map.put("phone", phone);
            resultList = service.select(map, new HashMap<>()).getResultList();
        }else{
            return error(30000, "账号或密码不能为空");
        }
        if (resultList == null || password == null) {
            return error(30000, "账号或密码不能为空");
        }
        //判断是否有这个用户
        if (resultList.size()<=0){
            return error(30000,"用户不存在");
        }

        User byUsername = (User) resultList.get(0);


        Map<String, String> groupMap = new HashMap<>();
        groupMap.put("name",byUsername.getUserGroup());
        List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
        if (groupList.size()<1){
            return error(30000,"用户组不存在");
        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态
        if (!StringUtils.isEmpty(userGroup.getSourceTable())){
            String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
            String res = String.valueOf(service.runCountSql(sql).getSingleResult());
            if (res==null){
                return error(30000,"用户不存在");
            }
            if (!res.equals("已通过")){
                return error(30000,"该用户审核未通过");
            }
        }

        //查询用户状态
        if (byUsername.getState()!=1){
            return error(30000,"用户非可用状态,不能登录");
        }

        String md5password = service.encryption(password);
        if (byUsername.getPassword().equals(md5password)) {
            // 存储Token到数据库
            AccessToken accessToken = new AccessToken();
            accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
            accessToken.setUser_id(byUsername.getUserId());
            tokenService.save(accessToken);

            // 返回用户信息
            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
            user.put("token", accessToken.getToken());
            JSONObject ret = new JSONObject();
            ret.put("obj",user);
            return success(ret);
        } else {
            return error(30000, "账号或密码不正确");
        }
}

5.2找回密码关键代码

  /**
     * 找回密码
     * @param form
     * @return
     */
    @PostMapping("forget_password")
    public Map<String, Object> forgetPassword(@RequestBody User form,HttpServletRequest request) {
        JSONObject ret = new JSONObject();
        String username = form.getUsername();
        String code = form.getCode();
        String password = form.getPassword();
        // 判断条件
        if(code == null || code.length() == 0){
            return error(30000, "验证码不能为空");
        }
        if(username == null || username.length() == 0){
            return error(30000, "用户名不能为空");
        }
        if(password == null || password.length() == 0){
            return error(30000, "密码不能为空");
        }

        // 查询用户
        Map<String, String> query = new HashMap<>();
        query.put("username",username);
        Query select = service.select(query, service.readConfig(request));
        List list = select.getResultList();
        if (list.size() > 0) {
            User o = (User) list.get(0);
            JSONObject query2 = new JSONObject();
            JSONObject form2 = new JSONObject();
            // 修改用户密码
            query2.put("user_id",o.getUserId());
            form2.put("password",service.encryption(password));
            service.update(query, service.readConfig(request), form2);
            return success(1);
        }
        return error(70000,"用户不存在");
    }

5.3用户注册关键代码

/**
     * 注册
     * @param user
     * @return
     */
    @PostMapping("register")
    public Map<String, Object> signUp(@RequestBody User user) {
        // 查询用户
        Map<String, String> query = new HashMap<>();
        query.put("username",user.getUsername());
        List list = service.select(query, new HashMap<>()).getResultList();
        if (list.size()>0){
            return error(30000, "用户已存在");
        }
        user.setUserId(null);
        user.setPassword(service.encryption(user.getPassword()));
        service.save(user);
        return success(1);
}

/**
     * 用户ID:[0,8388607]用户获取其他与用户相关的数据
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Integer userId;

    /**
     * 账户状态:[0,10](1可用|2异常|3已冻结|4已注销)
     */

    @Basic
    @Column(name = "state")
    private Integer state;

    /**
     * 所在用户组:[0,32767]决定用户身份和权限
     */

    @Basic
    @Column(name = "user_group")
    private String userGroup;

    /**
     * 上次登录时间:
     */

    @Basic
    @Column(name = "login_time")
    private Timestamp loginTime;

    /**
     * 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时
     */

    @Basic
    @Column(name = "phone")
    private String phone;

    /**
     * 手机认证:[0,1](0未认证|1审核中|2已认证)
     */

    @Basic
    @Column(name = "phone_state")
    private Integer phoneState;

    /**
     * 用户名:[0,16]用户登录时所用的账户名称
     */

    @Basic
    @Column(name = "username")
    private String username;

    /**
     * 昵称:[0,16]
     */

    @Basic
    @Column(name = "nickname")
    private String nickname;

    /**
     * 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成
     */

    @Basic
    @Column(name = "password")
    private String password;

    /**
     * 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时
     */

    @Basic
    @Column(name = "email")
    private String email;

    /**
     * 邮箱认证:[0,1](0未认证|1审核中|2已认证)
     */

    @Basic
    @Column(name = "email_state")
    private Integer emailState;

    /**
     * 头像地址:[0,255]
     */

    @Basic
    @Column(name = "avatar")
    private String avatar;

    /**
     * 创建时间:
     */

    @Basic
    @Column(name = "create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Timestamp createTime;

    @Basic
    @Transient
    private String code;
}

5.4商品管理界面代码

 @RequestMapping(value = {"/avg_group", "/avg"})

public Map<String, Object> avg(HttpServletRequest request) {

        Query count = service.avg(service.readQuery(request), service.readConfig(request));

        return success(count.getResultList());

}

5.5订单管理界面代码

@RequestMapping("/get_list")

    public Map<String, Object> getList(HttpServletRequest request) {

        Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

        return success(map);

}

5.6购买订单的关键代码

@RequestMapping("/get_list")

    public Map<String, Object> getList(HttpServletRequest request) {

        Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

        return success(map);

}

相关文章:

  • Simulink 自动代码生成电机控制:基于Keil软件集成
  • LQ0103 子串分值【字符串】
  • 数据库实战经验分享(全量表,增量表,拉链表,流水表,快照表)
  • 【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件
  • [附源码]Java计算机毕业设计SSM电力公司员工安全培训系统
  • stm32f4xx-ADC
  • Linux命令老是记不住?一篇文章帮你解决。Linux常用命令汇总
  • 基于SPSS的医疗医保费用数据分析预测(C#)
  • 2022年科协第二次硬件培训总结
  • 计算机网络 性能指标 思维导图
  • 【初学者入门C语言】之编译预处理(十)
  • 【MySQL从入门到精通】【高级篇】(二十六)建了索引就能用么?我看未必。来看看几种索引失效的情况吧
  • leetcode47全排列2刷题打卡
  • HTTP首部的那些事,通用首部,请求首部
  • 【C基础篇】之C语言概述
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 2017届校招提前批面试回顾
  • Elasticsearch 参考指南(升级前重新索引)
  • Flex布局到底解决了什么问题
  • JavaScript设计模式与开发实践系列之策略模式
  • Laravel 实践之路: 数据库迁移与数据填充
  • leetcode-27. Remove Element
  • React Native移动开发实战-3-实现页面间的数据传递
  • vuex 学习笔记 01
  • 翻译:Hystrix - How To Use
  • 两列自适应布局方案整理
  • 前端相关框架总和
  • 王永庆:技术创新改变教育未来
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 用简单代码看卷积组块发展
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • Android开发者必备:推荐一款助力开发的开源APP
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #define与typedef区别
  • #考研#计算机文化知识1(局域网及网络互联)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1)SpringCloud 整合Python
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .Net小白的大学四年,内含面经
  • .NET性能优化(文摘)
  • .Net中间语言BeforeFieldInit
  • .net中应用SQL缓存(实例使用)
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @html.ActionLink的几种参数格式
  • @media screen 针对不同移动设备