huangyuhao 2 gadi atpakaļ
vecāks
revīzija
bab89b7ef2
4 mainītis faili ar 727 papildinājumiem un 14 dzēšanām
  1. 169 0
      controllers/roll.go
  2. 198 9
      models/roll.go
  3. 12 5
      models/rollaward.go
  4. 348 0
      views/roll.tpl

+ 169 - 0
controllers/roll.go

@@ -0,0 +1,169 @@
1
+// roll房
2
+package controllers
3
+
4
+import (
5
+	"box-gm/models"
6
+	"box-gm/utils"
7
+	"encoding/json"
8
+	"fmt"
9
+	"log"
10
+
11
+	"github.com/astaxie/beego"
12
+)
13
+
14
+type RollController struct {
15
+	beego.Controller
16
+}
17
+
18
+func (c *RollController) Get() {
19
+	userinfo := c.GetSession("user")
20
+	if userinfo == nil {
21
+		c.Ctx.Redirect(302, "/accountlogin")
22
+		return
23
+	}
24
+	c.Data["username"] = userinfo.(*LoginInfo).Username
25
+	c.Data["token"] = models.GetToken()
26
+	userPermission := models.GetPermission(userinfo.(*LoginInfo).Username)
27
+	if (userPermission & (1 << uint(models.ModelSystem))) == 0 {
28
+		c.Ctx.Redirect(302, "/accountlogin")
29
+		return
30
+	}
31
+
32
+	c.Data["AwardList"] = models.GetRollAwardInfo()
33
+	c.Data["infoList"] = models.GetRollInfoList()
34
+	c.TplName = "roll.tpl"
35
+}
36
+
37
+func (c *RollController) Post() {
38
+	userinfo := c.GetSession("user")
39
+	log.Printf("RollController Post userinfo[%v]", userinfo)
40
+	if userinfo == nil {
41
+		c.Ctx.Redirect(302, "/accountlogin")
42
+		return
43
+	}
44
+	name := c.GetString("name")
45
+	bandShareCode := c.GetString("bandShareCode")
46
+	showStartTime := c.GetString("showStartTime")
47
+	signupStartTime := c.GetString("signupStartTime")
48
+	signupEndTime := c.GetString("signupEndTime")
49
+	awardTime := c.GetString("awardTime")
50
+	conditions := c.GetString("conditions")
51
+	awardId, _ := c.GetInt("awardId")
52
+
53
+	var _conditions []*models.RollConditionInfo
54
+	err := json.Unmarshal([]byte(conditions), &_conditions)
55
+	if err != nil {
56
+		log.Printf("RollController Post conditions[%s] err[%v]", conditions, err)
57
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": err.Error()}
58
+		c.ServeJSON()
59
+		return
60
+	}
61
+	itemIdList := models.GetRollAwardItemIdList(awardId)
62
+	if itemIdList == nil {
63
+		log.Printf("RollController Post awardId[%d] 奖励列表空", awardId)
64
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": "奖励列表空"}
65
+		c.ServeJSON()
66
+		return
67
+	}
68
+	// 奖励方案道具列表
69
+	u := new(models.RollInfo)
70
+	u.Id = models.CreateRollId()
71
+	u.Name = name
72
+	u.BandShareCode = bandShareCode
73
+	u.ShowStartTime = utils.GetTime64(showStartTime)
74
+	u.SignupStartTime = utils.GetTime64(signupStartTime)
75
+	u.SignupEndTime = utils.GetTime64(signupEndTime)
76
+	u.AwardTime = utils.GetTime64(awardTime)
77
+	u.Conditions = _conditions
78
+	u.ItemIdList = itemIdList
79
+
80
+	err = models.AddRollInfo(u)
81
+	if err != nil {
82
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": err.Error()}
83
+		c.ServeJSON()
84
+		return
85
+	}
86
+
87
+	c.Data["json"] = &map[string]interface{}{"status": true, "info": "新增roll房成功"}
88
+	c.ServeJSON()
89
+}
90
+
91
+func (c *RollController) Put() {
92
+	userinfo := c.GetSession("user")
93
+	if userinfo == nil {
94
+		c.Ctx.Redirect(302, "/accountlogin")
95
+		return
96
+	}
97
+	id, _ := c.GetInt("id")
98
+	log.Printf("RollController Put id[%d]", id)
99
+	hf := models.GetRollInfoById(id)
100
+	if hf == nil {
101
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": "修改失败:奖池方案不存在"}
102
+		c.ServeJSON()
103
+		return
104
+	}
105
+	name := c.GetString("name")
106
+	bandShareCode := c.GetString("bandShareCode")
107
+	showStartTime := c.GetString("showStartTime")
108
+	signupStartTime := c.GetString("signupStartTime")
109
+	signupEndTime := c.GetString("signupEndTime")
110
+	awardTime := c.GetString("awardTime")
111
+	conditions := c.GetString("conditions")
112
+	awardId, _ := c.GetInt("awardId")
113
+
114
+	var _conditions []*models.RollConditionInfo
115
+	err := json.Unmarshal([]byte(conditions), &_conditions)
116
+	if err != nil {
117
+		log.Printf("RollController Post conditions[%s] err[%v]", conditions, err)
118
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": err.Error()}
119
+		c.ServeJSON()
120
+		return
121
+	}
122
+	itemIdList := models.GetRollAwardItemIdList(awardId)
123
+	if itemIdList == nil {
124
+		log.Printf("RollController Post awardId[%d] 奖励列表空", awardId)
125
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": "奖励列表空"}
126
+		c.ServeJSON()
127
+		return
128
+	}
129
+
130
+	hf.Name = name
131
+	hf.BandShareCode = bandShareCode
132
+	hf.ShowStartTime = utils.GetTime64(showStartTime)
133
+	hf.SignupStartTime = utils.GetTime64(signupStartTime)
134
+	hf.SignupEndTime = utils.GetTime64(signupEndTime)
135
+	hf.AwardTime = utils.GetTime64(awardTime)
136
+	hf.Conditions = _conditions
137
+	hf.ItemIdList = itemIdList
138
+
139
+	err = models.UpdateRollInfo(hf)
140
+	if err != nil {
141
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": err}
142
+		c.ServeJSON()
143
+		return
144
+	}
145
+	c.Data["json"] = &map[string]interface{}{"status": true, "info": fmt.Sprintf("修改roll房[%d]成功", id)}
146
+	c.ServeJSON()
147
+}
148
+
149
+func (c *RollController) Delete() {
150
+	userinfo := c.GetSession("user")
151
+	if userinfo == nil {
152
+		c.Ctx.Redirect(302, "/accountlogin")
153
+		return
154
+	}
155
+
156
+	id, _ := c.GetInt("id")
157
+	log.Printf("RollController Post Delete id[%d]", id)
158
+	hf := models.GetRollInfoById(id)
159
+	if hf == nil {
160
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": "修改失败:roll房不存在"}
161
+		c.ServeJSON()
162
+		return
163
+	}
164
+
165
+	models.DelRollInfoById(id)
166
+
167
+	c.Data["json"] = &map[string]interface{}{"status": true, "info": "删除roll房成功"}
168
+	c.ServeJSON()
169
+}

+ 198 - 9
models/roll.go

@@ -1,15 +1,18 @@
1 1
 package models
2 2
 
3
-// 兑换码
3
+// roll房
4 4
 import (
5 5
 	"box-gm/utils"
6
+	"encoding/json"
6 7
 	"errors"
7 8
 	"fmt"
8 9
 	"log"
9 10
 	"sync"
11
+	"time"
10 12
 
11 13
 	"github.com/astaxie/beego"
12 14
 	"github.com/astaxie/beego/validation"
15
+	"github.com/garyburd/redigo/redis"
13 16
 )
14 17
 
15 18
 type RollConditionInfo struct {
@@ -34,11 +37,89 @@ type RollInfoArray []*RollInfo
34 37
 
35 38
 var rollList RollInfoArray
36 39
 var riMutex sync.Mutex
40
+var ROLL_MAIN_KEY = "roll:room"
37 41
 
38
-// 初始化兑换码
42
+func get_roll_key(id int) string {
43
+	return fmt.Sprintf("%s:%d", ROLL_MAIN_KEY, id)
44
+}
45
+
46
+func CreateRollId() int {
47
+	pool := utils.GetAccountRedisPool()
48
+	if pool == nil {
49
+		fmt.Println("get redis pool fail")
50
+		return 0
51
+	}
52
+	rd := pool.Get()
53
+	if rd == nil {
54
+		fmt.Println("get redis conn fail")
55
+		return 0
56
+	}
57
+	defer rd.Close()
58
+
59
+	reply, err := rd.Do("hincrby", "global", "max:roll:room:id", 1)
60
+	if err != nil {
61
+		fmt.Printf("redis hincrby err: %v", err)
62
+		return 0
63
+	}
64
+	id, err := redis.Int(reply, err)
65
+	if err != nil {
66
+		fmt.Printf("redis hincrby err: %v", err)
67
+		return 0
68
+	}
69
+	return id
70
+}
71
+
72
+// 初始化roll房信息
39 73
 func InitRollInfo() {
74
+	// 活跃ID列表
75
+	pool := utils.GetAccountRedisPool()
76
+	if pool == nil {
77
+		fmt.Println("get redis pool fail")
78
+		return
79
+	}
80
+	rd := pool.Get()
81
+	defer rd.Close()
82
+
83
+	result, _ := redis.Values(rd.Do("smembers", ROLL_MAIN_KEY))
84
+	for _, v := range result {
85
+		id := utils.StringToInt(v.([]byte))
86
+		pKey := get_roll_key(id)
87
+		name, _ := redis.String(rd.Do("hget", pKey, "name"))
88
+		bandShareCode, _ := redis.String(rd.Do("hget", pKey, "bandShareCode"))
89
+		creatTime, _ := redis.Int64(rd.Do("hget", pKey, "creatTime"))
90
+		showStartTime, _ := redis.Int64(rd.Do("hget", pKey, "showStartTime"))
91
+		signupStartTime, _ := redis.Int64(rd.Do("hget", pKey, "signupStartTime"))
92
+		signupEndTime, _ := redis.Int64(rd.Do("hget", pKey, "signupEndTime"))
93
+		awardTime, _ := redis.Int64(rd.Do("hget", pKey, "awardTime"))
94
+
95
+		conditions, _ := redis.String(rd.Do("hget", pKey, "conditions"))
96
+		var _conditions []*RollConditionInfo
97
+		json.Unmarshal([]byte(conditions), &_conditions)
98
+
99
+		itemIdList, _ := redis.String(rd.Do("hget", pKey, "itemIdList"))
100
+		var _itemIdList []int
101
+		json.Unmarshal([]byte(itemIdList), &_itemIdList)
40 102
 
41
-	beego.Info("load exchange code info", len(rollList))
103
+		signupUidList, _ := redis.String(rd.Do("hget", pKey, "signupUidList"))
104
+		var _signupUidList []int
105
+		json.Unmarshal([]byte(signupUidList), &_signupUidList)
106
+
107
+		rollList = append(rollList, &RollInfo{
108
+			Id:              id,
109
+			Name:            name,
110
+			BandShareCode:   bandShareCode,
111
+			CreateTime:      creatTime,
112
+			ShowStartTime:   showStartTime,
113
+			SignupStartTime: signupStartTime,
114
+			SignupEndTime:   signupEndTime,
115
+			AwardTime:       awardTime,
116
+			Conditions:      _conditions,
117
+			ItemIdList:      _itemIdList,
118
+			SignupUidList:   _signupUidList,
119
+		})
120
+	}
121
+
122
+	beego.Info("load roll info", len(rollList))
42 123
 }
43 124
 
44 125
 func checkRollInfo(hf *RollInfo) (err error) {
@@ -53,7 +134,7 @@ func checkRollInfo(hf *RollInfo) (err error) {
53 134
 	return nil
54 135
 }
55 136
 
56
-// 新增兑换码
137
+// 新增roll房信息
57 138
 func AddRollInfo(hf *RollInfo) error {
58 139
 	pool := utils.GetAccountRedisPool()
59 140
 	if pool == nil {
@@ -66,6 +147,45 @@ func AddRollInfo(hf *RollInfo) error {
66 147
 		return err
67 148
 	}
68 149
 
150
+	if hf.Id == 0 {
151
+		hf.Id = CreateRollId()
152
+	}
153
+	if hf.Id == 0 {
154
+		return fmt.Errorf("分配roll房ID失败")
155
+	}
156
+	// 插入数据库
157
+	db, err := utils.GetMysqlHandler()
158
+	if err != nil {
159
+		log.Println("GetMysqlHandler, Error: ", err)
160
+		return err
161
+	}
162
+
163
+	hf.CreateTime = time.Now().Unix()
164
+
165
+	bConditions, _ := json.Marshal(hf.Conditions)
166
+	bItemIdList, _ := json.Marshal(hf.ItemIdList)
167
+	columns := "id,name,bandShareCode,creatTime,showStartTime,signupStartTime,signupEndTime,awardTime,conditions,itemIdList"
168
+	values := fmt.Sprintf("%d, '%s', '%s', %d, %d, %d, %d,  %d, '%s', '%s'", hf.Id, hf.Name, hf.BandShareCode, hf.CreateTime, hf.ShowStartTime, hf.SignupStartTime, hf.SignupEndTime, hf.AwardTime, bConditions, bItemIdList)
169
+	sql := fmt.Sprintf("insert into mdl_roll (%s) value (%s);", columns, values)
170
+	_, err = db.Exec(sql)
171
+	if err != nil {
172
+		log.Println("AddRollInfo Insert data Exec Failed, Error: ", err)
173
+		return err
174
+	}
175
+
176
+	pKey := get_roll_key(hf.Id)
177
+	rd.Do("hset", pKey, "name", hf.Name)
178
+	rd.Do("hset", pKey, "bandShareCode", hf.BandShareCode)
179
+	rd.Do("hset", pKey, "creatTime", hf.CreateTime)
180
+	rd.Do("hset", pKey, "showStartTime", hf.ShowStartTime)
181
+	rd.Do("hset", pKey, "signupStartTime", hf.SignupStartTime)
182
+	rd.Do("hset", pKey, "signupEndTime", hf.SignupEndTime)
183
+	rd.Do("hset", pKey, "awardTime", hf.AwardTime)
184
+	rd.Do("hset", pKey, "conditions", hf.Conditions)
185
+	rd.Do("hset", pKey, "itemIdList", hf.ItemIdList)
186
+
187
+	rd.Do("sadd", ROLL_MAIN_KEY, hf.Id)
188
+
69 189
 	riMutex.Lock()
70 190
 	rollList = append(rollList, hf)
71 191
 	riMutex.Unlock()
@@ -73,7 +193,7 @@ func AddRollInfo(hf *RollInfo) error {
73 193
 	return nil
74 194
 }
75 195
 
76
-// 修改兑换码
196
+// 修改roll房信息
77 197
 func UpdateRollInfo(hf *RollInfo) error {
78 198
 	pool := utils.GetAccountRedisPool()
79 199
 	if pool == nil {
@@ -86,6 +206,34 @@ func UpdateRollInfo(hf *RollInfo) error {
86 206
 		return err
87 207
 	}
88 208
 
209
+	// 更新数据库
210
+	db, err := utils.GetMysqlHandler()
211
+	if err != nil {
212
+		log.Println("GetMysqlHandler, Error: ", err)
213
+		return err
214
+	}
215
+	bConditions, _ := json.Marshal(hf.Conditions)
216
+	bItemIdList, _ := json.Marshal(hf.ItemIdList)
217
+	sets := fmt.Sprintf("name='%s',bandShareCode='%s',showStartTime=%d,signupStartTime=%d,signupEndTime=%d,awardTime=%d,conditions='%s',itemIdList='%s'",
218
+		hf.Name, hf.BandShareCode, hf.ShowStartTime, hf.SignupStartTime, hf.SignupEndTime, hf.AwardTime, bConditions, bItemIdList)
219
+	sql := fmt.Sprintf("UPDATE mdl_roll SET %s WHERE id=%d;", sets, hf.Id)
220
+	// log.Println("order_insert_db sql:", sql)
221
+	_, err = db.Exec(sql)
222
+	if err != nil {
223
+		log.Println("UpdateRollInfo update data Exec Failed, Error: ", err)
224
+		return err
225
+	}
226
+
227
+	pKey := get_roll_key(hf.Id)
228
+	rd.Do("hset", pKey, "name", hf.Name)
229
+	rd.Do("hset", pKey, "bandShareCode", hf.BandShareCode)
230
+	rd.Do("hset", pKey, "showStartTime", hf.ShowStartTime)
231
+	rd.Do("hset", pKey, "signupStartTime", hf.SignupStartTime)
232
+	rd.Do("hset", pKey, "signupEndTime", hf.SignupEndTime)
233
+	rd.Do("hset", pKey, "awardTime", hf.AwardTime)
234
+	rd.Do("hset", pKey, "conditions", hf.Conditions)
235
+	rd.Do("hset", pKey, "itemIdList", hf.ItemIdList)
236
+
89 237
 	riMutex.Lock()
90 238
 	for i := 0; i < len(rollList); i++ {
91 239
 		if hf.Id == rollList[i].Id {
@@ -105,10 +253,36 @@ func UpdateRollInfo(hf *RollInfo) error {
105 253
 	riMutex.Unlock()
106 254
 
107 255
 	return nil
256
+}
257
+
258
+// 更新参与玩家列表
259
+func UpdateSignupUidList(id int) error {
260
+	pool := utils.GetAccountRedisPool()
261
+	if pool == nil {
262
+		return fmt.Errorf("get redis pool fail")
263
+	}
264
+	rd := pool.Get()
265
+	defer rd.Close()
108 266
 
267
+	pKey := get_roll_key(id)
268
+	signupUidList, _ := redis.String(rd.Do("hget", pKey, "signupUidList"))
269
+	var _signupUidList []int
270
+	json.Unmarshal([]byte(signupUidList), &_signupUidList)
271
+
272
+	riMutex.Lock()
273
+	for i := 0; i < len(rollList); i++ {
274
+		if id == rollList[i].Id {
275
+			old := rollList[i]
276
+
277
+			old.SignupUidList = _signupUidList
278
+			break
279
+		}
280
+	}
281
+	riMutex.Unlock()
282
+	return nil
109 283
 }
110 284
 
111
-// 删除兑换码
285
+// 删除roll房信息
112 286
 func DelRollInfoById(id int) error {
113 287
 	pool := utils.GetAccountRedisPool()
114 288
 	if pool == nil {
@@ -120,6 +294,14 @@ func DelRollInfoById(id int) error {
120 294
 	riMutex.Lock()
121 295
 	defer riMutex.Unlock()
122 296
 
297
+	pKey := get_roll_key(id)
298
+	_, err := rd.Do("del", pKey)
299
+	if err != nil {
300
+		log.Println(err)
301
+		return err
302
+	}
303
+	rd.Do("srem", ROLL_MAIN_KEY, id)
304
+
123 305
 	for i := 0; i < len(rollList); i++ {
124 306
 		if id == rollList[i].Id {
125 307
 			ii := i + 1
@@ -130,11 +312,13 @@ func DelRollInfoById(id int) error {
130 312
 	return nil
131 313
 }
132 314
 
133
-// 获取兑换码信息
134
-func GetRollInfoByCode(id int) (hf *RollInfo) {
315
+// 获取roll房信息信息
316
+func GetRollInfoById(id int) (hf *RollInfo) {
135 317
 	riMutex.Lock()
136 318
 	defer riMutex.Unlock()
137 319
 
320
+	// 更新参与列表
321
+	UpdateSignupUidList(id)
138 322
 	for i := 0; i < len(rollList); i++ {
139 323
 		if id == rollList[i].Id {
140 324
 			return rollList[i]
@@ -143,9 +327,14 @@ func GetRollInfoByCode(id int) (hf *RollInfo) {
143 327
 
144 328
 	return nil
145 329
 }
146
-func GetRollInfo() RollInfoArray {
330
+func GetRollInfoList() RollInfoArray {
147 331
 	riMutex.Lock()
148 332
 	defer riMutex.Unlock()
149 333
 
334
+	// 更新参与列表
335
+	for _, v := range rollList {
336
+		UpdateSignupUidList(v.Id)
337
+	}
338
+
150 339
 	return rollList
151 340
 }

+ 12 - 5
models/rollaward.go

@@ -52,11 +52,6 @@ func CreateRollAwardId() int {
52 52
 	return id
53 53
 }
54 54
 
55
-// roll房奖池key
56
-func get_roll_award_key(pcode string) string {
57
-	return fmt.Sprintf("%s:%s", ROLL_AWARD_MAIN_KEY, pcode)
58
-}
59
-
60 55
 // 初始化roll房奖池
61 56
 func InitRollAwardInfo() {
62 57
 	pool := utils.GetAccountRedisPool()
@@ -215,6 +210,18 @@ func GetRollAwardInfoById(id int) (hf *RollAwardInfo) {
215 210
 
216 211
 	return nil
217 212
 }
213
+func GetRollAwardItemIdList(id int) []int {
214
+	raMutex.Lock()
215
+	defer raMutex.Unlock()
216
+
217
+	for i := 0; i < len(rollAwardList); i++ {
218
+		if id == rollAwardList[i].Id {
219
+			return rollAwardList[i].ItemIdList
220
+		}
221
+	}
222
+
223
+	return nil
224
+}
218 225
 func GetRollAwardInfo() RollAwardInfoArray {
219 226
 	raMutex.Lock()
220 227
 	defer raMutex.Unlock()

+ 348 - 0
views/roll.tpl

@@ -0,0 +1,348 @@
1
+<!DOCTYPE html>
2
+<html>
3
+    <head>
4
+        <meta charset="UTF-8" />
5
+        <title>欢迎页面-X-admin2.0</title>
6
+        <link rel="stylesheet" href="./static/css/font.css">
7
+        <link rel="stylesheet" href="./static/css/xadmin.css">
8
+        <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
9
+        <script src="./static/lib/layui/layui.js" charset="utf-8"></script>
10
+        <script type="text/javascript" src="./static/js/xadmin.js"></script>
11
+    </head>
12
+    <body>
13
+    <input type="text" id="token" value={{.token}} hidden=true>
14
+
15
+    <dialog open id="modalAdd" class="x-body layui-anim layui-anim-up" hidden=true style = "center;">
16
+        <form action="roll" method="post" class="layui-form layui-form-pane">
17
+            物品列表
18
+            <table class="radio-table" border="1" id="tb_item">
19
+              <thead>
20
+                <th style="width:100px;">物品</th>
21
+                <th style="width:100px;">价值</th>
22
+                <th style="width:256px;">操作</th>
23
+              </thead>
24
+            </table>
25
+            <br>
26
+            <input class="layui-btn" type="button" onclick="modalAddItem()" value=新增道具>
27
+            <hr class="hr15">
28
+            <input value="新增" class="layui-btn" style="width:100%;" type="button" onclick="addRoll()">
29
+            <br>
30
+            <br>
31
+            <input value="关闭" class="layui-btn" style="width:100%;" type="button" onclick="closeModalAdd()">
32
+            <hr class="hr20" >
33
+        </form>
34
+    </dialog>
35
+
36
+    <dialog open id="modalModify" class="x-body layui-anim layui-anim-up" hidden=true style = "center;">
37
+        <form action="roll" method="put" class="layui-form layui-form-pane">
38
+            <input id="id_modify" hidden=true type="text">
39
+            随机物品列表
40
+            <table class="radio-table" border="1" id="tb_item_modify">
41
+              <thead>
42
+                <th style="width:100px;">物品ID</th>
43
+                <th style="width:100px;">物品数量</th>
44
+                <th style="width:100px;">权重</th>
45
+                <th style="width:256px;">操作</th>
46
+              </thead>
47
+            </table>
48
+            <br>
49
+            <input class="layui-btn" type="button" onclick="modalAddItem()" value=新增道具>
50
+            <hr class="hr15">
51
+            <input value="修改" class="layui-btn" style="width:100%;" type="button" onclick="modifyExchangeCode()">
52
+            <br>
53
+            <br>
54
+            <input value="关闭" class="layui-btn" style="width:100%;" type="button" onclick="closeModalModify()">
55
+            <hr class="hr20" >
56
+        </form>
57
+    </dialog>
58
+    <dialog open id="modalItem" class="x-body layui-anim layui-anim-up" hidden=true style = "center;">
59
+        <form class="layui-form layui-form-pane">
60
+            <select name="" id="item_id" onchange="gradeItemChange(this.options[this.options.selectedIndex].value)">
61
+              {{range .ItemList}}
62
+                <option value={{.Id}}>{{.Name}}</option>
63
+              {{end}}
64
+            </select>
65
+            <hr class="hr15">
66
+            <input id="btn" value="新增" class="layui-btn" style="width:100%;" type="button" onclick="addItem()">
67
+            <br>
68
+            <br>
69
+            <input value="关闭" class="layui-btn" style="width:100%;" type="button" onclick="closeModalItem()">
70
+            <hr class="hr20" >
71
+        </form>
72
+    </dialog>
73
+    <br>
74
+    <br>
75
+    <input class="layui-btn" type="button" onclick="OpenAddItem({{.ItemList}})" value=新增>
76
+    <br>
77
+    <br>
78
+    <input class="layui-btn" type="button" onclick="Refresh()" value=刷新>
79
+    <br>
80
+    <br>
81
+    <table class="radio-table" border="1">
82
+      <thead>
83
+        <th style="width:256px;">操作</th>
84
+        <th style="width:64px;">活动ID</th>
85
+        <th style="width:100px;">房间名</th>
86
+        <th style="width:128px;">限制绑定推广码</th>
87
+        <th style="width:256px;">创建时间</th>
88
+        <th style="width:256px;">开始展示时间</th>
89
+        <th style="width:256px;">报名开始时间</th>
90
+        <th style="width:256px;">报名结束时间</th>
91
+        <th style="width:256px;">开奖时间</th>
92
+        <th style="width:128px;">参与条件列表</th>
93
+        <th style="width:128px;">奖励物品ID列表</th>
94
+        <th style="width:128px;">报名玩家ID列表列表</th>
95
+      </thead>
96
+      <tbody>
97
+        {{range .infoList}}
98
+          <tr>
99
+            <td style = "text-align:center;">
100
+              <input class="layui-btn" type="button" onclick="OpenModifyItem({{.Id}}, {{.ItemIdList}}, {.ItemList})" value=修改>
101
+              {{"   | "}}
102
+              <input class="layui-btn" type="button" onclick="clickDelete({{.Id}})" value=删除>
103
+            </td>
104
+            <td style = "text-align:center;">{{.Id}}</td>
105
+            <td style = "text-align:center;">{{.Name}}</td>
106
+            <td style = "text-align:center;">{{.BandShareCode}}</td>
107
+            <td style = "text-align:center;">{{TimeToStr .CreateTime}}</td>
108
+            <td style = "text-align:center;">{{TimeToStr .ShowStartTime}}</td>
109
+            <td style = "text-align:center;">{{TimeToStr .SignupStartTime}}</td>
110
+            <td style = "text-align:center;">{{TimeToStr .SignupEndTime}}</td>
111
+            <td style = "text-align:center;">{{TimeToStr .AwardTime}}</td>
112
+            <td style = "text-align:center;">
113
+              <input class="layui-btn" type="button" onclick="ShowConditions({{.Conditions}})" value=展示>
114
+            </td>
115
+            <td style = "text-align:center;">
116
+              <input class="layui-btn" type="button" onclick="ShowItems({{.ItemIdList}})" value=展示>
117
+            </td>
118
+            <td style = "text-align:center;">
119
+              <input class="layui-btn" type="button" onclick="ShowPlayers({{.SignupUidList}})" value=展示>
120
+            </td>
121
+          </tr>
122
+        {{end}}
123
+      </tbody>
124
+    </table>
125
+    <script language="JavaScript">
126
+      var isModelAdd = true
127
+      var _ItemList = [];
128
+      var awardItemIdList = [];
129
+      // 道具名称
130
+      function getItemName(itemId) {
131
+        var id = parseInt(itemId)
132
+        console.info("getItemName id:"+id)
133
+        for (var i = 0; i < _ItemList.length; i ++){
134
+          console.info("getItemName Id:"+_ItemList[i].id)
135
+          if (_ItemList[i].id == id){
136
+            return _ItemList[i].name
137
+          }
138
+        }
139
+        return ""
140
+      }
141
+      // 道具价格
142
+      function getItemPrice(itemId) {
143
+        var id = parseInt(itemId)
144
+        console.info("getItemPrice id:"+id)
145
+        console.info("getItemPrice _ItemList:"+JSON.stringify(_ItemList))
146
+        for (var i = 0; i < _ItemList.length; i ++){
147
+          if (_ItemList[i].id == id){
148
+            return _ItemList[i].price
149
+          }
150
+        }
151
+        return ""
152
+      }
153
+      // 刷新物品列表
154
+      function refreshTableItem() {
155
+        var key = "tb_item"
156
+        if (isModelAdd == false){key = "tb_item_modify"}
157
+        var obj = document.getElementById(key)
158
+        var tbody = obj.getElementsByTagName("tbody")[0];
159
+        if (tbody) {
160
+          if (-[1,]) {
161
+            obj.removeChild(tbody);
162
+          }else{
163
+            obj.removeNode(tbody);
164
+          }
165
+        }
166
+        for (var i = 0; i < awardItemIdList.length; i ++){
167
+          console.info("refreshTableItem awardItemId:"+awardItemIdList[i])
168
+        }
169
+
170
+        if (awardItemIdList.length > 0 && awardItemIdList[0] != "") {
171
+          tbody = document.createElement("tbody")
172
+          for (var i = 0; i < awardItemIdList.length; i++){
173
+            var tr = document.createElement("tr")
174
+
175
+            var td1 = document.createElement("td")
176
+            td1.style = "text-align:center;"
177
+            td1.innerHTML = getItemName(awardItemIdList[i])
178
+            tr.appendChild(td1)
179
+
180
+            var td2 = document.createElement("td")
181
+            td2.style = "text-align:center;"
182
+            td2.innerHTML = getItemPrice(awardItemIdList[i])
183
+            tr.appendChild(td2)
184
+
185
+            var td4 = document.createElement("td")
186
+            td4.style = "text-align:center;"
187
+            td4.innerHTML = '<input class="layui-btn" type="button" onclick="itemDelete(' + awardItemIdList[i] + ')" value=删除>'
188
+            tr.appendChild(td4)
189
+
190
+            tbody.appendChild(tr)
191
+          }
192
+          obj.appendChild(tbody)
193
+        }
194
+      }
195
+      // 物品弹窗
196
+      function modalAddItem() {
197
+        refreshTableItem()
198
+
199
+        document.getElementById("modalItem").hidden = false;
200
+      }
201
+      function closeModalItem() {
202
+        document.getElementById("modalItem").hidden = true;
203
+      }
204
+      function addItem() {
205
+        var item_id = parseInt(document.getElementById("item_id").value);
206
+
207
+        if (item_id == null || item_id == 0){
208
+          alert("请选择道具");
209
+          return;
210
+        }
211
+
212
+        awardItemIdList.push(item_id)
213
+        refreshTableItem()
214
+        document.getElementById("modalItem").hidden = true;
215
+      }
216
+      // 删除物品
217
+      function itemDelete(itemId) {
218
+        var id = parseInt(itemId)
219
+        console.log("itemDelete itemId:" + itemId)
220
+        for (var i = 0; i < awardItemIdList.length; i ++) {
221
+          if (awardItemIdList[i] == id) {
222
+            console.log("itemDelete 找到道具")
223
+            awardItemIdList.splice(i, 1)
224
+            break
225
+          }
226
+        }
227
+        refreshTableItem()
228
+        document.getElementById("modalItem").hidden = true;
229
+      }
230
+
231
+      function OpenAddItem(itemList) {
232
+        isModelAdd = true
233
+        _ItemList = itemList
234
+        console.log("OpenAddItem _ItemList:"+JSON.stringify(_ItemList))
235
+
236
+        document.getElementById("modalAdd").hidden = false;
237
+      }
238
+      function closeModalAdd() {
239
+        document.getElementById("modalAdd").hidden = true;
240
+      }
241
+      function addRoll () {
242
+        var token = document.getElementById("token").value;
243
+        if (awardItemIdList.length <= 0){
244
+          alert("奖励物品空!");
245
+          return;
246
+        }
247
+
248
+        var text = "token=" + encodeURI(token);
249
+        text += "&items=" + encodeURI(JSON.stringify(awardItemIdList));
250
+
251
+        $.ajax({
252
+          type:"post",
253
+          url:"/roll?" + text,
254
+          success:function (data) {
255
+            // alert(data.status);
256
+            if (data.status){
257
+              window.location.href="/roll";
258
+            }else{
259
+              if (data.info){
260
+                alert(data.info);
261
+              }else{
262
+                window.location.href="/accountlogin";
263
+              }
264
+            }
265
+          }
266
+        });
267
+      }
268
+
269
+      function closeModalItem() {
270
+        document.getElementById("modalItem").hidden = true;
271
+      }
272
+
273
+      function OpenModifyItem(id, itemIdList, itemList) {
274
+        isModelAdd = false;
275
+        _ItemList = itemList
276
+
277
+        awardItemIdList = []
278
+        for (var i = 0; i < items.length; i ++) {
279
+          awardItemIdList.push({'id':items[i].id, 'count':items[i].count, 'weight':items[i].weight});
280
+        }
281
+
282
+        document.getElementById("pcode_modify").value = pcode;
283
+        document.getElementById("awardTimes_modify").value = awardTimes;
284
+        var dateTime = new Date(expireTime*1000);
285
+        document.getElementById("expireTime_modify").value = formaData(dateTime);
286
+        refreshTableItem()
287
+
288
+        document.getElementById("modalModify").hidden = false;
289
+      }
290
+      function closeModalModify() {
291
+        document.getElementById("modalModify").hidden = true;
292
+      }
293
+
294
+      function modifyExchangeCode () {
295
+        var token = document.getElementById("token").value;
296
+        var pcode = document.getElementById("pcode_modify").value;
297
+        var awardTimes = document.getElementById("awardTimes_modify").value;
298
+        var expireTime = document.getElementById("expireTime_modify").value;
299
+
300
+        var text = "token=" + encodeURI(token);
301
+        text += "&pcode=" + encodeURI(pcode);
302
+        text += "&awardTimes=" + encodeURI(awardTimes);
303
+        text += "&expireTime=" + encodeURI(expireTime);
304
+        text += "&items=" + encodeURI(JSON.stringify(awardItemIdList));
305
+
306
+        $.ajax({
307
+          type:"put",
308
+          url:"/roll?" + text,
309
+          success:function (data) {
310
+            // alert(data.status);
311
+            if (data.status){
312
+              window.location.href="/roll";
313
+            }else{
314
+              if (data.info){
315
+                alert(data.info);
316
+              }else{
317
+                window.location.href="/accountlogin";
318
+              }
319
+            }
320
+          }
321
+        });
322
+      }
323
+
324
+      function clickDelete (pcode) {
325
+        var token = document.getElementById("token").value;
326
+        var text = "token=" + encodeURI(token);
327
+        text += "&pcode=" + encodeURI(pcode);
328
+
329
+        $.ajax({
330
+          type:"delete",
331
+          url:"/roll?" + text,
332
+          success:function (data) {
333
+            // alert(data.status);
334
+            if (data.status){
335
+              window.location.href="/roll";
336
+            }else{
337
+              if (data.info){
338
+                alert(data.info);
339
+              }else{
340
+                window.location.href="/accountlogin";
341
+              }
342
+            }
343
+          }
344
+        });
345
+      }
346
+    </script>
347
+    </body>
348
+</html>