diff --git a/.gitignore b/.gitignore
index adf8f72..da919b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,4 +20,6 @@
# Go workspace file
go.work
+/weather/.idea
+/weather/.idea/*
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..b0e2d3e
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/weather_go.iml b/.idea/weather_go.iml
new file mode 100644
index 0000000..5e764c4
--- /dev/null
+++ b/.idea/weather_go.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..b6cf840
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
\ No newline at end of file
diff --git a/weather.zip b/weather.zip
new file mode 100644
index 0000000..a8bed21
Binary files /dev/null and b/weather.zip differ
diff --git a/weather/.DS_Store b/weather/.DS_Store
new file mode 100755
index 0000000..2b9d11a
Binary files /dev/null and b/weather/.DS_Store differ
diff --git a/weather/apps/initialize.go b/weather/apps/initialize.go
new file mode 100755
index 0000000..3aa67a2
--- /dev/null
+++ b/weather/apps/initialize.go
@@ -0,0 +1,119 @@
+package apps
+
+import (
+ "fmt"
+ "os"
+ "time"
+ "weather/models"
+ "weather/service"
+
+ "github.com/robfig/cron"
+
+ "github.com/astaxie/beego"
+ "github.com/astaxie/beego/logs"
+ "github.com/astaxie/beego/orm"
+ _ "github.com/astaxie/beego/session/mysql"
+ _ "github.com/go-sql-driver/mysql"
+)
+
+func init() {
+ initLogs()
+ initDatabase()
+ initSession()
+ initCron()
+ initCronWeather()
+}
+
+func initLogs() {
+ if beego.BConfig.RunMode == beego.DEV {
+ logs.SetLogger(logs.AdapterConsole, `{"level":7}`)
+ } else if beego.BConfig.RunMode == beego.PROD {
+ wd, _ := os.Getwd()
+ //dir := wd + "/logs/"
+ dir := wd + "\\logs\\"
+ _, err := os.Stat(dir)
+ if os.IsNotExist(err) {
+ os.Mkdir(dir, os.ModePerm)
+ }
+ conf := `{"filename": "` + dir + `sesame.log", "level":6, "maxdays":90, "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info"]}`
+ fmt.Println(conf)
+ logs.SetLogger(logs.AdapterMultiFile, conf)
+ logs.EnableFuncCallDepth(true)
+ logs.Async()
+ }
+}
+
+func initDatabase() {
+ user := beego.AppConfig.String("mysqluser")
+ pw := beego.AppConfig.String("mysqlpass")
+ url := beego.AppConfig.String("mysqlurls")
+ db := beego.AppConfig.String("mysqldb")
+ params := beego.AppConfig.String("mysqlparams")
+ dataSource := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", user, pw, url, db, params)
+ maxIdle, _ := beego.AppConfig.Int("mysqlmaxIdle")
+ maxConn, _ := beego.AppConfig.Int("mysqlmaxConn")
+ logs.Debug(dataSource)
+ err := orm.RegisterDriver("mysql", orm.DRMySQL)
+ if err != nil {
+ logs.Error("注册数据库驱动失败!%v", err)
+ }
+
+ orm.RegisterModel(new(models.Account))
+ orm.RegisterModel(new(models.User), new(models.Post), new(models.Profile), new(models.Tag))
+ orm.RegisterModel(new(models.TyhoonActivity))
+ orm.RegisterModel(new(models.TyhoonListItem))
+ orm.RegisterModel(new(models.TyphoonInfo))
+
+ err = orm.RegisterDataBase("default", "mysql", dataSource, maxIdle, maxConn)
+ if err != nil {
+ logs.Error("注册数据库失败! %v", err)
+ }
+
+ orm.RunSyncdb("default", false, true)
+
+ orm.DefaultTimeLoc = time.UTC
+ logs.Notice("数据库注册成功: %s@%s", db, url)
+
+ if beego.AppConfig.String("runmode") == "dev" {
+ orm.Debug = true
+ }
+ orm.RunCommand()
+}
+
+func initSession() {
+ user := beego.AppConfig.String("mysqluser")
+ pw := beego.AppConfig.String("mysqlpass")
+ url := beego.AppConfig.String("mysqlurls")
+ db := beego.AppConfig.String("mysqldb")
+ params := beego.AppConfig.String("mysqlparams")
+ dataSource := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", user, pw, url, db, params)
+
+ beego.BConfig.WebConfig.Session.SessionOn = true
+ beego.BConfig.WebConfig.Session.SessionProvider = "mysql"
+ beego.BConfig.WebConfig.Session.SessionProviderConfig = dataSource
+
+ beego.BConfig.WebConfig.Session.SessionName = beego.AppConfig.String("SessionName")
+ beego.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600 * 24 * 7
+ beego.BConfig.WebConfig.Session.SessionCookieLifeTime = 3600 * 24 * 7
+}
+
+func initCron() {
+ c := cron.New()
+ spec := beego.AppConfig.String("syncFrequency")
+ c.AddFunc(spec, func() {
+ httpService := new(service.HttpService)
+ httpService.GetActivityTyhoon()
+ })
+ c.Start()
+}
+
+func initCronWeather() {
+ c := cron.New()
+ spec := beego.AppConfig.String("syncFrequencyWeather")
+ c.AddFunc(spec, func() {
+ httpWeatherService := new(service.HttpWeatherService)
+ httpWeatherService.GetNmcNowWeather()
+ })
+ c.Start()
+}
+
diff --git a/weather/apps/initialize_oracle.go b/weather/apps/initialize_oracle.go
new file mode 100755
index 0000000..94a45e2
--- /dev/null
+++ b/weather/apps/initialize_oracle.go
@@ -0,0 +1,119 @@
+package apps
+
+import (
+ "fmt"
+ "os"
+ "time"
+ "weather/models"
+ "weather/service"
+
+ "github.com/robfig/cron"
+
+ "github.com/astaxie/beego"
+ "github.com/astaxie/beego/logs"
+ "github.com/astaxie/beego/orm"
+ _ "github.com/astaxie/beego/session/mysql"
+ _ "github.com/go-sql-driver/mysql"
+)
+
+func init() {
+ //initLogs_oracle()
+ //initDatabase_oracle()
+ //initSession_oracle()
+ //initCron_oracle()
+ //initCronWeather_oracle()
+}
+
+func initLogs_oracle() {
+ if beego.BConfig.RunMode == beego.DEV {
+ logs.SetLogger(logs.AdapterConsole, `{"level":7}`)
+ } else if beego.BConfig.RunMode == beego.PROD {
+ wd, _ := os.Getwd()
+ dir := wd + "/logs/"
+ _, err := os.Stat(dir)
+ if os.IsNotExist(err) {
+ os.Mkdir(dir, os.ModePerm)
+ }
+ conf := `{"filename": "` + dir + `sesame.log", "level":6, "maxdays":90, "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info"]}`
+ fmt.Println(conf)
+ logs.SetLogger(logs.AdapterMultiFile, conf)
+ logs.EnableFuncCallDepth(true)
+ logs.Async()
+ }
+}
+
+func initDatabase_oracle() {
+ user := beego.AppConfig.String("mysqluser")
+ pw := beego.AppConfig.String("mysqlpass")
+ url := beego.AppConfig.String("mysqlurls")
+ db := beego.AppConfig.String("mysqldb")
+ params := beego.AppConfig.String("mysqlparams")
+ dataSource := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", user, pw, url, db, params)
+ maxIdle, _ := beego.AppConfig.Int("mysqlmaxIdle")
+ maxConn, _ := beego.AppConfig.Int("mysqlmaxConn")
+ logs.Debug(dataSource)
+ err := orm.RegisterDriver("mysql", orm.DRMySQL)
+ if err != nil {
+ logs.Error("注册数据库驱动失败!%v", err)
+ }
+
+ orm.RegisterModel(new(models.Account))
+ orm.RegisterModel(new(models.User), new(models.Post), new(models.Profile), new(models.Tag))
+ orm.RegisterModel(new(models.TyhoonActivity))
+ orm.RegisterModel(new(models.TyhoonListItem))
+ orm.RegisterModel(new(models.TyphoonInfo))
+
+ err = orm.RegisterDataBase("default", "mysql", dataSource, maxIdle, maxConn)
+ if err != nil {
+ logs.Error("注册数据库失败! %v", err)
+ }
+
+ orm.RunSyncdb("default", false, true)
+
+ orm.DefaultTimeLoc = time.UTC
+ logs.Notice("数据库注册成功: %s@%s", db, url)
+
+ if beego.AppConfig.String("runmode") == "dev" {
+ orm.Debug = true
+ }
+ orm.RunCommand()
+}
+
+func initSession_oracle() {
+ user := beego.AppConfig.String("mysqluser")
+ pw := beego.AppConfig.String("mysqlpass")
+ url := beego.AppConfig.String("mysqlurls")
+ db := beego.AppConfig.String("mysqldb")
+ params := beego.AppConfig.String("mysqlparams")
+ dataSource := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", user, pw, url, db, params)
+
+ beego.BConfig.WebConfig.Session.SessionOn = true
+ beego.BConfig.WebConfig.Session.SessionProvider = "mysql"
+ beego.BConfig.WebConfig.Session.SessionProviderConfig = dataSource
+
+ beego.BConfig.WebConfig.Session.SessionName = beego.AppConfig.String("SessionName")
+ beego.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600 * 24 * 7
+ beego.BConfig.WebConfig.Session.SessionCookieLifeTime = 3600 * 24 * 7
+}
+
+func initCron_oracle() {
+ c := cron.New()
+ spec := beego.AppConfig.String("syncFrequency")
+ c.AddFunc(spec, func() {
+ httpService := new(service.HttpService)
+ httpService.GetActivityTyhoon()
+ })
+ c.Start()
+}
+
+func initCronWeather_oracle() {
+ c := cron.New()
+ spec := beego.AppConfig.String("syncFrequencyWeather")
+ c.AddFunc(spec, func() {
+ httpWeatherService := new(service.HttpWeatherService)
+ httpWeatherService.GetNmcNowWeather()
+ })
+ c.Start()
+}
+
+
diff --git a/weather/beepack.sh b/weather/beepack.sh
new file mode 100644
index 0000000..0c5ea4a
--- /dev/null
+++ b/weather/beepack.sh
@@ -0,0 +1,11 @@
+#交叉编译打包不同平台的安装包
+
+#linux
+bee pack -be GOOSlinux GOARCH=amd64
+或
+bee pack -be GOOS=linux GOARCH=amd64
+
+#windows
+bee pack -be GOOSwindows GOARCH=amd64
+或
+bee pack -be GOOS=windows GOARCH=amd64
diff --git a/weather/conf/app.conf b/weather/conf/app.conf
new file mode 100755
index 0000000..faa1be2
--- /dev/null
+++ b/weather/conf/app.conf
@@ -0,0 +1,32 @@
+appname = weather
+ServerName = "beego"
+#runmode = dev
+runmode = prod
+httpport = 8082
+#mysqluser = "root"
+#mysqlpass = "Skyinno251,"
+#mysqlurls = "192.168.5.21:3306"
+#mysqldb = "weather"
+#mysqlparams = "charset=utf8&loc=Asia%2FShanghai"
+#连接池空闲
+#mysqlmaxIdle = 50
+#连接池最大连接数 数据库默认链接数一般为512
+#mysqlmaxConn = 300
+SessionName = "beegosessionID"
+
+syncFrequency = "0 */10 * * * *"
+syncFrequencyWeather = "0 16 * * * *"
+
+
+mysqluser = "root"
+mysqlpass = "Skyinno251,"
+mysqlurls = "192.168.2.18:3306"
+mysqldb = "weather"
+mysqlparams = "charset=utf8mb4&parseTime=True&loc=Local"
+#连接池空闲
+mysqlmaxIdle = 10
+#连接池最大连接数 数据库默认链接数一般为512
+mysqlmaxConn = 50
+
+
+
diff --git a/weather/controllers/AdminController.go b/weather/controllers/AdminController.go
new file mode 100755
index 0000000..7391342
--- /dev/null
+++ b/weather/controllers/AdminController.go
@@ -0,0 +1,18 @@
+package controllers
+
+import (
+ "github.com/astaxie/beego"
+)
+
+type AdminController struct {
+ beego.Controller
+}
+
+func (this *AdminController) ShowAPIVersion() {
+ jsoninfo := this.GetString("id")
+ if jsoninfo == "" {
+ this.Ctx.WriteString("jsoninfo is empty")
+ return
+ }
+ this.Ctx.Output.Body([]byte("weather world"))
+}
diff --git a/weather/controllers/CMSController.go b/weather/controllers/CMSController.go
new file mode 100755
index 0000000..049627c
--- /dev/null
+++ b/weather/controllers/CMSController.go
@@ -0,0 +1,32 @@
+package controllers
+
+import (
+ "fmt"
+ "weather/models"
+
+ "github.com/astaxie/beego"
+ _ "github.com/astaxie/beego/session/mysql"
+)
+
+type CMSController struct {
+ beego.Controller
+}
+
+func (c *CMSController) Get() {
+
+ c.TplName = "form.tpl"
+}
+
+func (c *CMSController) Post() {
+ u := models.User{}
+ if err := c.ParseForm(&u); err != nil {
+ c.Ctx.WriteString("jsoninfo is empty")
+ return
+ }
+
+ fmt.Println(u.Name)
+ fmt.Println(u.Age)
+ fmt.Println(u.Email)
+
+ c.Ctx.Output.Body([]byte("heleo"))
+}
diff --git a/weather/controllers/FilterUser.go b/weather/controllers/FilterUser.go
new file mode 100755
index 0000000..a47d095
--- /dev/null
+++ b/weather/controllers/FilterUser.go
@@ -0,0 +1,21 @@
+package controllers
+
+import (
+ "fmt"
+ "weather/utils"
+
+ "github.com/astaxie/beego/context"
+)
+
+// 函数功能:当访问的url不是login 时就跳转到/login这个url
+func FilterUser(ctx *context.Context) {
+ ok := ctx.Input.Session(utils.GetSessName())
+ if ok == nil {
+ ctx.Redirect(302, "/")
+ fmt.Println("nil")
+ fmt.Println("未登录或Session已失效")
+ } else {
+ fmt.Println("已登录")
+ }
+
+}
diff --git a/weather/controllers/LoginController.go b/weather/controllers/LoginController.go
new file mode 100755
index 0000000..1d34ed2
--- /dev/null
+++ b/weather/controllers/LoginController.go
@@ -0,0 +1,139 @@
+package controllers
+
+import (
+ "fmt"
+ "weather/models"
+ "weather/service"
+ "weather/utils"
+
+ "github.com/astaxie/beego"
+ _ "github.com/astaxie/beego/session/mysql"
+ "github.com/astaxie/beego/validation"
+ "github.com/prometheus/common/log"
+)
+
+type LoginController struct {
+ beego.Controller
+}
+
+func (c *LoginController) Get() {
+ c.TplName = "login.tpl"
+}
+
+func (c *LoginController) Regist() {
+ c.TplName = "regist.tpl"
+}
+
+func (c *LoginController) RegistSubmit() {
+ u := models.Account{}
+ if err := c.ParseForm(&u); err != nil {
+ c.Ctx.WriteString("jsoninfo is empty")
+ return
+ }
+ valid := validation.Validation{}
+ valid.Required(u.Username, "username")
+ valid.Required(u.Password, "password")
+ valid.MaxSize(u.Username, 35, "username")
+ valid.MinSize(u.Username, 5, "username")
+ valid.MaxSize(u.Password, 35, "password")
+ valid.MinSize(u.Password, 5, "password")
+ if valid.HasErrors() {
+ // 如果有错误信息,证明验证没通过
+ //c.TplName = "login.tpl"
+ log.Info("登录校验失败")
+ c.Redirect("/", 302)
+ return
+ }
+
+ fmt.Println(u.Username)
+ fmt.Println(u.Password)
+
+ accountService := new(service.AccountService)
+ loginSuccess := accountService.RegistAccount(u)
+ fmt.Println(loginSuccess)
+
+ //c.Ctx.Output.Cookie("uid", "235812")
+ //c.SetSession("uid", "235812")
+ //c.Ctx.Redirect(301, "/v1/main")
+ c.TplName = "login.tpl"
+}
+
+func (c *LoginController) SetSess(session int64) {
+ c.SetSession(getSessName(), session)
+}
+
+// GetSess 获取session,返回userID和是否成功获取。若失败,则表示需要重新登录
+func (c *LoginController) GetSess() (int64, bool) {
+ if session := c.getSess(); session != nil {
+ if data, ok := session.(int64); ok {
+ return data, true
+ }
+ }
+ return 0, false
+}
+
+func (c *LoginController) DelSess() {
+ c.DelSession(getSessName())
+ c.DestroySession()
+}
+
+func (c *LoginController) ValidSessionUserID() (int64, error) {
+ if session := c.getSess(); session != nil {
+ if data, ok := session.(int64); ok {
+ return data, nil
+ }
+ }
+ return 0, utils.NewError(10000, "未登录")
+}
+
+func (c *LoginController) getSess() interface{} {
+ return c.GetSession(getSessName())
+}
+
+func getSessName() string {
+ return utils.GetSessName()
+}
+
+func (c *LoginController) Post() {
+ u := models.Account{}
+ if err := c.ParseForm(&u); err != nil {
+ c.Ctx.WriteString("jsoninfo is empty")
+ return
+ }
+ valid := validation.Validation{}
+ valid.Required(u.Username, "username")
+ valid.Required(u.Password, "password")
+ valid.MaxSize(u.Username, 35, "username")
+ valid.MinSize(u.Username, 5, "username")
+ valid.MaxSize(u.Password, 35, "password")
+ valid.MinSize(u.Password, 5, "password")
+ if valid.HasErrors() {
+ // 如果有错误信息,证明验证没通过
+ //c.TplName = "login.tpl"
+ log.Info("登录校验失败")
+ c.Redirect("/", 302)
+ return
+ }
+
+ fmt.Println(u.Username)
+ fmt.Println(u.Password)
+
+ accountService := new(service.AccountService)
+ accountResult := accountService.LoginAccount(u)
+ fmt.Println(accountResult)
+ if accountResult != nil {
+ fmt.Println("登录成功")
+ } else {
+ fmt.Println("登录失败")
+ c.Redirect("/", 302)
+ return
+ }
+
+ c.SetSess(int64(accountResult.Id))
+ fmt.Println(c.getSess())
+
+ //c.Ctx.Output.Cookie("uid", "235812")
+ //c.SetSession("uid", "235812")
+ //c.Ctx.Redirect(301, "/v1/main")
+ c.TplName = "success.tpl"
+}
diff --git a/weather/controllers/MainController.go b/weather/controllers/MainController.go
new file mode 100755
index 0000000..62151e4
--- /dev/null
+++ b/weather/controllers/MainController.go
@@ -0,0 +1,22 @@
+package controllers
+
+import (
+ "github.com/astaxie/beego"
+)
+
+type MainController struct {
+ beego.Controller
+}
+
+func (c *MainController) Get() {
+ c.Data["Website"] = "beego.me"
+ c.Data["Email"] = "astaxie@gmail.com"
+ c.TplName = "index.tpl"
+}
+//jQuery18309141550713421596
+//jQuery1830003007103246306375
+
+
+//1664035488620
+//1664035488818
+//1664037019973366000
\ No newline at end of file
diff --git a/weather/go.mod b/weather/go.mod
new file mode 100755
index 0000000..ecfb26d
--- /dev/null
+++ b/weather/go.mod
@@ -0,0 +1,14 @@
+module weather
+
+go 1.16
+
+require github.com/astaxie/beego v1.12.3
+
+require (
+ github.com/denisenkom/go-mssqldb v0.12.3 // indirect
+ github.com/go-sql-driver/mysql v1.6.0
+ github.com/prometheus/common v0.10.0
+ github.com/robfig/cron v1.2.0
+ github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
+ github.com/smartystreets/goconvey v1.6.4
+)
diff --git a/weather/go.sum b/weather/go.sum
new file mode 100755
index 0000000..eb17699
--- /dev/null
+++ b/weather/go.sum
@@ -0,0 +1,249 @@
+github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0=
+github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
+github.com/astaxie/beego v1.12.1 h1:dfpuoxpzLVgclveAXe4PyNKqkzgm5zF4tgF2B3kkM2I=
+github.com/astaxie/beego v1.12.1/go.mod h1:kPBWpSANNbSdIqOc8SUL9h+1oyBMZhROeYsXQDbidWQ=
+github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
+github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
+github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
+github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
+github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
+github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
+github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
+github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
+github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
+github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
+github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw=
+github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo=
+github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
+github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
+github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
+github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
+github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
+github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.0 h1:wCi7urQOGBsYcQROHqpUUX4ct84xp40t9R9JX0FuA/U=
+github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
+github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
+github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
+github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
+github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
+github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
+github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
+github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
+github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
+github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
+github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
+github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
+github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
+golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200117065230-39095c1d176c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/weather/lastupdate.tmp b/weather/lastupdate.tmp
new file mode 100755
index 0000000..9e3a9fd
--- /dev/null
+++ b/weather/lastupdate.tmp
@@ -0,0 +1 @@
+{"/Users/wenfeihuang/go/src/weather/controllers":1664101902922601692}
\ No newline at end of file
diff --git a/weather/logs/sesame.2025-03-01.001.log b/weather/logs/sesame.2025-03-01.001.log
new file mode 100644
index 0000000..124e263
--- /dev/null
+++ b/weather/logs/sesame.2025-03-01.001.log
@@ -0,0 +1,60 @@
+2025/02/28 21:22:03.460 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:22:03.466 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:30:41.603 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:30:41.608 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:34.013 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:34.019 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:34.719 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:34.725 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:35.529 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:35.535 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:36.345 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:36.350 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:37.094 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:37.100 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:37.811 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:37.817 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:38.609 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:38.613 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:32:10.278 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:32:10.282 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:32:56.975 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:32:56.980 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:35.070 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:35.077 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:35.817 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:35.823 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:36.610 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:36.618 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:37.330 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:37.336 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:38.062 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:38.067 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:43.092 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:43.101 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:43.922 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:43.927 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:47.018 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:47.023 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:52.752 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:52.758 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:53.492 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:53.497 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:54.287 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:54.294 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:35:13.567 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:35:13.572 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:35:20.124 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:35:20.131 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:35:20.899 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:35:20.904 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:36:47.607 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:36:47.613 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:37:06.642 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:37:06.647 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:37:52.159 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:37:52.164 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:39:15.939 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:39:15.944 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:41:32.423 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:41:32.427 [I] [asm_amd64.s:1650] http server Running on http://:8082
diff --git a/weather/logs/sesame.alert.2025-03-01.001.log b/weather/logs/sesame.alert.2025-03-01.001.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.alert.log b/weather/logs/sesame.alert.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.critical.2025-03-01.001.log b/weather/logs/sesame.critical.2025-03-01.001.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.critical.log b/weather/logs/sesame.critical.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.emergency.2025-03-01.001.log b/weather/logs/sesame.emergency.2025-03-01.001.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.emergency.log b/weather/logs/sesame.emergency.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.error.2025-03-01.001.log b/weather/logs/sesame.error.2025-03-01.001.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.error.log b/weather/logs/sesame.error.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.info.2025-03-01.001.log b/weather/logs/sesame.info.2025-03-01.001.log
new file mode 100644
index 0000000..c00773f
--- /dev/null
+++ b/weather/logs/sesame.info.2025-03-01.001.log
@@ -0,0 +1,30 @@
+2025/02/28 21:22:03.466 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:30:41.608 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:34.019 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:34.725 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:35.535 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:36.350 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:37.100 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:37.817 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:31:38.613 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:32:10.282 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:32:56.980 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:35.077 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:35.823 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:36.618 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:37.336 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:33:38.067 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:43.101 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:43.927 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:47.023 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:52.758 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:53.497 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:34:54.294 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:35:13.572 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:35:20.131 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:35:20.904 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:36:47.613 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:37:06.647 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:37:52.164 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:39:15.944 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/02/28 21:41:32.427 [I] [asm_amd64.s:1650] http server Running on http://:8082
diff --git a/weather/logs/sesame.info.log b/weather/logs/sesame.info.log
new file mode 100644
index 0000000..23e9c35
--- /dev/null
+++ b/weather/logs/sesame.info.log
@@ -0,0 +1,2 @@
+2025/03/01 09:16:03.273 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/03/01 09:16:19.037 [I] [asm_amd64.s:1650] http server Running on http://:8082
diff --git a/weather/logs/sesame.log b/weather/logs/sesame.log
new file mode 100644
index 0000000..6bf7efe
--- /dev/null
+++ b/weather/logs/sesame.log
@@ -0,0 +1,4 @@
+2025/03/01 09:16:03.266 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/03/01 09:16:03.273 [I] [asm_amd64.s:1650] http server Running on http://:8082
+2025/03/01 09:16:19.032 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/03/01 09:16:19.037 [I] [asm_amd64.s:1650] http server Running on http://:8082
diff --git a/weather/logs/sesame.notice.2025-03-01.001.log b/weather/logs/sesame.notice.2025-03-01.001.log
new file mode 100644
index 0000000..8fdb234
--- /dev/null
+++ b/weather/logs/sesame.notice.2025-03-01.001.log
@@ -0,0 +1,30 @@
+2025/02/28 21:22:03.460 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:30:41.603 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:34.013 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:34.719 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:35.529 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:36.345 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:37.094 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:37.811 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:31:38.609 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:32:10.278 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:32:56.975 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:35.070 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:35.817 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:36.610 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:37.330 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:33:38.062 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:43.092 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:43.922 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:47.018 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:52.752 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:53.492 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:34:54.287 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:35:13.567 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:35:20.124 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:35:20.899 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:36:47.607 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:37:06.642 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:37:52.159 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:39:15.939 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/02/28 21:41:32.423 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
diff --git a/weather/logs/sesame.notice.log b/weather/logs/sesame.notice.log
new file mode 100644
index 0000000..6a14207
--- /dev/null
+++ b/weather/logs/sesame.notice.log
@@ -0,0 +1,2 @@
+2025/03/01 09:16:03.266 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
+2025/03/01 09:16:19.032 [N] [initialize.go:21] 数据库注册成功: weather@192.168.2.18:3306
diff --git a/weather/logs/sesame.warning.2025-03-01.001.log b/weather/logs/sesame.warning.2025-03-01.001.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/logs/sesame.warning.log b/weather/logs/sesame.warning.log
new file mode 100644
index 0000000..e69de29
diff --git a/weather/main.go b/weather/main.go
new file mode 100755
index 0000000..1eb95e9
--- /dev/null
+++ b/weather/main.go
@@ -0,0 +1,16 @@
+package main
+
+import (
+ _ "weather/apps"
+ _ "weather/routers"
+
+ "github.com/astaxie/beego"
+)
+
+func main() {
+ //开启Session 用memory保存
+ //beego.BConfig.WebConfig.Session.SessionOn = true
+ //beego.BConfig.WebConfig.Session.SessionGCMaxLifetime = 60
+ //beego.BConfig.WebConfig.Session.SessionCookieLifeTime = 60
+ beego.Run()
+}
diff --git a/weather/models/NmcCity.go b/weather/models/NmcCity.go
new file mode 100755
index 0000000..cc44e7b
--- /dev/null
+++ b/weather/models/NmcCity.go
@@ -0,0 +1,26 @@
+package models
+
+import (
+ "github.com/astaxie/beego/orm"
+ "time"
+)
+
+type NmcCity struct {
+ Code string `json:"code" orm:"pk;column(code);size(255)"`
+ City string `json:"city" orm:"column(city);size(255)"`
+ Province string `json:"province" orm:"column(province);size(255)"`
+ Url string `json:"url" orm:"column(url);size(255)"`
+ CreateDate time.Time `json:"createDate" orm:"column(create_date);auto_now_add;type(datetime)"`
+ LastUpdateDate time.Time `json:"lastUpdateDate" orm:"column(last_update_date);auto_now;type(datetime)"`
+}
+
+func init() {
+ orm.RegisterModel(new(NmcCity))
+}
+
+
+func GetNmcCityList() []*NmcCity {
+ items := make([]*NmcCity, 0)
+ orm.NewOrm().QueryTable(new(NmcCity)).All(&items)
+ return items
+}
diff --git a/weather/models/NmcNowWeather.go b/weather/models/NmcNowWeather.go
new file mode 100755
index 0000000..acc0e0c
--- /dev/null
+++ b/weather/models/NmcNowWeather.go
@@ -0,0 +1,29 @@
+package models
+
+import (
+ "github.com/astaxie/beego/orm"
+ "time"
+)
+
+type NmcNowWeather struct {
+ Id int64 `json:"id" orm:"pk;auto;column(id);size(20)"`
+ Code string `json:"code" orm:"column(code);size(255)"`
+ Weather string `json:"weather" orm:"column(weather);type(text)"`
+ WeatherDate string `json:"weatherDate" orm:"column(weather_date);size(255)"`
+ CreateDate time.Time `json:"createDate" orm:"column(create_date);auto_now_add;type(datetime)"`
+ LastUpdateDate time.Time `json:"lastUpdateDate" orm:"column(last_update_date);auto_now;type(datetime)"`
+}
+
+func init() {
+ orm.RegisterModel(new(NmcNowWeather))
+}
+
+func AddNmcNowWeather(item *NmcNowWeather) (int64, error) {
+ return orm.NewOrm().Insert(item)
+}
+
+func GetNmcNowWeatherList() []*NmcNowWeather {
+ items := make([]*NmcNowWeather, 0)
+ orm.NewOrm().QueryTable(new(NmcNowWeather)).All(&items)
+ return items
+}
diff --git a/weather/models/TyhoonActivity.go b/weather/models/TyhoonActivity.go
new file mode 100755
index 0000000..048a149
--- /dev/null
+++ b/weather/models/TyhoonActivity.go
@@ -0,0 +1,47 @@
+package models
+
+import (
+ "github.com/astaxie/beego/orm"
+)
+
+type TyhoonActivity struct {
+ Enname string `json:"enname" orm:"size(20)"`
+ Lat string `json:"lat" orm:"size(20)"`
+ Lng string `json:"lng" orm:"size(20)"`
+ Movedirection string `json:"movedirection" orm:"size(20)"`
+ Name string `json:"name" orm:"size(20)"`
+ Power string `json:"power" orm:"size(20)"`
+ Pressure string `json:"pressure" orm:"size(20)"`
+ Radius7 string `json:"radius7" orm:"size(20)"`
+ Radius10 string `json:"radius10" orm:"size(20)"`
+ Radius12 string `json:"radius12" orm:"size(20)"`
+ Speed string `json:"speed" orm:"size(20)"`
+ Strong string `json:"strong" orm:"size(20)"`
+ Time string `json:"time" orm:"size(20)"`
+ Timeformate string `json:"timeformate" orm:"size(20)"`
+ Tfid string `json:"tfid" orm:"pk;size(20)"`
+}
+
+func TyhoonActivityAdd(item *TyhoonActivity) (int64, error) {
+ return orm.NewOrm().Insert(item)
+}
+
+func TyhoonActivityDel(item *TyhoonActivity) (int64, error) {
+ return orm.NewOrm().Delete(item)
+}
+
+func GetTyhoonActivity(item *TyhoonActivity) bool {
+ var tyhoonActivityTemp TyhoonActivity
+ o := orm.NewOrm()
+ err := o.QueryTable(new(TyhoonActivity)).Filter("tfid",item.Tfid).One(&tyhoonActivityTemp)
+ if err == nil {
+ return true
+ }
+ return false
+}
+
+func GetTyhoonActivityList() []*TyhoonActivity {
+ items := make([]*TyhoonActivity, 0)
+ orm.NewOrm().QueryTable(new(TyhoonActivity)).All(&items)
+ return items
+}
diff --git a/weather/models/TyhoonListItem.go b/weather/models/TyhoonListItem.go
new file mode 100755
index 0000000..c1c08cb
--- /dev/null
+++ b/weather/models/TyhoonListItem.go
@@ -0,0 +1,49 @@
+package models
+
+import (
+ "fmt"
+ "github.com/astaxie/beego/orm"
+)
+
+type TyhoonListItem struct {
+ Enname string `json:"enname" orm:"size(20)"`
+ Isactive string `json:"isactive" orm:"size(20)"`
+ Name string `json:"name" orm:"size(20)"`
+ Warnlevel string `json:"warnlevel" orm:"size(20)"`
+ Endtime string `json:"endtime" orm:"size(20)"`
+ Starttime string `json:"starttime" orm:"size(20)"`
+ Tfid string `json:"tfid" orm:"pk;size(20)"`
+}
+
+func TyhoonListItemAdd(item *TyhoonListItem) (int64, error) {
+ return orm.NewOrm().Insert(item)
+}
+
+func TyhoonListItemUpdate(item *TyhoonListItem) bool {
+ o := orm.NewOrm()
+ if num, err := o.Update(item); err == nil {
+ fmt.Println(num)
+ return true
+ }
+ return false
+}
+
+func TyhoonListItemDel(item *TyhoonListItem) (int64, error) {
+ return orm.NewOrm().Delete(item)
+}
+
+func GetTyhoonListItem(item *TyhoonListItem) *TyhoonListItem {
+ var tyhoonListItem TyhoonListItem
+ o := orm.NewOrm()
+ err := o.QueryTable(new(TyhoonListItem)).Filter("tfid",item.Tfid).One(&tyhoonListItem)
+ if err == nil {
+ return &tyhoonListItem
+ }
+ return nil
+}
+
+func GetTyhoonListItemList() []*TyhoonListItem {
+ items := make([]*TyhoonListItem, 0)
+ orm.NewOrm().QueryTable(new(TyhoonListItem)).All(&items)
+ return items
+}
\ No newline at end of file
diff --git a/weather/models/TyphoonInfo.go b/weather/models/TyphoonInfo.go
new file mode 100755
index 0000000..c0ae47f
--- /dev/null
+++ b/weather/models/TyphoonInfo.go
@@ -0,0 +1,34 @@
+package models
+
+import (
+ "fmt"
+ "github.com/astaxie/beego/orm"
+)
+
+type TyphoonInfo struct {
+ Typhoon string `json:"typhoon" orm:"type(text)"`
+ Tfid string `json:"tfid" orm:"pk;size(20)"`
+}
+
+func TyphoonInfoAdd(item *TyphoonInfo) (int64, error) {
+ return orm.NewOrm().Insert(item)
+}
+
+func TyphoonInfoUpdate(item *TyphoonInfo) bool {
+ o := orm.NewOrm()
+ if num, err := o.Update(item); err == nil {
+ fmt.Println(num)
+ return true
+ }
+ return false
+}
+
+func GetTyphoonInfo(item *TyphoonInfo) *TyphoonInfo {
+ var typhoonInfoItem TyphoonInfo
+ o := orm.NewOrm()
+ err := o.QueryTable(new(TyphoonInfo)).Filter("tfid",item.Tfid).One(&typhoonInfoItem)
+ if err == nil {
+ return &typhoonInfoItem
+ }
+ return nil
+}
\ No newline at end of file
diff --git a/weather/models/account.go b/weather/models/account.go
new file mode 100755
index 0000000..ea8082e
--- /dev/null
+++ b/weather/models/account.go
@@ -0,0 +1,14 @@
+package models
+
+type Account struct {
+ Id int `form:"-"`
+ Username string `form:"username"`
+ Password string `form:"password"`
+}
+
+// func init() {
+// // 需要在init中注册定义的model
+// orm.RegisterModel(new(Account))
+// // create table
+// orm.RunSyncdb("default", false, true)
+// }
diff --git a/weather/models/user.go b/weather/models/user.go
new file mode 100755
index 0000000..df2f636
--- /dev/null
+++ b/weather/models/user.go
@@ -0,0 +1,42 @@
+package models
+
+// type User struct {
+// Id int `form:"-"`
+// Name interface{} `form:"username"`
+// Age int `form:"age"`
+// Email string `form:"email"`
+// }
+
+type User struct {
+ Id int
+ Name string
+ Age int `form:"age"`
+ Email string `form:"email"`
+ Profile *Profile `orm:"rel(one)"` // OneToOne relation
+ Post []*Post `orm:"reverse(many)"` // 设置一对多的反向关系
+}
+
+type Profile struct {
+ Id int
+ Age int16
+ User *User `orm:"reverse(one)"` // 设置一对一反向关系(可选)
+}
+
+type Post struct {
+ Id int
+ Title string
+ User *User `orm:"rel(fk)"` //设置一对多关系
+ Tags []*Tag `orm:"rel(m2m)"`
+}
+
+type Tag struct {
+ Id int
+ Name string
+ Posts []*Post `orm:"reverse(many)"` //设置多对多反向关系
+}
+
+// func init() {
+// // 需要在init中注册定义的model
+// orm.RegisterModel(new(User), new(Post), new(Profile), new(Tag))
+// orm.RunSyncdb("default", false, true)
+// }
diff --git a/weather/response/respError.go b/weather/response/respError.go
new file mode 100755
index 0000000..63af7c5
--- /dev/null
+++ b/weather/response/respError.go
@@ -0,0 +1,39 @@
+package response
+
+import (
+ "fmt"
+)
+
+type RespError struct {
+ code int
+ message string
+ detail string
+}
+
+func (re *RespError) Error() string {
+ return fmt.Sprintf("code:%d,message: %s,detail: %s", re.code, re.message, re.detail)
+}
+
+func RespErr(code int, message string) *RespError {
+ if code == 0 {
+ return nil
+ }
+ err := &RespError{code: code, message: message}
+ return err
+}
+
+func RespErr2(code int, message, detail string) *RespError {
+ if code == 0 {
+ return nil
+ }
+ err := &RespError{code: code, message: message, detail: detail}
+ return err
+}
+
+func (re *RespError) GetCode() int {
+ return re.code
+}
+
+func (re *RespError) GetMessage() string {
+ return re.message
+}
diff --git a/weather/response/response.go b/weather/response/response.go
new file mode 100755
index 0000000..329ebdd
--- /dev/null
+++ b/weather/response/response.go
@@ -0,0 +1,311 @@
+package response
+
+// error code
+const (
+ //Success 请求成功
+ Success = 0
+ //UnknownError 未知错误
+ UnknownError = -1
+ //SystemError 系统错误
+ SystemError = -2
+ //DatabaseError 数据库错误
+ DatabaseError = -3
+ //ParamsFewError 缺少参数
+ ParamsFewError = -5
+ //ParamsTypeError 参数类型不正确
+ ParamsTypeError = -6
+ //EmptyResult 根据给定条件查无数据,无法进一步操作。在允许出现空结果的场景不应该返回此错误码。
+ EmptyResult = -7
+
+ //ParamsTypeError 参数校验失败
+ ParamsTypeCheckError = -8
+ //account 账号相关错误在下面列出,以10000开始
+
+ //AccountNeedLogin 需要登录
+ AccountNeedLogin = 10000
+ //AccountUsernameError 用户名不正确
+ AccountUsernameError = 10001
+ //AccountPasswordError 密码不正确
+ AccountPasswordError = 10002
+ AccountError = 10003 // 账号不存在或者密码错误
+ AccountPasswordNil = 10004 // 密码不能为空
+ AccountExist = 10005 // 账号已存在
+ //user 用户模块相关错误在下面列出,以11000开始
+ UserNameError = 11001
+ UserCodeError = 11002
+ UserEmailError = 11003
+ NotFindUids = 11004 // 没收到uids
+ UserExist = 11005 // 用户已存在
+ UserNotExist = 11006 // 用户bu存在
+ UserAvatarSaveFail = 11007 // 头像存储失败
+ UserUpdateInfoFail = 11008 // 修改个人资料失败
+ UserUpdateMsgFail = 11009 // 修改个人信息失败
+
+ //org 组织模块相关错误在下面列出, 以12000开始
+
+ //OrgIdNotNull 组织id不能为空
+ OrgIdNotNull = 12000
+ //OrgNameNotNull 组织名称不能为空
+ OrgNameNotNull = 12001
+ //OrgCodeNotNull 组织编码不能为空
+ OrgCodeNotNull = 12002
+ //OrgCreateFail 组织创建失败
+ OrgCreateFail = 12003
+ //GetOrgsListFail 获取组织列表数据失败
+ GetOrgsListFail = 12004
+ //OrgNotExist 组织不存在
+ OrgNotExist = 12005
+ //OrgIsDeletedState 组织为删除状态
+ OrgIsDeletedState = 12006
+ //OrgDeletionFail 组织删除失败
+ OrgDeletionFail = 12007
+ //OrgDeletionSuccess 组织删除成功
+ OrgDeletionSuccess = 12008
+ //OrgUpdateFail 组织更新失败
+ OrgUpdateFail = 12009
+ //OrgSortUpdateFail 组织排序更新失败
+ OrgsSortUpdateFail = 12010
+ //SubOrgNameEquere 同一个组织下不能有相同的组织名称
+ SubOrgNameEquere = 12011
+ //RepairOrgAndUserDataNotMatchNoModule 不是admin用户,无权限
+ RepairOrgAndUserDataNotMatchNoModule = 12012
+ //RoleIdNotNull 角色id不能为空
+ RoleIdNotNull = 12100
+ //RoleNameNotNull 角色名称不能为空
+ RoleNameNotNull = 12101
+ //RoleCodeNotNull 角色编码不能为空
+ RoleCodeNotNull = 12102
+ //CreateIdNotNull createId不能为空
+ CreateIdNotNull = 12103
+ //CreateRoleFail 角色创建失败
+ CreateRoleFail = 12104
+ //OrgRelRoleFail 组织关联角色失败
+ OrgRelRoleFail = 12105
+ //RoleNotExist 角色不存在
+ RoleNotExist = 12150
+ //RoleIsDeletedState 角色为删除状态
+ RoleIsDeletedState = 12151
+ //RoleDeletionFail 角色删除失败
+ RoleDeletionFail = 12152
+ //RoleUpdateFail 角色更新失败
+ RoleUpdateFail = 12153
+ //GetRoleListFail 获取角色列表数据失败
+ GetRoleListFail = 12154
+ //RoleListSortUpdateFail 角色排序更新失败
+ RoleListSortUpdateFail = 12155
+ //UserChangeRoleFail 成员更改角色失败
+ UserChangeRoleFail = 12156
+ //RoleIdFineAuthorListFail 根据角色id获取当前角色已授权的权限列表失败
+ RoleIdFineAuthorListFail = 12157
+ //RoleIdChangeModuleFail 角色更改权限失败
+ RoleIdChangeModuleFail = 12158
+ //DBTablehasDataInitFail 数据库表有数据存在,无法完成初始化
+ DBTablehasDataInitFail = 12200
+ //UsersOrgInitFail 组织人员数据初始化失败
+ UsersOrgInitFail = 12201
+ //UsersOrgNotAllowRepeatInit 组织人员数据不能重复初始化
+ UsersOrgNotAllowRepeatInit = 12202
+ //PleaseUploadXlsxTypeFile 请上传excel文件
+ PleaseUploadXlsxTypeFile = 12203
+ //UploadXlsxTFileNotMatch 上传的excel文件不符合要求
+ UploadXlsxTFileNotMatch = 12204
+ //SyncFileReconizeFail excel文件解析失败
+ SyncFileReconizeFail = 12205
+ //SyncFileFail 同步失败
+ SyncFileFail = 12206
+ //SyncFileNotExsxt 同步文件不存在
+ SyncFileNotExsxt = 12207
+ //UserRoleUserIdNoNull uid不能为空
+ UserRoleUserIdNoNull = 12250
+ //TaskNotFound excel导出任务不存在
+ TaskNotFound = 12350
+ //TaskIdNotFound excel导出任务id不能为空
+ TaskIdNotFound = 12351
+ //PreSaleWeekReportNoExcelData 售前周报excel无数据
+ PreSaleWeekReportNoExcelData = 12400
+ //PreSaleWeekReportNeedWrite 本周工作和工作量统计为必填项
+ PreSaleWeekReportNeedWrite = 12401
+ //PreSaleWeekReportWorkCountNotRight 工作量统计这一项填写的数据不符合要求
+ PreSaleWeekReportWorkCountNotRight = 12402
+ //PreSaleWeekReportPjCodeOrNameNeedInputOne 项目编号和项目名称必须致少填写其中一项
+ PreSaleWeekReportPjCodeOrNameNeedInputOne = 12403
+ //PreSaleWeekReportRishLevelNeedInput 当项目风险这一项填入数据时,风险级别这一项也必须填入
+ PreSaleWeekReportRishLevelNeedInput = 12404
+ //PreSaleWeekReportExcelNoFormat 售前周报excel格式不符合要求,excel行数据不允许合并单元格,无法解析数据
+ PreSaleWeekReportExcelNoFormat = 12405
+ //CurrentLoginUserNoPreSaleDeparment 当前登录用户不是售前市场部成员,不允许导入售前周报
+ CurrentLoginUserNoPreSaleDeparment = 12406
+ //ThisPreSaleWeeklyIsExists 本周售前周报已存在,不允许重复导入
+ ThisPreSaleWeeklyIsExists = 12407
+ //PreSaleProjectNameNoMatch 项目数据只存在项目名称时,项目名称格式不符合要求,必须用:隔开,并且:前面不能只有一个空字符串
+ PreSaleProjectNameNoMatch = 12408
+ //PreSaleProjectNameTypeNoMatch 项目数据只存在项目名称时,项目名称格式不符合要求,必须用:隔开,并且:前面不能只有一个空字符串
+ PreSaleProjectNameTypeNoMatch = 12409
+ //PreSaleProjectFirstWriteNoName 项目数据校验失败,项目编号和项目名称不匹配
+ PreSaleProjectFirstWriteNoName = 12410
+ //NoPreSaleWeeklyMemberNoWeekly 当前登录用户不是售前市场部成员,无售前周报
+ NoPreSaleWeeklyMemberNoWeekly = 12411
+ //NoPreSaleWeeklyMemberOrNotAddLookup 当前登录用户不是售前市场部成员,或未添加观察者
+ NoPreSaleWeeklyMemberOrNotAddLookup = 12412
+ //VerifyProjectCodeFailProjectCodeFindPjNoExists 项目编号验证失败,请检查填写的项目编号是否正确
+ VerifyProjectCodeFailProjectCodeFindPjNoExists = 12413
+ //PreSaleWeeklyThirdTypeNoMoreOne 总经办交办未立项项目,未立项项目产品线内部协同,未立项项目产品线外部协同 这三种类型的项目在同一张excel里同一种无编号类型只能存在一个
+ PreSaleWeeklyThirdTypeNoMoreOne = 12414
+ //
+ // TaskIdNotFound = 12407
+
+ //project 项目模块相关错误在下面列出,以13000开始
+
+ //plan 计划模块相关错误在下面列出,以14000开始
+
+ //PlanAccessForbidden 没有操作权限
+ PlanAccessForbidden = 14000
+ //PlanModifyCalculateData 修改计算结果。某些数据是计算出来的,不能直接修改。比如计划日期可能是根据子计划的日期计算出来的,这种情况下是不能修改计划日期的,只能修改子计划日期
+ PlanModifyCalculateData = 14001
+ //PlanEndTooEarly 计划结束时间在开始时间之前
+ PlanEndTooEarly = 14002
+ //PlanIndexTooSmall 计划排序错误:已至最前
+ PlanIndexTooSmall = 14003
+ //PlanIndexTooBig 计划排序错误:已至最后
+ PlanIndexTooBig = 14004
+
+ //calendar 日历模块相关错误在下面列出,以15000开始
+ TemplateIdNotNull = 15001 // 模板ID不能为空
+ DateTypeErr = 15002 // 日期格式错误
+ TemplateIdTypeErr = 15003 // 模板ID格式错误
+ ProjectIdTypeErr = 15004 // 项目ID格式错误
+ EndDateErr = 15005 // 开始日期大于结束日期
+ TemplateNotExist = 15006 // 日历模板不存在
+ TemplateNameNotNull = 15007 // 模板名称不能为空
+ TemplateNameExist = 15008 // 模板名称已经存在
+ YearTypeErr = 15009 // 年份格式不正确
+ TemplateProjectIdNotNull = 15011 // 项目ID不能为空
+ TemplateDateNotNull = 15012 // 日期不能为空
+ TemplateStatusNotNull = 15013 // 模板状态不能为空
+
+ // 流程相关错误码
+ FlowNameNotNull = 16001 //流程名称不能为空
+ FlowTypeNotNull = 16002 // 流程类型不能为空
+ CreatorIdNotNull = 16003 // 流程创建者ID不能为空
+ FlowIdNotNull = 16004 // 流程ID不能为空
+ FlowStatusNotNull = 16005 // 流程状态不能为空
+ FlowRoleNotNull = 16006 // 流程角色ID不能为空
+
+ // 周报相关错误码 ==> 17开头
+ WkInfoLack = 17001 //无相关数据
+ WkNoThatWKR = 17002 //周报不存在
+ WkRefuseEdit = 17003 //该周报已提交,不可编辑
+ WkProgressError = 17004 //进度错误
+ WkProjectLack = 17008 //该任务不存在
+ WkProjectIdsErr = 17009 //获取项目id列表失败
+ WkHasNoSubmit = 17010 //有未提交的其他周报
+ WKDataError = 17999 //数据错误
+
+ // 字典相关错误
+ DictTypeErr = 18001 // 字典类型错误
+ DictCommonErr = 18002 // 系统错误
+ DictParamErr = 18003 //参数错误
+ DictIdErr = 18004 //参数错误
+
+ // 文档模板、权限,文件库相关错误码
+ DocFileFormatError = 19000 // 文件格式错误
+ DocFileNameFormatError = 19001 // 文件名格式错误
+ DocDirIdNotExist = 19002 // 文档目录不存在
+ DocFileIdNotExist = 19003 // 文档不存在
+ DocProjTempFileNotExist = 19004 // 项目模板文件不存在
+ DocNoDeleteAccessOrExpire = 19005 // 没有文档删除权限或已失效
+ DocNoDirOfCreatProject = 19006 // 没有立项目录请创建
+ DocRepeatDirName = 19007 // 该目录已存在
+ DocNoFileInfo = 19008 // 文件信息已不存在
+ DocConvertPDFError = 19009 // 文件转换成PDF失败,请检查文件重新上传
+ DocFileNoPreviewOrExpire = 19010 // 文件没有预览权限或者权限过期
+ DocNOAccessDownload = 19011 // 没有权限下载
+
+ // 资源统计相关错误码
+ StatisticsParamsError = 191000 // 参数有误
+ StatisticsNoOrgFound = 191001 // 未找到组织相关信息
+ StatisticsOrgNotExist = 191002 // 所选组织不存在
+ StatisticsAlreadyExist = 191003 // 所选人员已存在
+
+ // SeaweedFS相关错误码
+ SeaweedGetFidError = 192000 // 获取fid失败
+
+ // excel导出相关错误码
+ ProjectNotExist = 20000 // 项目不存在
+ ProjedrPlanNotExist = 20001 // 计划不存在
+ PreSaleNoRowData = 20002 //售前项目信息没有查询到相关数据
+ NoProjectData = 20003 //无项目数据
+ ExcelArchiveFail = 20004 //excel文件压缩失败
+ ProjectPlanExcelFileNotExist = 20005 //项目计划文件不存在
+
+ // 客户相关错误码
+ ClienteleNameNotNull = 21000 //客户名称不能为空
+ ClienteleProvinceIdNotNull = 21001 //客户所在省市id不能为空
+ ClienteleNatureIdNotNull = 21002 //客户性质id不能为空
+ ClienteleAddressNotNull = 21003 //客户地址不能为空
+ ClienteleContactsNotNull = 22004 //供应商联系人不能为空
+ ClientelePhoneIdNotNull = 22005 //供应商联系人电话不能为空
+ ClienteleIdNotNull = 21006 //客户id不能为空
+ ClienteleContactsIdNotNull = 21007 //客户联系人id不能为空
+ ClienteleNoPermission = 21008 //没有权限
+
+ // 供应商相关错误码
+ SupplierNameNotNull = 22000 //供应商名称不能为空
+ SupplierProvinceIdNotNull = 22001 //所在省市id不能为空
+ SupplierContactsNotNull = 22002 //供应商联系人不能为空
+ SupplierPhoneIdNotNull = 22003 //供应商联系人电话不能为空
+ SupplierIdNotNull = 22004 //供应商id不能为空
+ SupplierProjectNotFind = 22005 //没有查询到项目
+ SupplierProjectIdNotNull = 22006 //供应商参与项目id不能为空
+ SupplierQualificationIdNotNull = 22007 //供应商资质id不能为空
+
+ // 售前人员相关错误码
+ PreSalePersonnelIdNotNull = 23000 //售前人员id不能为空
+
+ // 基于菜单权限的接口权限检查
+ NotModuleReadMenu = 30000 //当前用户无菜单访问权限
+
+ //项目沟通
+ ProjectRecordDataError = 24000 //数据错误
+ ProjectRecordPramaError = 24001 //参数错误
+ ProjectRecordFileError = 24002 //文件错误
+
+ //项目提醒
+ NoticeConfigOpenError = 30000 // 配置已打开
+ NoticeConfigCloseError = 30001 // 配置已关闭
+ NoticeConfigIdError = 30002 // id错误
+ NoticeProjectInited = 30003 // 项目通知配置已经初始化过了
+ NoticeProjectConfigNotAble = 30004 // 此条提醒开关目前不能在项目中进行配置
+ NoticeSendFailed = 30005 // 提醒发送失败
+ NoticeRightawayNotAvailable = 30006 // 该通知不能立即提醒
+
+ //意见反馈
+ FeedBackReplyNoPermission = 25000 // 没有回复意见权限
+ FeedBackSuggestTitleNotNull = 25001 // 意见标题不能为空
+ FeedBackSuggestContentNotNull = 25002 // 意见内容不能为空
+ FeedBackReplyContentNotNull = 25002 // 回复内容不能为空
+
+ //售前周报
+ PreSaleWeekReportNOPminfo = 26000 // 没有项目信息
+ PreSaleWeekReportWkIDErr = 26001 // 请检查售前周报Id
+ PreSaleWeekReportWkPidEr = 26002 // 请检查售前周报项目wkPid
+ PreSaleWeekReportWkRIdEr = 26003 // 请检查售前周报项目风险id
+ PreSaleWeekReportParamEr = 26004 // 请检查传入参数
+)
+
+//Response 处理返回结果
+type Response struct {
+ Code int `json:"code"`
+ Message string `json:"message"`
+ Data interface{} `json:"data,omitempty"`
+}
+
+//Make 返回 Response 结构体
+func Make(code int, err error, data interface{}) *Response {
+ return &Response{code, err.Error(), data}
+}
+
+//MakeSuccess 返回成功时的 Response 结构体
+func MakeSuccess(data interface{}) *Response {
+ return &Response{Success, "success", data}
+}
diff --git a/weather/routers/router.go b/weather/routers/router.go
new file mode 100755
index 0000000..48e5500
--- /dev/null
+++ b/weather/routers/router.go
@@ -0,0 +1,38 @@
+package routers
+
+import (
+ "weather/controllers"
+
+ "github.com/astaxie/beego"
+ "github.com/astaxie/beego/plugins/cors"
+)
+
+func init() {
+ beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
+ AllowOrigins: []string{"http://*", "https://*"},
+ AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
+ AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "X-Requested-With", "Access-Control-Allow-Headers", "Content-Type"},
+ ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
+ AllowCredentials: true,
+ }))
+ beego.Router("/", &controllers.LoginController{})
+ beego.Router("/login", &controllers.LoginController{}, "post:Post")
+ beego.Router("/regist", &controllers.LoginController{}, "get:Regist")
+ beego.Router("/regist/submit", &controllers.LoginController{}, "post:RegistSubmit")
+ ns :=
+ beego.NewNamespace("/v1",
+ beego.NSRouter("/main", &controllers.MainController{}),
+ beego.NSRouter("/version", &controllers.AdminController{}, "get:ShowAPIVersion"),
+ beego.NSNamespace("/cms",
+ beego.NSRouter("/node", &controllers.MainController{}),
+ beego.NSRouter("/form", &controllers.CMSController{}),
+ beego.NSRouter("/formpost", &controllers.CMSController{}, "post:Post"),
+ beego.NSInclude(
+ &controllers.CMSController{},
+ ),
+ ),
+ )
+ //注册 namespace
+ beego.AddNamespace(ns)
+ beego.InsertFilter("/v1/*", beego.BeforeRouter, controllers.FilterUser)
+}
diff --git a/weather/service/AccountService.go b/weather/service/AccountService.go
new file mode 100755
index 0000000..c49053d
--- /dev/null
+++ b/weather/service/AccountService.go
@@ -0,0 +1,38 @@
+package service
+
+import (
+ "fmt"
+ "weather/models"
+
+ "github.com/astaxie/beego/orm"
+ _ "github.com/astaxie/beego/session/mysql"
+)
+
+type AccountService struct {
+}
+
+func (s *AccountService) LoginAccount(account models.Account) *models.Account {
+ o := orm.NewOrm()
+ var accountTemp models.Account
+ err := o.QueryTable(new(models.Account)).Filter("username", account.Username).Filter("password", account.Password).One(&accountTemp)
+
+ if err == orm.ErrNoRows {
+ // 没有找到记录
+ fmt.Println("查询不到")
+ }
+ if err == nil {
+ fmt.Println("登录成功")
+ return &accountTemp
+ }
+ return nil
+}
+
+func (s *AccountService) RegistAccount(account models.Account) bool {
+
+ o := orm.NewOrm()
+ accountTemp := new(models.Account)
+ accountTemp.Username = account.Username
+ accountTemp.Password = account.Password
+ fmt.Println(o.Insert(accountTemp))
+ return true
+}
diff --git a/weather/service/HttpService.go b/weather/service/HttpService.go
new file mode 100755
index 0000000..85fefa2
--- /dev/null
+++ b/weather/service/HttpService.go
@@ -0,0 +1,174 @@
+package service
+
+import (
+ "crypto/tls"
+ "encoding/json"
+ "fmt"
+ "strings"
+ "time"
+ "weather/models"
+
+ "github.com/astaxie/beego/httplib"
+)
+
+type HttpService struct {
+}
+
+func (s *HttpService) GetActivityTyhoon() {
+ now := time.Now() //获取当前时间
+ timestamp1 := now.Unix() * 1000 //时间戳
+ fmt.Println("current timestamp1:%l", timestamp1)
+ //time.Sleep(10) //等待1秒
+ now1 := time.Now() //获取当前时间
+ timestamp2 := now1.Unix() * 1000 //时间戳
+ now3 := time.Now() //获取当前时间
+ timestamp3 := now3.Unix() //时间戳
+ fmt.Println("current timestamp2:%l", timestamp3)
+ // 两参数格式化
+ url := fmt.Sprintf("https://typhoon.slt.zj.gov.cn/Api/TyhoonActivity?callback=jQuery1830914871%v_%v_=%v", timestamp3, timestamp1, timestamp2)
+ fmt.Println(url)
+ req := httplib.Get(url)
+ req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
+
+ str, err := req.String()
+ if err != nil {
+ fmt.Println(err)
+ }
+ //fmt.Println(str)
+ comLeft := strings.Index(str, "[")
+ pos := str[comLeft:]
+ posLeft := strings.Index(pos, "]")
+ jsonTyhoonActivity := pos[0 : posLeft+1]
+ fmt.Println(jsonTyhoonActivity)
+
+ var activitys []models.TyhoonActivity
+ json.Unmarshal([]byte(jsonTyhoonActivity), &activitys)
+ fmt.Println(activitys)
+ fmt.Println(len(activitys))
+ for _, item := range activitys {
+ if models.GetTyhoonActivity(&item) {
+ //存在
+ fmt.Println("存在")
+ } else {
+ //不存在
+ models.TyhoonActivityAdd(&item)
+ fmt.Println("不存在,插入数据库")
+ }
+ }
+ activitys = make([]models.TyhoonActivity, 0)
+ //不存在活跃的台风
+ if len(activitys) == 0 {
+ items := models.GetTyhoonActivityList()
+ if items != nil && len(items) > 0 {
+ for _, item := range items {
+ models.TyhoonActivityDel(item)
+ }
+ }
+ }
+
+ s.GetTyhoonList(now.Year())
+
+ //data, err := json.Marshal(activitys)
+ //if err == nil {
+ // fmt.Println(string(data))
+ //}
+}
+
+func (s *HttpService) GetTyhoonList(year int) {
+ now := time.Now() //获取当前时间
+ timestamp1 := now.Unix() * 1000 //时间戳
+ fmt.Println("current timestamp1:%l", timestamp1)
+ //time.Sleep(10) //等待1秒
+ now1 := time.Now() //获取当前时间
+ timestamp2 := now1.Unix() * 1000 //时间戳
+ now3 := time.Now() //获取当前时间
+ timestamp3 := now3.Unix() //时间戳
+ fmt.Println("current timestamp2:%l", timestamp3)
+ // 两参数格式化
+ url := fmt.Sprintf("https://typhoon.slt.zj.gov.cn/Api/TyphoonList/%v?callback=jQuery18303639632%v_%v_=%v", year, timestamp3, timestamp1, timestamp2)
+ fmt.Println(url)
+ req := httplib.Get(url)
+ req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
+
+ str, err := req.String()
+ if err != nil {
+ fmt.Println(err)
+ }
+ //fmt.Println(str)
+ comLeft := strings.Index(str, "[")
+ pos := str[comLeft:]
+ posLeft := strings.Index(pos, "]")
+ jsonTyhoonListItem := pos[0 : posLeft+1]
+ fmt.Println(jsonTyhoonListItem)
+ var tyhoonListItem []models.TyhoonListItem
+ json.Unmarshal([]byte(jsonTyhoonListItem), &tyhoonListItem)
+ fmt.Println(tyhoonListItem)
+ fmt.Println(len(tyhoonListItem))
+
+ for _, item := range tyhoonListItem {
+ itemDB := models.GetTyhoonListItem(&item)
+ if itemDB != nil {
+ //存在
+ fmt.Println("存在")
+ if itemDB.Isactive == "1" && item.Isactive == "0" {
+ //需要更新
+ itemDB.Isactive = "0"
+ if models.TyhoonListItemUpdate(itemDB) {
+ fmt.Println("update 成功")
+ s.GetTyphoonInfo(item.Tfid)
+ }
+ }
+ if item.Isactive == "1" {
+ //需要更新
+ s.GetTyphoonInfo(item.Tfid)
+ }
+ } else {
+ //不存在
+ models.TyhoonListItemAdd(&item)
+ fmt.Println("不存在,插入数据库")
+ s.GetTyphoonInfo(item.Tfid)
+ }
+ }
+}
+
+func (s *HttpService) GetTyphoonInfo(tfid string) {
+ now := time.Now() //获取当前时间
+ timestamp1 := now.Unix() * 1000 //时间戳
+ fmt.Println("current timestamp1:%l", timestamp1)
+ //time.Sleep(10) //等待1秒
+ now1 := time.Now() //获取当前时间
+ timestamp2 := now1.Unix() * 1000 //时间戳
+ now3 := time.Now() //获取当前时间
+ timestamp3 := now3.Unix() //时间戳
+ fmt.Println("current timestamp2:%l", timestamp3)
+ // 两参数格式化
+ url := fmt.Sprintf("https://typhoon.slt.zj.gov.cn/Api/TyphoonInfo/%v?callback=jQuery18300926577%v_%v_=%v", tfid, timestamp3, timestamp1, timestamp2)
+ fmt.Println(url)
+ req := httplib.Get(url)
+ req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
+
+ str, err := req.String()
+ if err != nil {
+ fmt.Println(err)
+ }
+ //fmt.Println(str)
+
+ comLeft := strings.Index(str, "[")
+ pos := str[comLeft:]
+ posLeft := strings.LastIndex(pos, "]")
+ jsonTyhoonListItem := pos[0 : posLeft+1]
+ fmt.Println(jsonTyhoonListItem)
+ fmt.Println(posLeft)
+ typhoonInfo := new(models.TyphoonInfo)
+ typhoonInfo.Tfid = tfid
+ typhoonInfoDB := models.GetTyphoonInfo(typhoonInfo)
+ if typhoonInfoDB == nil {
+ typhoonInfo.Typhoon = jsonTyhoonListItem
+ models.TyphoonInfoAdd(typhoonInfo)
+ fmt.Println("不存在,插入数据库")
+ } else {
+ typhoonInfoDB.Typhoon = jsonTyhoonListItem
+ models.TyphoonInfoUpdate(typhoonInfo)
+ fmt.Println("已存在,更新数据库")
+ }
+}
diff --git a/weather/service/HttpWeatherService.go b/weather/service/HttpWeatherService.go
new file mode 100755
index 0000000..b9d6cf7
--- /dev/null
+++ b/weather/service/HttpWeatherService.go
@@ -0,0 +1,50 @@
+package service
+
+import (
+ "fmt"
+ "github.com/astaxie/beego/httplib"
+ "strconv"
+ "sync"
+ "time"
+ "weather/models"
+)
+
+type HttpWeatherService struct {
+}
+
+func (s *HttpWeatherService) GetNmcNowWeather() {
+ citys := models.GetNmcCityList()
+ fmt.Println(citys)
+ fmt.Println(len(citys))
+ var wg sync.WaitGroup
+ for _, item := range citys {
+ time.Sleep(time.Millisecond * 300)
+ wg.Add(1) // 启动一个goroutine就登记+1
+ go func(city *models.NmcCity) {
+ defer wg.Done() // goroutine结束就登记-1
+ fmt.Println(*city)
+ timeUnix := time.Now().Unix()
+ s := strconv.FormatInt(timeUnix, 10)
+ url := "http://www.nmc.cn/rest/weather?stationid=" + item.Code + "&_=" + s + "000"
+ fmt.Println(url)
+ req := httplib.Get(url)
+ //req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
+ str, err := req.String()
+ if err != nil {
+ fmt.Println(err)
+ }
+ var nmcNowWeather = new(models.NmcNowWeather)
+ now := time.Now() //获取当前时间
+ nmcNowWeather.Weather = str
+ nmcNowWeather.Code = item.Code
+ nmcNowWeather.WeatherDate = now.Format("2006-01-02")
+ id,errInsert := models.AddNmcNowWeather(nmcNowWeather)
+ if errInsert!=nil {
+ println(errInsert.Error())
+ }
+ fmt.Println(id)
+ fmt.Println(str)
+ }(item)
+ }
+ wg.Wait() // 等待所有登记的goroutine都结束
+}
diff --git a/weather/static/js/reload.min.js b/weather/static/js/reload.min.js
new file mode 100755
index 0000000..e780033
--- /dev/null
+++ b/weather/static/js/reload.min.js
@@ -0,0 +1 @@
+function b(a){var c=new WebSocket(a);c.onclose=function(){setTimeout(function(){b(a)},2E3)};c.onmessage=function(){location.reload()}}try{if(window.WebSocket)try{b("ws://localhost:12450/reload")}catch(a){console.error(a)}else console.log("Your browser does not support WebSockets.")}catch(a){console.error("Exception during connecting to Reload:",a)};
diff --git a/weather/static/mt.txt b/weather/static/mt.txt
new file mode 100755
index 0000000..95d09f2
--- /dev/null
+++ b/weather/static/mt.txt
@@ -0,0 +1 @@
+hello world
\ No newline at end of file
diff --git a/weather/tests/default_test.go b/weather/tests/default_test.go
new file mode 100755
index 0000000..28b994a
--- /dev/null
+++ b/weather/tests/default_test.go
@@ -0,0 +1,37 @@
+package test
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "path/filepath"
+ "runtime"
+ "testing"
+ _ "weather/routers"
+
+ "github.com/astaxie/beego"
+ . "github.com/smartystreets/goconvey/convey"
+)
+
+func init() {
+ _, file, _, _ := runtime.Caller(0)
+ apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator))))
+ beego.TestBeegoInit(apppath)
+}
+
+// TestBeego is a sample to run an endpoint test
+func TestBeego(t *testing.T) {
+ r, _ := http.NewRequest("GET", "/", nil)
+ w := httptest.NewRecorder()
+ beego.BeeApp.Handlers.ServeHTTP(w, r)
+
+ beego.Trace("testing", "TestBeego", "Code[%d]\n%s", w.Code, w.Body.String())
+
+ Convey("Subject: Test Station Endpoint\n", t, func() {
+ Convey("Status Code Should Be 200", func() {
+ So(w.Code, ShouldEqual, 200)
+ })
+ Convey("The Result Should Not Be Empty", func() {
+ So(w.Body.Len(), ShouldBeGreaterThan, 0)
+ })
+ })
+}
diff --git a/weather/utils/SessionUtils.go b/weather/utils/SessionUtils.go
new file mode 100755
index 0000000..7531552
--- /dev/null
+++ b/weather/utils/SessionUtils.go
@@ -0,0 +1,10 @@
+package utils
+
+import (
+ "github.com/astaxie/beego"
+)
+
+// GetSessName 获取配置文件中sessionName
+func GetSessName() string {
+ return beego.AppConfig.String("SessionName")
+}
diff --git a/weather/utils/error.go b/weather/utils/error.go
new file mode 100755
index 0000000..4f998e6
--- /dev/null
+++ b/weather/utils/error.go
@@ -0,0 +1,14 @@
+package utils
+
+type Error struct {
+ Code int `json:"code"`
+ Message string `json:"message"`
+}
+
+func NewError(code int, msg string) error {
+ return Error{code, msg}
+}
+
+func (this Error) Error() string {
+ return this.Message
+}
diff --git a/weather/views/form.tpl b/weather/views/form.tpl
new file mode 100755
index 0000000..a19d63e
--- /dev/null
+++ b/weather/views/form.tpl
@@ -0,0 +1,17 @@
+
+
+
+
+ Beego
+
+
+
+
+
+
+
diff --git a/weather/views/index.tpl b/weather/views/index.tpl
new file mode 100755
index 0000000..8d6fbec
--- /dev/null
+++ b/weather/views/index.tpl
@@ -0,0 +1,95 @@
+
+
+
+
+ Beego
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/weather/views/login.tpl b/weather/views/login.tpl
new file mode 100755
index 0000000..e8c2ddc
--- /dev/null
+++ b/weather/views/login.tpl
@@ -0,0 +1,23 @@
+
+
+
+
+ 登录
+
+
+
+
+
+
+ 注册
+
+
+
diff --git a/weather/views/regist.tpl b/weather/views/regist.tpl
new file mode 100755
index 0000000..a79e23e
--- /dev/null
+++ b/weather/views/regist.tpl
@@ -0,0 +1,16 @@
+
+
+
+
+ 登录
+
+
+
+
+
+
+
diff --git a/weather/views/success.tpl b/weather/views/success.tpl
new file mode 100755
index 0000000..e91b6be
--- /dev/null
+++ b/weather/views/success.tpl
@@ -0,0 +1,11 @@
+
+
+
+
+ 登录成功
+
+
+
+
+
+
diff --git a/weather/weather.tar.gz b/weather/weather.tar.gz
new file mode 100644
index 0000000..1608839
Binary files /dev/null and b/weather/weather.tar.gz differ