一,项目简介
在当前社会上,许多的各种类型的电子商务类网站纷纷建立,可以很大程度上的解决人们信息资源的闭塞以及地域上的限制[1]。随着时间的推移并伴随着用户的购买能力的提高和新型互联网技术的应用,网络购物己经十分普及,上至八十岁老人,下至五六岁小朋友,大都已经学会了如何利用网络购物,使用电子交易的机制。
目前网络购物的方式主要有两种,一种是通过PC端的网站,如淘宝、京东的网页版购物平台;另一种是通过像手机APP和微信小程序商城等手机端平台来进行购物操作。但无论前端购物的形式如何,都需要一个强大的后台数据管理系统,以便于对相关的交易数据、商品数据、用户数据等进行相应的管理。相反,如果有一套通用的智慧社区电商后台管理系统,那么我们在实现购物系统时,只需要开发相应的前端展示和购物系统,就可以有效的对接后台管理数据,具有十分普遍的可移植性和通用性,所以从这个层面来讲,本系统的开发和研究是十分有价值和意义的。
本系统主要是为了开发一套通用的电商后台数据管理系统,以便于将来为大多数电商平台提供一个通用的交易数据管理和数据统计系统。通过本智慧社区电商后台管理系统,可以实现对用户、商品、订单进行相应的数据管理,并可以实现对用户的不同角色授予不同的权限。同时可以统计相应的交易数据,为平台的运营者提供决策的数据支撑。电商后台数据管理系统具体功能如下:
(1)用户管理:实现用户数据查看、搜索、状态设置、信息编辑、数据删除等操作。
(2)权限管理:实现对身份角色、权限功能进行设定,为不同的角色分配相关权限。
(3)商品管理:实现对前台展示的商品信息的管理、商品分类的管理、商品具体参数的设定等。
(4)订单管理:主要实现对前台用户实现的交易订单数据进行管理,并可以查看己付款、未付款状态的用户,同时对已经付款的用户设定发货等功能。
(5) 报表统计:统计不同区域、不同时间相关商品的销售额,并以图形报表的形式展现出来,以便于根据市场销售情况及时调整营销策略。
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
开发技术:前后端分离开发
后台开发:VUE+NODEJS
前端开发:VUE
三,系统展示
3.1后台功能模块的展示
3.1.1用户登录功能
智慧社区智慧社区电商后台管理系统后台用户如果想要对商城的相关信息进行管理操作,首先要登录系统,才可展开相关的操作。用户登陆界面如下图6-1所示。
3.1.2用户管理功能
智慧社区智慧社区电商后台管理系统管理员用户登陆系统后,可以进入用户管理菜单进行相应的用户信息管理。用户管理主要实现对用户的添加、查询、状态设置、修改和删除等操作。用户管理操作界面如下图3-2所示:
图3-2后台用户管理功能界面图
3.1.3产品分类管理功能
智慧社区智慧社区电商后台管理系统管理员用户登陆系统后,可以进入产品分类管理菜单进行相应的分类信息管理。分类操作界面如下图6-3所示。
图3-3产品分类管理功能UI界面
3.1.4 后台商品管理操作UI
智慧社区智慧社区电商后台管理系统管理员用户登陆系统后,可以进入商品管理菜单进行相应的商品信息管理。其中主要包含商品的添加、修改、查询、删除操作等,添加商品时可以上传商品的图片进行展示。商品信息管理操作界面如下图3-4所示。
图3-4后台商品管理功能UI界面
3.1.5 后台商品订单管理操作UI
智慧社区智慧社区电商后台管理系统管理员用户登陆系统后,可以进入商品订单管理菜单进行相应的商品订单信息管理。电商后台管理的商品信息管理操作界面如下图3-5所示。
图3-5后台商品管理功能UI界面
3.1.6后台商品销量统计管理操作UI
智慧社区智慧社区电商后台管理系统管理员用户登陆系统后,可以进入销量统计管理菜单进行相应的商品销售情况进行统计查看。主要以图形报表方式进行展示,其中主要以折线图的形态进行展示。电商后台商品信息统计查看界面如下图3-6所示。
图3-6折线图展示销售统计功能UI界面
3.1.7后台权限管理操作UI
智慧社区电商后台管理系统有着完备的用户权限角色设计功能,可以根据不同的用户分配不同的角色权限功能,下面展示一下部分权限列表,如图3-7所示:
图3-6权限管理功能UI界面
四,核心代码展示
var path = require("path"); daoModule = require("./DAO"); databaseModule = require(path.join(process.cwd(),"modules/database")); /** * 获取参数列表数据 * * @param {[type]} cat_id 分类ID * @param {[type]} sel 类型 * @param {Function} cb 回调函数 */ module.exports.list = function(cat_id,sel,cb) { db = databaseModule.getDatabase(); sql = "SELECT * FROM sp_attribute WHERE cat_id = ? AND attr_sel = ? AND delete_time is NULL"; database.driver.execQuery( sql ,[cat_id,sel],function(err,attributes){ if(err) return cb("查询执行出错"); cb(null,attributes); }); }
var path = require("path"); // 获取数据库模型 databaseModule = require(path.join(process.cwd(),"modules/database")); var logger = require('../modules/logger').logger(); /** * 创建对象数据 * * @param {[type]} modelName 模型名称 * @param {[type]} obj 模型对象 * @param {Function} cb 回调函数 */ module.exports.create = function(modelName,obj,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.create(obj,cb); } /** * 获取所有数据 * * @param {[type]} conditions 查询条件 * 查询条件统一规范 * conditions { "columns" : { 字段条件 "字段名" : "条件值" }, "offset" : "偏移", "omit" : ["字段"], "only" : ["需要字段"], "limit" : "", "order" :[ "字段" , A | Z, ... ] } * @param {Function} cb 回调函数 */ module.exports.list = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var model = db.models[modelName]; if(!model) return cb("模型不存在",null); if(conditions) { if(conditions["columns"]) { model = model.find(conditions["columns"]); } else { model = model.find(); } if(conditions["offset"]) { model = model.offset(parseInt(conditions["offset"])); } if(conditions["limit"]) { model = model.limit(parseInt(conditions["limit"])); } if(conditions["only"]) { model = model.only(conditions["only"]); } if(conditions["omit"]) { model = model.omit(conditions["omit"]); } if(conditions["order"]) { model = model.order(conditions["order"]); } } else { model = model.find(); } model.run(function(err,models) { if(err) { console.log(err); return cb("查询失败",null); } cb(null,models); }); }; module.exports.countByConditions = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var model = db.models[modelName]; if(!model) return cb("模型不存在",null); var resultCB = function(err,count){ if(err) { return cb("查询失败",null); } cb(null,count); } if(conditions) { if(conditions["columns"]) { model = model.count(conditions["columns"],resultCB); } else { model = model.count(resultCB); } } else { model = model.count(resultCB); } }; /** * 获取一条数据 * @param {[type]} modelName 模型名称 * @param {[数组]} conditions 条件集合 * @param {Function} cb 回调函数 */ module.exports.findOne = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; if(!Model) return cb("模型不存在",null); if(!conditions) return cb("条件为空",null); Model.one(conditions,function(err,obj){ logger.debug(err); if(err) { return cb("查询失败",null); } return cb(null,obj); }); } /** * 更新对象数据 * * @param {[type]} modelName 模型名称 * @param {[type]} id 数据关键ID * @param {[type]} updateObj 更新对象数据 * @param {Function} cb 回调函数 */ module.exports.update = function(modelName,id,updateObj,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ if(err) return cb("更新失败",null); obj.save(updateObj,cb); }); } /** * 通过主键ID获取对象 * @param {[type]} modelName 模型名称 * @param {[type]} id 主键ID * @param {Function} cb 回调函数 */ module.exports.show = function(modelName,id,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ cb(err,obj); }); } /** * 通过主键ID删除对象 * * @param {[type]} modelName 模型名称 * @param {[type]} id 主键ID * @param {Function} cb 回调函数 */ module.exports.destroy = function(modelName,id,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ if(err) return cb("无模型ID"); obj.remove(function(err) { if(err) return cb("删除失败"); return cb(null); }); }); } /** * 通过模型名称获取数据库数量 * * @param {[type]} modelName 模型名称 * @param {Function} cb 回调函数 */ module.exports.count = function(modelName,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.count(cb); } /** * 通过条件判断数据是否存在 * * @param {[type]} modelName 模块名 * @param {[type]} conditions 条件 * @param {Function} cb 回调函数 */ module.exports.exists = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.exists(conditions,function(err,isExists){ if(err) return cb("查询失败"); cb(null,isExists); }); } module.exports.getModel = function(modelName) { var db = databaseModule.getDatabase(); return db.models[modelName]; }
var path = require("path"); // 获取数据库模型 databaseModule = require(path.join(process.cwd(),"modules/database")); var logger = require('../modules/logger').logger(); /** * 创建对象数据 * * @param {[type]} modelName 模型名称 * @param {[type]} obj 模型对象 * @param {Function} cb 回调函数 */ module.exports.create = function(modelName,obj,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.create(obj,cb); } /** * 获取所有数据 * * @param {[type]} conditions 查询条件 * 查询条件统一规范 * conditions { "columns" : { 字段条件 "字段名" : "条件值" }, "offset" : "偏移", "omit" : ["字段"], "only" : ["需要字段"], "limit" : "", "order" :[ "字段" , A | Z, ... ] } * @param {Function} cb 回调函数 */ module.exports.list = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var model = db.models[modelName]; if(!model) return cb("模型不存在",null); if(conditions) { if(conditions["columns"]) { model = model.find(conditions["columns"]); } else { model = model.find(); } if(conditions["offset"]) { model = model.offset(parseInt(conditions["offset"])); } if(conditions["limit"]) { model = model.limit(parseInt(conditions["limit"])); } if(conditions["only"]) { model = model.only(conditions["only"]); } if(conditions["omit"]) { model = model.omit(conditions["omit"]); } if(conditions["order"]) { model = model.order(conditions["order"]); } } else { model = model.find(); } model.run(function(err,models) { if(err) { console.log(err); return cb("查询失败",null); } cb(null,models); }); }; module.exports.countByConditions = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var model = db.models[modelName]; if(!model) return cb("模型不存在",null); var resultCB = function(err,count){ if(err) { return cb("查询失败",null); } cb(null,count); } if(conditions) { if(conditions["columns"]) { model = model.count(conditions["columns"],resultCB); } else { model = model.count(resultCB); } } else { model = model.count(resultCB); } }; /** * 获取一条数据 * @param {[type]} modelName 模型名称 * @param {[数组]} conditions 条件集合 * @param {Function} cb 回调函数 */ module.exports.findOne = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; if(!Model) return cb("模型不存在",null); if(!conditions) return cb("条件为空",null); Model.one(conditions,function(err,obj){ logger.debug(err); if(err) { return cb("查询失败",null); } return cb(null,obj); }); } /** * 更新对象数据 * * @param {[type]} modelName 模型名称 * @param {[type]} id 数据关键ID * @param {[type]} updateObj 更新对象数据 * @param {Function} cb 回调函数 */ module.exports.update = function(modelName,id,updateObj,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ if(err) return cb("更新失败",null); obj.save(updateObj,cb); }); } /** * 通过主键ID获取对象 * @param {[type]} modelName 模型名称 * @param {[type]} id 主键ID * @param {Function} cb 回调函数 */ module.exports.show = function(modelName,id,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ cb(err,obj); }); } /** * 通过主键ID删除对象 * * @param {[type]} modelName 模型名称 * @param {[type]} id 主键ID * @param {Function} cb 回调函数 */ module.exports.destroy = function(modelName,id,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ if(err) return cb("无模型ID"); obj.remove(function(err) { if(err) return cb("删除失败"); return cb(null); }); }); } /** * 通过模型名称获取数据库数量 * * @param {[type]} modelName 模型名称 * @param {Function} cb 回调函数 */ module.exports.count = function(modelName,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.count(cb); } /** * 通过条件判断数据是否存在 * * @param {[type]} modelName 模块名 * @param {[type]} conditions 条件 * @param {Function} cb 回调函数 */ module.exports.exists = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.exists(conditions,function(err,isExists){ if(err) return cb("查询失败"); cb(null,isExists); }); } module.exports.getModel = function(modelName) { var db = databaseModule.getDatabase(); return db.models[modelName]; }
var path = require("path"); // 获取数据库模型 databaseModule = require(path.join(process.cwd(),"modules/database")); var logger = require('../modules/logger').logger(); /** * 创建对象数据 * * @param {[type]} modelName 模型名称 * @param {[type]} obj 模型对象 * @param {Function} cb 回调函数 */ module.exports.create = function(modelName,obj,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.create(obj,cb); } /** * 获取所有数据 * * @param {[type]} conditions 查询条件 * 查询条件统一规范 * conditions { "columns" : { 字段条件 "字段名" : "条件值" }, "offset" : "偏移", "omit" : ["字段"], "only" : ["需要字段"], "limit" : "", "order" :[ "字段" , A | Z, ... ] } * @param {Function} cb 回调函数 */ module.exports.list = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var model = db.models[modelName]; if(!model) return cb("模型不存在",null); if(conditions) { if(conditions["columns"]) { model = model.find(conditions["columns"]); } else { model = model.find(); } if(conditions["offset"]) { model = model.offset(parseInt(conditions["offset"])); } if(conditions["limit"]) { model = model.limit(parseInt(conditions["limit"])); } if(conditions["only"]) { model = model.only(conditions["only"]); } if(conditions["omit"]) { model = model.omit(conditions["omit"]); } if(conditions["order"]) { model = model.order(conditions["order"]); } } else { model = model.find(); } model.run(function(err,models) { if(err) { console.log(err); return cb("查询失败",null); } cb(null,models); }); }; module.exports.countByConditions = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var model = db.models[modelName]; if(!model) return cb("模型不存在",null); var resultCB = function(err,count){ if(err) { return cb("查询失败",null); } cb(null,count); } if(conditions) { if(conditions["columns"]) { model = model.count(conditions["columns"],resultCB); } else { model = model.count(resultCB); } } else { model = model.count(resultCB); } }; /** * 获取一条数据 * @param {[type]} modelName 模型名称 * @param {[数组]} conditions 条件集合 * @param {Function} cb 回调函数 */ module.exports.findOne = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; if(!Model) return cb("模型不存在",null); if(!conditions) return cb("条件为空",null); Model.one(conditions,function(err,obj){ logger.debug(err); if(err) { return cb("查询失败",null); } return cb(null,obj); }); } /** * 更新对象数据 * * @param {[type]} modelName 模型名称 * @param {[type]} id 数据关键ID * @param {[type]} updateObj 更新对象数据 * @param {Function} cb 回调函数 */ module.exports.update = function(modelName,id,updateObj,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ if(err) return cb("更新失败",null); obj.save(updateObj,cb); }); } /** * 通过主键ID获取对象 * @param {[type]} modelName 模型名称 * @param {[type]} id 主键ID * @param {Function} cb 回调函数 */ module.exports.show = function(modelName,id,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ cb(err,obj); }); } /** * 通过主键ID删除对象 * * @param {[type]} modelName 模型名称 * @param {[type]} id 主键ID * @param {Function} cb 回调函数 */ module.exports.destroy = function(modelName,id,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.get(id,function(err,obj){ if(err) return cb("无模型ID"); obj.remove(function(err) { if(err) return cb("删除失败"); return cb(null); }); }); } /** * 通过模型名称获取数据库数量 * * @param {[type]} modelName 模型名称 * @param {Function} cb 回调函数 */ module.exports.count = function(modelName,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.count(cb); } /** * 通过条件判断数据是否存在 * * @param {[type]} modelName 模块名 * @param {[type]} conditions 条件 * @param {Function} cb 回调函数 */ module.exports.exists = function(modelName,conditions,cb) { var db = databaseModule.getDatabase(); var Model = db.models[modelName]; Model.exists(conditions,function(err,isExists){ if(err) return cb("查询失败"); cb(null,isExists); }); } module.exports.getModel = function(modelName) { var db = databaseModule.getDatabase(); return db.models[modelName]; }
var path = require("path"); daoModule = require("./DAO"); databaseModule = require(path.join(process.cwd(),"modules/database")); module.exports.clearGoodAttributes = function(goods_id,cb) { db = databaseModule.getDatabase(); sql = "DELETE FROM sp_goods_attr WHERE goods_id = ?"; database.driver.execQuery( sql ,[goods_id],function(err){ if(err) return cb("删除出错"); cb(null); }); } module.exports.list = function(goods_id,cb) { db = databaseModule.getDatabase(); sql = "SELECT good_attr.goods_id,good_attr.attr_id,good_attr.attr_value,good_attr.add_price,attr.attr_name,attr.attr_sel,attr.attr_write,attr.attr_vals FROM sp_goods_attr as good_attr LEFT JOIN sp_attribute as attr ON attr.attr_id = good_attr.attr_id WHERE good_attr.goods_id = ?"; database.driver.execQuery( sql ,[goods_id],function(err,attrs){ if(err) return cb("删除出错"); cb(null,attrs); }); }
var path = require("path"); daoModule = require("./DAO"); databaseModule = require(path.join(process.cwd(),"modules/database")); /** * 创建管理员 * * @param {[type]} obj 管理员信息 * @param {Function} cb 回调函数 */ module.exports.create = function(obj,cb) { daoModule.create("ManagerModel",obj,cb); } /** * 获取管理员列表 * * @param {[type]} conditions 查询条件 * @param {Function} cb 回调函数 */ module.exports.list = function(conditions,cb) { daoModule.list("ManagerModel",conditions,function(err,models) { if(err) return cb(err,null); cb(null,models); }); } /** * 通过查询条件获取管理员对象 * * @param {[type]} conditions 条件 * @param {Function} cb 回调函数 */ module.exports.findOne = function(conditions,cb) { daoModule.findOne("ManagerModel",conditions,cb); } /** * 通过关键词查询用户 * * @param {[type]} key 关键词 * @param {[type]} offset * @param {[type]} limit * @param {Function} cb 回调函数 */ module.exports.findByKey = function(key,offset,limit,cb) { db = databaseModule.getDatabase(); sql = "SELECT * FROM sp_manager as mgr LEFT JOIN sp_role as role ON mgr.role_id = role.role_id"; if(key) { sql += " WHERE mg_name LIKE ? LIMIT ?,?"; database.driver.execQuery( sql ,["%" + key + "%",offset,limit],function(err,managers){ if(err) return cb("查询执行出错"); cb(null,managers); }); } else { sql += " LIMIT ?,? "; database.driver.execQuery(sql,[offset,limit],function(err,managers){ if(err) return cb("查询执行出错"); cb(null,managers); }); } } /** * 判断是否存在管理员 * * @param {[type]} username 用户名 * @param {Function} cb 回调函数 * */ module.exports.exists = function(username,cb) { var db = databaseModule.getDatabase(); var Model = db.models.ManagerModel; Model.exists({"mg_name":username},function(err,isExists){ if(err) return cb("查询失败"); cb(null,isExists); }); } /** * 模糊查询用户数量 * * @param {[type]} key 关键词 * @param {Function} cb 回调函数 */ module.exports.countByKey = function(key,cb) { db = databaseModule.getDatabase(); sql = "SELECT count(*) as count FROM sp_manager"; if(key) { sql += " WHERE mg_name LIKE ?"; database.driver.execQuery( sql ,["%" + key + "%"],function(err,result){ if(err) return cb("查询执行出错"); cb(null,result[0]["count"]); }); } else { database.driver.execQuery(sql,function(err,result){ if(err) return cb("查询执行出错"); cb(null,result[0]["count"]); }); } } /** * 通过ID获取管理员对象数据 * * @param {[type]} id 管理员主键ID * @param {Function} cb 回调函数 */ module.exports.show = function(id,cb) { daoModule.show("ManagerModel",id,cb); } /** * 更新管理员信息 * * @param {[type]} obj 管理员对象 * @param {Function} cb 回调函数 */ module.exports.update = function(obj,cb) { daoModule.update("ManagerModel",obj.mg_id,obj,cb); } /** * 删除管理员对象数据 * * @param {[type]} id 主键ID * @param {Function} cb 回调函数 */ module.exports.destroy = function(id,cb) { daoModule.destroy("ManagerModel",id,function(err){ if(err) return cb(err); return cb(null); }); } /** * 保存管理员信息 * * @param {[type]} obj 管理员对象 * @param {Function} cb 回调函数 */ module.exports.save = function(obj,cb) { daoModule.show(obj.mg_id,function(err,oldObj){ if(err) { daoModule.create("ManagerModel",obj,cb); } else { daoModule.update("ManagerModel",obj.mg_id,obj,cb); } }) } /** * 获取管理员数量 * * @param {Function} cb 回调函数 */ module.exports.count = function(cb) { daoModule("ManagerModel",cb); }
五,项目总结
智慧社区智慧社区电商后台管理系统的使用者可以包含多种用户角色,在系统设定时,可以根据不同的角色用户分配不同的权限操作,实现灵活的权限管理功能。系统用户总的来说主要实现的功能如下:
(1)用户管理:实现用户数据查看、搜索、状态设置、信息编辑、数据删除等操作。
(2)权限管理:实现对身份角色、权限功能进行设定,为不同的角色分配相关权限。
(3)商品管理:实现对前台展示的商品信息的管理、商品分类的管理、商品具体参数的设定等。
(4)订单管理:主要实现对前台用户实现的交易订单数据进行管理,并可以查看己付款、未付款状态的用户,同时对已经付款的用户设定发货等功能。
(5) 报表统计:统计不同区域、不同时间相关商品的销售额,并以图形报表的形式展现出来,以便于根据市场销售情况及时调整营销策略。
(6) 通知管理:下辖两个子模块疫情通知和公告通知,疫情通知主要发布疫情相关的一些通知和新闻,公告通知主要发布一些平台相关的一些通知信息。