Week7-CLI命令行实用程序开发实战

Agenda的代码

源代码见我的Github

一、安装cobra并完成小案例

安装

打开CentOS虚拟机的终端,使用命令go get -v github.com/spf13/cobra/cobra安装cobra。
安装过程出现了错误:

  1. 先进入$GOPATH/src/golang.org/x目录下用 git clone 下载 sys 和 text 项目。命令如下:
    git clone https://github.com/golang/text
    git clone https://github.com/golang/sys
    
    在这里插入图片描述
  2. 使用命令go install github.com/spf13/cobra/cobra, 安装后在 $GOBIN 下出现了 cobra 可执行程序。
    在这里插入图片描述
cobra的使用案例

1.生成demo项目
(1)由于cobra只能够在gopath的目录下使用,因此我们需要先进入到gopath 的src文件夹中。在src目录下,我们可以使用cobra init demo --pkgname=demo这一条指令来新建一个demo.
*注:网站所说的cobra init是在空的已建好的demo文件夹中运行。
在这里插入图片描述
(2)进入demo目录,使用指令cobra add register,增加一个名为register的操作。
在这里插入图片描述
2.修改register.go
阅读【main.go】和【root.go】、【register.go】三个文件可得知
然后我们可以通过修改【register.go】来添加相应的操作。
(1)init() 添加:

registerCmd.Flags().StringP("user", "u", "Anonymous", "Help message for username")

(2)Run 匿名回调函数中添加:

username, _ := cmd.Flags().GetString("user")
fmt.Println("register called by " + username)

3.测试命令
使用以下命令测试:

go run main.go register --user=TestUser
register called by TestUser

出现register被调用的输出,结果正确:
在这里插入图片描述

二、Agenda的简单实现

要求:实现2条指令即可,不需要协作。

目录结构
  • cmd目录存放命令实现代码
  • data目录存放agenda用户信息和日志文件
  • deepcopy目录存放复制文件
  • entity目录存放User和Meeting对象读写和处理代码
  • loghelp目录存放log代码
  • service目录存放可提供操作的代码
实现指令

由于之前已经实现了register用户注册指令,所以这里实现login和logout两条指令。

【login用户登录】

1.读取参数
用户登录只需要输入username和password,而且非空。如果当前已经有用户登录,会提示先logout。用户名存在和密码正确则登录成功,否则登录失败。
login.go代码如下:

package cmd

import (
	"fmt"
	"github.com/shanzhulizhi/agenda/service"
	"github.com/spf13/cobra"
)

var (
	username *string
	password *string
)
// loginCmd represents the login command
var loginCmd = &cobra.Command{
	Use:   "login",
	Short: "For User To Login",
	Run: func(cmd *cobra.Command, args []string) {
		tmpu, _ := cmd.Flags().GetString("username")
		tmppw, _ := cmd.Flags().GetString("password")

		if tmpu == "" || tmppw == "" {
			fmt.Println("Input the username[-u],password[-p]")
			return;
		}
		if _, flag := service.GetCurUser(); flag == true {
			fmt.Println("Please logout firstly")
			return
		}
		if tf := service.UserLogin(tmpu,tmppw); tf == true {
			fmt.Println("Login Successfully!")
		} else {
			fmt.Println("Login Fail: wront username or password")
		}
		return
	},
}

func init() {
	rootCmd.AddCommand(loginCmd)
	loginCmd.Flags().StringP("username","u","","agenda account username")
	loginCmd.Flags().StringP("password","p","","agenda account password")
}

2.检查当前用户和用户登录
agnedaservice用entity的函数来判断登录是否合法。主要函数如下:

func GetCurUser() (entity.User, bool) {
	if cu, err := entity.GetCurUser(); err != nil {
		return cu, false
	} else {
		return cu, true
	}
}
/Login
func UserLogin(username, password string) bool  {
	user := entity.QueryUser(func (u *entity.User) bool {
		if u.Name == username && u.Password == password {
			return true
		}
		return false
	})
	if len(user) == 0 {
		errLog.Println("Login: User not exist")
		return false
	}
	entity.SetCurUser(&user[0])
	if err := entity.Sync(); err != nil {
		errLog.Println("Login: error happened when set curuser")
		return false
	}
	return true
}
【logout用户退出】

1.读取参数
和登录类似,只是不需要参数。logout.go的代码如下:

package cmd

import (
	"fmt"
	"github.com/shanzhulizhi/agenda/service"
	"github.com/spf13/cobra"
)

// logoutCmd represents the logout command
var logoutCmd = &cobra.Command{
	Use:   "logout",
	Short: "For User To Logout",
	Run: func(cmd *cobra.Command, args []string) {
		if err := service.UserLogout(); err != true {
			fmt.Println("Error happened, please check the error log")
		} else {
			fmt.Println("Logout Successfully!")
		}
	},
}

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

2.设置当前登录用户为空
退出无需参数。

//Logout
func UserLogout() bool {
	if err := entity.Logout(); err != nil {
		return false
	} else {
		return true
	}
}
运行结果

【编译】
在agenda目录下运行go build
【用户注册】
已经存在的用户名注册失败和注册成功的情况如下:
在这里插入图片描述在这里插入图片描述
【用户登录】
登录失败和登录成功的情况如下:
在这里插入图片描述
【用户退出】
用户退出的情况:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值