目录

一、项目结构

二、服务器配置

1、Redis在配置文件中的配置情况如下:config.json

2、读取配置文件初始化服务器配置:config.go

3、Redis连接对象实例化:redis.go

4、将Session存储方式设置为Redis:main.go

5、在Controller家口中使用redis:statis_controller.go

6、在main入口中注册:main.go

三、浏览器请求测试

四、过程踩坑

1、parse时间转换

2、iris版本

五、完整代码

1、config.json

2、config.go

3、engin.go

4、redis.go

5、statis_controller.go

6、statis_service.go

7、main.go


项目搭建过程参考:

  • Iris搭建一个完整的go web项目过程——管理员登录功能开发:https://blog.csdn.net/qq_38151401/article/details/105907576

一、项目结构

二、服务器配置

在实战项目中使用Redis功能,首先需要进行Redis配置。本实战项目中,关与Redis的配置项包含:连接类型地址端口公共前缀。以上配置项被定义包含在Iris框架的redis包中的Config结构体中,主要包含如下内容:

  • Network: 连接类型。TCP
  • Addr: 即将连接的Redis服务主机IP。本实战项目的Redis服务部署在本机,因此主机ip为127.0.0.1。Redis服务默认端口为6379。因此,Addr在本实例项目中的配置值为127.0.0.1:6379。
  • Password: 登陆Redis的密码。默认配置为空。
  • Prefix:为要保存的所有的内容设置公共的前缀。默认设置为空。
  • IdleTimeout:设置Redis中的生效时长。这里我们设置time.Duration(24) * time.Hour。在实际的开发过程中,开发者可以根据自己的需求设定Redis的生效时长。

此处仅展示redis的配置

1、Redis在配置文件中的配置情况如下:config.json

2、读取配置文件初始化服务器配置:config.go

3、Redis连接对象实例化:redis.go

我们通过读取配置文件完成配置内容的读取,利用Redis配置信息实例化Redis对象,Redis实例化如下:

4、将Session存储方式设置为Redis:main.go

5、在Controller家口中使用redis:statis_controller.go

6、在main入口中注册:main.go

三、浏览器请求测试

命令行查看:

redis desktop manager查看:

四、过程踩坑

这个过程才了两个坑:

1、parse时间转换

在用Go语言对时间字符串进行parse的时候踩坑Golang time error: month out of range

经过试验,“2016-12-25 00:00:00”这种格式是可以的,“2016-12-25“这种格式在试验的时候可以,然而在某些情况却会报错,比如说当parse”2018-01-28”的时候,就会报 “month out of range”.原因不清楚,需要继续看源码研究,所以以后parse的时候,使用time模块自带的那几种格式,和“2016-12-25 00:00:00”这种格式都是ok的, 如下。

  • date, err := time.Parse("2006-01-02 15:04:05", "2020-05-03 19:32:15")

而这样写:d, err := time.Parse("2006-01-02", "2020-05-03")有时候正确,有时候错误,很迷啊【month out of range】

2、iris版本

Iris+redis之版本踩坑,之前看的教程,引入redis的方法是:"github.com/kataras/iris/sessions/sessiondb/redis/service"

但是我试了的是V11和V12版本的iris,都不存在这个包!!!!坑人的地方在于,教程是2019件8月份之前的,可能使用的iris版本是V10之前的,之后已经没有service这个包了

可以看到v10的iris还是有这个包的,并且Config就定义config.go中;

而之后版本已经不存在service包了,Config直接定义在database.go中,并且具体的定义也有改动~~~

五、完整代码

1、config.json

{"app_name": "CmsProject","port": "9000","static_path": "/manage/static","redis": {"network": "tcp","addr": "106.15.202.182","port": "6379","prefix": ""},"mode": "dev"
}

2、config.go

/**
服务端配置*/
type AppConfig struct {AppName    string `json:"app_name"`Port       string `json:"port"`StaticPath string `json:"static_path"`Mode       string `json:"mode"`Redis      Redis    `json:"redis"`
}/*** Redis 配置*/
type Redis struct {NetWork  string `json:"net_work"`Addr     string `json:"addr"`Port     string `json:"port"`Password string `json:"password"`Prefix   string `json:"prefix"`
}var ServConfig AppConfig
//初始化服务器配置
func InitConfig()*AppConfig  {file,err := os.Open("config.json")if err != nil {panic(err.Error())}decoder := json.NewDecoder(file)conf := AppConfig{}err = decoder.Decode(&conf)if err != nil {panic(err.Error())}return &conf
}

3、engin.go

import ("QianfengCmsProject/models"_ "github.com/go-sql-driver/mysql" //不能忘记导入"github.com/go-xorm/xorm"
)func NewMysqlEngine() *xorm.Engine {engine, err := xorm.NewEngine("mysql", "root:123456@/iris?charset=utf8")err = engine.Sync2(/*new(models.Permission),*//*new(models.City),*/new(models.Admin),/*new(models.AdminPermission),new(models.User),new(models.UserOrder),*/)if err != nil {panic(err.Error())}//设置显示sql语句engine.ShowSQL(true)engine.SetMaxOpenConns(10)return engine
}

4、redis.go

import ("QianfengCmsProject/config"iris "github.com/kataras/iris/v12""github.com/kataras/iris/v12/sessions/sessiondb/redis"
)//返回redis实例
func NewRedis()  *redis.Database{var database *redis.Database//项目配置cmsConfig := config.InitConfig()if cmsConfig !=nil{iris.New().Logger().Info("  hello  ")rd := cmsConfig.Redisiris.New().Logger().Info(rd)database = redis.New(redis.Config{Network:     rd.NetWork,Addr:        rd.Addr + ":" + rd.Port,Password:    rd.Password,Database:    "",MaxActive:   10,Timeout: redis.DefaultRedisTimeout,Prefix:      rd.Prefix,})}else {iris.New().Logger().Info(" hello  error ")}return database
}

5、statis_controller.go

type StatisController struct {//iris框架自动为每个请求都绑定上下文对象:可作为接受参数Ctx iris.Context//admin功能实体:引入Service接口Service service.StatisService//session对象:存储session信息Session *sessions.Session
}var (ADMINMODULE = "ADMIN_"USERMODULE  = "USER_"ORDERMODULE = "ORDER_"
)/* /statis/admin/2019-03-10/count*/
func (sc *StatisController) GetCount() mvc.Result {path := sc.Ctx.Path()var pathSlice []stringif path != "" {pathSlice = strings.Split(path, "/")}//不符合请求格式if len(pathSlice) != 5 {return mvc.Response{Object: map[string]interface{}{"status": utils.RECODE_FAIL,"count":  0,},}}//将最前面的去掉pathSlice = pathSlice[1:]model := pathSlice[1]date := pathSlice[2]var result int64switch model {case "user":fmt.Println("GetCount--->user")case "order":fmt.Println("order--->user")case "admin":adminStatis := sc.Session.Get(ADMINMODULE + date)if adminStatis != nil {adminStatis = adminStatis.(float64)return mvc.Response{Object: map[string]interface{}{"status": utils.RECODE_OK,"count":  adminStatis,},}} else {result = sc.Service.GetAdminDailyCount(date)sc.Session.Set(ADMINMODULE, result)}}return mvc.Response{Object: map[string]interface{}{"status": utils.RECODE_OK,"count":  result,},}
}

6、statis_service.go

//统计功能模块接口标准
type StatisService interface {GetAdminDailyCount(date string) int64
}//统计功能服务实现结构体
type statisService struct {Engin *xorm.Engine
}func NewStatisService(engin *xorm.Engine) StatisService {return &statisService{Engin: engin,}
}func (ss *statisService) GetAdminDailyCount(date string) int64 {if date == "NaN-NaN-NaN" { //当日增长数据请求date = time.Now().Format("2006-01-02")}//查询如期data格式解析startDate, err := time.Parse("2006-01-02 15:04:05", date+" 00:00:00")if err != nil {return 0}endDate := startDate.AddDate(0, 0, 1)result, err := ss.Engin.Where("create_time between ? and ? and status = 0",startDate.Format("2006-01-02 15:04:05"),endDate.Format("2006-01-02 15:04:05")).Count(models.Admin{})if err != nil {return 0}fmt.Println(result)return result
}

7、main.go

func main() {app := newApp()//应用App设置configation(app)//路由设置mvcHandle(app)config := config.InitConfig()addr := "localhost:" + config.Portapp.Run(iris.Addr(addr),                               //在端口8080进行监听iris.WithoutServerError(iris.ErrServerClosed), //无服务错误提示iris.WithOptimizations,                        //对json数据序列化更快的配置)
}//构建App
func newApp() *iris.Application {app := iris.New()//设置日志级别  开发阶段为debugapp.Logger().SetLevel("debug")//注册静态资源app.HandleDir("/static", "./static")app.HandleDir("/manage/static", "./static")app.HandleDir("/img", "./static/img")//注册视图文件app.RegisterView(iris.HTML("./static", ".html"))app.Get("/", func(context context.Context) {context.View("index.html")})return app
}/*** 项目设置*/
func configation(app *iris.Application) {//配置 字符编码app.Configure(iris.WithConfiguration(iris.Configuration{Charset: "UTF-8",}))//错误配置//未发现错误app.OnErrorCode(iris.StatusNotFound, func(context context.Context) {context.JSON(iris.Map{"errmsg": iris.StatusNotFound,"msg":    " not found ","data":   iris.Map{},})})app.OnErrorCode(iris.StatusInternalServerError, func(context context.Context) {context.JSON(iris.Map{"errmsg": iris.StatusInternalServerError,"msg":    " interal error ","data":   iris.Map{},})})
}//MVC 架构模式处理
func mvcHandle(app *iris.Application) {//启用sessionsessManager := sessions.New(sessions.Config{Cookie:  "sessioncookie",Expires: 24 * time.Hour,})//获取redis实例redis := datasource.NewRedis()//设置session的同步位置为redissessManager.UseDatabase(redis)//实例化mysql数据库引擎engine := datasource.NewMysqlEngine()//管理员模块功能adminService := service.NewAdminService(engine)admin := mvc.New(app.Party("/admin")) //设置路由组admin.Register(adminService,sessManager.Start,)//通过mvc的Handle方法进行控制器的指定admin.Handle(new(controller.AdminController))//统计功能模块statisService := service.NewStatisService(engine)statis := mvc.New(app.Party("/statis/{model}/{date}/"))statis.Register(statisService,sessManager.Start,)statis.Handle(new(controller.StatisController))
}

Iris+Redis实战项目应用相关推荐

  1. springboot+redis实战项目——黑马点评

    项目地址 前端地址 后端地址 此项目的几个重点 1.缓存击穿.缓存雪崩.缓存穿透的解决方案 2.全局唯一id实现方案 雪花算法,原理这里就不说了,直接上代码 package com.rd.utils; ...

  2. redis的实战项目01_模拟短信登录业务

    redis的实战项目01_短信登录 一.导入黑马点评项目 1. 数据库: 2. 单体项目介绍: 二.基于session实现登录 1.发送短信验证码 1.理论流程 2.代码操作: 2.短信验证码登录.注 ...

  3. go语言Web开发框架:项目开发介绍及实战项目介绍

    引言 本系列课程我们将学些Golang语言中的Web开发框架Iris的相关知识和用法.通过本系列视频课程,大家能够从零到一经历一个完整项目的开发,并在课程中了解实战项目开发的流程和项目设涉及的各个模块 ...

  4. python爬虫项目-32个Python爬虫实战项目,满足你的项目慌

    原标题:32个Python爬虫实战项目,满足你的项目慌 爬虫项目名称及简介 一些项目名称涉及企业名词,小编用拼写代替 1.[WechatSogou]- weixin公众号爬虫.基于weixin公众号爬 ...

  5. 《Redis实战》一第一部分 入门

    本节书摘来异步社区<Redis实战>一书中的第一部分,作者: [美]Josiah L. Carlson(约西亚 L.卡尔森)译者: 黄健宏 责编: 杨海玲,更多章节内容可以访问云栖社区&q ...

  6. .NET Core实战项目之CMS 第九章 设计篇-白话架构设计

    前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...

  7. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

    写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员的自白 这篇文章会这么火,更没想到的是张善友队长的公众号居然也转载了这篇文章,这就导致两天的时间就有两百多位读者朋友加 ...

  8. springcloud gateway ribbon使用_Github点赞接近 70k 的Spring Cloud学习教程+实战项目推荐!牛批!...

    这篇文章继续来推荐 Spring Cloud 的教程和实战项目了!想必不用不多说,大家都知道 Spring Cloud 的重要程度.几乎稍微有点规模的公司,一般都离不开要和微服务打交道.同时,Spri ...

  9. java实战项目_我靠这份Java知识体系和6个大厂实战项目,拿到阿里年薪50W+offer

    当你选择了Java程序员这个岗位后,到了30岁,都会有一个感受,觉得自己的职业发展受到了限制,升职加薪很难,一直在做重复的复制粘贴工作. 随着年纪越来越大,竞争力越来越弱,身体也不如从前,就会非常有危 ...

最新文章

  1. 从零入门 Serverless | SAE 场景下,应用流量的负载均衡及路由策略配置实践
  2. 2012总结--第1篇--技术篇
  3. binaryoperator java_BinaryOperatorT接口的用法示例
  4. ansible备份mysql_ansible做mysql备份和安全加固
  5. 快速生成Plugman中的lib-file、source-file的xml内容
  6. 服务器芯片组思维导图,服务器思维导图
  7. stm32中的延时函数
  8. ChannelHandler揭秘(Netty源码死磕5)
  9. 类似于input输入框placeholder的效果,兼容ie8
  10. 基于VC++实现的中国象棋-双人象棋游戏
  11. eplan2.4安装教程
  12. Excel如何分组排序
  13. 51单片机电子制作DIY-----交通灯控制器
  14. 【原创】企业级Linux环境部署(很全、很细)
  15. 如何修改chrome账号密码自动填充的字体样式
  16. ipv6访问文件服务器,开启IPv6,让你的局域网可以使用IPV6进行共享文件夹的访问...
  17. d2l.Vocab(sentences, min_freq=5, reserved_tokens=[‘<pad>‘, ‘<mask>‘, ‘<cls>‘, ‘<sep>‘]) 参数讲解
  18. 低代码”革了谁的命?
  19. js实现圆柱形轮播图
  20. 紫书已经基本学完现在开启紫书题目补完计划!!!

热门文章

  1. PathFileExists用法--使用#include shlwapi.h
  2. Java代码调用PHP代码
  3. [置顶] php检测输入数据是否合法常用的类
  4. 局域网中有源以太网POE(Power Over Ethernet)的意思
  5. 华为鸿蒙命名议论文,盘点华为产品命名 满满古代神话风 操作系统叫鸿蒙
  6. 电容笔可以用什么代替?好用不贵电容笔测评
  7. matlab输入10个任意数,MATLAB创建一个M文件,完成求任意数n的阶乘,n的值由键盘输入...
  8. 2013年工作中遇到的20个问题(Bug):161-180
  9. 汇编语言中的loop循环
  10. wps表格粗线和细线区别_WPS文字如何加粗或改变表格中某一条线的颜色? 经验告诉你该这样...