demo
目标¶
- 开发一个记帐服务,提供crud接口,供静态网页调用
数据库¶
- 安装mysql数据库
- 新建数据库 i3got002
- 新建数据表 consume_record:
CREATE TABLE `consume_record` ( `id` char(36) NOT NULL, `createTime` datetime DEFAULT NULL, `type` varchar(50) DEFAULT NULL, `value` decimal(14,2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
提前申明¶
本页面后续的示例中:
1. i3go_codemaker中的配置,根据实际情况进行修改。 (文件目录、引用路径)
2. main.go代码中的数据库连接字符串、service包引用路径,根据实际情况进行修改。
配置与生成代码¶
- 生成项目目录:i3go_t002
(放在你自己想放的位置,比如我放在F:\ie310.code\GOWORK\src\github.com\ie310mu\tmp\i3go_t002,F:\ie310.code\GOWORK对应于环境变量GOPATH) - 下载代码生成工具 i3go_codemaker_2019.08.21.rar ,解压到任意目录
- 运行 i3go_codemaker.exe (需要.net framework 2.0支持)
- 新建方案 i3go_t002
- 按下图步骤操作并输入内容:
- 点击生成按钮,开始代码生成,生成完毕后会提示:
- 打开输出目录,可以看到自动生成的文件
其他需要编写的代码¶
- 打开ConsumeRecord.go文件,找到“//customRefrenceBegin”,换行后输入 "time",结果如下:
import ( //customRefrenceBegin "time" //customRefrenceEnd )
- 打开ConsumeRecordService.go文件,找到最后面的:
修改为:(将第2行最前面的false修改为true)
//goExportsSettingsBegin //false;Get;GetList;Add;Update;Delete;注意:修改true/false后要重新生成一次; //goExportsSettingsEnd
用i3go_codemaker重新生成一次代码,很重要//goExportsSettingsBegin //true;Get;GetList;Add;Update;Delete;注意:修改true/false后要重新生成一次; //goExportsSettingsEnd
在此文件中,找到Add方法中的customBeforeAddContentBegin字样,换行,输入:
item.CreateTime = time.Now()
然后添加对time包的导入 - 在service目录下生成文件BaseLoginedService.go,输入内容:
package service import ( "github.com/ie310mu/ie310go/route" ) //BaseLoginedService .. type BaseLoginedService struct { route.BaseService } //BeforeExcute .. func (s BaseLoginedService) BeforeExcute(args *route.ServiceArgs) { } //AfterExcute .. func (s BaseLoginedService) AfterExcute(args *route.ServiceArgs) { }
- 在项目目录下生成文件main.go,输入内容:
package main import ( "fmt" "os" "os/signal" "syscall" _ "github.com/ie310mu/tmp/i3go_t002/service" //导入services "github.com/ie310mu/ie310go/common/logsagent" "github.com/ie310mu/ie310go/forks/github.com/ilibs/gosql" "github.com/ie310mu/ie310go" "github.com/ie310mu/ie310go/route" ) func main() { defer func() { if err := recover(); err != nil { logsagent.Error("Exception has been caught. ", err) logsagent.Warn("Press return to exit.") var empty string fmt.Scanln(&empty) } }() appinit() go ie310go.Run(nil) defer ie310go.Stop() sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT) for s := range sigs { switch s { case syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT: logsagent.Info("got signal and try to exit: ", s) return default: fmt.Println("got other signal : ", s) } } } func appinit() { cfg := gosql.Config{Enable: true, Driver: "mysql", Dsn: "root:123456@tcp(127.0.0.1:3307)/i3got002?charset=utf8&parseTime=True&loc=Asia%2FShanghai"} ie310go.SetDbInfo(cfg, cfg) //server初始化 httpConfig := route.ServerHTTPConfig{Port: "8113", ServiceSuffix: "goss"} srv := route.NewServerHTTP(httpConfig, "httpServer") exportServices(route.Services, srv) route.RegisterServer(srv) } func exportServices(ss []route.IService, srv route.Server) { for _, s := range ss { srv.RegisterService(s) } }
示例代码下载¶
启动与调用¶
- 在i3go_t002目录下执行命令:(注意不要使用go run main.go,因为那样运行目录是一个临时目录,会访问不到网页文件)
go build main.go main
新增记录¶
- 在浏览器中输入地址:
http://127.0.0.1:8113/consumeRecordService.goss?m=add&useJsonp=true&itemJson=%7B%22type%22%3A%22%E5%8D%88%E9%A4%90%22%2C%22value%22%3A25%7D注: itemJson是encodeURIComponent后的json字符串,可在chrome等浏览器的控制台通过如下代码生成: var item={}; item.type = "午餐"; item.value = 25.00; json = JSON.stringify(item); json = encodeURIComponent(json); console.info(json); 注: useJsonp=true参数用于指示是否是跨域请求,不指定此参数未返回refer error异常
修改记录¶
- 在浏览器中输入地址:
http://127.0.0.1:8113/consumeRecordService.goss?m=update&useJsonp=true&itemJson=%7B%22value%22%3A21%2C%22type%22%3A%22%E6%99%9A%E9%A4%90%22%2C%22id%22%3A%225bd7b7b2-53c9-465e-ba31-9757cdabbc35%22%7D注: itemJson是encodeURIComponent后的json字符串,可在chrome等浏览器的控制台通过如下代码生成: var item={}; item.id = "5bd7b7b2-53c9-465e-ba31-9757cdabbc35"; //id必须与前面add操作返回的id对应 item.type = "晚餐"; item.value = 21.00; json = JSON.stringify(item); json = encodeURIComponent(json); console.info(json);
删除记录¶
查询记录¶
- 准备数据:多进行几次添加记录操作,然后打开数据库手工修改至类似如下数据:
- 在浏览器中输入地址:
http://127.0.0.1:8113/consumeRecordService.goss?m=getList&useJsonp=true&page=2&rows=4&sort=value%20desc - 参数说明:
page:显示第几页,从1开始,默认值1
rows:每页多少条数据,默认值40
sort:排序,默认为空 - 结果说明:
state:状态,为0表示调用成功
message:如果接口调用错误,这里存储错误消息
data:返回的数据,对getList来说,是paging.PagingData类型
data.pageIndex:页码,从1开始
data.rowsInPage:每页多少条数据
data.pagecount:总页数
data.total:总行数
data.rows:结果数组
data.userData:备用字段
按类别查询¶
- 在ConsumeRecordService.go文件中,找到GetList方法,在“//customBeforeGetListContentBegin”与“//customBeforeGetListContentEnd”之间添加自定义代码:
whereStr = " 1=1 " typ := args.GetStringParamWithDefault("type", "") if typ != "" { whereStr = whereStr + " and type = ? " sqlArgs = append(sqlArgs, typ) }
- 在浏览器中输入地址:
http://127.0.0.1:8113/consumeRecordService.goss?m=getList&useJsonp=true&type=%E6%99%9A%E9%A4%90
按金额查询¶
- 在类别查询代码后添加金额查询代码:
bv := args.GetFloatParamWithDefault("bv", -9999) if bv != -9999 { whereStr = whereStr + " and value >= ? " sqlArgs = append(sqlArgs, bv) } ev := args.GetFloatParamWithDefault("ev", -9999) if ev != -9999 { whereStr = whereStr + " and value <= ? " sqlArgs = append(sqlArgs, ev) }
- 在浏览器中输入地址:
http://127.0.0.1:8113/consumeRecordService.goss?m=getList&useJsonp=true&bv=26&ev=27
按创建时间查询¶
- 在金额查询代码后添加时间查询代码:
beginDate := args.GetBeginDateParam() if !beginDate.IsZero() { whereStr = whereStr + " and createTime >= ? " sqlArgs = append(sqlArgs, beginDate) } endDate := args.GetEndDateParam() if !endDate.IsZero() { whereStr = whereStr + " and createTime < ? " sqlArgs = append(sqlArgs, endDate) }
- 在浏览器中输入地址:
http://127.0.0.1:8113/consumeRecordService.goss?m=getList&useJsonp=true&beginDate=2019-08-13&endDate=2019-08-14
特别说明¶
- 上面添加的查询条件,可以组合查询
- 这里为了简化demo代码,访问接口时使用了get方式,同时对复杂操作的参数做了编码操作。 在实际应用中,建议复杂参数通过post方式提交,避免编码不一致引发错误。
- 提供了接口后,静态网页中可以用任意你熟悉的方式进行调用,比如快速开始中的方法