c8f03dd932
功能特性: - Markdown 编辑与实时预览 - 代码语法高亮 - 目录树形结构管理 - 图片粘贴上传 - Markdown 文件导入导出 - 笔记密码保护 - 前后端分离架构 技术栈: - Go + Gin + GORM + SQLite - 原生 HTML/CSS/JavaScript - Highlight.js
101 satır
3.4 KiB
Go
101 satır
3.4 KiB
Go
package model
|
||
|
||
import (
|
||
"crypto/sha256"
|
||
"encoding/hex"
|
||
"time"
|
||
)
|
||
|
||
// HashPassword 生成密码哈希
|
||
func HashPassword(password string) string {
|
||
if password == "" {
|
||
return ""
|
||
}
|
||
hash := sha256.Sum256([]byte(password))
|
||
return hex.EncodeToString(hash[:])
|
||
}
|
||
|
||
// CheckPassword 验证密码
|
||
func CheckPassword(password, hash string) bool {
|
||
// 如果笔记没有设置密码(hash 为空),则不需要验证
|
||
if hash == "" {
|
||
return true
|
||
}
|
||
// 如果用户没有输入密码,验证失败
|
||
if password == "" {
|
||
return false
|
||
}
|
||
return HashPassword(password) == hash
|
||
}
|
||
|
||
// Note 笔记模型(也用于目录)
|
||
type Note struct {
|
||
ID uint `json:"id" gorm:"primaryKey"`
|
||
Title string `json:"title" gorm:"size:255;not null" binding:"required"`
|
||
Content string `json:"content" gorm:"type:text"`
|
||
Category string `json:"category" gorm:"size:100;index"`
|
||
Tags string `json:"tags" gorm:"type:text"` // JSON 数组格式存储
|
||
Password string `json:"-" gorm:"size:255"` // 访问密码(哈希存储)
|
||
IsPinned bool `json:"is_pinned" gorm:"default:false"`
|
||
IsFavorite bool `json:"is_favorite" gorm:"default:false"`
|
||
IsPublic bool `json:"is_public"` // 是否公开
|
||
ParentID uint `json:"parent_id" gorm:"default:0;index"` // 父级目录 ID,0 表示根目录
|
||
IsFolder bool `json:"is_folder" gorm:"default:false"` // 是否为文件夹
|
||
SortOrder int `json:"sort_order" gorm:"default:0"` // 排序顺序
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|
||
|
||
// NoteListItem 笔记列表响应(不含内容和密码)
|
||
type NoteListItem struct {
|
||
ID uint `json:"id"`
|
||
Title string `json:"title"`
|
||
Category string `json:"category"`
|
||
Tags string `json:"tags"`
|
||
HasPassword bool `json:"has_password"` // 是否有密码保护
|
||
IsPinned bool `json:"is_pinned"`
|
||
IsFavorite bool `json:"is_favorite"`
|
||
IsPublic bool `json:"is_public"`
|
||
ParentID uint `json:"parent_id"`
|
||
IsFolder bool `json:"is_folder"`
|
||
SortOrder int `json:"sort_order"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|
||
|
||
// NoteCreateRequest 创建笔记请求
|
||
type NoteCreateRequest struct {
|
||
Title string `json:"title" binding:"required"`
|
||
Content string `json:"content"`
|
||
Category string `json:"category"`
|
||
Tags string `json:"tags"`
|
||
Password string `json:"password"`
|
||
IsPinned *bool `json:"is_pinned"`
|
||
IsFavorite *bool `json:"is_favorite"`
|
||
IsPublic *bool `json:"is_public"`
|
||
ParentID *uint `json:"parent_id"`
|
||
IsFolder bool `json:"is_folder"`
|
||
SortOrder int `json:"sort_order"`
|
||
}
|
||
|
||
// NoteUpdateRequest 更新笔记请求
|
||
type NoteUpdateRequest struct {
|
||
Title *string `json:"title"`
|
||
Content *string `json:"content"`
|
||
Category *string `json:"category"`
|
||
Tags *string `json:"tags"`
|
||
Password *string `json:"password"`
|
||
RemovePassword *bool `json:"remove_password"` // 是否移除密码
|
||
IsPinned *bool `json:"is_pinned"`
|
||
IsFavorite *bool `json:"is_favorite"`
|
||
IsPublic *bool `json:"is_public"`
|
||
ParentID *uint `json:"parent_id"`
|
||
IsFolder *bool `json:"is_folder"`
|
||
SortOrder *int `json:"sort_order"`
|
||
}
|
||
|
||
// NoteAccessRequest 笔记访问请求(验证密码)
|
||
type NoteAccessRequest struct {
|
||
Password string `json:"password"`
|
||
}
|