更新文章标题

有的时候,我们上传完文章之后,会发现我们的文章标题不合适,或想更好的描述文章内容。如果没有这个接口,我们需要删除文章,然后再重新上传。所以,我们实现这个功能,方便我们修改文章标题。

修改文章标题,我打算使用的命令格式如下:

gart title uuid newtitle

其中,紧挨着 gart 的 title 是命令,表示要更新文章标题,uuid 是文章的主键,可以查询识别是哪篇文章,newtitle 就是要修改的文章标题了。

实现的代码如下:


func init() {
	rootCmd.AddCommand(uptTitleCmd)
}

var uptTitleCmd = &cobra.Command{
	Use:   "title",
	Short: "更新文章标题,参数需要UUID,新的标题。",
	Long:  `更新文章标题,参数需要UUID,新的标题,需要先获取文章的UUID。`,
	Args:  cobra.MinimumNArgs(2),
	Run: func(cmd *cobra.Command, args []string) {
		uuid := args[0]
		title := args[1]
		uar := service.UpdateArtReq{
			Uuid:    uuid,
			Title:   title,
			UptType: 1,
		}
		err := service.UpdateArt(token, &uar)
		if err != nil {
			fmt.Println("更新标题发生错误,", err)
		} else {
			fmt.Println("更新成功")
		}
	},
}

实现比较简单,除了看命令行输出,还可以去小程序中查看实际结果。

更新文章关键字

如果想要更好的搜索结果,或者想要给文章分类,都可以添加关键字,关键字是搜索中的一个因子。例如,我的文章是描述的一个 go 教程,而标题中没有 go 的字眼,这是我在关键字中添加 go,就可以根据 go 搜索出这篇文章。关键字如此重要,所以我们要认真的定义,依据你的规则,你想要的效果来设计关键字。今天,我们实现这个功能,方便我们修改文章关键字。

修改文章关键字,我打算使用的命令格式如下:

gart keyword uuid newkeyword

其中,紧挨着 gart 的 keyword 是命令,表示要更新文章关键字,uuid 是文章的主键,可以查询识别是哪篇文章,newkeyword 就是要修改的文章关键字了,注意,这里是整个替换,所以你要加新的关键字,也把要保留的关键字加上去。

实现的代码如下:


func init() {
	rootCmd.AddCommand(uptKeywordCmd)
}

var uptKeywordCmd = &cobra.Command{
	Use:   "keyword",
	Short: "更新文章关键字,参数需要UUID,新的关键字。",
	Long:  `更新文章关键字,参数需要UUID,新的关键字,需要先获取文章的UUID。`,
	Args:  cobra.MinimumNArgs(2),
	Run: func(cmd *cobra.Command, args []string) {
		uuid := args[0]
		keyword := args[1]
		uar := service.UpdateArtReq{
			Uuid:    uuid,
			Keyword: keyword,
			UptType: 2,
		}
		err := service.UpdateArt(token, &uar)
		if err != nil {
			fmt.Println("更新关键字发生错误,", err)
		} else {
			fmt.Println("更新成功")
		}
	},
}

实现比较简单,除了看命令行输出,还可以去小程序中查看实际结果。

更新文章内容

当我们写好了文章,并上传到服务器,我们在修改调整本地 Markdown 文件后,服务器上的文章并不会更新,所以,如果你想要将更新的内容反馈到服务器上时,你可以修改文章的内容。今天,我们实现这个功能,方便我们修改文章内容。

修改文章内容,我打算使用的命令格式如下:

gart content uuid newfilename

其中,紧挨着 gart 的 content 是命令,表示要更新文章内容,uuid 是文章的主键,可以查询识别是哪篇文章,newfilename 是修改内容后的文件名称。

实现的代码如下:


func init() {
	rootCmd.AddCommand(uptContentCmd)
}

var uptContentCmd = &cobra.Command{
	Use:   "content",
	Short: "更新文章内容,参数需要UUID,新的文件内容。",
	Long:  `更新文章内容,参数需要UUID,新的文件内容,需要先获取文章的UUID。`,
	Args:  cobra.MinimumNArgs(2),
	Run: func(cmd *cobra.Command, args []string) {
		uuid := args[0]
		filename := args[1]
		content, err := service.GetFileContent(filename)
		if err != nil {
			fmt.Println("读取文件内容发生错误,", err)
			return
		}
		uar := service.UpdateArtReq{
			Uuid:    uuid,
			Content: string(content),
			UptType: 3,
		}
		err = service.UpdateArt(token, &uar)
		if err != nil {
			fmt.Println("更新内容发生错误,", err)
		} else {
			fmt.Println("更新成功")
		}
	},
}

实现比较简单,除了看命令行输出,还可以去小程序中查看实际结果。

是否将文章公开?

我们会有这样的需求,想将文章公开,这样其它的用户可以查询到你的文章,或者我们想将公开的文章重新设置为私密。今天,我们实现这个功能,方便我们修改文章是否公开。

注意,将文章公开,后台要进行审核,审核通过的文章其它用户才可以查询到。要公开的文章请以技术为主题,可以是技术文章,或者经验分享。文章的展示是以微信小程序为载体的,所以要符合小程序审核的要求。

修改文章是否公开,我打算使用的命令格式如下:

gart public uuid ispub

其中,紧挨着 gart 的 public 是命令,表示要更新文章是否公开,uuid 是文章的主键,可以查询识别是哪篇文章,ispub 只允许设置 0 或者 1,1 为公开。

实现的代码如下:


func init() {
	rootCmd.AddCommand(uptPublicCmd)
}

var uptPublicCmd = &cobra.Command{
	Use:   "public",
	Short: "更新文章是否公开,参数需要UUID,新的公开开关,只允许0或1,1为公开。",
	Long:  `更新文章是否公开,参数需要UUID,新的公开开关,只允许0或1,1为公开,需要先获取文章的UUID。`,
	Args:  cobra.MinimumNArgs(2),
	Run: func(cmd *cobra.Command, args []string) {
		uuid := args[0]
		ispub := utils.Str2Int(args[1])
		uar := service.UpdateArtReq{
			Uuid:    uuid,
			IsPub:   ispub,
			UptType: 4,
		}
		err := service.UpdateArt(token, &uar)
		if err != nil {
			fmt.Println("更新公开开关发生错误,", err)
		} else {
			fmt.Println("更新成功")
		}
	},
}

实现比较简单,除了看命令行输出,还可以去小程序中查看实际结果。

强制更新文章公开

当我的文章需要马上公开时,可以使用强制更新文章公开功能。这个功能需要消耗更多的豆子点数。

下载最新版本的命令行工具。

使用如下命令即可,请先获取文章的 UUID。

gart forcepub uuid

注意:文章内容必须合法合规,符合技术相关的主题。

是否将文章加锁?

我们会有这样的需求,想将文章加锁,这样其它的用户访问你将获得豆子点数奖励,或者我们想将加锁的文章重新设置为不加锁。今天,我们实现这个功能,方便我们修改文章是否加锁。

注意,将文章加锁,需要先将文章公开。

修改文章是否加锁,我打算使用的命令格式如下:

gart lock uuid islock

其中,紧挨着 gart 的 lock 是命令,表示要更新文章是否加锁,uuid 是文章的主键,可以查询识别是哪篇文章,islock 只允许设置 0 或者 1,1 为加锁。

实现的代码如下:


func init() {
	rootCmd.AddCommand(uptLockCmd)
}

var uptLockCmd = &cobra.Command{
	Use:   "lock",
	Short: "更新文章是否加锁,参数需要UUID,新的加锁开关,只允许0或1,1为加锁。",
	Long:  `更新文章是否加锁,参数需要UUID,新的加锁开关,只允许0或1,1为加锁,需要先获取文章的UUID。`,
	Args:  cobra.MinimumNArgs(2),
	Run: func(cmd *cobra.Command, args []string) {
		uuid := args[0]
		islock := utils.Str2Int(args[1])
		uar := service.UpdateArtReq{
			Uuid:    uuid,
			IsLock:  islock,
			UptType: 5,
		}
		err := service.UpdateArt(token, &uar)
		if err != nil {
			fmt.Println("更新加锁开关发生错误,", err)
		} else {
			fmt.Println("更新成功")
		}
	},
}

实现比较简单,除了看命令行输出,还可以去小程序中查看实际结果。

如何多个命令共用一个接口?

前面修改文章的几个命令,我们看到一个现象,它们共同调用了同一个函数 UpdateArt,我今天讲下,多个命令是如何做到调用同一个函数实现的?

先看下实现源码:


// 更新文章请求
type UpdateArtReq struct {
	Uuid    string `json:"uuid"`    // uuid
	Title   string `json:"title"`   // 题目
	Keyword string `json:"keyword"` // 关键字
	Content string `json:"content"` // 内容
	IsPub   int    `json:"ispub"`   // 是否公开
	IsLock  int    `json:"islock"`  // 是否加锁
	UptType int    `json:"utype"`   // 更新类型 1,题目 2,关键字 3,内容 4,是否公开 5,是否加锁
}

// 更新文章信息
func UpdateArt(token string, uar *UpdateArtReq) error {
	if token == "" {
		return errors.New("token不能为空")
	}

	url := fmt.Sprintf("%s/uptVArt?token=%s", OPEN_URL, token)

	reqBody := new(bytes.Buffer)

	json.NewEncoder(reqBody).Encode(uar)

	req, err := http.NewRequest("POST", url, reqBody)
	if err != nil {
		return err
	}

	req.Header.Set("Content-Type", "application/json")
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	data, err := io.ReadAll(resp.Body)
	if err != nil {
		return err
	}
	var result RespMsg
	err = json.Unmarshal(data, &result)
	if err != nil {
		return err
	}

	if result.Code == 1 {
		return nil
	} else {
		return errors.New(result.Msg)
	}
}

它的原理非常简单,定义一个结构体,保存所有要变更的字段信息,再新增一个字段定义变更类型,例如源码中的注释,后台根据这个字段类型,去修改对应的内容。

文章命令行工具开发部分基本就完成了,后续有新的功能或者优化再开新的文章。

感谢您的观看!