基于go+vue+pgsql+redis实现的超市进销存管理系统源代码,数据库课程设计
这是本人第一次写前后端分离的项目,其中go语言有一定基础,能看懂代码,但是Vuepostgresredis真的是一点基础都没有,只是之前听过,一个人前后端全去完成还是很难的,比如本人去写前端的时候就是照着视频里面去一步一步去做的,整个项目做下来业务是完成了,但是总是感觉漏洞百出,并没有做到很好,我想这也是学艺不精的缘故。以后会学的更精细化一点,让项目更完美。基于go+vue+pgsql+redis
题目
超市进销存管理系统
题目要求
本项目学生需要通过此项目完成项目数据库设计,信息系统开发等。 系统介绍:系统分为两个权限部分:管理员用户登录模块,普通用户登陆模块。管理员用户登录模块包括:供应商管理,员工管理,商品管理,会员管理,采购管理。普通用户登陆模块包括:个人信息,商品信息,采购信息。本项目实现以下功能:
供应商管理
批量录入供应商数据,手动输入供应商编号,供应商名称,供应商简称,地址,公司电话,邮件,联系人,联系人电话,备注。
查询并列出表中所有的供应商信息。
修改指定供应商的信息。
删除指定供应商数据。
商品管理
批量录入商品数据,手动输入商品编号,商品名称,商品单价,供应商编号,商品简介,备注等。
查询并列出所有商品信息。
修改制定商品的商品信息。
删除指定商品数据。
员工管理
批量录入员工数据,手动输入员工编号,员工姓名,员工密码,员工级别,员工电话,员工工资,备注等。
查询并列出所有员工信息。
修改指定员工信息。
删除指定员工数据。
采购管理
录入采购主表数据,手动输入采购清单号,员工编号(外码),采购数量,采购总价,采购时间,备注。
录入采购明细数据,手动输入采购明细号,采购清单号(外码),商品编号(外码),采购数量,商品单价,商品总价,备注。
查询并列出所有采购主表和采购明细信息。
修改指定采购主表信息和采购明细信息。
删除指定采购主表信息和采购明细信息。
普通用户登陆模块。
查询自己的员工信息。
查询所有商品信息。
查询所有的采购信息。
整体架构为 MVC
其中 model
为所有在数据库中存的表,在 go
中表示的是一个个的结构体
model 的基类为 gorm.Model
,并让其他的 model
都拥有这个基类,那么所有的 model
就拥有了创建时间,修改时间和删除时间
接下来展示剩下的所有 model
商品类
菜单类
员工类
供应商类
采购主表类
采购明细
其中 model
中还加入了这些 model
与数据库进行增删改查的操作。
接下来就是 Controller
了
Controller 主要是这些 model
和前端进行一定的交互,相互传递 JSON
数据
最后就是 view
视图层,采用的是 Vue
前端主要进行和用户之间进行一定的交互,这一部分包括了对数据进行的校验,本人在写整个项目,后端并没有进行数据校验,后端只对系统本身的异常和数据库的异常进行处理,数据校验全部交给了前端,如果数据校验合格了,那么插入数据库中的数据也没有问题
数据校验的一些代码
editFormRules: { workerid: [ { required: true, message: '请输入员工编号', trigger: 'blur' }, { min: 3, max: 10, message: '员工编号的长度在3~10个字符之间', trigger: 'blur' } ], workername: [ { required: true, message: '请输入员工姓名', trigger: 'blur' }, { min: 3, max: 10, message: '员工姓名的长度在3~10个字符之间', trigger: 'blur' } ], workerpassword: [ { required: true, message: '请输入员工密码', trigger: 'blur' }, { min: 6, max: 15, message: '员工密码的长度在6~15个字符之间', trigger: 'blur' } ], workerlevel: [ { required: true, message: '请输入员工级别', trigger: 'blur' }, { min: 1, max: 3, message: '员工级别的长度在1-3个字符之间', trigger: 'blur' } ], workerphone: [ { required: true, message: '请输入员工电话', trigger: 'blur' }, { min: 11, max: 11, message: '员工密码必须为11位', trigger: 'blur' }, { validator: checkPhone, trigger: 'blur' } ], workersalary: [ { required: true, message: '请输入员工工资', trigger: 'blur' }, { min: 4, max: 11, message: '员工工资的长度在4-10个字符之间', trigger: 'blur' } ], workerothers: [ { required: true, message: '请输入员工工资', trigger: 'blur' } ] }
var checkPhone = (rule, value, cb) => { const regMobile = /^(0|86|17951)?(13[0-9]|15[0123456789]|17[678]|18[0-9]|14[57]|)[0-9]{8}$/ if (regMobile.test(value)) { return cb() } cb(new Error('请输入合法的手机号')) }
数据库设置E-R图
以下为创建的员工表,可以看到索引什么的,gorm
都给建好了
由于 gorm
会自动完成建表和建立索引的操作,只要在创建结构体的时候给每个属性打上标记就可以了,这样就完成表的建立
剩下的就是设计触发器了,本人其实更想通过在 go
语言后端的部分完成和触发器一样的效果,但是课程需要还是设计了触发器,自己也百度百科了一下,其实触发器是很难进行维护的,比如本人写个触发器,如果触发器代码错了,还要去找哪个触发器的问题,然后去删除触发器,然后在去重新去设计,然后再去提交,但是如果去改后端代码就方便多了
删除采购主表的触发器
CREATE OR REPLACE FUNCTION "public"."delete_purchase_master_func"() RETURNS "pg_catalog"."trigger" AS $BODY$ BEGIN IF NEW.is_del = TRUE THEN UPDATE purchase_details SET is_del = TRUE WHERE purchase_detail_master_id = OLD.master_id; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER "delete_purchase_master_trigger" AFTER UPDATE of "is_del" ON "purchase_master_tables" FOR EACH ROW EXECUTE PROCEDURE "public"."delete_purchase_master_func"();
更新商品的触发器
CREATE OR REPLACE FUNCTION "public"."update_goods_func"() RETURNS "pg_catalog"."trigger" AS $BODY$ BEGIN UPDATE purchase_details SET purchase_detail_goods_id = NEW.goods_id, purchase_detail_goods_price = NEW.goods_price WHERE purchase_detail_goods_id = OLD.goods_id; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER "update_goods_trigger" AFTER UPDATE ON "goods" FOR EACH ROW EXECUTE PROCEDURE "public"."update_goods_func"();
更新员工的触发器
CREATE OR REPLACE FUNCTION "public"."update_worker_func"() RETURNS "pg_catalog"."trigger" AS $BODY$ BEGIN UPDATE purchase_master_tables SET worker_id = NEW.worker_id WHERE worker_id = OLD.worker_id; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER "delete_workers_trigger" AFTER UPDATE ON "workers" FOR EACH ROW EXECUTE PROCEDURE "public"."update_worker_func"();
更新供应商的触发器
CREATE OR REPLACE FUNCTION "public"."update_supplier_func"() RETURNS "pg_catalog"."trigger" AS $BODY$ BEGIN UPDATE goods SET goods_supplier_id = NEW.supplier_id WHERE goods_supplier_id = OLD.supplier_id; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER "update_supplier_trigger" AFTER UPDATE OF "supplier_id" ON "suppliers" FOR EACH ROW EXECUTE PROCEDURE "public"."update_supplier_func"();
关于 redis
本人也是刚开始接触这个东西,它是类似于 cache
的一个进行缓冲的东西,本人目前还是设计不好这个东西,只是在查询操作的时候用到了一下redis
就像是 cache
和 主存的关系类似,如果能从 cache
中找到的化,那么就直接从 redis
中直接获取,如果 redis
中没有的话,再去从数据库中去找,然后并在 redis 中备份一下。
对于权限管理
本人是将后端发送的数据存到浏览器的 SessionStorage
中,进而来判断是管理员,还是普通员工,下图就展现了,不是管理员,则有一定的权限无法进行
一些截图
登录界面
修改信息
**
删除信息
显示整体数据
权限展示
个人信息显示
关于测试
本人只是通过 python
的 faker
去造数据,然后手动的去测增删改查,应该是没有问题的
python
代码
造出数据
如果还存在 bug
,那我再去改 bug
,重所周知,bug
永远存在
总结
这是本人第一次写前后端分离的项目,其中 go语言
有一定基础,能看懂代码,但是 Vue
,postgres
,redis
真的是一点基础都没有,只是之前听过,一个人前后端全去完成还是很难的,比如本人去写前端的时候就是照着视频里面去一步一步去做的,整个项目做下来业务是完成了,但是总是感觉漏洞百出,并没有做到很好,我想这也是学艺不精的缘故。以后会学的更精细化一点,让项目更完美。
完整代码下载地址:基于go+vue+pgsql+redis实现的超市进销存管理系统源代码
更多推荐
所有评论(0)