Compare commits

...

321 Commits

Author SHA1 Message Date
25044d9e03 moliparty-prod url 2025-10-14 16:07:03 +08:00
69ce487011 房间内角标入口 - 编辑修复财富等级限制生效范围问题 2025-10-14 16:06:28 +08:00
e7b2c00718 房间内角标入口 - 编辑修复财富等级限制生效范围问题 2025-10-14 16:06:28 +08:00
513521de5d 房间内角标入口 - 配置增加财富等级限制生效范围 2025-10-14 16:06:27 +08:00
124f1a1116 赠送钻石水晶 - 修复点击确认后再点击取消后点击确认赠送没反应bug 2025-10-13 10:27:32 +08:00
23f582f376 公会主播管理 - 列表增加操作时间字段 2025-10-11 16:34:00 +08:00
840b9f217b X垃圾嫌疑用户 - 修复分页功能 2025-09-29 14:48:23 +08:00
17869f42b5 X垃圾嫌疑用户 - 增加分区 2025-09-29 13:50:01 +08:00
cddb40925b 新增 - X垃圾嫌疑用户 2025-09-29 13:50:00 +08:00
f41eb994fb 幸运24-后台-关注用户个人数据-后台关注用户 2025-09-27 22:27:17 +08:00
51ed92192a 幸运24-后台-关注用户个人数据 2025-09-27 20:59:49 +08:00
faaf9332e3 幸运24-后台-个人数据-导出 2025-09-27 20:59:48 +08:00
aafc4ae1ff 多语言管理 - 修复编辑多语言保存时trimTextArea方法报错问题 2025-09-26 16:04:47 +08:00
e174bf30d4 分区充值统计-独联体 2025-09-26 14:03:11 +08:00
b8f105e3a9 CIS公会钻石奖励 -修改表头文字,CIS公会成员钻石奖励 - 增加表头字段 2025-09-26 10:22:46 +08:00
1c5d01b25f 开屏设置 - 增加多语言翻译 2025-09-25 18:50:11 +08:00
89b308e515 勋章信息管理 - 新增勋章时选择地区默认英语区问题 2025-09-25 17:57:25 +08:00
e027524d22 CIS公会成员钻石奖励 - 增加公会搜索 2025-09-25 10:48:11 +08:00
952056770b CIS房主钻石奖励 / CIS公会成员钻石奖励 - 增加表头额外收益发放状态 2025-09-25 10:48:10 +08:00
fa556a357c 独联体 - 新增CIS房主钻石奖励 / CIS公会成员钻石奖励 / CIS公会钻石奖励 2025-09-25 10:48:10 +08:00
aff85e8e41 部分页面增加 -俄语/西班牙语/乌兹别克语翻译 2025-09-25 10:48:09 +08:00
5751e68318 分区新增 - 独联体 2025-09-25 10:48:08 +08:00
e5a3152276 礼物管理 - 礼物价格不显示问题 2025-09-18 18:06:36 +08:00
ca4290ca46 赠送钻石水晶-提取公共方法 2025-09-12 13:42:17 +08:00
05d1540982 官方提现记录 - 查看详情兼容英语2区字段 2025-09-09 18:53:48 +08:00
caf9bc581c 官方提现记录 - 查看详情兼容英语2区字段 2025-09-09 18:46:08 +08:00
d494a54584 新增 - 日任务奖励领取详情,房间每日钻石流水 - 新增领取金币字段 2025-09-08 11:17:38 +08:00
b2f6224b09 赠送钻石水晶 - 备注输入框更换 2025-09-02 18:29:48 +08:00
7540764a57 消息管理 - 修改 选择消息类型为图文时,跳转来源为无 弹出的错误提示 2025-09-02 15:21:59 +08:00
ec69266e5d 每日金币统计 - 默认加载七天数据,公会统计数据 - 增加千分位 2025-08-28 10:56:16 +08:00
215c94b127 后台优化 - 充值明细 搜索项增加 2025-08-27 15:21:58 +08:00
06e0226a3f 后台优化 - 统计查询-公会周统计数据 - 增加“公会负责人” 2025-08-27 15:21:58 +08:00
495d5c8299 后台优化-充值代理代发/售卖分析 - 详情表格排序:总转赠薪资倒序排序 2025-08-27 15:21:57 +08:00
75879f805b 后台优化 - 各分区充值统计 - 增加国家明细 2025-08-27 15:21:57 +08:00
83e3df1b52 后台优化 - 房间内角标入口 - 搜索项 - 增加游戏第三方 2025-08-27 15:21:56 +08:00
d8c34bc059 公会信息-查询-开始结束时间 2025-08-22 18:21:05 +08:00
3cb72e3eb6 用户信息 - 编辑隐藏 财富等级/魅力等级 2025-08-22 16:34:52 +08:00
1790a8d9ee 用户信息 - 客服 修改页面空白问题 2025-08-22 16:34:52 +08:00
e1af2e132a 用户信息-客服 修改查询数据叠加问题 2025-08-22 16:34:51 +08:00
147bc355b6 新增 用户信息-客服/赠送 VIP-客服 2025-08-22 16:34:51 +08:00
1d28c4baf6 铭牌信息管理 - 编辑 可修改铭牌类型 2025-08-22 16:04:24 +08:00
042bdd6c97 公会信息 - 编辑添加 接口改成JSON 数据格式 2025-08-22 14:09:34 +08:00
52b180aa25 新增 - 紫水晶清除记录 2025-08-22 10:57:32 +08:00
33ca187038 赠送钻石水晶-增加公会紫晶 2025-08-22 10:57:31 +08:00
3d8861550a 正式环境 - 区分 公会信息 - 表头新增公会地区,编辑新增修改公会地区 2025-08-21 19:13:09 +08:00
2b4d966dac 公会信息 - 表头新增公会地区,编辑新增修改公会地区 2025-08-21 18:39:59 +08:00
6f0a26a426 赠送钻石水晶-增加参考数值-监听计算 2025-08-18 18:09:16 +08:00
b34ef8e651 game汇总 - 用户明细详情/导出 更换接口 2025-08-18 11:28:54 +08:00
477615e1ca 公会信息客服-查询-开始结束时间 2025-08-15 20:00:23 +08:00
2b5f58a505 赠送钻石水晶-增加参考数值 2025-08-15 18:35:30 +08:00
696655ef9b 公会周统计-增加公会长地区 2025-08-15 18:35:29 +08:00
cdfbde1247 公会信息-查询-开始结束时间 2025-08-15 18:35:29 +08:00
e29ead6003 钻石清除记录 - 修改清除时间格式 2025-08-15 14:49:21 +08:00
8a15bd6a2d 新增 - 钻石清除记录 2025-08-15 14:49:20 +08:00
6b9b090089 公会主播钻石收入 - 修改表格字段 , 新增薪资明细页面 2025-08-15 14:49:20 +08:00
53c42cff24 Boom等级配置 - 配置金豆 2025-08-13 16:13:52 +08:00
0d0304a279 修改 贵族基本信息管理 - 访客记录传值 2025-08-12 10:42:20 +08:00
a9fd3cf179 等级修改记录 - 修改分页问题 2025-08-08 16:58:42 +08:00
4ce36d6571 用户信息查询 - 增加修改财富魅力等级,新增等级修改记录列表 2025-08-08 16:58:41 +08:00
8f2a0cb8aa 修复 贵族基本信息管理 - 上传图片问题 2025-08-07 11:27:24 +08:00
143185864d 金币钻石操作记录 - 类型增加操作薪资,主播薪资操作 - 增加官方操作 2025-08-04 14:16:30 +08:00
b1ac2635e3 金币赠送类型配置 - 增加 官方消除薪资/官方赠送薪资 2025-08-04 14:16:29 +08:00
e218229168 正式环境 - 区分公会信息 / 公会信息-运营 2025-08-01 18:37:39 +08:00
khalil
95ea7df9c7 首页-国家列表-表单校验 2025-08-01 11:45:11 +08:00
khalil
790d49b83b 首页-国家列表 2025-08-01 11:45:10 +08:00
2f1f047b90 运营幸运数据查询/运营游戏数据查询 - 增加分页功能 2025-07-30 10:23:47 +08:00
d604f3b914 运营流水分析 - 负责人联动分区 2025-07-29 11:27:41 +08:00
1c080c85c7 负责人管理 - 修改初始表单字段 2025-07-25 18:47:11 +08:00
f8748cb782 负责人管理 - 修复页面报错空白问题3 2025-07-25 18:40:46 +08:00
808f0e1bb7 负责人管理 - 修复页面报错空白问题2 2025-07-25 18:33:06 +08:00
1c4841a2e2 负责人管理 - 修复页面报错空白问题 2025-07-25 18:33:05 +08:00
9c1368a211 新增- 运营公会/主播分析 2025-07-25 16:36:14 +08:00
d81a692c60 运营幸运数据查询/运营游戏数据查询 - 增加千分号 2025-07-25 16:18:46 +08:00
d4acd1673d 运营幸运数据查询 - 增加比列百分比以及千分号 2025-07-25 14:56:16 +08:00
a93a2814b8 运营游戏数据查询 - 增加比列百分比以及千分号 2025-07-25 14:56:15 +08:00
3615c5baa9 新增 - 运营游戏数据查询 2025-07-25 14:56:15 +08:00
0fd68950fb 新增 - 运营幸运数据查询 2025-07-25 14:56:14 +08:00
7859716ba5 新增 - 充值代理代发/售卖分析 2025-07-25 14:52:18 +08:00
khalil
e40fc0b1cf 家族管理-查询-邀请人id 2025-07-24 14:36:55 +08:00
366b1f8e98 官方提现增加 - 操作时间、操作人 2025-07-24 10:25:33 +08:00
9b927e4820 各区【充值统计】增加V5_Play,今日充值数据/累计充值数据增加V5_Play,以及重构以上页面 2025-07-23 14:48:45 +08:00
2560a5f064 运营流水分析 - 增加周环比百分号 2025-07-23 14:48:44 +08:00
2d648fbb70 公会信息 - 添加的时候增加选择负责人 2025-07-23 14:48:44 +08:00
ca590b6b74 运营流水分析 - 修改地区明细详情里流水字段 2025-07-23 14:48:43 +08:00
khalil
61fcdf378f 赠送钻石水晶-根据角色获取typeList 2025-07-23 14:48:42 +08:00
khalil
23d991f06f 角色管理-增加每月赠送金币限额 2025-07-23 14:48:42 +08:00
khalil
b382dd35d3 公会管理-查询-邀请人id 2025-07-23 14:48:42 +08:00
8cf249962c 完善 - 运营流水分析 2025-07-23 14:48:41 +08:00
khalil
b06c935207 公会管理-编辑-负责人根据当前分区和地区过滤 2025-07-23 14:48:40 +08:00
63d56c6501 新增-负责人管理/运营流水分析/负责人变更记录,公会信息新增选择负责人 2025-07-23 14:48:40 +08:00
81d317c492 封禁账号管理 - 增加封禁备注/是否封禁近30天关联设备 2025-07-23 10:36:41 +08:00
e23c8aa156 game用户汇总- 增加投入次数 2025-07-23 10:36:40 +08:00
dd8210fc05 修复-礼物管理点击编辑报错问题 2025-07-18 14:34:34 +08:00
5c9d6ec300 修复 - 代充身份设置 - 因地区数组为空编辑打不开问题 2025-07-17 11:21:29 +08:00
6e8f777d96 新增 - 房间钻石流水查询 2025-07-16 14:52:04 +08:00
khalil
fdabc476af 葡萄牙语-去掉葡萄牙语区 2025-07-15 21:29:25 +08:00
khalil
adc74fe2ae 葡萄牙语 2025-07-15 15:53:12 +08:00
khalil
7d04f3c012 房间列表-调整查询表单样式 2025-07-14 11:25:37 +08:00
01cac4a280 礼包配置中心 - 完善进页面请求接口 2025-07-11 11:40:58 +08:00
450ed68c70 礼包配置中心 - 奖品列表删除奖品刷新列表 2025-07-11 11:40:57 +08:00
b76180fc4b 新增 礼包配置中心 / 礼包发放记录 / 礼包使用记录 2025-07-11 11:40:57 +08:00
eaba467455 新增-活动基本数据统计 2025-07-11 11:40:56 +08:00
khalil
3e7bbdf1c7 幸运24-个人-自定义排序 2025-07-08 12:13:12 +08:00
0370e62f8c 房间BOOM管理 - 数据记录 - 修改时间格式化 2025-07-07 18:52:02 +08:00
27502d1969 幸运数字提交记录 - 内表格分页方法 2025-07-07 17:14:22 +08:00
b5ca58af58 贵族基本信息管理 - 修改编辑的时候传值问题 2025-07-07 15:55:26 +08:00
khalil
762cd12b74 幸运礼物-个人汇总-用户充值等级-查询 2025-07-04 18:42:39 +08:00
952270a147 房间内角标入口 - 入口名称新增多语言 2025-07-04 15:12:03 +08:00
07b291fe57 修改勋章等级管理 - 编辑修改分区错误问题 2025-07-03 18:43:34 +08:00
chenruiye
f433e4aaa8 勋章信息管理 - 修改勋章图片位置 2025-07-03 10:30:19 +08:00
chenruiye
05db254040 完善勋章等级管理页面问题 2025-07-03 10:30:18 +08:00
chenruiye
a7ea9e0296 修改勋章等级管理 - 勋章名字 2025-07-03 10:30:18 +08:00
chenruiye
f21b0b6bb2 勋章等级管理 -勋章等级增加全部选项 2025-07-03 10:30:17 +08:00
chenruiye
7e381e1155 修复勋章记录管理页面 勋章等级管理 报错问题 2025-07-03 10:30:17 +08:00
chenruiye
90da1d4674 修复勋章记录管理页面报错问题 2025-07-03 10:30:17 +08:00
chenruiye
239e4c4ed8 修复勋章信息管理页面报错问题 2025-07-03 10:30:16 +08:00
chenruiye
63b9eec8c8 修复勋章信息管理页面报错问题 2025-07-03 10:30:16 +08:00
chenruiye
799f767e0d 勋章信息管理-新增上传mp4、获得方式,新增勋章等级管理页面 2025-07-03 10:30:15 +08:00
chenruiye
fdf71c854e 贵族基本信息管理-隐藏贵族礼物和贵族表情 2025-07-03 10:30:15 +08:00
chenruiye
18dd168f47 贵族基本信息管理 - 增加勋章席位/头饰,修改贵族特权数据回显 2025-07-03 10:30:15 +08:00
khalil
cd56f5b67a 幸运24-配置-个人库存-调整ui 2025-07-02 15:05:15 +08:00
chenruiye
f0e6794903 修改banner管理/第二banner管理 细节 2025-07-02 11:59:25 +08:00
chenruiye
fdeb7df3ab banner管理/第二banner管理 新增用户等级限制 2025-07-02 11:59:25 +08:00
khalil
e19b716a67 幸运24-配置-个人库存 2025-07-01 20:44:58 +08:00
khalil
033de46bca 幸运24-记录-库存结果 2025-07-01 18:43:35 +08:00
khalil
90bac1464f 小游戏-灵-抽水-删除 2025-07-01 11:29:49 +08:00
khalil
bbf73880ef 小游戏-灵-抽水 2025-07-01 11:29:41 +08:00
khalil
bed9c1b614 小游戏-灵-增加用户充值等级 2025-07-01 11:29:38 +08:00
khalil
5704175cc6 公会-主播管理-保存-增加错误提示弹窗 2025-06-30 16:36:10 +08:00
khalil
80c0c1d15c 幸运礼物-额外数组配置-配置-vo结构 2025-06-27 18:29:22 +08:00
chenruiye
091ec24d86 新增官方提现方式配置 2025-06-27 16:52:50 +08:00
chenruiye
b18dc26052 幸运数字基础设置增加生效日期 2025-06-19 17:40:00 +08:00
chenruiye
a77d6757cd 幸运数字基础配置增加最大可选数 2025-06-19 17:40:00 +08:00
chenruiye
499687fc5a 幸运数字修改配置 2025-06-19 17:39:59 +08:00
chenruiye
4b78298651 新增 幸运数字提交记录 / 幸运数字基础配置 2025-06-19 17:39:58 +08:00
khalil
47ace88c31 幸运礼物-个人汇总-用户充值等级 2025-06-19 11:07:29 +08:00
khalil
ea39538887 幸运礼物-平台汇总-数组类型 2025-06-18 19:55:24 +08:00
khalil
7eed754f42 幸运礼物-个人汇总-数组类型 2025-06-18 15:41:18 +08:00
khalil
851531a75b 幸运礼物-额外数组-配置-用户充值等级 2025-06-15 00:35:22 +08:00
khalil
6f65e9bc6c 幸运礼物-额外数组-配置 2025-06-12 18:38:01 +08:00
khalil
a877ceea36 赠送金币钻石-清除用户钻石-修改传参 2025-06-11 18:17:14 +08:00
chenruiye
3b39dcb51c 公会数据统计-修改弹窗公会长ID显示字段 2025-06-11 13:43:17 +08:00
khalil
69f5c17e84 官方提现记录-修复分页 2025-06-10 17:37:18 +08:00
khalil
945b9a3a0f 用户充值等级-去掉重置按钮 2025-06-10 14:24:03 +08:00
khalil
79de27556e 用户充值等级 2025-06-10 14:24:00 +08:00
chenruiye
8608d7bc65 表情管理-修改批量图片上传列表为可滑动 2025-06-06 18:15:10 +08:00
khalil
f8c9fd4a90 多语言-处理输入框trim 2025-06-05 15:49:28 +08:00
khalil
aed3b73782 赠送金币钻石-平台id输入框去除空白字符 2025-06-05 14:52:49 +08:00
khalil
42ee226cc1 用户信息查询-编辑-地区-加载禁用态 2025-06-05 14:25:18 +08:00
khalil
e387d93d8e 分区-地区-兼容不走公共组件的旧方法 2025-06-04 17:25:01 +08:00
khalil
0aea2bc1cc 房间内角标入口-增加不展示uid选项 2025-06-04 16:26:11 +08:00
khalil
b2befa8a9f 统计-调整分页 2025-06-04 16:26:06 +08:00
khalil
1be71a3d65 统计-公会周统计-日期 2025-06-04 16:26:02 +08:00
khalil
a45fb8f20f 公会钻石薪资流水-增加公会长地区 2025-06-04 16:22:58 +08:00
khalil
359a34c955 公会信息-增加公会长地区 2025-06-04 16:22:53 +08:00
khalil
9986b102f1 用户信息管理-邮箱与手机号 2025-06-04 16:22:50 +08:00
khalil
476f769142 用户信息管理-分区与地区联动 2025-06-04 16:22:45 +08:00
khalil
06d0613981 公会钻石薪资流水-增加地区 2025-06-04 16:21:52 +08:00
khalil
f0ac7b4f6c 公会钻石流水-增加地区 2025-06-04 16:21:46 +08:00
khalil
81065e2e4c 分区-地区-公共组件select 2025-06-04 16:21:42 +08:00
chenruiye
7d768ff9e9 超管中心-头饰管理列表增加头饰图片 2025-05-30 13:58:52 +08:00
chenruiye
e20c7cb32b 超管中心-英语区 2025-05-30 13:58:52 +08:00
chenruiye
80c6fb33f4 超管中心-阿语地区 2025-05-30 13:58:51 +08:00
chenruiye
a969dca1a9 日任务中心-活动奖励配置,奖励发放记录新增相关内容 2025-05-29 15:33:22 +08:00
khalil
a22e4b8e6e 公会信息-增加联系方式类型 2025-05-29 15:10:24 +08:00
khalil
d694a8ebee 后台充值记录-增加公款充值类型 2025-05-29 12:22:47 +08:00
chenruiye
ffce044dd9 修改每日金币统计-数据不展示小数点,幸运礼物增加留存比 2025-05-26 11:29:55 +08:00
chenruiye
94a5d4442c 修改活动模块-房间活动申请 列表显示已删除状态 2025-05-22 13:49:41 +08:00
chenruiye
3ae6a82291 活动模块-房间活动申请 ,房间活动数据统计 2025-05-22 13:49:40 +08:00
chenruiye
deafdd3455 game汇总,game用户汇总新增第三方名称 2025-05-22 13:49:40 +08:00
chenruiye
b0583d97a1 表情管理-新增 表情包管理 ,表情包Tab管理 2025-05-22 13:49:40 +08:00
chenruiye
45b5da6850 充值代理收入转赠薪资-修改创建时间字段 2025-05-19 17:38:59 +08:00
khalil
2fd36936c7 公会钻石流水-增加会长地区和操作人 2025-05-15 12:08:19 +08:00
khalil
22036ad0a1 幸运25-比较阈值 2025-05-12 20:01:58 +08:00
khalil
f429da9a16 幸运25-大R库存 2025-05-12 20:01:56 +08:00
khalil
67b3922dd4 幸运25-调整样式 2025-05-12 20:01:55 +08:00
khalil
b9b81a6aa6 幸运25 2025-05-12 20:01:54 +08:00
chenruiye
a57988d54e 充值明细-修改 总充值文字需要填入平台号显示 2025-05-06 14:08:19 +08:00
chenruiye
ed2aef45d9 充值明细-新增一个新页面,页面逻辑是平台号为必选项,给运营用的页面。 2025-05-06 12:01:00 +08:00
chenruiye
a7e99df44f SS公会奖励发放 - 修复周期下拉列表为空问题,修复导出问题 2025-05-06 10:36:28 +08:00
chenruiye
eec99571e2 英文区公会信息-编辑-修改邀请人ID输入框可编辑状态判断 2025-04-29 15:12:29 +08:00
chenruiye
e79c2c5194 BD管理-修改时间组件传值 2025-04-29 15:12:29 +08:00
chenruiye
a71361ff10 房间每日流水 -新增公会公会长ID筛选项,列表展示项 2025-04-29 15:12:28 +08:00
chenruiye
800d82931f 公会信息-编辑-添加邀请人ID字段 2025-04-29 15:12:28 +08:00
chenruiye
1720052432 BD中心-BD管理列表模块完成 2025-04-29 15:12:27 +08:00
chenruiye
e4d2b06870 BD中心-BD身份设置模块完成 2025-04-29 15:12:27 +08:00
khalil
0e11c133c1 公会-官方提现记录-增加公会id、角色、会长id属性 2025-04-28 14:37:20 +08:00
khalil
a16a1c0d8c 幸运24-记录-个人明细-分页 2025-04-27 20:18:06 +08:00
chenruiye
66d35f787c 修复充值明细页面-分页加载问题 2025-04-25 16:41:56 +08:00
khalil
bd59f9e22f 幸运24-记录-个人明细 2025-04-24 15:54:00 +08:00
chenruiye
c50f26c478 增加分区组件删除指定分区,公会主播管理-修改分区展示值 2025-04-23 13:49:05 +08:00
chenruiye
75719bd505 公会信息-修改移除公会传入字段 2025-04-22 21:32:25 +08:00
chenruiye
80319fbd0d 奖励配置页面-修改按钮位置 2025-04-22 18:10:57 +08:00
chenruiye
b3b6e4ad47 修改公会主播钻石收入 - 默认分区为阿拉伯 2025-04-22 18:10:33 +08:00
chenruiye
d0b9c6e89c 奖励配置列表,奖励发放记录列表 -修改等级列表展示,新增分页功能 2025-04-22 18:10:05 +08:00
chenruiye
cc6212382f 修改分区组件-父组件传值覆盖问题 2025-04-22 18:07:17 +08:00
chenruiye
dad854f161 新增奖励配置列表,奖励发放记录列表 2025-04-22 18:06:48 +08:00
chenruiye
eba06413b3 修改-公会主播管理 无效状态不显示操作按钮 2025-04-22 18:06:17 +08:00
chenruiye
6533005018 新增-公会主播管理 / 公会主播钻石收入 2025-04-22 18:05:49 +08:00
chenruiye
efdb076730 game用户汇总-添加总汇总 2025-04-22 18:05:22 +08:00
khalil
d17a22cd89 公会-公会信息-按公会id查询-familyId 2025-04-22 16:50:34 +08:00
chenruiye
3f1b6758a9 主播退公会申请 -修改表头uid显示字段 2025-04-22 14:02:56 +08:00
khalil
5a1ebf0e59 统计-英语2区 2025-04-21 16:27:23 +08:00
chenruiye
28761cd3f7 房间内角标入口-表头新增可见用户 2025-04-18 16:08:47 +08:00
chenruiye
f774c4a6f6 大R列表-增加总充值金额千分位 2025-04-18 14:00:14 +08:00
chenruiye
c20c5693fe 新增大R用户列表和移除大R列表 2025-04-17 16:02:28 +08:00
chenruiye
54e61b6185 充值代理收入转赠薪资-新增统计时间文字 2025-04-17 13:46:02 +08:00
chenruiye
a9ee446d2b 优化Tab_首页管理 -编辑确认时置顶为否的必填项提示 2025-04-17 10:30:43 +08:00
chenruiye
12fa37fc1b 主播公会申请-新增分区 金币转赠明细-新增分区 充值明细-新增国家 2025-04-16 18:00:08 +08:00
chenruiye
1f7bd0361d 短信验证码记录,邮件验证码记录 -修改分页字段 2025-04-15 16:30:00 +08:00
chenruiye
cea2b471d8 修复公会成员信息-违规警告点击报错问题 2025-04-11 18:20:49 +08:00
chenruiye
47ce14c348 修改幸运礼物活动-个人数据汇总赠送完之后按钮显示问题 2025-04-11 11:21:14 +08:00
chenruiye
8d65cb5b95 修改公会成员信息-查询失败抛出提示 2025-04-09 13:56:41 +08:00
chenruiye
9cd5f79a99 修改游戏管理里分区展示问题,修改充值明细文字展示,子代充里修改和代充身份设置一样 2025-04-08 15:32:41 +08:00
chenruiye
715845cd66 修改超级礼物基础配置选择分区时没有触发接口问题 2025-04-08 14:29:00 +08:00
chenruiye
2f2b856435 代充身份设置-添加是否展示在代发薪资列表字段 2025-04-07 18:03:37 +08:00
chenruiye
f5619e8839 修复公会信息导出缺少分区字段 2025-04-07 15:13:03 +08:00
chenruiye
3989182047 修复每日钻石流水分页问题,修复公会钻石流水导出缺少参数问题 2025-04-07 13:37:01 +08:00
6ca23f1254 分区-公共组件select-替换遗留老组件 2025-04-04 18:08:01 +08:00
khalil
28a1006402 封禁管理-重构 2025-04-03 21:26:59 +08:00
khalil
ff349c0829 vue-webpack-禁用多线程打包 2025-04-03 10:53:39 +08:00
khalil
19d8ed1fc4 分区-公共组件select-替换剩下老组件 2025-04-02 19:33:49 +08:00
khalil
ded7c2154a 公会-公会信息-按公会id查询 2025-04-02 17:18:51 +08:00
khalil
00a87a713e 特权-铭牌座驾可按id查询 2025-04-02 17:18:50 +08:00
khalil
eac2e3b2b9 分区-公共组件select-替换旧组件 2025-04-02 17:02:47 +08:00
chenruiye
871f604038 铭牌,资料卡-管理 添加英语2区 2025-04-02 15:24:42 +08:00
khalil
388ddac3c9 分区-公共组件select-afterInit钩子 2025-04-02 14:56:48 +08:00
chenruiye
8fe40d2f42 修改英语2区充值统计 2025-04-02 14:50:40 +08:00
khalil
91af330db5 分区-公共组件select-needAllPartition和needAll开关 2025-04-02 14:35:16 +08:00
chenruiye
0c0bc701c2 头饰气泡礼物座驾-管理 添加英语2区 2025-04-02 14:30:02 +08:00
khalil
1f825cc240 充值统计-新英语区充值统计 2025-04-02 13:36:17 +08:00
khalil
e710c02d3d 分区-公共组件select-暴露info属性、needAll开关和handleChange钩子 2025-04-02 10:57:03 +08:00
chenruiye
19e048873d 修改幸运礼物分区获取数据 2025-03-31 18:16:16 +08:00
khalil
194511b212 分区-公共组件select 2025-03-31 15:57:43 +08:00
chenruiye
fc1aa2f2e0 英语2区-修改官方提现记录,新增每日钻石流水 2025-03-31 14:51:55 +08:00
khalil
9e17b32e4e 礼物-增加Bravo礼物类型 2025-03-31 14:26:13 +08:00
chenruiye
f09d2cef21 新增幸运礼物-超级礼物模块 2025-03-31 14:25:35 +08:00
chenruiye
8fc88a6290 修改公会部分问题 2025-03-28 15:25:16 +08:00
chenruiye
e666ee905a 用户信息编辑新增国家字段 2025-03-28 15:24:58 +08:00
chenruiye
133b9b96f4 修改英语区工会管理部分表单 2025-03-28 15:24:30 +08:00
chenruiye
95626880e2 game汇总列表新增游戏明细 2025-03-28 15:24:08 +08:00
chenruiye
1ab2985da7 优化每日金币统计千分位 2025-03-21 14:40:20 +08:00
chenruiye
3ba6f3e428 两个banner管理新增国家字段 2025-03-21 14:29:19 +08:00
chenruiye
5d04652a1e 新增用户头像管理 2025-03-20 15:55:24 +08:00
khalil
af6f1a922b 邮件-验证码记录-分页 2025-03-19 12:50:31 +08:00
khalil
3256cf38c4 邮箱-登录验证码 2025-03-19 10:46:03 +08:00
khalil
4f86375fa3 短信-验证码记录 2025-03-18 17:46:18 +08:00
khalil
56a23bfe2e 邮件-验证码记录 2025-03-18 17:46:16 +08:00
khalil
3d68691137 邮箱-封禁 2025-03-18 17:46:14 +08:00
khalil
5040d0a014 邮箱-访问限制列表 2025-03-18 17:46:13 +08:00
khalil
e67e5094f5 邮箱-用户信息查询 2025-03-18 17:46:12 +08:00
khalil
31c632a73a 邮箱-登录记录 2025-03-17 12:41:22 +08:00
chenruiye
068d992c4b 新增game汇总用户明细分页,修改消息管理文本类型 2025-03-14 10:59:45 +08:00
chenruiye
922444d958 game用户汇总,优化每日金币统计 2025-03-13 18:20:56 +08:00
chenruiye
a09809b5ae 修改game汇总问题 2025-03-13 18:20:29 +08:00
khalil
87e5e10ceb game汇总 2025-03-13 18:10:19 +08:00
chenruiye
4008f36015 主播退公会申请 2025-03-13 17:43:32 +08:00
khalil
06daf24fff 贵族基本信息管理-贵族特权-补充勋章到私聊限制等旧特权 2025-03-13 12:11:10 +08:00
khalil
1f604e9431 贵族基本信息管理-贵族特权-个人页访客和无痕 2025-03-13 12:11:09 +08:00
khalil
651eb7a14e 每日金币-totalDiamondDetail 2025-03-10 15:37:15 +08:00
khalil
38fba3eca3 小游戏周奖励 2025-03-07 15:31:22 +08:00
khalil
d93fa6f57b 子代理 2025-03-03 15:08:06 +08:00
khalil
00fdf09920 金币转赠-转赠子代理金币总和 2025-03-03 15:08:05 +08:00
khalil
3866ffa9c4 代充身份-子代理-近30天 2025-03-03 15:08:04 +08:00
khalil
fddedfc4b4 贵族基本信息管理-贵族特权-desc修正 2025-03-03 15:08:03 +08:00
khalil
4ba6076332 代充身份-子代理 2025-03-03 15:06:31 +08:00
khalil
2547caeac8 统计-占比-百分比-处理分母可能为0 2025-02-26 17:10:24 +08:00
khalil
e8836d1223 灵小游戏-白名单-water tip 2025-02-26 16:48:23 +08:00
khalil
3dfff36aaa 统计-占比-百分比 2025-02-26 16:24:49 +08:00
dragon
64af9bc602 完成后台统计 2025-02-26 15:55:59 +08:00
dragon
1a5f2f676c 活跃统计总概-暂存 2025-02-26 15:55:58 +08:00
dragon
179f0718e6 完成灵小游戏白名单&&活跃统计类暂存 2025-02-26 15:55:57 +08:00
dragon
f3c1518fdf 完成每日金币统计 2025-02-26 15:55:55 +08:00
khalil
662637a6e9 配置管理-textarea 2025-02-25 22:34:18 +08:00
khalil
af2a393a65 登录记录-导出 2025-02-25 16:19:22 +08:00
khalil
519f07f4cf 幸运24-配置-去掉保 2025-02-19 22:10:18 +08:00
dragon
44db1b535c 修复礼物管理勾选异常问题 2025-02-13 10:34:50 +08:00
dragon
186504f0fb 修改位置 2025-02-12 19:01:17 +08:00
dragon
45c3f1fd92 修复详情渲染失败问题 2025-02-12 17:38:58 +08:00
dragon
3bc87809e1 修复保存异常问题 2025-02-12 17:32:24 +08:00
dragon
5323ad7241 新增输入框输入限制 2025-02-12 16:26:26 +08:00
dragon
8fe6b24b0f 基础设置新增配置 2025-02-12 16:02:02 +08:00
dragon
99d2c67087 修复赠送按钮失效问题 2025-02-08 14:53:14 +08:00
dragon
e31f755216 完成周奖励后台 2025-02-07 18:19:12 +08:00
dragon
a73f806d92 周奖励后台暂存 2025-02-07 18:19:12 +08:00
khalil
fa1138dc03 ip限制-增加原因 2025-02-06 16:40:48 +08:00
dragon
6191f1a3f5 新增分区 2025-02-06 15:53:35 +08:00
dragon
50919fd508 修改雷蛇充值字段 2025-01-22 15:48:47 +08:00
dragon
8dc17b87ad 新增雷蛇充值 2025-01-13 15:27:54 +08:00
dragon
d420979350 修复开屏设置层级问题 2025-01-08 11:24:17 +08:00
dragon
63c7f5ed80 消息管理-读取分区 2025-01-08 11:05:14 +08:00
dragon
eba1d654d3 同步代码 2025-01-08 11:04:02 +08:00
dragon
09dc6f3645 新增开屏设置编辑连接 2025-01-08 10:47:20 +08:00
dragon
5338943b9b 新增跳转位置类型-开屏设置 2025-01-08 10:47:19 +08:00
dragon
1b47d48d0a 新增信誉值 2025-01-07 18:15:21 +08:00
dragon
3659f582d5 修复页面异常缩短问题 2025-01-06 17:13:38 +08:00
dragon
ed17e47390 修改用户查询接口接口 2025-01-06 15:45:25 +08:00
dragon
84e86deb73 修改传参可是 2025-01-03 13:44:00 +08:00
dragon
0751f06ec4 修复时间异常问题 2025-01-03 11:56:29 +08:00
dragon
4bc596e3d8 公会金币流水-修改时间展示 2025-01-03 10:43:04 +08:00
khalil
1683225a72 代充设置-查询-分区 2024-12-27 17:23:00 +08:00
dragon
c904646f4a 新增首页tab置顶判断 2024-12-27 14:13:01 +08:00
dragon
98d5f20be7 修复编辑回显异常问题 2024-12-26 19:02:28 +08:00
dragon
924971a290 新增必填项 2024-12-26 19:02:26 +08:00
dragon
f5b721a6f8 完成首页Ttab管理 2024-12-26 19:02:24 +08:00
dragon
47c819433b 新增公会信息&公会申请客服专用信息 2024-12-26 18:08:17 +08:00
khalil
3e9a2bfb60 装扮商城-气泡-去掉图片限制 2024-12-20 19:35:19 +08:00
dragon
ce2a63c864 修复主播薪资操作分页异常问题 2024-12-19 16:31:55 +08:00
dragon
0e5857873c 修改页数 2024-12-16 18:05:34 +08:00
dragon
26d422ecda 新增永辉账单查询变动前后 2024-12-16 16:35:05 +08:00
dragon
ccf95bb81a 完成充值操作记录和充值代理导出 2024-12-12 18:02:32 +08:00
dragon
dd1fdb23c2 金币钻石暂存 2024-12-12 18:02:31 +08:00
dragon
84a26ed699 新增编辑奖励 2024-12-12 15:28:24 +08:00
dragon
f1f558e2b1 修改弹窗没有回显奖励图片问题 2024-12-12 13:53:06 +08:00
dragon
1b74d19c98 新增奖励图片Boom 2024-12-12 11:47:12 +08:00
dragon
aab2ff2794 优化boom 2024-12-12 11:47:10 +08:00
dragon
d750ae68d2 ‘完成boom后台’ 2024-12-12 11:47:08 +08:00
dragon
44ea9d3dcf boom暂存 2024-12-12 11:47:06 +08:00
dragon
2394d2ef60 boom暂存 2024-12-12 11:47:05 +08:00
dragon
91e295e3b7 个人幸运礼物数据分区改为读接口 2024-12-12 11:45:59 +08:00
khalil
47a67f4718 用户信息查询-保存-错误提醒 2024-12-11 15:12:22 +08:00
220 changed files with 52229 additions and 16566 deletions

View File

@@ -1,2 +1,2 @@
VUE_APP_API_BASE_URL='http://beta.admin.pekolive.com' VUE_APP_API_BASE_URL='http://localhost:8080'
VUE_APP_DEBUG_MODE=true VUE_APP_DEBUG_MODE=true

View File

@@ -1,2 +1,2 @@
VUE_APP_API_BASE_URL=http://admin.web.pekolive.com VUE_APP_API_BASE_URL=http://admin.web.moliparty.com
VUE_APP_DEBUG_MODE=false VUE_APP_DEBUG_MODE=false

9
auto-imports.d.ts vendored Normal file
View File

@@ -0,0 +1,9 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
export {}
declare global {
}

47
components.d.ts vendored Normal file
View File

@@ -0,0 +1,47 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
declare module 'vue' {
export interface GlobalComponents {
ElButton: typeof import('element-plus/es')['ElButton']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
ElInput: typeof import('element-plus/es')['ElInput']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElRate: typeof import('element-plus/es')['ElRate']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSwitch: typeof import('element-plus/es')['ElSwitch']
ElTable: typeof import('element-plus/es')['ElTable']
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElText: typeof import('element-plus/es')['ElText']
ElUpload: typeof import('element-plus/es')['ElUpload']
Footer: typeof import('./src/components/footer/index.vue')['default']
Header: typeof import('./src/components/header/index.vue')['default']
Maintainer: typeof import('./src/components/maintainer/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
TablePagination: typeof import('./src/components/common/TablePagination.vue')['default']
}
export interface ComponentCustomProperties {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
}
}

View File

@@ -34,3 +34,11 @@ export default {
computed: {}, computed: {},
}; };
</script> </script>
<style>
.modal-open{
overflow-y: scroll;
}
body{
padding-right:0 !important;
}
</style>

View File

@@ -0,0 +1,17 @@
import request from "@/utils/request";
// 列表
export const getGuildPartitionPageWeekStat = query => {
return request({
url: '/admin/guildPartition/pageWeekStat',
method: 'get',
params: query
});
};
// 备注
export const guildPartitionMark = query => {
return request({
url: '/admin/guildPartition/mark',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,75 @@
import request from '@/utils/request';
// 列表
export const getBdList = query => {
return request({
url: '/admin/bd/list',
method: 'get',
params: query
});
};
// 添加
export const addBdInfo = query => {
return request({
url: '/admin/bd/add',
method: 'post',
params: query
});
};
// 移除
export const removeBdInfo = query => {
return request({
url: '/admin/bd/remove',
method: 'post',
params: query
});
};
// 获取用户信息
export const getByErbanNo = query => {
return request({
url: '/admin/user/getByErbanNo',
method: 'get',
params: query
});
};
// 获取分区下的国家
export const getlistByPartitionId = query => {
return request({
url: '/admin/regionInfo/listByPartitionId',
method: 'get',
params: query
});
};
// 公会详情
export const getGuildsDetail = query => {
return request({
url: '/admin/bd/guilds',
method: 'get',
params: query
});
};
// 解绑公会
export const operatorGuildUnBound = query => {
return request({
url: '/admin/bd/guildUnBound',
method: 'post',
params: query
});
};
// 管理列表
export const getBdDataList = query => {
return request({
url: '/admin/bdData/list',
method: 'get',
params: query
});
};
// 管理列表-详情
export const getBdDetailGuildsList = query => {
return request({
url: '/admin/bdData/guilds',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,27 @@
import request from "@/utils/request";
// 日任务奖励领取详情
export const getDailyTaskCoinRecvNums = query => {
return request({
url: '/admin/dailyTask/coinRecvNums',
method: 'get',
params: query
});
};
// 日任务奖励领取详情-明细
export const getDailyTaskcoinRecvDetail = query => {
return request({
url: '/admin/dailyTask/coinRecvDetail',
method: 'get',
params: query
});
};
// 日任务奖励领取详情-明细-导出
export const exportMiniGameDetail = query => {
return request({
url: `/admin/dailyTask/coinRecvDetailExport`,
method: 'get',
params: query,
responseType: 'blob'
});
}

View File

@@ -0,0 +1,58 @@
import request from '@/utils/request';
// 表情包Tab列表
export const getFaceTabNewList = query => {
return request({
url: '/faceTabNew/list',
method: 'get',
params: query
});
};
// Tab保存编辑
export const saveOrUpdateFaceTabNew = query => {
return request({
url: '/faceTabNew/saveOrUpdate',
method: 'post',
params: query
});
};
// Tab删除
export const deleteFaceTabNew = query => {
return request({
url: '/faceTabNew/delete',
method: 'post',
params: query
});
};
// 表情包列表
export const getFaceNewList = query => {
return request({
url: '/faceNew/list',
method: 'get',
params: query
});
};
// 保存编辑
export const saveOrUpdateFaceNew = query => {
return request({
url: '/faceNew/saveOrUpdate',
method: 'post',
params: query
});
};
// 表情包tab列表
export const getFaceNewTabList = query => {
return request({
url: '/faceNew/tab/list',
method: 'get',
params: query
});
};
// 删除表情包
export const deleteFaceNew = query => {
return request({
url: '/faceNew/delete',
method: 'DELETE',
params: query
});
};

View File

@@ -0,0 +1,25 @@
import request from "@/utils/request";
// 运营幸运数据查询-列表
export const getOperatorPersonalList = query => {
return request({
url: '/admin/lucky24/record/operatorPersonal',
method: 'get',
params: query
});
};
// 运营游戏数据查询-列表
export const getGameDataUserTotalALL = query => {
return request({
url: '/admin/gamedata/userTotalALL',
method: 'get',
params: query
});
};
// 游戏列表
export const getGameAllList = query => {
return request({
url: '/admin/game/allList',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,17 @@
import request from "@/utils/request";
// 列表
export const getRechargeAgentStatList = query => {
return request({
url: '/admin/rechargeAgentStat/page',
method: 'get',
params: query
});
};
// 导出
export const exportRechargeAgentStat = query => {
return request({
url: '/admin/rechargeAgentStat/export',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,83 @@
import request from "@/utils/request";
// 负责人列表
export const getGuildOperatorList = query => {
return request({
url: '/admin/guildOperator/page',
method: 'get',
params: query
});
};
// 获取分区下的国家
export const getlistByPartitionId = query => {
return request({
url: '/admin/regionInfo/listByPartitionId',
method: 'get',
params: query
});
};
// 获取全量后台用户列表
export const getUserListAll = query => {
return request({
url: '/admin/user/listAll',
method: 'get',
params: query
});
};
// 保存
export const saveGuildOperator = query => {
return request({
headers: { "Content-Type": 'application/json;charset=UTF-8' },
url: '/admin/guildOperator/save',
method: 'post',
data: query
});
};
// 获取 周期列表
export const familyMemberWeekLevelRewardListCycleDate = query => {
return request({
url: '/admin/familyMemberWeekLevelReward/listCycleDate',
method: 'get',
params: query
});
};
// 获取 负责人全部列表
export const getGuildOperatorListAll = query => {
return request({
url: '/admin/guildOperator/listAll',
method: 'get',
params: query
});
};
// 获取 运营流水分析列表
export const getGuildOperatorPageWeekStatList = query => {
return request({
url: '/admin/guildOperator/pageWeekStat',
method: 'get',
params: query
});
};
// 获取 公会运营负责人变更记录
export const getGuildOperatorHistoryList = query => {
return request({
url: '/admin/guildOperatorHistory/page',
method: 'get',
params: query
});
};
// 获取 运营流水分析 - 公会明细
export const getPageWeekStatDetail = query => {
return request({
url: '/admin/guildOperator/pageWeekStatDetail',
method: 'get',
params: query
});
};
// 获取 运营流水分析 - 公会明细 - 添加备注
export const guildOperatorMarkDetail = query => {
return request({
url: '/admin/guildOperator/markDetail',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,69 @@
import request from '@/utils/request';
// 查询公会成员薪资明细
export const getGuildPolicyQueryMemberPage = query => {
return request({
url: '/admin/guildPolicy2/queryMemberPage',
method: 'get',
params: query
});
};
// 查询公会成员薪资明细导出
export const exportQueryMember = query => {
return request({
url: `/admin/guildPolicy2/queryMemberExport`,
method: 'get',
params: query,
responseType: 'blob'
});
}
// 周期下拉
export const getGuildPolicyCycleDates = query => {
return request({
url: '/admin/guildPolicy2/cycleDates',
method: 'get',
params: query
});
};
// 有效天数明细
export const getGuildPolicyMicDayDetail = query => {
return request({
url: '/admin/guildPolicy2/micDayDetail',
method: 'get',
params: query
});
};
// 钻石清空记录列表
export const getGuildPolicyClearDiamond = query => {
return request({
url: '/admin/guildPolicy2ClearDiamond',
method: 'get',
params: query
});
};
// 查询公会成员薪资明细导出
export const exportClearDiamond = query => {
return request({
url: `/admin/guildPolicy2ClearDiamond/export`,
method: 'get',
params: query,
responseType: 'blob'
});
}
// 紫水晶清空记录列表
export const getGuildAmethystClearRecordList = query => {
return request({
url: '/admin/guild/guildCrystal/page',
method: 'get',
params: query
});
};
// 紫水晶清空记录列表 - 导出
export const exportClearAmethyst = query => {
return request({
url: '/admin/guild/guildCrystal/export',
method: 'get',
params: query,
responseType: 'blob'
});
};

View File

@@ -0,0 +1,25 @@
import request from '@/utils/request';
// 配置获取
export const getConfig = query => {
return request({
url: '/admin/luckyNumber/getConfig',
method: 'get',
params: query
});
};
// 修改配置
export const updateConfig = query => {
return request({
url: '/admin/luckyNumber/update',
method: 'post',
data: query
});
};
// 提交记录
export const getluckyNumberList = query => {
return request({
url: '/admin/luckyNumber/list',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,75 @@
import request from '@/utils/request';
// 奖励配置
// 活动列表
export const getActivitylList = query => {
return request({
url: '/activityH5LevelExp/activityType',
method: 'get',
params: query
});
};
// 等级列表
export const getLevelList = query => {
return request({
url: '/activityH5LevelExp/select/list',
method: 'get',
params: query
});
};
// 奖励查询列表
export const getAwardList = query => {
return request({
url: '/activityH5LevelAward/list',
method: 'get',
params: query
});
};
// 奖励类型
export const getAwardTypeList = query => {
return request({
url: '/activityH5LevelExp/awardType',
method: 'get',
params: query
});
};
// 新增
export const saveAwardList = query => {
return request({
url: '/activityH5LevelAward/save',
method: 'post',
params: query
});
};
// 删除
export const delAwardList = query => {
return request({
url: '/activityH5LevelAward/del',
method: 'post',
params: query
});
};
// 更新
export const updateAwardList = query => {
return request({
url: '/activityH5LevelAward/update',
method: 'post',
params: query
});
}
// 奖励发放记录-列表
export const getAwardRecordList = query => {
return request({
url: '/activityH5AwardRecord/list',
method: 'get',
params: query
});
};
// 导出
export const exportActivityAwardRecord = query => {
return request({
url: `/activityH5AwardRecord/export`,
method: 'post',
params: query,
responseType: 'blob'
});
};

View File

@@ -31,4 +31,12 @@ export const vipSendSend = query => {
method: 'post', method: 'post',
params: query params: query
}); });
};
// 赠送VIP接口 - 客服
export const vipSendSendCustomerSend = query => {
return request({
url: '/vipSend/customerSend',
method: 'post',
params: query
});
}; };

View File

@@ -0,0 +1,42 @@
import request from '@/utils/request';
// 活动列表
export const getActKeysList = query => {
return request({
url: '/admin/activityDayTotal/actKeys',
method: 'get',
params: query
});
};
// 列表
export const getDataList = query => {
return request({
url: '/admin/activityDayTotal/list',
method: 'get',
params: query
});
};
// 新用户列表
export const getNewUsersList = query => {
return request({
url: '/admin/activityDayTotal/newUsers',
method: 'get',
params: query
});
};
// 榜单列表
export const getRankList = query => {
return request({
url: '/admin/activityDayTotal/rankList',
method: 'get',
params: query
});
};
// 导出
export const exportActivityDayTotal = query => {
return request({
url: `/admin/activityDayTotal/export`,
method: 'post',
params: query,
responseType: 'blob'
});
}

41
src/api/block/block.js Normal file
View File

@@ -0,0 +1,41 @@
import request from '@/utils/request';
export const page = query => {
return request({
url: '/admin/block/page',
method: 'get',
params: query
});
};
export const get = query => {
return request({
url: '/admin/block/get',
method: 'get',
params: query
});
};
export const save = query => {
return request({
url: '/admin/block/save',
method: 'post',
params: query
});
};
export const update = query => {
return request({
url: '/admin/block/update',
method: 'post',
params: query
});
};
export const del = query => {
return request({
url: '/admin/block/delete',
method: 'post',
params: query
});
};

157
src/api/boom/boom.js Normal file
View File

@@ -0,0 +1,157 @@
import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer';
// 邀请移除记录
export const pageOperateRecord = query => {
return request({
url: '/admin/guild/manage/pageOperateRecord',
method: 'get',
params: query
});
};
// 查询公会信息
export const pageFamily = query => {
return request({
url: '/admin/guild/manage/pageGuild',
method: 'get',
params: query
});
};
// 公会成员信息
export const pageFamilyMember = query => {
return request({
url: '/admin/family/manage/pageFamilyMember',
method: 'get',
params: query
});
};
// 创建公会信息
export const create = query => {
return request({
url: '/admin/guild/manage/create',
method: 'post',
params: query
});
};
// 删除公会信息
export const dismiss = query => {
return request({
url: '/admin/guild/manage/dismiss',
method: 'post',
params: query
});
};
// 幸运礼物详情导出
export const luckyGiftRewardRecordExport = query => {
window.location.href = `/admin/luckyGiftRewardRecord/export?${genQueryParam(query)}`;
return;
};
// 公会信息编辑接口
export const update = query => {
return request({
url: '/admin/guild/manage/update',
method: 'post',
params: query
});
};
// 导出-公会信息
export const exportInfo = query => {
window.location.href = `/admin/guild/manage/exportGuild?${genQueryParam(query)}`;
return;
};
// 成员信息-弹窗详情
export const manageListFamilyMember = query => {
return request({
url: '/admin/guild/manage/listGuildMember',
method: 'get',
params: query
});
};
// 成员信息-新增成员
export const addMember = query => {
return request({
url: '/admin/guild/manage/addMember',
method: 'post',
params: query
});
};
// 成员信息-设置管理员
export const setManager = query => {
return request({
url: '/admin/guild/manage/setManager',
method: 'post',
params: query
});
};
// 成员信息-删除管理员
export const removeMember = query => {
return request({
url: '/admin/guild/manage/removeMember',
method: 'post',
params: query
});
};
// ========================================================Boom活动等级配置================================================
// Boom活动等级配置-列表
export const levelList = query => {
return request({
url: '/room/boom/level/list',
method: 'get',
params: query
});
};
// Boom活动等级配置-弹窗列表详情
export const awardList = query => {
return request({
url: '/room/boom/level/award/list',
method: 'get',
params: query
});
};
// Boom活动等级配置-弹窗列表删除详情
export const awardDel = query => {
return request({
url: '/room/boom/level/award/del',
method: 'get',
params: query
});
};
// Boom活动等级配置-编辑
export const levelUpdate = query => {
return request({
url: '/room/boom/level/update',
method: 'put',
data: query
});
};
// Boom活动等级配置-弹窗编辑
export const awardUpdate = query => {
return request({
url: '/room/boom/level/award/update',
method: 'put',
data: query
});
};
// ========================================================Boom数据后台================================================
// Boom活动等级配置-数据后台列表
export const recordList = query => {
return request({
url: '/room/boom/award/record/list',
method: 'get',
params: query
});
};
// Boom活动等级配置-数据后台明细列表
export const detailList = query => {
return request({
url: '/room/boom/award/record/detail/list',
method: 'get',
params: query
});
};
// 导出-Boom活动等级配置
export const recordExport = query => {
window.location.href = `/room/boom/award/record/export?${genQueryParam(query)}`;
return;
};

View File

@@ -0,0 +1,26 @@
import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer';
// 房间活动申请列表
export const getListEvent = query => {
return request({
url: '/userevent/listEvent',
method: 'get',
params: query
});
};
// 房间活动申请列表-审核
export const operatorListEvent = query => {
return request({
url: '/userevent/operator',
method: 'post',
params: query
});
};
// 房间活动数据统计 -列表
export const getUserEventDataList = query => {
return request({
url: '/userEventData/list',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,68 @@
import request from '@/utils/request';
// 奖池拉框
export const listType = query => {
return request({
url: '/admin/bravo/pool/listType',
method: 'get',
params: query
});
};
// 池子列表
export const list = query => {
return request({
url: '/admin/bravo/pool/list',
method: 'get',
params: query
});
};
// 保存池子
export const save = query => {
return request({
headers: { "Content-Type": 'application/json;charset=UTF-8' },
url: '/admin/bravo/pool/save',
method: 'post',
data: query
});
};
// 基础配置
export const getConfig = query => {
return request({
url: '/admin/bravo/config/getConfig',
method: 'get',
params: query
});
};
// 基础配置-修改
export const updateSet = query => {
return request({
headers: { "Content-Type": 'application/json;charset=UTF-8' },
url: '/admin/bravo/config/update',
method: 'post',
data: query
});
};
// 赠送用户
export const updateUserMulti = query => {
return request({
url: '/admin/bravo/config/updateUserMulti',
method: 'post',
params: query
});
};
// 个人数据
export const personal = query => {
return request({
url: '/admin/bravo/record/personal',
method: 'get',
params: query
});
};
// 汇总
export const platform = query => {
return request({
url: '/admin/bravo/record/platform',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,13 @@
import request from '@/utils/request';
import qs from 'qs';
import { genQueryParam } from '@/utils/maintainer';
// ==================================每日数据====================================
// 列表
export const diamondStatList = query => {
return request({
url: '/admin/diamondStat/list',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,10 @@
import request from '@/utils/request';
import {genQueryParam} from "@/utils/maintainer";
export const pageRecord = query => {
return request({
url: '/admin/emailRecord/page',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,69 @@
import request from '@/utils/request';
import {genQueryParam} from "@/utils/maintainer";
export const gameList = query => {
return request({
url: '/admin/game/list',
method: 'get',
params: query
});
};
export const getGamedata = query => {
return request({
url: '/admin/gamedata/total',
method: 'get',
params: query
});
};
// 导出
export const exportForMiniGame = query => {
return request({
url: `/admin/gamedata/total/export`,
method: 'post',
params: query,
responseType: 'blob'
});
};
// 明细
export const getUserGamedata = query => {
return request({
url: '/admin/gamedata/v2/user/total',
method: 'get',
params: query
});
};
// 导出
export const exportUserForMiniGame = query => {
return request({
url: `/admin/gamedata/v2/user/export`,
method: 'post',
params: query,
responseType: 'blob'
});
};
// 游戏明细
export const getGameDetailGamedata = query => {
return request({
url: '/admin/gamedata/gameDetail',
method: 'get',
params: query
});
};
// 导出
export const exportGameDetailExportForMiniGame = query => {
return request({
url: `/admin/gamedata/gameDetailExport`,
method: 'post',
params: query,
responseType: 'blob'
});
};
// 汇总
export const getTotalDayGamedata = query => {
return request({
url: '/admin/gamedata/user/totalDay',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,26 @@
import request from '@/utils/request';
// 列表
export const page = query => {
return request({
url: '/admin/game/feeRateUserRechargeLevel/page',
method: 'get',
params: query
});
};
// 保存
export const save = query => {
return request({
url: '/admin/game/feeRateUserRechargeLevel/save',
method: 'post',
params: query
});
};
// 删除
export const del = query => {
return request({
url: '/admin/game/feeRateUserRechargeLevel/delete',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,35 @@
import request from '@/utils/request';
// ==================================灵小游戏====================================
// 游戏列表
export const gameList = query => {
return request({
url: '/admin/game/list',
method: 'get',
params: query
});
};
// 列表
export const gameFeeRateList = query => {
return request({
url: '/admin/game/feeRate/list',
method: 'post',
params: query
});
};
// 保存
export const gameFeeRate = query => {
return request({
url: '/admin/game/feeRate/save',
method: 'post',
params: query
});
};
// 设置失效
export const feeRateInvalid = query => {
return request({
url: '/admin/game/feeRate/invalid',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,82 @@
import request from '@/utils/request';
// 礼包配置中心
// 礼包配置列表
export const getConfigList = query => {
return request({
url: '/admin/packCenter/configList',
method: 'get',
params: query
});
};
// 礼包配置保存更新
export const configSave = query => {
return request({
url: '/admin/packCenter/configSave',
method: 'post',
params: query
});
};
// 奖品列表
export const getItemList = query => {
return request({
url: '/admin/packCenter/itemList',
method: 'get',
params: query
});
};
// 奖品列表 - 删除奖品
export const deleteReward = query => {
return request({
url: '/admin/packCenter/itemDel',
method: 'post',
params: query
});
};
// 添加奖品
export const addReward = query => {
return request({
url: '/admin/packCenter/itemAdd',
method: 'post',
params: query
});
};
// 奖励列表
export const getAwardsList = query => {
return request({
url: '/admin/packCenter/awards',
method: 'get',
params: query
});
};
// 赠送礼包
export const sendPackCenter = query => {
return request({
url: '/admin/userPack/send',
method: 'post',
params: query
});
};
// 奖励列表
export const getRecordList = query => {
return request({
url: '/admin/userPack/recordList',
method: 'get',
params: query
});
};
// 撤回礼包
export const optionPackRecall = query => {
return request({
url: '/admin/userPack/packRecall',
method: 'post',
params: query
});
};
//礼包使用记录
export const getUseRecordList = query => {
return request({
url: '/admin/userUsePack/recordList',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,25 @@
import request from '@/utils/request';
// 获取大R列表
export const getHighRechargeUserList = query => {
return request({
url: '/admin/recharge/highRechargeUser/page',
method: 'get',
params: query
});
};
// 移除大R
export const delHighRechargeUser = query => {
return request({
url: '/admin/recharge/highRechargeUser/del',
method: 'post',
params: query
});
};
// 添加大R
export const addHighRechargeUser = query => {
return request({
url: '/admin/recharge/highRechargeUser/add',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,83 @@
import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer';
// 奖池拉框
export const listType = query => {
return request({
url: '/admin/lucky25/pool/listType',
method: 'get',
params: query
});
};
// 池子列表
export const list = query => {
return request({
url: '/admin/lucky25/pool/list',
method: 'get',
params: query
});
};
// 基础配置
export const getConfig = query => {
return request({
url: '/admin/lucky25/config/getConfig',
method: 'get',
params: query
});
};
// 基础配置-修改
export const updateSet = query => {
return request({
headers: { "Content-Type": 'application/json;charset=UTF-8' },
url: '/admin/lucky25/config/update',
method: 'post',
data: query
});
};
// 个人数据
export const personal = query => {
return request({
url: '/admin/lucky25/record/personal',
method: 'get',
params: query
});
};
// 汇总
export const platform = query => {
return request({
url: '/admin/lucky25/record/platform',
method: 'get',
params: query
});
};
// 保存池子
export const save = query => {
return request({
headers: { "Content-Type": 'application/json;charset=UTF-8' },
url: '/admin/lucky25/pool/save',
method: 'post',
data: query
});
};
// 赠送用户
export const updateUserMulti = query => {
return request({
url: '/admin/lucky25/config/updateUserMulti',
method: 'post',
params: query
});
};
// 获取明细
export const pageRecord = query => {
return request({
url: '/admin/lucky25/record/page',
method: 'get',
params: query
});
};
// 导出明细
export const exportRecord = query => {
window.location.href = `/admin/lucky25/record/export?${genQueryParam(query)}`;
return;
};

View File

@@ -43,6 +43,11 @@ export const personal = query => {
params: query params: query
}); });
}; };
// 个人数据
export const exportPersonal = query => {
window.location.href = `/admin/lucky24/record/personal/export?${genQueryParam(query)}`;
return;
};
// 汇总 // 汇总
export const platform = query => { export const platform = query => {
return request({ return request({
@@ -67,4 +72,32 @@ export const updateUserMulti = query => {
method: 'post', method: 'post',
params: query params: query
}); });
};
// 获取明细
export const pageRecord = query => {
return request({
url: '/admin/lucky24/record/page',
method: 'get',
params: query
});
};
// 导出明细
export const exportRecord = query => {
window.location.href = `/admin/lucky24/record/export?${genQueryParam(query)}`;
return;
};
// 个人数据
export const followUserPersonal = query => {
return request({
url: '/admin/lucky24/followUserRecord/personal',
method: 'get',
params: query
});
};
// 个人数据
export const exportFollowUserPersonal = query => {
window.location.href = `/admin/lucky24/followUserRecord/personal/export?${genQueryParam(query)}`;
return;
}; };

View File

@@ -1,14 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer'; import { genQueryParam } from '@/utils/maintainer';
// 地区接口
export const listPartitionInfo = query => {
return request({
url: '/partition/listPartitionInfo',
method: 'get',
params: query
});
};
// 福袋列表请求 // 福袋列表请求
export const listLuckyBagLinearGift = query => { export const listLuckyBagLinearGift = query => {
return request({ return request({

View File

@@ -0,0 +1,28 @@
import request from '@/utils/request';
// 勋章等级管理-列表
export const getMedalSeriesList = query => {
return request({
url: '/admin/medalSeries/list',
method: 'get',
params: query
});
};
// 保存
export const saveOrUpdate = query => {
return request({
url: '/admin/medalSeries/saveOrUpdate',
method: 'post',
headers: {"Content-Type": 'application/json;charset=UTF-8' },
data: query
});
};
// 上下架
export const updateStatus = query => {
return request({
url: '/admin/medalSeries/updateStatus',
method: 'post',
params: query
});
};

View File

@@ -1,13 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer'; import { genQueryParam } from '@/utils/maintainer';
// 地区接口
export const listPartitionInfo = query => {
return request({
url: '/partition/listPartitionInfo',
method: 'get',
params: query
});
};
// 勋章信息-列表 // 勋章信息-列表
export const medalPage = query => { export const medalPage = query => {
return request({ return request({

View File

@@ -0,0 +1,23 @@
import request from '@/utils/request';
import {genQueryParam} from "@/utils/maintainer";
export const pageRecord = query => {
return request({
url: '/admin/miniGameWeekJackpot/pageRecord',
method: 'get',
params: query
});
};
export const exportRecord = query => {
window.location.href = `/admin/miniGameWeekJackpot/exportRecord?${genQueryParam(query)}`;
return;
}
export const listUserRecord = query => {
return request({
url: '/admin/miniGameWeekJackpot/listUserRecord',
method: 'get',
params: query
});
};

View File

@@ -1,15 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer'; import { genQueryParam } from '@/utils/maintainer';
// 分区接口
export const listPartitionInfo = query => {
return request({
url: '/partition/listPartitionInfo',
method: 'get',
params: query
});
};
// 邀请移除记录 // 邀请移除记录
export const pageOperateRecord = query => { export const pageOperateRecord = query => {
return request({ return request({
@@ -278,4 +269,31 @@ export const guildApplyAudit = query => {
method: 'post', method: 'post',
params: query params: query
}); });
};
// 主播退公会申请 列表
export const guildManageQuitList = query => {
return request({
url: '/admin/guild/manage/quitList',
method: 'get',
params: query
});
};
// 主播退公会申请审核
export const guildManageOptQuit = query => {
return request({
url: '/admin/guild/manage/optQuit',
method: 'post',
params: query
});
};
// 获取分区下的国家
export const getlistByPartitionId = query => {
return request({
url: '/admin/regionInfo/listByPartitionId',
method: 'get',
params: query
});
}; };

View File

@@ -1,15 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer'; import { genQueryParam } from '@/utils/maintainer';
// 分区接口
export const listPartitionInfo = query => {
return request({
url: '/partition/listPartitionInfo',
method: 'get',
params: query
});
};
// 邀请移除记录 // 邀请移除记录
export const pageOperateRecord = query => { export const pageOperateRecord = query => {
return request({ return request({
@@ -39,7 +30,7 @@ export const create = query => {
return request({ return request({
url: '/admin/guild/manage/create', url: '/admin/guild/manage/create',
method: 'post', method: 'post',
params: query data: query
}); });
}; };
// 删除公会信息 // 删除公会信息
@@ -60,7 +51,7 @@ export const update = query => {
return request({ return request({
url: '/admin/guild/manage/update', url: '/admin/guild/manage/update',
method: 'post', method: 'post',
params: query data: query
}); });
}; };
// 导出-公会信息 // 导出-公会信息
@@ -100,4 +91,64 @@ export const removeMember = query => {
method: 'post', method: 'post',
params: query params: query
}); });
};
// 主播公会信息-列表
export const getGuildManagePageGuildMemberList = query => {
return request({
url: '/admin/guild/manage/pageGuildMember',
method: 'get',
params: query
});
};
// 主播公会信息-增加
export const addGuildManagePageGuildMember = query => {
return request({
url: '/admin/guild/manage/addMember',
method: 'post',
params: query
});
};
// 主播公会信息-删除
export const removeGuildManagePageGuildMember = query => {
return request({
url: '/admin/guild/manage/removeMember',
method: 'post',
params: query
});
};
// 公会主播钻石流水-列表
export const getDiamondStatisticsList = query => {
return request({
url: '/admin/guildMember/diamondStatistics',
method: 'get',
params: query
});
};
// 公会主播钻石流水-导出
export const exportDiamondStatistics = query => {
return request({
url: `/admin/guildMember/diamondStatistics/export`,
method: 'get',
params: query,
responseType: 'blob'
});
};
// 获取 负责人全部列表
export const getGuildOperatorListAll = query => {
return request({
url: '/admin/guildOperator/listAll',
method: 'get',
params: query
});
};
// 获取 国家列表
export const getlistByPartitionId = query => {
return request({
url: '/admin/regionInfo/listByPartitionId',
method: 'get',
params: query
});
}; };

View File

@@ -6,4 +6,11 @@ export const getPartitionInfoList = query => {
method: 'get', method: 'get',
params: query params: query
}); });
};
export const listAll = query => {
return request({
url: '/partition/listAll',
method: 'get',
params: query
});
}; };

View File

@@ -0,0 +1,16 @@
import request from '@/utils/request';
export const listByPartitionId = query => {
return request({
url: '/admin/regionInfo/listByPartitionId',
method: 'get',
params: query
});
};
export const listAll = query => {
return request({
url: '/admin/regionInfo/list',
method: 'get',
params: query
});
};

View File

@@ -2,14 +2,6 @@ import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer'; import { genQueryParam } from '@/utils/maintainer';
import qs from 'qs'; import qs from 'qs';
// 地区接口
export const listPartitionInfo = query => {
return request({
url: '/partition/listPartitionInfo',
method: 'get',
params: query
});
};
// 个人主页资源管理列表 // 个人主页资源管理列表
export const pesonalBackgroundListByPage = query => { export const pesonalBackgroundListByPage = query => {
return request({ return request({

View File

@@ -0,0 +1,37 @@
import request from '@/utils/request';
export const listRegionType = () => {
return request({
url: '/admin/charge/region/list',
method: 'get',
});
};
// 奖池拉框
export const page = query => {
return request({
url: '/admin/recharge/user/page',
method: 'get',
params: query
});
};
// 奖池拉框
export const save = query => {
return request({
headers:{"Content-Type": 'application/x-www-form-urlencoded'},
url: '/admin/recharge/user/save',
method: 'post',
data: query
});
};
// 奖池拉框
export const del = query => {
return request({
url: '/admin/recharge/user/del',
method: 'get',
params: query
});
};

View File

@@ -3,14 +3,6 @@ import qs from 'qs';
import { genQueryParam } from '@/utils/maintainer'; import { genQueryParam } from '@/utils/maintainer';
// 活动配置 相关接口(一级菜单:活动配置) // 活动配置 相关接口(一级菜单:活动配置)
// 分区接口
export const listPartitionInfo = query => {
return request({
url: '/partition/listPartitionInfo',
method: 'get',
params: query
});
};
// 国家 // 国家
export const regionInfoList = query => { export const regionInfoList = query => {
return request({ return request({
@@ -31,4 +23,18 @@ export const refundList = query => {
export const refundExport = query => { export const refundExport = query => {
window.location.href = `/admin/chargeRecord/refundExport?${genQueryParam(query)}`; window.location.href = `/admin/chargeRecord/refundExport?${genQueryParam(query)}`;
return; return;
};
// ======================================金币钻石操作记录==================================
// 列表
export const goldcoinRecordAll = query => {
return request({
url: '/admin/goldcoin/recordAll',
method: 'get',
params: query
});
};
// 导出
export const recordAllExport = query => {
window.location.href = `/admin/goldcoin/recordAllExport?${genQueryParam(query)}`;
return;
}; };

View File

@@ -4,23 +4,42 @@ import qs from 'qs';
import { genQueryParam } from '@/utils/maintainer'; import { genQueryParam } from '@/utils/maintainer';
// 活动配置 相关接口(一级菜单:活动配置) // 活动配置 相关接口(一级菜单:活动配置)
// 分区接口 // 充值代理列表导出
export const listPartitionInfo = query => { export const chargeAgentExport = query => {
return request({ window.location.href = `/anchorSalaryBill/chargeAgent/export?${genQueryParam(query)}`;
url: '/partition/listPartitionInfo', return;
method: 'get',
params: query
});
}; };
// 获取 周期列表 // 获取 周期列表
export const getDateCycleList = query => { export const getDateCycleList = query => {
return request({ return request({
url: '/anchorSalaryBill/dateCycle/list', url: '/anchorSalaryBill/dateCycle/list',
method: 'get', method: 'get',
params: query params: query
}); });
}; };
// 获取 周奖励周期列表
export const familyMemberWeekLevelRewardListCycleDate = query => {
return request({
url: '/admin/familyMemberWeekLevelReward/listCycleDate',
method: 'get',
params: query
});
};
// 获取 周奖励查询列表
export const familyMemberWeekLevelRewardPage = query => {
return request({
url: '/admin/familyMemberWeekLevelReward/page',
method: 'get',
params: query
});
};
// 导出
export const familyMemberWeekLevelRewardExport = query => {
window.location.href = `/admin/familyMemberWeekLevelReward/export?${genQueryParam(query)}`;
return;
};
// 获取 公会钻石薪资流水统计 列表 // 获取 公会钻石薪资流水统计 列表
export const getAgencyDiamondFlow = query => { export const getAgencyDiamondFlow = query => {
@@ -182,4 +201,134 @@ export const diamondStatistics = query => {
export const diamondStatisticsExport = query => { export const diamondStatisticsExport = query => {
window.location.href = `/admin/guild/diamondStatistics/export?${genQueryParam(query)}`; window.location.href = `/admin/guild/diamondStatistics/export?${genQueryParam(query)}`;
return; return;
};
// 获取分区下的国家
export const getlistByPartitionId = query => {
return request({
url: '/admin/regionInfo/listByPartitionId',
method: 'get',
params: query
});
};
// 每日钻石流水列表
export const getroomDayDiamondList = query => {
return request({
url: '/admin/roomDayDiamond/list',
method: 'get',
params: query
});
};
// 每日钻石流水列表导出
export const roomDayDiamondExport = query => {
window.location.href = `/admin/roomDayDiamond/export?${genQueryParam(query)}`;
return;
};
// 每日钻石流水列表
export const sendroomDayDiamond = query => {
return request({
url: '/admin/roomDayDiamond/send',
method: 'post',
params: query
});
};
// 官方提现方式渠道列表
export const getlistAccountType = query => {
return request({
url: '/admin/guildUsdWithdrawAccountConfig/listAccountType',
method: 'get',
params: query
});
};
// 官方提现方式配置 列表
export const getAccountConfigList = query => {
return request({
url: '/admin/guildUsdWithdrawAccountConfig/page',
method: 'get',
params: query
});
};
// 官方提现方式配置 编辑
export const saveAccountConfig = query => {
return request({
url: '/admin/guildUsdWithdrawAccountConfig/save',
method: 'get',
params: query
});
};
// 房间钻石流水查询 - 列表
export const getRoomHourDiamondList = query => {
return request({
url: '/admin/roomHourDiamond/list',
method: 'get',
params: query
});
};
// 房间钻石流水查询 - 导出
export const exportRoomHourDiamondList = query => {
return request({
url: '/admin/roomHourDiamond/export',
method: 'post',
params: query,
responseType: 'blob'
});
};
// CIS公会钻石 - 列表
export const getSovietList = query => {
return request({
url: '/admin/soviet/list',
method: 'get',
params: query
});
};
// CIS公会钻石 - 导出
export const exportSovietList = query => {
return request({
url: '/admin/soviet/export',
method: 'post',
params: query,
responseType: 'blob'
});
};
// CIS公会成员钻石 - 列表
export const getSovietMemberList = query => {
return request({
url: '/admin/soviet/memberList',
method: 'get',
params: query
});
};
// CIS公会成员钻石 - 导出
export const exportSovietMemberList = query => {
return request({
url: '/admin/soviet/memberExport',
method: 'post',
params: query,
responseType: 'blob'
});
};
// CIS房主钻石 - 列表
export const getSovietRoomList = query => {
return request({
url: '/admin/soviet/roomList',
method: 'get',
params: query
});
};
// CIS房主钻石 - 导出
export const exportSovietRoomList = query => {
return request({
url: '/admin/soviet/roomExport',
method: 'post',
params: query,
responseType: 'blob'
});
};
// CIS房主钻石 - CIS房主钻石-周期
export const getRoomCycleDateList = query => {
return request({
url: '/admin/soviet/roomCycleDateList',
method: 'get',
params: query
});
}; };

View File

@@ -0,0 +1,40 @@
import request from '@/utils/request';
export const listRegionTab = query => {
return request({
url: '/admin/roomTabRegion/listRegionTab',
method: 'get',
params: query
});
};
export const list = query => {
return request({
url: '/admin/roomTabRegion/list',
method: 'get',
params: query
});
};
export const get = query => {
return request({
url: '/admin/roomTabRegion/get',
method: 'get',
params: query
});
};
export const save = query => {
return request({
url: '/admin/roomTabRegion/save',
method: 'post',
params: query
});
};
export const del = query => {
return request({
url: '/admin/roomTabRegion/delete',
method: 'post',
params: query
});
};

View File

@@ -1,15 +1,5 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { genQueryParam } from '@/utils/maintainer';
import qs from 'qs';
// 地区接口
export const listPartitionInfo = query => {
return request({
url: '/partition/listPartitionInfo',
method: 'get',
params: query
});
};
// ==============================================首页ui配置============================================== // ==============================================首页ui配置==============================================
// 配置 // 配置
export const appUiSetting = query => { export const appUiSetting = query => {

10
src/api/sms/smsRecord.js Normal file
View File

@@ -0,0 +1,10 @@
import request from '@/utils/request';
import {genQueryParam} from "@/utils/maintainer";
export const pageRecord = query => {
return request({
url: '/admin/smsRecord/page',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,31 @@
import request from '@/utils/request';
import qs from 'qs';
import { genQueryParam } from '@/utils/maintainer';
// ==================================用户新增====================================
// 列表
export const dnuPage = query => {
return request({
url: '/admin/stats/dnu/page',
method: 'get',
params: query
});
};
// ==================================用户活跃====================================
// 列表
export const dauPage = query => {
return request({
url: '/admin/stats/dau/page',
method: 'get',
params: query
});
};
// ==================================工会数据统计====================================
// 列表
export const guiildPage = query => {
return request({
url: '/admin/stats/guild/page',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,9 @@
import request from '@/utils/request';
// 获取列表
export const incomePageFamily = query => {
return request({
url: '/admin/superCenter/pageFamilyIncomes',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,17 @@
import request from '@/utils/request';
// 获取列表
export const pageFamily = query => {
return request({
url: '/admin/superCenter/pageFamily',
method: 'get',
params: query
});
};
// 创建公会
export const createFamily = query => {
return request({
url: '/admin/superCenter/createFamily',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,17 @@
import request from '@/utils/request';
// 获取列表
export const pageRecord = query => {
return request({
url: '/admin/superCenter/vipSendRecord',
method: 'get',
params: query
});
};
// 赠送
export const vipSendSend = query => {
return request({
url: '/admin/superCenter/vipSend',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,9 @@
import request from '@/utils/request';
// 获取列表
export const diamondStatistics = query => {
return request({
url: '/admin/superCenter/diamondStatistics',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,9 @@
import request from '@/utils/request';
// 获取列表
export const guildApplyList = query => {
return request({
url: '/admin/superCenter/guildApplyList',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,27 @@
import request from '@/utils/request';
// 获取用户充值等级列表
export const listLevel = query => {
return request({
url: '/admin/recharge/userRechargeLevel/listLevel',
method: 'get',
params: query
});
};
// 获取用户充值等级列表
export const pageUserRechargeLevel = query => {
return request({
url: '/admin/recharge/userRechargeLevel/page',
method: 'get',
params: query
});
};
// 财富/魅力等级修改记录 - 列表
export const getUserExpChangeRecordList = query => {
return request({
url: '/userExpChange/userExpChangeRecordList',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,75 @@
import request from "@/utils/request";
// 各分区充值统计-列表
export const getChargeRecordPartitionDetail = query => {
return request({
url: '/admin/chargeRecord/partitionDetail',
method: 'get',
params: query
});
};
// 各分区充值统计-导出
export const exportPartitionDetail = query => {
return request({
url: `/admin/chargeRecord/exportPartitionDetail`,
method: 'get',
params: query,
responseType: 'blob'
});
}
// 今日充值统计-列表
export const getChargeRecordDailtList = query => {
return request({
url: '/admin/chargeRecord/dailylist',
method: 'get',
params: query
});
};
// 今日充值统计-今日充值数据
export const getChargeRecordDailyTotal = query => {
return request({
url: '/admin/chargeRecord/dailytotal',
method: 'get',
params: query
});
};
// 今日充值统计-明细
export const getChargeRecordDailyDetail = query => {
return request({
url: '/admin/chargeRecord/dailydetail',
method: 'get',
params: query
});
};
// 累计充值数据 - 列表
export const getChargeRecordTotalList = query => {
return request({
url: '/admin/chargeRecord/totallist',
method: 'get',
params: query
});
};
// 累计充值数据 - 明细
export const getChargeRecordTotalDetail = query => {
return request({
url: '/admin/chargeRecord/totaldetail',
method: 'get',
params: query
});
};
// 累计充值数据 - 导出
export const exportChargeRecordTotalExport = query => {
return request({
url: '/admin/chargeRecord/totalexport',
method: 'get',
params: query,
responseType: 'blob'
});
};
// 充值明细
export const getChargeRecordPartitionRegionDetail = query => {
return request({
url: '/admin/chargeRecord/partitionRegionDetail',
method: 'get',
params: query
});
};

View File

@@ -0,0 +1,35 @@
import request from '@/utils/request';
// X嫌疑人 - 列表
export const getChargeUserXDetailPage = query => {
return request({
url: '/chargeUserXDetail/list',
method: 'get',
params: query
});
};
// X嫌疑人 导出
export const exportChargeUserXDetail = query => {
return request({
url: `/chargeUserXDetail/export`,
method: 'post',
params: query,
responseType: 'blob'
});
}
// X嫌疑人 - 增加
export const saveChargeUserXDetailPage = query => {
return request({
url: '/chargeUserXDetail/save',
method: 'post',
params: query
});
};
// X嫌疑人 - 删除
export const deleteChargeUserXDetailPage = query => {
return request({
url: '/chargeUserXDetail/delete',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,18 @@
import request from '@/utils/request';
// 获取用户充值等级列表
export const getUserCheckAdmin = query => {
return request({
url: '/admin/userCheckAdmin/getUser',
method: 'get',
params: query
});
};
// 修改用户等级
export const changeUserExpChange = query => {
return request({
url: '/userExpChange/change',
method: 'post',
params: query
});
};

View File

@@ -0,0 +1,18 @@
import request from "@/utils/request";
// 列表
export const getavatarPaidRecordList = query => {
return request({
url: '/admin/avatarPaidRecord/page',
method: 'get',
params: query,
});
}
// 下架
export const resetAvatarPaidRecord = query => {
return request({
url: '/admin/avatarPaidRecord/reset',
method: 'get',
params: query,
});
}

View File

@@ -3,7 +3,7 @@
<div class="pull-right hidden-xs"> <div class="pull-right hidden-xs">
<b>Version</b> 2.0.0 <b>Version</b> 2.0.0
</div> </div>
<strong>Copyright &copy; 2024 <a href="">触海网络</a>.</strong> All rights <strong>Copyright &copy; 2025 <a href="">卡盖亚网络</a>.</strong> All rights
reserved. reserved.
</footer> </footer>
</template> </template>

View File

@@ -6,7 +6,7 @@
<!-- mini logo for sidebar mini 50x50 pixels --> <!-- mini logo for sidebar mini 50x50 pixels -->
<span class="logo-mini"><b>M</b>S</span> <span class="logo-mini"><b>M</b>S</span>
<!-- logo for regular state and mobile devices --> <!-- logo for regular state and mobile devices -->
<span class="logo-lg"><b>molistar</b>管理系统</span> <span class="logo-lg"><b>MoliParty</b>管理系统</span>
</a> </a>
<!-- Header Navbar: style can be found in header.less --> <!-- Header Navbar: style can be found in header.less -->
<nav class="navbar navbar-static-top" role="navigation"> <nav class="navbar navbar-static-top" role="navigation">

View File

@@ -3,6 +3,8 @@ const partitionInfoMap = {
2: '阿拉伯语区', 2: '阿拉伯语区',
4: '华语区', 4: '华语区',
8: '土耳其区', 8: '土耳其区',
16: '英语2区',
32: '独联体',
} }
export const partitionDesc = (val) => { export const partitionDesc = (val) => {

View File

@@ -0,0 +1,325 @@
<template>
<div class="box">
<div class="inquire">
<span>用户ID:</span>
<el-input v-model="formData.erbanNo"
placeholder=""
class="input" />
</div>
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="formData.partitionId"
@update:partitionId="getlistByPartition" />
</div>
<div class="inquire">
<span>国家</span>
<el-select v-model="formData.regionId"
placeholder="请选择">
<el-option v-for="item in adminCountryArr"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="inquire">
<span class="demonstration">日期</span>
<el-date-picker v-model="dataTime"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD">
</el-date-picker>
</div>
<el-button style=""
type="primary"
@click="getData()">查询</el-button>
<el-table v-loading="tableData.loading"
:data="tableData.data"
ref="multipleTable"
@selection-change="handleSelectionChange"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="erbanNo"
align="center"
label="用户ID" />
<el-table-column prop="nick"
align="center"
label="用户昵称" />
<el-table-column prop="partitionDesc"
align="center"
label="分区" />
<el-table-column prop="regionName"
align="center"
label="国家" />
<el-table-column prop="createTime"
align="center"
label="创建时间">
<template v-slot="scope">
{{ dateFormat(scope.row.createTime) }}
</template>
</el-table-column>
<el-table-column prop="guildNum"
align="center"
label="旗下公会数量">
<template v-slot="scope">
<el-button type="text"
size="small"
@click="editFen(scope.row)">
{{ scope.row.guildNum }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="diamondNum"
align="center"
label="公会钻石流水" />
<el-table-column prop="goldNum"
align="center"
label="公会金币流水" />
<el-table-column prop="owner"
align="center"
label="负责人" />
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
:current-page="formData.pageNo"
:page-size="formData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
<!-- 详情表格 -->
<el-dialog v-model="detailsDialog"
title="公会钻石流水详情"
width="70%"
center>
<!-- 内表格 -->
<el-table v-loading="tableDetailData.loading"
:data="tableDetailData.data"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="guildId"
align="center"
label="公会ID" />
<el-table-column prop="guildName"
align="center"
label="公会昵称" />
<el-table-column prop="ownerErbanNo"
align="center"
label="公会长ID" />
<el-table-column prop="nick"
align="center"
label="公会长昵称" />
<el-table-column prop="regionName"
align="center"
label="所属国家" />
<el-table-column prop="createTime"
align="center"
label="公会成立时间">
<template v-slot="scope">
{{ dateFormat(scope.row.createTime) }}
</template>
</el-table-column>
<el-table-column prop="memberNum"
align="center"
label="公会成员数(不包括公会长)" />
<el-table-column prop="diamondNum"
align="center"
label="公会钻石流水" />
<el-table-column prop="goldNum"
align="center"
label="公会金币流水" />
<el-table-column prop="status"
align="center"
label="绑定状态">
<template v-slot="scope">
{{ scope.row.status == 1 ? '有效' : '无效' }}
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
:current-page="formDetailData.pageNo"
:page-size="formDetailData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableDetailData.total"
@size-change="handleSizeChangeDetail"
@current-change="handleCurrentChangeDetail" />
</el-dialog>
</div>
</template>
<script>
import { ref, onMounted, reactive, computed } from 'vue'
import PartitionSelect from "@/views/common/partitionSelect.vue";
import { getBdDetailGuildsList, getBdDataList, getlistByPartitionId } from "@/api/BD/IdentitySettings.js"
import { ElMessage, ElMessageBox } from "element-plus";
import { dateFormat } from "@/utils/system-helper";
export default {
name: 'BDmanagement',
components: {
PartitionSelect
},
setup () {
const formData = reactive({
partitionId: undefined,
pageNo: 1,
pageSize: 10,
erbanNo: '',
regionId: '',
startTime: '',
endTime: ''
})
const tableData = reactive({
data: [],
total: 0,
loading: false,
})
const formDetailData = reactive({
bdId: '',
pageNo: 1,
pageSize: 10,
startTime: '',
endTime: '',
partitionId: '',
})
const tableDetailData = reactive({
data: [],
total: 0,
loading: false,
})
const detailsDialog = ref(false)
const dataTime = ref('');
const adminCountryArr = ref([])
const getlistByPartition = (e) => {
if (e) {
formData.partitionId = e;
}
getlistByPartitionId({ partitionId: formData.partitionId, containAll: true }).then((res) => {
if (res.code == 200) {
adminCountryArr.value = res.data;
}
});
}
const getData = () => {
tableData.loading = true;
if (dataTime.value && dataTime.value.length > 0) {
formData.startTime = dataTime.value[0];
formData.endTime = dataTime.value[1];
console.log(dataTime.value)
} else {
formData.startTime = dataTime.value
formData.endTime = dataTime.value
}
getBdDataList(formData).then(res => {
if (res.code == 200) {
tableData.data = res.data.rows
tableData.total = res.data.total
tableData.loading = false
} else {
tableData.loading = false;
ElMessage.error(res.message)
}
})
}
// 详情
const editFen = (row) => {
if (row) {
formDetailData.bdId = row.id;
formDetailData.partitionId = formData.partitionId;
formDetailData.endTime = formData.endTime;
formDetailData.startTime = formData.startTime;
}
tableDetailData.loading = true;
getBdDetailGuildsList(formDetailData).then(res => {
if (res.code == 200) {
tableDetailData.data = res.data.rows
tableDetailData.total = res.data.total
tableDetailData.loading = false
detailsDialog.value = true
} else {
tableDetailData.loading = false
ElMessage.error(res.message)
}
})
}
const dateFormat = (row) => {
const date = new Date(row);
return date.format("yyyy-MM-dd hh:mm:ss");
}
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
const handleSizeChangeDetail = (val) => {
formDetailData.pageSize = val;
editFen();
};
const handleCurrentChangeDetail = (val) => {
formDetailData.pageNo = val;
editFen();
};
return {
formData,
adminCountryArr,
getlistByPartition,
dataTime,
getData,
tableData,
dateFormat,
editFen,
formDetailData,
detailsDialog,
tableDetailData,
handleSizeChange,
handleCurrentChange,
handleSizeChangeDetail,
handleCurrentChangeDetail
}
}
}
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
</style>

View File

@@ -0,0 +1,442 @@
<template>
<div class="box">
<div class="inquire">
<span>用户ID:</span>
<el-input v-model="formData.erbanNo"
placeholder=""
class="input" />
</div>
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="formData.partitionId"
@update:partitionId="getlistByPartition" />
</div>
<div class="inquire">
<span>国家</span>
<el-select v-model="formData.regionId"
placeholder="请选择">
<el-option v-for="item in adminCountryArr"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<el-button style=""
type="primary"
@click="getData()">查询</el-button>
<el-button style=""
type="primary"
@click="addDialog = true">新增</el-button>
<el-table v-loading="tableData.loading"
:data="tableData.data"
ref="multipleTable"
@selection-change="handleSelectionChange"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="erbanNo"
align="center"
label="用户ID" />
<el-table-column prop="nick"
align="center"
label="用户昵称" />
<el-table-column prop="partitionDesc"
align="center"
label="分区" />
<el-table-column prop="regionName"
align="center"
label="国家" />
<el-table-column prop="createTime"
align="center"
label="创建时间">
<template v-slot="scope">
{{ dateFormat(scope.row.createTime) }}
</template>
</el-table-column>
<el-table-column prop="guildNum"
align="center"
label="旗下公会数量">
<template v-slot="scope">
<el-button type="text"
size="small"
@click="editFen(scope.row)">
{{ scope.row.guildNum }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="owner"
align="center"
label="负责人" />
<el-table-column align="center"
label="操作"
width="300">
<template v-slot="scope">
<el-button class="primary"
type="primary"
@click="
removePageFun(scope.row);
"
size="default"
v-if="scope.row.status == 1">移除</el-button>
</template>
</el-table-column>
<el-table-column prop="operator"
align="center"
label="操作人" />
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
:current-page="formData.pageNo"
:page-size="formData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
<el-dialog v-model="addDialog"
title="新增"
width="28%"
center>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">平台ID</span>
<el-input v-model="addFormData.erbanNo"
style="width: 50%"
class="input"
@change="getByErbanNoInfo()"></el-input>
</div>
<div style="margin-bottom: 25px;display: inline-block;width: 100%;">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">用户昵称</span>
<div>
<span style="display: inline-block;"
class="col-sm-2 control-label">{{ ByErbanNoInfo.nick }}</span>
</div>
</div>
<div style="margin-bottom: 25px;display: inline-block;width: 100%;">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">用户分区</span>
<div>
<span style="display: inline-block;"
class="col-sm-2 control-label">{{ ByErbanNoInfo.partitionName
}}</span>
</div>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">负责人</span>
<el-input v-model="addFormData.owner"
style="width: 50%"
class="input"></el-input>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="addDialog = false">取消</el-button>
<el-button type="primary"
@click="addFun()"
v-if="ByErbanNoInfo.uid != ''"> 确认 </el-button>
</span>
</template>
</el-dialog>
<!-- 详情表格 -->
<el-dialog v-model="detailsDialog"
title="公会详情"
width="70%"
center>
<!-- 内表格 -->
<el-table v-loading="tableDetailData.loading"
:data="tableDetailData.data"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="guildId"
align="center"
label="公会ID" />
<el-table-column prop="guildName"
align="center"
label="公会昵称" />
<el-table-column prop="ownerErbanNo"
align="center"
label="公会长ID" />
<el-table-column prop="nick"
align="center"
label="公会长昵称" />
<el-table-column prop="regionName"
align="center"
label="所属国家" />
<el-table-column prop="createTime"
align="center"
label="公会成立时间">
<template v-slot="scope">
{{ dateFormat(scope.row.createTime) }}
</template>
</el-table-column>
<el-table-column prop="memberNum"
align="center"
label="公会成员数(不包括公会长)" />
<el-table-column prop="status"
align="center"
label="绑定状态">
<template v-slot="scope">
{{ scope.row.status == 1 ? '有效' : '无效' }}
</template>
</el-table-column>
<el-table-column align="center"
label="操作"
width="300">
<template v-slot="scope">
<el-button class="primary"
type="primary"
@click="
unbindPageFun(scope.row);
"
size="default"
v-if="scope.row.status == 1">解绑</el-button>
</template>
</el-table-column>
<el-table-column prop="operator"
align="center"
label="操作人" />
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
:current-page="formDetailData.pageNo"
:page-size="formDetailData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableDetailData.total"
@size-change="handleSizeChangeDetail"
@current-change="handleCurrentChangeDetail" />
</el-dialog>
</div>
</template>
<script>
import { ref, onMounted, reactive, computed } from 'vue'
import PartitionSelect from "@/views/common/partitionSelect.vue";
import { getBdList, addBdInfo, removeBdInfo, getByErbanNo, getlistByPartitionId, getGuildsDetail, operatorGuildUnBound } from "@/api/BD/IdentitySettings.js"
import { ElMessage, ElMessageBox } from "element-plus";
export default {
name: 'IdentitySettings',
components: {
PartitionSelect
},
setup () {
const formData = reactive({
partitionId: undefined,
pageNo: 1,
pageSize: 10,
erbanNo: '',
regionId: ''
})
const addFormData = reactive({
erbanNo: '',
uid: '',
owner: ''
})
const tableData = reactive({
data: [],
total: 0,
loading: false,
})
const ByErbanNoInfo = reactive({
uid: '',
partitionName: '',
nick: ''
})
const formDetailData = reactive({
bdId: '',
pageNo: 1,
pageSize: 10,
})
const tableDetailData = reactive({
data: [],
total: 0,
loading: false,
})
const adminCountryArr = ref([])
const addDialog = ref(false)
const detailsDialog = ref(false)
const getlistByPartition = (e) => {
if (e) {
formData.partitionId = e;
}
getlistByPartitionId({ partitionId: formData.partitionId, containAll: true }).then((res) => {
if (res.code == 200) {
adminCountryArr.value = res.data;
}
});
}
const getData = () => {
tableData.loading = true;
getBdList(formData).then(res => {
if (res.code == 200) {
tableData.data = res.data.rows
tableData.total = res.data.total
tableData.loading = false
} else {
tableData.loading = false;
ElMessage.error(res.message)
}
})
};
const getByErbanNoInfo = () => {
getByErbanNo({ erbanNo: addFormData.erbanNo }).then(res => {
if (res.code == 200) {
Object.assign(ByErbanNoInfo, res.data)
} else {
ElMessage.error(res.message)
Object.assign(ByErbanNoInfo, { partitionName: '', nick: '', uid: '' })
}
})
}
// 增加
const addFun = () => {
if (addFormData.erbanNo == '') {
ElMessage.error('请输入正确的用户ID')
return
}
addDialog.value = false
addBdInfo({ owner: addFormData.owner, uid: ByErbanNoInfo.uid }).then(res => {
if (res.code == 200) {
ElMessage.success('添加成功')
getData()
} else {
ElMessage.error(res.message)
}
Object.assign(addFormData, { erbanNo: '', owner: '', uid: '' })
Object.assign(ByErbanNoInfo, { partitionName: '', nick: '', uid: '' })
})
}
const removePageFun = (row) => {
ElMessageBox.confirm('确定要移除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
removeBdInfo({ id: row.id }).then(res => {
if (res.code == 200) {
ElMessage.success('移除成功')
getData()
} else {
ElMessage.error(res.message)
}
})
})
}
// 详情
const editFen = (row) => {
if (row) {
formDetailData.bdId = row.id
}
tableDetailData.loading = true;
getGuildsDetail(formDetailData).then(res => {
if (res.code == 200) {
tableDetailData.data = res.data.rows
tableDetailData.total = res.data.total
tableDetailData.loading = false
detailsDialog.value = true
} else {
tableDetailData.loading = false
ElMessage.error(res.message)
}
})
}
// 解绑
const unbindPageFun = (row) => {
ElMessageBox.confirm('确定要解除绑定吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
operatorGuildUnBound({ bdGuildId: row.bdGuildId }).then(res => {
if (res.code == 200) {
ElMessage.success('解除成功')
editFen()
} else {
ElMessage.error(res.message)
}
})
})
}
const dateFormat = (row) => {
const date = new Date(row);
return date.format("yyyy-MM-dd hh:mm:ss");
}
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
const handleSizeChangeDetail = (val) => {
formDetailData.pageSize = val;
editFen();
};
const handleCurrentChangeDetail = (val) => {
formDetailData.pageNo = val;
editFen();
};
return {
formData,
addFormData,
tableData,
addDialog,
getData,
detailsDialog,
adminCountryArr,
getlistByPartition,
getByErbanNoInfo,
ByErbanNoInfo,
addFun,
dateFormat,
removePageFun,
editFen,
formDetailData,
tableDetailData,
unbindPageFun,
handleSizeChange,
handleCurrentChange,
handleSizeChangeDetail,
handleCurrentChangeDetail
}
}
}
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
</style>

View File

@@ -4,100 +4,85 @@
<div class="inquire"> <div class="inquire">
<div class="block"> <div class="block">
<span class="demonstration">选择分区</span> <span class="demonstration">选择分区</span>
<el-select <el-select v-model="inquire.partitionId"
v-model="inquire.partitionId" style="width: 75%"
style="width: 75%" placeholder="请选择"
placeholder="请选择" @change="handleChange">
@change="handleChange" <el-option v-for="item in inquire.inquireonInfos"
> :key="item.id"
<el-option :label="item.desc"
v-for="item in inquire.inquireonInfos" :value="item.id"></el-option>
:key="item.id"
:label="item.desc"
:value="item.id"
></el-option>
</el-select> </el-select>
</div> </div>
</div> </div>
<!-- 表格 --> <!-- 表格 -->
<el-table <el-table v-loading="loading"
v-loading="loading" :data="tableData"
:data="tableData" border
border style="width: 100%; margin-top: 25px">
style="width: 100%; margin-top: 25px" <el-table-column prop="seq"
> align="center"
<el-table-column prop="seq" align="center" label="排序" /> label="排序" />
<el-table-column prop="name" align="center" label="礼物面板类型" /> <el-table-column prop="name"
<el-table-column prop="enable" align="center" label="是否生效"> align="center"
label="礼物面板类型" />
<el-table-column prop="enable"
align="center"
label="是否生效">
<template v-slot="scope">{{ scope.row.enable ? "是" : "否" }}</template> <template v-slot="scope">{{ scope.row.enable ? "是" : "否" }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="操作"> <el-table-column align="center"
label="操作">
<template v-slot="scope"> <template v-slot="scope">
<el-button <el-button @click="ediClick(scope.row)"
@click="ediClick(scope.row)" class="primary"
class="primary" type="primary"
type="primary" size="default">编辑</el-button>
size="default"
>编辑</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 编辑弹窗 --> <!-- 编辑弹窗 -->
<el-dialog v-model="eidDialog" :title="eidDialogTitle" width="30%" center> <el-dialog v-model="eidDialog"
:title="eidDialogTitle"
width="30%"
center>
<!-- 礼物面板类型 --> <!-- 礼物面板类型 -->
<div style="margin-bottom: 25px; margin-top: 10px"> <div style="margin-bottom: 25px; margin-top: 10px">
<span <span style="display: inline-block; white-space: nowrap; margin-right: 70px"
style="display: inline-block; white-space: nowrap; margin-right: 70px" class="col-sm-2 control-label">礼物面板类型</span>
class="col-sm-2 control-label" <el-input v-model="eidObj.type"
>礼物面板类型</span style="width: 60%"
> class="input"
<el-input placeholder="请输入"
v-model="eidObj.type" disabled></el-input>
style="width: 60%"
class="input"
placeholder="请输入"
disabled
></el-input>
</div> </div>
<!-- 面板排序 --> <!-- 面板排序 -->
<div style="margin-bottom: 25px; margin-top: 10px"> <div style="margin-bottom: 25px; margin-top: 10px">
<span <span style="display: inline-block; white-space: nowrap; margin-right: 70px"
style="display: inline-block; white-space: nowrap; margin-right: 70px" class="col-sm-2 control-label">面板排序-{{ eidText }}</span>
class="col-sm-2 control-label" <el-input v-model="eidObj.seq"
>面板排序-{{ eidText }}</span style="width: 60%"
> class="input"
<el-input placeholder="请输入"></el-input>
v-model="eidObj.seq"
style="width: 60%"
class="input"
placeholder="请输入"
></el-input>
</div> </div>
<!-- 是否生效 --> <!-- 是否生效 -->
<div style="margin-bottom: 25px; margin-top: 10px"> <div style="margin-bottom: 25px; margin-top: 10px">
<span <span style="display: inline-block; white-space: nowrap; margin-right: 70px"
style="display: inline-block; white-space: nowrap; margin-right: 70px" class="col-sm-2 control-label">是否生效</span>
class="col-sm-2 control-label" <el-select v-model="eidObj.value"
>是否生效</span style="width: 60%"
> placeholder="请选择">
<el-select <el-option v-for="item in eidObj.option"
v-model="eidObj.value" :key="item.id"
style="width: 60%" :label="item.desc"
placeholder="请选择" :value="item.id"></el-option>
>
<el-option
v-for="item in eidObj.option"
:key="item.id"
:label="item.desc"
:value="item.id"
></el-option>
</el-select> </el-select>
</div> </div>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="eidDialog = false">取消</el-button> <el-button @click="eidDialog = false">取消</el-button>
<el-button type="primary" @click="eidDialogClick()"> 确认 </el-button> <el-button type="primary"
@click="eidDialogClick()"> 确认 </el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@@ -105,23 +90,24 @@
</template> </template>
<script> <script>
import { list, update } from "@/api/GiftPanelManagement/GiftPanelManagement"; import { list, update } from "@/api/GiftPanelManagement/GiftPanelManagement";
import { listAll } from "@/api/partition/partitionInfo";
// @ts-ignore // @ts-ignore
import { dateFormat } from "@/utils/system-helper"; import { dateFormat } from "@/utils/system-helper";
// @ts-ignore // @ts-ignore
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
export default { export default {
name: "GiftPanelManagement", name: "GiftPanelManagement",
data() { data () {
return { return {
loading: false, loading: false,
//查询所需条件对象 //查询所需条件对象
inquire: { inquire: {
partitionId: 4, partitionId: 1,
inquireonInfos: [ inquireonInfos: [
{ desc: "英语区", id: 1 }, // { desc: "英语区", id: 1 },
{ desc: "阿拉伯区", id: 2 }, // { desc: "阿拉伯区", id: 2 },
{ desc: "华语区", id: 4 }, // { desc: "华语区", id: 4 },
{ desc: "土耳其区", id: 8 }, // { desc: "土耳其区", id: 8 },
], ],
}, },
// 表格 // 表格
@@ -149,14 +135,17 @@ export default {
}, },
}; };
}, },
created() { created () {
this.eidDialogTitle = `编辑礼物面板信息-华语区`; this.eidDialogTitle = `编辑礼物面板信息-华语区`;
this.eidText = `华语区`; this.eidText = `华语区`;
this.getData(); this.getData();
listAll().then((res) => {
this.inquire.inquireonInfos = res.data;
});
}, },
methods: { methods: {
// 查询接口 // 查询接口
getData() { getData () {
this.loading = true; this.loading = true;
list({ list({
partitionId: this.inquire.partitionId, partitionId: this.inquire.partitionId,
@@ -165,14 +154,14 @@ export default {
this.loading = false; this.loading = false;
}); });
}, },
ediClick(val) { ediClick (val) {
this.eidDialog = true; this.eidDialog = true;
this.eidObj.type = val.name; this.eidObj.type = val.name;
this.eidObj.seq = val.seq; this.eidObj.seq = val.seq;
this.eidObj.value = val.enable; this.eidObj.value = val.enable;
this.eidObjNew = val; this.eidObjNew = val;
}, },
eidDialogClick() { eidDialogClick () {
update({ update({
enable: this.eidObj.value, enable: this.eidObj.value,
id: this.eidObjNew.id, id: this.eidObjNew.id,
@@ -196,7 +185,7 @@ export default {
} }
}); });
}, },
handleChange(val) { handleChange (val) {
console.log(val); console.log(val);
if (val == 1) { if (val == 1) {
this.eidDialogTitle = `编辑礼物面板信息-英语区`; this.eidDialogTitle = `编辑礼物面板信息-英语区`;
@@ -207,9 +196,15 @@ export default {
} else if (val == 4) { } else if (val == 4) {
this.eidDialogTitle = `编辑礼物面板信息-华语区`; this.eidDialogTitle = `编辑礼物面板信息-华语区`;
this.eidText = `华语区`; this.eidText = `华语区`;
}else if (val == 8) { } else if (val == 8) {
this.eidDialogTitle = `编辑礼物面板信息-土耳其区`; this.eidDialogTitle = `编辑礼物面板信息-土耳其区`;
this.eidText = `土耳其区`; this.eidText = `土耳其区`;
} else if (val == 16) {
this.eidDialogTitle = `编辑礼物面板信息-英语2区`;
this.eidText = `英语2区`;
}else if (val == 32) {
this.eidDialogTitle = `编辑礼物面板信息-独联体`;
this.eidText = `独联体`;
} }
this.getData(); this.getData();
}, },

View File

@@ -2,7 +2,7 @@
<div class="outer"> <div class="outer">
<div class="search"> <div class="search">
<div class="searchLeft"> <div class="searchLeft">
<span>用户平台ID</span> <span>平台ID</span>
<el-input <el-input
v-model="userId" v-model="userId"
size="default" size="default"
@@ -10,6 +10,15 @@
class="input" class="input"
></el-input> ></el-input>
</div> </div>
<div class="searchLeft">
<span>邮箱</span>
<el-input
v-model="email"
size="default"
placeholder="邮箱"
class="input"
></el-input>
</div>
</div> </div>
<!-- 按钮 --> <!-- 按钮 -->
<div class="buttonBox"> <div class="buttonBox">
@@ -30,6 +39,7 @@
<el-table-column prop="erbanNo" align="center" label="用戶id" /> <el-table-column prop="erbanNo" align="center" label="用戶id" />
<el-table-column prop="nick" align="center" label="用戶昵称" /> <el-table-column prop="nick" align="center" label="用戶昵称" />
<el-table-column prop="phone" align="center" label="手机号" /> <el-table-column prop="phone" align="center" label="手机号" />
<el-table-column prop="email" align="center" label="邮箱" />
<el-table-column prop="signTime" align="center" label="注册时间" /> <el-table-column prop="signTime" align="center" label="注册时间" />
<el-table-column prop="createTime" align="center" label="进入访问限制时间" /> <el-table-column prop="createTime" align="center" label="进入访问限制时间" />
<el-table-column prop="inviteCode" align="center" label="邀请码" /> <el-table-column prop="inviteCode" align="center" label="邀请码" />
@@ -51,6 +61,7 @@
{{langFormat(scope.row.lang)}} {{langFormat(scope.row.lang)}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="reason" align="center" label="原因" />
<el-table-column align="center" label="操作" width="300"> <el-table-column align="center" label="操作" width="300">
<template v-slot="scope"> <template v-slot="scope">
<el-button <el-button
@@ -128,13 +139,10 @@ export default {
name: "AccessRestriction", name: "AccessRestriction",
data() { data() {
return { return {
userId: "", //用戶id userId: undefined, //用戶id
email: undefined, //用戶id
loading: false, //列表loading loading: false, //列表loading
tableData: [ tableData: [], //列表数据
{
erbanNo: "123123123",
},
], //列表数据
total: 10, //总页数 total: 10, //总页数
currentPage: 1, //页码 currentPage: 1, //页码
pageSize: 10, //条数 pageSize: 10, //条数
@@ -157,6 +165,7 @@ export default {
page: this.currentPage, page: this.currentPage,
pageSize: this.pageSize, pageSize: this.pageSize,
userErBanNo: this.userId, userErBanNo: this.userId,
email: this.email,
}).then((res) => { }).then((res) => {
this.tableData = res.data.records; this.tableData = res.data.records;
this.loading = false; this.loading = false;

971
src/views/boom/levelSet.vue Normal file
View File

@@ -0,0 +1,971 @@
<template>
<div class="box">
<!-- 查询 -->
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="inquire.partitionId" v-model:partition-infos="inquire.options" />
</div>
<el-button class="primary but" type="primary" @click="getData()"
>查询</el-button
>
<!-- 表格 -->
<el-table
v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="levelName" align="center" label="Boom等级" />
<el-table-column prop="goldNum" align="center" label="金币任务数" />
<el-table-column prop="countDownVapUrl" align="center" label="Boom等级图">
<template v-slot="scope">
<el-image
style="width: 100px; height: 100px"
:src="scope.row.pic"
:zoom-rate="1.1"
:preview-src-list="[scope.row.pic]"
fit="contain"
preview-teleported="true"
hide-on-click-modal="true"
/>
</template>
</el-table-column>
<el-table-column prop="x" align="center" label="Boom倒计时">
<template v-slot="scope">
<video
:key="scope.row.countDownVapUrl"
width="320"
height="240"
controls="controls"
>
<source :src="scope.row.countDownVapUrl" type="video/mp4" /></video
></template>
</el-table-column>
<el-table-column prop="x" align="center" label="Boon"
><template v-slot="scope">
<video
:key="scope.row.endVapUrl"
width="320"
height="240"
controls="controls"
>
<source :src="scope.row.endVapUrl" type="video/mp4" /></video
></template>
</el-table-column>
<el-table-column align="center" label="操作" width="300">
<template v-slot="scope">
<el-button
@click="
eidObj.level = scope.row.level;
eidObj.goldNum = scope.row.goldNum;
eidObj.imageUrl1 = scope.row.pic;
eidObj.imageUrl2 = scope.row.countDownVapUrl;
eidObj.imageUrl3 = scope.row.endVapUrl;
id = scope.row.id;
eidDialogBox = true;
"
type="text"
size="default"
>编辑</el-button
>
<el-button
@click="
member.level = scope.row.level;
member.goldNum = scope.row.goldNum;
seeList(scope.row);
"
type="text"
size="default"
>查看明细</el-button
>
<el-button
@click="
member.level = scope.row.level;
member.goldNum = scope.row.goldNum;
id = scope.row.level;
eidList(scope.row);
"
type="text"
size="default"
>编辑明细</el-button
>
</template>
</el-table-column>
</el-table>
<!-- 等级奖励配置查看 -->
<el-dialog v-model="memberDialog" title="等级奖励配置(查看)" center>
<div class="inquire">
<span>Boom等级{{ member.level }}</span>
</div>
<div class="inquire">
<span>金币任务数量{{ member.goldNum }}</span>
</div>
<!-- 内嵌表格 -->
<el-table
:data="member.tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="seq" align="center" label="排序" />
<el-table-column prop="x" align="center" label="奖品类型">
<template v-slot="scope">
{{
scope.row.awardType == 8
? "金币"
: scope.row.awardType == 6
? "礼物"
: scope.row.awardType == 5
? "座驾"
: scope.row.awardType == 1
? "头饰"
: scope.row.awardType == 3
? "气泡"
: scope.row.awardType == 10
? "VIP"
: scope.row.awardType == 11
? "勋章"
: scope.row.awardType == 13
? "金豆"
: "铭牌"
}}
</template>
</el-table-column>
<el-table-column prop="awardNum" align="center" label="奖品天数" />
<el-table-column prop="type" align="center" label="用户身份">
<template v-slot="scope">
{{ scope.row.type == 1 ? "固定身份" : "随机身份" }}
</template>
</el-table-column>
<el-table-column
prop="awardId"
align="center"
label="奖品ID/VIP等级1"
/>
<el-table-column prop="isShow" align="center" label="是否展示">
<template v-slot="scope">
{{ scope.row.isShow == 1 ? "" : "" }}
</template>
</el-table-column>
<el-table-column prop="awardStock" align="center" label="奖品库存" />
<el-table-column prop="awardPic" align="center" label="奖励图片">
<template v-slot="scope">
<el-image
style="width: 100px; height: 100px"
:src="scope.row.awardPic"
:zoom-rate="1.1"
:preview-src-list="[scope.row.awardPic]"
fit="contain"
preview-teleported="true"
hide-on-click-modal="true"
/>
</template>
</el-table-column>
</el-table>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="memberDialog = false">
关闭
</el-button>
</span>
</template>
</el-dialog>
<!-- 等级奖励配置编辑 -->
<el-dialog v-model="eidDialog" title="等级奖励配置(编辑)" center>
<div class="inquire">
<span>Boom等级{{ member.level }}</span>
</div>
<div class="inquire">
<span>金币任务数量{{ member.goldNum }}</span>
</div>
<!-- 内嵌表格 -->
<el-table
:data="eid.tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="seq" align="center" label="排序" />
<el-table-column prop="x" align="center" label="奖品类型">
<template v-slot="scope">
{{
scope.row.awardType == 8
? "金币"
: scope.row.awardType == 6
? "礼物"
: scope.row.awardType == 5
? "座驾"
: scope.row.awardType == 1
? "头饰"
: scope.row.awardType == 3
? "气泡"
: scope.row.awardType == 10
? "VIP"
: scope.row.awardType == 11
? "勋章"
: scope.row.awardType == 13
? "金豆"
: "铭牌"
}}
</template>
</el-table-column>
<el-table-column prop="awardNum" align="center" label="奖品天数" />
<el-table-column prop="type" align="center" label="用户身份">
<template v-slot="scope">
{{ scope.row.type == 1 ? "固定身份" : "随机身份" }}
</template>
</el-table-column>
<el-table-column prop="awardId" align="center" label="奖品ID/VIP等级" />
<el-table-column prop="awardPic" align="center" label="奖励图片">
<template v-slot="scope">
<el-image
style="width: 100px; height: 100px"
:src="scope.row.awardPic"
:zoom-rate="1.1"
:preview-src-list="[scope.row.awardPic]"
fit="contain"
preview-teleported="true"
hide-on-click-modal="true"
/>
</template>
</el-table-column>
<el-table-column prop="isShow" align="center" label="是否展示">
<template v-slot="scope">
{{ scope.row.isShow == 1 ? "" : "" }}
</template>
</el-table-column>
<el-table-column prop="awardStock" align="center" label="奖品库存" />
<el-table-column prop="x" align="center" label="操作">
<template v-slot="scope">
<el-button @click="editFun(scope.row)" type="text" size="default"
>编辑</el-button
>
<el-button @click="delFun(scope.row)" type="text" size="default"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="addDialog = true">
增加一条
</el-button>
<el-button type="primary" @click="eidDialog = false">
关闭
</el-button>
</span>
</template>
</el-dialog>
<!-- 增加一条弹窗 -->
<el-dialog
v-model="addDialog"
title="等级奖励配置(新增)"
class="addBox"
center
width="26%"
>
<div class="inquire">
<span>奖品类型</span>
<el-select filterable v-model="addObj.giftVal" placeholder="请选择">
<el-option
v-for="item in addObj.giftType"
:key="item.id"
:label="item.desc"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="inquire">
<span>用户身份</span>
<el-select filterable v-model="addObj.type" placeholder="请选择">
<el-option
v-for="item in addObj.typeArr"
:key="item.id"
:label="item.desc"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="inquire">
<span>奖品ID/VIP等级:</span>
<el-input
v-model="addObj.giftId"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span>奖励数量/天数</span>
<el-input
v-model="addObj.giftNum"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span>库存</span>
<el-input
v-model="addObj.awardStock"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span>顺序:</span>
<el-input v-model="addObj.sNo" placeholder="" class="input"></el-input>
</div>
<div class="inquire">
<span>是否展示</span>
<el-select filterable v-model="addObj.showVal" placeholder="请选择">
<el-option
v-for="item in addObj.show"
:key="item.id"
:label="item.desc"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="inquire">
<span>奖励图片</span>
<el-upload
class="avatar-uploader"
action="/admin/tencent/cos/upload/file"
:show-file-list="false"
:on-success="handleAvatarSuccess4"
:before-upload="beforeAvatarUpload"
:on-error="handleAvatarError"
>
<img v-if="addObj.imageUrl" :src="addObj.imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</div>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="addFun()"> 保存 </el-button>
<el-button type="primary" @click="addDialog = false">
取消
</el-button>
</span>
</template>
</el-dialog>
<!-- 编辑弹窗 -->
<el-dialog
v-model="editDialog"
title="等级奖励配置(编辑)"
class="addBox"
center
width="26%"
>
<div class="inquire">
<span>奖品类型</span>
<el-select filterable v-model="editObj.giftVal" placeholder="请选择">
<el-option
v-for="item in editObj.giftType"
:key="item.id"
:label="item.desc"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="inquire">
<span>用户身份</span>
<el-select filterable v-model="editObj.type" placeholder="请选择">
<el-option
v-for="item in editObj.typeArr"
:key="item.id"
:label="item.desc"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="inquire">
<span>奖品ID/VIP等级:</span>
<el-input
v-model="editObj.giftId"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span>奖励数量/天数</span>
<el-input
v-model="editObj.giftNum"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span>库存</span>
<el-input
v-model="editObj.awardStock"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span>顺序:</span>
<el-input v-model="editObj.sNo" placeholder="" class="input"></el-input>
</div>
<div class="inquire">
<span>是否展示</span>
<el-select filterable v-model="editObj.showVal" placeholder="请选择">
<el-option
v-for="item in editObj.show"
:key="item.id"
:label="item.desc"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div class="inquire">
<span>奖励图片</span>
<el-upload
class="avatar-uploader"
action="/admin/tencent/cos/upload/file"
:show-file-list="false"
:on-success="handleAvatarSuccess5"
:before-upload="beforeAvatarUpload"
:on-error="handleAvatarError"
>
<img v-if="editObj.imageUrl" :src="editObj.imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</div>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="editSaveFun()"> 保存 </el-button>
<el-button type="primary" @click="editDialog = false">
取消
</el-button>
</span>
</template>
</el-dialog>
<!-- 编辑弹窗 -->
<el-dialog
v-model="eidDialogBox"
title="编辑"
class="addBox"
center
width="26%"
>
<div class="inquire">
<span>BOOM等级</span>
<el-input
v-model="eidObj.level"
placeholder=""
class="input"
disabled
></el-input>
</div>
<div class="inquire">
<span>金币任务数</span>
<el-input
v-model="eidObj.goldNum"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span style="float: left">等级图</span>
<el-upload
style="float: left"
class="avatar-uploader input"
action="/admin/tencent/cos/upload/file"
:show-file-list="false"
:on-success="handleAvatarSuccess1"
:before-upload="beforeAvatarUpload"
:on-error="handleAvatarError"
>
<img v-if="eidObj.imageUrl1" :src="eidObj.imageUrl1" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
</div>
<div class="inquire">
<span style="float: left">倒计时</span>
<el-upload
style="float: left; width: 200px; height: 150px"
class="avatar-uploader input"
action="/admin/tencent/cos/upload/file"
:show-file-list="false"
:on-success="handleAvatarSuccess2"
:before-upload="beforeAvatarUpload"
:on-error="handleAvatarError"
>
<video
v-if="eidObj.imageUrl2"
:key="eidObj.imageUrl2"
autoplay
width="320"
height="240"
controls="controls"
>
<source :src="eidObj.imageUrl2" type="video/mp4" />
</video>
</el-upload>
</div>
<div class="inquire">
<span style="float: left">Boom</span>
<el-upload
style="float: left; width: 200px; height: 150px"
class="avatar-uploader input"
action="/admin/tencent/cos/upload/file"
:show-file-list="false"
:on-success="handleAvatarSuccess3"
:before-upload="beforeAvatarUpload"
:on-error="handleAvatarError"
>
<video
v-if="eidObj.imageUrl3"
:key="eidObj.imageUrl3"
autoplay
width="320"
height="240"
controls="controls"
>
<source :src="eidObj.imageUrl3" type="video/mp4" />
</video>
</el-upload>
</div>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="levelUpdateFun()"> 保存 </el-button>
<el-button type="primary" @click="eidDialogBox = false">
取消
</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import {
levelList,
levelUpdate,
awardList,
awardUpdate,
awardDel,
} from "@/api/boom/boom";
import { ElMessage } from "element-plus";
import PartitionSelect from "@/views/common/partitionSelect.vue";
export default {
name: "levelSet",
components: {PartitionSelect},
data() {
return {
id: "",
loading: false,
//查询所需条件对象
inquire: {
partitionId: undefined,
options: [],
},
// 表格
tableData: [],
// 内嵌表格查看
memberDialog: false,
member: {
level: "",
goldNum: "",
tableData: [],
},
// 内嵌表格编辑
eidDialog: false,
eid: {
tableData: [],
},
// 编辑弹窗
editDialog: false,
editObj: {
imageUrl: "",
giftVal: 8,
giftType: [
{ desc: "金币", value: 8 },
{ desc: "礼物", value: 6 },
{ desc: "座驾", value: 5 },
{ desc: "头饰", value: 1 },
{ desc: "气泡", value: 3 },
{ desc: "VIP", value: 10 },
{ desc: "勋章", value: 11 },
{ desc: "铭牌", value: 2 },
{ desc: "金豆", value: 13 },
],
type: "",
typeArr: [
{ desc: "固定身份", value: 1 },
{ desc: "随机身份", value: 2 },
],
giftId: "",
giftNum: "",
awardStock: "",
sNo: "",
showVal: "",
id: "",
show: [
{ desc: "是", value: 1 },
{ desc: "否", value: 0 },
],
},
// 新增弹窗
addDialog: false,
addObj: {
imageUrl: "",
giftVal: 8,
giftType: [
{ desc: "金币", value: 8 },
{ desc: "礼物", value: 6 },
{ desc: "座驾", value: 5 },
{ desc: "头饰", value: 1 },
{ desc: "气泡", value: 3 },
{ desc: "VIP", value: 10 },
{ desc: "勋章", value: 11 },
{ desc: "铭牌", value: 2 },
{ desc: "金豆", value: 13 },
],
type: "",
typeArr: [
{ desc: "固定身份", value: 1 },
{ desc: "随机身份", value: 2 },
],
giftId: "",
giftNum: "",
awardStock: "",
sNo: "",
showVal: "",
show: [
{ desc: "是", value: 1 },
{ desc: "否", value: 0 },
],
},
//编辑
eidDialogBox: false,
eidObj: {
level: "",
goldNum: "",
imageUrl1: "",
imageUrl2: "",
imageUrl3: "",
},
// 分页
total: 0, //总页数
currentPage: 1, //页码
pageSize: 5, //条数
};
},
methods: {
// 查询接口
getData() {
this.loading = true;
levelList({
partitionId: this.inquire.partitionId,
}).then((res) => {
if (res.code == 200) {
// this.total = res.data.total;
// this.tableData = res.data.records;
this.tableData = res.data;
this.loading = false;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 编辑弹窗
editFun(val) {
this.editObj.giftVal = val.awardType;
this.editObj.giftNum = val.awardNum;
this.editObj.giftId = val.awardId;
this.editObj.awardStock = val.awardStock;
this.editObj.sNo = val.seq;
this.editObj.showVal = val.isShow;
this.editObj.type = val.type;
this.editObj.imageUrl = val.awardPic;
this.editObj.id = val.id;
this.editDialog = true;
},
// 确认编辑弹窗
editSaveFun() {
var level = this.id;
var obj = {
awardType: this.editObj.giftVal,
awardNum: this.editObj.giftNum,
awardId: this.editObj.giftId,
awardStock: this.editObj.awardStock,
seq: this.editObj.sNo,
isShow: this.editObj.showVal,
type: this.editObj.type,
awardPic: this.editObj.imageUrl,
id: this.editObj.id,
partitionId: this.inquire.partitionId,
level,
};
awardUpdate(obj).then((res) => {
if (res.code == 200) {
this.editDialog = false;
awardList({
level,
partitionId: this.inquire.partitionId,
}).then((res) => {
this.eid.tableData = res.data;
ElMessage({
showClose: true,
message: "成功",
type: "success",
});
});
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 新增
addFun() {
var level = this.id;
var obj = {
awardType: this.addObj.giftVal,
awardNum: this.addObj.giftNum,
awardId: this.addObj.giftId,
awardStock: this.addObj.awardStock,
seq: this.addObj.sNo,
isShow: this.addObj.showVal,
type: this.addObj.type,
awardPic: this.addObj.imageUrl,
partitionId: this.inquire.partitionId,
level,
};
awardUpdate(obj).then((res) => {
if (res.code == 200) {
this.addDialog = false;
awardList({
level,
partitionId: this.inquire.partitionId,
}).then((res) => {
this.eid.tableData = res.data;
ElMessage({
showClose: true,
message: "成功",
type: "success",
});
});
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 删除
delFun(val) {
var level = this.id;
awardDel({
id: val.id,
}).then((res) => {
if (res.code == 200) {
awardList({
level,
partitionId: this.inquire.partitionId,
}).then((res) => {
this.eid.tableData = res.data;
ElMessage({
showClose: true,
message: "成功",
type: "success",
});
});
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 查看明细
seeList(val) {
awardList({
level: val.level,
partitionId: this.inquire.partitionId,
}).then((res) => {
this.memberDialog = true;
this.member.tableData = res.data;
});
},
eidList(val) {
awardList({
level: val.level,
partitionId: this.inquire.partitionId,
}).then((res) => {
this.eidDialog = true;
this.eid.tableData = res.data;
});
},
// 编辑列表
levelUpdateFun() {
var obj = {
id: this.id,
level: this.eidObj.level,
goldNum: this.eidObj.goldNum,
pic: this.eidObj.imageUrl1,
countDownVapUrl: this.eidObj.imageUrl2,
endVapUrl: this.eidObj.imageUrl3,
partition: this.inquire.partitionId,
};
levelUpdate(obj).then((res) => {
if (res.code == 200) {
ElMessage({
showClose: true,
message: "编辑成功!",
type: "success",
});
this.eidDialogBox = false;
this.getData();
} else {
ElMessage({
showClose: true,
message: res.success,
type: "error",
});
}
});
},
beforeAvatarUpload() {
ElMessage({
showClose: true,
message: "上传中,可能较慢,请等待上穿成功的提示在操作下一步~",
type: "warning",
});
},
handleAvatarError() {
ElMessage({
showClose: true,
message: "上传失败!",
type: "error",
});
},
handleAvatarSuccess1(res, file) {
console.log(file);
// this.ediObj.imageUrl = URL.createObjectURL();
this.eidObj.imageUrl1 = res.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
},
handleAvatarSuccess2(res, file) {
console.log(file);
// this.ediObj.imageUrl = URL.createObjectURL();
this.eidObj.imageUrl2 = res.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
},
handleAvatarSuccess3(res, file) {
console.log(file);
// this.ediObj.imageUrl = URL.createObjectURL();
this.eidObj.imageUrl3 = res.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
},
handleAvatarSuccess4(res, file) {
console.log(file);
// this.ediObj.imageUrl = URL.createObjectURL();
this.addObj.imageUrl = res.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
},
handleAvatarSuccess5(res, file) {
console.log(file);
// this.ediObj.imageUrl = URL.createObjectURL();
this.editObj.imageUrl = res.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
},
// 分页导航
handleSizeChange() {
this.getData();
},
handleCurrentChange() {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
margin-bottom: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
.addBox {
.el-dialog__body {
.inquire {
span {
margin-right: 10px;
width: 113px;
display: inline-block;
}
.input {
width: 180px;
margin-right: 10px;
}
}
}
}
</style>

View File

@@ -0,0 +1,410 @@
<template>
<div class="box">
<!-- 查询 -->
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="inquire.partitionId" v-model:partition-infos="inquire.options" />
</div>
<div class="inquire">
<span>房间ID:</span>
<el-input
v-model="inquire.roomId"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span>BOOM等级:</span>
<el-input
v-model="inquire.boomLevel"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<span>触发者ID</span>
<el-input
v-model="inquire.triggererId"
placeholder=""
class="input"
></el-input>
</div>
<div class="inquire">
<div class="block">
<span class="demonstration">开始时间</span>
<el-date-picker
v-model="inquire.time[0]"
type="datetime"
placeholder="开始时间"
>
</el-date-picker>
</div>
</div>
<div class="inquire">
<div class="block">
<span class="demonstration">结束时间</span>
<el-date-picker
v-model="inquire.time[1]"
type="datetime"
placeholder="结束时间"
>
</el-date-picker>
</div>
</div>
<!-- 查询按钮 -->
<el-button class="primary but" type="primary" @click="getData()"
>查询</el-button
>
<el-button
class="primary"
type="primary"
@click="
inquire.partitionId = inquire.options[0].id;
inquire.roomId = '';
inquire.boomLevel = '';
inquire.triggererId = '';
inquire.time = [];
getData();
"
>重置查询</el-button
>
<el-button
class="primary"
type="primary"
@click="diamondStatisticsExportFun()"
>导出</el-button
>
<!-- 表格 -->
<el-table
v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="cycleDate" align="center" label="日期" />
<el-table-column prop="roomErbanNo" align="center" label="房间ID" />
<el-table-column prop="level" align="center" label="Boom等级" />
<el-table-column prop="erbanNo" align="center" label="触发者ID" />
<el-table-column prop="drawTime" align="center" label="触发时间" />
<el-table-column prop="num" align="center" label="参与用户数" />
<el-table-column prop="awardNum" align="center" label="发放奖励数" />
<el-table-column prop="ownerGold" align="center" label="获得金币数" />
<el-table-column align="center" label="操作" width="300">
<template v-slot="scope">
<el-button
@click="
memberVal = scope.row;
detailListFun();
"
type="text"
size="default"
>贡献及获奖明细</el-button
>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top: 10px"
class="paginationClass"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 30, 40, 50, 100, 200, 300, 400, 500, 999999999]"
layout="sizes, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<!-- 贡献或获奖明细 -->
<el-dialog
v-loading="loading2"
v-model="memberDialog"
title="贡献或获奖明细"
center
>
<!-- 内嵌表格 -->
<el-table
:data="member.tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="roleType" align="center" label="角色">
<template v-slot="scope">
{{
scope.row.roleType == 1
? "房主"
: scope.row.roleType == 2
? "贡献榜1"
: scope.row.roleType == 3
? "贡献榜2"
: scope.row.roleType == 4
? "贡献榜3"
: scope.row.roleType == 5
? "boom触发者"
: scope.row.roleType == 6
? "房内普通用户"
: ""
}}
</template>
</el-table-column>
<el-table-column prop="erbanNo" align="center" label="用户ID" />
<el-table-column prop="nick" align="center" label="用户昵称" />
<el-table-column prop="exper" align="center" label="贡献值" />
<el-table-column prop="level" align="center" label="Boom等级" />
<el-table-column prop="awardType" align="center" label="奖品类型">
<template v-slot="scope">
{{
scope.row.awardType == 8
? "金币"
: scope.row.awardType == 6
? "礼物"
: scope.row.awardType == 5
? "座驾"
: scope.row.awardType == 1
? "头饰"
: scope.row.awardType == 3
? "气泡"
: scope.row.awardType == 10
? "VIP"
: scope.row.awardType == 11
? "勋章"
: scope.row.awardType == 13
? "金豆"
: "铭牌"
}}
</template>
</el-table-column>
<el-table-column prop="awardName" align="center" label="获得奖励" />
<el-table-column prop="awardNum" align="center" label="获得奖励数" />
<el-table-column
prop="createTime"
align="center"
label="奖励发放时间"
>
<template v-slot="scope">{{
convertTimestamp(scope.row.createTime)
}}</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top: 10px"
class="paginationClass"
v-model:current-page="currentPage2"
v-model:page-size="pageSize2"
:page-sizes="[10, 20, 30, 40, 50, 100, 200, 300, 400, 500, 999999999]"
layout="sizes, prev, pager, next"
:total="total2"
@size-change="handleSizeChange2"
@current-change="handleCurrentChange2"
/>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="memberDialog = false">
关闭
</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import {
recordList,
detailList,
recordExport,
} from "@/api/boom/boom";
// @ts-ignore
import { dateFormat } from "@/utils/system-helper";
// @ts-ignore
import { ElMessage } from "element-plus";
import PartitionSelect from "@/views/common/partitionSelect.vue";
export default {
name: "recordData",
components: {PartitionSelect},
data() {
return {
loading: false,
loading2: false,
//查询所需条件对象
inquire: {
partitionId: undefined,
options: [],
roomId: "",
boomLevel: "",
triggererId: "",
time: [],
},
// 表格
tableData: [],
// 内嵌表格
memberDialog: false,
memberVal: null,
member: {
tableData: [],
},
// 新增弹窗
addDialog: false,
// 分页
total: 0, //总页数
currentPage: 1, //页码
pageSize: 10, //条数
// 分页
total2: 0, //总页数
currentPage2: 1, //页码
pageSize2: 10, //条数
};
},
methods: {
// 查询接口
getData() {
this.loading = true;
let time = this.inquire.time;
let startTime = null;
let endTime = null;
if (time.length > 0) {
startTime = this.inquire.time[0]
? dateFormat(this.inquire.time[0], "yyyy-MM-dd hh:mm:ss")
: null;
endTime = this.inquire.time[1]
? dateFormat(this.inquire.time[1], "yyyy-MM-dd hh:mm:ss")
: null;
}
recordList({
partitionId: this.inquire.partitionId,
erbanNo: this.inquire.triggererId,
level: this.inquire.boomLevel,
roomErbanNo: this.inquire.roomId,
startTime: startTime,
endTime: endTime,
pageNo: this.currentPage,
pageSize: this.pageSize,
}).then((res) => {
if (res.code == 200) {
this.total = res.data.total;
this.tableData = res.data.records;
this.loading = false;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 详细弹窗
detailListFun() {
this.loading2 = true;
let time = this.inquire.time;
let startTime = null;
let endTime = null;
if (time.length > 0) {
startTime = this.inquire.time[0]
? dateFormat(this.inquire.time[0], "yyyy-MM-dd hh:mm:ss")
: null;
endTime = this.inquire.time[1]
? dateFormat(this.inquire.time[1], "yyyy-MM-dd hh:mm:ss")
: null;
}
detailList({
partitionId: this.inquire.partitionId,
signId: this.memberVal.signId,
level: this.memberVal.level,
startTime: startTime,
endTime: endTime,
pageNo: this.currentPage2,
pageSize: this.pageSize2,
}).then((res) => {
if (res.code == 200) {
this.total2 = res.data.total;
this.member.tableData = res.data.records;
this.memberDialog = true;
this.loading2 = false;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
diamondStatisticsExportFun() {
let time = this.inquire.time;
let startTime = "";
let endTime = "";
if (time.length > 0) {
startTime = this.inquire.time[0]
? dateFormat(this.inquire.time[0], "yyyy-MM-dd hh:mm:ss")
: "";
endTime = this.inquire.time[1]
? dateFormat(this.inquire.time[1], "yyyy-MM-dd hh:mm:ss")
: "";
}
recordExport({
partitionId: this.inquire.partitionId,
erbanNo: this.inquire.triggererId,
level: this.inquire.boomLevel,
roomErbanNo: this.inquire.roomId,
startTime: startTime,
endTime: endTime,
}).then();
},
convertTimestamp (time) {
let date = new Date(time);
return date.format("yyyy-MM-dd hh:mm:ss");
},
// 分页详情导航
handleSizeChange2() {
this.detailListFun();
},
handleCurrentChange2() {
this.detailListFun();
},
// 分页导航
handleSizeChange() {
this.getData();
},
handleCurrentChange() {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
margin-bottom: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
</style>

View File

@@ -0,0 +1,182 @@
<template>
<div class="box">
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="formData.partitionId" />
</div>
<div class="inquire">
<span>房间ID:</span>
<el-input v-model="formData.roomErbanNo" placeholder="" class="input"></el-input>
</div>
<div class="inquire">
<div class="block">
<span class="demonstration">开始时间</span>
<el-date-picker v-model="formData.startTime" type="datetime" placeholder="开始时间">
</el-date-picker>
</div>
</div>
<div class="inquire">
<span class="demonstration">状态</span>
<el-select v-model="formData.eventStatus" placeholder="请选择">
<el-option label="全部" :value="-1"></el-option>
<el-option label="待审核" :value="0"></el-option>
<el-option label="审核通过" :value="1"></el-option>
<el-option label="拒绝" :value="2"></el-option>
<el-option label="删除" :value="3"></el-option>
<el-option label="过期" :value="4"></el-option>
</el-select>
</div>
<el-button style="" type="primary" @click="getData()">查询</el-button>
<!-- 表格数据 -->
<el-table v-loading="tableData.loading" :data="tableData.data" ref="multipleTable"
@selection-change="handleSelectionChange" border style="width: 100%; margin-top: 25px">
<el-table-column prop="id" align="center" label="id" />
<el-table-column prop="roomErbanNo" align="center" label="房间ID" />
<el-table-column prop="erbanNo" align="center" label="举办人ID" />
<el-table-column prop="nick" align="center" label="举办人昵称" />
<el-table-column prop="partitionDesc" align="center" label="分区" />
<el-table-column prop="eventTopic" align="center" label="活动标题" />
<el-table-column prop="eventDetail" align="center" label="活动内容" />
<el-table-column prop="eventBanner" align="center" label="活动banner" >
<template v-slot="scope">
<el-image style="width: 100px; height: 100px" :src="scope.row.eventBanner" :zoom-rate="1.1"
:preview-src-list="[scope.row.eventBanner]" fit="scale-down" preview-teleported="true"
hide-on-click-modal="true" />
</template>
</el-table-column>
<el-table-column prop="eventStartTimeStr" align="center" label="开始时间" />
<el-table-column prop="eventDuration" align="center" label="活动时长(分钟)" />
<el-table-column prop="createTimeStr" align="center" label="提交时间" />
<el-table-column align="center" label="操作" width="200">
<template v-slot="scope">
<template v-if="scope.row.eventStatus === 0">
<el-button class="primary" type="primary" @click="
operatorEvent(scope.row, 1);
" size="default">同意</el-button>
<el-button class="primary" type="danger" @click="
operatorEvent(scope.row, 2);
" size="default">拒绝</el-button>
</template>
<template v-else>
{{ scope.row.eventStatus === 1 ? '审核通过' : scope.row.eventStatus === 2 ? '已拒绝' :
scope.row.eventStatus === 3 ? '已删除' + '('+scope.row.remark+')' : '已过期' }}
</template>
</template>
</el-table-column>
<el-table-column prop="operator" align="center" label="操作人" />
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px" class="paginationClass" :current-page="formData.pageNo"
:page-size="formData.pageSize" :page-sizes="[10, 20, 50, 100, 200]" layout="sizes, prev, pager, next"
:total="tableData.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</template>
<script>
import { ref, onMounted, reactive } from 'vue'
import PartitionSelect from "../common/partitionSelect.vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { dateFormat } from "@/utils/system-helper";
import { getListEvent, operatorListEvent } from "@/api/boom/roomActivityApplication";
export default {
name: "roomActivityApplication",
components: { PartitionSelect },
setup() {
const formData = reactive({
partitionId: undefined,
roomErbanNo: '',
startTime: '',
eventStatus: -1,
pageNo: 1,
pageSize: 10,
});
const tableData = reactive({
data: [],
total: 0,
loading: false,
})
const getData = () => {
if (formData.startTime) {
formData.startTime = dateFormat(formData.startTime, "yyyy-MM-dd hh:mm:ss")
}
tableData.loading = true;
getListEvent(formData).then(res => {
if (res.code == 200) {
tableData.data = res.data.rows
tableData.loading = false;
tableData.total = res.data.total
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
})
};
const operatorEvent = (row, eventStatus) => {
const eventId = row.id;
ElMessageBox.confirm('确认此操作吗', "提示", {
type: "warning",
confirmButtonText: "确定",
cancelButtonText: "取消",
}).then(() => {
operatorListEvent({ eventId, eventStatus }).then(res => {
if (res.code === 200) {
ElMessage.success('操作成功');
getData();
} else {
ElMessage.error(res.message);
}
})
})
}
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
return {
formData,
getData,
tableData,
handleSizeChange,
handleCurrentChange,
operatorEvent
}
}
}
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
</style>

View File

@@ -0,0 +1,121 @@
<template>
<div class="box">
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="formData.partitionId" />
</div>
<div class="inquire">
<span>房间ID:</span>
<el-input v-model="formData.roomErbanNo" placeholder="" class="input"></el-input>
</div>
<div class="inquire">
<div class="block">
<span class="demonstration">开始时间</span>
<el-date-picker v-model="formData.startTime" type="datetime" placeholder="开始时间">
</el-date-picker>
</div>
</div>
<el-button style="" type="primary" @click="getData()">查询</el-button>
<!-- 表格数据 -->
<el-table v-loading="tableData.loading" :data="tableData.data" ref="multipleTable"
@selection-change="handleSelectionChange" border style="width: 100%; margin-top: 25px">
<el-table-column prop="id" align="center" label="id" />
<el-table-column prop="roomErbanNo" align="center" label="房间ID" />
<el-table-column prop="erbanNo" align="center" label="举办人ID" />
<el-table-column prop="nick" align="center" label="举办人昵称" />
<el-table-column prop="partitionDesc" align="center" label="分区" />
<el-table-column prop="eventStartTimeStr" align="center" label="开始时间" />
<el-table-column prop="eventDuration" align="center" label="活动时长(分钟)" />
<el-table-column prop="diamondNum" align="center" label="房间钻石流水" />
<el-table-column prop="goldNum" align="center" label="房间金币流水" />
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px" class="paginationClass" :current-page="formData.pageNo"
:page-size="formData.pageSize" :page-sizes="[10, 20, 50, 100, 200]" layout="sizes, prev, pager, next"
:total="tableData.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</template>
<script>
import { ref, onMounted, reactive } from 'vue'
import PartitionSelect from "../common/partitionSelect.vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { getUserEventDataList } from "@/api/boom/roomActivityApplication";
export default {
name: "roomActivityDataStatistics",
components: { PartitionSelect },
setup() {
const formData = reactive({
partitionId: undefined,
roomErbanNo: '',
startTime: '',
pageNo:1,
pageSize:10,
});
const tableData = reactive({
data: [],
total: 0,
loading: false,
})
const getData = () => {
tableData.loading = true;
getUserEventDataList(formData).then(res => {
if (res.code == 200) {
tableData.data = res.data.rows
tableData.loading = false;
tableData.total = res.data.total
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
})
};
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
return {
formData,
getData,
tableData,
handleSizeChange,
handleCurrentChange
}
}
}
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
</style>

View File

@@ -0,0 +1,236 @@
<template>
<div class="box">
<div class="condition">
<!-- 分区 -->
<div class="inquire">
<span>奖池</span>
<el-select
v-model="inquire.value"
placeholder="请选择"
@change="handleChange"
>
<el-option
v-for="item in inquire.options"
:key="item.type"
:label="item.name"
:value="item.type"
>
</el-option>
</el-select>
</div>
</div>
<!-- 总分组 -->
<div class="allArr">
目前数组 <span>{{ allArr.length }} </span> :
<span class="span" v-for="(item, index) in allArr" :key="index">
{{ item.expect }},
</span>
</div>
<!-- 数组设置 -->
<div class="arrSet">数组设置</div>
<!-- 数组内容 -->
<div class="boxs">
<div class="arrContent" v-for="(item, index) in arr" :key="index">
<div class="arrBox">
<div class="left">
<div class="left_in1">
数组ID: <b class="b1">{{ item.id }}</b> ,
</div>
<div class="left_in1">
期望: <b class="b1">{{ item.expect }}</b> ,
</div>
<div class="left_in2">
得到率: <b class="b2">{{ (item.winRate * 100).toFixed(2) }}%</b> ,
</div>
</div>
<div class="right" v-for="(arrInItem, i) in item.itemList" :key="i">
<span>{{ arrInItem.multi }}</span>
<el-input
@input="handleInput(index, i, $event)"
v-model="arrInItem.num"
placeholder=""
class="input"
/>
</div>
</div>
</div>
</div>
<!-- 按钮 -->
<div class="but">
<el-button class="primary" type="primary" @click="saveFun()"
>保存
</el-button>
</div>
</div>
</template>
<script>
import { listType, list, save } from "@/api/bravoGift/bravoGift";
// @ts-ignore
import { dateFormat } from "@/utils/system-helper";
// @ts-ignore
import { ElMessage } from "element-plus";
import moment from "moment-timezone";
export default {
name: "bravoGiftArrange",
data() {
return {
//查询所需条件对象
inquire: {
value: "",
options: [],
},
allArr: [], //总数组
arr: [], //处理下面总数组
};
},
created() {
listType().then((res) => {
this.inquire.options = res.data;
this.inquire.value = res.data[0].type;
this.getData();
});
},
methods: {
// 查询接口
getData() {
list({ type: this.inquire.value }).then((res) => {
this.allArr = res.data;
this.arr = res.data;
});
},
handleInput(index, i, val) {
// 期望值 expectedvalue = 倍数 * 5 * num / 2500
// 中奖率 winRate =不为θ的倍数的num / 500
this.arr[index].expect = this.calculationFun(index, i, val).expect;
this.arr[index].winRate = this.calculationFun(index, i, val).winRate;
},
// 计算函数
calculationFun(index, i, val) {
var expectNum = 0;
var winRate = 0;
this.arr[index].itemList.forEach((res) => {
expectNum += res.multi * res.num;
winRate += Number(res.num);
});
console.log(winRate);
return {
expect: (expectNum / 500).toFixed(2),
winRate: (winRate / 500).toFixed(4),
};
},
// 保存
saveFun() {
//
save(
JSON.stringify({ poolList: this.arr, type: this.inquire.value })
).then((res) => {
if (res.code == 200) {
ElMessage({
showClose: true,
message: "保存成功",
type: "success",
});
this.getData();
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 监听类型
handleChange(value) {
this.inquire.value = value;
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
font-size: 18px;
.condition {
margin-bottom: 20px;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
}
.but {
margin-bottom: 20px;
}
.allArr {
margin: 20px 0 10px 0;
span {
color: red;
}
.span {
margin: 0 10px;
}
}
.arrSet {
margin-bottom: 0px;
}
.boxs {
display: flex;
// justify-content: space-between;
flex-wrap: wrap;
.arrContent {
// margin-bottom: 20px;
width: 190px;
// height: 395px;
line-height: 30px;
margin-bottom: 20px;
.arrBox {
.left {
// float: left;
div {
min-width: 100px;
display: block;
// margin-bottom: -25px;
.b1 {
color: red;
}
.b2 {
color: blue;
}
}
.left_in2 {
margin-bottom: 10px
}
}
.right {
float: left;
margin-bottom: 15px;
span {
display: inline-block;
width: 45px;
}
.input {
display: inline-block;
width: 100px;
margin-right: 10px;
font-size: 16px;
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,255 @@
<template>
<div class="box">
<!-- ID -->
<div class="condition">
<!-- 分区 -->
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="inquire.value"
v-model:partition-infos="inquire.options"
/>
</div>
<div class="inquire">
<span>MoliStar ID</span>
<el-input v-model="inquire.userId" placeholder="" class="input">
</el-input>
</div>
<!-- 送出时间 -->
<div class="inquire">
<span>送出时间</span>
<el-date-picker v-model="inquire.time" type="date" placeholder="请选择">
</el-date-picker>
</div>
</div>
<el-button type="text">总进入{{ totalInput }}</el-button>
<el-button type="text">总退出{{ totalOutput }}</el-button>
<el-button type="text"
>总比例{{ totalProductionRatio }}</el-button
>
<!-- 按钮 -->
<div class="but">
<el-button class="primary" type="primary" @click="getData()"
>查询
</el-button>
<el-button
@click="
inquire.userId = '';
inquire.time = '';
"
>重置筛选
</el-button>
<el-button
class="primary"
type="primary"
style="margin-left: 20px;"
:disabled="butClick"
@click="
editDialog = true;
type = 12;
editDialogTitle = '赠送1000倍奖励';
value = inquire.x;
"
>
赠送</el-button
>
</div>
<!-- 表格 -->
<el-table
v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="date" align="center" label="日期" />
<el-table-column prop="uid" align="center" label="uid" />
<el-table-column prop="erbanNo" align="center" label="平台id" />
<el-table-column prop="totalInput" align="center" label="进入" />
<el-table-column prop="totalOutput" align="center" label="退出" />
<el-table-column prop="production" align="center" label="剩余" />
<el-table-column
prop="productionRatio"
align="center"
label="退出/进入"
/>
<el-table-column prop="avgInput" align="center" label="每次进入" />
<el-table-column prop="num" align="center" label="总次数" />
<el-table-column prop="winNum" align="center" label="得到次数" />
<el-table-column prop="winRate" align="center" label="得到率" />
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top: 10px"
class="paginationClass"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 30, 40, 50, 100, 200, 300, 400, 500, 999999999]"
layout="sizes, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<!-- 编辑弹窗 -->
<el-dialog v-model="editDialog" :title="editDialogTitle" width="36%" center>
<div style="margin-bottom: 25px; margin-top: 10px">
<span
style="display: inline-block; margin-right: 20px"
class="col-sm-2 control-label"
>{{ editDialogTitle }}</span
>
<el-input
v-model="value"
style="width: 75%"
class="input"
placeholder="请输入用户ID"
></el-input>
</div>
<template #footer>
<span class="dialog-footer">
<el-button
@click="
editDialog = false;
butClick = false;
"
>取消</el-button
>
<el-button
type="primary"
:disabled="butClick"
@click="editDialogClick()"
>
保存
</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { personal, updateUserMulti } from "@/api/bravoGift/bravoGift";
// @ts-ignore
import { dateFormat } from "@/utils/system-helper";
// @ts-ignore
import { ElMessage } from "element-plus";
import moment from "moment-timezone";
import PartitionSelect from "@/views/common/partitionSelect.vue";
export default {
name: "bravoGiftData",
components: {PartitionSelect},
data() {
return {
loading: false,
totalInput: 0,
totalOutput: 0,
totalProductionRatio: 0,
//查询所需条件对象
inquire: {
userId: "",
time: "",
value: undefined,
options: [],
},
// 表格
tableData: [],
// 分页
total: 10, //总页数
currentPage: 1, //页码
pageSize: 10, //条数
editDialog: false,
editDialogTitle: "",
value: "",
butClick:false
};
},
methods: {
// 查询接口
getData() {
this.butClick = false;
console.log(dateFormat(this.inquire.time, "yyyy-MM-dd"));
if (!this.inquire.time && this.inquire.userId == '') {
ElMessage({
showClose: true,
message: "时间和ID至少填一项",
type: "error",
});
return;
}
this.loading = true;
personal({
erbanNo: this.inquire.userId,
pageNo: this.currentPage,
pageSize: this.pageSize,
date: this.inquire.time
? dateFormat(this.inquire.time, "yyyy-MM-dd")
: null,
partitionId: this.inquire.value,
}).then((res) => {
this.total = res.data.dataPage.total;
this.tableData = res.data.dataPage.rows;
this.totalInput = res.data.totalInput;
this.totalOutput = res.data.totalOutput;
this.totalProductionRatio = res.data.totalProductionRatio;
this.loading = false;
});
},
// 确认保存
editDialogClick() {
this.butClick = true;
updateUserMulti({ erbanNo: this.value }).then((res) => {
if (res.code == 200) {
ElMessage({
showClose: true,
message: "赠送成功",
type: "success",
});
setTimeout(() => {
this.butClick = false;
}, 1000);
this.editDialog = false;
this.getData();
} else {
this.butClick = false;
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 分页导航
handleSizeChange() {
this.getData();
},
handleCurrentChange() {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.condition {
margin-bottom: 20px;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
}
.but {
margin-bottom: 20px;
}
}
</style>

View File

@@ -0,0 +1,122 @@
<template>
<div class="box">
<div class="condition">
<!-- 分区 -->
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="inquire.value"
v-model:partition-infos="inquire.options"
/>
</div>
<!-- 时间 -->
<!-- <div class="inquire">
<span>时间</span>
<el-date-picker v-model="inquire.time" type="date" placeholder="请选择">
</el-date-picker>
</div> -->
</div>
<!-- 按钮 -->
<div class="but">
<el-button class="primary" type="primary" @click="getData()"
>查询
</el-button>
</div>
<el-button type="text">数组出金币总额{{ totalInput }}</el-button>
<el-button type="text">数组出返币总额{{ totalOutput }}</el-button>
<el-button type="text">投产比{{ totalProductionRatio }}</el-button>
<!-- 表格 -->
<el-table
v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="date" align="center" label="日期" />
<el-table-column prop="totalInput" align="center" label="进入" />
<el-table-column prop="totalOutput" align="center" label="退出" />
<el-table-column
prop="productionRatio"
align="center"
label="退出/进入比例"
/>
<el-table-column prop="num" align="center" label="参与次数" />
<el-table-column prop="count" align="center" label="参与人数" />
<el-table-column prop="winCount" align="center" label="得到人数" />
<el-table-column prop="winNum" align="center" label="得到次数" />
<el-table-column prop="winRate" align="center" label="得到率" />
</el-table>
</div>
</template>
<script>
import { platform } from "@/api/bravoGift/bravoGift";
import PartitionSelect from "@/views/common/partitionSelect.vue";
export default {
name: "bravoGiftDataAll",
components: {PartitionSelect},
data() {
return {
loading: false,
totalInput: "0",
totalOutput: "0",
totalProductionRatio: "0",
//查询所需条件对象
inquire: {
value: undefined,
options: [],
time: "",
},
// 表格
tableData: [],
// 分页
total: 10, //总页数
currentPage: 1, //页码
pageSize: 10, //条数
};
},
methods: {
// 查询接口
getData() {
this.loading = true;
platform({
partitionId: this.inquire.value,
}).then((res) => {
this.totalInput = res.data.totalInput;
this.totalOutput = res.data.totalOutput;
this.totalProductionRatio = res.data.totalProductionRatio;
this.tableData = res.data.dataList;
this.loading = false;
});
},
// 分页导航
handleSizeChange() {
this.getData();
},
handleCurrentChange() {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.condition {
margin-bottom: 20px;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
}
.but {
margin-bottom: 20px;
}
}
</style>

View File

@@ -0,0 +1,552 @@
<template>
<div class="box">
<div class="condition">
<div class="inquire">
<span>用户上线列表</span>
<!-- @input="handleInput" -->
<el-input
v-model="inquire.followErbanNoList"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 11;
editDialogTitle = '用户上线列表';
value = inquire.followErbanNoList;
"
>
编辑</el-button
>
</div>
<div class="inquire">
<span>用户W级列表</span>
<!-- @input="handleInput" -->
<!-- <el-input
v-model="inquire.whiteErbanNoProductionRatioMap"
placeholder=""
class="input"
disabled
></el-input> -->
<el-button class="primary" type="primary" @click="detailsClick">
查看详情</el-button
>
</div>
<div class="inquire">
<span>用户B级列表</span>
<!-- @input="handleInput" -->
<el-input
v-model="inquire.blackErbanNoList"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 13;
editDialogTitle = '用户B级列表';
value = inquire.blackErbanNoList;
"
>
编辑</el-button
>
</div>
<!-- 分区 -->
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="inquire.value" v-model:partition-infos="inquire.options" v-model:after-init="getData" @update:partitionId="handleChange"/>
</div>
<div class="inquire">
<span>对比值N</span>
<!-- @input="handleInput" -->
<el-input
v-model="inquire.comparisonValue"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 1;
editDialogTitle = '对比值N';
value = inquire.comparisonValue;
"
>
编辑</el-button
>
</div>
<div class="inquire">
<span>Bravo金币库存</span>
<el-input
v-model="inquire.goldInventory"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 2;
editDialogTitle = '幸运24金币库存';
value = inquire.goldInventory;
"
>编辑</el-button
>
</div>
<!-- <div class="inquire">
<span>幸运礼物ID</span>
<el-input
v-model="inquire.x"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 8;
editDialogTitle = '幸运礼物ID';
value = inquire.x;
"
>
编辑</el-button
>
</div> -->
<div class="inquire">
<span>平台抽成</span>
<el-input
v-model="inquire.platformCommission"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 3;
editDialogTitle = '平台抽成';
value = inquire.platformCommission;
"
>编辑</el-button
>
</div>
<div class="inquire">
<span>用户收益比例</span>
<el-input
v-model="inquire.userRevenueRatio"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 4;
editDialogTitle = '用户收益比例';
value = inquire.userRevenueRatio;
"
>编辑</el-button
>
</div>
<div class="inquire">
<span>通知制定金额</span>
<!-- @input="handleInput" -->
<el-input
v-model="inquire.warnMulti"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 9;
editDialogTitle = '通知制定金额';
value = inquire.warnMulti;
"
>
编辑</el-button
>
</div>
<!-- <div class="inquire">
<span>库存告急通知</span>
<el-input
v-model="inquire.x"
placeholder=""
class="input"
disabled
></el-input>
<el-button
class="primary"
type="primary"
@click="
editDialog = true;
butClick = false;
type = 10;
editDialogTitle = '库存告急通知';
value = inquire.x;
"
>
编辑</el-button
>
</div> -->
<div class="inquire">
<span>赠送1000倍奖励</span>
<el-button
class="primary"
type="primary"
:disabled="butClick"
@click="
editDialog = true;
type = 12;
editDialogTitle = '赠送1000倍奖励';
value = inquire.x;
"
>
赠送</el-button
>
</div>
</div>
<!-- 编辑弹窗 -->
<el-dialog v-model="editDialog" :title="editDialogTitle" width="36%" center>
<div style="margin-bottom: 25px; margin-top: 10px">
<span
style="display: inline-block; margin-right: 20px"
class="col-sm-2 control-label"
>{{ editDialogTitle }}</span
>
<el-input
v-model="value"
style="width: 75%"
class="input"
placeholder="请输入"
></el-input>
</div>
<template #footer>
<span class="dialog-footer">
<el-button
@click="
editDialog = false;
butClick = false;
"
>取消</el-button
>
<el-button
type="primary"
:disabled="butClick"
@click="editDialogClick()"
>
保存
</el-button>
</span>
</template>
</el-dialog>
<!-- 详情弹窗 -->
<el-dialog v-model="detailsDialog" title="用户W级列表" width="36%" center>
<el-button class="primary" type="primary" @click="addDetail">
新增</el-button
>
<el-table :data="detailsTable" style="width: 100%">
<el-table-column label="用户ID">
<template v-slot="scope">
<el-input
v-model="scope.row.userId"
type="number"
@blur="handleEdit(scope.$index, scope.row)"
></el-input>
</template>
</el-table-column>
<el-table-column label="值">
<template v-slot="scope">
<el-input
v-model="scope.row.val"
type="number"
@blur="handleEdit(scope.$index, scope.row)"
></el-input>
</template>
</el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
<el-button
class="danger"
type="danger"
@click="delDetail(scope.$index, scope.row)"
>
删除</el-button
>
</template>
</el-table-column>
<!-- 其他列 -->
</el-table>
<template #footer>
<span class="dialog-footer">
<el-button @click="detailsDialog = false">取消</el-button>
<el-button type="primary" :disabled="butClick" @click="sevaDetail()">
保存
</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { getConfig, updateSet, updateUserMulti } from "@/api/bravoGift/bravoGift";
import { ElMessage } from "element-plus";
import moment from "moment-timezone";
import PartitionSelect from "../common/partitionSelect.vue";
export default {
name: "bravoGiftSet",
components: {PartitionSelect},
data() {
return {
loading: false,
butClick: false,
butClickTime: null,
//查询所需条件对象
inquire: {
value: 1,
options: [
// {
// name: "阿拉伯区",
// type: 2,
// },
// {
// name: "英语区",
// type: 1,
// },
// {
// name: "华语区",
// type: 4,
// },
// {
// name: "土耳其区",
// type: 8,
// },
],
comparisonValue: "",
goldInventory: "",
giftId: "",
platformCommission: "",
userRevenueRatio: "",
warnMulti: "",
followErbanNoList: "",
whiteErbanNoProductionRatioMap: "",
blackErbanNoList: "",
},
editDialog: false,
editDialogTitle: "",
detailsDialog: false,
value: "",
type: null,
// 详情
detailsTable: [],
whiteErbanNoProductionRatioMap: null,
};
},
methods: {
// 查询接口
getData() {
getConfig({ partitionId: this.inquire.value }).then((res) => {
this.inquire.comparisonValue = res.data.productionRatio;
this.inquire.goldInventory = res.data.stock;
this.inquire.platformCommission = res.data.platformRatio;
this.inquire.userRevenueRatio = res.data.receiverRatio;
this.inquire.warnMulti = res.data.warnMulti;
this.inquire.followErbanNoList = res.data.followErbanNoList.join();
// this.inquire.whiteErbanNoProductionRatioMap = res.data.whiteErbanNoProductionRatioMap.join();
this.inquire.blackErbanNoList = res.data.blackErbanNoList.join();
var newArr = [];
var obj = res.data.whiteErbanNoProductionRatioMap;
var arr = Object.keys(obj).map((key) => ({
userId: key,
val: obj[key],
}));
arr.forEach((res, i) => {
newArr[i] = res;
});
this.detailsTable = newArr;
});
},
// 查看详情按钮
detailsClick() {
this.getData();
this.detailsDialog = true;
this.type = 14;
// this.value = inquire.whiteErbanNoProductionRatioMap;
},
// 详情新增按钮
addDetail() {
this.detailsTable.unshift([]);
},
// 详情删除按钮
delDetail(index, val) {
this.detailsTable.splice(index, 1);
},
// 详情确认保存按钮
sevaDetail() {
var map = {};
var lock = true;
this.detailsTable.forEach((res) => {
if (res.userId == (undefined || "") || res.val == undefined || "") {
lock = false;
}
map[res.userId] = res.val;
});
console.log(map);
this.whiteErbanNoProductionRatioMap = map;
if (lock) {
this.editDialogClick();
} else {
ElMessage({
showClose: true,
message: "用户ID和值不能为空",
type: "error",
});
}
},
// 详情编辑监听
handleEdit(index, row) {
// 这里可以添加保存逻辑例如调用API更新服务器数据等。
console.log(index, "保存行数据", row);
// 示例:更新本地数据或其他操作...
},
// 确认保存
editDialogClick() {
var obj = {};
obj.partitionId = this.inquire.value;
if (this.type == 12) {
this.butClick = true;
updateUserMulti({ erbanNo: this.value }).then((res) => {
if (res.code == 200) {
ElMessage({
showClose: true,
message: "赠送成功",
type: "success",
});
setTimeout(() => {
this.butClick = false;
}, 3000);
this.editDialog = false;
this.getData();
} else {
this.butClick = false;
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
} else {
if (this.type == 1) {
obj.productionRatio = this.value;
} else if (this.type == 2) {
obj.stock = this.value;
} else if (this.type == 3) {
obj.platformRatio = this.value;
} else if (this.type == 4) {
obj.receiverRatio = this.value;
} else if (this.type == 9) {
obj.warnMulti = this.value;
} else if (this.type == 11) {
obj.followErbanNoList = this.value.split(",");
} else if (this.type == 14) {
obj.whiteErbanNoProductionRatioMap =
this.whiteErbanNoProductionRatioMap;
} else if (this.type == 13) {
obj.blackErbanNoList = this.value.split(",");
}
updateSet(obj).then((res) => {
if (res.code == 200) {
ElMessage({
showClose: true,
message: "保存成功",
type: "success",
});
this.editDialog = false;
// this.detailsDialog = false;
this.getData();
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
}
},
// 监听类型
handleChange(value) {
this.inquire.value = value;
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.condition {
margin-bottom: 20px;
.inquire {
margin-right: 20px;
margin-bottom: 20px;
span {
display: inline-block;
width: 110px;
margin-right: 10px;
// text-align: right;
}
.input {
width: 180px;
margin-right: 10px;
}
}
}
.but {
margin-bottom: 20px;
}
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,108 @@
<template>
<!-- 使用 el-select 组件并绑定 v-model partitionId -->
<el-select v-model="regionIdValue" :placeholder="placeholder" @change="handleChangeEvent">
<!-- 遍历 partitionInfoList 数组为每个 item 生成一个 el-option 组件 -->
<el-option v-for="item in regionInfoList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</template>
<script>
import { ref, watch, onMounted } from "vue";
import { listByPartitionId } from "@/api/partition/regionInfo";
export default {
name: "partitionRegionSelect",
// 定义组件的 props
props: {
partitionId: {
type: Number,
default: 0,
required: true,
},
regionId: {
type: Number,
default: undefined,
},
regionInfos: {
type: Array,
default: () => [],
},
needAll: {
type: Boolean,
default: true,
},
placeholder: {
type: String,
default: "请选择地区",
},
handleChange: {
type: Function,
default: () => { },
},
afterInit: {
type: Function,
default: () => { },
},
},
// 明确声明触发的事件
emits: ["update:regionId", "update:regionInfos"],
setup(props, { emit }) {
// 定义响应式变量 internalValue 用于内部管理 partitionId 的值
const partitionIdValue = ref(props.partitionId);
// 定义响应式变量 internalValue 用于内部管理 partitionId 的值
const regionIdValue = ref(props.regionId);
// 定义响应式变量 partitionInfoList 用于存储分区信息列表
const regionInfoList = ref(props.regionInfos);
// 监听外部传入的 partitionId 变化,并同步到 internalValue
watch(
() => props.partitionId,
(newVal) => {
partitionIdValue.value = newVal;
if (newVal == undefined){
return
}
loadRegionInfos()
}
);
const loadRegionInfos = () => {
const partitionId = partitionIdValue.value;
const needAll = props.needAll;
const params = { partitionId, "containAll": needAll};
listByPartitionId(params).then((res) => {
setRegionInfos(res.data)
}).finally(() => {
props.afterInit()
});
};
const setRegionInfos = (data) => {
regionInfoList.value = data;
regionIdValue.value = data[0].id;
emit("update:regionId", regionIdValue.value);
emit("update:regionInfos", regionInfoList.value);
};
// 处理选择变化时触发的事件,并通过 emit 通知父组件
const handleChangeEvent = (value) => {
regionIdValue.value = value
emit("update:regionId", value);
props.handleChange(value);
};
// 返回需要暴露给模板使用的变量和方法
return {
partitionIdValue,
regionIdValue,
regionInfoList,
handleChangeEvent,
};
},
};
</script>

View File

@@ -0,0 +1,125 @@
<template>
<!-- 使用 el-select 组件并绑定 v-model partitionId -->
<el-select v-model="partitionIdValue" :placeholder="placeholder" @change="handleChangeEvent">
<!-- 遍历 partitionInfoList 数组为每个 item 生成一个 el-option 组件 -->
<el-option v-for="item in partitionInfoList" :key="item.id" :label="item.desc" :value="item.id">
</el-option>
</el-select>
</template>
<script>
import { ref, watch, onMounted } from "vue";
import { getPartitionInfoList, listAll } from "@/api/partition/partitionInfo";
export default {
name: "partitionSelect",
// 定义组件的 props
props: {
partitionId: {
type: Number,
default: undefined,
required: true,
},
needAllPartition: {
type: Boolean,
default: false,
},
partitionInfos: {
type: Array,
default: () => [],
},
needAll: {
type: Boolean,
default: false,
},
placeholder: {
type: String,
default: "请选择分区",
},
handleChange: {
type: Function,
default: () => { },
},
afterInit: {
type: Function,
default: () => { },
},
// 删除指定id
deleteId:{
type: Number,
default: undefined,
}
},
// 明确声明触发的事件
emits: ["update:partitionId", "update:partitionInfos"],
setup(props, { emit }) {
// 定义响应式变量 partitionInfoList 用于存储分区信息列表
const partitionInfoList = ref(props.partitionInfos);
// 定义响应式变量 internalValue 用于内部管理 partitionId 的值
const partitionIdValue = ref(props.partitionId);
// 监听外部传入的 partitionId 变化,并同步到 internalValue
watch(
() => props.partitionId,
(newVal) => {
partitionIdValue.value = newVal;
}
);
// 在组件挂载时加载分区信息
onMounted(() => {
const listDateFunc = !props.needAllPartition ? getPartitionInfoList : listAll;
listDateFunc().then((res) => {
setPartitionInfos(res.data)
}).finally(() => {
props.afterInit()
});
});
const setPartitionInfos = (data) => {
partitionInfoList.value = data;
if (props.needAll) {
partitionInfoList.value.unshift({
id: undefined,
desc: "全部"
})
}
// 删除指定id
if(props.deleteId){
partitionInfoList.value.forEach((item,index)=>{
if(item.id === props.deleteId){
partitionInfoList.value.splice(index,1)
}
})
}
// 优先使用父组件传入的 partitionId
if (props.partitionId !== undefined && props.partitionId !== null) {
partitionIdValue.value = props.partitionId;
} else {
// 如果父组件未传值,则使用列表第一个选项的 id
partitionIdValue.value = partitionInfoList.value?.[0]?.id || undefined;
}
emit("update:partitionId", partitionIdValue.value);
emit("update:partitionInfos", partitionInfoList.value);
};
// 处理选择变化时触发的事件,并通过 emit 通知父组件
const handleChangeEvent = (value) => {
partitionIdValue.value = value
emit("update:partitionId", value);
props.handleChange(value);
};
// 返回需要暴露给模板使用的变量和方法
return {
partitionIdValue,
partitionInfoList,
handleChangeEvent,
};
},
};
</script>

View File

@@ -0,0 +1,403 @@
<template>
<div class="outer">
<!-- 查询 -->
<div class="inquire">
<div class="block">
<span class="demonstration">开始时间</span>
<el-date-picker v-model="inquire.time[0]"
type="date"
placeholder="开始时间"
format="YYYY-MM-DD">
</el-date-picker>
</div>
</div>
<div class="inquire">
<div class="block">
<span class="demonstration">结束时间</span>
<el-date-picker v-model="inquire.time[1]"
type="date"
placeholder="结束时间"
format="YYYY-MM-DD">
</el-date-picker>
</div>
</div>
<!-- 查询按钮 -->
<el-button style=""
type="primary"
@click="getData()">查询</el-button>
<!-- <el-button style="" type="primary" @click="exportDate()">导出</el-button> -->
</div>
<!-- 表格 -->
<el-table v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="date"
align="center"
label="日期" />
<el-table-column align="center"
label="全平台真实消耗"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '全平台金币明细';
edi(scope.row, 0);
"
type="text"
size="small">
{{ formattedNumber(scope.row.totalDiamond) }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="阿拉伯区真实消耗"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '阿拉伯区金币明细';
edi(scope.row, 2);
"
type="text"
size="small">
{{ formattedNumber(scope.row.arDiamond) }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="英语区真实消耗"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '英语区金币明细';
edi(scope.row, 1);
"
type="text"
size="small">
{{ formattedNumber(scope.row.enDiamond) }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="华语区真实消耗"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '华语区金币明细';
edi(scope.row, 4);
"
type="text"
size="small">
{{ formattedNumber(scope.row.zhDiamond) }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="土耳其区真实消耗"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '土耳其区金币明细';
edi(scope.row, 8);
"
type="text"
size="small">
{{ formattedNumber(scope.row.trDiamond) }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="英语2区真实消耗"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '英语区2金币明细';
edi(scope.row, 16);
"
type="text"
size="small">
{{ formattedNumber(scope.row.en2Diamond) }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="totalRemainDiamond"
align="center"
label="全平台库存">
<template v-slot="scope">
{{ formattedNumber(scope.row.totalRemainDiamond) }}
</template>
</el-table-column>
<el-table-column prop="arRemainDiamond"
align="center"
label="阿拉伯区库存">
<template v-slot="scope">
{{ formattedNumber(scope.row.arRemainDiamond) }}
</template>
</el-table-column>
<el-table-column prop="enRemainDiamond"
align="center"
label="英语区库存">
<template v-slot="scope">
{{ formattedNumber(scope.row.enRemainDiamond) }}
</template>
</el-table-column>
<el-table-column prop="zhRemainDiamond"
align="center"
label="华语区库存">
<template v-slot="scope">
{{ formattedNumber(scope.row.zhRemainDiamond) }}
</template>
</el-table-column>
<el-table-column prop="trRemainDiamond"
align="center"
label="土耳其区库存">
<template v-slot="scope">
{{ formattedNumber(scope.row.trRemainDiamond) }}
</template>
</el-table-column>
<el-table-column prop="en2RemainDiamond"
align="center"
label="英语2区库存">
<template v-slot="scope">
{{ formattedNumber(scope.row.en2RemainDiamond) }}
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<!-- <el-pagination
style="margin-top: 10px"
class="paginationClass"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 30, 40, 50, 100, 200, 300, 400, 500, 999999999]"
layout="sizes, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/> -->
<!-- 详情 -->
<el-dialog v-model="detailsDialog"
:title="detailsTitle"
width="30%"
center>
<!-- 内表格 -->
<el-table v-loading="loading"
:data="tableDataIn"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="domainDesc"
align="center"
label="类型" />
<el-table-column prop="addDiamond"
align="center"
label="增加">
<template v-slot="scope">
{{ formattedNumber(scope.row.addDiamond) }}
</template>
</el-table-column>
<el-table-column prop="subDiamond"
align="center"
label="消耗">
<template v-slot="scope">
{{ formattedNumber(scope.row.subDiamond) }}
</template>
</el-table-column>
<el-table-column prop="subDiamond"
align="center"
label="留存">
<template #default="row">
{{ formattedNumber(totalDiamonds(row.row)) }}
<div v-if="row.row.domainDesc ==='小游戏' || row.row.domainDesc ==='幸运数字礼物' || row.row.domainDesc ==='Bravo礼物'">
{{ percentage(row.row) }}%
</div>
</template>
</el-table-column>
</el-table>
<!-- 操作 -->
<template #footer>
<span class="dialog-footer">
<el-button type="primary"
class="primary"
@click="detailsDialog = false">关闭</el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { diamondStatList } from "@/api/dailyCoinStatistics/dailyCoinStatistics";
import { dateFormat } from "@/utils/system-helper";
import { ElMessage } from "element-plus";
export default {
name: "dailyCoinStatistics",
data () {
return {
loading: false,
// 查询条件
inquire: {
time: this.calculateLastSevenDays(),
},
// 表格
tableData: [{ x: "x" }],
// 分页
total: 10, //总页数
currentPage: 1, //页码
pageSize: 10, //条数
// 内表格
detailsDialog: false,
detailsTitle: "金币明细",
tableDataIn: [],
};
},
created () {
this.getData();
},
computed: {
// 千分位
formattedNumber () {
return (num) => {
if (num === null || num === undefined) return '';
return Math.floor(num).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
};
},
},
methods: {
// 默认七天
calculateLastSevenDays () {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
return [start, end];
},
totalDiamonds (row) {
const subDiamond = Number(row.subDiamond || 0);
const addDiamond = Number(row.addDiamond || 0);
return subDiamond + addDiamond;
},
// 计算百分比,防止除零异常
percentage (row) {
const subDiamond = Number(row.subDiamond || 0);
const addDiamond = Number(row.addDiamond || 0);
if (subDiamond === 0) {
return '0.00'; // 防止除零错误
}
const result = (addDiamond / subDiamond) * 100;
return result.toFixed(2); // 格式化为两位小数
},
// 查询
getData () {
this.loading = true;
let time = this.inquire.time;
let startTime = null;
let endTime = null;
if (time.length > 0) {
startTime = this.inquire.time[0]
? dateFormat(this.inquire.time[0], "yyyy-MM-dd")
: null;
endTime = this.inquire.time[1]
? dateFormat(this.inquire.time[1], "yyyy-MM-dd")
: null;
}
diamondStatList({
startDate: startTime,
endDate: endTime,
// pageNo: this.currentPage,
// pageSize: this.pageSize,
}).then((res) => {
if (res.code == 200) {
// this.total = res.data.total;
this.tableData = res.data;
this.loading = false;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 详情
edi (res, type) {
var jsonArr =
type == 0
? res.totalDiamondDetail
: type == 1
? res.enDomainDetail
: type == 2
? res.arDomainDetail
: type == 4
? res.zhDomainDetail
: type == 8
? res.trDomainDetail
: type == 16
? res.en2DomainDetail
: `"[""]"`;
this.tableDataIn = JSON.parse(jsonArr);
this.detailsDialog = true;
},
// 分页导航
handleSizeChange () {
this.getData();
},
handleCurrentChange () {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.outer {
padding-top: 20px;
background: #ecf0f5;
border-top: 3px solid #d2d6de;
.demonstration {
margin-right: 20px;
}
.inquire {
display: flex;
justify-content: space-between;
white-space: nowrap;
float: left;
margin-right: 20px;
}
.search {
width: 100%;
height: 41px;
.searchLeft,
.searchRight {
width: 20%;
float: left;
span {
margin-right: 10px;
}
.input {
width: 75%;
}
}
}
.buttonBox {
margin-top: 10px;
}
.authorityBox {
.authoritySpan {
margin-right: 20px;
}
.authorityInpput {
width: 50%;
}
}
.dialogTableVisibleBut {
margin: -25px 0 20px 0px;
}
}
</style>

View File

@@ -0,0 +1,375 @@
<template>
<div class="box">
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="formData.partitionId" />
</div>
<div class="inquire">
<span>活动</span>
<el-select v-model="formData.actKey" placeholder="请选择">
<el-option
v-for="item in actKeysArr"
:key="item.actKey"
:label="item.actName || item.actKey"
:value="item.actKey"
>
</el-option>
</el-select>
</div>
<div class="inquire">
<span class="demonstration">日期</span>
<el-date-picker
v-model="dataTime"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD"
>
</el-date-picker>
</div>
<el-button style="" type="primary" @click="getData()">查询</el-button>
<el-button style="" type="primary" @click="confirmExport2Excel()"
>导出</el-button
>
<el-table
v-loading="tableData.loading"
:data="tableData.data"
ref="multipleTable"
@selection-change="handleSelectionChange"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="statDate" align="center" label="日期" />
<el-table-column prop="actName" align="center" label="活动" />
<el-table-column prop="totalUserNum" align="center" label="总参与人数" />
<el-table-column prop="actUserNum" align="center" label="独立参与人数" />
<el-table-column prop="actNum" align="center" label="参与总次数" />
<!-- <el-table-column prop="guildNum" align="center" label="旗下公会数量">
<template v-slot="scope">
<el-button type="text" size="small" @click="editFen(scope.row)">
{{ scope.row.guildNum }}
</el-button>
</template>
</el-table-column> -->
<el-table-column prop="perValue" align="center" label="人均参与次数" />
<el-table-column prop="actValue" align="center" label="榜单总值" />
<el-table-column prop="topTen" align="center" label="榜单前10用户">
<template v-slot="scope">
<el-button
type="text"
size="small"
@click="
editTopTen(scope.row);
detailsTypeDialog = 0;
"
>
{{ scope.row.topTen }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="newUserNum" align="center" label="新用户数">
<template v-slot="scope">
<el-button
type="text"
size="small"
@click="
editNewUserNum(scope.row);
detailsTypeDialog = 1;
"
>
{{ scope.row.newUserNum }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="chargeUserNum" align="center" label="充值人数" />
<el-table-column prop="chargeGoldNum" align="center" label="充值金额" />
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top: 10px"
class="paginationClass"
:current-page="formData.pageNo"
:page-size="formData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<!-- 详情表格 -->
<el-dialog
v-model="detailsDialog"
:title="detailsTypeDialog == 0 ? '榜单详情' : '新用户详情'"
width="70%"
center
>
<!-- 内表格 -->
<el-table
v-loading="tableDetailData.loading"
:data="tableDetailData.data"
border
style="width: 100%; margin-top: 25px"
>
<template v-if="detailsTypeDialog == 0">
<el-table-column prop="erbanNo" align="center" label="用户ID" />
<el-table-column prop="nick" align="center" label="用户昵称" />
<el-table-column
prop="partitionDesc"
align="center"
label="用户分区"
/>
<el-table-column prop="regionName" align="center" label="国家" />
<el-table-column prop="rank" align="center" label="榜单排行" />
<el-table-column prop="actValue" align="center" label="榜单数值" />
</template>
<template v-if="detailsTypeDialog == 1">
<el-table-column prop="erbanNo" align="center" label="用户ID" />
<el-table-column prop="nick" align="center" label="用户昵称" />
<el-table-column
prop="partitionDesc"
align="center"
label="用户分区"
/>
<el-table-column prop="signTime" align="center" label="注册时间" />
<el-table-column
prop="chargeGoleNum"
align="center"
label="充值金额"
/>
</template>
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top: 10px"
class="paginationClass"
:current-page="formDetailData.pageNo"
:page-size="formDetailData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableDetailData.total"
@size-change="handleSizeChangeDetail"
@current-change="handleCurrentChangeDetail"
/>
</el-dialog>
</div>
</template>
<script>
import { ref, onMounted, reactive, computed } from "vue";
import PartitionSelect from "@/views/common/partitionSelect.vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { formatDate } from "@/utils/relDate";
import {
getActKeysList,
getDataList,
getNewUsersList,
getRankList,
exportActivityDayTotal,
} from "@/api/basicActivityData/basicActivityData";
export default {
name: "basicActivityData",
components: {
PartitionSelect,
},
setup() {
const formData = reactive({
partitionId: undefined,
pageNo: 1,
pageSize: 10,
startDate: "",
endDate: "",
actKey: "",
});
const tableData = reactive({
data: [],
total: 0,
loading: false,
});
const formDetailData = reactive({
pageNo: 1,
pageSize: 10,
partitionId: "",
actKey: "",
statDate: "",
});
const tableDetailData = reactive({
data: [],
total: 0,
loading: false,
});
const detailsDialog = ref(false);
const detailsTypeDialog = ref(0); //0榜单详情 1新用户详情
const dataTime = ref("");
const actKeysArr = ref([]);
const getData = () => {
tableData.loading = true;
if (dataTime.value && dataTime.value.length > 0) {
formData.startDate = dataTime.value[0];
formData.endDate = dataTime.value[1];
console.log(dataTime.value);
} else {
formData.startDate = dataTime.value;
formData.endDate = dataTime.value;
}
getDataList(formData).then((res) => {
if (res.code == 200) {
tableData.data = res.data.rows;
tableData.total = res.data.total;
tableData.loading = false;
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
});
};
// 导出
const confirmExport2Excel = async () => {
// Object.assign(formData, { pageSize: 10000, pageNo: 1 });
try {
const res = await exportActivityDayTotal(formData);
if (res) {
ElMessage({
message: "导出成功",
type: "success",
});
let time = formatDate(new Date());
let alink = document.createElement("a");
alink.download = `活动基本数据统计${time}.xls`;
alink.style.display = "none";
const blob = new Blob([res]);
alink.href = URL.createObjectURL(blob);
document.body.appendChild(alink);
alink.click();
URL.revokeObjectURL(alink.href);
}
} catch (error) {
ElMessage({
message: error.message,
type: "error",
});
}
};
// 榜单详情
const editTopTen = (row) => {
if (row) {
formDetailData.actKey = row.actKey;
formDetailData.partitionId = formData.partitionId;
formDetailData.statDate = row.statDate;
}
tableDetailData.loading = true;
getRankList(formDetailData).then((res) => {
if (res.code == 200) {
tableDetailData.data = res.data.rows;
tableDetailData.total = res.data.total;
tableDetailData.loading = false;
detailsDialog.value = true;
} else {
tableDetailData.loading = false;
ElMessage.error(res.message);
}
});
};
// 新用户详情
const editNewUserNum = (row) => {
if (row) {
formDetailData.actKey = row.actKey;
formDetailData.partitionId = formData.partitionId;
formDetailData.statDate = row.statDate;
}
tableDetailData.loading = true;
getNewUsersList(formDetailData).then((res) => {
if (res.code == 200) {
tableDetailData.data = res.data.rows;
tableDetailData.total = res.data.total;
tableDetailData.loading = false;
detailsDialog.value = true;
} else {
tableDetailData.loading = false;
ElMessage.error(res.message);
}
});
};
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
const handleSizeChangeDetail = (val) => {
formDetailData.pageSize = val;
if (detailsTypeDialog.value == 0) {
editTopTen();
} else {
editNewUserNum();
}
};
const handleCurrentChangeDetail = (val) => {
formDetailData.pageNo = val;
if (detailsTypeDialog.value == 0) {
editTopTen();
} else {
editNewUserNum();
}
};
onMounted(() => {
getActKeysList().then((res) => {
actKeysArr.value = res.data;
});
});
return {
formData,
tableData,
dataTime,
getData,
handleSizeChange,
handleCurrentChange,
confirmExport2Excel,
actKeysArr,
detailsDialog,
tableDetailData,
formDetailData,
editTopTen,
handleSizeChangeDetail,
handleCurrentChangeDetail,
editNewUserNum,
detailsTypeDialog,
};
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
</style>

View File

@@ -0,0 +1,398 @@
<template>
<!-- 表格 -->
<el-table
v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column align="center" label="日期" width="220px">
<template v-slot="scope">
{{ scope.row.date }} ~ {{ scope.row.endDate }}
</template>
</el-table-column>
<el-table-column
prop="totalNewCount"
align="center"
label="全服公会总新增"
/>
<el-table-column align="center" label="阿拉伯公会总新增" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '阿拉伯公会总新增' + scope.row.date;
edi(scope.row.arNewCountDetail, false);
"
type="text"
size="small"
>
{{ scope.row.arNewCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="英语区总新增" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '英语区总新增' + scope.row.date;
edi(scope.row.enNewCountDetail, false);
"
type="text"
size="small"
>
{{ scope.row.enNewCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="华语区总新增" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '华语区总新增' + scope.row.date;
edi(scope.row.zhNewCountDetail, false);
"
type="text"
size="small"
>
{{ scope.row.zhNewCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="土耳其区总新增" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '土耳其区总新增' + scope.row.date;
edi(scope.row.trNewCountDetail, false);
"
type="text"
size="small"
>
{{ scope.row.trNewCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="英语2区总新增" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '英语2区总新增' + scope.row.date;
edi(scope.row.en2NewCountDetail, false);
"
type="text"
size="small"
>
{{ scope.row.en2NewCount }}
</el-button>
</template>
</el-table-column>
<el-table-column
prop="totalActiveCount"
align="center"
label="全服公会活跃度"
/>
<el-table-column align="center" label="阿拉伯公会活跃度" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '阿拉伯公会活跃度' + scope.row.date;
edi(scope.row.arActiveCountDetail, true);
"
type="text"
size="small"
>
{{ scope.row.arActiveCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="英语区活跃度" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '英语区活跃度' + scope.row.date;
edi(scope.row.enActiveCountDetail, true);
"
type="text"
size="small"
>
{{ scope.row.enActiveCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="华语区活跃度" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '华语区活跃度' + scope.row.date;
edi(scope.row.zhActiveCountDetail, true);
"
type="text"
size="small"
>
{{ scope.row.zhActiveCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="土耳其区活跃度" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '土耳其区活跃度' + scope.row.date;
edi(scope.row.trActiveCountDetail, true);
"
type="text"
size="small"
>
{{ scope.row.trActiveCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="英语2区活跃度" width="">
<template v-slot="scope">
<el-button
@click="
detailsTitle = '英语2区活跃度' + scope.row.date;
edi(scope.row.en2ActiveCountDetail, true);
"
type="text"
size="small"
>
{{ scope.row.en2ActiveCount }}
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<!-- <el-pagination
style="margin-top: 10px"
class="paginationClass"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 30, 40, 50, 100, 200, 300, 400, 500, 999999999]"
layout="sizes, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/> -->
<!-- 详情 -->
<el-dialog v-model="detailsDialog" :title="detailsTitle" width="50%" center>
<!-- 内表格 -->
<el-table
v-loading="loading"
:data="tableDataIn"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="date" align="center" label="日期" />
<el-table-column prop="endDate" align="center" label="结束时间" />
<el-table-column prop="guildId" align="center" label="公会ID" />
<el-table-column prop="ownerErbanNo" align="center" label="公会长ID" />
<el-table-column
prop="ownerRegionName"
align="center"
label="公会长所属国家"
/>
<el-table-column prop="operatorName" align="center" label="公会负责人" />
<el-table-column
prop="activeMemberCount"
align="center"
label="本周收礼主播数"
/>
<el-table-column
prop="guildGoldFlow"
align="center"
label="本周公会钻石流水"
>
<template v-slot="scope">
{{
formattedNumber(scope.row.guildGoldFlow)
}}
</template>
</el-table-column>
<el-table-column
prop="guildDiamondFlow"
align="center"
label="本周公会金币流水"
>
<template v-slot="scope">
{{
formattedNumber(scope.row.guildDiamondFlow)
}}
</template>
</el-table-column>
<el-table-column
prop="lastGuildGoldFlow"
align="center"
label="上周公会钻石流水"
v-if="detailsIsShow"
/>
<el-table-column
prop="guildGoldFlowWow"
align="center"
label="周环比"
v-if="detailsIsShow"
>
<template v-slot="scope">
{{
scope.row.lastGuildGoldFlow === 0
? "--"
: formatPercentage(
scope.row.guildGoldFlow / scope.row.lastGuildGoldFlow
) + "%"
}}
</template>
</el-table-column>
</el-table>
<!-- 操作 -->
<template #footer>
<span class="dialog-footer">
<el-button type="primary" class="primary" @click="detailsDialog = false"
>关闭</el-button
>
</span>
</template>
</el-dialog>
</template>
<script>
import { guiildPage } from "@/api/statistics/statistics";
import { dateFormat } from "@/utils/system-helper";
import { ElMessage } from "element-plus";
export default {
name: "guildStatisticsData",
data() {
return {
loading: false,
// 查询条件
inquire: {
time: [],
},
// 表格
tableData: [],
// 分页
total: 10, //总页数
currentPage: 1, //页码
pageSize: 10, //条数
// 内表格
detailsDialog: false,
detailsTitle: "金币明细",
tableDataIn: [],
detailsIsShow: false,
};
},
created() {
this.getData();
},
computed: {
// 千分位
formattedNumber() {
return (num) => {
if (num === null || num === undefined) return "";
return Math.floor(num)
.toString()
.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};
},
},
methods: {
// 查询
getData() {
this.loading = true;
let time = this.inquire.time;
let startTime = null;
let endTime = null;
if (time.length > 0) {
startTime = this.inquire.time[0]
? dateFormat(this.inquire.time[0], "yyyy-MM-dd hh:mm:ss")
: null;
endTime = this.inquire.time[1]
? dateFormat(this.inquire.time[1], "yyyy-MM-dd hh:mm:ss")
: null;
}
guiildPage({
page: this.currentPage,
pageSize: this.pageSize,
}).then((res) => {
if (res.code == 200) {
this.total = res.data.total;
this.tableData = res.data.rows;
this.loading = false;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 详情
edi(res, type) {
this.detailsIsShow = type;
this.tableDataIn = JSON.parse(res);
this.detailsDialog = true;
},
formatPercentage(value) {
return parseFloat((value * 100).toFixed(2));
},
// 分页导航
handleSizeChange() {
this.getData();
},
handleCurrentChange() {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.outer {
padding-top: 20px;
background: #ecf0f5;
border-top: 3px solid #d2d6de;
.demonstration {
margin-right: 20px;
}
.inquire {
display: flex;
justify-content: space-between;
white-space: nowrap;
float: left;
margin-right: 20px;
}
.search {
width: 100%;
height: 41px;
.searchLeft,
.searchRight {
width: 20%;
float: left;
span {
margin-right: 10px;
}
.input {
width: 75%;
}
}
}
.buttonBox {
margin-top: 10px;
}
.authorityBox {
.authoritySpan {
margin-right: 20px;
}
.authorityInpput {
width: 50%;
}
}
.dialogTableVisibleBut {
margin: -25px 0 20px 0px;
}
}
</style>

View File

@@ -0,0 +1,260 @@
<template>
<!-- 表格 -->
<el-table v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="date"
align="center"
label="日期" />
<el-table-column prop="accountCount"
align="center"
label="新总注册" />
<el-table-column prop="userCount"
align="center"
label="新完善资料" />
<el-table-column prop="userRatio"
align="center"
label="完善率" />
<el-table-column align="center"
label="阿拉伯区新注册(完善资料)"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '阿拉伯区注册明细' + scope.row.date;
edi(scope.row.arCountDetail, 2);
"
type="text"
size="small">
{{ scope.row.arCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="英语区新注册(完善资料)"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '英语区注册明细' + scope.row.date;
edi(scope.row.enCountDetail, 1);
"
type="text"
size="small">
{{ scope.row.enCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="华语区新注册(完善资料)"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '华语区注册明细' + scope.row.date;
edi(scope.row.zhCountDetail, 4);
"
type="text"
size="small">
{{ scope.row.zhCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="土耳其区新注册(完善资料)"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '土耳其区注册明细' + scope.row.date;
edi(scope.row.trCountDetailt, 8);
"
type="text"
size="small">
{{ scope.row.trCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="英语2区新注册完善资料"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '英语2区注册明细' + scope.row.date;
edi(scope.row.en2CountDetail, 1);
"
type="text"
size="small">
{{ scope.row.en2Count }}
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[20, 50, 100, 200, 500]"
layout="sizes, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
<!-- 详情 -->
<el-dialog v-model="detailsDialog"
:title="detailsTitle"
width="30%"
center>
<!-- 内表格 -->
<el-table v-loading="loading"
:data="tableDataIn"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="regionDesc"
align="center"
label="国家" />
<el-table-column prop="count"
align="center"
label="新注册(完善资料)" />
<el-table-column prop="ratio"
align="center"
label="占比">
<template v-slot="scope">
{{ formatPercentage(scope.row.ratio) }}%
</template>
</el-table-column>
</el-table>
<!-- 操作 -->
<template #footer>
<span class="dialog-footer">
<el-button type="primary"
class="primary"
@click="detailsDialog = false">关闭</el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { dnuPage } from "@/api/statistics/statistics";
import { ElMessage } from "element-plus";
export default {
name: "newOverview",
data () {
return {
loading: false,
// 查询条件
inquire: {
time: [],
},
// 表格
tableData: [],
// 分页
total: 0, //总页数
currentPage: 1, //页码
pageSize: 20, //条数
// 内表格
detailsDialog: false,
detailsTitle: "金币明细",
tableDataIn: [],
};
},
created () {
this.getData();
},
methods: {
// 查询
getData () {
this.loading = true;
dnuPage({
page: this.currentPage,
pageSize: this.pageSize,
}).then((res) => {
if (res.code == 200) {
this.total = res.data.total;
this.tableData = res.data.rows;
this.loading = false;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 详情
edi (res, type) {
var jsonArr =
// type == 0
// ? res.totalDiamondDetail
// : type == 1
// ? res.enDomainDetail
// : type == 2
// ? res.arDomainDetail
// : type == 4
// ? res.zhDomainDetail
// : type == 8
// ? res.trDomainDetail
// : `"[""]"`;
(this.tableDataIn = JSON.parse(res));
this.detailsDialog = true;
},
formatPercentage (value) {
return parseFloat((value * 100).toFixed(2));
},
// 分页导航
handleSizeChange () {
this.getData();
},
handleCurrentChange () {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.outer {
padding-top: 20px;
background: #ecf0f5;
border-top: 3px solid #d2d6de;
.demonstration {
margin-right: 20px;
}
.inquire {
display: flex;
justify-content: space-between;
white-space: nowrap;
float: left;
margin-right: 20px;
}
.search {
width: 100%;
height: 41px;
.searchLeft,
.searchRight {
width: 20%;
float: left;
span {
margin-right: 10px;
}
.input {
width: 75%;
}
}
}
.buttonBox {
margin-top: 10px;
}
.authorityBox {
.authoritySpan {
margin-right: 20px;
}
.authorityInpput {
width: 50%;
}
}
.dialogTableVisibleBut {
margin: -25px 0 20px 0px;
}
}
</style>

View File

@@ -0,0 +1,266 @@
<template>
<!-- 表格 -->
<el-table v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="date"
align="center"
label="日期" />
<el-table-column prop="totalCount"
align="center"
label="当天总活跃度">
<template v-slot="scope">
<el-button @click="
detailsTitle = '当天总活跃度' + scope.row.date;
edi(scope.row.totalCountDetail, 2);
"
type="text"
size="small">
{{ scope.row.totalCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="阿拉伯区总活跃度"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '阿拉伯区总活跃度' + scope.row.date;
edi(scope.row.arCountDetail, 2);
"
type="text"
size="small">
{{ scope.row.arCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="英语区总活跃度"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '英语区总活跃度' + scope.row.date;
edi(scope.row.enCountDetail, 1);
"
type="text"
size="small">
{{ scope.row.enCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="华语区总活跃度"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '华语区总活跃度' + scope.row.date;
edi(scope.row.zhCountDetail, 4);
"
type="text"
size="small">
{{ scope.row.zhCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="土耳其区总活跃度"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '土耳其区总活跃度' + scope.row.date;
edi(scope.row.trCountDetail, 8);
"
type="text"
size="small">
{{ scope.row.trCount }}
</el-button>
</template>
</el-table-column>
<el-table-column align="center"
label="英语2区总活跃度"
width="">
<template v-slot="scope">
<el-button @click="
detailsTitle = '英语2区总活跃度' + scope.row.date;
edi(scope.row.en2CountDetail, 16);
"
type="text"
size="small">
{{ scope.row.en2Count }}
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[20, 50, 100, 200, 500]"
layout="sizes, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
<!-- 详情 -->
<el-dialog v-model="detailsDialog"
:title="detailsTitle"
width="30%"
center>
<!-- 内表格 -->
<el-table v-loading="loading"
:data="tableDataIn"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="regionDesc"
align="center"
label="国家" />
<el-table-column prop="count"
align="center"
label="活跃度" />
<el-table-column prop="ratio"
align="center"
label="占比">
<template v-slot="scope">
{{ formatPercentage(scope.row.ratio) }}%
</template>
</el-table-column>
</el-table>
<!-- 操作 -->
<template #footer>
<span class="dialog-footer">
<el-button type="primary"
class="primary"
@click="detailsDialog = false">关闭</el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { dauPage } from "@/api/statistics/statistics";
import { dateFormat } from "@/utils/system-helper";
import { ElMessage } from "element-plus";
export default {
name: "overviewActiveStatistics",
data () {
return {
loading: false,
// 查询条件
inquire: {
time: [],
},
// 表格
tableData: [],
// 分页
total: 0, //总页数
currentPage: 1, //页码
pageSize: 20, //条数
// 内表格
detailsDialog: false,
detailsTitle: "金币明细",
tableDataIn: [],
};
},
created () {
this.getData();
},
methods: {
// 查询
getData () {
this.loading = true;
dauPage({
page: this.currentPage,
pageSize: this.pageSize,
}).then((res) => {
if (res.code == 200) {
this.total = res.data.total;
this.tableData = res.data.rows;
this.loading = false;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 详情
edi (res, type) {
var jsonArr =
// type == 0
// ? res.totalDiamondDetail
// : type == 1
// ? res.enDomainDetail
// : type == 2
// ? res.arDomainDetail
// : type == 4
// ? res.zhDomainDetail
// : type == 8
// ? res.trDomainDetail
// : `"[""]"`;
(this.tableDataIn = JSON.parse(res));
this.detailsDialog = true;
},
formatPercentage (value) {
return parseFloat((value * 100).toFixed(2));
},
// 分页导航
handleSizeChange () {
this.getData();
},
handleCurrentChange () {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.outer {
padding-top: 20px;
background: #ecf0f5;
border-top: 3px solid #d2d6de;
.demonstration {
margin-right: 20px;
}
.inquire {
display: flex;
justify-content: space-between;
white-space: nowrap;
float: left;
margin-right: 20px;
}
.search {
width: 100%;
height: 41px;
.searchLeft,
.searchRight {
width: 20%;
float: left;
span {
margin-right: 10px;
}
.input {
width: 75%;
}
}
}
.buttonBox {
margin-top: 10px;
}
.authorityBox {
.authoritySpan {
margin-right: 20px;
}
.authorityInpput {
width: 50%;
}
}
.dialogTableVisibleBut {
margin: -25px 0 20px 0px;
}
}
</style>

View File

@@ -270,6 +270,41 @@ export default {
valign: "middle", valign: "middle",
width: "10%", width: "10%",
}, },
{
field: "name.tr",
title: "土耳其装扮名称",
align: "left",
valign: "middle",
width: "10%",
},
{
field: "name.pt",
title: "葡萄牙语装扮名称",
align: "left",
valign: "middle",
width: "10%",
},
{
field: "name.ru",
title: "俄语装扮名称",
align: "left",
valign: "middle",
width: "10%",
},
{
field: "name.es",
title: "西班牙语装扮名称",
align: "left",
valign: "middle",
width: "10%",
},
{
field: "name.uz",
title: "乌兹别克语装扮名称",
align: "left",
valign: "middle",
width: "10%",
},
{ {
field: "pic", field: "pic",
title: "装扮图片", title: "装扮图片",

View File

@@ -0,0 +1,146 @@
<template>
<div class="box">
<!-- ID -->
<div class="condition">
<div class="inquire">
<span>邮箱</span>
<el-input v-model="inquire.email" placeholder="邮箱" class="input" />
</div>
</div>
<!-- 按钮 -->
<div class="but">
<el-button class="primary" type="primary" @click="getData()">查询</el-button>
</div>
<!-- 表格 -->
<el-table
v-loading="loading"
:data="table.tableData"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="email" align="center" label="邮箱" />
<el-table-column prop="deviceId" align="center" label="设备号" />
<el-table-column prop="appVersion" align="center" label="app版本" />
<el-table-column prop="model" align="center" label="手机型号" />
<el-table-column prop="os" align="center" label="操作系统" />
<el-table-column prop="type" align="center" label="业务类型">
<template v-slot="scope">
{{ getTypeDesc(scope.row.type) }}
</template>
</el-table-column>
<el-table-column prop="code" align="center" label="验证码" />
<el-table-column prop="ip" align="center" label="ip" />
<el-table-column prop="resCode" align="center" label="服务商状态码" />
<el-table-column prop="resMsg" align="center" label="服务商提示" />
<el-table-column prop="createTime" align="center" label="发送时间" />
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top: 10px"
class="paginationClass"
v-model:current-page="table.currentPage"
v-model:page-size="table.pageSize"
:page-sizes="[20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="table.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
<script>
import { pageRecord } from "@/api/email/emailRecord";
export default {
name: "EmailRecordView",
data() {
return {
typeMap :{
1: "注册验证码",
2: "登录",
3: "忘记密码(客户端重置支付密码有用到)",
4: "绑定手机",
5: "绑定支付宝",
6: "重置支付密码",
7: "更换绑定手机号码",
8: "实名认证",
9: "h5绑定支付宝",
10: "后台登录",
11: "绑定提现银行卡",
12: "h5 绑定提现银行卡",
13: "非登录态重置密码",
14: "登录态重置密码",
15: "手机授权码"
},
loading: false,
//查询所需条件对象
inquire: {
email: undefined,
},
table: {
tableData: [],
total: undefined, //总页数
currentPage: 1, //页码
pageSize: 20, //条数
},
};
},
created() {
this.getData();
},
methods: {
getTypeDesc(type){
return this.typeMap[type] || "未知";
},
// 查询接口
getData() {
this.loading = true;
pageRecord({
email: this.inquire.email,
page: this.table.currentPage,
pageSize: this.table.pageSize,
}).then((res) => {
this.loading = false;
if (res.code !== 200){
throw new Error(res.msg);
}
this.table.total = res.data.total;
this.table.tableData = res.data.rows;
});
},
// 分页导航
handleSizeChange() {
this.getData();
},
handleCurrentChange() {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.condition {
margin-bottom: 20px;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
}
.but {
margin-bottom: 20px;
}
}
</style>

View File

@@ -0,0 +1,384 @@
<template>
<div class="box">
<div class="inquire">
<span>表情ID:</span>
<el-input v-model="formData.id" placeholder="" class="input" />
</div>
<div class="inquire">
<span>Tab名字:</span>
<el-select v-model="formData.tabId" placeholder="请选择">
<el-option v-for="item in TabData" :key="item.id" :label="item.tabName" :value="item.id">
</el-option>
</el-select>
</div>
<div class="inquire">
<span>状态</span>
<el-select v-model="formData.status" placeholder="请选择">
<el-option label="全部" :value="-1"></el-option>
<el-option label="不展示" :value="0"></el-option>
<el-option label="展示" :value="1"></el-option>
</el-select>
</div>
<el-button style="" type="primary" @click="getData()">查询</el-button>
<el-button style="" type="primary" @click="resetFormData()">重置</el-button>
<el-button style="" type="primary" @click="addDialog = true;resetaddFormData()">新增</el-button>
<!-- 表格数据 -->
<el-table v-loading="tableData.loading" :data="tableData.data" ref="multipleTable"
@selection-change="handleSelectionChange" border style="width: 100%; margin-top: 25px">
<el-table-column prop="tabId" align="center" label="TabID" />
<el-table-column prop="tabName" align="center" label="Tab名字" />
<el-table-column prop="id" align="center" label="表情ID" />
<el-table-column prop="faceName" align="center" label="表情名字" />
<el-table-column prop="faceIndex" align="center" label="表情包封面">
<template v-slot="scope">
<el-image style="width: 100px; height: 100px" :src="scope.row.faceIndex" :zoom-rate="1.1"
:preview-src-list="[scope.row.faceIndex]" fit="scale-down" preview-teleported="true"
hide-on-click-modal="true" />
</template>
</el-table-column>
<el-table-column prop="seqNo" align="center" label="排序" />
<el-table-column prop="showTimes" align="center" label="展示次数" />
<el-table-column prop="status" align="center" label="状态">
<template v-slot="scope">
{{ scope.row.status == 1 ? '展示' : '不展示' }}
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="300">
<template v-slot="scope">
<el-button class="primary" type="primary" @click="
detailPageFun(scope.row);
" size="default">编辑</el-button>
<el-button class="primary" type="danger" @click="
deletePageFun(scope.row);
" size="default">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px" class="paginationClass" :current-page="formData.pageNo"
:page-size="formData.pageSize" :page-sizes="[10, 20, 50, 100, 200]" layout="sizes, prev, pager, next"
:total="tableData.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
<el-dialog v-model="addDialog" :title="addFormData.id == '' ? '新增' : '编辑'" width="28%" center>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">Tab名字:</span>
<el-select v-model="addFormData.tabId" placeholder="请选择">
<el-option v-for="item in TabData" :key="item.id" :label="item.tabName" :value="item.id">
</el-option>
</el-select>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">表情名字</span>
<el-input v-model="addFormData.faceName" style="width: 50%" class="input"></el-input>
</div>
<div class="selectBox selectBoxImg">
<span class="left" style="margin-right: 35px;padding-left: 15px;">表情包封面</span>
<!-- action="/admin/tencent/cos/upload/file" -->
<el-upload class="avatar-uploader" action="/admin/tencent/cos/upload/file" :show-file-list="false"
:on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" :on-error="handleAvatarError">
<img v-if="addFormData.faceIndex" :src="addFormData.faceIndex" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
</div>
<div class="selectBox selectBoxImg">
<span class="left" style="margin-right: 65px;padding-left: 15px;">表情包</span>
<!-- action="/admin/tencent/cos/upload/file" -->
<el-upload class="avatar-uploader" action="/admin/tencent/cos/upload/file" :show-file-list="false"
:on-success="handleAvatarSuccess2" :before-upload="beforeAvatarUploadSvga"
:on-error="handleAvatarError">
<img v-if="addFormData.faceUrl" :src="addFormData.faceUrl" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">排序</span>
<el-input v-model="addFormData.seqNo" style="width: 50%" class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">展示次数</span>
<el-input v-model="addFormData.showTimes" style="width: 50%" class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">状态</span>
<el-select v-model="addFormData.status" placeholder="请选择">
<el-option label="不展示" :value="0"></el-option>
<el-option label="展示" :value="1"></el-option>
</el-select>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="addDialog = false">取消</el-button>
<el-button type="primary" @click="addFun()"> 确认 </el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { ref, onMounted, reactive, computed } from 'vue'
import { getFaceNewList, saveOrUpdateFaceNew, getFaceNewTabList, deleteFaceNew } from '@/api/EmojiManagement/EmojiManagement'
import { ElMessage, ElMessageBox } from "element-plus";
export default {
name: 'EmojiManagement',
setup() {
const formData = reactive({
id: '',
pageNo: 1,
pageSize: 10,
tabId: '',
status: -1
})
const addFormData = reactive({
seqNo: '',
id: '',
status: 1,
showTimes: '',
tabId: '',
faceName: '',
faceIndex: '',
faceUrl: ''
})
const tableData = reactive({
data: [],
total: 0,
loading: false,
})
const ediObj = reactive({
imageUrl2: ''
})
const TabData = ref([])
const addDialog = ref(false)
const getData = () => {
tableData.loading = true;
getFaceNewList(formData).then(res => {
if (res.code == 200) {
tableData.data = res.data.rows
tableData.loading = false;
tableData.total = res.data.total
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
})
};
// 增加
const addFun = () => {
saveOrUpdateFaceNew(addFormData).then(res => {
if (res.code == 200) {
ElMessage.success('添加成功');
Object.assign(addFormData, {
seqNo: '',
id: '',
status: 1,
showTimes: '',
tabId: '',
faceName: '',
faceIndex: '',
faceUrl: ''
});
addDialog.value = false
getData()
} else {
ElMessage.error(res.message);
addDialog.value = false
}
})
}
//重置
const resetFormData = () => {
Object.assign(formData, {
partitionId: 1,
pageNo: 1,
pageSize: 10,
erbanNo: '',
});
};
const resetaddFormData = () => {
Object.assign(addFormData, {
seqNo: '',
id: '',
status: 1,
showTimes: '',
tabId: '',
faceName: '',
faceIndex: '',
faceUrl: ''
});
};
// 编辑
const detailPageFun = (row) => {
addFormData.id = row.id;
addFormData.faceIndex = row.faceIndex;
addFormData.faceName = row.faceName;
addFormData.faceUrl = row.faceUrl;
addFormData.seqNo = row.seqNo;
addFormData.showTimes = row.showTimes;
addFormData.status = row.status;
addFormData.tabId = row.tabId;
addDialog.value = true
}
// 删除
const deletePageFun = (row) => {
ElMessageBox.confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteFaceNew({ id: row.id }).then(res => {
if (res.code == 200) {
ElMessage.success('删除成功')
getData()
} else {
ElMessage.error(res.message)
}
})
})
}
const beforeAvatarUpload = () => {
ElMessage({
showClose: true,
message: "上传中~",
type: "warning",
});
};
const handleAvatarError = () => {
ElMessage({
showClose: true,
message: "上传失败!",
type: "error",
});
};
const handleAvatarSuccess = (res, file) => {
addFormData.faceIndex = file.response.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
};
const beforeAvatarUploadSvga = (file) => {
const dotIndex = (file.name).indexOf('.'); // 找到 '.' 的位置
if (dotIndex !== -1) {
const result = (file.name).substring(dotIndex + 1); // 从 '.' 之后开始截取
if (result == 'svga') {
ElMessage({
showClose: true,
message: "上传中~",
type: "warning",
});
return true;
} else {
ElMessage.error('请上传svga格式文件');
return false;
}
} else {
ElMessage.error('请上传svga格式文件');
return false;
}
};
const handleAvatarSuccess2 = (res, file) => {
addFormData.faceUrl = file.response.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
};
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
onMounted(() => {
getFaceNewTabList().then(res => {
TabData.value = res.data
})
})
return {
formData,
addFormData,
tableData,
addDialog,
getData,
addFun,
resetFormData,
handleSizeChange,
handleCurrentChange,
beforeAvatarUpload,
handleAvatarError,
handleAvatarSuccess,
ediObj,
TabData,
handleAvatarSuccess2,
beforeAvatarUploadSvga,
detailPageFun,
deletePageFun,
resetaddFormData
}
},
}
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>

View File

@@ -0,0 +1,329 @@
<template>
<div class="box">
<div class="inquire">
<span>TabID:</span>
<el-input v-model="formData.id" placeholder="" class="input" />
</div>
<div class="inquire">
<span>类型</span>
<el-select v-model="formData.useVip" placeholder="请选择">
<el-option label="全部" :value="-1"></el-option>
<el-option label="普通" :value="0"></el-option>
<el-option label="贵族" :value="1"></el-option>
</el-select>
</div>
<div class="inquire">
<span>状态</span>
<el-select v-model="formData.status" placeholder="请选择">
<el-option label="全部" :value="-1"></el-option>
<el-option label="不展示" :value="0"></el-option>
<el-option label="展示" :value="1"></el-option>
</el-select>
</div>
<el-button style="" type="primary" @click="getData()">查询</el-button>
<el-button style="" type="primary" @click="resetFormData()">重置</el-button>
<el-button style="" type="primary" @click="addDialog = true; resetaddFormData()">新增</el-button>
<!-- 表格数据 -->
<el-table v-loading="tableData.loading" :data="tableData.data" ref="multipleTable"
@selection-change="handleSelectionChange" border style="width: 100%; margin-top: 25px">
<el-table-column prop="id" align="center" label="ID" />
<el-table-column prop="tabName" align="center" label="Tab名字" />
<el-table-column prop="tabUrl" align="center" label="Tab封面">
<template v-slot="scope">
<el-image style="width: 100px; height: 100px" :src="scope.row.tabUrl" :zoom-rate="1.1"
:preview-src-list="[scope.row.tabUrl]" fit="scale-down" preview-teleported="true"
hide-on-click-modal="true" />
</template>
</el-table-column>
<el-table-column prop="useVip" align="center" label="表情类型">
<template v-slot="scope">
{{ scope.row.useVip == 1 ? '贵族' : '普通' }}
</template>
</el-table-column>
<el-table-column prop="status" align="center" label="状态">
<template v-slot="scope">
{{ scope.row.status == 1 ? '展示' : '不展示' }}
</template>
</el-table-column>
<el-table-column prop="tabSeq" align="center" label="排序" />
<el-table-column align="center" label="操作" width="300">
<template v-slot="scope">
<el-button class="primary" type="primary" @click="
detailPageFun(scope.row);
" size="default">编辑</el-button>
<!-- <el-button class="primary" type="danger" @click="
deletePageFun(scope.row);
" size="default">删除</el-button> -->
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px" class="paginationClass" :current-page="formData.pageNo"
:page-size="formData.pageSize" :page-sizes="[10, 20, 50, 100, 200]" layout="sizes, prev, pager, next"
:total="tableData.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
<el-dialog v-model="addDialog" :title="addFormData.id == '' ? '新增' : '编辑'" width="28%" center>
<!-- <div style="margin-bottom: 25px" v-if="addFormData.id != ''">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">表情TabID</span>
<el-input v-model="addFormData.id" style="width: 50%" class="input" disabled></el-input>
</div> -->
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">表情Tab名字</span>
<el-input v-model="addFormData.tabName" style="width: 50%" class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">表情类型</span>
<el-select v-model="addFormData.useVip" placeholder="请选择">
<el-option label="普通" :value="0"></el-option>
<el-option label="贵族" :value="1"></el-option>
</el-select>
</div>
<div class="selectBox selectBoxImg">
<span class="left" style="margin-right: 75px;padding-left: 15px;">Tab图</span>
<!-- action="/admin/tencent/cos/upload/file" -->
<el-upload class="avatar-uploader" action="/admin/tencent/cos/upload/file" :show-file-list="false"
:on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" :on-error="handleAvatarError">
<img v-if="addFormData.tabUrl" :src="addFormData.tabUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">排序</span>
<el-input v-model="addFormData.tabSeq" style="width: 50%" class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">状态</span>
<el-select v-model="addFormData.status" placeholder="请选择">
<el-option label="不展示" :value="0"></el-option>
<el-option label="展示" :value="1"></el-option>
</el-select>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="addDialog = false">取消</el-button>
<el-button type="primary" @click="addFun()"> 确认 </el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { ref, onMounted, reactive, computed } from 'vue'
import { ElMessage, ElMessageBox } from "element-plus";
import { getFaceTabNewList, saveOrUpdateFaceTabNew, deleteFaceTabNew } from '@/api/EmojiManagement/EmojiManagement'
export default {
name: 'EmojiTabManagement',
setup() {
const formData = reactive({
pageNo: 1,
pageSize: 10,
useVip: -1,
status: -1,
id: ''
})
const addFormData = reactive({
id: '',
useVip: 0,
tabUrl: '',
status: 1,
tabSeq: '',
tabName: ''
})
const tableData = reactive({
data: [],
total: 0,
loading: false,
})
const addDialog = ref(false)
const getData = () => {
tableData.loading = true;
getFaceTabNewList(formData).then(res => {
if (res.code == 200) {
tableData.data = res.data.records
tableData.loading = false;
tableData.total = res.data.total
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
})
};
// 增加
const addFun = () => {
saveOrUpdateFaceTabNew(addFormData).then(res => {
if (res.code == 200) {
ElMessage.success('添加成功');
Object.assign(addFormData, {
id: '',
useVip: 0,
tabUrl: '',
status: 1,
tabSeq: '',
tabName: ''
});
addDialog.value = false
getData()
} else {
ElMessage.error(res.message);
addDialog.value = false
}
})
}
// 编辑
const detailPageFun = (row) => {
addFormData.id = row.id;
addFormData.useVip = row.useVip;
addFormData.tabUrl = row.tabUrl;
addFormData.status = row.status;
addFormData.tabSeq = row.tabSeq;
addFormData.tabName = row.tabName || '';
addDialog.value = true
}
// 删除
const deletePageFun = (row) => {
ElMessageBox.confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteFaceTabNew({ id: row.id }).then(res => {
if (res.code == 200) {
ElMessage.success('删除成功')
getData()
} else {
ElMessage.error(res.message)
}
})
})
}
//重置
const resetFormData = () => {
Object.assign(formData, {
pageNo: 1,
pageSize: 10,
useVip: -1,
status: -1,
id: ''
});
};
const resetaddFormData = () => {
Object.assign(addFormData, {
id: '',
useVip: 0,
tabUrl: '',
status: 1,
tabSeq: '',
tabName: ''
});
};
const beforeAvatarUpload = () => {
ElMessage({
showClose: true,
message: "上传中~",
type: "warning",
});
};
const handleAvatarError = () => {
ElMessage({
showClose: true,
message: "上传失败!",
type: "error",
});
};
const handleAvatarSuccess = (res, file) => {
addFormData.tabUrl = file.response.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
};
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
onMounted(() => {
getData();
})
return {
formData,
addFormData,
tableData,
addDialog,
getData,
addFun,
resetFormData,
handleSizeChange,
handleCurrentChange,
beforeAvatarUpload,
handleAvatarError,
handleAvatarSuccess,
detailPageFun,
deletePageFun,
resetaddFormData
}
},
}
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>

View File

@@ -51,7 +51,7 @@
</button> </button>
<h4 class="modal-title" id="modalLabel1">新增表情图片</h4> <h4 class="modal-title" id="modalLabel1">新增表情图片</h4>
</div> </div>
<div class="modal-body" style="overflow:auto;width: 100%;max-height: 80%"> <div class="modal-body" style="overflow-y:auto;width: 100%;height: 500px">
<ul id="bigImg"></ul> <ul id="bigImg"></ul>
</div> </div>
<div class="modal-footer" style="height: 20%"> <div class="modal-footer" style="height: 20%">
@@ -116,7 +116,8 @@
<div class="form-group"> <div class="form-group">
<label for="addFaceId" class="col-sm-3 control-label">表情名ID:</label> <label for="addFaceId" class="col-sm-3 control-label">表情名ID:</label>
<div class="col-sm-9"> <div class="col-sm-9">
<input type="text" class="form-control validate[required]" name="addFaceId" id="addFaceId"> <input type="text" class="form-control validate[required]" name="addFaceId"
id="addFaceId">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -145,8 +146,8 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">审核中表情状态</label> <label class="col-sm-3 control-label">审核中表情状态</label>
<div class="col-sm-9"> <div class="col-sm-9">
<label class="radio-inline"><input name="luckFace" type="radio" id="isLuckFace" value="0" <label class="radio-inline"><input name="luckFace" type="radio" id="isLuckFace"
checked>显示</label> value="0" checked>显示</label>
<label class="radio-inline"><input name="luckFace" type="radio" id="isLuckFaceNo" <label class="radio-inline"><input name="luckFace" type="radio" id="isLuckFaceNo"
value="1">隐藏</label> value="1">隐藏</label>
</div> </div>
@@ -191,8 +192,8 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">表情帧动画结束时候结果图片是否互斥:</label> <label class="col-sm-3 control-label">表情帧动画结束时候结果图片是否互斥:</label>
<div class="col-sm-9"> <div class="col-sm-9">
<label class="radio-inline"><input name="canResultRepeat" type="radio" id="canResultRepeat" <label class="radio-inline"><input name="canResultRepeat" type="radio"
value="1" checked>不互斥</label> id="canResultRepeat" value="1" checked>不互斥</label>
<label class="radio-inline"><input name="canResultRepeat" type="radio" <label class="radio-inline"><input name="canResultRepeat" type="radio"
id="canResultRepeatNo" value="0">互斥</label> id="canResultRepeatNo" value="0">互斥</label>
</div> </div>
@@ -869,4 +870,11 @@ select {
.opt-group .col-sm-7 { .opt-group .col-sm-7 {
text-align: left; text-align: left;
} }
/* .modal-body {
overflow-y: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
height: 500px !important;
} */
</style> </style>

View File

@@ -108,7 +108,7 @@
</select> </select>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="text" class="form-control validate[required]" name="skipUri" <input type="text" class="form-control validate[required]" name="skipUri"
id="skipUrlContent"> id="skipUrlContent" oninput="this.value = this.value.replace(/[\u4e00-\u9fa5]/g, '')">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -269,7 +269,7 @@
</select> </select>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="text" class="form-control validate[required]" name="skipUri" <input type="text" class="form-control validate[required]" name="skipUri"
id="addSkipUrlContent"> id="addSkipUrlContent" oninput="this.value = this.value.replace(/[\u4e00-\u9fa5]/g, '')">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,393 @@
<template>
<div class="box">
<!-- 查询 -->
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="formData.partitionId" v-model:partition-infos="partitionOptions" />
</div>
<div class="inquire">
<span>第三方名称</span>
<el-select v-model="formData.channel" placeholder="请选择" @change="changeEvent">
<el-option v-for="item in nameOptions" :key="item.channel" :label="item.name" :value="item.channel">
</el-option>
</el-select>
</div>
<div class="inquire" v-if="formData.channel">
<span>游戏名称</span>
<el-select v-model="formData.gameId" placeholder="请选择">
<el-option v-for="item in gameOptions[formData.channel]" :key="item.gameId" :label="item.gameName"
:value="item.gameId">
</el-option>
</el-select>
</div>
<div class="inquire">
<span class="demonstration">日期</span>
<el-date-picker v-model="dataTime" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</div>
<el-button style="" type="primary" @click="getData()">查询</el-button>
<el-button class="primary" type="primary" @click="resetFormData()">重置</el-button>
<el-button class="primary" type="primary" @click="confirmExport2Excel()">导出</el-button>
<!-- 表格数据 -->
<el-table v-loading="tableData.loadingOuter" :data="tableData.dataOuter" ref="multipleTable"
@selection-change="handleSelectionChange" border style="width: 100%; margin-top: 25px">
<el-table-column prop="statDate" align="center" label="日期" />
<el-table-column prop="newUsersCount" align="center" label="新用户参与人数" />
<el-table-column prop="totalUsersCount" align="center" label="总参与人数" />
<el-table-column prop="payGold" align="center" label="投入" />
<el-table-column prop="winGold" align="center" label="支出" />
<el-table-column prop="totalRemain" align="center" label="剩余" />
<el-table-column prop="betRate" align="center" label="比例">
<template #default="row">
<span>{{ (row.row.betRate * 100).toFixed(2) + '%' }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="300">
<template v-slot="scope">
<el-button class="primary" type="primary" @click="
detailPageFun(scope.row, 1);
" size="default">明细</el-button>
<el-button class="primary" type="primary" @click="
detailPageFun(scope.row, 2);
" size="default">游戏明细</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px" class="paginationClass" :current-page="formData.pageNo"
:page-size="formData.pageSize" :page-sizes="[10, 20, 50, 100, 200]" layout="sizes, prev, pager, next"
:total="formData.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
<!-- 详情 -->
<el-dialog v-model="detailsDialog" :title="detailPageType == 1 ? '用户明细' : '游戏明细'" width="70%">
<el-button class="primary" type="primary" @click="confirmExport2ExcelTwo()">导出</el-button>
<!-- 内表格 -->
<el-table v-loading="tableData.loadingInner" :data="tableData.dataInner" border
style="width: 100%; margin-top: 25px">
<template v-if="detailPageType == 1">
<el-table-column prop="erbanNo" align="center" label="用户id" />
<el-table-column prop="nick" align="center" label="用户昵称" />
<el-table-column prop="partitionId" align="center" label="分区">
<template #default="row">
<span>{{ getPartitionDesc(row.row.partitionId) }}</span>
</template>
</el-table-column>
<el-table-column prop="channel" align="center" label="第三方名称" />
<el-table-column prop="gameName" align="center" label="游戏名称" />
<el-table-column prop="payGold" align="center" label="投入" />
<el-table-column prop="winGold" align="center" label="支出" />
<el-table-column prop="totalRemain" align="center" label="剩余" />
<el-table-column prop="betRate" align="center" label="比例">
<template #default="row">
<span>{{ (row.row.betRate * 100).toFixed(2) + '%' }}</span>
</template>
</el-table-column>
</template>
<template v-if="detailPageType == 2">
<el-table-column prop="statDate" align="center" label="日期" />
<el-table-column prop="gameName" align="center" label="游戏名称" />
<el-table-column prop="gameId" align="center" label="游戏ID" />
<el-table-column prop="payGold" align="center" label="投入" />
<el-table-column prop="winGold" align="center" label="支出" />
<el-table-column prop="totalRemain" align="center" label="剩余" />
<el-table-column prop="betRate" align="center" label="比例">
<template #default="row">
<span>{{ (row.row.betRate * 100).toFixed(2) + '%' }}</span>
</template>
</el-table-column>
</template>
</el-table>
<el-pagination style="margin-top: 10px" class="paginationClass" :current-page="dialogPagination.pageNo"
:page-size="dialogPagination.pageSize" :page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next" :total="dialogPagination.total" @size-change="detailhandleSizeChange"
@current-change="detailhandleCurrentChange" />
<!-- 操作 -->
<template #footer>
<span class="dialog-footer">
<el-button type="primary" class="primary" @click="detailsDialog = false;detailPageType = 0">关闭</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { ref, onMounted } from 'vue'
import { dateFormat } from "@/utils/system-helper";
import { formatDate } from "@/utils/relDate";
import {
gameList,
getGamedata,
exportForMiniGame,
getUserGamedata,
exportUserForMiniGame,
getGameDetailGamedata,
exportGameDetailExportForMiniGame
} from "@/api/gameSummary/gameSummary";
import { ElMessage } from "element-plus";
import PartitionSelect from "../common/partitionSelect.vue";
export default {
name: "GameSummary",
components: {PartitionSelect},
setup() {
const partitionOptions = ref([]);
const nameOptions = ref([{ name: '灵', channel: 'LEADERCC' }, { name: '百顺', channel: 'BAISHUN' },{ name: 'JOY游戏', channel: 'JOYPLAY' }]);
const gameOptions = ref({});
const dataTime = ref('');
const formData = ref({
channel: 'LEADERCC',
partitionId: undefined,
gameId: 'All',
pageNo: 1,
pageSize: 10,
total: 0,
startTime: '',
endTime: ''
});
const tableData = ref({
dataOuter: [],
dataInner: [],
loadingOuter: false,
loadingInner: false
});
const dialogPagination = ref({
pageNo: 1,
pageSize: 10,
total: 0,
})
const detailsDialog = ref(false);
const exportStatDate = ref('');
const detailPageType = ref(0);
const changeEvent = () => {
formData.value.gameId = gameOptions.value[formData.value.channel][0].gameId;
}
const getGameOptions = () => {
nameOptions.value.forEach(item => {
gameList({ channel: item.channel }).then(res => {
if (res.code == 200) {
gameOptions.value[item.channel] = res.data;
}
});
});
}
// 查询
const getData = () => {
tableData.value.loadingOuter = true;
if (dataTime.value && dataTime.value.length > 0) {
formData.value.startTime = dateFormat(dataTime.value[0], "yyyy-MM-dd hh:mm:ss");
formData.value.endTime = dateFormat(dataTime.value[1], "yyyy-MM-dd hh:mm:ss");
} else {
formData.value.startTime = dataTime.value
formData.value.endTime = dataTime.value
}
const { channel, endTime, gameId, pageNo, pageSize, partitionId, startTime } = formData.value;
getGamedata({ channel, endTime, gameId, pageNo, pageSize, partitionId, startTime }).then(res => {
if (res.code == 200) {
tableData.value.dataOuter = res.data.rows;
tableData.value.loadingOuter = false;
formData.value.total = res.data.total
} else {
tableData.value.loadingOuter = false;
ElMessage.error(res.message);
}
});
}
//重置
const resetFormData = () => {
Object.assign(formData.value, {
channel: '',
partitionId: undefined,
gameId: '',
pageNo: 1,
pageSize: 10,
total: 0,
startTime: '',
endTime: ''
});
tableData.value.dataOuter = [];
tableData.value.dataInner = [];
};
// 导出
const confirmExport2Excel = async () => {
Object.assign(formData.value, { pageSize: 10000, pageNo: 1 });
const { channel, endTime, gameId, pageNo, pageSize, partitionId, startTime } = formData.value;
try {
const res = await exportForMiniGame({
channel, endTime, gameId, pageNo, pageSize, partitionId, startTime
})
if (res) {
ElMessage({
message: '导出成功',
type: 'success',
});
let time = formatDate(new Date());
let alink = document.createElement("a");
alink.download = `game汇总${time}.xls`;
alink.style.display = "none";
const blob = new Blob([res]);
alink.href = URL.createObjectURL(blob);
document.body.appendChild(alink);
alink.click();
URL.revokeObjectURL(alink.href);
}
} catch (error) {
ElMessage({
message: error.message,
type: 'error',
});
}
}
const confirmExport2ExcelTwo = async () => {
const demand = detailPageType.value == 1 ? exportUserForMiniGame : exportGameDetailExportForMiniGame
try {
console.log(exportStatDate.value, '-----')
const { channel, gameId, partitionId } = formData.value;
// Object.assign(dialogPagination.value, { pageSize: 10000, pageNo: 1 });
const res = await demand({
channel,
gameId,
partitionId,
endTime: exportStatDate.value,
startTime: exportStatDate.value,
})
if (res) {
ElMessage({
message: '导出成功',
type: 'success',
});
let time = formatDate(new Date());
let alink = document.createElement("a");
alink.download = detailPageType.value == 1 ? `game汇总用户明细${time}.xls` : `game汇总游戏明细${time}.xls`;
alink.style.display = "none";
const blob = new Blob([res]);
alink.href = URL.createObjectURL(blob);
document.body.appendChild(alink);
alink.click();
URL.revokeObjectURL(alink.href);
// exportStatDate.value = ''
}
} catch (error) {
ElMessage({
message: error.message,
type: 'error',
});
}
}
// 明细
const detailPageFun = async (row, type) => {
tableData.value.loadingInner = true;
// console.log(type, 'type--------')
if(type){
detailPageType.value = type
}
if (row) {
exportStatDate.value = row.statDate
}
console.log(detailPageType.value, 'type--------')
const { channel, gameId, partitionId } = formData.value;
const { pageNo, pageSize } = dialogPagination.value
const demand = detailPageType.value == 1 ? getUserGamedata : getGameDetailGamedata
const res = await demand({
channel,
gameId,
partitionId,
endTime: exportStatDate.value,
startTime: exportStatDate.value,
pageNo,
pageSize
})
if (res.code == 200) {
tableData.value.dataInner = res.data.rows;
tableData.value.loadingInner = false;
detailsDialog.value = true
dialogPagination.value.total = res.data.total
}
}
const handleSizeChange = (val) => {
formData.value.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.value.pageNo = val;
getData();
};
const getPartitionDesc = (partitionId) => {
if (!partitionOptions.value || !partitionId) return '空';
const item = partitionOptions.value.find(item => item.id === partitionId);
return item?.desc || '空';
}
const detailhandleSizeChange = (val) => {
dialogPagination.value.pageSize = val;
detailPageFun();
};
const detailhandleCurrentChange = (val) => {
dialogPagination.value.pageNo = val;
detailPageFun();
};
onMounted(() => {
getGameOptions()
});
return {
partitionOptions,
nameOptions,
formData,
changeEvent,
getGameOptions,
gameOptions,
dataTime,
getData,
confirmExport2Excel,
tableData,
resetFormData,
detailPageFun,
handleSizeChange,
handleCurrentChange,
detailsDialog,
getPartitionDesc,
confirmExport2ExcelTwo,
exportStatDate,
dialogPagination,
detailhandleSizeChange,
detailhandleCurrentChange,
detailPageType
};
},
}
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
</style>

View File

@@ -0,0 +1,299 @@
<template>
<div class="box">
<div class="inquire">
<span>用户ID</span>
<el-input
v-model="formData.erbanNoStr"
placeholder="请输入用户id逗号隔开"
class="input"
></el-input>
</div>
<div class="inquire">
<span>分区</span>
<partition-select v-model:partition-id="formData.partitionId" v-model:partition-infos="partitionOptions" />
</div>
<div class="inquire">
<span>第三方名称</span>
<el-select v-model="formData.channel" placeholder="请选择" @change="changeEvent">
<el-option v-for="item in nameOptions" :key="item.channel" :label="item.name" :value="item.channel">
</el-option>
</el-select>
</div>
<div class="inquire" v-if="formData.channel">
<span>游戏名称</span>
<el-select v-model="formData.gameId" placeholder="请选择">
<el-option v-for="item in gameOptions[formData.channel]" :key="item.gameId" :label="item.gameName"
:value="item.gameId">
</el-option>
</el-select>
</div>
<div class="inquire">
<span class="demonstration">日期</span>
<el-date-picker v-model="dataTime" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期" @calendar-change="calendarChange()">
</el-date-picker>
</div>
<el-button style="" type="primary" @click="getData()">查询</el-button>
<el-button class="primary" type="primary" @click="resetFormData()">重置</el-button>
<el-button class="primary" type="primary" @click="confirmExport2Excel()">导出</el-button>
<el-button class="primary" type="primary" @click="getTotalDayGamedataInfo()">汇总</el-button>
<div class="summary_txt" v-if="tableData.totalStat !=undefined">汇总总进{{tableData.totalStat.payGold}}总出{{tableData.totalStat.winGold}}总剩余{{tableData.totalStat.totalRemain}}比例{{ (tableData.totalStat.betRate * 100).toFixed(2) + '%' }}</div>
<template v-if="tableData.totalList.length>0">
<div class="summary_txt" v-for="(item,index) in tableData.totalList" :key="index">
{{ item.statDate }}汇总数据 总进{{item.payGold}}总出{{item.winGold}}总剩余{{item.totalRemain}}比例{{ (item.betRate * 100).toFixed(2) + '%' }}
</div>
</template>
<!-- 表格数据 -->
<el-table v-loading="tableData.loadingOuter" :data="tableData.dataOuter" ref="multipleTable"
@selection-change="handleSelectionChange" border style="width: 100%; margin-top: 25px">
<el-table-column prop="statDate" align="center" label="日期" />
<el-table-column prop="channel" align="center" label="第三方名称" />
<el-table-column prop="gameName" align="center" label="Game名称" />
<el-table-column prop="erbanNo" align="center" label="用户id" />
<el-table-column prop="nick" align="center" label="用户昵称" />
<el-table-column prop="partitionId" align="center" label="分区">
<template #default="row">
<span>{{ getPartitionDesc(row.row.partitionId) }}</span>
</template>
</el-table-column>
<el-table-column prop="payGold" align="center" label="投入" />
<el-table-column prop="playNum" align="center" label="投入次数" />
<el-table-column prop="winGold" align="center" label="支出" />
<el-table-column prop="totalRemain" align="center" label="剩余" />
<el-table-column prop="betRate" align="center" label="比例">
<template #default="row">
<span>{{ (row.row.betRate * 100).toFixed(2) + '%' }}</span>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px" class="paginationClass" :current-page="formData.pageNo"
:page-size="formData.pageSize" :page-sizes="[10, 20, 50, 100, 200]" layout="sizes, prev, pager, next"
:total="formData.total" @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</template>
<script>
import { ref, onMounted } from 'vue'
import { dateFormat } from "@/utils/system-helper";
import { formatDate } from "@/utils/relDate";
import {
gameList,
getUserGamedata,
exportUserForMiniGame,
getTotalDayGamedata
} from "@/api/gameSummary/gameSummary";
import { ElMessage } from "element-plus";
import PartitionSelect from "../common/partitionSelect.vue";
export default {
name: "gameUserSummary",
components: {PartitionSelect},
setup () {
const partitionOptions = ref([]);
const nameOptions = ref([{ name: '灵', channel: 'LEADERCC' }, { name: '百顺', channel: 'BAISHUN' },{ name: 'JOY游戏', channel: 'JOYPLAY' }]);
const gameOptions = ref({});
const dataTime = ref('');
const formData = ref({
erbanNoStr:'',
channel: 'LEADERCC',
partitionId: undefined,
gameId: 'All',
pageNo: 1,
pageSize: 10,
total: 0,
startTime: '',
endTime: ''
});
const tableData = ref({
dataOuter: [],
loadingOuter:false,
totalStat:undefined,
totalList:[]
});
const changeEvent = () => {
formData.value.gameId = gameOptions.value[formData.value.channel][0].gameId;
}
const getGameOptions = () => {
nameOptions.value.forEach(item => {
gameList({ channel: item.channel }).then(res => {
if (res.code == 200) {
gameOptions.value[item.channel] = res.data;
}
});
});
}
// 查询
const getData = () => {
tableData.value.loadingOuter = true;
if (dataTime.value && dataTime.value.length > 0) {
formData.value.startTime = dateFormat(dataTime.value[0], "yyyy-MM-dd hh:mm:ss");
formData.value.endTime = dateFormat(dataTime.value[1], "yyyy-MM-dd hh:mm:ss");
}else{
formData.value.startTime = dataTime.value
formData.value.endTime = dataTime.value
}
const { erbanNoStr,channel, endTime, gameId, pageNo, pageSize, partitionId, startTime } = formData.value;
getUserGamedata({erbanNoStr, channel, endTime, gameId, pageNo, pageSize, partitionId, startTime }).then(res => {
if (res.code == 200) {
tableData.value.dataOuter = res.data.rows;
tableData.value.loadingOuter = false;
formData.value.total = res.data.total
tableData.value.totalStat = res.data.totalMap?.totalStat;
tableData.value.totalList = [];
} else {
tableData.value.loadingOuter = false;
ElMessage.error(res.message);
}
});
}
//重置
const resetFormData = () => {
Object.assign(formData.value, {
erbanNoStr:'',
channel: '',
partitionId: undefined,
gameId: '',
pageNo: 1,
pageSize: 10,
total: 0,
startTime: '',
endTime: ''
});
tableData.value.dataOuter = [];
};
// 导出
const confirmExport2Excel = async () => {
Object.assign(formData.value, { pageSize: 10000, pageNo: 1 });
const {erbanNoStr, channel, endTime, gameId, pageNo, pageSize, partitionId, startTime } = formData.value;
try {
const res = await exportUserForMiniGame({
erbanNoStr,channel, endTime, gameId, pageNo, pageSize, partitionId, startTime
})
if (res) {
ElMessage({
message: '导出成功',
type: 'success',
});
let time = formatDate(new Date());
let alink = document.createElement("a");
alink.download = `game用户汇总${time}.xls`;
alink.style.display = "none";
const blob = new Blob([res]);
alink.href = URL.createObjectURL(blob);
document.body.appendChild(alink);
alink.click();
URL.revokeObjectURL(alink.href);
}
} catch (error) {
ElMessage({
message: error.message,
type: 'error',
});
}
}
// 汇总
const getTotalDayGamedataInfo = () => {
if (dataTime.value && dataTime.value.length > 0) {
formData.value.startTime = dateFormat(dataTime.value[0], "yyyy-MM-dd hh:mm:ss");
formData.value.endTime = dateFormat(dataTime.value[1], "yyyy-MM-dd hh:mm:ss");
} else {
formData.value.startTime = dataTime.value
formData.value.endTime = dataTime.value
}
const { channel, endTime, gameId, pageNo, pageSize, partitionId, startTime } = formData.value;
getTotalDayGamedata({ channel, endTime, gameId, pageNo, pageSize, partitionId, startTime }).then(res => {
if (res.code == 200) {
tableData.value.totalList = res.data;
} else {
ElMessage.error(res.message);
}
});
}
const handleSizeChange = (val) => {
formData.value.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.value.pageNo = val;
getData();
};
const getPartitionDesc = (partitionId) => {
if (!partitionOptions.value || !partitionId) return '空';
const item = partitionOptions.value.find(item => item.id === partitionId);
return item?.desc || '空';
}
const calendarChange = () => {
console.log()
}
onMounted(() => {
getGameOptions()
// changeEvent()
});
return {
partitionOptions,
nameOptions,
gameOptions,
dataTime,
formData,
tableData,
changeEvent,
getGameOptions,
resetFormData,
handleSizeChange,
handleCurrentChange,
getPartitionDesc,
getData,
confirmExport2Excel,
calendarChange,
getTotalDayGamedataInfo
}
}
}
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.summary_txt{
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 16px;
color: #313131;
line-height: 21px;
text-align: left;
font-style: normal;
text-transform: none;
margin-top: 10px;
}
</style>

View File

@@ -0,0 +1,342 @@
<template>
<div class="box">
<!-- 查询 -->
<div class="inquire">
<span>用户充值等级</span>
<el-select v-model="inquire.userRechargeLevel"
placeholder="请选择"
class="select">
<el-option label="全部"
:value="inquire.userRechargeLevelAll" />
<el-option v-for="item in inquire.userRechargeLevelList"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</div>
<!-- 查询 -->
<div class="inquire">
<span>游戏商</span>
<el-select v-model="inquire.channel"
default="LEADERCC"
placeholder="请选择"
class="select">
<el-option label="灵"
value="LEADERCC" />
</el-select>
</div>
<!-- 查询 -->
<div class="inquire">
<span>游戏</span>
<el-select v-model="inquire.gameId"
placeholder="请选择"
class="select">
<el-option v-for="item in inquire.gameList"
:key="item.gameId"
:label="item.gameName"
:value="item.gameId">
</el-option>
</el-select>
</div>
<!-- 新增按钮 -->
<el-button class="primary"
type="primary"
@click="editDialog = true">新增</el-button>
<!-- 查询按钮 -->
<el-button class="primary"
type="primary"
@click="getData()">查询</el-button>
<!-- 表格 -->
<el-table v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="userRechargeLevel"
align="center"
label="充值等级" />
<el-table-column prop="channelName"
align="center"
label="游戏商" />
<el-table-column prop="gameId"
align="center"
label="游戏ID" />
<el-table-column prop="gameName"
align="center"
label="游戏名称" />
<el-table-column prop="feeRate"
align="center"
label="water" />
<el-table-column prop="updateTime"
align="center"
label="更新时间" />
<el-table-column prop="adminName"
align="center"
label="操作人" />
<el-table-column align="center"
label="操作"
width="240">
<template v-slot="scope">
<el-button @click="openEditDialog(scope.row)"
class="primary"
type="primary"
size="default">编辑</el-button>
<el-button @click="confirmDelete(scope.row)"
class="danger"
type="danger"
size="default">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
v-model:current-page="page.currentPage"
v-model:page-size="page.pageSize"
:page-sizes="[10, 20, 50]"
layout="sizes, prev, pager, next"
:total="page.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
</div>
<!-- 新增弹窗 -->
<el-dialog v-model="editDialog"
title="新增"
width="30%"
center>
<el-form label-width="80px">
<el-form-item label="用户充值等级">
<el-select v-model="editObj.userRechargeLevel"
placeholder="请选择"
class="select">
<el-option v-for="item in inquire.userRechargeLevelList"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="游戏商">
<el-select v-model="editObj.channel"
placeholder="请选择"
class="select">
<el-option label="灵"
value="LEADERCC" />
</el-select>
</el-form-item>
<el-form-item label="游戏id">
<el-select v-model="editObj.gameId"
placeholder="请选择"
style="width: 100%;">
<el-option v-for="item in inquire.gameList"
:key="item.gameId"
:label="item.gameName"
:value="item.gameId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="Water">
<el-input style="width: 100%;"
v-model="editObj.feeRate"
placeholder="请输入"></el-input>
</el-form-item>
<el-form-item>
例如water:0.2%则填0.2即可water2%则填2
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="editDialog = false">取消</el-button>
<el-button type="primary"
@click="editClick()"> 保存 </el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { listLevel } from '@/api/userRechargeLevel/userRechargeLevel'
import { gameList } from "@/api/gameWhitelist/gameWhitelist";
import { page, save, del } from "@/api/gameWhitelist/gameFeeUserRechargeLevelConfig";
// @ts-ignore
import { ElMessage, ElMessageBox } from "element-plus";
export default {
name: "gameFeeRateUserRechargeLevelConfig",
data () {
return {
loading: false,
//查询所需条件对象
inquire: {
userRechargeLevelAll: "全部",
userRechargeLevel: undefined,
userRechargeLevelList: [],
gameId: undefined,
gameList: [],
},
page: {
total: 0,
currentPage: 1,
pageSize: 10
},
// 表格
tableData: [],
// 新增
editDialog: false,
editObj: {},
};
},
created () {
listLevel().then(res => {
if (res.code !== 200) {
ElMessage.error(res.message);
return
}
this.inquire.userRechargeLevelList = res.data;
this.inquire.userRechargeLevel = this.inquire.userRechargeLevelAll;
})
gameList().then((res) => {
if (res.code != 200) {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
return
}
this.inquire.gameList = [{ gameId: undefined, gameName: '全部' }, ...res.data];
this.inquire.gameId = this.inquire.gameList[0].gameId;
});
this.getData();
},
methods: {
// 查询接口
getData () {
this.loading = true;
page({
userRechargeLevel: this.inquire.userRechargeLevel == this.inquire.userRechargeLevelAll ?
undefined : this.inquire.userRechargeLevel,
channel: this.inquire.channel,
gameId: this.inquire.gameId,
pageNo: this.page.currentPage,
pageSize: this.page.pageSize,
}).then((res) => {
if (res.code == 200) {
this.page.total = res.data.total;
this.tableData = res.data.rows;
this.loading = false;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
openEditDialog (obj) {
this.editDialog = true;
this.editObj = Object.assign({}, obj);
},
// 确认新增按钮
editClick () {
save({
userRechargeLevel: this.editObj.userRechargeLevel,
channel: this.editObj.channel,
gameId: this.editObj.gameId,
feeRate: this.editObj.feeRate,
}).then((res) => {
if (res.code != 200) {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
return;
}
this.editDialog = false;
ElMessage({
showClose: true,
message: "新增成功",
type: "success",
});
this.getData();
});
},
// 删除确认
confirmDelete (row) {
ElMessageBox.confirm(
'确定要删除这条记录吗?',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
del({
userRechargeLevel: row.userRechargeLevel,
channel: row.channel,
gameId: row.gameId,
}).then((res) => {
if (res.code != 200) {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
return;
}
ElMessage({
showClose: true,
message: "删除成功",
type: "success",
});
this.getData();
});
}).catch(() => {
ElMessage({
type: 'info',
message: '已取消删除',
});
});
},
// 分页导航
handleSizeChange () {
this.getData();
},
handleCurrentChange () {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
</style>

View File

@@ -0,0 +1,297 @@
<template>
<div class="box">
<!-- 查询 -->
<div class="inquire">
<span>ID</span>
<el-input v-model="inquire.userId"
placeholder=""
class="input"></el-input>
</div>
<div class="inquire">
<span>状态</span>
<el-select v-model="inquire.validStatus"
placeholder="请选择">
<el-option v-for="item in inquire.options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<!-- 新增按钮 -->
<el-button class="primary"
type="primary"
@click="addDialog = true">新增</el-button>
<!-- 查询按钮 -->
<el-button class="primary"
type="primary"
@click="getData()">查询</el-button>
<!-- 表格 -->
<el-table v-loading="loading"
:data="tableData"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="uid"
align="center"
label="UID" />
<el-table-column prop="erbanNo"
align="center"
label="用户ID" />
<el-table-column prop="userRechargeLevel"
align="center"
label="充值等级" />
<el-table-column prop="gameId"
align="center"
label="游戏ID" />
<el-table-column prop="gameName"
align="center"
label="游戏名称" />
<el-table-column prop="feeRate"
align="center"
label="water" />
<el-table-column prop="adminName"
align="center"
label="操作人" />
<el-table-column prop="createTime"
align="center"
label="添加时间" />
<el-table-column align="center"
label="操作"
width="100">
<template v-slot="scope">
<el-button v-show="scope.row.validStatus == 1"
@click="invalid(scope.row.id)"
class="primary"
type="primary"
size="default">失效</el-button>
<div v-show="scope.row.validStatus == 0">无效</div>
<div v-show="scope.row.validStatus == -1">全部</div>
</template>
</el-table-column>
<el-table-column prop="invalidTime"
align="center"
label="失效时间" />
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[10, 20, 50, 100, 200, 500]"
layout="sizes, prev, pager, next"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
</div>
<!-- 新增弹窗 -->
<el-dialog v-model="addDialog"
title="新增"
width="30%"
center>
<el-form label-width="80px">
<el-form-item label="用户id">
<el-input style="width: 100%;"
v-model="adduserID"
placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="游戏id">
<el-select v-model="gameID"
placeholder="请选择"
style="width: 100%;">
<el-option v-for="item in gameIDArr"
:key="item.gameId"
:label="item.gameName"
:value="item.gameId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="Water">
<el-input style="width: 100%;"
v-model="water"
placeholder="请输入"></el-input>
</el-form-item>
<el-form-item>
例如water:0.2%则填0.2即可water2%则填2
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="addDialog = false">取消</el-button>
<el-button type="primary"
@click="addClick()"> 保存 </el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import {
gameList,
gameFeeRateList,
gameFeeRate,
feeRateInvalid,
} from "@/api/gameWhitelist/gameWhitelist";
// @ts-ignore
import { dateFormat } from "@/utils/system-helper";
// @ts-ignore
import { ElMessage } from "element-plus";
export default {
name: "gameWhitelist",
data () {
return {
loading: false,
//查询所需条件对象
inquire: {
userId: "",
validStatus: "-1",
options: [
{
label: "无效",
value: "0",
},
{
label: "有效",
value: "1",
},
{
label: "全部",
value: "-1",
},
],
},
//新增所需对象
resource: {},
// 表格
tableData: [],
// 分页
total: 10, //总页数
currentPage: 1, //页码
pageSize: 10, //条数
// 新增
addDialog: false,
adduserID: "",
gameID: "",
gameIDArr: [],
water: "",
};
},
created () {
gameList().then((res) => {
if (res.code == 200) {
this.gameIDArr = res.data;
} else {
this.butClick = false;
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
this.getData();
},
methods: {
// 查询接口
getData () {
this.loading = true;
gameFeeRateList({
erbanNo: this.inquire.userId,
validStatus: this.inquire.validStatus,
pageNo: this.currentPage,
pageSize: this.pageSize,
}).then((res) => {
if (res.code == 200) {
this.total = res.data.total;
this.tableData = res.data.rows;
this.loading = false;
} else {
this.butClick = false;
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 确认新增按钮
addClick () {
gameFeeRate({
erbanNo: this.adduserID,
gameFeeRate: this.water,
gameId: this.gameID,
}).then((res) => {
if (res.code == 200) {
this.getData();
this.addDialog = false;
ElMessage({
showClose: true,
message: "新增成功",
type: "success",
});
} else {
this.butClick = false;
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
invalid (id) {
feeRateInvalid({ id }).then((res) => {
if (res.code == 200) {
this.getData();
ElMessage({
showClose: true,
message: "设置成功",
type: "success",
});
} else {
this.butClick = false;
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
},
// 分页导航
handleSizeChange () {
this.getData();
},
handleCurrentChange () {
this.getData();
},
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
</style>

View File

@@ -83,7 +83,7 @@
</select> </select>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="text" class="form-control validate[required]" name="skipUri" <input type="text" class="form-control validate[required]" name="skipUri"
id="skipUrlContent"> id="skipUrlContent" oninput="this.value = this.value.replace(/[\u4e00-\u9fa5]/g, '')">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -238,7 +238,7 @@
</select> </select>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="text" class="form-control validate[required]" name="skipUri" <input type="text" class="form-control validate[required]" name="skipUri"
id="addSkipUrlContent"> id="addSkipUrlContent" oninput="this.value = this.value.replace(/[\u4e00-\u9fa5]/g, '')">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

View File

@@ -0,0 +1,248 @@
<template>
<div class="box">
<div class="inquire">
<span>用户ID:</span>
<el-input v-model="formData.erbanNo"
placeholder=""
class="input" />
</div>
<el-button style=""
type="primary"
@click="getData()">查询</el-button>
<el-table v-loading="tableData.loading"
:data="tableData.data"
ref="multipleTable"
@selection-change="handleSelectionChange"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="packId"
align="center"
label="礼包ID" />
<el-table-column prop="packName"
align="center"
label="礼包名称-华语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "zh")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-英语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "en")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-阿语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "ar")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-土耳其区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "tr")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-葡萄牙语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "pt")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-俄语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "ru")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-西班牙语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "es")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-乌兹别克语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "uz")
}}</template>
</el-table-column>
<el-table-column prop="erbanNo"
align="center"
label="用户ID" />
<el-table-column prop="packNum"
align="center"
label="数量" />
<el-table-column prop="remark"
align="center"
label="理由" />
<el-table-column prop="createTime"
align="center"
label="发放时间">
<template v-slot="scope">{{
convertTimestamp(scope.row.createTime)
}}</template>
</el-table-column>
<el-table-column prop="adminUser"
align="center"
label="操作人" />
<el-table-column align="center"
label="操作"
width="220">
<template v-slot="scope">
<el-button @click="packRecall(scope.row.id)"
class="primary"
type="primary"
size="default"
v-if="scope.row.status == 1">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
:current-page="formData.pageNo"
:page-size="formData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
</div>
</template>
<script>
import { ref, onMounted, reactive, computed } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import {
getRecordList,
optionPackRecall,
} from "@/api/giftPackCenter/giftPackCenter";
export default {
name: "distributionRecord",
setup () {
const formData = reactive({
pageNo: 1,
pageSize: 10,
erbanNo: "",
});
const tableData = reactive({
data: [],
total: 0,
loading: false,
});
const getData = () => {
tableData.loading = true;
getRecordList(formData).then((res) => {
if (res.code == 200) {
tableData.data = res.data.rows;
tableData.total = res.data.total;
tableData.loading = false;
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
});
};
// 撤回礼包
const packRecall = (recordId) => {
optionPackRecall({ recordId }).then((res) => {
if (res.code == 200) {
ElMessage.success("撤回成功");
getData();
} else {
ElMessage.error(res.message);
}
});
};
const // 解析json字段
getJsonField = (jsonStr, field) => {
try {
if (!jsonStr) return "";
const obj = JSON.parse(jsonStr);
return obj?.[field] || "";
} catch (e) {
console.error("JSON 解析失败:", jsonStr);
return "";
}
};
const convertTimestamp = (time) => {
let date = new Date(time);
return date.format("yyyy-MM-dd hh:mm:ss");
};
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
return {
formData,
tableData,
getData,
getJsonField,
convertTimestamp,
packRecall,
handleSizeChange,
handleCurrentChange
};
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>

View File

@@ -0,0 +1,717 @@
<template>
<div class="box">
<el-button style=""
type="primary"
@click="getData()">查询</el-button>
<el-button style=""
type="primary"
@click="
addDialog = true;
resetaddFormData();
">新增</el-button>
<el-table v-loading="tableData.loading"
:data="tableData.data"
ref="multipleTable"
@selection-change="handleSelectionChange"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="packId"
align="center"
label="礼包ID" />
<el-table-column prop="partitionDesc"
align="center"
label="分区" />
<el-table-column prop="packName"
align="center"
label="礼包名称-华语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "zh")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-英语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "en")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-阿语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "ar")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-土耳其区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "tr")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-葡萄牙语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "pt")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-俄语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "ru")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-西班牙语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "es")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-乌兹别克语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "uz")
}}</template>
</el-table-column>
<el-table-column prop="status"
align="center"
label="礼包状态">
<template v-slot="scope">
{{ scope.row.status == 1 ? "有效" : "无效" }}
</template>
</el-table-column>
<el-table-column prop="imgUrl"
align="center"
label="礼包样式">
<template v-slot="scope">
<el-image style="width: 100px; height: 100px"
:src="scope.row.imgUrl"
:zoom-rate="1.1"
:preview-src-list="[scope.row.imgUrl ?? '']"
fit="scale-down"
preview-teleported="true"
hide-on-click-modal="true" />
</template>
</el-table-column>
<el-table-column prop="createTime"
align="center"
label="创建时间">
<template v-slot="scope">
{{ scope.row.createTime }}
</template>
</el-table-column>
<el-table-column prop="expireDay"
align="center"
label="礼包过期时间" />
<el-table-column align="center"
label="操作"
width="220">
<template v-slot="scope">
<el-button @click="detailPageFun(scope.row)"
class="primary"
type="primary"
size="default">
编辑礼包
</el-button>
<el-button @click="getRewardList(scope.row.packId)"
class="primary"
type="primary"
size="default">
奖品列表
</el-button>
<el-button @click="
getAwardsFun(scope.row.partitionId);
addFormData.packId = scope.row.packId;
"
class="primary"
type="primary"
size="default"
style="margin-left: 0; margin-top: 10px">
添加奖品
</el-button>
<el-button @click="
addFormData.packId = scope.row.packId;
sendPackCenterDialog = true;
"
class="primary"
type="primary"
size="default"
style="margin-top: 10px">
赠送礼包
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
:current-page="formData.pageNo"
:page-size="formData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
<el-dialog v-model="addDialog"
:title="addFormData.packId == '' ? '新增' : '编辑'"
width="28%"
center>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包名称-华语</span>
<el-input v-model="addFormData.packNameZh"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包名称-英语</span>
<el-input v-model="addFormData.packNameEn"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包名称-阿语</span>
<el-input v-model="addFormData.packNameAr"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包名称-土耳其</span>
<el-input v-model="addFormData.packNameTr"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包名称-葡萄牙语</span>
<el-input v-model="addFormData.packNamePt"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包名称-俄语</span>
<el-input v-model="addFormData.packNameRu"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包名称-西班牙语</span>
<el-input v-model="addFormData.packNameEs"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包名称-乌兹别克语</span>
<el-input v-model="addFormData.packNameUz"
style="width: 50%"
class="input"></el-input>
</div>
<div class="selectBox selectBoxImg">
<span class="left"
style="display: inline-block; margin-right: 20px; width: 100px">礼包样式</span>
<!-- action="/admin/tencent/cos/upload/file" -->
<el-upload class="avatar-uploader"
action="/admin/tencent/cos/upload/file"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
:on-error="handleAvatarError">
<img v-if="addFormData.imgUrl"
:src="addFormData.imgUrl"
class="avatar" />
<el-icon v-else
class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">状态</span>
<el-select v-model="addFormData.status"
placeholder="请选择">
<el-option label="有效"
:value="1"></el-option>
<el-option label="无效"
:value="0"></el-option>
</el-select>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">分区</span>
<partition-select v-model:partition-id="addFormData.partitionId" />
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包过期时间</span>
<el-input v-model="addFormData.expireDay"
style="width: 50%"
class="input"></el-input>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="addDialog = false">取消</el-button>
<el-button type="primary"
@click="addFun()"> 确认 </el-button>
</span>
</template>
</el-dialog>
<!-- 详情表格 -->
<el-dialog v-model="detailsDialog"
title="奖品列表"
width="50%"
center>
<!-- 内表格 -->
<el-table v-loading="tableDetailData.loading"
:data="tableDetailData.data"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="awardTypeName"
align="center"
label="类型">
<template v-slot="scope">
{{ scope.row.awardTypeName + "-" + scope.row.awardName }}
</template>
</el-table-column>
<el-table-column prop="awardId"
align="center"
label="ID" />
<el-table-column prop="awardNum"
align="center"
label="天数/数量" />
<el-table-column prop="awardPic"
align="center"
label="样式">
<template v-slot="scope">
<el-image style="width: 100px; height: 100px"
:src="scope.row.awardPic"
:zoom-rate="1.1"
:preview-src-list="[scope.row.awardPic ?? '']"
fit="scale-down"
preview-teleported="true"
hide-on-click-modal="true" />
</template>
</el-table-column>
<el-table-column align="center"
label="操作"
width="220">
<template v-slot="scope">
<el-button @click="delPageFun(scope.row.itemId)"
class="primary"
type="primary"
size="default">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
<el-dialog v-model="addRewardDialog"
title="添加奖品"
width="28%"
center>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">添加奖品</span>
<el-select v-model="addFormData.awardId"
placeholder="请选择">
<el-option v-for="item in awardsList"
:key="item.awardId"
:label="item.awardTypeName + '-' + item.awardName"
:value="item.awardId">
</el-option>
</el-select>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="addRewardDialog = false">取消</el-button>
<el-button type="primary"
@click="addRewardFun()"> 确认 </el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="sendPackCenterDialog"
title="赠送礼包"
width="28%"
center>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">平台ID</span>
<el-input v-model="addFormData.erbanNo"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">礼包数量</span>
<el-input v-model="addFormData.packNum"
style="width: 50%"
class="input"></el-input>
</div>
<div style="margin-bottom: 25px">
<span style="display: inline-block; margin-right: 20px; width: 100px"
class="col-sm-2 control-label">赠送理由</span>
<el-input v-model="addFormData.remark"
style="width: 50%"
class="input"
:rows="5"
type="textarea"></el-input>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="sendPackCenterDialog = false">取消</el-button>
<el-button type="primary"
@click="sendPackCenterFun()">
确认
</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { ref, onMounted, reactive, computed } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import {
getConfigList,
configSave,
getItemList,
deleteReward,
addReward,
getAwardsList,
sendPackCenter,
} from "@/api/giftPackCenter/giftPackCenter";
import PartitionSelect from "@/views/common/partitionSelect.vue";
export default {
name: "giftPackageConfiguration",
components: {
PartitionSelect,
},
setup () {
const formData = reactive({
pageNo: 1,
pageSize: 10,
});
const addFormData = reactive({
expireDay: "",
imgUrl: "",
packId: "",
status: "",
partitionId: undefined,
packNameZh: "",
packNameEn: "",
packNameAr: "",
packNameTr: "",
packNamePt: "",
packNameRu: "",
packNameEs: "",
packNameUz: "",
awardId: "",
erbanNo: "",
packNum: "",
remark: "",
});
const tableData = reactive({
data: [],
total: 0,
loading: false,
});
const tableDetailData = reactive({
data: [],
total: 0,
loading: false,
});
const awardsList = ref([]);
const addRewardDialog = ref(false);
const addDialog = ref(false);
const detailsDialog = ref(false);
const sendPackCenterDialog = ref(false);
const getRewardPackId = ref('');
const getData = () => {
tableData.loading = true;
getConfigList(formData).then((res) => {
if (res.code == 200) {
tableData.data = res.data.rows;
tableData.total = res.data.total;
tableData.loading = false;
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
});
};
// 增加
const addFun = () => {
const obj = {
expireDay: addFormData.expireDay,
imgUrl: addFormData.imgUrl,
status: addFormData.status,
packName: JSON.stringify({
zh: addFormData.packNameZh,
en: addFormData.packNameEn,
ar: addFormData.packNameAr,
tr: addFormData.packNameTr,
pt: addFormData.packNamePt,
ru: addFormData.packNameRu,
es: addFormData.packNameEs,
uz: addFormData.packNameUz,
}),
partitionId: addFormData.partitionId,
};
if (addFormData.packId) {
obj.packId = addFormData.packId;
}
configSave(obj).then((res) => {
if (res.code == 200) {
if (addFormData.packId) {
ElMessage.success("修改成功");
} else {
ElMessage.success("添加成功");
}
resetaddFormData();
addDialog.value = false;
getData();
} else {
ElMessage.error(res.message);
addDialog.value = false;
}
});
};
// 重置
const resetaddFormData = () => {
Object.assign(addFormData, {
expireDay: "",
imgUrl: "",
packId: "",
status: "",
partitionId: undefined,
packNameZh: "",
packNameEn: "",
packNameAr: "",
packNameTr: "",
packNamePt: "",
packNameRu: "",
packNameEs: "",
packNameUz: "",
awardId: "",
erbanNo: "",
packNum: "",
remark: "",
});
};
// 编辑
const detailPageFun = (row) => {
Object.assign(addFormData, row);
if (row.packName) {
addFormData.packNameZh = JSON.parse(row.packName).zh;
addFormData.packNameEn = JSON.parse(row.packName).en;
addFormData.packNameAr = JSON.parse(row.packName).ar;
addFormData.packNameTr = JSON.parse(row.packName).tr;
addFormData.packNamePt = JSON.parse(row.packName).pt;
addFormData.packNameRu = JSON.parse(row.packName).ru;
addFormData.packNameEs = JSON.parse(row.packName).es;
addFormData.packNameUz = JSON.parse(row.packName).uz;
}
addDialog.value = true;
};
// 奖品列表
const getRewardList = (packId) => {
getRewardPackId.value = packId;
tableDetailData.loading = true;
getItemList({ packId }).then((res) => {
if (res.code == 200) {
tableDetailData.data = res.data;
tableDetailData.total = res.data.total;
tableDetailData.loading = false;
detailsDialog.value = true;
} else {
tableDetailData.loading = false;
ElMessage.error(res.message);
}
});
};
// 奖品列表 - 删除奖品
const delPageFun = (itemId) => {
deleteReward({ itemId }).then((res) => {
if (res.code == 200) {
ElMessage.success("删除成功");
getRewardList(getRewardPackId.value);
} else {
ElMessage.error(res.message);
}
});
};
const getAwardsFun = (partitionId) => {
getAwardsList({ partitionId }).then((res) => {
if (res.code == 200) {
awardsList.value = res.data;
addRewardDialog.value = true;
} else {
ElMessage.error(res.message);
}
});
};
// 添加奖品
const addRewardFun = () => {
const { awardId, packId } = addFormData;
addReward({ awardId, packId }).then((res) => {
if (res.code == 200) {
ElMessage.success("添加成功");
addRewardDialog.value = false;
addFormData.awardId = "";
addFormData.packId = "";
} else {
ElMessage.error(res.message);
}
});
};
// 赠送礼包
const sendPackCenterFun = () => {
let obj = {
erbanNo: addFormData.erbanNo,
packId: addFormData.packId,
packNum: addFormData.packNum,
remark: addFormData.remark,
};
sendPackCenter(obj).then((res) => {
if (res.code == 200) {
ElMessage.success("赠送成功");
sendPackCenterDialog.value = false;
resetaddFormData();
} else {
ElMessage.error(res.message);
}
});
};
const // 解析json字段
getJsonField = (jsonStr, field) => {
try {
if (!jsonStr) return "";
const obj = JSON.parse(jsonStr);
return obj?.[field] || "";
} catch (e) {
console.error("JSON 解析失败:", jsonStr);
return "";
}
};
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
const beforeAvatarUpload = () => {
ElMessage({
showClose: true,
message: "上传中~",
type: "warning",
});
};
const handleAvatarError = () => {
ElMessage({
showClose: true,
message: "上传失败!",
type: "error",
});
};
const handleAvatarSuccess = (res, file) => {
addFormData.imgUrl = file.response.data;
ElMessage({
showClose: true,
message: "上传成功!",
type: "success",
});
};
onMounted(() => {
getData();
});
return {
formData,
tableData,
getData,
handleSizeChange,
handleCurrentChange,
getJsonField,
addDialog,
addFormData,
addFun,
beforeAvatarUpload,
handleAvatarError,
handleAvatarSuccess,
detailPageFun,
tableDetailData,
detailsDialog,
getRewardList,
delPageFun,
addRewardFun,
addRewardDialog,
getAwardsFun,
awardsList,
resetaddFormData,
sendPackCenterDialog,
sendPackCenterFun,
getRewardPackId
};
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>

View File

@@ -0,0 +1,219 @@
<template>
<div class="box">
<div class="inquire">
<span>用户ID:</span>
<el-input v-model="formData.erbanNo"
placeholder=""
class="input" />
</div>
<el-button style=""
type="primary"
@click="getData()">查询</el-button>
<el-table v-loading="tableData.loading"
:data="tableData.data"
ref="multipleTable"
@selection-change="handleSelectionChange"
border
style="width: 100%; margin-top: 25px">
<el-table-column prop="packId"
align="center"
label="礼包ID" />
<el-table-column prop="partitionDesc"
align="center"
label="分区" />
<el-table-column prop="packName"
align="center"
label="礼包名称-华语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "zh")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-英语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "en")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-阿语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "ar")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-土耳其区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "tr")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-葡萄牙语区">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "pt")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-俄语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "ru")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-西班牙语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "es")
}}</template>
</el-table-column>
<el-table-column prop="packName"
align="center"
label="礼包名称-乌兹别克语">
<template v-slot="scope">{{
getJsonField(scope.row.packName, "uz")
}}</template>
</el-table-column>
<el-table-column prop="erbanNo"
align="center"
label="用户ID" />
<el-table-column prop="nick"
align="center"
label="用户昵称" />
<el-table-column prop="targeErbanNo"
align="center"
label="赠送用户ID" />
<el-table-column prop="targeNick"
align="center"
label="赠送用户昵称" />
<el-table-column prop="packNum"
align="center"
label="赠送/使用数量" />
<el-table-column prop="packNum"
align="center"
label="赠送/使用数量" />
<el-table-column prop="createTime"
align="center"
label="使用时间">
<template v-slot="scope">{{
convertTimestamp(scope.row.createTime)
}}</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination style="margin-top: 10px"
class="paginationClass"
:current-page="formData.pageNo"
:page-size="formData.pageSize"
:page-sizes="[20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange" />
</div>
</template>
<script>
import { ref, onMounted, reactive, computed } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { getUseRecordList } from "@/api/giftPackCenter/giftPackCenter";
export default {
name: "usageRecord",
setup () {
const formData = reactive({
pageNo: 1,
pageSize: 10,
erbanNo: "",
});
const tableData = reactive({
data: [],
total: 0,
loading: false,
});
const getData = () => {
tableData.loading = true;
getUseRecordList(formData).then((res) => {
if (res.code == 200) {
tableData.data = res.data.rows;
tableData.total = res.data.total;
tableData.loading = false;
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
});
};
const // 解析json字段
getJsonField = (jsonStr, field) => {
try {
if (!jsonStr) return "";
const obj = JSON.parse(jsonStr);
return obj?.[field] || "";
} catch (e) {
console.error("JSON 解析失败:", jsonStr);
return "";
}
};
const convertTimestamp = (time) => {
let date = new Date(time);
return date.format("yyyy-MM-dd hh:mm:ss");
};
return {
formData,
tableData,
getData,
getJsonField,
convertTimestamp
};
},
};
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>

View File

@@ -0,0 +1,280 @@
<template>
<div class="box">
<!-- 表格数据 -->
<el-table
v-loading="tableData.loading"
:data="tableData.data"
ref="multipleTable"
@selection-change="handleSelectionChange"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="statDate" align="center" label="日期" />
<el-table-column
prop="reachNum"
align="center"
label="公会成员达到人数"
/>
<el-table-column
prop="receiveNum"
align="center"
label="公会成员领取人数"
>
<template v-slot="scope">
<el-button @click="detailFun(scope.row)" type="text" size="small">
{{ scope.row.receiveNum }}
</el-button>
</template>
</el-table-column>
<el-table-column
prop="guildMemberNumn"
align="center"
label="公会成员人数"
/>
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top: 10px"
class="paginationClass"
:current-page="formData.pageNo"
:page-size="formData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<!-- 明细弹窗 -->
<el-dialog
v-model="dailydetailDialog"
title="日任务奖励领取明细"
width="60%"
center
>
<div>
<div class="inquire">
<span>用户ID:</span>
<el-input v-model="detailData.erbanNo" placeholder="" class="input" />
</div>
<div class="inquire">
<span>设备:</span>
<el-input
v-model="detailData.deviceId"
placeholder="支持模糊搜索"
class="input"
/>
</div>
<div class="inquire">
<span>IP:</span>
<el-input
v-model="detailData.ip"
placeholder="支持模糊搜索"
class="input"
/>
</div>
<el-button style="" type="primary" @click="detailFun()">查询</el-button>
<el-button style="" type="primary" @click="confirmExport2Excel()"
>导出</el-button
>
</div>
<el-table
:data="detailtableData.data"
style="width: 100%; margin-top: 30px"
ref="multipleTable"
border
>
<el-table-column prop="guildId" align="center" label="公会ID" />
<el-table-column prop="erbanNo" align="center" label="用户ID" />
<el-table-column prop="uid" align="center" label="用户UID" />
<el-table-column prop="deviceId" align="center" label="领取设备" />
<el-table-column prop="ip" align="center" label="领取IP" />
<el-table-column prop="statusStr" align="center" label="主播状态" />
<el-table-column prop="receiveTime" align="center" label="领取时间" />
</el-table>
<el-pagination
style="margin-top: 10px"
class="paginationClass"
:current-page="detailData.pageNo"
:page-size="detailData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="detailtableData.total"
@size-change="handleSizeChangeDetail"
@current-change="handleCurrentChangeDetail"
/>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="dailydetailDialog = false">
关闭
</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
export default {
name: "DailyTaskRewardCollection",
};
</script>
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { formatDate } from "@/utils/relDate";
import { dateFormat } from "@/utils/system-helper";
import {
getDailyTaskCoinRecvNums,
getDailyTaskcoinRecvDetail,
exportMiniGameDetail,
} from "@/api/DailyTaskRewardCollection/DailyTaskRewardCollection";
const formData = reactive({
pageNo: 1,
pageSize: 10,
});
const tableData = reactive({
data: [],
total: 0,
loading: false,
});
const detailData = reactive({
partitionId: "",
statDate: "",
pageNo: 1,
pageSize: 10,
deviceId: "",
ip: "",
erbanNo: "",
});
const detailtableData = reactive({
data: [],
total: 0,
loading: false,
});
const dailydetailDialog = ref(false);
// 查询
const getData = () => {
tableData.loading = true;
getDailyTaskCoinRecvNums(formData).then((res) => {
if (res.code == 200) {
tableData.data = res.data.rows;
tableData.loading = false;
tableData.total = res.data.total;
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
});
};
// 明细
const detailFun = (row) => {
if (row) {
detailData.partitionId = row.partitionId;
detailData.statDate = row.statDate;
}
getDailyTaskcoinRecvDetail(detailData).then((res) => {
if (res.code == 200) {
detailtableData.data = res.data.rows;
detailtableData.loading = false;
detailtableData.total = res.data.total;
dailydetailDialog.value = true;
} else {
ElMessage.error(res.message);
}
});
};
// 导出
const confirmExport2Excel = async () => {
try {
const res = await exportMiniGameDetail(detailData);
if (res) {
ElMessage({
message: "导出成功",
type: "success",
});
let time = formatDate(new Date());
let alink = document.createElement("a");
alink.download = `日任务奖励领取明细${time}.xls`;
alink.style.display = "none";
const blob = new Blob([res]);
alink.href = URL.createObjectURL(blob);
document.body.appendChild(alink);
alink.click();
URL.revokeObjectURL(alink.href);
}
} catch (error) {
ElMessage({
message: error.message,
type: "error",
});
}
};
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
const handleSizeChangeDetail = (val) => {
detailData.pageSize = val;
detailFun();
};
const handleCurrentChangeDetail = (val) => {
detailData.pageNo = val;
detailFun();
};
onMounted(() => {
getData();
});
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,283 @@
<template>
<div class="box">
<div class="inquire">
<span>公会ID:</span>
<el-input v-model="formData.guildId" placeholder="" class="input" />
</div>
<div class="inquire">
<span>公会长ID:</span>
<el-input v-model="formData.ownerErbanNo" placeholder="" class="input" />
</div>
<div class="inquire">
<span>主播ID:</span>
<el-input v-model="formData.erbanNo" placeholder="" class="input" />
</div>
<div class="inquire">
<span>周期</span>
<el-select
v-model="selectedDate"
placeholder="请选择"
@change="handleDateChange"
clearable
value-key="cycleDate"
>
<el-option
v-for="item in dateCycleArr"
:key="item.cycleDate"
:label="item.intervalFormatter"
:value="item"
>
</el-option>
</el-select>
</div>
<el-button style="" type="primary" @click="getData()">查询</el-button>
<el-button style="" type="primary" @click="confirmExportExcel()"
>导出</el-button
>
<!-- 表格数据 -->
<el-table
v-loading="tableData.loading"
:data="tableData.data"
ref="multipleTable"
@selection-change="handleSelectionChange"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="guildId" align="center" label="公会ID" />
<el-table-column prop="guildName" align="center" label="公会昵称" />
<el-table-column prop="erbanNo" align="center" label="主播ID" />
<el-table-column prop="nick" align="center" label="主播昵称" />
<el-table-column prop="diamondNum" align="center" label="钻石收入" />
<el-table-column
prop="micMinutes"
align="center"
label="活跃时长(分钟)"
/>
<el-table-column prop="micDay" align="center" label="有效天数">
<template v-slot="scope">
<el-button @click="micDayDetail(scope.row)" type="text" size="small">
{{ scope.row.micDay }}
</el-button>
</template>
</el-table-column>
<el-table-column
prop="anchorDiamondSalary"
align="center"
label="主播钻石薪资"
/>
<el-table-column
prop="anchorMicSalary"
align="center"
label="主播时长薪资"
/>
<el-table-column prop="ownerSalary" align="center" label="公会长薪资" />
</el-table>
<!-- 分页 -->
<el-pagination
style="margin-top: 10px"
class="paginationClass"
:current-page="formData.pageNo"
:page-size="formData.pageSize"
:page-sizes="[10, 20, 50, 100, 200]"
layout="sizes, prev, pager, next"
:total="tableData.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<!-- 详情 -->
<el-dialog v-model="detailsDialog" title="有效天数明细" width="30%" center>
<!-- 内表格 -->
<el-table
v-loading="tableDataIn.loading"
:data="tableDataIn.data"
border
style="width: 100%; margin-top: 25px"
>
<el-table-column prop="statDate" align="center" label="日期" />
<el-table-column
prop="micMinutes"
align="center"
label="活跃时长(分钟)"
/>
<el-table-column prop="day" align="center" label="是否有效">
<template v-slot="scope">
{{ scope.row.micDay >= 1 ? "有效" : "无效" }}
</template>
</el-table-column>
</el-table>
<!-- 操作 -->
<template #footer>
<span class="dialog-footer">
<el-button
type="primary"
class="primary"
@click="detailsDialog = false"
>关闭</el-button
>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
export default {
name: "SalaryDetails",
};
</script>
<script setup>
import { ref, onMounted, reactive, computed } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import {
getGuildPolicyQueryMemberPage,
exportQueryMember,
getGuildPolicyCycleDates,
getGuildPolicyMicDayDetail,
} from "@/api/SalaryDetails/SalaryDetails.js";
import { formatDate } from "@/utils/relDate";
const formData = reactive({
pageNo: 1,
pageSize: 10,
erbanNo: "",
guildId: "",
ownerErbanNo: "",
endDate: "",
startDate: "",
});
const selectedDate = ref(null);
const tableData = reactive({
data: [],
total: 0,
loading: false,
});
const tableDataIn = reactive({
data: [],
loading: false,
});
const dateCycleArr = ref([]);
const detailsDialog = ref(false);
// 下拉选择
const handleDateChange = (val) => {
formData.startDate = val.startDate;
formData.endDate = val.endDate;
};
// 查询
const getData = () => {
tableData.loading = true;
getGuildPolicyQueryMemberPage(formData).then((res) => {
if (res.code == 200) {
tableData.data = res.data.rows;
tableData.total = res.data.total;
tableData.loading = false;
} else {
tableData.loading = false;
ElMessage.error(res.message);
}
});
};
// 有效天数详情
const micDayDetail = (row) => {
getGuildPolicyMicDayDetail({
guildMemberId: row.guildMemberId,
endDate: formData.endDate,
startDate: formData.startDate,
}).then((res) => {
if (res.code == 200) {
tableDataIn.data = res.data;
tableDataIn.loading = false;
detailsDialog.value = true;
} else {
tableDataIn.loading = false;
ElMessage.error(res.message);
}
});
};
// 导出
const confirmExportExcel = async () => {
// Object.assign(formData, { pageSize: 10000, pageNo: 1 });
try {
const res = await exportQueryMember(formData);
if (res) {
ElMessage({
message: "导出成功",
type: "success",
});
let time = formatDate(new Date());
let alink = document.createElement("a");
alink.download = `薪资明细${time}.xls`;
alink.style.display = "none";
const blob = new Blob([res]);
alink.href = URL.createObjectURL(blob);
document.body.appendChild(alink);
alink.click();
URL.revokeObjectURL(alink.href);
}
} catch (error) {
ElMessage({
message: error.message,
type: "error",
});
}
};
const handleSizeChange = (val) => {
formData.pageSize = val;
getData();
};
const handleCurrentChange = (val) => {
formData.pageNo = val;
getData();
};
onMounted(() => {
getGuildPolicyCycleDates().then((res) => {
if (res.code == 200) {
dateCycleArr.value = res.data;
} else {
ElMessage({
showClose: true,
message: res.message,
type: "error",
});
}
});
});
</script>
<style lang="less" scoped>
.box {
padding-top: 20px;
background: #ecf0f5;
.inquire {
display: inline-block;
margin-right: 20px;
span {
margin-right: 10px;
}
.input {
width: 180px;
margin-right: 10px;
}
}
.dialogTableVisibleBut {
display: block;
margin: 30px 0 0 830px;
}
.paginationClass {
margin: 15px 0 5px 0px;
}
}
.selectBox {
display: flex;
height: 35px;
line-height: 35px;
margin-bottom: 20px;
}
.selectBoxImg {
height: 150px;
}
</style>

Some files were not shown because too many files have changed in this diff Show More