前后端分离净水器售后服务系统的设计与实现

简介: 经过市场调查和分析,得知本系统的用户主要有三类,即前端注册的会员用户、维修师傅和系统管理员用户,每个用户有着不同的功能和角色。会员用户可以在前端进行注册登陆,查看相关净水器产品信息,并在线申请售后服务,同时可以在线交流信息,查看新闻和公告等;维修师傅登陆系统可以查看自己的维修工单,修改维修状态,查看用户的维修评价等;系统管理员可以对系统的基本数据做相应的管理操作,比如用户管理、售后订单管理、评价管理等。通过此系统可以完成用户在线申请净水售后服务并由平台分配维修师傅上门维修的功能,相比传统的通过400电话来进行售后服务,要方便快捷,而且通过售后反馈有利于提升后继的服务质量。

 作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码

项目编号:BS-XX-188

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:SSM+Vue

二,项目简介

饮用水安全可以说是关系着千家万户,最近几十年随着经济的发展,环境遭到了大量的破坏,地下水资源遭受了不少的污染,城市统一供水的水质又得不到一定的保证,所以这种净水器的需求越来越大。目前国内的净水器厂家越来越多,彼此的竞争压力也是越来越多,而其中的关键主要有两部分,一是产品质量要过硬,二是售后服务要跟上。净水器产品属于易耗性产品,它的耗材得经常更换,所以售后服务如果做的好,那产品的口碑就容易产生正向的宣传。本课题主要研究如何实现一个净水器售后服务管理系统,帮助净水器的经营者在市场中获得更好的口碑,服务于客户。

经过市场调查和分析,得知本系统的用户主要有三类,即前端注册的会员用户、维修师傅和系统管理员用户,每个用户有着不同的功能和角色。会员用户可以在前端进行注册登陆,查看相关净水器产品信息,并在线申请售后服务,同时可以在线交流信息,查看新闻和公告等;维修师傅登陆系统可以查看自己的维修工单,修改维修状态,查看用户的维修评价等;系统管理员可以对系统的基本数据做相应的管理操作,比如用户管理、售后订单管理、评价管理等。通过此系统可以完成用户在线申请净水售后服务并由平台分配维修师傅上门维修的功能,相比传统的通过400电话来进行售后服务,要方便快捷,而且通过售后反馈有利于提升后继的服务质量。

本课题采用前后端分离的方式来实现系统的开发,后台采用SSM框架开发,前端采用Vue+ElementUI开发前端页面,系统的业务数据采用MYSQL数据库存储,开发工具则采用IDEA集成开发工具。系统开发设计即考虑功能性,又考虑用户的体验性,功能设计灵活,界面美观大方。

系统功能结构图:

image.gif编辑

三,系统展示

4.1 前端用户功能实现

4.1.1 用户注册登陆

  用户注册登陆功能是前端用户的基本而且必要的功能,如果未登陆时可以查看相关的信息,但是无法进行互动和售后申请等操作,登陆后才可以进行相关的操作,具体实现如下图4.1所示:

image.gif编辑

图4-1  用户注册界面

   用户注册成功后可以根据注册的账户信息进行登陆操作,具体如图4-2所示。

image.gif编辑

图4.2  用户登陆界面

4.1.2 在线交流实现

系统的论坛提供了消费者在线交流的功能,通过在线交流来实现对客户粘性的增加,让客户在交流中对公司产生认可,具体实现如下图4.3所示。

image.gif编辑

图4.3  贴子展示界面

4.1.3 系统公告查询

系统发布的公告主要是发布一些相关的通知信息,以便消费者及时了解,具体实现如下图4.4所示。

image.gif编辑

图4.4 公告展示界面

4.1.4行业资讯查询

系统发布的新闻信息主要是发布一些相关的行业信息,前端用户可以根据相关条件来进行查询,并可以根据相关条件进行排序,具体实现如下图4.5所示。

image.gif编辑

图4.5 行业资讯展示界面

4.1.5产品信息查询

系统发布的产品信息主要是展示一些公司的净水器产品信息,前端用户可以根据相关条件来进行查询,并可以根据相关条件进行排序,并可以在线对产品信息进行收藏和评论操作,具体实现如下图4.6所示。

image.gif编辑

图4.6 公司产品展示界面

4.1.6  售后服务申请

在净水器的产品详情页面中,点击售后申请可以在线申请售后服务,填写相关信息后提交即可,净水器产品详情页面具体实现如下图4.7所示。

image.gif编辑

图4.7 售后申请展示界面

4.2 管理员功能实现

4.2.1 轮播图管理

此模块主要用来管理系统前端展示的轮播图片信息,可以根据需要进行相应的更换,具体如下图4.9所示。

image.gif编辑

图4.9 轮播图管理界面

4.2.2  系统公告管理

此模块主要用来管理系统前端展示的系统公告信息,可以根据需要进行相应的添加和修改,具体如下图4.9所示。

image.gif编辑

图4.10 系统公告管理界面

4.2.3  行业新闻管理

此模块主要用来管理系统前端展示的行业新闻信息,可以根据需要进行相应的添加和修改,具体如下图4.11所示。

image.gif编辑

图4.11行业资讯管理界面

4.2.4  论坛贴子管理

此模块主要用来管理系统前端在线交流的贴子信息,可以根据需要进行相应的添加和修改以及查看操作,具体如下图4.12所示。

image.gif编辑

图4.12贴子管理界面

4.2.5  用户管理

此模块主要用来管理系统的用户信息,主要包含管理员用户管理、注册用户管理、维修工人管理,用户管理具体如下图4.13所示。

image.gif编辑

图4.13注册用户管理界面

   管理员管理的操作主要是对系统管理员信息的管理,包含查询、删除、添加和查看详情等,具体如下图4.14所示。

image.gif编辑

图4.14管理员管理界面

   维修工人管理主要是对系统平台注册的维修工人信息进行管理操作,包含组合查询,删除和添加等操作,具体如下图4.15所示。

image.gif编辑

图4.15维修工人管理界面

其它功能略

四,核心代码展示

package com.project.demo.controller.base;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.project.demo.service.base.BaseService;
import com.project.demo.utils.IdWorker;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 */
@Slf4j
public class BaseController<E, S extends BaseService<E>> {
    @Setter
    protected S service;
    @PostMapping("/add")
    @Transactional
    public Map<String, Object> add(HttpServletRequest request) throws IOException {
        service.insert(service.readBody(request.getReader()));
        return success(1);
    }
    @Transactional
    public Map<String, Object> addMap(Map<String,Object> map){
        service.insert(map);
        return success(1);
    }
    @PostMapping("/set")
  @Transactional
    public Map<String, Object> set(HttpServletRequest request) throws IOException {
        service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
        return success(1);
    }
    @RequestMapping(value = "/del")
    @Transactional
    public Map<String, Object> del(HttpServletRequest request) {
        service.delete(service.readQuery(request), service.readConfig(request));
        return success(1);
    }
    @RequestMapping("/get_obj")
    public Map<String, Object> obj(HttpServletRequest request) {
        List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));
        if (resultList.size() > 0) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("obj",resultList.get(0));
            return success(jsonObject);
        } else {
            return success(null);
        }
    }
    @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);
    }
    @RequestMapping("/list_group")
    public Map<String, Object> listGroup(HttpServletRequest request) {
        Map<String,Object> map = service.selectToList(service.readQuery(request), service.readConfig(request));
        Map<String,Object> result = new HashMap<>();
        result.put("result",map);
        return result;
    }
    @RequestMapping("/bar_group")
    public Map<String, Object> barGroup(HttpServletRequest request) {
        Map<String, Object> map = service.selectBarGroup(service.readQuery(request), service.readConfig(request));
        return success(map);
    }
    @RequestMapping(value = {"/count_group", "/count"})
    public Map<String, Object> count(HttpServletRequest request) {
        Integer value= service.selectSqlToInteger(service.groupCount(service.readQuery(request), service.readConfig(request)));
        return success(value);
    }
    @RequestMapping(value = {"/sum_group", "/sum"})
    public Map<String, Object> sum(HttpServletRequest request) {
        Integer value = service.selectSqlToInteger(service.sum(service.readQuery(request), service.readConfig(request)));
        return success(value);
    }
    @RequestMapping(value = {"/avg_group", "/avg"})
    public Map<String, Object> avg(HttpServletRequest request) {
        Integer value = service.selectSqlToInteger(service.avg(service.readQuery(request), service.readConfig(request)));
        return success(value);
    }
//    @RequestMapping(value = {"/count_group", "/count"})
//    public Map<String, Object> count(HttpServletRequest request) {
//        Query count = service.count(service.readQuery(request), service.readConfig(request));
//        return success(count.getResultList());
//    }
//
//    @RequestMapping(value = {"/sum_group", "/sum"})
//    public Map<String, Object> sum(HttpServletRequest request) {
//        Query count = service.sum(service.readQuery(request), service.readConfig(request));
//        return success(count.getResultList());
//    }
//
//    @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());
//    }
    @PostMapping("/upload")
    public Map<String, Object> upload(@RequestParam(value = "file",required=false) MultipartFile file,HttpServletRequest request) {
        log.info("进入方法");
        if (file.isEmpty()) {
            return error(30000, "没有选择文件");
        }
        try {
            //判断有没路径,没有则创建
            String filePath = request.getSession().getServletContext().getRealPath("\\") +"\\upload\\";
//            String filePath = System.getProperty("user.dir") + "\\target\\classes\\static\\upload\\";
            File targetDir = new File(filePath);
            if (!targetDir.exists() && !targetDir.isDirectory()) {
                if (targetDir.mkdirs()) {
                    log.info("创建目录成功");
                } else {
                    log.error("创建目录失败");
                }
            }
//            String path = ResourceUtils.getURL("classpath:").getPath() + "static/upload/";
//            String filePath = path.replace('/', '\\').substring(1, path.length());
            String fileName = file.getOriginalFilename();
            int lastIndexOf = fileName.lastIndexOf(".");
            //获取文件的后缀名 .jpg
            String suffix = fileName.substring(lastIndexOf);
            fileName = IdWorker.getId()+suffix;
            File dest = new File(filePath + fileName);
            log.info("文件路径:{}", dest.getPath());
            log.info("文件名:{}", dest.getName());
            file.transferTo(dest);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("url", "/api/upload/" + fileName);
            return success(jsonObject);
        } catch (IOException e) {
            log.info("上传失败:{}", e.getMessage());
        }
        return error(30000, "上传失败");
    }
//    @PostMapping("/import_db")
//    public Map<String, Object> importDb(@RequestParam("file") MultipartFile file) throws IOException {
//        service.importDb(file);
//        return success(1);
//    }
//
//    @RequestMapping("/export_db")
//    public void exportDb(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        HSSFWorkbook sheets = service.exportDb(service.readQuery(request), service.readConfig(request));
//        response.setContentType("application/octet-stream");
//        response.setHeader("Content-disposition", "attachment;filename=employee.xls");
//        response.flushBuffer();
//        sheets.write(response.getOutputStream());
//        sheets.close();
//    }
    public Map<String, Object> success(Object o) {
        Map<String, Object> map = new HashMap<>();
        if (o == null) {
            map.put("result", null);
            return map;
        }
        if (o instanceof List) {
            if (((List) o).size() == 1) {
               o =  ((List) o).get(0);
                map.put("result", o);
            }else {
                String jsonString = JSONObject.toJSONString(o);
                JSONArray objects = service.covertArray(JSONObject.parseArray(jsonString));
                map.put("result", objects);
            }
        } else if (o instanceof Integer || o instanceof String) {
            map.put("result", o);
        } else {
            String jsonString = JSONObject.toJSONString(o);
            JSONObject jsonObject = JSONObject.parseObject(jsonString);
            JSONObject j = service.covertObject(jsonObject);
            map.put("result", j);
        }
        return map;
    }
    public Map<String, Object> error(Integer code, String message) {
        Map<String, Object> map = new HashMap<>();
        map.put("error", new HashMap<String, Object>(4) {{
            put("code", code);
            put("message", message);
        }});
        return map;
    }
}

image.gif

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统

image.gif编辑

image.gif编辑image.gif编辑

image.gif编辑

image.gif编辑image.gif编辑

image.gif编辑

image.gif编辑


相关文章
什么是互助预约排单系统开发丨dapp预约排单互助项目系统开发详细流程/规则方案/案例设计/逻辑功能/源码开发
Allow users to register accounts and perform identity verification to ensure the authenticity and credibility of user information.
|
7月前
|
BI
基于Jeecgboot前后端分离的ERP系统开发代码生成(三)
基于Jeecgboot前后端分离的ERP系统开发代码生成(三)
544 0
|
7月前
|
JavaScript 前端开发
基于Jeecgboot前后端分离的ERP系统开发代码生成(四)
基于Jeecgboot前后端分离的ERP系统开发代码生成(四)
559 1
|
7月前
|
BI 数据库
基于Jeecgboot前后端分离的ERP系统开发系列--出库单(1)
基于Jeecgboot前后端分离的ERP系统开发系列--出库单(1)
85 1
|
7月前
|
JavaScript 前端开发
基于Jeecgboot前后端分离的ERP系统开发系列--出库单(2)
基于Jeecgboot前后端分离的ERP系统开发系列--出库单(2)
78 1
|
7月前
|
数据库
基于Jeecgboot前后端分离的ERP系统开发数据库设计(二)
基于Jeecgboot前后端分离的ERP系统开发数据库设计(二)
50 0
|
7月前
|
数据库
基于Jeecgboot前后端分离的ERP系统开发数据库设计(一)
基于Jeecgboot前后端分离的ERP系统开发数据库设计(一)
63 0
|
7月前
|
前端开发 Java 关系型数据库
基于Jeecgboot前后端分离的流程管理平台
基于Jeecgboot前后端分离的流程管理平台
87 0
|
7月前
基于Jeecgboot前后端分离的ERP系统开发代码生成(五)
基于Jeecgboot前后端分离的ERP系统开发代码生成(五)
433 0
|
7月前
|
JavaScript 前端开发 数据库
基于Jeecgboot前后端分离的ERP系统开发代码生成(一)
基于Jeecgboot前后端分离的ERP系统开发代码生成(一)
442 0