Ver código fonte

新增roll奖池管理

neo 1 ano atrás
pai
commit
b7a9496e0f

conf/neo/app.conf_ali → conf/neo-mac/app.conf_ali


+ 1 - 1
conf/neo/app.conf_ali_test

@@ -5,7 +5,7 @@
5 5
 appname = gm
6 6
 httpport = 8082
7 7
 runmode = test
8
-project = neo
8
+project = neo-mac
9 9
 
10 10
 #后台名称
11 11
 apptitle = GM

conf/neo/cfg.conf → conf/neo-mac/cfg.conf


conf/neo/cfg_test.conf → conf/neo-mac/cfg_test.conf


+ 11 - 0
conf/neo-win/app.conf_ali

@@ -0,0 +1,11 @@
1
+#
2
+# 订单
3
+#
4
+
5
+appname = gm
6
+httpport = 8081
7
+runmode = product
8
+project = neo
9
+
10
+#后台名称
11
+apptitle = GM

+ 11 - 0
conf/neo-win/app.conf_ali_test

@@ -0,0 +1,11 @@
1
+#
2
+# 订单
3
+#
4
+
5
+appname = gm
6
+httpport = 8082
7
+runmode = test
8
+project = neo-win
9
+
10
+#后台名称
11
+apptitle = GM

+ 26 - 0
conf/neo-win/cfg.conf

@@ -0,0 +1,26 @@
1
+[mysql]
2
+host=172.18.99.250
3
+port=3306
4
+user=root
5
+password=Jiami_h5
6
+database=gs2
7
+[redis]
8
+count=1
9
+host_0=172.18.99.250
10
+port_0=7121
11
+auth_0=05b5ef6
12
+
13
+host_account=172.18.99.250
14
+port_account=7121
15
+auth_account=05b5ef6
16
+[servers]
17
+game=127.0.0.1:8102
18
+gameKey=tc6CrEuvbtGqo
19
+[sand]
20
+notifyurl=https://p1gs3.52jiami.com/pay/sandpay
21
+101=sDXO4J3vjc8NyjUaAxzsO99+seueoKjeZayC/A5+QyOk+0UQp/UWJEFX0RYuxKjMQAdhB502fdWURR56wogZjtiqs/zlaYhjxkUqV3bei15VNalO+MuQzhIkb5bQoxC4kWVWf8W8iDRixuz+UKFTiw==
22
+[nppa]
23
+status=1
24
+host_check=https://api.wlc.nppa.gov.cn/idcard/authentication/check
25
+host_query=https://api.wlc.nppa.gov.cn/idcard/authentication/query
26
+host_loginout=https://api.wlc.nppa.gov.cn/behavior/collection/loginout

+ 22 - 0
conf/neo-win/cfg_test.conf

@@ -0,0 +1,22 @@
1
+[app]
2
+gameKey=b8JKMN1UhanX
3
+
4
+[gameservers]
5
+web=127.0.0.1:8303
6
+
7
+[events]
8
+path=./log
9
+
10
+[backup]
11
+time_event=03:00:00
12
+days_event=300
13
+
14
+[redis]
15
+count=1
16
+host_0=127.0.0.1
17
+port_0=6381
18
+auth_0=aGMtbmVvLWRldi0yMDIzMDQwNw==
19
+
20
+host_account=127.0.0.1
21
+port_account=6381
22
+auth_account=aGMtbmVvLWRldi0yMDIzMDQwNw==

+ 5 - 0
controllers/default.go

@@ -154,6 +154,11 @@ func getIndex(permission int64) []*NavInfo {
154 154
 			Name: "配置管理",
155 155
 			Url:  "gameconfig.html",
156 156
 		})
157
+		navInfo.IndexList = append(navInfo.IndexList, &IndexInfo{
158
+			Id:   models.ModelSystem,
159
+			Name: "Roll奖励方案管理",
160
+			Url:  "rollaward.html",
161
+		})
157 162
 
158 163
 		navList = append(navList, navInfo)
159 164
 	}

+ 124 - 0
controllers/rollaward.go

@@ -0,0 +1,124 @@
1
+// 实时数据
2
+package controllers
3
+
4
+import (
5
+	"box-gm/models"
6
+	"encoding/json"
7
+	"fmt"
8
+	"log"
9
+
10
+	"github.com/astaxie/beego"
11
+)
12
+
13
+type RollAwardController struct {
14
+	beego.Controller
15
+}
16
+
17
+func (c *RollAwardController) Get() {
18
+	userinfo := c.GetSession("user")
19
+	if userinfo == nil {
20
+		c.Ctx.Redirect(302, "/accountlogin")
21
+		return
22
+	}
23
+	c.Data["username"] = userinfo.(*LoginInfo).Username
24
+	c.Data["token"] = models.GetToken()
25
+	userPermission := models.GetPermission(userinfo.(*LoginInfo).Username)
26
+	if (userPermission & (1 << uint(models.ModelSystem))) == 0 {
27
+		c.Ctx.Redirect(302, "/accountlogin")
28
+		return
29
+	}
30
+
31
+	c.Data["ItemList"] = models.GetItemInfoList()
32
+	c.Data["infoList"] = models.GetRollAwardInfo()
33
+	c.TplName = "rollaward.tpl"
34
+}
35
+
36
+func (c *RollAwardController) Post() {
37
+	userinfo := c.GetSession("user")
38
+	log.Printf("RollAwardController Post userinfo[%v]", userinfo)
39
+	if userinfo == nil {
40
+		c.Ctx.Redirect(302, "/accountlogin")
41
+		return
42
+	}
43
+	items := c.GetString("items")
44
+	var eItems []int
45
+	err := json.Unmarshal([]byte(items), &eItems)
46
+	if err != nil {
47
+		log.Printf("RollAwardController items[%s] err[%v]", items, err)
48
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": err.Error()}
49
+		c.ServeJSON()
50
+		return
51
+	}
52
+
53
+	u := new(models.RollAwardInfo)
54
+	u.Id = models.CreateRollAwardId()
55
+	u.ItemIdList = eItems
56
+
57
+	err = models.AddRollAwardInfo(u)
58
+	if err != nil {
59
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": err.Error()}
60
+		c.ServeJSON()
61
+		return
62
+	}
63
+
64
+	c.Data["json"] = &map[string]interface{}{"status": true, "info": "新增roll房奖池方案成功"}
65
+	c.ServeJSON()
66
+}
67
+
68
+func (c *RollAwardController) Put() {
69
+	userinfo := c.GetSession("user")
70
+	if userinfo == nil {
71
+		c.Ctx.Redirect(302, "/accountlogin")
72
+		return
73
+	}
74
+	id, _ := c.GetInt("id")
75
+	log.Printf("RollAwardController Put id[%d]", id)
76
+	hf := models.GetRollAwardInfoById(id)
77
+	if hf == nil {
78
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": "修改失败:奖池方案不存在"}
79
+		c.ServeJSON()
80
+		return
81
+	}
82
+	items := c.GetString("items")
83
+	var eItems []int
84
+	err := json.Unmarshal([]byte(items), &eItems)
85
+	if err != nil {
86
+		log.Printf("RollAwardController items[%s] err[%v]", items, err)
87
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": err.Error()}
88
+		c.ServeJSON()
89
+		return
90
+	}
91
+
92
+	hf.ItemIdList = eItems
93
+
94
+	err = models.UpdateRollAwardInfo(hf)
95
+	if err != nil {
96
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": err}
97
+		c.ServeJSON()
98
+		return
99
+	}
100
+	c.Data["json"] = &map[string]interface{}{"status": true, "info": fmt.Sprintf("修改奖池方案[%d]成功", id)}
101
+	c.ServeJSON()
102
+}
103
+
104
+func (c *RollAwardController) Delete() {
105
+	userinfo := c.GetSession("user")
106
+	if userinfo == nil {
107
+		c.Ctx.Redirect(302, "/accountlogin")
108
+		return
109
+	}
110
+
111
+	id, _ := c.GetInt("id")
112
+	log.Printf("RollAwardController Post Delete id[%d]", id)
113
+	hf := models.GetRollAwardInfoById(id)
114
+	if hf == nil {
115
+		c.Data["json"] = &map[string]interface{}{"status": false, "info": "修改失败:兑换码配置不存在"}
116
+		c.ServeJSON()
117
+		return
118
+	}
119
+
120
+	models.DelRollAwardInfoById(id)
121
+
122
+	c.Data["json"] = &map[string]interface{}{"status": true, "info": "删除兑换码成功"}
123
+	c.ServeJSON()
124
+}

+ 14 - 0
main.go

@@ -106,6 +106,18 @@ func WeightItems(items []*models.ExchangeItemsInfo) string {
106 106
 	return cnt
107 107
 }
108 108
 
109
+// 道具列表
110
+func BeegoItemNameList(items []int) string {
111
+	cnt := ""
112
+	for _, v := range items {
113
+		if cnt != "" {
114
+			cnt += ","
115
+		}
116
+		cnt += fmt.Sprintf("%s", models.GetItemName(v))
117
+	}
118
+	return cnt
119
+}
120
+
109 121
 // 初始化beego fun
110 122
 func initBeegoFunMap() {
111 123
 	beego.AddFuncMap("TimeToStr", TimeToStr)
@@ -116,6 +128,7 @@ func initBeegoFunMap() {
116 128
 	beego.AddFuncMap("TimeCmdOperate", TimeCmdOperate)
117 129
 	beego.AddFuncMap("TimeCmdOperateStatus", TimeCmdOperateStatus)
118 130
 	beego.AddFuncMap("WeightItems", WeightItems)
131
+	beego.AddFuncMap("BeegoItemNameList", BeegoItemNameList)
119 132
 }
120 133
 
121 134
 func main() {
@@ -145,6 +158,7 @@ func main() {
145 158
 	models.InitExchangeCodeInfo()
146 159
 	models.UpdateItemConfig()
147 160
 	models.UpdateGoodsConfig()
161
+	models.InitRollAwardInfo()
148 162
 
149 163
 	//模板初始化
150 164
 	initBeegoFunMap()

+ 223 - 0
models/rollaward.go

@@ -0,0 +1,223 @@
1
+package models
2
+
3
+// roll房奖池
4
+import (
5
+	"box-gm/utils"
6
+	"encoding/json"
7
+	"errors"
8
+	"fmt"
9
+	"log"
10
+	"sync"
11
+
12
+	"github.com/astaxie/beego"
13
+	"github.com/astaxie/beego/validation"
14
+	"github.com/garyburd/redigo/redis"
15
+)
16
+
17
+type RollAwardInfo struct {
18
+	Id         int   `json:"id"`         // 奖池ID
19
+	ItemIdList []int `json:"itemIdList"` // 奖励列表
20
+}
21
+
22
+type RollAwardInfoArray []*RollAwardInfo
23
+
24
+var rollAwardList RollAwardInfoArray
25
+var raMutex sync.Mutex
26
+var ROLL_AWARD_MAIN_KEY = "roll:award"
27
+
28
+// 创建奖池ID
29
+func CreateRollAwardId() int {
30
+	pool := utils.GetAccountRedisPool()
31
+	if pool == nil {
32
+		fmt.Println("get redis pool fail")
33
+		return 0
34
+	}
35
+	rd := pool.Get()
36
+	if rd == nil {
37
+		fmt.Println("get redis conn fail")
38
+		return 0
39
+	}
40
+	defer rd.Close()
41
+
42
+	reply, err := rd.Do("hincrby", "global", "max:roll:award:id", 1)
43
+	if err != nil {
44
+		fmt.Printf("redis hincrby err: %v", err)
45
+		return 0
46
+	}
47
+	id, err := redis.Int(reply, err)
48
+	if err != nil {
49
+		fmt.Printf("redis hincrby err: %v", err)
50
+		return 0
51
+	}
52
+	return id
53
+}
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
+// 初始化roll房奖池
61
+func InitRollAwardInfo() {
62
+	pool := utils.GetAccountRedisPool()
63
+	if pool == nil {
64
+		fmt.Println("get redis pool fail")
65
+		return
66
+	}
67
+	rd := pool.Get()
68
+	defer rd.Close()
69
+
70
+	reply, err := rd.Do("hgetall", ROLL_AWARD_MAIN_KEY)
71
+	if err != nil {
72
+		log.Printf("InitRollAwardInfo err:%v", err)
73
+		return
74
+	}
75
+	vals, err := redis.Values(reply, err)
76
+	if err != nil {
77
+		log.Printf("InitRollAwardInfo err:%v", err)
78
+		return
79
+	}
80
+
81
+	for i := 0; i < len(vals)/2; i++ {
82
+		id := utils.StringToInt(vals[i*2].([]byte))
83
+		var itemIdList []int
84
+		err = json.Unmarshal(vals[i*2+1].([]byte), &itemIdList)
85
+		if err != nil {
86
+			log.Printf("InitRollAwardInfo err:%v", err)
87
+			return
88
+		}
89
+
90
+		rollAwardList = append(rollAwardList, &RollAwardInfo{
91
+			Id:         id,
92
+			ItemIdList: itemIdList,
93
+		})
94
+	}
95
+
96
+	beego.Info("load roll award info", len(rollAwardList))
97
+}
98
+
99
+func checkRollAwardInfo(hf *RollAwardInfo) (err error) {
100
+	valid := validation.Validation{}
101
+	b, _ := valid.Valid(&hf)
102
+	if !b {
103
+		for _, err := range valid.Errors {
104
+			log.Println(err.Key, err.Message)
105
+			return errors.New(err.Message)
106
+		}
107
+	}
108
+	return nil
109
+}
110
+
111
+// 新增roll房奖池
112
+func AddRollAwardInfo(hf *RollAwardInfo) error {
113
+	pool := utils.GetAccountRedisPool()
114
+	if pool == nil {
115
+		return fmt.Errorf("get redis pool fail")
116
+	}
117
+	rd := pool.Get()
118
+	defer rd.Close()
119
+
120
+	if err := checkRollAwardInfo(hf); err != nil {
121
+		return err
122
+	}
123
+	if hf.Id == 0 {
124
+		hf.Id = CreateRollAwardId()
125
+	}
126
+	if hf.Id == 0 {
127
+		return fmt.Errorf("分配奖池ID失败")
128
+	}
129
+
130
+	items, err := json.Marshal(hf.ItemIdList)
131
+	if err != nil {
132
+		return err
133
+	}
134
+	rd.Do("hset", ROLL_AWARD_MAIN_KEY, hf.Id, items)
135
+
136
+	raMutex.Lock()
137
+	rollAwardList = append(rollAwardList, hf)
138
+	raMutex.Unlock()
139
+
140
+	return nil
141
+}
142
+
143
+// 修改roll房奖池
144
+func UpdateRollAwardInfo(hf *RollAwardInfo) error {
145
+	pool := utils.GetAccountRedisPool()
146
+	if pool == nil {
147
+		return fmt.Errorf("get redis pool fail")
148
+	}
149
+	rd := pool.Get()
150
+	defer rd.Close()
151
+
152
+	if err := checkRollAwardInfo(hf); err != nil {
153
+		return err
154
+	}
155
+
156
+	items, err := json.Marshal(hf.ItemIdList)
157
+	if err != nil {
158
+		return err
159
+	}
160
+	rd.Do("hset", ROLL_AWARD_MAIN_KEY, hf.Id, items)
161
+
162
+	raMutex.Lock()
163
+	for i := 0; i < len(rollAwardList); i++ {
164
+		if hf.Id == rollAwardList[i].Id {
165
+			old := rollAwardList[i]
166
+
167
+			old.ItemIdList = hf.ItemIdList
168
+			break
169
+		}
170
+	}
171
+	raMutex.Unlock()
172
+
173
+	return nil
174
+
175
+}
176
+
177
+// 删除roll房奖池
178
+func DelRollAwardInfoById(id int) error {
179
+	pool := utils.GetAccountRedisPool()
180
+	if pool == nil {
181
+		return fmt.Errorf("get redis pool fail")
182
+	}
183
+	rd := pool.Get()
184
+	defer rd.Close()
185
+
186
+	raMutex.Lock()
187
+	defer raMutex.Unlock()
188
+
189
+	_, err := rd.Do("hdel", ROLL_AWARD_MAIN_KEY, id)
190
+	if err != nil {
191
+		log.Println(err)
192
+		return err
193
+	}
194
+
195
+	for i := 0; i < len(rollAwardList); i++ {
196
+		if id == rollAwardList[i].Id {
197
+			ii := i + 1
198
+			rollAwardList = append(rollAwardList[:i], rollAwardList[ii:]...)
199
+		}
200
+	}
201
+
202
+	return nil
203
+}
204
+
205
+// 获取roll房奖池信息
206
+func GetRollAwardInfoById(id int) (hf *RollAwardInfo) {
207
+	raMutex.Lock()
208
+	defer raMutex.Unlock()
209
+
210
+	for i := 0; i < len(rollAwardList); i++ {
211
+		if id == rollAwardList[i].Id {
212
+			return rollAwardList[i]
213
+		}
214
+	}
215
+
216
+	return nil
217
+}
218
+func GetRollAwardInfo() RollAwardInfoArray {
219
+	raMutex.Lock()
220
+	defer raMutex.Unlock()
221
+
222
+	return rollAwardList
223
+}

+ 1 - 0
routers/router.go

@@ -60,4 +60,5 @@ func init() {
60 60
 	beego.Router("/banip", &controllers.BanIPController{})
61 61
 	beego.Router("/exchangecode", &controllers.ExchangeCodeController{})
62 62
 	beego.Router("/gameconfig", &controllers.GameConfigController{})
63
+	beego.Router("/rollaward", &controllers.RollAwardController{})
63 64
 }

+ 324 - 0
views/rollaward.tpl

@@ -0,0 +1,324 @@
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="rollaward" 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="addRollAward()">
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="rollaward" 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:512px;">奖励列表</th>
86
+      </thead>
87
+      <tbody>
88
+        {{range .infoList}}
89
+          <tr>
90
+            <td style = "text-align:center;">
91
+              <input class="layui-btn" type="button" onclick="OpenModifyItem({{.Id}}, {{.ItemIdList}}, {.ItemList})" value=修改>
92
+              {{"   | "}}
93
+              <input class="layui-btn" type="button" onclick="clickDelete({{.Id}})" value=删除>
94
+            </td>
95
+            <td style = "text-align:center;">{{.Id}}</td>
96
+            <td style = "text-align:center;">{{BeegoItemNameList .ItemIdList}}</td>
97
+          </tr>
98
+        {{end}}
99
+      </tbody>
100
+    </table>
101
+    <script language="JavaScript">
102
+      var isModelAdd = true
103
+      var _ItemList = [];
104
+      var awardItemIdList = [];
105
+      // 道具名称
106
+      function getItemName(itemId) {
107
+        var id = parseInt(itemId)
108
+        console.info("getItemName id:"+id)
109
+        for (var i = 0; i < _ItemList.length; i ++){
110
+          console.info("getItemName Id:"+_ItemList[i].id)
111
+          if (_ItemList[i].id == id){
112
+            return _ItemList[i].name
113
+          }
114
+        }
115
+        return ""
116
+      }
117
+      // 道具价格
118
+      function getItemPrice(itemId) {
119
+        var id = parseInt(itemId)
120
+        console.info("getItemPrice id:"+id)
121
+        console.info("getItemPrice _ItemList:"+JSON.stringify(_ItemList))
122
+        for (var i = 0; i < _ItemList.length; i ++){
123
+          if (_ItemList[i].id == id){
124
+            return _ItemList[i].price
125
+          }
126
+        }
127
+        return ""
128
+      }
129
+      // 刷新物品列表
130
+      function refreshTableItem() {
131
+        var key = "tb_item"
132
+        if (isModelAdd == false){key = "tb_item_modify"}
133
+        var obj = document.getElementById(key)
134
+        var tbody = obj.getElementsByTagName("tbody")[0];
135
+        if (tbody) {
136
+          if (-[1,]) {
137
+            obj.removeChild(tbody);
138
+          }else{
139
+            obj.removeNode(tbody);
140
+          }
141
+        }
142
+        for (var i = 0; i < awardItemIdList.length; i ++){
143
+          console.info("refreshTableItem awardItemId:"+awardItemIdList[i])
144
+        }
145
+
146
+        if (awardItemIdList.length > 0 && awardItemIdList[0] != "") {
147
+          tbody = document.createElement("tbody")
148
+          for (var i = 0; i < awardItemIdList.length; i++){
149
+            var tr = document.createElement("tr")
150
+
151
+            var td1 = document.createElement("td")
152
+            td1.style = "text-align:center;"
153
+            td1.innerHTML = getItemName(awardItemIdList[i])
154
+            tr.appendChild(td1)
155
+
156
+            var td2 = document.createElement("td")
157
+            td2.style = "text-align:center;"
158
+            td2.innerHTML = getItemPrice(awardItemIdList[i])
159
+            tr.appendChild(td2)
160
+
161
+            var td4 = document.createElement("td")
162
+            td4.style = "text-align:center;"
163
+            td4.innerHTML = '<input class="layui-btn" type="button" onclick="itemDelete(' + awardItemIdList[i] + ')" value=删除>'
164
+            tr.appendChild(td4)
165
+
166
+            tbody.appendChild(tr)
167
+          }
168
+          obj.appendChild(tbody)
169
+        }
170
+      }
171
+      // 物品弹窗
172
+      function modalAddItem() {
173
+        refreshTableItem()
174
+
175
+        document.getElementById("modalItem").hidden = false;
176
+      }
177
+      function closeModalItem() {
178
+        document.getElementById("modalItem").hidden = true;
179
+      }
180
+      function addItem() {
181
+        var item_id = parseInt(document.getElementById("item_id").value);
182
+
183
+        if (item_id == null || item_id == 0){
184
+          alert("请选择道具");
185
+          return;
186
+        }
187
+
188
+        awardItemIdList.push(item_id)
189
+        refreshTableItem()
190
+        document.getElementById("modalItem").hidden = true;
191
+      }
192
+      // 删除物品
193
+      function itemDelete(itemId) {
194
+        var id = parseInt(itemId)
195
+        console.log("itemDelete itemId:" + itemId)
196
+        for (var i = 0; i < awardItemIdList.length; i ++) {
197
+          if (awardItemIdList[i] == id) {
198
+            console.log("itemDelete 找到道具")
199
+            awardItemIdList.splice(i, 1)
200
+            break
201
+          }
202
+        }
203
+        refreshTableItem()
204
+        document.getElementById("modalItem").hidden = true;
205
+      }
206
+
207
+      function OpenAddItem(itemList) {
208
+        isModelAdd = true
209
+        _ItemList = itemList
210
+        console.log("OpenAddItem _ItemList:"+JSON.stringify(_ItemList))
211
+
212
+        document.getElementById("modalAdd").hidden = false;
213
+      }
214
+      function closeModalAdd() {
215
+        document.getElementById("modalAdd").hidden = true;
216
+      }
217
+      function addRollAward () {
218
+        var token = document.getElementById("token").value;
219
+        if (awardItemIdList.length <= 0){
220
+          alert("奖励物品空!");
221
+          return;
222
+        }
223
+
224
+        var text = "token=" + encodeURI(token);
225
+        text += "&items=" + encodeURI(JSON.stringify(awardItemIdList));
226
+
227
+        $.ajax({
228
+          type:"post",
229
+          url:"/rollaward?" + text,
230
+          success:function (data) {
231
+            // alert(data.status);
232
+            if (data.status){
233
+              window.location.href="/rollaward";
234
+            }else{
235
+              if (data.info){
236
+                alert(data.info);
237
+              }else{
238
+                window.location.href="/accountlogin";
239
+              }
240
+            }
241
+          }
242
+        });
243
+      }
244
+
245
+      function closeModalItem() {
246
+        document.getElementById("modalItem").hidden = true;
247
+      }
248
+
249
+      function OpenModifyItem(id, itemIdList, itemList) {
250
+        isModelAdd = false;
251
+        _ItemList = itemList
252
+
253
+        awardItemIdList = []
254
+        for (var i = 0; i < items.length; i ++) {
255
+          awardItemIdList.push({'id':items[i].id, 'count':items[i].count, 'weight':items[i].weight});
256
+        }
257
+
258
+        document.getElementById("pcode_modify").value = pcode;
259
+        document.getElementById("awardTimes_modify").value = awardTimes;
260
+        var dateTime = new Date(expireTime*1000);
261
+        document.getElementById("expireTime_modify").value = formaData(dateTime);
262
+        refreshTableItem()
263
+
264
+        document.getElementById("modalModify").hidden = false;
265
+      }
266
+      function closeModalModify() {
267
+        document.getElementById("modalModify").hidden = true;
268
+      }
269
+
270
+      function modifyExchangeCode () {
271
+        var token = document.getElementById("token").value;
272
+        var pcode = document.getElementById("pcode_modify").value;
273
+        var awardTimes = document.getElementById("awardTimes_modify").value;
274
+        var expireTime = document.getElementById("expireTime_modify").value;
275
+
276
+        var text = "token=" + encodeURI(token);
277
+        text += "&pcode=" + encodeURI(pcode);
278
+        text += "&awardTimes=" + encodeURI(awardTimes);
279
+        text += "&expireTime=" + encodeURI(expireTime);
280
+        text += "&items=" + encodeURI(JSON.stringify(awardItemIdList));
281
+
282
+        $.ajax({
283
+          type:"put",
284
+          url:"/rollaward?" + text,
285
+          success:function (data) {
286
+            // alert(data.status);
287
+            if (data.status){
288
+              window.location.href="/rollaward";
289
+            }else{
290
+              if (data.info){
291
+                alert(data.info);
292
+              }else{
293
+                window.location.href="/accountlogin";
294
+              }
295
+            }
296
+          }
297
+        });
298
+      }
299
+
300
+      function clickDelete (pcode) {
301
+        var token = document.getElementById("token").value;
302
+        var text = "token=" + encodeURI(token);
303
+        text += "&pcode=" + encodeURI(pcode);
304
+
305
+        $.ajax({
306
+          type:"delete",
307
+          url:"/rollaward?" + text,
308
+          success:function (data) {
309
+            // alert(data.status);
310
+            if (data.status){
311
+              window.location.href="/rollaward";
312
+            }else{
313
+              if (data.info){
314
+                alert(data.info);
315
+              }else{
316
+                window.location.href="/accountlogin";
317
+              }
318
+            }
319
+          }
320
+        });
321
+      }
322
+    </script>
323
+    </body>
324
+</html>