4

sspanel按月结算,修改go版代码【mysql api】

 1 year ago
source link: https://studygolang.com/articles/7870?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

sspanel按月结算,修改go版代码【mysql api】

w2180z · 2016-08-29 16:00:09 · 1645 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2016-08-29 16:00:09 的文章,其中的信息可能已经有所发展或是发生改变。

开头感谢sspanel的作者orvice大神!【转载请注明】

博主最近在搭建sspanel v3,中间坑确实挺多的,我回头开贴补充一下,ss服务器端我选择了orvice的shadowsocks-go mu版,因为作者是基于流量控制的机理,实际上奸商都是通过时间控制(233),所以我就寻思在作者的基础上加以修改,添加时间的限制。

注:此版本基于mysqlapi,webapi的修改方式令开贴

我在sspanel数据的user表中添加了两个字段:end_time int,到期日期(1970开始的时间戳);package_type int 套餐类型(无,月,三个月,半年,一年)。

具体可以根据自己实际需要情况修改。

首先,我们找到用户控制代码,在shadowsocks-go-mu\mu\mysql\mysql.go中,作者在这里用struct读取mysql中的数据

type User struct {
	id             int
	port           int
	passwd         string
	method         string
	enable         int
	transferEnable int
	u              int
	d              int
}

需要在里面加上我们新加的三个字段(因为我不知道go语言如何获取时间戳,所以直接从sql读了,有一个好处是如果配置多个服务器,可以保持时间同步,不受本地时间 )

	end_time        int
	//从mysql读取服务器当前时间戳
	now_time        int
	package_type   int


找到读取数据库数据的方法,给上述字段赋值

func (c *Client) GetUsers() ([]user.User, error) {
	log.Log.Info("get mysql users")
	var datas []*User
	//查询数据库加上新增的字段
	rows, err := c.db.Model(User{}).Select("id, passwd, port, method,enable,transfer_enable,u,d,end_time,UNIX_TIMESTAMP(LOCALTIME()) as now_time,package_type").Rows()
	if err != nil {
		log.Log.Error(err)
		var users []user.User
		return users, err
	}
	defer rows.Close()
	for rows.Next() {
		var data User
		//将读取到的到期时间和账户类型赋值
		err := rows.Scan(&data.id, &data.passwd, &data.port, &data.method, &data.enable, &data.transferEnable, &data.u, &data.d, &data.end_time, &data.now_time, &data.package_type)
		if err != nil {
			log.Log.Error(err)
			continue
		}
		datas = append(datas, &data)
	}
	log.Log.Info(len(datas))
	users := make([]user.User, len(datas))
	for k, v := range datas {
		users[k] = v
	}
	return users, nil
}

下一步,找到控制方法,增加到期自动断开

func (u *User) IsEnable() bool {
	if u.enable == 0 {
		return false
	}
	if u.u+u.d > u.transferEnable {
		return false
	}
	//如果过期,停用用户
	if u.now_time > u.end_time {
		return false
	}
	return true
}



以上,改完之后重新编译,替换掉原有的mu文件,将服务端重新启动即可

有疑问加站长微信联系(非本文作者)

280

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK