feat: 初始化云笔记项目
功能特性: - Markdown 编辑与实时预览 - 代码语法高亮 - 目录树形结构管理 - 图片粘贴上传 - Markdown 文件导入导出 - 笔记密码保护 - 前后端分离架构 技术栈: - Go + Gin + GORM + SQLite - 原生 HTML/CSS/JavaScript - Highlight.js
Bu işleme şunda yer alıyor:
@@ -0,0 +1,100 @@
|
||||
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"`
|
||||
}
|
||||
Yeni konuda referans
Bir kullanıcı engelle