更新文章标题
有的时候,我们上传完文章之后,会发现我们的文章标题不合适,或想更好的描述文章内容。如果没有这个接口,我们需要删除文章,然后再重新上传。所以,我们实现这个功能,方便我们修改文章标题。
修改文章标题,我打算使用的命令格式如下:
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)
}
}
它的原理非常简单,定义一个结构体,保存所有要变更的字段信息,再新增一个字段定义变更类型,例如源码中的注释,后台根据这个字段类型,去修改对应的内容。
文章命令行工具开发部分基本就完成了,后续有新的功能或者优化再开新的文章。
感谢您的观看!