go之构建简单的web服务器2.0

上篇文章还有一些细节需要优化:

1、数据库连接信息、接口返回码等参数应该写在config中,便于管理和修改
2、接口返回的格式应该是json格式,带有状态码,提示信息,数据。(封装放在公共方法中)

更新后的目录如下:

在这里插入图片描述

return.go代码:

package common
import (
	"io"
    "encoding/json"
	"net/http"
)

type JsonStruct struct {
	Code int `json:"code"`
	Msg interface{} `json:"msg"`
	Items interface{} `json:"items"`
 }

// func ReturnSuccessV1(code int,msg interface{},items interface{}) *JsonStruct {
// 	return &JsonStruct{Code:code,Msg:msg,Items:items}
// }

// func ReturnErrorV1(code int,msg interface{}) *JsonStruct {
// 	return &JsonStruct{Code:code,Msg:msg}
// }

func ReturnSuccess(w http.ResponseWriter,code int,msg interface{},items interface{}) {
	result := &JsonStruct{Code:code,Msg:msg,Items:items}
	//变成json输出
	if dataByte, err := json.Marshal(result); err != nil {
		io.WriteString(w, err.Error())
	} else {
		io.WriteString(w, string(dataByte))
	}
}

func ReturnError(w http.ResponseWriter,code int,msg interface{}) {
	result := &JsonStruct{Code:code,Msg:msg}
	//变成json输出
	if dataByte, err := json.Marshal(result); err != nil {
		io.WriteString(w, err.Error())
	} else {
		io.WriteString(w, string(dataByte))
	}
}

main_conf.go代码

package config

//接口响应码
const (
	FAIL_CODE int = 500
	SUCCESS_CODE int = 0
)

//数据库配置
type MysqlConf struct {
	UserName string
	Password string
	Address string
	DBName string
}

//获取数据库配置
func GetMysqlConf() *MysqlConf {
	return &MysqlConf{
		UserName:"root",
		Password:"root",
		Address:"127.0.0.1",
		DBName:"shop",
	}
}

user_edit代码:
通过引入内部包 etcd_web/common和ectd_web/config。就能调用公共方法和配置了。

package user

import (
	"net/http"
	"fmt"
	sql_pk "database/sql"
	_ "github.com/go-sql-driver/mysql"
	
	//内部包
	mysql "etcd_web/storage"
	common "etcd_web/common"
	conf "etcd_web/config"
)

type Admin struct {
	Id int
	User_name string
	Prefix_key string
	Is_write int
}

//新增管理员
func AddAdmin(w http.ResponseWriter, r *http.Request) {
	var sql string
	//获取参数
	user_name := r.FormValue("user_name")
	password := r.FormValue("password")
	prefix_key := r.FormValue("prefix_key")
	is_write := r.FormValue("is_write")

	//参数判断
	if user_name == "" {
		common.ReturnError(w,conf.FAIL_CODE,"用户名不能为空")
		return
	}
	if password == "" {
		common.ReturnError(w,conf.FAIL_CODE,"密码不能为空")
		return
	}
	//默认是1可读可写,2代表只读
	if is_write == "" {
		is_write = "1";
	}
	//获取数据库连接
	mysqlConnect,err := mysql.NewMySqlInit();
	if err != nil {
		common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("连接出错了:%v",err))
		return
	}
	//判断用户名是否已经存在
	sql = "select id from etcd_admin where user_name=? limit 1";
	row,err := mysqlConnect.QueryRow(sql,user_name)
	var id int
	//如果id为默认值0,则代表这个数据不存在,大于0,则代表已存在
	err = row.Scan(&id)
	if err != sql_pk.ErrNoRows && id >0 {
		common.ReturnError(w,conf.FAIL_CODE,"用户名已存在了,请勿重复添加")
		return
	}

	//新增数据
	sql = "insert into etcd_admin(user_name,password,prefix_key,is_write) values(?,?,?,?)"
	_,err = mysqlConnect.Exec(sql,user_name,password,prefix_key,is_write);
	if err != nil {
		common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("新增出错了:%v",err))
		return
	}
	 
	common.ReturnSuccess(w,conf.SUCCESS_CODE,"新增用户成功",nil)
}


//更新管理员
func UpdateAdmin(w http.ResponseWriter, r *http.Request) {
	var sql string
	//获取参数
	id := r.FormValue("id")
	user_name := r.FormValue("user_name")
	password := r.FormValue("password")
	prefix_key := r.FormValue("prefix_key")
	is_write := r.FormValue("is_write")

	//参数判断
	if id == "" {
		common.ReturnError(w,conf.FAIL_CODE,"用户id不能为空")
		return
	}

	if user_name == "" {
		common.ReturnError(w,conf.FAIL_CODE,"用户名不能为空")
		return
	}
	if password == "" {
		common.ReturnError(w,conf.FAIL_CODE,"密码不能为空")
		return
	}
	//默认是1可读可写,2代表只读
	if is_write == "" {
		is_write = "1";
	}
	//获取数据库连接
	mysqlConnect,err := mysql.NewMySqlInit();
	if err != nil {
		common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("连接出错了:%v",err))
		return
	}
	
	sql = "update etcd_admin set user_name=?,password=?,prefix_key=?,is_write=? where id=?"
	_,err = mysqlConnect.Exec(sql,user_name,password,prefix_key,is_write,id);
	if err != nil {
		common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("更新出错了:%v",err))
		return
	}

	common.ReturnSuccess(w,conf.SUCCESS_CODE,"更新用户成功",nil)	

}

//删除管理员
func DelAdmin(w http.ResponseWriter, r *http.Request) {
	var sql string
	//获取参数
	id := r.FormValue("id")
	//参数判断
	if id == "" {
		common.ReturnError(w,conf.FAIL_CODE,"用户id不能为空")
		return
	}
	//获取数据库连接
	mysqlConnect,err := mysql.NewMySqlInit();
	if err != nil {
		common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("连接出错了:%v",err))
		return
	}

	sql = "delete from etcd_admin where id=?"
	_,err = mysqlConnect.Exec(sql,id);
	if err != nil {
		common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("删除出错了:%v",err))
		return
	}
	
	common.ReturnSuccess(w,conf.SUCCESS_CODE,"删除成功",nil)		
}

//获取管理员列表
func GetAdminList(w http.ResponseWriter, r *http.Request) {
	var sql string
	//获取参数
	user_id := r.FormValue("user_id")
	//获取数据库连接
	mysqlConnect,err := mysql.NewMySqlInit();
	if err != nil {
		common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("连接出错了:%v",err))
		return
	}
	var rows *sql_pk.Rows
	//参数判断(是查询单个还是查询所有用户)
	if user_id == "" {
		sql = "select id,user_name,prefix_key,is_write from etcd_admin"
		rows,err = mysqlConnect.Query(sql);
	} else {
		sql = "select id,user_name,prefix_key,is_write from etcd_admin where id=?"
		rows,err = mysqlConnect.Query(sql,user_id);
	}

	if err != nil {
		common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("查询出错了:%v",err))
		// w.Write([]byte(fmt.Sprintf("查询出错了:%v",err)))
		return
	}
	defer rows.Close()

	var id,is_write int
	var user_name,prefix_key string
	var adminList []Admin
	for rows.Next() {
		//Scan的字段要与select筛选的字段数量和顺序一致
        err := rows.Scan(&id,&user_name,&prefix_key,&is_write)
        if err != nil {
        	common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("查询出错了:%v",err))
      		return
        }
		u := Admin{
			Id:       id,
			User_name: user_name,
			Prefix_key: prefix_key,
			Is_write:  is_write,
		}
		adminList = append(adminList,u)

    }
    
    err = rows.Err()
    if err != nil {
    	common.ReturnError(w,conf.FAIL_CODE,fmt.Sprintf("查询出错了:%v",err))
    	return
    }
    common.ReturnSuccess(w,conf.SUCCESS_CODE,"获取用户成功",adminList)
}


main.go代码

package main
import (
	"net/http"
	//内部包 
	// mysql "etcd_admin/storage"
	user_edit "etcd_admin/user"
)

func main() {
  // 当访问 http://127.0.0.1:9527/hello 时,进入这个方法
  http.HandleFunc("/hello", HelloHandler)

  //设置管理员(方法提取到etcd_admin/user目录下的文件)
  http.HandleFunc("/addAdmin", user_edit.AddAdmin)
  http.HandleFunc("/updateAdmin", user_edit.UpdateAdmin)
  http.HandleFunc("/delAdmin", user_edit.DelAdmin)
  http.HandleFunc("/getAdminList", user_edit.GetAdminList)

  // 启动一个Web服务,并监听9527端口
  http.ListenAndServe(":9527",nil)
}


func HelloHandler(w http.ResponseWriter, r *http.Request) {
  w.Write([]byte("<h1>Hello World</h1>"))
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值