跳转至

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
    alt
  • 按下图步骤操作并输入内容:
    alt
  • 点击生成按钮,开始代码生成,生成完毕后会提示:
    alt
  • 打开输出目录,可以看到自动生成的文件
    alt

其他需要编写的代码

  • 打开ConsumeRecord.go文件,找到“//customRefrenceBegin”,换行后输入 "time",结果如下:
    import (
        //customRefrenceBegin
        "time"
        //customRefrenceEnd
    )
    
  • 打开ConsumeRecordService.go文件,找到最后面的:
    //goExportsSettingsBegin
    //false;Get;GetList;Add;Update;Delete;注意:修改true/false后要重新生成一次;
    //goExportsSettingsEnd
    
    修改为:(将第2行最前面的false修改为true)
    //goExportsSettingsBegin
    //true;Get;GetList;Add;Update;Delete;注意:修改true/false后要重新生成一次;
    //goExportsSettingsEnd
    
    用i3go_codemaker重新生成一次代码,很重要
    在此文件中,找到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.rar

启动与调用

  • 在i3go_t002目录下执行命令:(注意不要使用go run main.go,因为那样运行目录是一个临时目录,会访问不到网页文件)
    go build main.go
    main
    

新增记录

修改记录

删除记录

查询记录

  • 准备数据:多进行几次添加记录操作,然后打开数据库手工修改至类似如下数据: alt
  • 在浏览器中输入地址:
    http://127.0.0.1:8113/consumeRecordService.goss?m=getList&useJsonp=true&page=2&rows=4&sort=value%20desc alt
  • 参数说明:
    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:备用字段

按类别查询

按金额查询

  • 在类别查询代码后添加金额查询代码:
        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 alt

按创建时间查询

特别说明

  • 上面添加的查询条件,可以组合查询
  • 这里为了简化demo代码,访问接口时使用了get方式,同时对复杂操作的参数做了编码操作。 在实际应用中,建议复杂参数通过post方式提交,避免编码不一致引发错误。
  • 提供了接口后,静态网页中可以用任意你熟悉的方式进行调用,比如快速开始中的方法