本週的課程作業是開發一個Agenda項目,由於不要求組隊,所以老師簡化內容爲實現兩條指令即可。其中我完成了Register(註冊)和login(登陸)兩個功能:
- 用戶註冊
- 註冊新用戶時,用戶需設置一個唯一的用戶名和一個密碼。另外,還需登記郵箱及電話信息。
- 如果註冊時提供的用戶名已由其他用戶使用,應反饋一個適當的出錯信息;成功註冊後,亦應反饋一個成功註冊的信息。 用戶登錄
- 用戶登錄
- 用戶使用用戶名和密碼登錄 Agenda 系統。
- 用戶名和密碼同時正確則登錄成功並反饋一個成功登錄的信息。否則,登錄失敗並反饋一個失敗登錄的信息。
安裝Cobra
- 安裝依賴包
在$GOPATH/src/golang.org/x目錄下,下載sys和text項目:
git clone https://github.com/golang/sys
git clone https://github.com/golang/text
執行 go get -v github.com/spf13/cobra/cobra
安裝成功後,$GOPATH/bin下會生成cobra可執行程序
2. 創建程序
創建目錄App1並初始化:
mkdir -p App1
cd App1
cobra init --pkg-name github.com/github-user/App1
設計程序
- 在程序目錄下,添加register、login兩個文件:
cobra add register
cobra add login
2. 創建一個新的文件夾entity, 存放程序的實體信息
3. rigister.go的內容如下:
package cmd
import (
"App1/entity"
"log"
"github.com/spf13/cobra"
)
var registerCmd = &cobra.Command{
Use: "register",
Short: "A brief description of your command",
Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
Run: func(cmd *cobra.Command, args []string) {
_username, _ := cmd.Flags().GetString("user")
_password, _ := cmd.Flags().GetString("password")
_email, _ := cmd.Flags().GetString("email")
_phone, _ := cmd.Flags().GetString("phone")
log.Println("register called by "+_username, _password, _email, _phone)
if _username == "default user" {
log.Println("username can't be empty,plz try again")
return
}
users := entity.READUSERS()
for i := 0; i < len(users); i++ {
if users[i].Username == _username {
log.Println("username already registered")
return
}
}
aUser := entity.User{Username: _username, Password: _password, Email: _email, Phone: _phone}
users = append(users, aUser)
entity.WRITEUSER(users)
},
}
func init() {
rootCmd.AddCommand(registerCmd)
registerCmd.Flags().StringP("user", "u", "default user", "Help message for username")
registerCmd.Flags().StringP("password", "P", "123456", "password for user")
registerCmd.Flags().StringP("email", "e", "[email protected]", "email of user")
registerCmd.Flags().StringP("phone", "p", "18700011134", "phone of the user")
}
login.go:
package cmd
import (
"App1/entity"
"log"
"github.com/spf13/cobra"
)
var loginCmd = &cobra.Command{
Use: "login",
Short: "A brief description of your command",
Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
Run: func(cmd *cobra.Command, args []string) {
_userName_, _ := cmd.Flags().GetString("user")
_password_, _ := cmd.Flags().GetString("pass")
users := entity.READUSERS()
for _, user := range users {
if user.Username == _userName_ {
//密碼匹配
if user.Password == _password_ {
entity.SetCurrentUserName(_userName_)
log.Println("Log in Success!")
log.Println("Welcome! " + _userName_)
return
} else { //密碼錯誤
log.Println("Warning! Wrong Password")
return
}
}
}
log.Println("Warning! Wrong UserName")
return
},
}
func init() {
rootCmd.AddCommand(loginCmd)
loginCmd.Flags().StringP("user", "u", "", "log in")
loginCmd.Flags().StringP("pass", "p", "", "log in")
}
-
測試:
執行go run App1
go run App1 register -u usrname -p password -e email -p pnumber
註冊用戶go run App1 login -u usrname -p password
用戶登陸重複註冊,則會出現報錯:username already registered
-
項目結構
如下所示:
項目傳送門