【服务计算】Agend小程序开发作业心得

安装cobra并完成小案例

什么是cobra

cobra: 一个用生成程序应用和命令行文件的程序
具体可参见golang命令行库cobra的使用

项目目录创建

可参考我之前的博客潘老师的课程网站

安装cobra

同样由于https://golang.org的访问问题,我们首先需要下载其中cobra需要的依赖

  • 下载依赖

    $ cd $GOPATH/src/github.com/golang
    $ git clone https://github.com/golang/sys.git
    $ git clone https://github.com/golang/text.git
    
  • 克隆完成后,复制到相应目录

    $ cp $GOPATH/src/github.com/golang/sys $GOPATH/src/golang.org/x/ -rf
    $ cp $GOPATH/src/github.com/golang/text $GOPATH/src/golang.org/x/ -rf
    
  • 编译cobra

    $ go get -v github.com/spf13/cobra/cobra
    
  • 安装cobra

    $ go install github.com/spf13/cobra/cobra
    
  • 安装后,在$GOPATH/bin下出现了可执行程序
    cobra-installed

使用cobra生成应用程序

例如,

  • 创建一个基于CLI的命令程序agenda:

    $ cd $GOPATH/src
    $ cobra init agenda --pkg-name agenda
    

cobra-init-directory

  • 添加register.go文件

    $ cd agenda
    $ cobra add register
    

tree-agenda

  • 修改register.go的代码

    • init()函数中添加如下内容:

      registerCmd.Flags().StringP("user", "u", "Anonymous", "Help message for username")
      
    • Run匿名回调函数中添加:

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

    $ go run main.go register --user=wyb
    

register-test
register-test2

agenda开发实战

通过上面测试案例,我们已能感受到利用cobra开发命令行程序的方便性。由于本次作业只要求实现两条命令,这也就大大降低了开发难度。

Agenda业务需求

Agenda主要有以下两个功能

  • 用户注册
    • 注册新用户时,用户需设置一个唯一的用户名和一个密码。另外,还需登记邮箱及电话信息
    • 如果注册时提供的用户名已由其他用户使用,应反馈一个适当的出错信息;成功注册后,亦应反馈一个成功注册的信息
  • 用户登录
    • 用户使用用户名和密码登录 Agenda 系统
    • 用户名和密码同时正确则登录成功并反馈一个成功登录的信息。否则,登录失败并反馈一个失败登录的信息

agenda程序设计

code root.go,修改变量rootCmd中的ShortLong的描述性内容。
另外,viper是cobra集成的配置文件读取的库,这里不需要使用,我们可以注释掉(不注释可能生成的应用程序很大)

用户注册

添加子程序

$ cd agenda
$ cobra add register

设置命令行参数

code register.go,修改变量registerCmd中的ShortLong的描述性内容,在init()函数中设置命令行参数

	registerCmd.Flags().StringP("user", "u", "", "Help message for username")
	registerCmd.Flags().StringP("password", "p", "", "Help message for password")
	registerCmd.Flags().StringP("email", "e", "", "Help message for email")

检查参数合理性

	username, _ := cmd.Flags().GetString("user")
	password, _ := cmd.Flags().GetString("password")
	emailaddr, _ := cmd.Flags().GetString("email")
	if len(username) == 0 {
		fmt.Println("Error: Username must be set")
		cmd.Help()
		return
	}
	if len(password) == 0 {
		fmt.Println("Error: Password must be set")
		cmd.Help()
		return
	}
	if len(emailaddr) == 0 {
		fmt.Println("Error: Email address must be set")
		cmd.Help()
		return
	}
	//检查邮箱地址合理性
	matched, _ := regexp.MatchString(`[\w-]+@[\w]+(?:\.[\w]+)+`, emailaddr)
	if matched == false {
		fmt.Println("Error: Your email address is invalid, please check")
		return
	}

友情提示:检查邮箱地址合理性时可直接借助regexp包(需import),具体实现:

matched, _ := regexp.MatchString(`[\w-]+@[\w]+(?:\.[\w]+)+`, emailaddr)

检查用户名唯一性

//check if username was unique
if fileObjR, errR := os.OpenFile("users.txt", os.O_RDONLY|os.O_CREATE, 0644); errR == nil {
	defer fileObjR.Close()
	if contents, err := ioutil.ReadAll(fileObjR); err == nil {
		result := strings.Replace(string(contents), "\n", "", 0)
		infos := strings.Split(result, "\n")
		for i := 0; i < len(infos); i += 3 {
			if username == infos[i] {
				fmt.Println("Error: This username has been used, please choose another one")
				return
			}
		}
	}
}

用户登录

添加子程序

$ cd agenda
$ cobra add login

设置命令行参数

code login.go,修改变量loginCmd中的ShortLong的描述性内容,在init()函数中设置命令行参数

	loginCmd.Flags().StringP("user", "u", "", "Help message for username")
	loginCmd.Flags().StringP("password", "p", "", "Help message for password")

检查参数合理性

	username, _ := cmd.Flags().GetString("user")
	password, _ := cmd.Flags().GetString("password")
	if len(username) == 0 {
		fmt.Println("Error: Username must be set")
		cmd.Help()
		return
	}
	if len(password) == 0 {
		fmt.Println("Error: Password must be set")
		cmd.Help()
		return
	}

检查用户名是否存在及密码正确性

//check if password for username was correct
if fileObjR, errR := os.OpenFile("users.txt", os.O_RDONLY|os.O_CREATE, 0644); errR == nil {
	defer fileObjR.Close()
	if contents, err := ioutil.ReadAll(fileObjR); err == nil {
		result := strings.Replace(string(contents), "\n", "", 0)
		infos := strings.Split(result, "\n")
		for i := 0; i < len(infos); i += 3 {
			if username == infos[i] {
				if password == infos[i+1] {
					fmt.Println("Succeed:  user " + username + " login successfully")
					return
				}
				fmt.Println("Fail: password incorrect, please try again")
				return
			}
		}
		fmt.Println("Fail: you are not registered, please register first")
	}
}

安装agenda程序

$ go install agenda

运行测试

  1. agenda help
    agenda-help
  2. agenda register -h
    register-help
  3. agenda login -h
    login-help
  4. agenda register -u wyb -p 0805 -e 19970805@163.com
    register-success
    相应错误测试
    未设置用户名agenda register -p 0805 -e 19970805@163.com
    register-error1
    未设置密码agenda register -u web -e 19970805@163.com
    register-error2
    未设置邮箱agenda register -u web -p 0805
    register-error3
    邮箱地址不合法agenda register -u web -p 0805 -e 19970805
    register-error4
    用户名重复agenda register -u wyb -p 1997 -e 0805@163.com
    register-error5
  5. agenda login -u wyb -p 0805
    login
    相应错误测试
    用户名不存在agenda login -u aaa -p 0805
    login-fail1
    密码错误agenda login -u wyb -p 1997
    login-fail2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值