golang urfave/cli 库应用

package main

import (
	"database/sql"
	"fmt"
	"log"
	"os"
	"sort"
	_ "github.com/mattn/go-sqlite3"
	_ "database/sql"
	"github.com/urfave/cli"
	"time"
)

func main() {

	app := cli.NewApp()
	app.EnableBashCompletion = true
	app.Flags = []cli.Flag{
		cli.StringFlag{
			Name:  "add,a",
			Usage: "添加已完成的工作内容",
		},
		cli.StringFlag{
			Name:  "list,l",
			Usage: "获取工作列表 ",
		},
		cli.StringFlag{
			Name:  "update,u",
			Usage: "更新工作内容",
		},
		cli.StringFlag{
			Name:  "del,d",
			Usage: "删除工作内容",
		}, cli.StringFlag{
			Name:  "commit,c",
			Usage: "完成工作内容",
		},
	}
	app.Commands = []cli.Command{
		{
			Name:    "add",
			Aliases: []string{"a"},
			Usage:   "add work",
			Action: func(c *cli.Context) error {
				addWork(c)
				return nil
			},
		},
		{
			Name:    "list",
			Aliases: []string{"l"},
			Usage:   "get worklist",
			Action: func(c *cli.Context) error {
				getWorkList(c)
				return nil
			},
		},
		{
			Name:    "update",
			Aliases: []string{"u"},
			Usage:   "update work",
			Action: func(c *cli.Context) error {
				updateWorkInfo(c)
				return nil
			},
		},
		{
			Name:    "del",
			Aliases: []string{"d"},
			Usage:   "delete work by id",
			Action: func(c *cli.Context) error {
				delWorkById(c)
				return nil
			},
		},
		{
			Name:    "commit",
			Aliases: []string{"c"},
			Usage:   "commit work",
			Action: func(c *cli.Context) error {
				commitWorkById(c)
				return nil
			},
		},
	}
	sort.Sort(cli.FlagsByName(app.Flags))
	sort.Sort(cli.CommandsByName(app.Commands))
	err := app.Run(os.Args)
	if err != nil {
		log.Fatal(err)
	}

}

func commitWorkById(c *cli.Context) {
	db, err := sql.Open("sqlite3", "./work.db")
	time := time.Now().Format("2006-01-02 15:04")

	stmt, err := db.Prepare("update workinfo set state=?,etime=? where id=?")
	res, err := stmt.Exec("1", time, c.Args().First())
	_, err = res.RowsAffected()
	checkErr(err)
	fmt.Println("完成工作:", c.Args().First())
	db.Close()
}

func delWorkById(c *cli.Context) {
	db, err := sql.Open("sqlite3", "./work.db")
	stmt, err := db.Prepare("delete from workinfo where id=?")
	res, err := stmt.Exec(c.Args().First())
	affect, err := res.RowsAffected()
	checkErr(err)
	fmt.Println("删除工作内容:", c.Args().First(), affect)
	db.Close()

}

func updateWorkInfo(c *cli.Context) {
	db, err := sql.Open("sqlite3", "./work.db")
	stmt, err := db.Prepare("update workinfo set info=? where id=?")
	res, err := stmt.Exec(c.Args().First(), c.Args().Get(1))
	_, err = res.RowsAffected()
	checkErr(err)
	fmt.Println("更新工作内容:", c.Args().First())
	db.Close()
}

func getWorkList(c *cli.Context) {
	db, err := sql.Open("sqlite3", "./work.db")
	//查询数据
	sql := "SELECT * FROM workinfo where 1=1 "

	if (len(c.Args().Get(0)) > 0) {
		sql = sql + "and state == " + c.Args().Get(0)
	}
	rows, err := db.Query(sql)

	for rows.Next() {
		var id int
		var info string
		var stime time.Time
		var etime time.Time
		var state string
		stateVal:="未完成"
		err = rows.Scan(&id, &info, &stime, &etime, &state)
		if state=="1"{
			stateVal="已完成"
		}
		checkErr(err)
		fmt.Println("#",id,"内容",info, "开始",stime.Format("2006-01-02 15:04"), "结束",etime.Format("2006-01-02 15:04"), stateVal)
	}
	checkErr(err)
	db.Close()
}

func addWork(c *cli.Context) {
	db, err := sql.Open("sqlite3", "./work.db")
	//插入数据
	stmt, err := db.Prepare("INSERT INTO workinfo(info, stime, etime,state) values(?,?,?,?)")
	stime := time.Now().Format("2006-01-02 15:04")
	etime := time.Now().Format("2006-01-02 15:04")
	state := "0"
	if (len(c.Args().Get(1)) > 0) {
		stime = c.Args().Get(1)
	}
	if (len(c.Args().Get(2)) > 0) {
		etime = c.Args().Get(2)
	}
	if (len(c.Args().Get(3)) > 0) {
		state = c.Args().Get(3)
	}
	res, err := stmt.Exec(c.Args().First(), stime, etime, state)
	id, err := res.LastInsertId()
	checkErr(err)
	fmt.Println("新增工作内容完成:", c.Args().First(), id)
	db.Close()
}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

如何使用(假设命名为iwork.go)

go run iwork.go a 工作内容 2019-01-01 2019-01-02 0

go run iwork.go l 0

转载于:https://my.oschina.net/maliang9527/blog/3063961

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值