机械电子学院官网BMS

配置文件

  • runmode = dev 应用的运行模式,可选prod, dev 或 test,默认是dev ,为开发者模式
  • sessionon=true设置session控制开启,主要用于验证登录信息,在登录页面SetSession("Login", true)c.SetSession("authority", int(1))c.SetSession("authority", int(2))用以区分超级管理员和普通管理员,在其他需要验证登录的页面利用v := c.GetSession("authority"),判断v的值为1或者是2判断登录的用户是否是超级管理员

Router文件beego的路由设置

//由于在controllers文件夹中把前端控制和后端控制文件分为两个文件夹BackFront,因此路由设置时要注意
func init() {
    // 后端路由设置
    beego.Router("/", &Back.MainController{}, "get:LoginIndex;post:Post")
    beego.Router("/index", &Back.IndexController{})
    beego.Router("/category", &Back.FormController{})
    beego.Router("/addTeacher", &Back.AddTeacherController{})
    beego.Router("/addLink", &Back.AddLinkController{})
    beego.Router("/addDownload", &Back.AddDownloadController{})
    beego.Router("/user", &Back.UserController{})

    beego.Router("/teacherlist", &Back.TeacherListController{})
    beego.Router("/linkerlist", &Back.LinkerListController{})
    beego.Router("/articlelist", &Back.AticleListController{})
    beego.Router("/onearticle", &Back.OneAticleController{})

    //前端路由设置
    beego.Router("/Judge", &Front.JudgeController{}, "get:Judge")
    beego.Router("/jxdz", &Front.JxdzController{})
    beego.Router("/jxdzN1", &Front.JxdzN1Controller{})
    beego.Router("/jxdzN2", &Front.JxdzN2Controller{})
    beego.Router("/jxdzN3", &Front.JxdzN3Controller{})
    beego.Router("/jxdzN4", &Front.JxdzN4Controller{})
    beego.Router("/jxdzN5", &Front.JxdzN5Controller{})
    beego.Router("/jxdzN6", &Front.JxdzN6Controller{})

}

models文件夹

Category.go文件

Category结构体用于管理栏目,使用的是无限极分类的方法
type Category struct {
    Id       int
    Name     string `orm:"size(45)"`
    ParentID int
    ChildID  string `orm:"size(100)"`
    Depth    int
    Type     string
    Content  string `orm:"size(1000)"`
}
  • Id默认为主键并自增
  • ParentID为栏目的父栏目的Id命名应该使用大驼峰ParentId
  • ChildID为子栏目的Id,使用","隔开,因此要使用string格式
  • Depth为此栏目的层深,一级栏目层深为一,二级栏目层深为二,以此类推
  • Type 为此栏目对应的类型,分为目录、单页面、教师列表、文章列表、下载列表和链接列表几种,例如热点新闻栏目的类型就是文章列表,包含一篇或多篇文章
  • Content字段是为单页面类型准备的,只有类型为单页面的栏目才会在这个字段中存数据,例如学院简介栏目
CategoryListOne用于渲染前端一级栏目的结构体
type CategoryListOne struct {
    Id            int
    DepthNumber   int
    CateOne       *Category
    CateTwo       []*Category
}
  • 该结构体有4个字段,CateOne代表层深为一的栏目,CateTwo代表着其对应的子栏目,DepthNumberCateTwo对应的slice的个数,例如当Id=1时对应的CateOne学院概况,其有三个子栏目学院简介学院机构院长寄语三个,对应着字段CateTwo,则DepthNumber字段为3,代表着此栏目有3个二级子栏目
  • 该结构体用函数func CreateCateList()([]*CategoryListOne, error)构建,其中CateOne字段中不包括快速链接,因为此栏目并不是用在首页顶部的一级栏目当中
函数及其功能
  • 增加栏目函数func AddCategory(name string, parentid int, typ string, cont string) error,输入栏目名、父类Id、类型和内容四个字段,返回错误。beego的增删改查
  • 删除栏目函数func DelCategory(id int, name string, parentid int) int,传入栏目的Id,栏目名和父类Id,返回一个整型变量,删除成功则返回0,删除有错误则返回1,其中要删除的栏目必须是底层栏目,即不能有子栏目,ChildID=="0"
  • 查找栏目函数func SearchCategory(id int) (cate Category, err error),读取错误则返回错误err
  • 查找所有栏目函数func GetAllCategories() ([]*Category, error),按数据库的顺序输出所有的栏目信息
  • 无限极排序函数(递归)func MakeSort(id int, CateNotSort []*Category) []*Category,用于根据父-子栏目的顺序输出无限极分类之后的栏目信息
var CateSort []*Category //全局变量,用以存储已经找到的栏目分类
//输入要排序的树形结构的根节点及未排序的栏目信息,输出排好序的树型结构的栏目信息
//初始调用此函数时传入id=0,因所有的一级栏目的父栏目id都为0
func MakeSort(id int, CateNotSort []*Category) []*Category {
    var i int
    //由于全局变量不会自动更新,因此每次初始调用时需要手动初始化
    if id == 0 {
        CateSort = make([]*Category, 0)
    }
    for i = 0; i < len(CateNotSort); i++ {
        if id == CateNotSort[i].ParentID {
            CateSort = append(CateSort, CateNotSort[i])
            MakeSort(CateNotSort[i].Id, CateNotSort)
        }
    }
    return CateSort
}

Content.go文件

Content结构体用于存储文章信息
type Content struct {
    Id        int
    BelongsId int
    Title     string `orm:"size(30)"`
    Content   string `orm:"size(15000)"`
    From      string
    CreatTime string
    ReadTime  int
    ImgPath   string
}
  • BelongsId字段存储该文章所属栏目的Id,此栏目的类型需为文章列表
  • Title字段存储题目,`orm:”size(30)”`代表题目长度最多为30,中英文同样适用
  • Content存储内容,由于是使用富文本编辑器,因此有部分冗余信息,因此其长度限制`orm:”size(15000)”`比较大mysql表中字段存储限制
  • FromCreatTimeReadTime字段分别存储文章的来源、创建时间和阅读次数,其中创建时间默认为time.Now(),格式为”2006-01-01”,阅读次数默认为0
  • ImgPath字段是专为热点新闻准备的,因为热点新闻要选取5篇作为首页轮播图内容,需要对应的图片
  • 增加、删除和获取文章函数和之前一样
  • 函数func SearchFunction(cont string) []*Content对应网页的搜索功能beego中自定义条件表达式用法
//输入要查询的内容,返回查找到的文章列表
func SearchFunction(cont string) []*Content {
    o := orm.NewOrm()
    cond := orm.NewCondition()
    Article := make([]*Content, 0)
    //自定义表达式,文章题目或者内容包含要查找的内容,用or连接
    cond1 := cond.Or("Title__icontains", cont).Or("Content__icontains", cont)
    qs := o.QueryTable("Content")

    var err error
    _, err = qs.SetCond(cond1).All(&Article)
    if err != nil {
        beego.Debug(err)
    }
    return Article
}
  • 函数func SearchArticleByBelongid(id int) []*Content根据文章的BelongsId找到指定Id的栏目包含的所有文章列表

Employee.go文件

Employee结构体
type Employee struct {
    Id                  int
    Name                string
    Job                 string
    Telphone            string
    Email               string
    Script              string `orm:"size(800)"`
    EducationBackground string
    IsDocTeacher        string `orm:"size(5)"`
    Department          string
    Img                 string
    Research            string `orm:"size(5000)"`
    Teaching            string `orm:"size(5000)"`
    Prize               string `orm:"size(5000)"`
}
  • Img字段用于存储教师的图片信息的路径,一般为本地图片路径
  • ScriptResearchTeachingPrize分别存储老师的个人经历,科研经历,教学经历和其他获奖

user.go文件

Users结构体
type Users struct {
    Id        int
    Account   string `orm:"unique"`
    Password  string `orm:"size(30)"`
    Authority string
}
  • Account字段代表用户的账号信息,账户信息必须是unique
  • Authority字段代表用户的权限,有超级管理员super和普通管理员common两种,只有超级管理员才能操作栏目信息和用户信息
初始化函数beego的DataBase设置
func init() {
    // 需要在init中注册定义的model
    orm.RegisterModel(new(Users), new(Category), new(Content), new(Employee), new(Linker), new(Download))

    // 设置基本的数据库
    orm.RegisterDataBase("default", "mysql", "root:golang@/user?charset=utf8", 30)

    // create table
    //第二个参数为true时每次运行重新建表
    orm.RunSyncdb("default", false, true)
}

controllers文件夹

Back文件夹包含了控制后台页面的控制文件

loginController.go文件
  • 控制登录页面,输入账号密码,与数据库中的账号密码信息对比,判断账号密码是否正确,正确时取出其权限信息,若为超级管理员,则this.SetSession("authority", int(1)),若为普通管理员,则this.SetSession("authority", int(2))。错误时提示输入错误,重定位到登录页面this.Redirect("/", 302),重新输入账号密码。
categoryController.go文件
  • 首先判断Session,利用v := c.GetSession("authority"),如果v等于1,代表这此时登录的是超级管理员,如果v等于2,代表这此时登录的是超级管理员,否则代表这用户尚未登录,重定向到登录页面。
  • 然后就是增加或者删除栏目的操作,增加栏目用的是form表单提交,方法是POST,删除则用的是默认的GET方法。
  • 其余的后台控制文件相差不多

Font文件夹包括了前端控制文件

Judge.go文件
  • 作用是分发路由,根据Id判断跳转到哪一个二级页面
  • 目录类型的处理
    //目的是寻找到该目录的第一个类型不是目录的子栏目(一定非空)并显示其内容
    if cateType == "目录" {
    //找到其子栏目,返回slice
    cateSon, _ := models.FindAllSon(id)
    //找到其第一个子栏目,判断其类型是否是目录
    //如果是,则继续往下级寻找;若否,则显示该子栏目的内容
    if cateSon[0].Type != "目录" {
        cateType = cateSon[0].Type
        idSon := cateSon[0].Id
        idstr = strconv.Itoa(idSon)
    } else {
        cateGrandson, _ := models.FindAllSon(cateSon[0].Id)
        cateType = cateGrandson[0].Type
        idGrandson := cateGrandson[0].Id
        idstr = strconv.Itoa(idGrandson)
    }
    }
  • 在前端页面的处理上,主要包括了4个页面,分别是单页面,文章列表页面,教师列表页面和下载列表页面,分别根据栏目所属的类型来选择跳转到哪一个页面
    if cateType == "文章列表" {
        c.Redirect("/jxdzN2?Id="+idstr, 302)
    } else if cateType == "单页面" {
        c.Redirect("/jxdzN1?Id="+idstr, 302)
    } else if cateType == "教师列表" {
        c.Redirect("/jxdzN4?Job=职称&Id="+idstr, 302)
    } else if cateType == "下载列表" {
        c.Redirect("/jxdzN3?Id="+idstr, 302)
    } else {
        beego.Error("类型错误")
    }
jxdzController.go文件
  • 前端页面之首页控制,二级菜单的实现c.Data["CatesForMenu"], err = models.CreateCateList()即为创建一级菜单和二级菜单的CategoryListOne结构体,然后按照父-子栏目的顺序依次显示出来,即显示一个一级栏目,下面挂着以这个一级栏目为父节点的所有二级栏目
  • 控制显示所有的链接列表c.Data["link"] = models.GetAllLinker()
  • 控制轮播图,轮播内容为热点新闻的前5篇,热点新闻是根据添加时间倒序排列,因此轮播的是热点新闻的最新添加的5篇
  • 控制重要通知,显示最新的8篇重要通知
jxdzN1Controller.go~jxdzN6Controller.go文件
  • 分别控制前端的单页面、文章列表、下载列表、教师列表和单篇文章的页面显示
  • 共同点是都需要控制其面包屑以找到其路径c.Data["Path"] = models.FindAllFather(id),即根据Id按照层深一层层的找到其所有父节点并依次显示出来;
  • 都有一个左菜单栏c.Data["LeftMenu"] = models.FindLeftMenu(id),显示其所有的兄弟栏目(即与此栏目有同一个父栏目);左栏目之下有热点新闻导航栏,同样显示最新的5篇热点新闻
  • 每个页面都有一搜索框,可以点击搜索,通过关键字搜索新闻,搜索范围为所有文章的题目和内容,通过连接。
  • 不同点是教师页面jxdzN4中需要通过职称、博导和系所分类;下载列表jxdzN3和文章列表jxdzN2需要取出所需Id对应下的所有文章和下载列表;单篇文章显示页面须有下一页功能

static文件夹

  • 用于放置views中用到的js、css等文件,还包括一些用于显示的图片文件和用于下载的下载文件

views文件夹

jxdzN1.html~jxdzN6.html

  • 一级菜单和二级菜单
<!--使用模板函数,其字段CateOne对应一级菜单,一个一级菜单对应一个slice,存储其所有的二级子栏目,即为二级菜单 -->
  {{range .CatesForMenu}}
    <li onmouseover="drop('d{{.Id}}','{{.DepthNumber}}')" onmouseout="drop('d{{.Id}}','0')">
        <a href="/Judge?ID={{.CateOne.Id}}" target="_blank">{{.CateOne.Name}}</a>
        <ul class="dropDown" id="d{{.Id}}">
            {{range .CateTwo}}
            <li style="border-top:none;">
              <a href="/Judge?ID={{.Id}}">{{.Name}}</a>
            </li>
            {{end}}
                    </ul>
                </li>
        {{end}}
  • 热点新闻轮播图
<!-- 用模板传数据,模板包含了热点新闻列表的所有文章列表的最新5篇-->
{{range .HotNews}}
        <!-- 自定义模板函数,把文章对应的Id转化为1~5,由于li的格式渲染是通过ro1~ro5,因此必须要把文章的Id转化-->
        {{$idout := .Id|Idconvrtforimg}}
                <li id="ro{{$idout}}">
                    <a href="/jxdzN5?Id={{.Id}}&BeId=23" class="rotationTab" target="_blank">
                        <img src="{{.ImgPath}}" class="ro">
                    </a>
                    <div class="label">
                        <a class="bannerTitle" target="_blank" href="/jxdzN5?Id={{.Id}}&BeId=23">{{.Title}}</a>
                        <!-- <a class="bannerContainer" target="_blank" href="/jxdzN5?Id={{.Id}}">{{.Content}}</a> -->
                    </div>
                </li>
        {{end}}
  • 重要通知的轮播和热点新闻相差不多
{{range .Newsimp}}
<!-- 利用自定义模板函数计算高度top和ID,用于体现渲染的效果 -->
{{$top := .Id |Counttop}}
{{$ID := .Id |Idconvert}}
    <li id="li{{$ID}}" style="top:{{$top}}px;">
        <a href="/jxdzN5?Id={{.Id}}&BeId=35">
            <div class="date">
                <p class="year">{{substr .CreatTime 0 7}}</p>
                    <p class="day">{{substr .CreatTime 8 10}}</p>
            </div>
            <!-- 判断重要通知新闻题目是否过长,即是否超过37个字(刚好占两行),若太长则截取前37个字,并在后面加上省略号,否则正常显示即可 -->
            {{$IsLong := .Title |Istoolong}}
            {{if $IsLong}}
            <p class="tabInfo">{{substr .Title 0 37}}...</p>
           {{else}}
           <p class="tabInfo">{{.Title}}</p>
           {{end}}
        </a>
    </li>
 {{end}}

总结:从前到后梳理了一遍思路,发现好像也没有什么特别难搞定的……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值