GO语言开发的单据管理系统# 系列文章目录
基于GO语言的单据管理系统
前言
前面的文章写完之后,身边的同事都在抱怨每次手动填写费用申请单据很麻烦,每次需要手写不说,纸质单据还容易丢失,在他们的墙裂要求下只能把数据采集的事情先放一边,给他们解决眼下的需求。
提示:以下是本篇文章正文内容,下面案例可供参考
一、需求分析
经过几次的需求对接和梳理,这个小系统需要具备单据输入、打印和历史数据查询的功能。由此,数据库就必不可少了。在对数据库进行选型时,分析实际应用的需求主要是处理日常的采购费用单据,实际数据量、访问量、连接数等等并不要求很高,也并不需要数据库具备能够处理巨量数据的能力,在某种程度上其实随便一种数据库都能满足要求。前段时间一直都在搞influxDB,正好可以拿来练练,数据库算是定下了。
在应用的操作页面方面,GO语言有几大成熟的web应用框架,beego、gin、iris等,没有详细研究三者的区别,直接用了gin作为框架开发web后端。这个简单项目仅在公司内部使用,就写了些最简单的HTML和JS,能满足使用就行了,并没有对前端框架进行深入研究。
二、数据结构
在这样的系统中,由于使用了influxDB,数据结构包含两个方面:**数据库连接参数**和**表单数据**。1.数据库连接参数
influxDB现在已经升级到了v2.0.4版,貌似已经不支持windows,纠结的小伙伴可以虚拟个Ubuntu安装使用,相关的教程网上随便搜,官网地址如下 influxDB安装。
influxDB数据库连接参数主要是url和token,此外还有表单数据存储对应的org, bucket, measurement等等。为了便于未来迁移数据库或者进行备份,这里将数据库连接参数做了初始化设计并可以在需要的时候直接修改参数、灵活配置。对应的json文件如下:
{
"Influxdbtoken" :"xx",
"Influxdburl" :"xx",
"Influxdborg" :"xx",
"Influxdbbucket" :"x x",
"Influxdbmeasurement" :"x"
}
解析方法如下,
type DataBaseDetails struct {
Influxdbtoken string `json:"Influxdbtoken"`
Influxdburl string `json:"Influxdburl"`
Influxdborg string `json:"Influxdborg"`
Influxdbbucket string `json:"Influxdbbucket"`
Influxdbmeasurement string `json:"Influxdbmeasurement"`
}
var Database *DataBaseDetails
func ParseDataBase(path string) (*DataBaseDetails,error){
fmt.Print("执行到数据库信息解析\n")
filedata, err := ioutil.ReadFile(path)
if err!= nil{
panic(err)
}
fmt.Println("filedata是:",string(filedata))
file,err := os.Open(path)
if err != nil{
panic(err)
}
defer file.Close()
reader := bufio.NewReader(file)
decoder := json.NewDecoder(reader)
if err := decoder.Decode(&Database);err != nil{
fmt.Print("有错误,错误是:",err,"\n")
}
return Database,nil
}
调用如下:
x,err :=models.ParseDataBase("./models/defaultDatabaseDetails.json")//传入json文件路径
if err!=nil{
fmt.Print("数据库反馈的值",x)
}
这里得到的x就可以作为数据库连接参数备用。如果需要迁移到其他服务器或者换到别的measurement,直接修改掉json文件里面对应的参数即可,关于influxDB相关参数的定义这里不做展开,百度一下或者去InfluxDB官方网站。
2.表单数据
表单数据就是需要输入、存储的值,按照固定的json格式生成和解析,如下:
type Orderinformation struct {
Operator string `json:"operator"`
Company string `json:"company"`
Reason string `json:"reason"`
Bankaccount string `json:"bankaccount"`
Account string `json:"account"`
Amount string `json:"amount"`
Date string `json:"date"`
Daxie string `json:"daxie"`
}
使用对象的时候类似C#的用法,在main函数里new一个全局公有对象
var app = new(models.Orderinformation)
注意一下GO语言中关于值传递和引用传递的不同,这里不做展开,建议具体问题具体分析。
总结
以上的内容在于给项目定下基础,后面的工作都将围绕着这些数据展开。