Skip to content

Leeegal/Agenda-golang

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CLI 命令行实用程序开发实战 - Agenda


小组成员

李佳 15331151

李辉旭 15331150

李果 15331145


1、概述

  命令行实用程序并不是都象 cat、more、grep 是简单命令。go项目管理程序,类似 java 项目管理 maven、Nodejs 项目管理程序 npm、git 命令行客户端、 docker 与 kubernetes 容器管理工具等等都是采用了较复杂的命令行。即一个实用程序同时支持多个子命令,每个子命令有各自独立的参数,命令之间可能存在共享的代码或逻辑,同时随着产品的发展,这些命令可能发生功能变化、添加新命令等。因此,符合 OCP原则 的设计是至关重要的编程需求。

任务目标

1.熟悉 go 命令行工具管理项目 2.综合使用 go 的函数、数据结构与接口,编写一个简单命令行应用 agenda 3.使用面向对象的思想设计程序,使得程序具有良好的结构命令,并能方便修改、扩展新的命令,不会影响其他命令的代码 4.项目部署在 Github 上,合适多人协作,特别是代码归并 5.支持日志(原则上不使用debug调试程序)


tip1: 相关学习资料


tip2: 安装 cobra

使用命令 go get -v github.com/spf13/cobra/cobra 下载过程中,会出提示如下错误

Fetching https://golang.org/x/sys/unix?go-get=1

https fetch failed: Get https://golang.org/x/sys/unix?go-get=1: dial tcp 216.239.37.1:443: i/o timeout

这是熟悉的错误,请在 $GOPATH/src/golang.org/x 目录下用 git clone 下载 systext 项目,然后使用 go install github.com/spf13/cobra/cobra, 安装后在 $GOBIN 下出现了 cobra 可执行程序。

Cobra 的简单使用

创建一个处理命令 agenda register -uTestUseragenda register --user=TestUser 的小程序。

简要步骤如下:

cobra init

cobra add register

需要的文件就产生了。 你需要阅读 main.gomain() ; root.goExecute(); 最后修改 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=TestUser

register called by TestUser


2.agenda 开发项目

需求描述

  • 业务需求:见后面需求

  • 功能需求: 设计一组命令完成 agenda 的管理,例如:

agenda help :列出命令说明 agenda register -uUserName --password pass -email=[email protected] :注册用户 agenda help register :列出 register 命令的描述 agenda cm ... : 创建一个会议

原则上一个命令对应一个业务功能

  • 持久化要求:

使用 json 存储 User 和 Meeting 实体 当前用户信息存储在 curUser.txt 中

  • 开发需求:

团队:2-3人,一人作为 master 创建程序框架,其他人 fork 该项目,所有人同时开发。团队 不能少于 2 人 时间:两周完成

  • 项目目录

cmd :存放命令实现代码 entity :存放 User 和 Meeting 对象读写与处理逻辑

  • 其他目录 : 自由添加
  • 日志服务

使用 log 包记录命令执行情况


Agenda 业务需求

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

  • 用户登录 用户使用用户名和密码登录 Agenda 系统。 用户名和密码同时正确则登录成功并反馈一个成功登录的信息。否则,登录失败并反馈一个失败登录的信息。

  • 用户登出 已登录的用户登出系统后,只能使用用户注册和用户登录功能。

  • 用户查询 已登录的用户可以查看已注册的所有用户的用户名、邮箱及电话信息。

  • 用户删除

1.已登录的用户可以删除本用户账户(即销号)。

2.操作成功,需反馈一个成功注销的信息;否则,反馈一个失败注销的信息。

3.删除成功则退出系统登录状态。删除后,该用户账户不再存在。

4.用户账户删除以后:

以该用户为发起者的会议将被删除

以该用户为参与者的会议将从参与者列表中移除该用户。若因此造成会议参与者人数为0,则会议也将被删除。

  • 创建会议

1.已登录的用户可以添加一个新会议到其议程安排中。会议可以在多个已注册 用户间举行,不允许包含未注册用户。添加会议时提供的信息应包括:

会议主题(title)(在会议列表中具有唯一性)

会议参与者(participator)

会议起始时间(start time)

会议结束时间(end time)

2.注意,任何用户都无法分身参加多个会议。如果用户已有的会议安排(作为发起者或参与者)与将要创建的会议在时间上重叠 (允许仅有端点重叠的情况),则无法创建该会议。

3.用户应获得适当的反馈信息,以便得知是成功地创建了新会议,还是在创建过程中出现了某些错误。

  • 增删会议参与者。

1.已登录的用户可以向 自己发起的某一会议增加/删除 参与者 。

2.增加参与者时需要做 时间重叠 判断(允许仅有端点重叠的情况)。

3.删除会议参与者后,若因此造成会议 参与者 人数为0,则会议也将被删除。

  • 查询会议

1.已登录的用户可以查询自己的议程在某一时间段(time interval)内的所有会议安排。

2.用户给出所关注时间段的起始时间和终止时间,返回该用户议程中在指定时间范围内找到的所有会议安排的列表。

3.在列表中给出每一会议的起始时间、终止时间、主题、以及发起者和参与者。

4.注意,查询会议的结果应包括用户作为 发起者或参与者 的会议。

  • 取消会议

1.已登录的用户可以取消 自己发起 的某一会议安排。

2.取消会议时,需提供唯一标识:会议主题(title)。

  • 退出会议

1.已登录的用户可以退出 自己参与 的某一会议安排。

2.退出会议时,需提供一个唯一标识:会议主题(title)。若因此造成会议 参与者人数为0,则会议也将被删除。

  • 清空会议

已登录的用户可以清空 自己发起 的所有会议安排。


使用 === 表示一级标题,使用 --- 表示二级标题。

示例:

这是一个一级标题
============================

这是一个二级标题
--------------------------------------------------

### 这是一个三级标题

你也可以选择在行首加井号表示不同级别的标题 (H1-H6),例如:# H1, ## H2, ### H3,#### H4。

3. 外链接

使用 [描述](链接地址) 为文字增加外链接。

示例:

这是去往 本人博客 的链接。

4. 无序列表

使用 *,+,- 表示无序列表。

示例:

  • 无序列表项 一
  • 无序列表项 二
  • 无序列表项 三

5. 有序列表

使用数字和点表示有序列表。

示例:

  1. 有序列表项 一
  2. 有序列表项 二
  3. 有序列表项 三

6. 文字引用

使用 > 表示文字引用。

示例:

野火烧不尽,春风吹又生。

7. 行内代码块

使用 `代码` 表示行内代码块。

示例:

让我们聊聊 html

8. 代码块

使用 四个缩进空格 表示代码块。

示例:

这是一个代码块,此行左侧有四个不可见的空格。

9. 插入图像

使用 ![描述](图片链接地址) 插入图像。

示例:

我的头像

Cmd Markdown 高阶语法手册

1. 内容目录

在段落中填写 [TOC] 以显示全文内容的目录结构。

[TOC]

2. 标签分类

在编辑区任意行的列首位置输入以下代码给文稿标签:

标签: 数学 英语 Markdown

或者

Tags: 数学 英语 Markdown

3. 删除线

使用 ~~ 表示删除线。

这是一段错误的文本。

4. 注脚

使用 [^keyword] 表示注脚。 使用 === 表示一级标题,使用 --- 表示二级标题。

示例:

这是一个一级标题
============================

这是一个二级标题
--------------------------------------------------

### 这是一个三级标题

你也可以选择在行首加井号表示不同级别的标题 (H1-H6),例如:# H1, ## H2, ### H3,#### H4。

3. 外链接

使用 [描述](链接地址) 为文字增加外链接。

示例:

这是去往 本人博客 的链接。

4. 无序列表

使用 *,+,- 表示无序列表。

示例:

  • 无序列表项 一
  • 无序列表项 二
  • 无序列表项 三

5. 有序列表

使用数字和点表示有序列表。

示例:

  1. 有序列表项 一
  2. 有序列表项 二
  3. 有序列表项 三

6. 文字引用

使用 > 表示文字引用。

示例:

野火烧不尽,春风吹又生。

7. 行内代码块

使用 `代码` 表示行内代码块。

示例:

让我们聊聊 html

8. 代码块

使用 四个缩进空格 表示代码块。

示例:

这是一个代码块,此行左侧有四个不可见的空格。

9. 插入图像

使用 ![描述](图片链接地址) 插入图像。

示例:

我的头像

Cmd Markdown 高阶语法手册

1. 内容目录

在段落中填写 [TOC] 以显示全文内容的目录结构。

[TOC]

2. 标签分类

在编辑区任意行的列首位置输入以下代码给文稿标签:

标签: 数学 英语 Markdown

或者

Tags: 数学 英语 Markdown

3. 删除线

使用 ~~ 表示删除线。

这是一段错误的文本。

4. 注脚

使用 [^keyword] 表示注脚。

这是一个注脚[^footnote]的样例。

这是第二个注脚[^footnote2]的样例。

5. LaTeX 公式

$ 表示行内公式:

质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。

$$ 表示整行公式:

$$\sum_{i=1}^n a_i=0$$

$$f(x_1,x_x,\ldots,x_n) = x_1^2 + x_2^2 + \cdots + x_n^2 $$

$$\sum^{j-1}{k=0}{\widehat{\gamma}{kj} z_k}$$

访问 MathJax 参考更多使用方法。

6. 加强的代码块

支持四十一种编程语言的语法高亮的显示,行号显示。

非代码示例:

$ sudo apt-get install vim-gnome

Python 示例:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None

class SomeClass:
    pass

>>> message = '''interpreter
... prompt'''

JavaScript 示例:

/**
* nth element in the fibonacci series.
* @param n >= 0
* @return the nth element, >= 0.
*/
function fib(n) {
  var a = 1, b = 1;
  var tmp;
  while (--n >= 0) {
    tmp = a;
    a += b;
    b = tmp;
  }
  return a;
}

document.write(fib(10));

7. 流程图

示例

这是一个注脚[^footnote]的样例。

这是第二个注脚[^footnote2]的样例。

5. LaTeX 公式

$ 表示行内公式:

质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。

$$ 表示整行公式:

$$\sum_{i=1}^n a_i=0$$

$$f(x_1,x_x,\ldots,x_n) = x_1^2 + x_2^2 + \cdots + x_n^2 $$ 使用 === 表示一级标题,使用 --- 表示二级标题。

示例:

这是一个一级标题
============================

这是一个二级标题
--------------------------------------------------

### 这是一个三级标题

你也可以选择在行首加井号表示不同级别的标题 (H1-H6),例如:# H1, ## H2, ### H3,#### H4。

3. 外链接

使用 [描述](链接地址) 为文字增加外链接。

示例:

这是去往 本人博客 的链接。

4. 无序列表

使用 *,+,- 表示无序列表。

示例:

  • 无序列表项 一
  • 无序列表项 二
  • 无序列表项 三

5. 有序列表

使用数字和点表示有序列表。

示例:

  1. 有序列表项 一
  2. 有序列表项 二
  3. 有序列表项 三

6. 文字引用

使用 > 表示文字引用。

示例:

野火烧不尽,春风吹又生。

7. 行内代码块

使用 `代码` 表示行内代码块。

示例:

让我们聊聊 html

8. 代码块

使用 四个缩进空格 表示代码块。

示例:

这是一个代码块,此行左侧有四个不可见的空格。

9. 插入图像

使用 ![描述](图片链接地址) 插入图像。

示例:

我的头像

Cmd Markdown 高阶语法手册

1. 内容目录

在段落中填写 [TOC] 以显示全文内容的目录结构。

[TOC]

2. 标签分类

在编辑区任意行的列首位置输入以下代码给文稿标签:

标签: 数学 英语 Markdown

或者

Tags: 数学 英语 Markdown

3. 删除线

使用 ~~ 表示删除线。

这是一段错误的文本。

4. 注脚

使用 [^keyword] 表示注脚。

这是一个注脚[^footnote]的样例。

这是第二个注脚[^footnote2]的样例。

5. LaTeX 公式

$ 表示行内公式:

质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。

$$ 表示整行公式:

$$\sum_{i=1}^n a_i=0$$

$$f(x_1,x_x,\ldots,x_n) = x_1^2 + x_2^2 + \cdots + x_n^2 $$

$$\sum^{j-1}{k=0}{\widehat{\gamma}{kj} z_k}$$

访问 MathJax 参考更多使用方法。

6. 加强的代码块

支持四十一种编程语言的语法高亮的显示,行号显示。

非代码示例:

$ sudo apt-get install vim-gnome

Python 示例:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None

class SomeClass:
    pass

>>> message = '''interpreter
... prompt'''

JavaScript 示例:

/**
* nth element in the fibonacci series.
* @param n >= 0
* @return the nth element, >= 0.
*/
function fib(n) {
  var a = 1, b = 1;
  var tmp;
  while (--n >= 0) {
    tmp = a;
    a += b;
    b = tmp;
  }
  return a;
}

document.write(fib(10));

7. 流程图

示例

使用 === 表示一级标题,使用 --- 表示二级标题。

示例:

这是一个一级标题
============================

这是一个二级标题
--------------------------------------------------

### 这是一个三级标题

你也可以选择在行首加井号表示不同级别的标题 (H1-H6),例如:# H1, ## H2, ### H3,#### H4。

3. 外链接

使用 [描述](链接地址) 为文字增加外链接。

示例:

这是去往 本人博客 的链接。

4. 无序列表

使用 *,+,- 表示无序列表。

示例:

  • 无序列表项 一
  • 无序列表项 二
  • 无序列表项 三

5. 有序列表

使用数字和点表示有序列表。

示例:

  1. 有序列表项 一
  2. 有序列表项 二
  3. 有序列表项 三

6. 文字引用

使用 > 表示文字引用。

示例:

野火烧不尽,春风吹又生。

7. 行内代码块

使用 `代码` 表示行内代码块。

示例:

让我们聊聊 html

8. 代码块

使用 四个缩进空格 表示代码块。

示例:

这是一个代码块,此行左侧有四个不可见的空格。

9. 插入图像

使用 ![描述](图片链接地址) 插入图像。

示例:

我的头像

Cmd Markdown 高阶语法手册

1. 内容目录

在段落中填写 [TOC] 以显示全文内容的目录结构。

[TOC]

2. 标签分类

在编辑区任意行的列首位置输入以下代码给文稿标签:

标签: 数学 英语 Markdown

或者

Tags: 数学 英语 Markdown

3. 删除线

使用 ~~ 表示删除线。

这是一段错误的文本。

4. 注脚

使用 [^keyword] 表示注脚。

这是一个注脚[^footnote]的样例。

这是第二个注脚[^footnote2]的样例。

5. LaTeX 公式

$ 表示行内公式:

质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。

$$ 表示整行公式:

$$\sum_{i=1}^n a_i=0$$

$$f(x_1,x_x,\ldots,x_n) = x_1^2 + x_2^2 + \cdots + x_n^2 $$

$$\sum^{j-1}{k=0}{\widehat{\gamma}{kj} z_k}$$

访问 MathJax 参考更多使用方法。

6. 加强的代码块

支持四十一种编程语言的语法高亮的显示,行号显示。

非代码示例:

$ sudo apt-get install vim-gnome

Python 示例:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None

class SomeClass:
    pass

>>> message = '''interpreter
... prompt'''

JavaScript 示例:

/**
* nth element in the fibonacci series.
* @param n >= 0
* @return the nth element, >= 0.
*/
function fib(n) {
  var a = 1, b = 1;
  var tmp;
  while (--n >= 0) {
    tmp = a;
    a += b;
    b = tmp;
  }
  return a;
}

document.write(fib(10));

7. 流程图

示例

$$\sum^{j-1}{k=0}{\widehat{\gamma}{kj} z_k}$$

访问 MathJax 参考更多使用方法。

6. 加强的代码块

支持四十一种编程语言的语法高亮的显示,行号显示。

非代码示例:

$ sudo apt-get install vim-gnome

Python 示例:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None

class SomeClass:
    pass

>>> message = '''interpreter
... prompt'''

JavaScript 示例:

/**
* nth element in the fibonacci series.
* @param n >= 0
* @return the nth element, >= 0.
*/
function fib(n) {
  var a = 1, b = 1;
  var tmp;
  while (--n >= 0) {
    tmp = a;
    a += b;
    b = tmp;
  }
  return a;
}

document.write(fib(10));

About

CLI 命令行实用程序开发实战 - Agenda

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%