金币系统前端
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.

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