#Models实现
将ancientpoetry.sql导入数据库并执行,创建对应的数据库和表,在项目中的models文件夹下创建对应的model,并为每个model实现对应的基础方法。在init.go中获取配置文件中和数据库县官的信息,注册模型并连接数据库。部分代码如下:
package models
import (
"net/url"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func init() {
//从配至文件中获取ip
dbhost := beego.AppConfig.String("db.host")
//从配至文件中获取端口
dbport := beego.AppConfig.String("db.port")
//从配至文件中获取用户名
dbuser := beego.AppConfig.String("db.user")
//从配至文件中获取密码
dbpassword := beego.AppConfig.String("db.password")
//从配至文件中获取数据库名称
dbname := beego.AppConfig.String("db.name")
//从配至文件中获取时区
timezone := beego.AppConfig.String("db.timezone")
//如果端口号为空,则赋予默认值3306
if dbport == "" {
dbport = "3306"
}
//拼接数据库信息
dsn := dbuser + ":" + dbpassword + "@tcp(" + dbhost + ":" + dbport + ")/" + dbname + "?charset=utf8"
// fmt.Println(dsn)
if timezone != "" {
//QueryEscape函数对s进行转码使之可以安全的用在URL查询里。
dsn = dsn + "&loc=" + url.QueryEscape(timezone)
}
//注册数据库
orm.RegisterDataBase("default", "mysql", dsn)
//注册模型
orm.RegisterModel(new(Auth), new(Admin), new(InfoList), new(InfoClass))
//从配至文件中获取运行模式
/*if beego.AppConfig.String("runmode") == "dev" {
orm.Debug = true
}*/
}
//获取表名
func TableName(name string) string {
return beego.AppConfig.String("db.prefix") + name
}
#前台实现
效果图如下:
该页面树妖实现了古诗的展示,主要有四个分类:诗词古韵,国学经典,开心儿歌,儿童古诗,其中每个分类对应不同的数据库中不同的表,点击某一篇古诗词查看古诗词详情,在后台获取古诗词的id,通过该id查询数据库,将古诗详情在页面上展示。
func (self *WwwController) Index() {
//创建存储过滤条件的切片
filters := make([]interface{}, 0)
//将过滤条件status=1追加到切片
filters = append(filters, "status", 1)
//将过滤条件class_id=5(开心儿歌)追加到切片中
filters = append(filters, "class_id", 5)
//分页查询古诗词
result, _ := models.NewsGetList(1, 6, filters...)
//创建存储古诗词的切片,切片中元素类型为map类型,键为string类型,值空接口类型
list := make([]map[string]interface{}, len(result))
//遍历结果
for k, v := range result {
//创建map
row := make(map[string]interface{})
//添加信息
row["id"] = v.Id
row["title"] = v.Title
row["class_id"] = v.ClassId
//如果缩略图片是否为空
if(string(v.Picurl) == "") {
//生成一个[1,10)之间的数
var r = rand.Intn(16)
//为缩略图赋值
v.Picurl = "/uploads/image/rand" + fmt.Sprintf("%d", r) + ".jpeg"
//fmt.Println(v.Picurl)
}
//缩略图
row["picurl"] = v.Picurl
//音频
row["media"] = v.Media
//如果摘要不为空
if (v.Desc != "") {
//将摘要强转为切片
nameRune := []rune(v.Desc)
//获取切片的长度
lth := len(nameRune)
//判断切片的长度是否大于30
if(lth > 30) {
lth = 30
}
//获取摘要的前30个字符
row["desc"] = string(nameRune[:lth])
}
//作者编辑
row["author"] = v.Author
//存入切片
list[k] = row
}
//创建存储过滤条件的切片
filters2 := make([]interface{}, 0)
//将审核状态为1的过滤条件追加到切片中
filters2 = append(filters2, "status", 1)
//将class_id=3(儿童古诗)的骡驴条件追加到切片中
filters2 = append(filters2, "class_id", 3)
//分页查询
result2, _ := models.NewsGetList(1, 6, filters2...)
//创建存储古诗词的切片,切片中元素类型为map类型,键为string类型,值空接口类型
list2 := make([]map[string]interface{}, len(result2))
//遍历结果
for k, v := range result2 {
//创建map
row2 := make(map[string]interface{})
//添加信息
row2["id"] = v.Id
row2["title"] = v.Title
row2["class_id"] = v.ClassId
//如果缩略图片是否为空
if(string(v.Picurl) == "") {
//随机生成[1,10)之间的整数
var r = rand.Intn(16)
//为缩略图赋值
v.Picurl = "/uploads/image/rand" + fmt.Sprintf("%d", r) + ".jpeg"
}
//缩略图
row2["picurl"] = v.Picurl
//音频
row2["media"] = v.Media
//判断摘要是否为空
if (v.Desc != "") {
//将摘要转换为切片
nameRune := []rune(v.Desc)
//获取摘要的长度
lth := len(nameRune)
//判断摘要的长度是否大于30
if(lth > 30) {
lth = 30
}
//摘要
row2["desc"] = string(nameRune[:lth])
}
//作者编辑
row2["author"] = v.Author
list2[k] = row2
}
//创建存储过滤条件的切片
filters3 := make([]interface{}, 0)
//将审核状态为1的过滤条件追加到切片中
filters3 = append(filters3, "status", 1)
//将class_id=3(国学生活)的骡驴条件追加到切片中
filters3 = append(filters3, "class_id", 1)
//分页查询
result3, _ := models.NewsGetList(1, 16, filters3...)
//创建存储古诗词的切片,切片中元素类型为map类型,键为string类型,值空接口类型
list3 := make([]map[string]interface{}, len(result3))
for k, v := range result3 {
//创建map
row2 := make(map[string]interface{})
//添加信息
row2["id"] = v.Id
row2["title"] = v.Title
row2["class_id"] = v.ClassId
//判断缩略图是否为空
if(string(v.Picurl) == "") {
//随机生成[1,10)之间的整数
var r = rand.Intn(16)
//为缩略图赋值
v.Picurl = "/uploads/image/rand" + fmt.Sprintf("%d", r) + ".jpeg"
}
//缩略图
row2["picurl"] = v.Picurl
//音频
row2["media"] = v.Media
//判断摘要是否为空
if (v.Desc != "") {
//将摘要转换为切片
nameRune := []rune(v.Desc)
//获取摘要的长度
lth := len(nameRune)
//判断摘要的长度是否大于30
if(lth > 30) {
lth = 30
}
//摘要
row2["desc"] = string(nameRune[:lth])
}
//作者编辑
row2["author"] = v.Author
list3[k] = row2
}
//创建存储过滤条件的切片
filters4 := make([]interface{}, 0)
//将审核状态为1的过滤条件追加到切片中
filters4 = append(filters4, "status", 1)
//将class_id=2(诗词古韵)的骡驴条件追加到切片中
filters4 = append(filters4, "class_id", 2)
//分页查询
result4, _ := models.NewsGetList(1, 6, filters4...)
fmt.Println("result4_length = ", len(result4))
//创建存储古诗词的切片,切片中元素类型为map类型,键为string类型,值空接口类型
list4 := make([]map[string]interface{}, len(result4))
//遍历结果
for k, v := range result4 {
//创建map
row2 := make(map[string]interface{})
//赋值
row2["id"] = v.Id
row2["title"] = v.Title
row2["class_id"] = v.ClassId
//判断缩略图片是否为空
if(string(v.Picurl) == "") {
//随机生成[1,10)之间的整数
var r = rand.Intn(16)
//为缩略图赋值
v.Picurl = "/uploads/image/rand" + fmt.Sprintf("%d", r) + ".jpeg"
}
//缩略图
row2["picurl"] = v.Picurl
//音频
row2["media"] = v.Media
//判断摘要是否为空
if (v.Desc != "") {
//将摘要转换为切片
nameRune := []rune(v.Desc)
//获取摘要的长度
lth := len(nameRune)
//判断摘要的长度是否大于30
if(lth > 30) {
lth = 30
}
//摘要
row2["desc"] = string(nameRune[:lth])
}
//作者编辑
row2["author"] = v.Author
list4[k] = row2
}
//创建map,map中的每个元素都是一个分类
out := make(map[string]interface{})
out["list"] = list
out["list2"] = list2
out["list3"] = list3
out["list4"] = list4
out["class_id"] = 0
self.Data["data"] = out
self.Layout = "public/www_layout.html"
self.display()
}