服務計算——CLI 命令行實用程序開發實戰 Agenda

本週的課程作業是開發一個Agenda項目,由於不要求組隊,所以老師簡化內容爲實現兩條指令即可。其中我完成了Register(註冊)和login(登陸)兩個功能:

  • 用戶註冊
  1. 註冊新用戶時,用戶需設置一個唯一的用戶名和一個密碼。另外,還需登記郵箱及電話信息。
  2. 如果註冊時提供的用戶名已由其他用戶使用,應反饋一個適當的出錯信息;成功註冊後,亦應反饋一個成功註冊的信息。 用戶登錄
  • 用戶登錄
  1. 用戶使用用戶名和密碼登錄 Agenda 系統。
  2. 用戶名和密碼同時正確則登錄成功並反饋一個成功登錄的信息。否則,登錄失敗並反饋一個失敗登錄的信息。

安裝Cobra

  1. 安裝依賴包
    在$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

在這裏插入圖片描述

設計程序

  1. 在程序目錄下,添加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")
}
  1. 測試:
    執行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
    在這裏插入圖片描述

  2. 項目結構
    如下所示:
    在這裏插入圖片描述
    項目傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章