Skip to content

Commit

Permalink
feat: 添加说明、部分探索页面显示
Browse files Browse the repository at this point in the history
  • Loading branch information
yanghua committed Feb 1, 2025
1 parent b3d1ffc commit f993141
Show file tree
Hide file tree
Showing 17 changed files with 358 additions and 55 deletions.
16 changes: 13 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Vue 3 + TypeScript + Vite
# Anqzi

This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
> 命名没有含义,随便取地。
Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).
对usememos的复刻和扩展

## 项目结构

- 顶层:前端代码
- `backend`后端
- `mark-parser`负责`markdown`解析与渲染

![alt text](./assets/home.png)

![alt text](./assets/expore.png)
Binary file added assets/expore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 24 additions & 5 deletions backend/api/memo/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/kehuay/aimemos/api/auth"
"github.com/kehuay/aimemos/store"
"github.com/kehuay/mark-parser/parser"
"github.com/kehuay/mark-parser/parser/token"
"github.com/kehuay/mark-parser/render"
)

Expand All @@ -18,6 +19,7 @@ func NewMemoApi(group fiber.Router) fiber.Router {
memoApi.Put("", CreateMemo)
memoApi.Patch("", UpdateMemo)
memoApi.Post("/all", QueryMemos)
memoApi.Post("/tags", QueryTags)
memoApi.Post("/:id", QueryMemoById)

return memoApi
Expand Down Expand Up @@ -95,9 +97,13 @@ func CreateMemo(c *fiber.Ctx) error {

// log.Println(memoCreate.Content)

text := []byte(memoCreate.Content)
tokens := parser.Parser(text)

memo, err := store.CreateMemo(store.MemoCreate{
Content: memoCreate.Content,
CreatorId: userId,
Tags: token.GetTags(text, tokens),
}, *_store)

if err != nil {
Expand All @@ -106,8 +112,6 @@ func CreateMemo(c *fiber.Ctx) error {

memo.CreatorName = userName

text := []byte(memo.Content)
tokens := parser.Parser(text)
memo.Content = render.RenderToHtml(text, tokens)

return c.JSON(memo)
Expand All @@ -131,12 +135,14 @@ func UpdateMemo(c *fiber.Ctx) error {
return errors.New("内容为空")
}

// log.Println(memoCreate.Content)
text := []byte(memoUpdate.Content)
tokens := parser.Parser(text)

memo, err := store.UpdateMemo(store.MemoUpdate{
Content: memoUpdate.Content,
Id: memoUpdate.Id,
CreatorId: userId,
Tags: token.GetTags(text, tokens),
}, *_store)

if err != nil {
Expand All @@ -145,8 +151,6 @@ func UpdateMemo(c *fiber.Ctx) error {

memo.CreatorName = userName

text := []byte(memo.Content)
tokens := parser.Parser(text)
memo.Content = render.RenderToHtml(text, tokens)

return c.JSON(memo)
Expand Down Expand Up @@ -197,3 +201,18 @@ func QueryMemoById(c *fiber.Ctx) error {

return c.JSON(memo)
}

func QueryTags(c *fiber.Ctx) error {
user_id, _ := c.Locals("user_id").(string)
_store, _ := c.Locals("store").(*store.Store)

tags, err := store.QueryTags(store.TagQuery{
CreatorId: user_id,
}, *_store)

if err != nil {
return err
}

return c.JSON(tags)
}
149 changes: 146 additions & 3 deletions backend/store/memo.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package store

import "database/sql"
import (
"database/sql"
"fmt"
"log"
"strings"
)

type Memo struct {
Id string `json:"id"`
Expand All @@ -24,12 +29,14 @@ const (
type MemoCreate struct {
Content string
CreatorId string
Tags []string
}

type MemoUpdate struct {
Content string
Id string
CreatorId string
Tags []string
}

type MemoQuery struct {
Expand All @@ -38,14 +45,71 @@ type MemoQuery struct {
PageNo int64
}

type Tag struct {
Id string `json:"id"`
Name string `json:"name"`
}

type TagQuery struct {
CreatorId string `json:"creator_id"`
}

func CreateMemo(memoCreate MemoCreate, store Store) (Memo, error) {

memo := Memo{
Content: memoCreate.Content,
CreatorId: memoCreate.CreatorId,
}

err := store.db.QueryRow(
tx, err := store.db.Begin()
if err != nil {
return Memo{}, err
}
defer tx.Rollback()
// 查询已经存在的tags
rows, err := tx.Query("select name from tags where creator_id=$1", memoCreate.CreatorId)
if err != nil {
return Memo{}, err
}
defer rows.Close()

tagsMap := make(map[string]bool, len(memoCreate.Tags))
for _, tag := range memoCreate.Tags {
tagsMap[tag] = false
}
for rows.Next() {
var name string
err = rows.Scan(&name)
if err != nil {
return Memo{}, err
}
tagsMap[name] = true
}
// 过滤不存在标签
var tags []any

for _, tag := range memoCreate.Tags {
if !tagsMap[tag] {
tags = append(tags, tag)
}
}
if len(tags) > 0 {
valuesStr := make([]any, 0, len(tags)*2)
placeholderStr := make([]string, len(tags))
for index, tag := range tags {
valuesStr = append(valuesStr, tag, memoCreate.CreatorId)
placeholderStr[index] = fmt.Sprintf("($%d,$%d)", 2*index+1, 2*index+2)
}
queryStmt := fmt.Sprintf(`insert into tags (name, creator_id) values %s`, strings.Join(placeholderStr, ","))
log.Printf("%s", queryStmt)
log.Println(valuesStr...)

if _, err = tx.Exec(queryStmt, valuesStr...); err != nil {
return Memo{}, err
}
}

err = tx.QueryRow(
"insert into memos (content, creator_id) values ($1, $2) returning id, create_at, update_at;",
memoCreate.Content,
memoCreate.CreatorId,
Expand All @@ -55,6 +119,10 @@ func CreateMemo(memoCreate MemoCreate, store Store) (Memo, error) {
return Memo{}, err
}

if err = tx.Commit(); err != nil {
return Memo{}, err
}

return memo, err
}

Expand All @@ -66,7 +134,55 @@ func UpdateMemo(memoUpdate MemoUpdate, store Store) (Memo, error) {
Id: memoUpdate.Id,
}

err := store.db.QueryRow(
tx, err := store.db.Begin()
if err != nil {
return Memo{}, err
}
defer tx.Rollback()
// 查询已经存在的tags
rows, err := tx.Query("select name from tags where creator_id=$1", memoUpdate.CreatorId)
if err != nil {
return Memo{}, err
}
defer rows.Close()

tagsMap := make(map[string]bool, len(memoUpdate.Tags))
for _, tag := range memoUpdate.Tags {
tagsMap[tag] = false
}
for rows.Next() {
var name string
err = rows.Scan(&name)
if err != nil {
return Memo{}, err
}
tagsMap[name] = true
}
// 过滤不存在标签
var tags []any

for _, tag := range memoUpdate.Tags {
if !tagsMap[tag] {
tags = append(tags, tag)
}
}
if len(tags) > 0 {
valuesStr := make([]any, 0, len(tags)*2)
placeholderStr := make([]string, len(tags))
for index, tag := range tags {
valuesStr = append(valuesStr, tag, memoUpdate.CreatorId)
placeholderStr[index] = fmt.Sprintf("($%d,$%d)", 2*index+1, 2*index+2)
}
queryStmt := fmt.Sprintf(`insert into tags (name, creator_id) values %s`, strings.Join(placeholderStr, ","))
log.Printf("%s", queryStmt)
log.Println(valuesStr...)

if _, err = tx.Exec(queryStmt, valuesStr...); err != nil {
return Memo{}, err
}
}

err = tx.QueryRow(
"update memos set content=$1 where id=$2 returning id, create_at, update_at;",
memoUpdate.Content,
memoUpdate.Id,
Expand All @@ -76,6 +192,10 @@ func UpdateMemo(memoUpdate MemoUpdate, store Store) (Memo, error) {
return Memo{}, err
}

if err = tx.Commit(); err != nil {
return Memo{}, err
}

return memo, err
}

Expand All @@ -102,6 +222,8 @@ func QueryMemos(memoQuery MemoQuery, store Store) ([]Memo, error) {
return []Memo{}, err
}

defer rows.Close()

memos := make([]Memo, 0)

for rows.Next() {
Expand Down Expand Up @@ -135,3 +257,24 @@ func QueryMemoById(id string, creator_id string, store Store) (Memo, error) {

return memo, err
}

func QueryTags(tagQuery TagQuery, store Store) ([]Tag, error) {
rows, err := store.db.Query(`select id, name from tags where creator_id=$1;`, tagQuery.CreatorId)

if err != nil {
return []Tag{}, err
}

defer rows.Close()

tags := make([]Tag, 0)
for rows.Next() {
var tag Tag
if err = rows.Scan(&tag.Id, &tag.Name); err != nil {
return []Tag{}, err
}
tags = append(tags, tag)
}

return tags, nil
}
2 changes: 1 addition & 1 deletion mark-parser/parser/blocks/todo.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
)

const (
TodoRegexp = `^-\s\[([X ])\]\s(.*)`
TodoRegexp = `^-\s\[([XI ])\]\s(.*)`
)

func FindTodoItemIndex(text []byte) (Indexes, bool) {
Expand Down
23 changes: 11 additions & 12 deletions mark-parser/parser/inline/inline.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,29 @@ func InlineParse(text []byte, tokens []token.Token, blockStartIndex int, parsers
for index < len(text) {
flag := false
for _, parser := range parsers {
// fmt.Println(index)
if indexes, ok := parser.Matcher(text[index:]); ok {
endIndex := index
tokens = append(tokens, token.Token{
Type: "inline",
Tag: 0,
BlockStartIndex: blockStartIndex,
Text: []int{startIndex, endIndex}, // 在文本内部的偏移
Children: []token.Token{},
})
// 添加一个开始判断,如果上一个是匹配的
if startIndex != endIndex {
tokens = append(tokens, token.Token{
Type: "inline",
Tag: 0,
BlockStartIndex: blockStartIndex,
Text: []int{startIndex, endIndex}, // 在文本内部的偏移
Children: []token.Token{},
})
}
tokens = append(tokens, token.Token{
Type: "inline",
Tag: int(indexes.Type),
BlockStartIndex: blockStartIndex,
Text: []int{index + indexes.Indexes[2], index + indexes.Indexes[3]},
Children: []token.Token{},
})
// fmt.Printf("%s \n", text[startIndex:endIndex])
// fmt.Printf("%s %v\n", text[index:][indexes.Indexes[2]:indexes.Indexes[3]], indexes)
startIndex = index + indexes.Indexes[1]
index += indexes.Indexes[1] + 1
index += indexes.Indexes[1]
flag = true
break
// fmt.Println(startIndex, index)
}
}
if !flag {
Expand Down
2 changes: 1 addition & 1 deletion mark-parser/parser/inline/tag.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package inline
import "regexp"

const (
TagRegexp = `^#(.*)`
TagRegexp = `^#([^\s#]+)`
)

func FindTagIndex(text []byte) (Indexes, bool) {
Expand Down
11 changes: 11 additions & 0 deletions mark-parser/parser/token/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,14 @@ type Token struct {
Matches []int
Children []Token
}

func GetTags(texts []byte, tokens []Token) []string {
tags := make([]string, 0)
for _, token := range tokens {
if token.Tag == 3 {
tags = append(tags, string(texts[token.BlockStartIndex+token.Text[0]:token.BlockStartIndex+token.Text[1]]))
}
}

return tags
}
Loading

0 comments on commit f993141

Please sign in to comment.