Agenda的代码
源代码见我的Github
一、安装cobra并完成小案例
安装
打开CentOS虚拟机的终端,使用命令go get -v github.com/spf13/cobra/cobra
安装cobra。
安装过程出现了错误:
- 先进入$GOPATH/src/golang.org/x目录下用 git clone 下载 sys 和 text 项目。命令如下:
git clone https://github.com/golang/text git clone https://github.com/golang/sys
- 使用命令
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
。
【用户注册】
已经存在的用户名注册失败和注册成功的情况如下:
【用户登录】
登录失败和登录成功的情况如下:
【用户退出】
用户退出的情况: