金币系统前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

399 lines
11 KiB

  1. <script setup>
  2. import { ref, onMounted, reactive, computed } from 'vue'
  3. import ElementPlus from 'element-plus'
  4. import { ElMessage, ElMessageBox } from 'element-plus'
  5. import axios from 'axios'
  6. import moment from 'moment'
  7. import API from '../../api/index.js'
  8. import _ from 'lodash'
  9. import request from '@/util/http'
  10. //这是获取用户信息的接口
  11. const adminData = ref({})
  12. const getAdminData = async function () {
  13. try {
  14. const result = await request({
  15. url: '/admin/userinfo',
  16. data: {}
  17. })
  18. adminData.value = result
  19. addObj.value.adminId = adminData.value.adminId
  20. console.log('请求成功', result)
  21. console.log('用户信息', adminData.value)
  22. } catch (error) {
  23. console.log('请求失败', error)
  24. }
  25. }
  26. //活动表格数据
  27. const tableData = ref([])
  28. //分页总条目
  29. const total = ref(100)
  30. // 搜索对象时间
  31. const getTime = ref([])
  32. // 搜索对象活动
  33. const activity = ref({})
  34. //搜索对象
  35. const getObj = ref({
  36. pageNum: 1,
  37. pageSize: 10
  38. })
  39. // 添加对象
  40. const addObj = ref({
  41. add: ''
  42. })
  43. // 删除对象
  44. const delObj = ref({})
  45. // 搜索方法
  46. const get = async function (val) {
  47. try {
  48. // 搜索参数页码赋值
  49. if (typeof val === 'number') {
  50. getObj.value.pageNum = val
  51. }
  52. // 搜索参数时间赋值
  53. if (getTime.value.length === 2) {
  54. activity.value.startDate = getTime.value[0]
  55. activity.value.endDate = getTime.value[1]
  56. } else {
  57. activity.value.startDate = null
  58. activity.value.endDate = null
  59. }
  60. console.log('搜索参数', getObj.value)
  61. // 发送POST请求
  62. const result = await request({
  63. url: '/recharge/activity/select',
  64. method: 'post',
  65. data: {
  66. pageNum: getObj.value.pageNum,
  67. pageSize: getObj.value.pageSize,
  68. activity: {
  69. ...activity.value,
  70. activityName: activity.value.activityName,
  71. status: activity.value.status
  72. }
  73. }
  74. })
  75. // 将响应结果存储到响应式数据中
  76. console.log('请求成功', result)
  77. // 存储表格数据
  78. tableData.value = result.data.list
  79. console.log('tableData', tableData.value)
  80. // 存储分页总条目
  81. total.value = result.data.total
  82. console.log('total', total.value)
  83. } catch (error) {
  84. console.log('请求失败', error)
  85. ElMessage.error('请求失败')
  86. }
  87. }
  88. // 搜索
  89. const search = function () {
  90. getObj.value.pageNum = 1
  91. get()
  92. }
  93. // 重置
  94. const reset = function () {
  95. getObj.value = {
  96. pageNum: 1,
  97. pageSize: 10
  98. }
  99. getTime.value = []
  100. activity.value = {}
  101. }
  102. // 挂载
  103. onMounted(async function () {
  104. await getAdminData()
  105. get()
  106. })
  107. // 定义控制对话框显示的变量,并初始化为 false
  108. const addActivityVisible = ref(false)
  109. // 定义 addActivity 方法
  110. const addActivity = () => {
  111. console.log('点击了新增活动按钮');
  112. // 更新 addActivityVisible 的值为 true,显示对话框
  113. addActivityVisible.value = true;
  114. };
  115. // 关闭对话框的方法
  116. const closeAddActivityVisible = () => {
  117. addActivityVisible.value = false;
  118. };
  119. // 处理每页显示数量变化
  120. const handlePageSizeChange = function (val) {
  121. getObj.value.pageSize = val
  122. get()
  123. }
  124. // 处理当前页码变化
  125. const handleCurrentChange = function (val) {
  126. getObj.value.pageNum = val
  127. get()
  128. }
  129. // 定义提交方法
  130. const throttledAdd = async () => {
  131. try {
  132. // 过滤掉 'add' 字段
  133. const { add, ...validData } = addObj.value;
  134. // 发送 POST 请求提交表单数据
  135. const result = await request({
  136. url: '/recharge/activity/add', // 假设这是新增活动的接口
  137. method: 'post',
  138. data: validData
  139. })
  140. console.log('新增活动成功', result)
  141. ElMessage.success('新增活动成功')
  142. // 关闭对话框
  143. closeAddActivityVisible()
  144. // 重新获取数据
  145. get()
  146. } catch (error) {
  147. console.log('新增活动失败', error)
  148. ElMessage.error('新增活动失败')
  149. }
  150. }
  151. </script>
  152. <template>
  153. <el-row>
  154. <el-col>
  155. <el-card style="margin-bottom: 20px">
  156. <div class="head-card">
  157. <div class="head-card-element">
  158. <el-text class="mx-1" size="large">活动名称</el-text>
  159. <el-input
  160. v-model="activity.activityName"
  161. style="width: 240px"
  162. placeholder="请输入活动名称"
  163. clearable
  164. />
  165. </div>
  166. <div class="head-card-element">
  167. <el-text class="mx-1" size="large">添加时间</el-text>
  168. <el-date-picker
  169. v-model="getTime"
  170. type="datetimerange"
  171. range-separator="至"
  172. start-placeholder="起始时间"
  173. end-placeholder="结束时间"
  174. />
  175. </div>
  176. <div class="head-card-btn">
  177. <el-button @click="reset()">重置</el-button>
  178. <el-button type="primary" @click="search()">查询</el-button>
  179. </div>
  180. </div>
  181. </el-card>
  182. </el-col>
  183. </el-row>
  184. <el-row>
  185. <el-col>
  186. <el-card>
  187. <div>
  188. <el-button
  189. plain
  190. @click="addActivity()"
  191. style="color: #048efb; border: 1px solid #048efb"
  192. >新增活动</el-button
  193. >
  194. </div>
  195. <div>
  196. <el-table :data="tableData" :height="tableHeight" style="width: 100%">
  197. <el-table-column
  198. type="index"
  199. label="序号"
  200. width="100px"
  201. fixed="left"
  202. >
  203. <template #default="scope">
  204. <span>{{
  205. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  206. }}</span>
  207. </template>
  208. </el-table-column>
  209. <el-table-column prop="activityName" label="活动名称" />
  210. <el-table-column prop="startTime" label="开始时间">
  211. <template #default="scope">
  212. {{ moment(scope.row.startTime).format('YYYY-MM-DD HH:mm:ss') }}
  213. </template>
  214. </el-table-column>
  215. <el-table-column prop="endTime" label="结束时间">
  216. <template #default="scope">
  217. {{ moment(scope.row.endTime).format('YYYY-MM-DD HH:mm:ss') }}
  218. </template>
  219. </el-table-column>
  220. <el-table-column prop="rechargeRatio" label="免费兑换比">
  221. <template #default="scope">
  222. <span>{{ scope.row.rechargeRatio }}:1</span>
  223. </template>
  224. </el-table-column>
  225. <el-table-column prop="status" label="状态">
  226. <template #default="scope">
  227. <span v-if="scope.row.status === 1">
  228. <div class="status">
  229. <span class="green-dot"></span>
  230. <span>进行中</span>
  231. </div>
  232. </span>
  233. <span v-if="scope.row.status === 0">
  234. <div class="status">
  235. <span class="red-dot"></span>
  236. <span>未开始</span>
  237. </div>
  238. </span>
  239. <span v-if="scope.row.status === 2">
  240. <div class="status">
  241. <span class="grey-dot"></span>
  242. <span>已结束</span>
  243. </div>
  244. </span>
  245. </template>
  246. </el-table-column>
  247. <el-table-column prop="name" label="添加人" />
  248. <el-table-column prop="createTime" label="添加时间">
  249. <template #default="scope">
  250. {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  251. </template>
  252. </el-table-column>
  253. <el-table-column prop="operation" label="操作">
  254. <template #default="scope">
  255. <el-popconfirm
  256. title="确定将此条活动删除吗?"
  257. @confirm="delConfirm"
  258. >
  259. <template #reference>
  260. <el-button type="primary" text @click="del(scope.row)">
  261. 删除
  262. </el-button>
  263. </template>
  264. <template #actions="{ confirm, cancel }">
  265. <el-button size="small" @click="cancel">取消</el-button>
  266. <el-button type="primary" size="small" @click="confirm">
  267. 确定
  268. </el-button>
  269. </template>
  270. </el-popconfirm>
  271. </template>
  272. </el-table-column>
  273. </el-table>
  274. </div>
  275. <!-- 分页 -->
  276. <div class="pagination" style="margin-top: 20px">
  277. <el-pagination
  278. background
  279. :page-size="getObj.pageSize"
  280. :page-sizes="[5, 10, 20, 50, 100]"
  281. layout="total, sizes, prev, pager, next, jumper"
  282. :total="total"
  283. @size-change="handlePageSizeChange"
  284. @current-change="handleCurrentChange"
  285. ></el-pagination>
  286. </div>
  287. </el-card>
  288. </el-col>
  289. </el-row>
  290. <el-dialog
  291. v-model="addActivityVisible"
  292. title="新增活动"
  293. width="500"
  294. :before-close="closeAddActivityVisible"
  295. :close-on-click-modal="false"
  296. >
  297. <template #footer>
  298. <el-form
  299. ref="Ref"
  300. :model="addObj"
  301. :rules="rules"
  302. label-width="auto"
  303. style="max-width: 600px"
  304. >
  305. <el-form-item prop="activityName" label="活动名称:">
  306. <el-input
  307. v-model="addObj.activityName"
  308. placeholder="请输入活动名称"
  309. style="width: 220px"
  310. />
  311. </el-form-item>
  312. <el-form-item prop="freeGold" label="免费金币:">
  313. <el-radio-group v-model="addObj.freeGold">
  314. <el-radio value="0" @change="addObj.rechargeRatio = '0'"
  315. >无赠送</el-radio
  316. >
  317. <el-radio value="1">有赠送</el-radio>
  318. </el-radio-group>
  319. </el-form-item>
  320. <el-form-item prop="rechargeRatio" label="免费金币兑换比:">
  321. <el-input
  322. v-model="addObj.rechargeRatio"
  323. :disabled="addObj.freeGold === '0' ? true : false"
  324. placeholder="请输入"
  325. style="width: 80px"
  326. />1
  327. <div style="color: grey">
  328. (提示当前规则每{{ addObj.rechargeRatio }}新币可兑换1免费金币)
  329. </div>
  330. </el-form-item>
  331. <el-form-item prop="startTime" label="开始时间:">
  332. <el-date-picker
  333. v-model="addObj.startTime"
  334. type="datetime"
  335. placeholder="请选择开始时间"
  336. @change="handleStartTimeChange"
  337. />
  338. </el-form-item>
  339. <el-form-item prop="endTime" label="结束时间:">
  340. <el-date-picker
  341. v-model="addObj.endTime"
  342. type="datetime"
  343. placeholder="请选择结束时间"
  344. />
  345. </el-form-item>
  346. <el-form-item label="添加人:">
  347. <el-input v-model="adminData.name" disabled style="width: 220px" />
  348. </el-form-item>
  349. </el-form>
  350. <div class="dialog-footer">
  351. <el-button @click="closeAddActivityVisible">取消</el-button>
  352. <el-button type="primary" @click="throttledAdd"> 提交 </el-button>
  353. </div>
  354. </template>
  355. </el-dialog>
  356. </template>
  357. <style scoped>
  358. .pagination {
  359. display: flex;
  360. }
  361. .status {
  362. display: flex;
  363. }
  364. .head-card {
  365. display: flex;
  366. }
  367. .head-card-element {
  368. margin-right: 20px;
  369. }
  370. .head-card-btn {
  371. margin-left: auto;
  372. }
  373. </style>