// 创建缓存文件并返回打开的文件指针 func CreateCacheFile(querypath string) *os.File { // 判断cache目录是否存在 _, err := os.Stat("cache/") if os.IsNotExist(err) { os.Mkdir("cache", 0777) } // 创建对应的缓存文件 f, err := os.Create("cache/" + tools.MD5(strings.ToLower(querypath)) + SUFFIX) if err != nil { panic("\n\n\nCreate cache file '" + "cache/" + tools.MD5(strings.ToLower(querypath)) + SUFFIX + "' fail\n\n\n") } return f }
// 检查登录用户是否合法 func (a AdminModel) CheckUser(username, passwd string) bool { // 创建一个操作数据库的对象 m := NewModel() defer m.Close() // 获取用户集合 users := m.session.DB(m.dbname).C("users") count, err := users.Count() if count == 0 || err != nil { return false } // 定义查询条件 query := bson.M{ "username": username, "passwd": tools.MD5(passwd), } // 查询该用户 count, err = users.Find(query).Count() if count == 0 || err != nil { // 用户不存在 return false } else { return true } }
// 后台安全验证 func (a Admin) safe(res web.Resource) bool { // 获取用户名 cookie, err := res.R.Cookie("username") if err != nil { return false } username := cookie.Value if username == "" { return false } // 判断是否登录 cookie, err = res.R.Cookie("login") if err != nil { return false } login := cookie.Value if login == "" { return false } // 验证用户名和SECRET_KEY if login == tools.MD5(web.SECRET_KEY+username+web.SECRET_KEY) { return true } else { return false } }
// 判断页面缓存是否存在,如果页面缓存过期则也算不存在 func HasCache(querypath string) (bool, string) { // 先判断是否开启了调试模式 // 如果开启了调试模式则,不缓存页面 if DEBUG { return false, "" } // 下面是没有开启调试模式,则缓存存在 // 直接打开缓存文件 // TODO 该过程有待优化 cacheFilePath := "cache/" + tools.MD5(strings.ToLower(querypath)) + SUFFIX // 读取文件信息 fileinfo, err := os.Stat(cacheFilePath) if err == nil || os.IsExist(err) { // 当页面缓存存在时 modtime := fileinfo.ModTime() fmt.Println("modtime", modtime) currtime := time.Now() fmt.Println("currtime", currtime) // 获取缓存文件距今创建多久了 diff := currtime.Sub(modtime) fmt.Println("缓存已经创建了", int(diff/time.Second), "秒.....") // 当缓的创建时间距今已经超过设定的秒数,则缓存失效 if int(diff/time.Second) > Conf.Int("cache", "lifetime") { // 解析模板时,会重新创建缓存文件 return false, "" } // 这里返回缓存有效,并返回缓存页面的路径 return true, cacheFilePath } // 缓存文件不存在 return false, "" }
// 登录页面 func (a Admin) Login(res web.Resource) { if res.R.Method == "GET" { // 该页面需要单独显示,不需要嵌套在模板中 // 临时关闭模板功能 a.CloseLayout = true // 添加页面的随机数 a.Render(res, nil) return } if res.R.Method == "POST" { res.R.ParseForm() username := res.R.Form["username"][0] password := res.R.Form["password"][0] // 创建一个Model对象 m := model.NewAdminModel() // 获取一个时间对象 now := time.Now() if m.CheckUser(username, password) { // 账户验证成功 // 设置cookie http.SetCookie(res.W, &http.Cookie{ Name: "login", Value: tools.MD5(web.SECRET_KEY + username + web.SECRET_KEY), // cookie 5分钟过期 Expires: now.Add(30 * time.Minute), }) http.SetCookie(res.W, &http.Cookie{ Name: "username", Value: username, // cookie 5分钟过期 Expires: now.Add(30 * time.Minute), }) a.Redirect(res, "/Admin/Index") } else { a.Redirect(res, "/") } } }