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

2023-11-07

实验内容

  • 功能需求: 设计一组命令完成 agenda 的管理,例如:
    • agenda help :列出命令说明
    • agenda register -uUserName –password pass –email=a@xxx.com :注册用户
    • agenda help register :列出 register 命令的描述
    • agenda cm … : 创建一个会议

本次Agenda是一次简化式的实验,因此仅要求实现两条指令,我选择的是实现agenda register以及agenda login这两条指令

实验过程

安装必要的包

本次实验要求采用cobra实现,因此,需要首先安装cobra,可通过以下指令安装:
go get -v github.com/spf13/cobra/cobra
成功安装后,要注意,在go-online中,cobra的位置,我们可以首先使用echo $GOPATH查看GOPATH的位置,如下:
在这里插入图片描述
cobra 就位于/home/go-online/go-online-dep/bin/cobra

初始化并添加相应指令

初始化指令如下:
/home/go-online/go-online-dep/bin/cobra init --pkg-name agenda
添加相应的指令:
/home/go-online/go-online-dep/bin/cobra add register
/home/go-online/go-online-dep/bin/cobra add login

完善指令

register

agenda/cmd/register.go中,我们将代码完善如下:

/*
Copyright © 2019 NAME HERE <EMAIL ADDRESS>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package cmd

import (
	"fmt"
    "git.go-online.org.cn/henryumi/agenda/entity"
	"github.com/spf13/cobra"
)

// registerCmd represents the register command
var registerCmd = &cobra.Command{
	Use:   "register",
	Short: "resister",
	Long: "agenda registr -u [username] -p [password] -e [email] -h [phone]",
	Run: func(cmd *cobra.Command, args []string) {
		//fmt.Println("register called")
        usern,_ := cmd.Flags().GetString("username")
        pass,_ := cmd.Flags().GetString("password")
        email,_ := cmd.Flags().GetString("email")
        phone,_ := cmd.Flags().GetString("phone")
        state := entity.Register(usern,pass,email,phone)
        if state == 0{
            fmt.Println("A same username have been used")
        }else if(state == 1){
            fmt.Println("register succeed")
           // entity.saveFile()
        }else if(state == 2){
            fmt.Println("agenda registr -u [username] -p [password] -e [email] -h [phone]")
        }
	},
}

func init() {
	rootCmd.AddCommand(registerCmd)
    entity.ReadFile()
    registerCmd.Flags().StringP("username","u","","")
    registerCmd.Flags().StringP("password","p","","")
    registerCmd.Flags().StringP("email","e","","")
    registerCmd.Flags().StringP("phone","t","","")
	// Here you will define your flags and configuration settings.

	// Cobra supports Persistent Flags which will work for this command
	// and all subcommands, e.g.:
	// registerCmd.PersistentFlags().String("foo", "", "A help for foo")

	// Cobra supports local flags which will only run when this command
	// is called directly, e.g.:
	// registerCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

init函数中,使用Flags绑定参数,在registerCmd中,实现具体的函数,通过调用我在agenda/entity/file.go中定义的注册函数来实现用户注册功能,并且通过返回值判断是否正确注册,若发生错误,则输出错误的内容。

login

agenda/cmd/login.go中,我们将代码完善如下:

/*
Copyright © 2019 NAME HERE <EMAIL ADDRESS>

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package cmd

import (
    "os"
	"fmt"
    "git.go-online.org.cn/henryumi/agenda/entity"
	"github.com/spf13/cobra"
)

// loginCmd represents the login command
var loginCmd = &cobra.Command{
	Use:   "login",
	Short: "login",
	Long: "agenda login -u [username] -p [password]",
	Run: func(cmd *cobra.Command, args []string) {
		//fmt.Println("login called")
        usern,_ := cmd.Flags().GetString("username")
        pass,_ := cmd.Flags().GetString("password")
        state := entity.Login(usern,pass)
        if state == 0{
            fmt.Println("The user doesn't exit")
        }else if(state == 1){
            fmt.Fprintf(os.Stdout,"%s login succeed\n",usern)
           // entity.saveFile()
        }else if(state == 2){
            fmt.Println("the username can't match with the password")
        }
	},
}

func init() {
	rootCmd.AddCommand(loginCmd)
    entity.ReadFile()
    loginCmd.Flags().StringP("username","u","","")
    loginCmd.Flags().StringP("password","p","","")
	// Here you will define your flags and configuration settings.

	// Cobra supports Persistent Flags which will work for this command
	// and all subcommands, e.g.:
	// loginCmd.PersistentFlags().String("foo", "", "A help for foo")

	// Cobra supports local flags which will only run when this command
	// is called directly, e.g.:
	// loginCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

这部分的实现与上文的register相似,只是绑定的参数,以及run中调用的函数发生变化

entity中相应函数的实现

这一部分我认为是本次实验的主要内容,负责了注册以及登陆的逻辑功能

注册函数如下

func Register(name,passw,mail,phone string) int{
    var user User
    user.Username = name
    user.Password = passw
    user.Email = mail
    user.Phone = phone
    if name == ""{
        return 2
    }
    if is_exits(&user){
        return 0
    }else{
        total = append(total,user)
        saveFile()
        return 1
    }
}

该函数通过判断是否已有已注册同名用户来判断是否允许注册,判断函数如下:

func is_exits(user * User) bool{
    for i := 0;i < len(total);i ++{
        if total[i].Username == user.Username{
            return true
        }
    }
    return false
}

login登陆函数如下:

func Login(name,passw string) int{
    var user User
    user.Username = name
    user.Password = passw
    if !is_exits(&user){
        return 0
    }else{
        if is_true(&user){
            return 1
        }else{
            return 2
        }
    }
}

该登陆函数,需要两次判断,一次判断用户是否存在,第二次判断若存在,密码是否匹配,以此来进行错误反馈,判断密码是否匹配的函数如下:

func is_true(user *User) bool{
    for i := 0;i < len(total);i ++{
        if total[i].Username == user.Username{
            if(total[i].Password == user.Password){
                return true
            }else{
                return false
            }
        }
    }
    return false 
}

以上即为本次实验的主要内容

测试

注意,在go-online上的程序想要正确运行,需要先执行su指令,并输入密码
首先是注册功能,我先登陆一个不存在的用户:
在这里插入图片描述
提示并不存在该用户

进行注册:
在这里插入图片描述
注册成功,尝试登陆:
在这里插入图片描述
提示成功登陆

故意输入错误的密码:
在这里插入图片描述
得到了相应的错误提示

测试完毕

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CLI 命令行实用程序开发实战 - Agenda 的相关文章

  • C++ 代码评审最终指南——第 2 部分

    在第 1 部分中 我们对代码评审做了一个广泛讨论 这一部分将重点讨论 C 提供一个代码评审清单和一些最佳实践 您可以按任何顺序阅读 但是我们建议您先返回去阅读一下我们之前的帖子 C 评审最终清单 代码评审清单从来都不是全面的 因为要检查的问
  • linux 安装dotnet sdk

    linux 安装dotnet sdk 以dotnet6 0为例 1 下载linux内核对应的dotnet6 0 sdk文件 进入https dotnet microsoft com en us download dotnet 6 0 找到l
  • stn32cubemx生成代码有问题的解决方法

    问题1 生成代码时 有显示你的生成目录还说一个问题的问题 就是环境没装好 要装一个java的环境 即使你本来已经装了这个环境 但是还是出现了同样的问题 那就装我这个版本 我刚才使用这个版本就成功了 问题2 就是要下相应的固件 manage
  • pycharm、idea插件代理设置,插件安装

    pycharm和idea都是intellij的 所以插件安装是设置代理方法相似 以pycharm举例 1 已经安装的插件列表 2 查找要安装的插件 没有 会给出下载插件的链接地址 3 打开链接地址 弹出如下 搜索在线插件 左下角是http代
  • 14-----关于error while loading shared libraries: xxx.so: cannot open shared object file: No such file

    一 linux找不到动态链接库 so文件的解决方法 关于这种问题 很明显是自己生成的动态库在被使用时 无法找到准确的路径而导致的 1 问题分析 首先运行可以执行程序 若出现上述错误 说明找不到动态库的路径 我们需要使用ldd去查看哪个动态库
  • 在Cisco设备上配置接口速度和双工

    默认情况下 思科交换机将自动协商速度和双工设置 将设备 交换机 路由器或工作站 连接到 Cisco 交换机上的端口时 将发生协商过程 设备将就传输参数达成一致 当今的大多数网络适配器都支持此功能 在本文中 您将了解如何使用 NCM 应用程序
  • FPGA UltraScale+ 利用ICAP原语实现Multiboot功能

    例程参考 https blog csdn net xiaomingzi55 article details 124365631 1 这个贴子说的很清楚 唯一一点就是它是ICAP2 这样写是没问题的 1 对于BPI模式来说 可以通过RS 1
  • python Excel处理

    Python 前言 我是一个菜鸡 写文章是为了记录自己成长的过程 如有错误 请各位大佬轻喷 欢迎大家指正 基础知识不做赘述 下文介绍Excel办公自动化 openpyxl导入 安装步骤 win R 输入cmd 然后打出pip install
  • 单片机上云流程(使用STM32和esp8266构建物联网体系)

    1 首先是给esp8266烧录MQTT固件 咳咳 首先当然是准备一个esp8266 01s和对应的烧录器啊qwq 选择好要烧录进去的固件 没有的话去安信可官网下载 然后配置好对应的选项 点击ERASE先进行擦除 再点击START进行烧录 这
  • Makefile中使用Shell

    http blog csdn net zdl1016 article details 6448989 http blog csdn net absurd article details 636418 Makefile与Shell的问题 大概
  • FPGA程序上板调试问题

    FPGA程序上板调试问题 1 memory block 找不到coe文件 原因1 coe文件格式有问题 memory initialization radix 是数值格式 memory initialization vector 是初始化的
  • Neuronal Dynamics:第五章笔记

    Neuronal Dynamics 第五章笔记
  • 一文读懂C++的if与else判断语句

    说个明白 先从最简单的说起 if语句 if语句是C 中最简单的判断语句 if S 语句1 语句2 如果S为真 非零 则执行语句1 否则执行语句2 如果语句1就是单个语句 则可以这么写 if S 语句1 这里的分号不能少 或者这么写 if S
  • DevExpress v15.2.4帮助文档下载(全)

    原文地址 http www devexpresscn com Resources Documentation 498 html DevExpress v15 2帮助文档下载列表大全来啦 包含 net系列所有帮助文档 提供CHM和PDF两个版
  • 一个产品的风险预测怎么写_创业计划书中,项目风险评估怎么写?

    展开全部 首先需要了解在实施过程中我们可能碰到哪些风险 按照一般意义 我们常常所说的风险分为两大e69da5e6ba903231313335323631343130323136353331333436316264类 一种是不可预知的 一种是
  • STM32CubeMX定时器输出比较模式——输出相位可调矩形波

    1 介绍 STM32的定时器通道输出矩形波 可以使用PWM模式和输出比较模式 PWM模式能够产生频率和占空比可调的矩形波信号 但不能对信号的相位进行调节 使用输出比较模式 可以实现信号的相位调节和频率调节 但不能对信号的占空比进行调节 输出
  • 100天精通Python(基础篇)——第30天:数据容器-list列表索引

    从前往后索引 name list 0 name list 123 666 print name list 0 print name list 1 print type name list 从后向前索引 name list 1 name li
  • 【数据结构与算法】1.树、二叉树、字典树、红黑树

    文章目录 简介 1 树 Tree 2 二叉树 Binary Tree 2 1 二叉树数据结构 2 2 二叉树的三种遍历方式 3 二叉查找树 Binary Search Tree 3 1 二叉查找树的概念和定义 3 2 二分查找算法 4 字典
  • 手动安装Python第三库vtk库

    我们在使用py进行可视化操作时大概率会用到vtk库 一般方法是通过pip 安装 但是这玩意得看人品 本人人品十分不好 哈哈哈哈 所以我们就要自己下载轮子手动安装 附上第三方库地址 https www lfd uci edu gohlke p
  • 真实!大概五分之一的年轻人存款在一万元以内。

    近日 有调查称 大概五分之一的年轻人存款在一万元以内 10万元存款是一个 坎 存款超过10万就会超过53 7 的人 年轻人 存款 两个词碰撞在一起 引来了广泛的关注和讨论 你认为年轻人存款难吗 可以从以下几个角度发表你的看法 角度一 你的目

随机推荐

  • 计算机应用问题,计算机应用的现状与发展的问题

    计算机应用的现状与发展的问题 来源 职称阁时间 2018 07 27 11 59热度 这篇论文主要介绍的是计算机应用的现状与发展的问题的相关内容 本文作者就是通过对计算机的应用现状等内容做出详细的阐述与介绍 特推荐这篇优秀的论文供相关人士参
  • 【C++设计模式】依赖倒转原则

    2023年8月30日 周三上午 目录 概述 含义 举个简单的例子 传统做法 使用依赖倒转原则 代码说明 再举一个具体的例子 以生活为例 概述 依赖倒转原则 Dependency Inversion Principle DIP 是面向对象设计
  • Hadoop 端口

    1 系统 8080 80 用于tomcat和apache的端口 22 ssh的端口 2 Web UI 用于访问和监控Hadoop系统运行状态 Daemon 缺省端口 配置参数 HDFS Namenode 50070 dfs http add
  • Shiro源码分析-----认证流程/授权流程----------Subject

    本文转载自 认证流程和授权流程 源码分析的第二篇以Subject的初始化为题 一 回顾Apache Shiro创建Subject的步骤如下 1 获取SecurityManager工厂 此处使用Ini配置文件初始化SecurityManage
  • csgo删除服务器地图在哪个文件夹,CSGO de_cache地图

    资源说明 CSGO de cache地图 由 Volcano 制作 需要的玩家不要错过哦 资源详情 Sal Volcano Garozzo发布了其最新制作的CS GO地图de cache Volcano制作的首个地图de nuke ve 相
  • Java请求合并与分而治之

    在系统设计的时候 你是否也遇到过这两个问题 1 大量请求造成数据库压力过大 2 大量数据库查询造成请求执行时间过长 本文将介绍在高并发 大数据环境下 以上两种问题的应对思路 一 请求合并 首先思考一个场景 在高并发的系统中 在每秒内有大量的
  • 全连接神经网络单层模型原理

    全连接神经网络单层模型原理 前言 单层MLP 1 前向传播 2 激活函数 2 1 Sigmoid函数 2 2 tanh函数 2 3 ReLu函数 2 4 Leaky ReLu函数 3 损失函数 4 梯度下降 前言 深度学习是学习样本数据的内
  • ​少儿机器人编程与三大主课关系

    说到机器人编程 在常规概念里 很难将其和三大主课联系到一起 回首过去 国家并不提倡未成年人去学专业技术含量较高的机器人编程教育的 格物斯坦提示 但随着现在老龄化的社会现象的出现 国家需要大批有志少年用高科技方式去改造社会 这就要精通机器人编
  • SpringBoot启动控制台的banner是怎么回事

    前言 每次启动SpringBoot项目时 总是能看到控制台打印了一串字符 隐约能辨认出是 Spring 不知大家是否也好奇过是怎么实现的 是直接打印固定的字符串 还是根据什么算法去生成的 于是闲暇无事 探究一番 只想修改banner可以跳到
  • 时间序列分解VMD和长短记忆神经网络lstm

    这篇记一下时间序列分解和长短记忆神经网络lstm如何一起用 vmd lstm 用python实现 首先预设的流程是 读取数据 vmd时间分解 把信号分解成5行 最大最小归一化 给模型设置参数 编译 fit函数 训练 反归一化 得到的五个信号
  • 内存的分区

    内存 物理内存 虚拟内存 物理内存 计算机真正的内存 虚拟内存 为了减缓物理内存的使用 将硬盘的一部份容量虚拟成虚拟成内存 程序员视野中看到的是虚拟地址 在32的操作系统内 每个进程的寻址范围是2 32 地址一般我们使用16进制表示 0x0
  • HTTP协议是什么?有什么作用?

    HTTP协议 Hyper Text Transfer Protocol HTTP 全称为 超文本传输协议 是客户端浏览器或者是其他的程序和Web服务器之间的应用层通信协议 它通常运行在TCP之上 它指定了客户端可能发送给服务器什么样的消息以
  • python学习(一) windows开发环境搭建+linux运行环境

    朋友向我推荐了python 说怎么怎么好 计划用10 12次学习完成python的初步掌握和了解 学习一门语音 最快的方法就是自己搭建环境 并且写hello world 所以第一节就从开发环境搭建和运行环境搭建开始 一 目标 开发环境和运行
  • Android系统签名介绍

    一 签名原理介绍 apk的签名 简单说开发者可以通过签名 对应用进行标识和更新 包名在一个设备上是唯一的 这样可以避免被相同包名应用随意覆盖安装 这是一个非常重要的安全功能 系统中的签名文件 也是对系统中应用进行签名 编译应用是可以指定签名
  • Echarts中tooltip添加单位

    案例 代码 tooltip trigger axis axisPointer type cross crossStyle color 999 formatter function params var relVal params 0 nam
  • freemarker导出pdf

    freemarker模板导出doc的之前有写过 这里就不再多说了 不清楚的可以看之前的文章Freemarker 模板导出 带图片 转换后的文件展示 FreemarkerUtils工具类 这里用的工具类导出和之前不一样 不仅仅是页面进行下载
  • 查看服务器cpu和内存信息

    先安装硬件信息获取工具dmidecode yum y install dmidecode 查看CPU详细信息 1 查看CPU物理个数 grep physical id proc cpuinfo sort u wc l 2 查看CPU核心数
  • 如何去掉网页复制到word后的黑(或灰)背景色

    复制网页到word后 文字有时会带有黑色或灰色背景 看着很累 十分让人的讨厌和无奈 解决的方法 1 先将复制网页到记事本后 再将记事本中的复制到word 结果 背景色是没有了但是网页上的图也没有了 只得文字和图片分开复制 图片直接复制到wo
  • Android 多种方式修改Settings数据库

    若有获取Context的其他方法 还请走过路过的大佬不吝赐教 Android原生涉及到了众多属性及默认值 其中有部分就存储在Settings数据库中 地址如下 Android frameworks base core java androi
  • CLI 命令行实用程序开发实战 - Agenda

    CLI 命令行实用程序开发实战 Agenda 实验内容 实验过程 安装必要的包 初始化并添加相应指令 完善指令 register login entity中相应函数的实现 测试 实验内容 功能需求 设计一组命令完成 agenda 的管理 例