上篇文章还有一些细节需要优化:
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("Hello World
"))
}