219 lines
5.8 KiB
Go
219 lines
5.8 KiB
Go
|
package api
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"fmt"
|
|||
|
"github.com/jasonlvhit/gocron"
|
|||
|
"go-admin/app/admin/models"
|
|||
|
"go-admin/app/admin/router"
|
|||
|
"io/ioutil"
|
|||
|
"net/http"
|
|||
|
"os"
|
|||
|
"os/signal"
|
|||
|
"time"
|
|||
|
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
"github.com/spf13/cobra"
|
|||
|
"github.com/spf13/viper"
|
|||
|
|
|||
|
"go-admin/app/jobs"
|
|||
|
"go-admin/common/database"
|
|||
|
"go-admin/common/global"
|
|||
|
mycasbin "go-admin/pkg/casbin"
|
|||
|
"go-admin/pkg/logger"
|
|||
|
"go-admin/tools"
|
|||
|
"go-admin/tools/config"
|
|||
|
)
|
|||
|
|
|||
|
var (
|
|||
|
configYml string
|
|||
|
port string
|
|||
|
mode string
|
|||
|
StartCmd = &cobra.Command{
|
|||
|
Use: "server",
|
|||
|
Short: "Start API server",
|
|||
|
Example: "go-admin server -c config/settings.yml",
|
|||
|
SilenceUsage: true,
|
|||
|
PreRun: func(cmd *cobra.Command, args []string) {
|
|||
|
setup()
|
|||
|
},
|
|||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|||
|
return run()
|
|||
|
},
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
var AppRouters = make([]func(), 0)
|
|||
|
|
|||
|
func init() {
|
|||
|
StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file")
|
|||
|
StartCmd.PersistentFlags().StringVarP(&port, "port", "p", "8000", "Tcp port server listening on")
|
|||
|
StartCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "dev", "server mode ; eg:dev,test,prod")
|
|||
|
|
|||
|
//注册路由 fixme 其他应用的路由,在本目录新建文件放在init方法
|
|||
|
AppRouters = append(AppRouters, router.InitRouter)
|
|||
|
}
|
|||
|
|
|||
|
func setup() {
|
|||
|
|
|||
|
//1. 读取配置
|
|||
|
config.Setup(configYml)
|
|||
|
//2. 设置日志
|
|||
|
logger.Setup()
|
|||
|
//3. 初始化数据库链接
|
|||
|
database.Setup(config.DatabaseConfig.Driver)
|
|||
|
//4. 接口访问控制加载
|
|||
|
mycasbin.Setup()
|
|||
|
|
|||
|
usageStr := `starting api server`
|
|||
|
global.Logger.Info(usageStr)
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
func run() error {
|
|||
|
if viper.GetString("settings.application.mode") == string(tools.ModeProd) {
|
|||
|
gin.SetMode(gin.ReleaseMode)
|
|||
|
}
|
|||
|
engine := global.Cfg.GetEngine()
|
|||
|
if engine == nil {
|
|||
|
engine = gin.New()
|
|||
|
}
|
|||
|
|
|||
|
go func() {
|
|||
|
defer func() {
|
|||
|
if err := recover(); err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
}()
|
|||
|
// TODO
|
|||
|
s := gocron.NewScheduler()
|
|||
|
|
|||
|
//err := s.Every(2).Minutes().Do(models.GoodsPutDownAway)
|
|||
|
//if err != nil {
|
|||
|
// fmt.Println("err:", err)
|
|||
|
//}
|
|||
|
|
|||
|
// 待支付关
|
|||
|
//err = s.Every(1).Minutes().Do(models.UnPayOrderStatusUpdate)
|
|||
|
//if err != nil {
|
|||
|
// fmt.Println("err:", err)
|
|||
|
//}
|
|||
|
|
|||
|
err := s.Every(1).Minute().Do(models.DeliveryStorePickStatusUpdate)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
|
|||
|
err = s.Every(1).Day().At("10:30").Do(models.MemberExpirationReminder)
|
|||
|
//err = s.Every(1).Minute().Do(models.MemberExpirationReminder)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
|
|||
|
err = s.Every(1).Day().At("12:01").Do(models.ExpireMemberSMSSend)
|
|||
|
//err = s.Every(1).Minute().Do(models.MemberExpirationReminder)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
|
|||
|
// 生效共享卡
|
|||
|
err = s.Every(1).Day().At("05:00").Do(models.ShareCardProfitEffectCard)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
// 发放积分
|
|||
|
err = s.Every(1).Day().At("02:00").Do(models.ShareCardProvideVm)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
// 用户积分记录
|
|||
|
err = s.Every(1).Day().At("03:00").Do(models.ShareCardUserVmRecord)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
// 用户收回卡绑定卡
|
|||
|
err = s.Every(1).Day().At("00:00").Do(models.ShareCardRetrieveCardSetStockCardCron)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
// 用户邀请用户报表
|
|||
|
//err = s.Every(1).Day().At("00:00").Do(models.CreateInviteMemberReport)
|
|||
|
err = s.Every(1).Day().At("00:10").Do(models.CreateInviteMemberReport)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
// 用户续费
|
|||
|
err = s.Every(1).Day().At("19:00").Do(models.SendMessageMemberRenewal)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
// 管理端首页
|
|||
|
err = s.Every(1).Day().At("1:00").Do(models.IndexMemberStatistic)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
// 卡带回收自动取消
|
|||
|
err = s.Every(10).Minutes().Do(models.RecycleCardOrderStateUpdate)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("err:", err)
|
|||
|
}
|
|||
|
<-s.Start()
|
|||
|
}()
|
|||
|
|
|||
|
for _, f := range AppRouters {
|
|||
|
f()
|
|||
|
}
|
|||
|
|
|||
|
srv := &http.Server{
|
|||
|
Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port,
|
|||
|
Handler: global.Cfg.GetEngine(),
|
|||
|
}
|
|||
|
go func() {
|
|||
|
jobs.InitJob()
|
|||
|
jobs.Setup()
|
|||
|
|
|||
|
}()
|
|||
|
|
|||
|
go func() {
|
|||
|
// 服务连接
|
|||
|
if config.SslConfig.Enable {
|
|||
|
if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed {
|
|||
|
global.Logger.Fatal("listen: ", err)
|
|||
|
}
|
|||
|
} else {
|
|||
|
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|||
|
global.Logger.Fatal("listen: ", err)
|
|||
|
}
|
|||
|
}
|
|||
|
}()
|
|||
|
content, _ := ioutil.ReadFile("./static/go-admin.txt")
|
|||
|
fmt.Println(tools.Red(string(content)))
|
|||
|
tip()
|
|||
|
fmt.Println(tools.Green("Server run at:"))
|
|||
|
fmt.Printf("- Local: http://localhost:%s/ \r\n", config.ApplicationConfig.Port)
|
|||
|
fmt.Printf("- Network: http://%s:%s/ \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port)
|
|||
|
fmt.Println(tools.Green("Swagger run at:"))
|
|||
|
fmt.Printf("- Local: http://localhost:%s/swagger/index.html \r\n", config.ApplicationConfig.Port)
|
|||
|
fmt.Printf("- Network: http://%s:%s/swagger/index.html \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port)
|
|||
|
fmt.Printf("%s Enter Control + C Shutdown Server \r\n", tools.GetCurrentTimeStr())
|
|||
|
// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
|
|||
|
quit := make(chan os.Signal)
|
|||
|
signal.Notify(quit, os.Interrupt)
|
|||
|
<-quit
|
|||
|
fmt.Printf("%s Shutdown Server ... \r\n", tools.GetCurrentTimeStr())
|
|||
|
|
|||
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|||
|
defer cancel()
|
|||
|
if err := srv.Shutdown(ctx); err != nil {
|
|||
|
global.Logger.Fatal("Server Shutdown:", err)
|
|||
|
}
|
|||
|
global.Logger.Println("Server exiting")
|
|||
|
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
func tip() {
|
|||
|
usageStr := `欢迎使用 ` + tools.Green(`go-admin `+global.Version) + ` 可以使用 ` + tools.Red(`-h`) + ` 查看命令`
|
|||
|
fmt.Printf("%s \n\n", usageStr)
|
|||
|
}
|