• Github每日精选(第48期):SQLite下的知识库memos


    memos

    memos 是一个开源的、自托管的知识库,可与 SQLite db 文件一起使用。 使用SQLite db还是很有必要的,因为有的时候我们需要把我们的日志进行转移,直接把数据库拷走就可以了。

    在这里插入图片描述

    github的地址在这里

    这个界面让人看起来还是觉得蛮舒服的,设置的也非常的简单,日常记录的,我觉得这样就很方便了。

    主要的特性:
    • 🦄完全开源;
    • 📜用纯文本区域书写,没有任何负担,
      • 并支持一些有用的markdown语法💪.
    • 🌄在漂亮的图片或个人页面(如 Twitter)中分享备忘录;
    • 🚀快速自托管Docker;
    • 🤠令人愉快的用户界面和用户体验;
    安装

    直接用docker 进行安装,方便:

    docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos neosmemo/memos:latest
    

    memos 应该在http://localhost:5230运行。如果~/.memos/没有memos_prod.db文件,则memos 将自动生成它。

    看看建成的memos

    在这里插入图片描述
    记录自己的文字,非常的方便。

    代码分析

    go语言作为后端,看起来非常的方便,这里分析几个 功能,新建用户:

    g.POST("/user", func(c echo.Context) error {
    		ctx := c.Request().Context()
    		userID, ok := c.Get(getUserIDContextKey()).(int)
    		if !ok {
    			return echo.NewHTTPError(http.StatusUnauthorized, "Missing auth session")
    		}
    		currentUser, err := s.Store.FindUser(ctx, &api.UserFind{
    			ID: &userID,
    		})
    		if err != nil {
    			return echo.NewHTTPError(http.StatusInternalServerError, "Failed to find user by id").SetInternal(err)
    		}
    		if currentUser.Role != api.Host {
    			return echo.NewHTTPError(http.StatusUnauthorized, "Only Host user can create member.")
    		}
    
    		userCreate := &api.UserCreate{
    			OpenID: common.GenUUID(),
    		}
    		if err := json.NewDecoder(c.Request().Body).Decode(userCreate); err != nil {
    			return echo.NewHTTPError(http.StatusBadRequest, "Malformatted post user request").SetInternal(err)
    		}
    
    		if err := userCreate.Validate(); err != nil {
    			return echo.NewHTTPError(http.StatusBadRequest, "Invalid user create format.").SetInternal(err)
    		}
    
    		passwordHash, err := bcrypt.GenerateFromPassword([]byte(userCreate.Password), bcrypt.DefaultCost)
    		if err != nil {
    			return echo.NewHTTPError(http.StatusInternalServerError, "Failed to generate password hash").SetInternal(err)
    		}
    
    		userCreate.PasswordHash = string(passwordHash)
    		user, err := s.Store.CreateUser(ctx, userCreate)
    		if err != nil {
    			return echo.NewHTTPError(http.StatusInternalServerError, "Failed to create user").SetInternal(err)
    		}
    
    		c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
    		if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(user)); err != nil {
    			return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode user response").SetInternal(err)
    		}
    		return nil
    	})
    

    数据库的操作:

    func createUser(ctx context.Context, tx *sql.Tx, create *api.UserCreate) (*userRaw, error) {
    	query := `
    		INSERT INTO user (
    			email,
    			role,
    			name,
    			password_hash,
    			open_id
    		)
    		VALUES (?, ?, ?, ?, ?)
    		RETURNING id, email, role, name, password_hash, open_id, created_ts, updated_ts, row_status
    	`
    	var userRaw userRaw
    	if err := tx.QueryRowContext(ctx, query,
    		create.Email,
    		create.Role,
    		create.Name,
    		create.PasswordHash,
    		create.OpenID,
    	).Scan(
    		&userRaw.ID,
    		&userRaw.Email,
    		&userRaw.Role,
    		&userRaw.Name,
    		&userRaw.PasswordHash,
    		&userRaw.OpenID,
    		&userRaw.CreatedTs,
    		&userRaw.UpdatedTs,
    		&userRaw.RowStatus,
    	); err != nil {
    		return nil, FormatError(err)
    	}
    
    	return &userRaw, nil
    }
    
    
  • 相关阅读:
    【故障公告】一而再,再而三,三翻四复:数据库服务器 CPU 100%
    C++PrimerPlus 第七章 函数-C++的编程模块-7.5 函数和C-风格字符串
    贝锐蒲公英异地组网:降低建筑工地远程视频监控成本、简化运维
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    NXP iMX8MM Cortex-M4 核心 GPT Capture 测试
    【Java校招面试】实战面经(十)
    【GitLab、GitLab Runner、Docker】GitLab CI/CD 应用
    Git常用命令汇总
    DRM系列(14)之writeback_job分析
    用这个方法简直开挂!精密空调轻松拿捏
  • 原文地址:https://blog.csdn.net/weixin_40425640/article/details/126547513