服务计算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生成应用程序
例如,
-
创建一个基于CLI的命令程序agenda:
$ cd $GOPATH/src $ cobra init agenda --pkg-name agenda
-
添加
register.go
文件$ cd agenda $ cobra add register
-
修改
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
agenda开发实战
通过上面测试案例,我们已能感受到利用cobra开发命令行程序的方便性。由于本次作业只要求实现两条命令,这也就大大降低了开发难度。
Agenda业务需求
Agenda主要有以下两个功能
- 用户注册
- 注册新用户时,用户需设置一个唯一的用户名和一个密码。另外,还需登记邮箱及电话信息
- 如果注册时提供的用户名已由其他用户使用,应反馈一个适当的出错信息;成功注册后,亦应反馈一个成功注册的信息
- 用户登录
- 用户使用用户名和密码登录 Agenda 系统
- 用户名和密码同时正确则登录成功并反馈一个成功登录的信息。否则,登录失败并反馈一个失败登录的信息
agenda程序设计
code root.go
,修改变量rootCmd
中的Short
和Long
的描述性内容。
另外,viper是cobra集成的配置文件读取的库,这里不需要使用,我们可以注释掉(不注释可能生成的应用程序很大)
用户注册
添加子程序
$ cd agenda
$ cobra add register
设置命令行参数
code register.go
,修改变量registerCmd
中的Short
和Long
的描述性内容,在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
中的Short
和Long
的描述性内容,在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
运行测试
agenda help
agenda register -h
agenda login -h
agenda register -u wyb -p 0805 -e 19970805@163.com
相应错误测试:
未设置用户名agenda register -p 0805 -e 19970805@163.com
未设置密码agenda register -u web -e 19970805@163.com
未设置邮箱agenda register -u web -p 0805
邮箱地址不合法agenda register -u web -p 0805 -e 19970805
用户名重复agenda register -u wyb -p 1997 -e 0805@163.com
agenda login -u wyb -p 0805
相应错误测试:
用户名不存在agenda login -u aaa -p 0805
密码错误agenda login -u wyb -p 1997