Compare commits

...

623 Commits

Author SHA1 Message Date
GaoHao acc3930f48 优惠券修改 2024-11-20 15:12:37 +08:00
YeMingfei666 8a8de80321 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-11-19 15:27:49 +08:00
YeMingfei666 07d072ce4c 修改代客下单切换会员逻辑 2024-11-19 15:21:20 +08:00
gyq 315b3e536d 优化积分 2024-11-19 15:09:43 +08:00
gyq e0822677ff 修复积分中心基本设置文字错误 2024-11-19 13:56:31 +08:00
YeMingfei666 8318b9ed80 Merge branch 'ymf_test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-11-19 11:22:43 +08:00
YeMingfei666 f393b91c2d 修改选中的抵扣券不展示商品信息 2024-11-19 10:38:55 +08:00
YeMingfei666 db7c64fa8b 修改是否启用会员价的字段 2024-11-19 10:09:49 +08:00
YeMingfei666 638ed75b4d Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf_test 2024-11-19 09:26:58 +08:00
YeMingfei666 910fd4b9ad 修复代客下单退菜时历史订单会被标识为客座费问题 2024-11-19 09:26:32 +08:00
YeMingfei666 3d287016c0 代客下单修改商品抵扣券价格计算逻辑 2024-11-18 18:24:28 +08:00
魏啾 ef16e62702 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-14 14:04:40 +08:00
魏啾 094a8fc102 优惠劵 2024-11-14 14:04:31 +08:00
gyq 3045b3f9a5 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-11-14 13:55:58 +08:00
gyq 85c5b86050 优化 2024-11-14 13:55:51 +08:00
魏啾 460e3b7201 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-11-14 11:40:59 +08:00
魏啾 95713b5df1 优惠劵清空 2024-11-14 11:39:39 +08:00
gyq 4aa57227ea Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-11-14 09:05:51 +08:00
gyq 7836222460 优化分享好友演示 2024-11-14 09:05:44 +08:00
魏啾 e9bd9cc2d8 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-13 18:29:11 +08:00
魏啾 528344d6ce 输入金额判断整数 2024-11-13 18:28:50 +08:00
GaoHao b836d1a0b4 分享好友 奖励券提示增加 2024-11-13 18:22:39 +08:00
GaoHao 76774a4ec5 优惠券修改 2024-11-13 17:00:15 +08:00
GaoHao 519b28f746 优惠券编辑修改 2024-11-13 16:21:02 +08:00
GaoHao cb00d913d0 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-13 14:37:30 +08:00
GaoHao 7275bc66e9 门槛限制增加小数点 2024-11-13 14:37:25 +08:00
YeMingfei666 13c473a234 订单列表增加根据isPostpaid判断是否可以退菜 2024-11-13 14:30:57 +08:00
GaoHao 802a8f6ce4 Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-13 13:47:16 +08:00
GaoHao 266674272d 商品券商品ID字段修改 2024-11-13 13:46:40 +08:00
YeMingfei666 e795c49b32 Merge branch 'ymf_test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-13 13:46:28 +08:00
YeMingfei666 fabe5e3060 修复先付费下现金支付第一次点击时价格为0 2024-11-13 13:45:48 +08:00
YeMingfei666 a425baad52 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-13 10:42:16 +08:00
YeMingfei666 d14ba5e812 代客下单修改支付成功后的处理 2024-11-13 10:41:10 +08:00
gyq aacb9d966a Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-11-13 10:23:46 +08:00
gyq 93854290fe 优化分享好友 2024-11-13 10:23:33 +08:00
YeMingfei666 f931cc882d 修复已退款显示问题 2024-11-13 10:03:59 +08:00
YeMingfei666 7752ce1b8a 代客下单修改结账时优惠券couponId改为id 2024-11-13 09:58:09 +08:00
YeMingfei666 b7da2d0a7b Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf_test 2024-11-13 09:46:20 +08:00
YeMingfei666 f3df88236f 修改先付订单未支付显示已退款问题 2024-11-13 09:45:36 +08:00
GaoHao 42c2d6891d Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-12 16:15:31 +08:00
GaoHao 251353d48e 优惠券满减输入限制 2024-11-12 16:15:06 +08:00
GaoHao ee9405c5a6 优惠券满减输入限制 2024-11-12 16:09:54 +08:00
魏啾 5b0b69bf97 活动修改 2024-11-12 15:54:18 +08:00
魏啾 d8eba6ea2e 解决冲突 2024-11-12 15:07:49 +08:00
魏啾 2a27c5394b 优惠卷 2024-11-12 15:06:13 +08:00
duan 0a081f21ca Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-11-12 10:11:44 +08:00
duan e5ba63d8aa 添加商品分组排列方式 2024-11-12 10:11:33 +08:00
GaoHao 0d37da0a58 Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-12 09:42:08 +08:00
GaoHao 8f8cbae221 限制金额、数量只能输正整数 2024-11-12 09:41:46 +08:00
GaoHao 1df34b598f Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-12 09:40:47 +08:00
GaoHao fea219ee42 限制金额、数量只能输正整数 2024-11-12 09:40:23 +08:00
YeMingfei666 bbbe6275ee 增加临时菜弹窗 2024-11-11 18:23:59 +08:00
duan 964b5a2316 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-11-11 15:39:36 +08:00
duan 0210e61816 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-11-11 15:36:06 +08:00
YeMingfei666 b75318c146 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-11 14:06:23 +08:00
YeMingfei666 22ae339e30 Merge branch 'ymf_test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-11-11 14:04:28 +08:00
YeMingfei666 176fc55a5c 增加优惠券,积分抵扣 2024-11-11 14:03:49 +08:00
魏啾 a8f01db5e3 活动管理 2024-11-11 13:36:44 +08:00
魏啾 c79049443a 商品添加缓存 活动 2024-11-11 10:39:45 +08:00
gyq f5368fcf4f Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-11-11 09:53:42 +08:00
gyq af90b029df 新增邀请好友 2024-11-09 18:19:47 +08:00
GaoHao 835809910a Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-08 18:24:46 +08:00
GaoHao 4f6fbf376a 优惠券领取详情更新 2024-11-08 18:24:14 +08:00
GaoHao 43df2b637b Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-08 16:07:25 +08:00
GaoHao 0a470c3d7d 优惠券增加有效天数 2024-11-08 16:06:26 +08:00
YeMingfei666 28fdcd9e5c 增加商品券抵扣以及商品券抵扣后价格计算过滤不满足满减条件的优惠券,修改部分代客下单逻辑 2024-11-07 17:04:00 +08:00
YeMingfei666 a9a4efabe9 修改部分代客下单逻辑 2024-11-07 13:30:58 +08:00
魏啾 4acb025bb9 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-11-06 17:51:30 +08:00
魏啾 883a6ffa1a 添加出入库供应商 2024-11-06 17:51:12 +08:00
YeMingfei666 a8c1440a02 1.代课下单修改监听用户改变事件
减少重复请求
2.当会员优惠未0时不展示会员优惠
2024-11-06 15:39:52 +08:00
YeMingfei666 958229f63d 代客下单修复:
结算时切换用户未重新获取订单信息
2024-11-06 15:29:31 +08:00
YeMingfei666 3ad1407173 修改价格计算公式 2024-11-06 15:26:52 +08:00
YeMingfei666 8528341101 修改价格计算,总价格包含赠送商品价格,最后结果为总价格-赠送商品-会员优惠 2024-11-06 15:20:20 +08:00
YeMingfei666 ef8cd6da3a 增加会员价展示 2024-11-06 14:58:46 +08:00
gyq a9691e5891 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-11-05 17:09:47 +08:00
gyq da1812f78b 优化积分中心新增类型 2024-11-05 17:09:40 +08:00
YeMingfei666 dfe65e0ae6 修复积分抵扣接口报错问题 2024-11-05 16:41:37 +08:00
YeMingfei666 67a892ac01 代客下单结账增加积分优惠券支付 2024-11-05 16:28:01 +08:00
GaoHao 7d8673e6cf Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-05 10:54:43 +08:00
GaoHao 649f9bd13f 添加优惠券名字修改 2024-11-05 10:53:43 +08:00
YeMingfei666 63ef70ab6a 修复问题:
【管理系统】数据统计-桌台统计页面中,按时间筛选出当日时间各个桌台订单数量,点击跳转到订单页面结果不准确
2024-11-04 15:01:29 +08:00
YeMingfei666 f95ae26298 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf_test 2024-11-04 14:53:11 +08:00
YeMingfei666 a9736e69f1 增加获取优惠券 2024-11-04 14:52:36 +08:00
duan f4467b6a2e 桌台日期跳转 2024-11-04 14:36:55 +08:00
duan 8ab8fa3a9a Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-11-04 14:11:41 +08:00
duan c9d2e3c80f 桌台跳转报错 2024-11-04 14:11:28 +08:00
魏啾 1b0747ca91 添加耗材价格 2024-11-04 14:07:22 +08:00
duan 13b4a82ce6 修改耗材出库单位 2024-11-04 11:38:42 +08:00
duan 933d70445e Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-11-04 11:28:15 +08:00
duan 51f3a382c8 耗材主副单位联动 2024-11-04 11:27:44 +08:00
gyq 438c11c324 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-11-01 16:00:26 +08:00
gyq 8acea02448 积分中心图片增加预览功能 2024-11-01 13:48:50 +08:00
duan da693c2fa2 员工管理 2024-11-01 13:36:15 +08:00
魏啾 281a4d200a Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-11-01 13:35:57 +08:00
魏啾 367cb7c2d7 隐藏耗材管理 2024-11-01 13:35:20 +08:00
YeMingfei666 1067da51c4 修复订单列表页面退菜文字错误 2024-11-01 11:28:13 +08:00
YeMingfei666 b0fd39fa87 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf_test 2024-11-01 11:16:49 +08:00
YeMingfei666 8c99f49700 代客下单部分逻辑处理优化,订单管理退款退菜结账跳转功能问题处理 2024-11-01 11:16:12 +08:00
gyq 964877f763 优惠券api管理 2024-11-01 10:24:16 +08:00
gyq 9621b5bb86 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-11-01 10:23:36 +08:00
gyq 9bf1dda6dc 1.新增店铺装修小票设置
2.店铺装修新增pad点餐设置
3.应用中心新增会员积分
4.店铺设置新增积分设置
2024-11-01 10:23:05 +08:00
YeMingfei666 924f296ad1 修改代客下单相关逻辑 2024-10-31 18:25:52 +08:00
duan 55ebdf9283 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-10-31 16:40:50 +08:00
duan 96730712f3 修改副单位样式 2024-10-31 16:40:26 +08:00
YeMingfei666 8403afd685 代客下单新逻辑梳理 2024-10-31 16:36:21 +08:00
duan 20df5c3ca4 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-31 16:14:37 +08:00
duan 515b12f09a 修改主副单位 2024-10-31 16:14:34 +08:00
魏啾 b0d37275f6 dev 2024-10-31 10:34:53 +08:00
魏啾 a841858316 Merge branch 'wwzdiv' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-31 10:18:54 +08:00
魏啾 df10beaaec Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-31 10:18:09 +08:00
魏啾 4af25b2b80 1 2024-10-31 10:17:30 +08:00
duan 58ed04ea71 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-31 10:17:03 +08:00
duan 63a6305d46 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-31 10:12:42 +08:00
duan 461150f9ba 添加出入库的欠款金额 2024-10-31 10:12:39 +08:00
GaoHao 29283c3487 Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-31 09:30:42 +08:00
GaoHao f68cf9fab0 优惠券详情修改 2024-10-31 09:30:18 +08:00
duan c103e026e5 入库出库null的问题 2024-10-31 09:14:10 +08:00
duan 909760e9bf 耗材副单位回显修改 2024-10-30 16:50:32 +08:00
gyq f4b0414856 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-30 13:38:41 +08:00
gyq c0c3eeeb44 新增会员积分页面 2024-10-30 13:38:34 +08:00
魏啾 30d4be1560 unbind未绑定 2024-10-30 13:32:43 +08:00
duan 4caaa3770f 耗材单位模块 2024-10-29 18:17:03 +08:00
duan 99da7fcf5a Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-29 13:33:36 +08:00
duan c3cd0e704e 商品分类页面需要调整 2024-10-29 13:33:33 +08:00
GaoHao 7ea49cbab8 优惠券修改 2024-10-29 10:15:04 +08:00
gyq a2d21b3776 将接口修改为测试服 2024-10-26 10:34:37 +08:00
gyq a67e109744 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-26 10:27:33 +08:00
gyq 7445cfda26 提交pad点餐设置问题 2024-10-26 10:27:26 +08:00
YeMingfei666 516ce90284 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-25 18:21:21 +08:00
YeMingfei666 c6fed2af32 增加台桌搜索功能 2024-10-25 18:03:00 +08:00
YeMingfei666 df9a49813a 代客下单无桌台下单隐藏仅下单按钮按照外带模式处理 2024-10-25 17:21:22 +08:00
duan 863630b4c2 打印机部分备注修改 2024-10-25 17:01:33 +08:00
gyq d87b37fcea Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-25 16:04:50 +08:00
gyq 435008fbd3 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-25 16:04:08 +08:00
YeMingfei666 146e6a617c Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-25 16:03:42 +08:00
gyq c384188256 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-25 16:01:33 +08:00
gyq 41648aa4c5 优化 2024-10-25 16:01:27 +08:00
YeMingfei666 ca827999b8 更新修复未调用选取桌台接口 2024-10-25 15:25:16 +08:00
duan 4d6635e9be Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-25 15:23:08 +08:00
duan 869da7f0f0 修改叫号记录菜单 2024-10-25 15:23:06 +08:00
YeMingfei666 709036c050 增加无台桌下单切换台桌 2024-10-25 14:50:52 +08:00
gyq 6f63576428 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-25 10:01:59 +08:00
gyq 64794aa8b8 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-25 09:59:04 +08:00
gyq 486733b788 优化 2024-10-25 09:58:48 +08:00
GaoHao 01eeccaecf 添加优惠券相关 2024-10-25 09:55:57 +08:00
魏啾 5a8a45143b 解决冲突data_forms.vue 2024-10-25 09:54:51 +08:00
魏啾 bf20edf7ef 调整进销存样式 2024-10-25 09:53:16 +08:00
duan 7acc762d59 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-25 09:39:03 +08:00
duan 88db7a720d 桌型表单提交后制空 2024-10-25 09:38:59 +08:00
gyq 82cc068206 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-25 09:38:25 +08:00
gyq af54cb73ad 优化数据统计 2024-10-25 09:37:29 +08:00
gyq 647912fa1f Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-24 17:29:08 +08:00
gyq 01003c84ab 优化 2024-10-24 17:28:30 +08:00
gyq e1fb69f424 优化 2024-10-24 16:30:27 +08:00
gyq 163757f27b Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-24 16:08:10 +08:00
gyq f585e2f020 1.优化首页 2.优化绑定耗材 2024-10-24 15:38:55 +08:00
YeMingfei666 c473f30a37 修改代客下单商品是否能够下单的逻辑 2024-10-24 14:52:52 +08:00
YeMingfei666 57ef84aae1 代客下单增加无台桌获取masterId 2024-10-24 11:40:52 +08:00
gyq 2261b0520a Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-24 11:10:46 +08:00
gyq abac233027 1.店铺设置 - 店铺信息 - 桌位费开启免餐位费不可修改输入框
2.店铺设置 - 店铺信息logo、门店、二维码、小程序码图片添加下载按钮
3.新增pad点单设置
2024-10-24 11:10:33 +08:00
魏啾 b2e27c0035 Merge branch 'wwz' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-23 17:13:48 +08:00
YeMingfei666 3fb8a7b748 代码合并 2024-10-23 16:38:46 +08:00
YeMingfei666 76e5b89fb7 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-10-23 16:33:20 +08:00
YeMingfei666 5ea24d76c8 修复:
1.代客下单先付费下直接点扫码支付获取支付链接失败
2.修复清空购物车删除因为报错导致购物车清空事变
2024-10-23 16:32:04 +08:00
魏啾 e5aec2e236 霸王餐 2024-10-23 16:00:56 +08:00
duan 09716e7492 修改打印机跳转 2024-10-23 14:51:26 +08:00
魏啾 8a7a97c9ca 退出 2024-10-23 14:24:19 +08:00
魏啾 54d4f468c1 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-10-23 14:23:08 +08:00
魏啾 ea8df2a3b3 全屏 2024-10-23 14:22:04 +08:00
YeMingfei666 ab1f5bd199 增加订单退款退菜 2024-10-23 13:53:11 +08:00
duan 12e66e8866 Merge branch 'dwb' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-22 14:28:36 +08:00
duan 9c2ce903b2 叫号语音播放 2024-10-22 14:27:35 +08:00
YeMingfei666 36d667326e 增加退款退菜功能 2024-10-22 13:28:09 +08:00
YeMingfei666 9593d8f906 修复退菜数量不对问题 2024-10-22 08:58:27 +08:00
duan bc3929a32e Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-21 17:17:42 +08:00
duan 998874db87 保存商户信息 2024-10-21 17:17:39 +08:00
YeMingfei666 f15c2c0135 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-21 11:06:05 +08:00
YeMingfei666 727d79a253 修复代客下单权限校验后无反应
增加桌台结账权限校验
2024-10-21 11:05:46 +08:00
YeMingfei666 f93b07e798 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-21 10:58:56 +08:00
YeMingfei666 ec7db7612b 增加代客下单权限校验 2024-10-21 10:58:33 +08:00
GaoHao ae82be372d Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-21 10:40:41 +08:00
GaoHao c017e9d318 用户权限调整 2024-10-21 10:39:42 +08:00
YeMingfei666 c86a85473b Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-10-21 09:34:21 +08:00
YeMingfei666 9fbacf0398 更新页面样式,增加退菜数量选择以及退款原因 2024-10-18 16:55:43 +08:00
duan f442efd357 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-18 15:53:23 +08:00
duan 0fd7264309 打印机修改 2024-10-18 15:53:21 +08:00
魏啾 8cc30448ca Merge branch 'wwz' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-18 15:15:56 +08:00
魏啾 0c7637f507 耗材修改 2024-10-18 15:15:32 +08:00
duan 460bbc6e18 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-18 13:44:13 +08:00
duan 401e9fc8d3 打印机默认值 2024-10-18 13:44:11 +08:00
魏啾 d21d4f490d Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-18 11:19:41 +08:00
魏啾 49b1eae1fa 库存盘点 2024-10-18 11:19:35 +08:00
gyq dfcc643e8f 修复UI提出的问题 2024-10-18 10:26:46 +08:00
gyq 9b144138e9 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-18 09:10:35 +08:00
gyq b52ed29d11 优化面包屑首页跳转 2024-10-18 09:10:26 +08:00
GaoHao a9aad48ef3 Merge branch 'gh' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-17 14:18:59 +08:00
GaoHao 511d266f72 数据统计销售金额,充值金额隐藏 2024-10-17 14:17:52 +08:00
duan 527714c16f Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-17 14:03:51 +08:00
duan 453955ca76 排队样式修改 2024-10-17 14:03:49 +08:00
YeMingfei666 d40a7b1856 修改默认布局 2024-10-17 13:55:01 +08:00
YeMingfei666 c224469c35 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-10-17 13:41:50 +08:00
GaoHao 489baa80d8 员工权限校验 2024-10-17 11:46:00 +08:00
YeMingfei666 eee6b3c9fa 增加无可用台桌时的提示 2024-10-17 11:39:10 +08:00
GaoHao 2c54a2a1d1 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into gh 2024-10-17 11:35:33 +08:00
GaoHao c75ff0ee68 员工权限校验 2024-10-17 11:35:03 +08:00
魏啾 585c26fd4d Merge branch 'wwz' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-17 11:32:19 +08:00
魏啾 904c6be6ba 商品修改 耗材修改 2024-10-17 11:31:04 +08:00
duan 90573dac96 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-17 10:11:15 +08:00
duan c625d9a886 Merge branch 'dwb' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-17 10:11:13 +08:00
duan 21197e6258 打印机本地或网络判断 2024-10-17 10:11:00 +08:00
gyq b2a3854f2b Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-17 09:05:24 +08:00
gyq 9cf170e289 优化面包屑首页跳转失败 2024-10-17 09:04:51 +08:00
duan fa28b9d8ac Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-16 18:01:11 +08:00
duan 866c395558 打印机 2024-10-16 18:00:46 +08:00
魏啾 d3bfab8010 Merge branch 'wwz' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-16 10:40:47 +08:00
魏啾 0c289d21a4 修改出库"in" 2024-10-16 10:05:11 +08:00
duan 9f2af5cf76 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-10-16 09:52:41 +08:00
duan b9709d9fd4 打印机第5次修改 2024-10-16 09:52:32 +08:00
YeMingfei666 411b434b26 代客下单将之前的打包赠送等接口从添加改为更新 2024-10-15 17:19:18 +08:00
魏啾 c5816b1d85 Merge branch 'wwz' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-15 16:40:35 +08:00
魏啾 b3ea406b6e detail.createdAt | paidTime | timeFilter报错 2024-10-15 16:40:15 +08:00
魏啾 2acc46e811 耗材出库入库参数修改 2024-10-15 16:20:17 +08:00
gyq 9513f7a3ec 优化 2024-10-15 15:42:58 +08:00
gyq acf055ee72 修复耗材绑定有限打开多规格后单规格样式错乱问题 2024-10-15 15:27:32 +08:00
gyq a3e6c066a3 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-15 09:21:43 +08:00
gyq b391a7da80 修复样式污染 2024-10-15 09:16:07 +08:00
duan e1a8f59bbf Merge branch 'dwb' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-15 09:10:29 +08:00
duan 0069fb7185 打印机第4次修改 2024-10-15 09:09:42 +08:00
gyq 9e269a690c Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-15 09:03:06 +08:00
gyq ef53332726 优化规格绑定耗材样式 2024-10-15 09:02:39 +08:00
魏啾 2b6a4f9a83 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-10-14 14:49:03 +08:00
魏啾 f1a599881c 耗材列表 2024-10-14 14:48:51 +08:00
YeMingfei666 3ebbfb6324 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-12 15:55:35 +08:00
YeMingfei666 2c7042e6e2 修复代客下单扫码支付金额不对 2024-10-12 15:53:29 +08:00
魏啾 f623106dce Merge branch 'wwz' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-12 14:48:26 +08:00
魏啾 327e8ef17c 订单编号点击跳转 2024-10-12 14:47:54 +08:00
YeMingfei666 0e7f5885e0 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-12 13:59:46 +08:00
YeMingfei666 79e27f0098 代客下单修改
先付费模式下只要生成订单就清空购物车
2024-10-12 13:59:16 +08:00
魏啾 fec143eb44 操作类型 2024-10-12 13:46:44 +08:00
魏啾 893ec1bec4 耗材修改 2024-10-12 11:00:50 +08:00
duan 49a458de76 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-10-12 10:44:06 +08:00
duan 8f7aaf87d5 打印机部分修改优化 2024-10-12 10:43:56 +08:00
gyq 9c561ff725 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-12 10:37:15 +08:00
gyq 5608d7569b 优化商品列表首页统计 2024-10-12 10:37:05 +08:00
魏啾 9d42cda990 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-10-12 10:08:40 +08:00
魏啾 7bad259789 耗材 2024-10-12 10:08:27 +08:00
gyq 7a065c64cc Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-12 09:48:10 +08:00
gyq a21199d217 优化商品列表 2024-10-12 09:47:58 +08:00
YeMingfei666 23782f0f82 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-11 17:22:12 +08:00
YeMingfei666 9785038621 修复代课下单用户扫码支付后未清除定时器 2024-10-11 17:21:44 +08:00
duan 6882f41786 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-11 14:51:49 +08:00
duan c52422d4f6 Merge branch 'dwb' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-11 14:51:46 +08:00
duan 0e030b29c1 打印机部分修改 2024-10-11 14:51:27 +08:00
魏啾 eb11c3a082 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-10-11 10:55:40 +08:00
魏啾 ca496bf0db 按钮置灰 2024-10-11 10:55:28 +08:00
gyq 8d8def8e52 销售统计增加订单号 2024-10-11 09:41:48 +08:00
gyq 43d619f7bd Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-10 16:33:11 +08:00
gyq 5c10f30eae 优化 2024-10-10 16:33:02 +08:00
魏啾 6fb458b824 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-10-10 15:57:43 +08:00
魏啾 fb355a1913 商品分类和添加‘使用微信扫描二维码绑定订阅消息’ 2024-10-10 15:57:23 +08:00
gyq 64b4ebb88a Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-10 11:22:42 +08:00
gyq abd6385f02 优化店铺装修 2024-10-10 11:22:29 +08:00
魏啾 275cf34424 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-10-09 17:42:48 +08:00
魏啾 f6324f0cfe 销量统计 2024-10-09 17:42:13 +08:00
duan 089a92bcac Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-09 16:19:51 +08:00
duan f619a448b3 打印机优化 2024-10-09 16:19:34 +08:00
YeMingfei666 510039789a Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-09 15:05:34 +08:00
YeMingfei666 e8634dc187 代客下单获取masterId增加传参orderId 2024-10-09 15:04:27 +08:00
YeMingfei666 bd97ca779d 代客下单修改
台桌列表跳转到代客下单立即结账时使用当前台桌的masterId
2024-10-09 14:44:12 +08:00
duan d703e77ce7 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-09 14:13:14 +08:00
duan f3554b2b4a 修改打印机状态接口 2024-10-09 14:13:11 +08:00
魏啾 63f8aca317 商品分组修改 2024-10-09 13:58:30 +08:00
gyq 940ceee222 优化商品列表数据展示 2024-10-09 09:33:30 +08:00
gyq 44c2f6c3dd 商品列表新增时间筛选,增加库存预警,优化耗材绑定显示 2024-10-08 16:37:39 +08:00
gyq 976aecb7bf Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-10-08 15:25:43 +08:00
gyq 477906d4c5 优化商品列表 2024-10-08 15:25:33 +08:00
魏啾 b432b8b3b9 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-10-08 14:42:09 +08:00
魏啾 ab42e8d9f9 商品列表与订单列表的详情 2024-10-08 14:41:58 +08:00
duan df3546c378 员工权限颜色 2024-10-08 13:57:35 +08:00
gyq 544038bb36 优化首页销售趋势数据变化 2024-10-08 13:34:59 +08:00
YeMingfei666 89d5974fd2 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-10-08 10:56:44 +08:00
YeMingfei666 4056eae94f 代客下单增加根据店铺配置的就餐类型来判断该就餐类型是否可用 2024-10-08 09:53:00 +08:00
YeMingfei666 e6e0ecced6 代客下单增加用户扫描二维码支付 2024-09-29 10:01:05 +08:00
魏啾 a6b3d7c065 更改交班记录 2024-09-28 09:40:04 +08:00
YeMingfei666 b8e5751f30 代客下单增加限制无tableid时不发送修改就餐人数请求 2024-09-27 18:29:56 +08:00
魏啾 87f0b1131b 店铺管理添加两个支付宝参数 2024-09-27 18:03:37 +08:00
魏啾 d1b2739fc7 注释stockNumber 2024-09-27 16:00:38 +08:00
gyq 3ab87c6c29 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-09-27 15:51:46 +08:00
gyq 41fa886d23 优化 2024-09-27 15:51:37 +08:00
YeMingfei666 8562f2243a Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-27 13:49:15 +08:00
YeMingfei666 1acf00daab 代客下单增加单品备注,退客座费
台桌列表修改时间展示不足1分钟显示0分
2024-09-27 13:46:11 +08:00
gyq 89da9cc1fc Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-09-27 13:44:26 +08:00
gyq f0bca6e0d1 优化问题、更换接口 2024-09-27 13:44:17 +08:00
魏啾 bac738d80c 店铺设置>>通知中心>>下载图片 2024-09-27 11:18:06 +08:00
YeMingfei666 60bc61d40f 代客下单修改先付费页面逻辑样式 2024-09-27 09:39:25 +08:00
魏啾 fe6e6c2553 第三方配置支付宝appid 2024-09-26 18:04:38 +08:00
魏啾 5dc46dd622 Merge branch 'wwz' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-26 17:30:12 +08:00
魏啾 9215757381 订单列表中取消订单金额显示支付方式,耗材列表调整 2024-09-26 17:29:48 +08:00
duan e70518c81c Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-09-26 10:56:43 +08:00
duan a7083b85ab 打印机 2024-09-26 10:53:38 +08:00
YeMingfei666 a210389439 代客下单修复就餐人数问题,台桌人数限制问题 2024-09-25 14:50:09 +08:00
YeMingfei666 66e15de9eb 修改部分请求顺序 2024-09-25 14:32:44 +08:00
YeMingfei666 6f952970d6 代客下单修改部分代码逻辑 2024-09-25 09:58:38 +08:00
YeMingfei666 da70ad3aa6 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-25 08:59:14 +08:00
YeMingfei666 483d183a09 代客下单修复不必要的选择人数请求 2024-09-25 08:57:41 +08:00
YeMingfei666 2e1f6b133a 代客下单部分问题修复优化 2024-09-24 18:06:49 +08:00
YeMingfei666 34fc9c4ee1 代客下单从弹窗修改为页面,修改台桌列表弹窗为跳转,代客下单完毕后跳转至台桌页面 2024-09-24 17:56:03 +08:00
魏啾 41b5156605 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-09-24 16:16:13 +08:00
魏啾 2da14d86c2 更改路由背景颜色 2024-09-24 16:15:48 +08:00
duan 0420158601 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dwb 2024-09-24 15:38:18 +08:00
duan 5c8786a5c0 播报弹窗样式修改 2024-09-24 15:38:06 +08:00
gyq dc758120c4 优化登录页样式污染 2024-09-24 15:26:55 +08:00
gyq e5eeb7c1ce Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-09-24 15:13:13 +08:00
gyq d1893abd05 隐藏店铺配置的店铺装修 2024-09-24 15:13:05 +08:00
duan bb42d4cd59 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-24 13:57:44 +08:00
duan 1de4816ecc 添加菜单 2024-09-24 13:57:14 +08:00
gyq 19be296326 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-09-24 13:47:35 +08:00
gyq 5c47408c96 商品列表新增绑定耗材 2024-09-24 13:47:09 +08:00
duan c48b9f4ab3 员工编辑 2024-09-24 13:47:07 +08:00
YeMingfei666 264ac9bcc2 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-23 17:25:10 +08:00
YeMingfei666 148ac92e80 代客下单增加已开台台桌就餐方式 2024-09-23 17:23:24 +08:00
YeMingfei666 fc9b1dfda3 代客下单增加已开太台桌就餐方式 2024-09-23 17:22:01 +08:00
YeMingfei666 632ecda8e4 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-23 15:59:20 +08:00
YeMingfei666 3d75bbaaae 代客下单更新部分请求参数 2024-09-23 15:58:48 +08:00
duan 5db9cc69a3 排队bug修改 2024-09-23 14:03:56 +08:00
YeMingfei666 4d00346766 添加台桌增加提交限制 2024-09-23 11:23:50 +08:00
YeMingfei666 6afa9a3c48 代客下单修复
当点击仅下单时请求报错提示请选择就餐人数后。未改变订单请求状态导致点击无反应
2024-09-20 17:41:21 +08:00
gyq 899fd4b93d Merge branch 'gyq' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into test 2024-09-20 15:06:15 +08:00
魏啾 a979d390a3 Merge branch 'wwz' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-20 15:03:50 +08:00
gyq 673afeb5f3 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-09-20 15:03:44 +08:00
gyq e4e99585d4 优化店铺配置 2024-09-20 15:03:09 +08:00
魏啾 ce9799b290 耗材 2024-09-20 15:02:26 +08:00
duan 14395401db 排队 2024-09-20 11:26:51 +08:00
YeMingfei666 d6836d240c 代客下单修复多规格商品按钮禁用问题
增加用餐模式切换
2024-09-19 16:38:45 +08:00
YeMingfei666 5f1688173f 代客下单增加就餐类型切换 2024-09-19 10:53:03 +08:00
YeMingfei666 4fd8d61756 代客下单修改
当台桌为空闲时第一次选择就餐人数,当设置人数请求结束时再请求购物车数据
2024-09-14 14:55:12 +08:00
YeMingfei666 69d758ab68 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-14 13:37:42 +08:00
YeMingfei666 f83fc9da7e 修复台桌列表页面餐位费与代客下单不一致问题 2024-09-14 13:37:24 +08:00
YeMingfei666 56ad19d992 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-14 10:15:49 +08:00
YeMingfei666 7dbaf46d52 修改部分样式避免样式冲突 2024-09-14 10:15:35 +08:00
YeMingfei666 f2fdf03511 修改测试环境配置 2024-09-14 10:15:15 +08:00
YeMingfei666 353ead73f5 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-14 09:52:57 +08:00
YeMingfei666 76de94ee7c 台桌状态台桌清理中改为待清台 2024-09-13 16:15:55 +08:00
YeMingfei666 0f39d2cde1 台桌列表增加清台弹窗 2024-09-13 15:59:34 +08:00
YeMingfei666 f767d12f4a 代客下单增加台桌切换
当台桌切换时重新获取取餐码,购物车数据,订单数据,就餐人数
2024-09-13 15:05:59 +08:00
魏啾 b92b439028 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-13 11:31:43 +08:00
魏啾 5a51ab4ed5 商品列表第二遍 2024-09-13 11:30:11 +08:00
魏啾 31979af1ea Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-13 11:09:39 +08:00
魏啾 5e7f7faa1b 商品列表20240913 2024-09-13 11:09:35 +08:00
YeMingfei666 cf36010926 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-09-13 09:31:56 +08:00
YeMingfei666 61156edf85 代客下单增加支付订单时桌位费展示 2024-09-13 09:29:11 +08:00
gyq d61c0cbb22 店铺配置新增功能 2024-09-13 09:17:18 +08:00
YeMingfei666 f5df624f3e 代客下单增加退菜改购物车商品状态 2024-09-12 17:16:16 +08:00
YeMingfei666 3df43ddbaa 代客下单增加餐位费展示 2024-09-12 16:48:33 +08:00
YeMingfei666 c95c630a75 更新桌台列表页面
代客下单修改部分样式,修复创建订单后未刷新订单问题
2024-09-12 14:08:03 +08:00
gyq 24d6a192b1 1.优化后台样式
2.改版并对接新版数据统计页面
2024-09-12 08:53:44 +08:00
YeMingfei666 6795f2ccd3 代客下单增加退单,选择就餐人数,更改桌台, 修改样式
台桌列表增加改为批量增加
2024-09-11 18:14:40 +08:00
YeMingfei666 e59919c6f1 增加选择台桌和选择人数 2024-09-10 17:42:55 +08:00
YeMingfei666 3cc53ec6e1 处理打印机列表页面报错未定义name 2024-09-06 15:57:27 +08:00
YeMingfei666 a81c8b8352 将oss文件上传返回的http链接改为https链接 2024-09-06 13:59:00 +08:00
YeMingfei666 e6d421dfb1 增加上传文件取消提示 2024-09-06 13:37:14 +08:00
YeMingfei666 10ae05ce75 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-09-06 11:08:54 +08:00
YeMingfei666 5f8cecfa90 增加阿里云切片上传,版本管理文件上传切换为阿里云上传,增加上传进度条 2024-09-06 11:08:43 +08:00
gyq 97530fa0cf Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-09-05 16:19:08 +08:00
gyq f30f6332c9 pro增加预发布接口 2024-09-05 16:18:59 +08:00
YeMingfei666 050b13e2eb 版本管理修复重置按钮 2024-09-05 14:17:19 +08:00
YeMingfei666 d7b5a1329e 版本管理修改下载地址样式 2024-09-05 13:48:12 +08:00
YeMingfei666 fe90fd7fc2 版本管理限制上传exe文件 2024-09-05 13:41:52 +08:00
YeMingfei666 b8a08eea4f 修复版本管理编辑保存报错问题 2024-09-05 13:37:57 +08:00
YeMingfei666 ac11e23df5 封装请求增加取消请求方法 2024-09-05 13:37:22 +08:00
YeMingfei666 5c3028a2d2 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-09-05 11:11:38 +08:00
YeMingfei666 d88276f366 修复版本管理编辑报错 2024-09-05 11:06:13 +08:00
YeMingfei666 2a1422d281 代客下单增加扫码支付 2024-09-05 10:56:38 +08:00
gyq 433fa38c55 优化添加员工折扣比例 2024-09-05 09:47:26 +08:00
gyq 89a4ab2c72 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-09-05 09:42:25 +08:00
YeMingfei666 24a044427b 代客下单更新储值卡为扫码支付 2024-09-05 09:32:50 +08:00
YeMingfei666 178a06f2d7 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into test 2024-09-04 17:22:56 +08:00
YeMingfei666 37c1c9fa2b 增加扫码支付 2024-09-04 17:22:50 +08:00
duan 1cfec880ca 商品编辑和添加隐藏成本和售出 2024-09-03 16:18:25 +08:00
duan 8ae5c20714 修改商品编辑和添加页面的冲突 2024-09-03 16:04:14 +08:00
duan 299a38f3f9 商品编辑和添加表格隐藏原价和成本价 2024-09-03 16:02:58 +08:00
YeMingfei666 4fc08ca05a Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-09-03 09:24:42 +08:00
YeMingfei666 24db020363 修复商品编辑报错问题 2024-09-03 09:24:31 +08:00
YeMingfei666 7c777b72df 台桌列表样式调整 2024-09-02 18:30:03 +08:00
duan 3805882787 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into test 2024-09-02 17:25:41 +08:00
duan 0e50ec6998 余额列表 2024-09-02 17:25:26 +08:00
YeMingfei666 7a1122ece6 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-09-02 15:34:44 +08:00
YeMingfei666 234f070977 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-09-02 15:34:28 +08:00
YeMingfei666 7db7f0c463 代客下单
去除历史订单,创建订单增加状态,当状态完成时才继续允许请求
2024-09-02 15:34:06 +08:00
duan b9e41d220a 将通知中心,改成店铺配置 2024-09-02 14:29:30 +08:00
YeMingfei666 422a44ca15 更新版本上传文件接口 2024-09-02 11:13:44 +08:00
duan e2aa28b9d8 通知中心,修改字段名称 2024-09-02 10:36:57 +08:00
魏啾 d99fb079c0 更改商品添加初始化为undefined 2024-09-01 17:56:27 +08:00
YeMingfei666 d538252399 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-31 11:10:25 +08:00
YeMingfei666 d1317f9c7f 修改页面样式 2024-08-31 11:09:49 +08:00
YeMingfei666 c45f8a5f6a 代客下单
创建订单时增加如果是取单将取到订单id也歘传参
2024-08-31 11:09:37 +08:00
YeMingfei666 3070a5a6b4 增加一个图标 2024-08-31 11:07:18 +08:00
YeMingfei666 6def1406bb 台桌列表样式调整 2024-08-30 17:34:58 +08:00
YeMingfei666 f53f9b0f07 修改余额支付为会员支付 2024-08-30 17:34:38 +08:00
duan 38f8bd1ea9 隐藏余额列表 2024-08-30 17:07:41 +08:00
YeMingfei666 4748ea46e3 代客下单修复已下单菜品选中时再添加商品,未取消已下单菜品选中 2024-08-30 17:07:04 +08:00
YeMingfei666 16b49e08d2 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-30 17:00:51 +08:00
YeMingfei666 d889b9b1ad 代客下单增加历史订单,代码优化 2024-08-30 17:00:29 +08:00
YeMingfei666 eb7522c222 修改台桌状态,开台中时按钮展示加菜和结账 2024-08-30 16:59:12 +08:00
YeMingfei666 d5dd4d0915 代客下单备份 2024-08-30 16:37:38 +08:00
YeMingfei666 773af51758 修改判断商品是否可以下单 2024-08-30 16:37:19 +08:00
YeMingfei666 016bc3fc0c 商品库存修改库存关闭时的样式 2024-08-30 16:36:42 +08:00
YeMingfei666 2e154dd749 增加部分辅助类样式 2024-08-30 16:35:15 +08:00
duan aee738ca00 优化上线问题,安全设置等 2024-08-30 16:28:05 +08:00
duan ae6dcc295a 修改入参两端的空格 2024-08-30 09:16:32 +08:00
YeMingfei666 06e4292de8 代课下单修改折扣传参位数 2024-08-29 18:22:29 +08:00
YeMingfei666 36b307fbbe 代客下单增加折扣 2024-08-29 18:10:01 +08:00
YeMingfei666 891ab22903 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-29 13:53:41 +08:00
YeMingfei666 5292956f59 代客下单增加扫码支付退款弹窗 2024-08-29 13:53:27 +08:00
YeMingfei666 5b95ce2d56 修改会员支付为余额支付 2024-08-29 13:38:42 +08:00
YeMingfei666 97680afa8e 增加辅助类公共样式 2024-08-29 13:38:16 +08:00
YeMingfei666 d9c9e6ac9c 台桌列表和添加台桌
剔除旧的开台中状态
2024-08-29 09:29:26 +08:00
YeMingfei666 c887f48035 台桌管理-台桌列表修复
修复状态不存在时页面报错导致白屏
2024-08-29 09:24:27 +08:00
YeMingfei666 9aaeb7f0d6 管理后台系统管理-版本管理修改更新选中当前版本接口 2024-08-29 09:10:56 +08:00
YeMingfei666 7d3251f1d6 增加管理员版本管理页面 2024-08-28 18:30:33 +08:00
YeMingfei666 18b6509b26 过滤null商品 2024-08-28 18:30:02 +08:00
duan dfdfac7ca7 充值消费字段更改 2024-08-27 17:42:25 +08:00
duan a9ba6579fc Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-27 16:38:21 +08:00
duan 7876ed1c11 任务id1000083 完成率80% 2024-08-27 16:38:11 +08:00
YeMingfei666 83d0c54717 修改商品绑定耗材选
择商品和耗材的弹窗设置最大高度
2024-08-27 16:22:56 +08:00
YeMingfei666 1516b84c42 修复代课下单商品搜索问题 2024-08-27 15:56:27 +08:00
duan a0cad20d31 合并代码 2024-08-27 15:43:02 +08:00
YeMingfei666 f5b36c5f0e 耗材列表所属商品样式修复 2024-08-27 15:36:59 +08:00
YeMingfei666 1d1dabf492 修复耗材列表所属商品不换行问题 2024-08-27 15:22:03 +08:00
YeMingfei666 445a2caab8 进销存绑定商品增加
选择商品弹窗关闭重置表格的选中
2024-08-27 13:57:06 +08:00
YeMingfei666 f05c49232a Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-27 11:13:45 +08:00
YeMingfei666 98aee65db7 修改商品绑定耗材提交的id字段 2024-08-27 11:13:07 +08:00
YeMingfei666 f66d4655d1 修改商品绑定耗材提交的id字段 2024-08-27 11:10:51 +08:00
duan aa8d1b76e4 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-27 10:58:17 +08:00
duan c5ec0da61c 修改充值文字。增减余额 2024-08-27 10:58:09 +08:00
YeMingfei666 483ff5d234 修改台桌裂变编辑状态为仅编辑时出现 2024-08-26 17:56:02 +08:00
YeMingfei666 da29e0b249 台桌列表增加编辑台桌里可修改台桌状态 2024-08-26 17:52:39 +08:00
YeMingfei666 c70a6b2f68 代客人下单增加过滤掉下架的单规格商品 2024-08-26 17:51:59 +08:00
gyq 07a3c8e5f4 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-08-26 17:06:07 +08:00
gyq 9d8e1e1bf2 更新员工优惠折扣 2024-08-26 17:05:58 +08:00
YeMingfei666 770c369ebd Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-26 11:15:34 +08:00
YeMingfei666 711bd0ca77 代客下单修复购物车里商品输入框输入数量数据未更新问题 2024-08-26 11:15:23 +08:00
duan 7542134ac7 余额增减修改输入小数点 2024-08-26 10:37:17 +08:00
duan 71b6d1929b Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-26 10:14:57 +08:00
duan 30656b3005 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-26 10:14:47 +08:00
duan 2fe66b28a8 修改显示余额 2024-08-26 10:14:36 +08:00
YeMingfei666 5e14f29ecb 代客下单修改是否售尽判断 2024-08-26 09:51:03 +08:00
YeMingfei666 f2c73eca9a 代客下单
1.增加删除挂单判断当前挂单是否为当前订单
2.修复备注问题
2024-08-23 18:14:37 +08:00
YeMingfei666 ec75feddce 代客下单修复
确认挂单后再操作购物车再次存单时挂单列表数据未更新
2024-08-23 16:17:09 +08:00
YeMingfei666 423ad16727 代客下单
1.增加确认此单不删除本地订单
2.修改部分样式
2024-08-23 15:48:10 +08:00
YeMingfei666 963c1c81ba 代客下单修改部分样式 2024-08-23 15:28:08 +08:00
YeMingfei666 ab7c61231b 修改页面布局,增加全屏退出全屏功能 2024-08-23 15:22:19 +08:00
YeMingfei666 4c2d88ed99 修改会员余额支付文字为会员支付 2024-08-23 15:21:51 +08:00
YeMingfei666 d275c5ea3c Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-23 14:32:07 +08:00
YeMingfei666 eaaf7f5c60 代客下单挂单增加参数tableID 2024-08-23 14:22:04 +08:00
YeMingfei666 335d604f5f 代客下单增加结账金钱输入键盘 2024-08-23 13:57:53 +08:00
YeMingfei666 34f18e0e07 代客下单增加关台时禁止点餐 2024-08-23 13:57:23 +08:00
gyq d0f567209b Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-08-23 13:56:01 +08:00
gyq f5b364b0f3 添加员工新增优惠类型 2024-08-23 13:55:50 +08:00
duan ccd66bd2be 修改vip颜色 2024-08-23 11:45:54 +08:00
duan 82624d49b5 优化 2024-08-23 10:38:05 +08:00
YeMingfei666 d64555e905 暂时隐藏充值按钮 2024-08-23 10:21:10 +08:00
YeMingfei666 052d06bb75 增加会员余额支付方式 2024-08-23 10:20:52 +08:00
YeMingfei666 b0811452a4 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-23 09:57:43 +08:00
duan dfc9667c90 修改活动管理编辑-是否赠送商品开关入参类型 2024-08-22 16:39:16 +08:00
YeMingfei666 5d1961d772 代客下单更新
1.筛选时去除头尾空格来匹配
2024-08-22 16:02:03 +08:00
YeMingfei666 a14a9877c2 代客下单修改
1.默认布局更改为图片文字布局
2.增加选择用户时点击用户或者选择都可选择用户
2024-08-22 14:20:42 +08:00
YeMingfei666 dba71a0f11 Merge branch 'test' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-22 09:34:42 +08:00
YeMingfei666 9e4eaf1ebc 代客下单修改文字布局售完展示样式 2024-08-22 09:30:58 +08:00
YeMingfei666 f07b6ec29b 增加不同布局售尽样式 2024-08-21 18:26:30 +08:00
YeMingfei666 3f8a41f694 代客下单增加开台中状态 2024-08-21 15:55:11 +08:00
YeMingfei666 0b3084a3f9 代客下单后付款修复 2024-08-21 15:36:23 +08:00
YeMingfei666 0a36882c8b 代客下单增加先付费后付费选择 2024-08-21 15:23:10 +08:00
YeMingfei666 18c2c68c9f 更新客下单支付订单 2024-08-21 13:44:39 +08:00
YeMingfei666 1bc4cf134c 代客下单增加下单关闭回调,当点餐页面关闭刷新桌台状态 2024-08-21 13:30:09 +08:00
YeMingfei666 8a84a99272 代课下单代码优化,修复部分问题 2024-08-21 10:58:57 +08:00
duan 37f7e51f69 优化和会员问题 2024-08-21 08:58:08 +08:00
YeMingfei666 555d0ebaa0 代课下单修改存单取单以及用户切换时masterid相关逻辑
当是取出的订单状态时使用订单的masterID
2024-08-20 17:46:25 +08:00
duan baa60b0021 Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-20 16:58:20 +08:00
duan c563f646cc Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-20 16:58:07 +08:00
duan 39ec8a57cb Merge branch 'test' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into test 2024-08-20 16:57:45 +08:00
duan 1fde054290 用户编辑和余额增加减 2024-08-20 16:57:26 +08:00
YeMingfei666 977b2e5cd7 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-08-20 16:47:42 +08:00
YeMingfei666 5575b4be9d 代客下单增加更新规格限制 2024-08-20 16:45:13 +08:00
GYJ c39792a0f6 活动页面增加自定义充值金额开关 2024-08-20 10:24:14 +08:00
YeMingfei666 28750b0a2d 代课下单增加多规格下架过滤 2024-08-20 09:52:22 +08:00
YeMingfei666 bcd5458db3 代客下单确认此单将masterid改为改订单的 2024-08-19 18:28:57 +08:00
YeMingfei666 0ae2fbe11b 代课下单-修改取消挂单 2024-08-19 18:03:33 +08:00
duan c51d5cd064 广告功能 2024-08-19 17:54:21 +08:00
YeMingfei666 daa8de48b3 代课下单增加切换用户时逻辑
1.获取新的取餐码
2.更新用户id
2024-08-19 17:37:22 +08:00
YeMingfei666 51e410a4be 修改代课下单本地测试环境 2024-08-19 17:15:00 +08:00
YeMingfei666 e0be30bd02 台桌列表-代课下单禁止修改桌台号 2024-08-17 18:02:38 +08:00
YeMingfei666 4977dcb76b 增加代客下单功能 2024-08-17 17:57:59 +08:00
duan 13df97b949 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-17 16:06:06 +08:00
duan 44e15448d9 耗材列表盘点 2024-08-17 16:05:41 +08:00
duan 21a9548e45 添加赠送商品 2024-08-16 15:23:14 +08:00
duan ce546e09b2 修改所属商品字段 2024-08-16 15:22:29 +08:00
duan b3a48a68af 售卖时间管控 2024-08-15 16:04:22 +08:00
duan 611194b587 售卖时间管控 2024-08-15 15:50:43 +08:00
duan 0bccf5db8a 总的统计未携带分类参数 2024-08-15 13:47:08 +08:00
duan 3b7dbe50a2 将耗材记录加入到耗材列表里 2024-08-14 16:02:52 +08:00
duan 1e52030f5e 通知中心 2024-08-12 15:54:16 +08:00
duan b1bf21ccad 图库修改样式 2024-08-09 16:48:58 +08:00
魏啾 681d1c2c07 选择耗材 2024-08-09 15:01:58 +08:00
魏啾 7733dcf4e9 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-08-09 14:06:16 +08:00
魏啾 5fc9443a4b 选择耗材 2024-08-09 14:06:02 +08:00
duan 2292bd6b82 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-09 11:17:21 +08:00
duan 25b348ee12 修改样式 2024-08-09 11:17:10 +08:00
魏啾 14462f98ab 更改总数数量 2024-08-09 10:54:27 +08:00
duan b6b80c3d43 修改图片 2024-08-09 09:48:06 +08:00
duan c4b734ce12 优化样式 2024-08-08 14:28:45 +08:00
duan 69b19bfade 修改添加商品问题 2024-08-08 14:23:10 +08:00
duan 8c0ca8869a 图片样式优化 2024-08-08 11:27:54 +08:00
duan 4ab685fac3 编辑商品的问题 2024-08-08 10:50:33 +08:00
魏啾 87d2f8a7bb Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-08-08 09:38:35 +08:00
魏啾 81f5c68fa7 出库入库修改 2024-08-08 09:38:23 +08:00
duan 9a55093516 商品单规格和多规格之间切换 2024-08-08 09:11:20 +08:00
duan 3b12a2ba06 更改图库功能 2024-08-07 15:51:33 +08:00
duan 7f54c59092 图库上传bug 2024-08-07 11:44:05 +08:00
duan 5377a76365 修改图库BUG 2024-08-07 09:41:13 +08:00
魏啾 d0cc82fdf5 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-08-07 09:12:00 +08:00
duan d1ef6fefa0 修改BUG 2024-08-06 17:56:29 +08:00
duan 6c4e992283 商品分页 2024-08-06 15:05:29 +08:00
duan 0971b67010 添加商品列表分页功能 2024-08-06 15:00:49 +08:00
duan 1d39576b34 商品列表-商品图片-选择图片增删改 2024-08-06 13:45:06 +08:00
魏啾 e38545be2d 交班时间 营业时间 2024-08-05 17:01:34 +08:00
魏啾 79e1282c68 11 2024-08-05 15:12:49 +08:00
gyq e67e3525e4 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-08-03 18:11:19 +08:00
gyq 7427e2d913 耗材盘点传参更新,新增stockNumber 2024-08-03 18:11:14 +08:00
YeMingfei666 01c4c17d30 进销存商品绑定耗材已选择耗材后展示为黑色文字 2024-08-03 17:03:59 +08:00
gyq 671159277c 交班记录新增sort字段 2024-08-03 16:55:20 +08:00
gyq b495926968 1.新增修改密码 2.取消出入库供应商校验 2024-08-03 16:49:57 +08:00
duan 6830529769 提出报错插件 2024-08-02 15:15:42 +08:00
gyq 4a6c0ca71d Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-08-02 15:12:08 +08:00
gyq 07551be485 更新商品设置热门 2024-08-02 15:11:27 +08:00
duan 64d321508e Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-08-02 15:06:51 +08:00
duan d8cac655a4 图库选择50% 2024-08-02 15:06:35 +08:00
duan 9a75cb474e 修改热门接口参数 2024-08-02 15:04:43 +08:00
gyq 744632324b 优化起售数量最低1 2024-08-02 10:41:44 +08:00
gyq 0a1af58fcd 优化编辑商品 2024-08-01 15:52:33 +08:00
duan 5bc744872b 拉取DEV代码 2024-08-01 15:50:15 +08:00
duan 2acf054b86 素材库添加-未完成 2024-08-01 15:48:45 +08:00
gyq 7de5f566b0 优化商品编辑 2024-08-01 15:29:30 +08:00
gyq 4818e2e927 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-07-30 16:00:13 +08:00
gyq 5d3fdd5acf 登录新增类型 2024-07-30 16:00:08 +08:00
魏啾 c505674e36 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into wwz 2024-07-30 15:46:26 +08:00
魏啾 20ed539215 交班记录 2024-07-30 15:46:14 +08:00
魏啾 9317ec1dfa 交班记录 2024-07-30 15:46:02 +08:00
gyq d8b9d01aa7 进销存-操作出库记录中的耗材出库记录现有库存字段精度显示小数位数过多 2024-07-30 13:51:04 +08:00
gyq 77f75bbbeb 修复出入库类型错误 2024-07-29 17:47:57 +08:00
gyq bf0da42707 1.限制添加员工优惠金额最大10W 2024-07-29 15:04:26 +08:00
gyq f6a37259bb 添加员工,角色修改为必填项 2024-07-29 13:32:41 +08:00
YeMingfei666 8d5a54fe6f 添加商品页面增加商品备注,增加批量修改范围限制,修复批量修改时数据变化视图未更新问题 2024-07-26 14:12:41 +08:00
YeMingfei666 432ba32b4e Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-07-26 13:43:08 +08:00
YeMingfei666 0ce365bbe8 进销存-商品库存-详情记录增加规格名称 2024-07-26 13:42:49 +08:00
gyq 502a18d5a3 添加员工设置密码 2024-07-26 11:14:59 +08:00
gyq b88ae01878 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-07-26 09:46:33 +08:00
gyq 617dd317d3 店铺管理新增员工列表 2024-07-26 09:46:25 +08:00
YeMingfei666 b08e7edfa2 Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-25 14:57:27 +08:00
YeMingfei666 fa84f836ed Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-25 14:57:01 +08:00
duan ee5178ccfe 上架多规格的子集没有, 2024-07-25 14:55:01 +08:00
YeMingfei666 a7c2194ec2 去除在保留两位小数时的四舍五入 2024-07-25 14:35:09 +08:00
YeMingfei666 3ea8aeab34 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-25 13:59:57 +08:00
YeMingfei666 79a0a2c1a2 去除添加商品打包费,虚拟销量输入时的最小值为0限制,改为输入完成后验证 2024-07-25 13:56:53 +08:00
YeMingfei666 6aea8a9c8e 优化-增加商品添加时数字输入框如果输入值超范围时重置数据的弹窗提醒 2024-07-25 13:52:30 +08:00
YeMingfei666 0122589289 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-25 11:33:38 +08:00
YeMingfei666 51c9c9e15c Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-07-25 11:33:07 +08:00
YeMingfei666 016ebf7b62 商品管理-商品列表增加商品时对价格金额数量进行限制和数字格式化 2024-07-25 11:32:37 +08:00
duan dbe8167822 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-07-24 17:04:04 +08:00
duan a6d3d4afbe 多规格上架按钮隐藏 2024-07-24 17:03:41 +08:00
YeMingfei666 54d06b72fe 修改商品管理-商品分组编辑商品分组后未将id置空问题 2024-07-24 10:54:53 +08:00
YeMingfei666 347f58828d 修改进销存操作记录,当返回数据不包含number字段时返回空字符串 2024-07-24 09:22:45 +08:00
YeMingfei666 72778ed68b 进销存操作记录修改回根据后台返回数据计算 2024-07-23 18:30:11 +08:00
YeMingfei666 3532d8dbf4 更改进销存操作记录为后台返回subType值,根据改值判断加减 2024-07-23 18:18:32 +08:00
YeMingfei666 c1beec0efc 优化耗材管理绑定商品页面同商品不同规格绑定耗材时未重置选中耗材 2024-07-23 18:09:43 +08:00
YeMingfei666 3ae0d7991b Merge branch 'dev' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into ymf 2024-07-23 17:21:53 +08:00
YeMingfei666 496389f8bc 修改耗材管理-绑定商品绑定耗材提交的数据结构,修改筛选耗材输入id为选择分类 2024-07-23 17:21:00 +08:00
gyq aa7a672e87 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-07-23 17:12:16 +08:00
gyq dcb2eb36ea 优化编辑商品起售数量不显示和库存数量显示不准确 2024-07-23 17:12:11 +08:00
duan 04d23793d1 Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dwb 2024-07-23 17:03:26 +08:00
duan 6cbf407b88 扩展资料 2024-07-23 17:03:16 +08:00
YeMingfei666 a6d90bf36e Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-23 15:03:07 +08:00
YeMingfei666 7b679fb415 修复在查询耗材流水信息里时返回的商品id为null时报错导致耗材记录列表不显示的情况 2024-07-23 15:01:25 +08:00
duan 6f15f226ee Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-23 10:16:10 +08:00
duan 1ca47334f6 优化问题 2024-07-23 10:15:30 +08:00
gyq 52ed7edf08 优化出库入库数量限制 2024-07-22 17:13:44 +08:00
duan 2be2df7bc4 上架 2024-07-22 14:24:13 +08:00
duan e335d634da Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-22 13:59:25 +08:00
duan fa27401152 上架 2024-07-22 13:59:09 +08:00
duan 29affe432a 盘点备注 2024-07-22 13:57:12 +08:00
YeMingfei666 9479f1c987 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-22 13:50:35 +08:00
YeMingfei666 30b309dcf3 增加耗材分类名称禁止输入空格 2024-07-22 13:49:33 +08:00
duan 3ea683b7bd 合并 2024-07-22 13:34:32 +08:00
duan aaea042bca Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-22 10:32:49 +08:00
YeMingfei666 4bffe64149 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-22 10:22:58 +08:00
YeMingfei666 9de4251981 操作入库选择多规格商品后商品名称后面追加规格名称 2024-07-22 10:22:23 +08:00
duan 33e2e7b761 扩展参数 2024-07-22 10:10:15 +08:00
YeMingfei666 dd7f4c32ac Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-20 18:33:50 +08:00
YeMingfei666 ecf800bf76 更新耗材修改单位 2024-07-20 18:33:18 +08:00
YeMingfei666 a059e97a45 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-20 18:22:51 +08:00
YeMingfei666 000def6dc2 更新修改耗材信息提交数据格式 2024-07-20 18:22:11 +08:00
YeMingfei666 a53c688513 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-20 17:59:27 +08:00
YeMingfei666 949a310c71 更新样式 2024-07-20 17:58:59 +08:00
YeMingfei666 fb63eabb33 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-20 17:49:42 +08:00
YeMingfei666 a427cfff76 修复耗材记录服务器上居中失效 2024-07-20 17:49:11 +08:00
YeMingfei666 f3faa70c59 Merge branch 'ymf' of https://e.coding.net/g-cphe0354/yinshoukeguanliduan/management into dev 2024-07-20 17:43:59 +08:00
YeMingfei666 015ca6ae4e 更新耗材记录所属商品 2024-07-20 17:41:54 +08:00
YeMingfei666 bb2e166af2 更新耗材 2024-07-20 17:35:55 +08:00
YeMingfei666 97685234d4 耗材记录增加所属商品,样式居中 2024-07-20 17:33:30 +08:00
YeMingfei666 914a6389e7 删除测试数据 2024-07-20 17:31:53 +08:00
YeMingfei666 1a4eb34824 订单列表增加备注 2024-07-20 15:53:05 +08:00
YeMingfei666 3888b95248 删除耗材类型代码 2024-07-20 15:16:38 +08:00
gyq fcae02fe4a Merge branch 'dev' of e.coding.net:g-cphe0354/yinshoukeguanliduan/management into gyq 2024-07-19 18:21:03 +08:00
gyq 63effa002d 优化 2024-07-19 18:20:57 +08:00
YeMingfei666 f13dbd580a 增加耗材单位 2024-07-19 17:56:50 +08:00
YeMingfei666 58bf05d7c4 修改部分样式 2024-07-19 09:04:36 +08:00
YeMingfei666 cc32bc79a3 修改选择耗材弹窗样式 2024-07-18 18:16:23 +08:00
YeMingfei666 e7ff989d03 修复样式问题 2024-07-18 18:05:18 +08:00
YeMingfei666 2f0006571f 修改耗材绑定商品 2024-07-18 17:31:38 +08:00
YeMingfei666 5d0bbba194 耗材修改 2024-07-17 18:28:18 +08:00
duan 7cadb25712 从商品库存-库存记录-点击订单号跳转过来 2024-07-17 18:06:13 +08:00
duan cfa32e18ba 安全信息保存后重置 2024-07-15 10:35:35 +08:00
魏啾 abe786d155 page 改为30 2024-07-14 11:04:06 +08:00
212 changed files with 52351 additions and 2913 deletions

View File

@ -6,6 +6,9 @@ ENV = 'development'
# VUE_APP_BASE_API = 'http://192.168.2.133:8000' # VUE_APP_BASE_API = 'http://192.168.2.133:8000'
# 测试 # 测试
VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn' VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn'
#预发布
# VUE_APP_BASE_API = 'https://pre-cashieradmin.sxczgkj.cn'
# 生产 # 生产
# VUE_APP_BASE_API = 'https://cashieradmin.sxczgkj.cn' # VUE_APP_BASE_API = 'https://cashieradmin.sxczgkj.cn'
# VUE_APP_BASE_API = 'http://192.168.2.96:8000' # VUE_APP_BASE_API = 'http://192.168.2.96:8000'
@ -13,4 +16,5 @@ VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn'
# VUE_APP_BASE_API = 'http://192.168.2.147:8000/' # VUE_APP_BASE_API = 'http://192.168.2.147:8000/'
VUE_APP_WS_API = 'ws://192.168.2.128:8000' VUE_APP_WS_API = 'ws://192.168.2.128:8000'
VUE_APP_PHP_API = 'https://kysh.sxczgkj.cn'
# 是否启用 babel-plugin-dynamic-import-node插 # 是否启用 babel-plugin-dynamic-import-node插

View File

@ -3,9 +3,16 @@ ENV = 'production'
# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇Nginx 配置 # 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇Nginx 配置
# 接口地址,注意协议,如果你没有配置 ssl需要将 https 改为 http # 接口地址,注意协议,如果你没有配置 ssl需要将 https 改为 http
# 测试 # 测试
VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn' # VUE_APP_BASE_API = 'https://admintestpapi.sxczgkj.cn'
# 生产 # 生产
# VUE_APP_BASE_API = 'https://cashieradmin.sxczgkj.cn' # VUE_APP_BASE_API = 'https://cashieradmin.sxczgkj.cn'
# 预发布接口
VUE_APP_BASE_API = 'https://pre-cashieradmin.sxczgkj.cn'
# VUE_APP_BASE_API = 'http://192.168.2.98:8000' # VUE_APP_BASE_API = 'http://192.168.2.98:8000'
# 如果接口是 http 形式, wss 需要改为 ws # 如果接口是 http 形式, wss 需要改为 ws
VUE_APP_WS_API = 'wss://123.56.110.252 VUE_APP_WS_API = 'wss://123.56.110.252'
VUE_APP_PHP_API = 'https://kysh.sxczgkj.cn/source'

View File

@ -24,6 +24,7 @@
}, },
"dependencies": { "dependencies": {
"@riophae/vue-treeselect": "^0.4.0", "@riophae/vue-treeselect": "^0.4.0",
"ali-oss": "^6.21.0",
"axios": "^0.21.1", "axios": "^0.21.1",
"clipboard": "2.0.4", "clipboard": "2.0.4",
"codemirror": "^5.49.2", "codemirror": "^5.49.2",
@ -39,6 +40,7 @@
"js-md5": "^0.8.3", "js-md5": "^0.8.3",
"jsencrypt": "^3.0.0-rc.1", "jsencrypt": "^3.0.0-rc.1",
"jszip": "^3.7.1", "jszip": "^3.7.1",
"lodash": "^4.17.21",
"material-components-vue": "^1.2.0", "material-components-vue": "^1.2.0",
"mavon-editor": "^2.9.1", "mavon-editor": "^2.9.1",
"normalize.css": "7.0.0", "normalize.css": "7.0.0",

View File

@ -131,4 +131,14 @@ export default {
} }
} }
} }
.image-slot {
width: 100%;
height: 100%;
background-color: #efefef;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
}
</style> </style>

View File

@ -124,3 +124,50 @@ export function countRecord(data) {
} }
}); });
} }
/**
* 广告列表
* @returns
*/
export function adget(params) {
return request({
url: "/api/ad",
method: "get",
params
});
}
/**
* 广告新增单位
* @returns
*/
export function adpost(data) {
return request({
url: `/api/ad`,
method: "post",
data
});
}
/**
* 广告编辑详情
* @returns
*/
export function adput(data) {
return request({
url: '/api/ad',
method: 'put',
data
})
}
/**
* 广告删除商品
* @returns
*/
export function addelete(params) {
return request({
url: "/api/ad/" + params,
method: "DELETE",
});
}

33
src/api/bwc.js Normal file
View File

@ -0,0 +1,33 @@
import request from '@/utils/request'
export function get(params) {
return request({
url: '/freeDine',
method: 'get',
params
})
}
export function add(data) {
return request({
url: 'api/botUser',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: 'api/botUser/',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: '/freeDine',
method: 'put',
data
})
}
export default { add, edit, del, get }

32
src/api/class-api.js Normal file
View File

@ -0,0 +1,32 @@
import request from '@/utils/request'
class API {
constructor(url, req) {
const map = {
add: 'POST',
del: 'DELETE',
update: 'PUT',
get: 'GET'
}
this.url = url
for (let key in map) {
this[key] = function (data) {
data = Array.isArray(data) ? data : {
...data, shopId: localStorage.getItem("shopId"),
}
if (key === 'del') {
delete data.shopId
}
const par={ url, method: map[key] }
if(key==='get'){
par.params=data
}else{
par.data=data
}
return request(par)
}
}
}
}
export default API

View File

@ -5,11 +5,11 @@ import request from "@/utils/request";
* @returns * @returns
*/ */
export function gettbConsType(params) { export function gettbConsType(params) {
return request({ return request({
url: '/api/tbConsType', url: "/api/tbConsType",
method: "get", method: "get",
params params
}); });
} }
/** /**
@ -17,66 +17,67 @@ export function gettbConsType(params) {
* @returns * @returns
*/ */
export function posttbConsType(data) { export function posttbConsType(data) {
return request({ return request({
url: '/api/tbConsType', url: "/api/tbConsType",
method: "post", method: "post",
data data
}); });
} }
/** /**
* 修改耗材类型 * 修改耗材类型
* @returns * @returns
*/ */
export function puttbConsType(data) { export function puttbConsType(data) {
return request({ return request({
url: '/api/tbConsType', url: "/api/tbConsType",
method: "put", method: "put",
data data
}); });
} }
/** /**
* 查询耗材信息 * 查询耗材信息
* @returns * @returns
*/ */
export function gettbConsInfo(params) { export function gettbConsInfo(data) {
return request({ return request({
url: '/api/tbConsInfo', url: "/api/tbConsInfo/allAndPro",
method: "get", method: "post",
params data
}); });
} }
/** /**
* 耗材入库 * 耗材入库
* @returns * @returns
*/ */
export function posttbConsInfostockIn(data) { export function posttbConsInfostockIn(data) {
return request({ return request({
url: '/api/tbConsInfo/stockIn', url: "/api/tbConsInfo/stockIn",
method: "post", method: "post",
data data
}); });
} }
/** /**
* 修改单位耗材值耗材 * 修改单位耗材值耗材
* @returns * @returns
*/ */
export function postapitbConsInfo(data) { export function postapitbConsInfo(data) {
return request({ return request({
url: '/api/tbConsInfo', url: "/api/tbConsInfo",
method: "put", method: "put",
data data
}); });
} }
/** /**
* 新增耗材信息 * 新增耗材信息
* @returns * @returns
*/ */
export function posttbConsInfo(data) { export function posttbConsInfo(data) {
return request({ return request({
url: '/api/tbConsInfo', url: "/api/tbConsInfo",
method: "post", method: "post",
data data
}); });
} }
/** /**
@ -84,55 +85,55 @@ export function posttbConsInfo(data) {
* @returns * @returns
*/ */
export function getviewConSku(params) { export function getviewConSku(params) {
return request({ return request({
url: '/api/viewConSku', url: "/api/viewConSku",
method: "get", method: "get",
params params
}); });
} }
/** /**
* 查询查询商品规格 * 查询查询商品规格
* @returns * @returns
*/ */
export function gettbProductSpec(params) { export function gettbProductSpec(params) {
return request({ return request({
url: '/api/viewProductSkuShop', url: "/api/viewProductSkuShop",
method: "get", method: "get",
params params
}); });
} }
/** /**
* 新增商品规格耗材信息 * 新增商品规格耗材信息
* @returns * @returns
*/ */
export function posttbProskuCon(data) { export function posttbProskuCon(data) {
return request({ return request({
url: '/api/tbProskuCon', url: "/api/tbProskuCon",
method: "post", method: "post",
data data
}); });
} }
/** /**
* 新增商品规格耗材信息-修改后 * 新增商品规格耗材信息-修改后
* @returns * @returns
*/ */
export function posttbProskuCons(data) { export function posttbProskuCons(data) {
return request({ return request({
url: '/api/tbProskuCon', url: "/api/tbProskuCon",
method: "post", method: "post",
data data
}); });
} }
/** /**
* 修改商品规格耗材信息状态 * 修改商品规格耗材信息状态
* @returns * @returns
*/ */
export function puttbProskuCon(data) { export function puttbProskuCon(data) {
return request({ return request({
url: '/api/tbProskuCon', url: "/api/tbProskuCon",
method: "put", method: "put",
data data
}); });
} }
// 编辑单位耗材值 // 编辑单位耗材值
// export function puttbProskuCon(data) { // export function puttbProskuCon(data) {
@ -147,20 +148,83 @@ export function puttbProskuCon(data) {
* @returns * @returns
*/ */
export function deletetbProskuCon(data) { export function deletetbProskuCon(data) {
return request({ return request({
url: '/api/tbProskuCon', url: "/api/tbProskuCon",
method: "delete", method: "delete",
data data
}); });
}
/**
* 查询耗材单位列表
*/
export function queryTbConUnitInfo(data) {
return request({
url: "/api/tbConUnit/queryTbConUnitInfo",
method: "get",
params: {
shopId: localStorage.getItem("shopId"),
...data
}
});
}
/**
* 新增耗材单位
*/
export function addtbConUnit(data) {
return request({
url: "/api/tbConUnit",
method: "post",
data: {
shopId: localStorage.getItem("shopId"),
...data
}
});
}
/**
* 修改耗材单位
*/
export function edittbConUnit(data) {
return request({
url: "/api/tbConUnit",
method: "put",
data: {
shopId: localStorage.getItem("shopId"),
...data
}
});
}
/**
* 绑定关系
*/
export function tbProskuConV2(data) {
return request({
url: "/api/tbProskuCon/V2",
method: "post",
data
});
} }
/** /**
* 查询耗材流水信息 * 耗材库存统计
* @returns
*/ */
export function gettbConsInfoFlow(params) { export function tbConsInfoFlowcount(data) {
return request({ return request({
url: '/api/tbConsInfoFlow', url: "/api/tbConsInfoFlow/count",
method: "get", method: "post",
params data
}); });
}
/**
* 耗材库存记录列表
*/
export function tbConsInfoFlowstock(data) {
return request({
url: "/api/tbConsInfoFlow/stock",
method: "post",
data
});
} }

79
src/api/coupon.js Normal file
View File

@ -0,0 +1,79 @@
import request from '@/utils/request'
/**
* 获取优惠券列表
* @returns
*/
export function getTbShopCoupon(params) {
return request({
url: '/api/tbShopCoupon',
method: 'get',
params: {
...params
}
})
}
/**
* 获取优惠券详情
* @returns
*/
export function getTbShopCouponInfo(id) {
return request({
url: '/api/tbShopCoupon/' + id,
method: 'get',
params: {}
})
}
/**
* 增加优惠券
* @returns
*/
export function addTbShopCoupon(params) {
return request({
url: '/api/tbShopCoupon',
method: 'post',
data: {
...params
}
})
}
/**
* 删除优惠券
* @returns
*/
export function delTbShopCoupon(params) {
return request({
url: '/api/tbShopCoupon',
method: 'delete',
data: params
})
}
/**
* 获取领取列表
* @returns
*/
export function queryReceive(params) {
return request({
url: '/api/tbShopCoupon/queryReceive',
method: 'post',
data: {
...params
}
})
}
/**
* 获取领取列表
* @returns
*/
export function delReceive(params) {
return request({
url: '/api/tbShopCoupon/receive',
method: 'delete',
data: params
})
}

View File

@ -1,7 +1,7 @@
import request from '@/utils/request' import request from '@/utils/request'
/** /**
* 增加打印机
* @returns * @returns
*/ */
export function tbPrintMachine(data, method = 'post') { export function tbPrintMachine(data, method = 'post') {
@ -14,19 +14,58 @@ export function tbPrintMachine(data, method = 'post') {
} }
}) })
} }
// 打印机切换
export function switchtbPrintMachine(data, method = 'post') {
return request({
url: '/api/shop-config/printer/update-status',
method: method,
data: {
shopId: localStorage.getItem('shopId'),
...data
}
})
}
// 打印机部分
export function tbShopCategory(params) {
return request({
url: '/api/tbShopCategory',
method: 'get',
params
})
}
/** /**
* 打印机列表 * 打印机列表
* @returns * @returns
*/ */
export function tbPrintMachineGet(params) { export function tbPrintMachineGet(params) {
return request({ return request({
url: '/api/tbPrintMachine', url: '/api/shop-config/printer/list',
method: 'get', method: 'get',
params: { params: {
shopId: localStorage.getItem('shopId'),
sort: '',
...params ...params
} }
}) })
} }
// 删除
export function delTableHandle(id) {
return request({
url: '/api/shop-config/printer/' + id,
method: 'DELETE',
})
}
// * 打印机详情
export function printerd(id) {
return request({
url: '/api/shop-config/printer/' + id,
method: 'get',
})
}
// 编辑 新增打印机
export function configprinter(data, method = "post") {
return request({
url: `/api/shop-config/printer`,
method: method,
data
});
}

58
src/api/extend.js Normal file
View File

@ -0,0 +1,58 @@
import request from "@/utils/request";
import editor from "mavon-editor";
/**
* 列表
* @returns
*/
export function tbShopExtend(params) {
return request({
url: "/tbShopExtend",
method: "get",
params
});
}
/**
* 新增单位
* @returns
*/
export function addtbShopExtend(data) {
return request({
url: `/tbShopExtend`,
method: "post",
data
});
}
/**
* 编辑详情
* @returns
*/
export function edittbShopExtend(data) {
return request({
url: '/tbShopExtend',
method: 'put',
data
})
}
/**
* 查询详情
* @returns
*/
export function querytbShopExtend(params) {
return request({
url: `/tbShopExtend/` + params,
method: "get",
});
}
/**
* 删除商品
* @returns
*/
export function deletetbShopExtend(params) {
return request({
url: "/tbShopExtend",
method: "delete",
params
});
}

47
src/api/goxcx.js Normal file
View File

@ -0,0 +1,47 @@
import request from "@/utils/request";
/**
* 列表
* @returns
*/
export function miniAppPagesget(params) {
return request({
url: "/api/miniAppPages",
method: "get",
params
});
}
/**
* 新增单位
* @returns
*/
export function miniAppPagespost(data) {
return request({
url: `/api/miniAppPages`,
method: "post",
data
});
}
/**
* 编辑详情
* @returns
*/
export function miniAppPagesput(data) {
return request({
url: '/api/miniAppPages',
method: 'put',
data
})
}
/**
* 删除商品
* @returns
*/
export function miniAppPagesdelete(params) {
return request({
url: "/api/miniAppPages/" + params,
method: "delete",
});
}

View File

@ -1,17 +1,17 @@
import request from '@/utils/request' import request from "@/utils/request";
/** /**
* 汇总数据 * 汇总数据
* @returns * @returns
*/ */
export function summaryGet() { export function summaryGet() {
return request({ return request({
url: '/api/summary', url: "/api/summary",
method: 'get', method: "get",
params: { params: {
shopId: localStorage.getItem('shopId') shopId: localStorage.getItem("shopId")
} }
}) });
} }
/** /**
@ -19,13 +19,13 @@ export function summaryGet() {
* @returns * @returns
*/ */
export function summaryTodayGet() { export function summaryTodayGet() {
return request({ return request({
url: '/api/summary/today', url: "/api/summary/today",
method: 'get', method: "get",
params: { params: {
shopId: localStorage.getItem('shopId') shopId: localStorage.getItem("shopId")
} }
}) });
} }
/** /**
@ -33,14 +33,14 @@ export function summaryTodayGet() {
* @returns * @returns
*/ */
export function summaryDateGet(day) { export function summaryDateGet(day) {
return request({ return request({
url: '/api/summary/date', url: "/api/summary/date",
method: 'get', method: "get",
params: { params: {
shopId: localStorage.getItem('shopId'), shopId: localStorage.getItem("shopId"),
day: day day: day
} }
}) });
} }
/** /**
@ -48,14 +48,14 @@ export function summaryDateGet(day) {
* @returns * @returns
*/ */
export function dateAmount(day) { export function dateAmount(day) {
return request({ return request({
url: '/api/summary/dateAmount', url: "/api/summary/dateAmount",
method: 'get', method: "get",
params: { params: {
shopId: localStorage.getItem('shopId'), shopId: localStorage.getItem("shopId"),
day: day day: day
} }
}) });
} }
/** /**
@ -63,16 +63,17 @@ export function dateAmount(day) {
* @returns * @returns
*/ */
export function dateProduct(day, page, size) { export function dateProduct(day, page, size) {
return request({ return request({
url: '/api/summary/dateProduct', // url: "/api/summary/dateProduct",
method: 'get', url: "/api/summary/productSaleDate",
params: { method: "get",
shopId: localStorage.getItem('shopId'), params: {
day: day, shopId: localStorage.getItem("shopId"),
page: page, day: day,
size: size page: page,
} size: size
}) }
});
} }
/** /**
@ -80,14 +81,14 @@ export function dateProduct(day, page, size) {
* @returns * @returns
*/ */
export function datePayType(day) { export function datePayType(day) {
return request({ return request({
url: '/api/summary/datePayType', url: "/api/summary/datePayType",
method: 'get', method: "get",
params: { params: {
shopId: localStorage.getItem('shopId'), shopId: localStorage.getItem("shopId"),
day: day day: day
} }
}) });
} }
/** /**
@ -95,15 +96,15 @@ export function datePayType(day) {
* @returns * @returns
*/ */
export function daydownload(data) { export function daydownload(data) {
return request({ return request({
url: '/api/summary/day/download', url: "/api/summary/day/download",
method: 'post', method: "post",
data: { data: {
shopId: localStorage.getItem('shopId'), shopId: localStorage.getItem("shopId"),
...data ...data
}, },
responseType: 'blob' responseType: "blob"
}) });
} }
/** /**
@ -111,14 +112,14 @@ export function daydownload(data) {
* @returns * @returns
*/ */
export function daycount(params) { export function daycount(params) {
return request({ return request({
url: '/api/summary/day/count', url: "/api/summary/day/count",
method: 'get', method: "get",
params: { params: {
shopId: localStorage.getItem('shopId'), shopId: localStorage.getItem("shopId"),
...params ...params
} }
}) });
} }
/** /**
@ -126,13 +127,27 @@ export function daycount(params) {
* @returns * @returns
*/ */
export function summaryday(params) { export function summaryday(params) {
return request({ return request({
url: '/api/summary/day', url: "/api/summary/day",
method: 'get', method: "get",
params: { params: {
shopId: localStorage.getItem('shopId'), shopId: localStorage.getItem("shopId"),
...params ...params
} }
}) });
} }
/**
* 营业板块
* @returns
*/
export function summarytrade(data) {
return request({
url: "/api/summary/trade",
method: "post",
data: {
shopId: localStorage.getItem("shopId"),
...data
}
});
}

14
src/api/homes/record.js Normal file
View File

@ -0,0 +1,14 @@
import request from '@/utils/request'
/**
* 查询交班记录
* @returns
*/
export function tbHandoverGet(leng) {
return request({
url: leng,
method: 'get'
})
}

57
src/api/imagesPhp.js Normal file
View File

@ -0,0 +1,57 @@
import request from "@/utils/requestPhp";
// 获取图片分类
export function getcommonCategor(data) {
return request({
url: `/sourcematerial/getcommon-category`,
method: 'post',
data: data
})
}
// 获取图片
export function getcommonpicture(data) {
return request({
url: "/sourcematerial/getcommon-picture",
method: 'post',
data: data
});
}
export function storeAddcategory(data) {
return request({
url: '/sourcematerial/store-addcategory',
method: 'post',
data: {
...data
},
})
}
export function addImg(data) {
return request({
url: '/sourcematerial/add-img',
method: 'post',
data: {
...data
},
})
}
// 删除图片
export function delimg(data) {
return request({
url: '/sourcematerial/delimg',
method: 'post',
data: {
...data
},
})
}
// 删除类型
export function delcate(data) {
return request({
url: '/sourcematerial/delcate',
method: 'post',
data: {
...data
},
})
}

44
src/api/inviteFirend.js Normal file
View File

@ -0,0 +1,44 @@
import request from "@/utils/request";
/**
* 获取店铺设置
* @returns
*/
export function byShopId() {
let shopId = localStorage.getItem("shopId");
return request({
url: `/tbShopShare/byShopId`,
method: "get",
params: {
shopId: shopId
}
});
}
/**
* 分享-新增/编辑
* @returns
*/
export function tbShopShare(data) {
return request({
url: "/tbShopShare",
method: data.id ? "put" : "post",
data
});
}
/**
* 邀请记录
* @returns
*/
export function byShare(data) {
let shopId = localStorage.getItem("shopId");
return request({
url: `/tbShopShare/byShare`,
method: "post",
data: {
shopId: shopId,
...data
}
});
}

View File

@ -71,7 +71,7 @@ export function tbProductStockDetailSum(params) {
*/ */
export function tbShopPurveyorGet(params) { export function tbShopPurveyorGet(params) {
return request({ return request({
url: `/api/tbShopPurveyor`, url: `/api/tbShopPurveyorTransact`,
method: "get", method: "get",
params params
}); });
@ -173,7 +173,14 @@ export function tbProductStockOperateOutAndOn(data) {
data data
}); });
} }
// 副单位
export function unittbConsInfo(params) {
return request({
url: `/api/tbConsInfo`,
method: "put",
data: params
});
}
/** /**
* 库存列表 * 库存列表
* @returns * @returns
@ -241,6 +248,16 @@ export function stockStateChange(params) {
} }
}); });
} }
// 下架
export function stockStateChangess(params) {
return request({
url: `/api/stock/grounding`,
method: "put",
params: {
...params
}
});
}
// 警戒设置 // 警戒设置
export function stockStatewarnLine(params) { export function stockStatewarnLine(params) {
return request({ return request({
@ -394,3 +411,15 @@ export function tbConsInfoinputStock(file) {
} }
}); });
} }
/**
* 供应商出入库记录
* @returns
*/
export function tbProductStockOperatepage(data) {
return request({
url: `/api/tbProductStockOperate/page`,
method: "post",
data
});
}

View File

@ -1,35 +1,43 @@
import request from '@/utils/request' import request from "@/utils/request";
export function login(username, password, code, uuid) { export function login(data) {
return request({ return request({
url: 'auth/login', url: "auth/login",
method: 'post', method: "post",
data: { data
username, });
password,
code,
uuid
}
})
} }
export function getInfo() { export function getInfo() {
return request({ return request({
url: 'auth/info', url: "auth/info",
method: 'get' method: "get"
}) });
} }
export function getCodeImg(header) { export function getCodeImg(header) {
return request({ return request({
url: 'auth/code', url: "auth/code",
method: 'get' method: "get"
}) });
} }
export function logout() { export function logout() {
return request({ return request({
url: 'auth/logout', url: "auth/logout",
method: 'delete' method: "delete"
}) });
}
/**
* 个人中心 修改密码
* @param {*} data
* @returns
*/
export function updatePass(data) {
return request({
url: "/api/users/updatePass",
method: "post",
data
});
} }

51
src/api/notifications.js Normal file
View File

@ -0,0 +1,51 @@
import request from "@/utils/request";
// 推送店铺消息开关
export function shopState(data) {
return request({
url: "/api/msg/shopState",
method: "put",
data
});
}
export function msgall(params) {
return request({
url: "/api/msg/all",
method: "get",
params
});
}
export function msginfo(data) {
return request({
url: '/api/msg/info',
method: 'put',
data
})
}
export function state(params) {
return request({
url: "/api/msg/state",
method: "get",
params
});
}
export function delmsg(ids) {
return request({
url: '/api/msg',
method: 'delete',
data: ids
})
}
//获取订阅二维码
export function subQrCode(params) {
return request({
url: '/api/msg/subQrCode',
method: 'get',
params
})
}

83
src/api/pad.js Normal file
View File

@ -0,0 +1,83 @@
import request from "@/utils/request";
/**
* Pad商品版式布局列表
* @returns
*/
export function layoutlist(params) {
return request({
url: "/api/pad/layout/list",
method: "get",
params
});
}
/**
* 新建
* @returns
*/
export function productGroup(data) {
return request({
url: "/api/pad/productCategory",
method: "post",
data
});
}
/**
* Pad点餐列表
* @returns
*/
export function productGrouppage(params) {
return request({
url: "/api/pad/productCategory/page",
method: "get",
params
});
}
/**
* 获取详情
* @returns
*/
export function productCategoryDetail(id) {
return request({
url: `/api/pad/productCategory/${id}`,
method: "get"
});
}
/**
* 删除
* @returns
*/
export function productCategoryDelete(id) {
return request({
url: `/api/pad/productCategory/${id}`,
method: "DELETE"
});
}
/**
* 修改
* @returns
*/
export function productGroupPut(data) {
return request({
url: "/api/pad/productCategory",
method: "put",
data
});
}
/**
* 拖动排序
* @returns
*/
export function productCategorySort(data) {
return request({
url: "/api/pad/productCategory/sort",
method: "post",
data
});
}

109
src/api/points.js Normal file
View File

@ -0,0 +1,109 @@
import request from "@/utils/request";
// 会员积分
/**
* 基本设置-获取店铺设置
* @returns
*/
export function basicSettingGet() {
let shopId = localStorage.getItem("shopId");
return request({
url: `/api/points/basic-setting/${shopId}`,
method: "get"
});
}
/**
* 基本设置-保存
* @returns
*/
export function basicSettingPost(data) {
return request({
url: "/api/points/basic-setting",
method: "post",
data
});
}
/**
* 商品设置-新增/编辑
* @returns
*/
export function goodsSettingAdd(data) {
return request({
url: "/api/points/goods-setting",
method: data.id ? "put" : "post",
data
});
}
/**
* 商品设置-删除
* @returns
*/
export function goodsDelete(id) {
return request({
url: `/api/points/goods-setting/${id}`,
method: "DELETE"
});
}
/**
* 商品设置-列表
* @returns
*/
export function goodsSettingPage(params) {
let shopId = localStorage.getItem("shopId");
return request({
url: `/api/points/goods-setting/page`,
method: "get",
params: {
...params,
shopId: shopId
}
});
}
/**
* 兑换记录-列表
* @returns
*/
export function exchangeRecordPage(params) {
let shopId = localStorage.getItem("shopId");
return request({
url: `/api/points/exchange-record/page`,
method: "get",
params: {
...params,
shopId: shopId
}
});
}
/**
* 兑换记录-统计
* @returns
*/
export function exchangeRecordTotal(params) {
let shopId = localStorage.getItem("shopId");
return request({
url: `/api/points/exchange-record/total`,
method: "get",
params: {
...params,
shopId: shopId
}
});
}
/**
* 兑换记录-核销
* @returns
*/
export function recordCheckout(data) {
return request({
url: "/api/points/exchange-record/checkout",
method: "post",
data
});
}

View File

@ -18,3 +18,11 @@ export function modfiyUserInfo(data) {
data, data,
}); });
} }
// 校验安全密码
export function tbShopInfoPUT(data) {
return request({
url: "/api/tbShopInfo",
method: 'put',
data
})
}

View File

@ -417,6 +417,17 @@ export function modityActivate(data) {
}); });
} }
/**
* 新增修改活动 新的
* @returns
*/
export function storageupActivate(data) {
return request({
url: `/shop/storage/upActivate`,
method: "post",
data
});
}
/** /**
* 活动列表 * 活动列表
* @returns * @returns
@ -428,7 +439,14 @@ export function findActivate(params) {
params params
}); });
} }
// 获取店铺会员二维码
export function getwxacode(data) {
return request({
url: `/shop/storage/getwxacode`,
method: "post",
data
});
}
/** /**
* 商家用户列表 * 商家用户列表
* @returns * @returns
@ -458,7 +476,6 @@ export function queryAllShopInfo(params) {
}); });
} }
/** /**
* 修改商品排序 * 修改商品排序
* @returns * @returns
@ -495,7 +512,6 @@ export function upCategorySort(data) {
}); });
} }
/** /**
* 查询店铺充值记录 * 查询店铺充值记录
* @returns * @returns
@ -519,10 +535,266 @@ export function downloadTableRecharge(data) {
return request({ return request({
url: `/api/tbShopUser/recharge/download`, url: `/api/tbShopUser/recharge/download`,
method: "post", method: "post",
data:{ data: {
shopId: localStorage.getItem("shopId"), shopId: localStorage.getItem("shopId"),
...data ...data
}, },
responseType: "blob" responseType: "blob"
}); });
} }
/**
* 员工列表
* @returns
*/
export function tbPlussShopStaffGet(params) {
return request({
url: `/api/tbPlussShopStaff`,
method: "get",
params: {
shopId: localStorage.getItem("shopId"),
...params
}
});
}
/**
* 角色列表
* @returns
*/
export function rolesGet() {
return request({
url: `/api/roles`,
method: "get"
});
}
/**
* 增加员工
* @returns
*/
export function tbPlussShopStaff(data) {
return request({
url: `/api/tbPlussShopStaff`,
method: data.id ? "put" : "post",
data: {
shopId: localStorage.getItem("shopId"),
...data
}
});
}
export function tbShopPermissionlist(params) {
return request({
url: `/api/tbShopPermission/list`,
method: "get",
params
});
}
export function getHasPermission(params) {
return request({
url: `/api/tbShopPermission/hasPermission`,
method: "get",
params
});
}
/**
* 通过id获取员工信息
* @returns
*/
export function tbPlussShopStaffDetail(id) {
return request({
url: `/api/tbPlussShopStaff/${id}`,
method: "get"
});
}
/**
* 更改员工状态
* @returns
*/
export function updateStatus(data) {
return request({
url: `/api/tbPlussShopStaff/updateStatus`,
method: "put",
data
});
}
// 叫号记录
export function callRecord(params) {
return request({
url: `/callTable/callRecord`,
method: "get",
params
});
}
export function callTablecall(data) {
return request({
url: `/callTable/call`,
method: "post",
data
});
}
// 删除桌型
export function callTabledelete(data) {
return request({
url: `/callTable`,
method: "delete",
data
});
}
export function callTablepost(data) {
return request({
url: "/callTable",
method: "post",
data
});
}
// 桌型列表
export function callTable(params) {
return request({
url: `/callTable`,
method: "get",
params
});
}
// 修改桌号
export function callTabledataput(data) {
return request({
url: `/callTable`,
method: "put",
data
});
}
// 叫号列表
export function callTablequeue(params) {
return request({
url: "/callTable/queue",
method: "get",
params
});
}
// 取消叫号
export function callTableput(data) {
return request({
url: `/callTable/updateState`,
method: "put",
data
});
}
export function callTabletakeNumber(data) {
return request({
url: "/callTable/takeNumber",
method: "post",
data: {
...data
}
});
}
// 叫号配置获取
export function callTableconfig(params) {
return request({
url: "/callTable/config",
method: "get",
params
});
}
// 叫号配置修改
export function callTableconfigput(data) {
return request({
url: `/callTable/config`,
method: "put",
data
});
}
/**
* 员工删除
* @returns
*/
export function shopStaffDelete(data) {
return request({
url: `/api/tbPlussShopStaff`,
method: "delete",
data
});
}
//增减余额
export function midfiyAccount(data) {
return request({
url: `/api/tbShopUser/midfiyAccount`,
method: "post",
data
});
}
// 编辑用户
export function tbShopUseredit(data) {
return request({
url: `/api/tbShopUser`,
method: "put",
data
});
}
// 通过活动id获取赠送商品列表
export function activate(id) {
return request({
url: `shop/storage/activate/${id}`,
method: "get"
});
}
// 通过活动id获取赠送商品列表
export function queryShopUserFlow(params) {
return request({
url: `/api/tbShopUser/queryShopUserFlow`,
method: "get",
params
});
}
// 商品列表 V2
export function tbProductListV2(data) {
return request({
url: `/api/tbProduct/list/v2`,
method: "post",
data
});
}
// 修改商品相关(快捷接口)
export function updateProductData(data) {
return request({
url: `/api/stock/updateProductData`,
method: "post",
data
});
}
// 商品库存统计列表 统计
export function tbProductStockDetailStockCount(data) {
return request({
url: `/api/tbProductStockDetail/stock/count`,
method: "post",
data
});
}
// 商品库存记录列表
export function tbProductStockDetailStock(data) {
return request({
url: `/api/tbProductStockDetail/stock`,
method: "post",
data
});
}
// 商品库存记录列表
export function stockWarnLine(data) {
return request({
url: `/api/stock/warnLine`,
method: "PUT",
data
});
}

View File

@ -1,6 +1,11 @@
// 桌台管理 // 桌台管理
import request from "@/utils/request"; import request from "@/utils/request";
//就餐形式,默认堂食后付费
const useType='dine-in-after'
function getUseType(){
const type=localStorage.getItem("useType")
return type?type:useType
}
/** /**
* 台桌列表 * 台桌列表
* @returns * @returns
@ -9,7 +14,10 @@ export function tbShopTableGet(params) {
return request({ return request({
url: `/api/tbShopTable`, url: `/api/tbShopTable`,
method: "get", method: "get",
params params:{
shopId: localStorage.getItem("shopId"),
...params
}
}); });
} }
@ -118,3 +126,395 @@ export function summaryTableDownload(data) {
}); });
} }
/**
* 获取当前台桌订单信息
* @returns
*/
export function getCart(params) {
return request({
url: `/api/place/cart`,
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...params
}
});
}
/**
* 已上架商品列表
* @returns
*/
export function getGoodsLists(params) {
return request({
url: `/api/place/activate`,
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...params
}
});
}
/**
* 点单
* @returns
*/
export function addCart(data) {
return request({
url: `/api/place/addCart`,
method: "post",
data:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...data
}
});
}
/**
* 清空购物车/支付订单
* @returns
*/
export function $clearCart(data) {
return request({
url: `/api/place/clearCart`,
method: "delete",
data:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...data
}
});
}
/**
* 删除购物车某个商品
* @returns
*/
export function $removeCart(data) {
return request({
url: `/api/place/removeCart`,
method: "delete",
data:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...data
}
});
}
/**
* 更新规格
* @returns
*/
export function $updateCart(data) {
return request({
url: `/api/place/updateCart`,
method: "put",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
/**
* 批量打包
* @returns
*/
export function $allPack(data) {
return request({
url: `/api/place/pack`,
method: "put",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
/**
* 获取取餐号
* @returns
*/
export function $getMasterId(data) {
return request({
url: `/api/place/masterId`,
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...data
}
});
}
/**
* 支付方式获取
* @returns
*/
export function $getPayType(data) {
return request({
url: `/api/place/payType`,
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
/**
* 创建订单
* @returns
*/
export function $createOrder(data) {
return request({
url: `/api/place/order`,
method: "post",
data:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...data
}
});
}
/**
* 挂起订单
* @returns
*/
export function $cacheOrder(data) {
return request({
url: `/api/place/pending`,
method: "post",
data:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...data
}
});
}
/**
* 获取已挂起订单
* @returns
*/
export function $getCacheOrder(data) {
return request({
url: `/api/place/pending/cart`,
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...data
}
});
}
// 会员点单/取消会员点单
export function $setUser(data) {
return request({
url: `/api/place/updateVip`,
method: "put",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
// 删除订单
export function $delOrder(data) {
return request({
url: `/api/place/order`,
method: "delete",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
// 支付订单
export function $payOrder(data) {
return request({
url: '/api/place/pay',
method: "put",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//退单
export function $returnCart(data) {
return request({
url: '/api/place/returnCart',
method: "put",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
// 选择台桌
export function $choseTable(data) {
return request({
url: '/api/place/choseTable',
method: "put",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
// 用餐人数
export function $choseCount(data) {
return request({
url: '/api/place/choseCount',
method: "put",
data:{
shopId: localStorage.getItem("shopId"),
useType: getUseType(),
...data
}
});
}
// 批量生成台桌
export function $fastCreateTable(data) {
return request({
url: '/api/tbShopTable/generate',
method: "post",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//打印当前台桌订单
export function $printOrder(data) {
return request({
url: '/api/place/printOrder',
method: "post",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//打印当前台桌菜品
export function $printDishes(data) {
return request({
url: '/api/place/printDishes',
method: "post",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
// 就餐模式切换
export function $changeUseType(data) {
return request({
url: '/api/place/choseModel',
method: "put",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//店铺订单支付获取链接
export function $getOrderPayUrl(data) {
return request({
url: '/api/shopPayApi/getOrderPayUrl',
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//退款
export function $returnOrder(data) {
return request({
url: '/api/place/returnOrder',
method: "post",
data:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//获取台桌详情状态
export function $returnTableDetail(data) {
return request({
url: '/api/tbShopTable/state',
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//获取订单可用优惠券
export function $activateByOrderId(data) {
return request({
url: '/api/tbShopCoupon/activateByOrderId',
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//会员积分列表
export function $returnMemberPointsList(data) {
return request({
url: '/api/points/member-points/page',
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
// 会员积分账户信息
export function $returnMemberPoints(memberId) {
return request({
url: '/api/points/member-points/'+memberId,
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
//002-获取订单可用积分及抵扣金额(支付页面使用)
export function $calcUsablePoints(data) {
return request({
url: '/api/points/member-points/calc-usable-points',
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}
// 003-根据积分计算可抵扣金额
export function $calcDeDuctionPoints(data) {
return request({
url: '/api/points/member-points/calc-deduction-amount',
method: "get",
params:{
shopId: localStorage.getItem("shopId"),
...data
}
});
}

52
src/api/version.js Normal file
View File

@ -0,0 +1,52 @@
import $api from './class-api'
import request from '@/utils/request'
export const $version = new $api('/api/tbVersion')
/**
* 修改当前选中 版本
* @returns
*/
export function $upSel(data) {
return request({
url: 'api/tbVersion/upSel',
method: "put",
data: {
shopId: localStorage.getItem("shopId"),
...data
}
});
}
/**
* 上传版本文件
* @returns
*/
export function $uploadVersionFile(file, par) {
var data = new FormData()
data.append('file', file)
for(let i in par){
if(i!=='file'){
data.append(i, par[i])
}
}
return request({
url: 'api/qiNiuContent/uploadVersionFile',
method: "post",
data
});
}
/**
* 修改当前选中 版本
* @returns
*/
export function $getCredentials(data) {
return request({
url: 'api/qiNiuContent/getCredentials',
method: "get",
data: {
shopId: localStorage.getItem("shopId"),
...data
}
});
}

BIN
src/assets/images/1024.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 877 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

View File

@ -6,7 +6,7 @@
/* theme color */ /* theme color */
$--color-primary: #1890ff; $--color-primary: #1890ff;
$--color-success: #13ce66; $--color-success: #13ce66;
$--color-warning: #FFBA00; $--color-warning: #ffba00;
$--color-danger: #ff4949; $--color-danger: #ff4949;
// $--color-info: #1E1E1E; // $--color-info: #1E1E1E;
@ -17,10 +17,10 @@ $--button-font-weight: 400;
$--border-color-light: #dfe4ed; $--border-color-light: #dfe4ed;
$--border-color-lighter: #e6ebf5; $--border-color-lighter: #e6ebf5;
$--table-border:1px solid#dfe6ec; $--table-border: 1px solid#dfe6ec;
/* icon font path, required */ /* icon font path, required */
$--font-path: '~element-ui/lib/theme-chalk/fonts'; $--font-path: "~element-ui/lib/theme-chalk/fonts";
@import "../../../node_modules/element-ui/packages/theme-chalk/src/index"; @import "../../../node_modules/element-ui/packages/theme-chalk/src/index";

View File

@ -139,7 +139,7 @@
height: 100%; height: 100%;
position: fixed; position: fixed;
font-size: 0; font-size: 0;
top: 0; top: 60px;
bottom: 0; bottom: 0;
left: 0; left: 0;
z-index: 1001; z-index: 1001;
@ -159,7 +159,7 @@
height: 100%; height: 100%;
} }
#app .sidebar-container.has-logo .el-scrollbar { #app .sidebar-container.has-logo .el-scrollbar {
height: calc(100% - 50px); height: calc(100% - 110px);
} }
#app .sidebar-container .is-horizontal { #app .sidebar-container .is-horizontal {
display: none; display: none;

View File

@ -14,7 +14,7 @@
height: 100%; height: 100%;
position: fixed; position: fixed;
font-size: 0; font-size: 0;
top: 0; top: 60px;
bottom: 0; bottom: 0;
left: 0; left: 0;
z-index: 1001; z-index: 1001;
@ -39,7 +39,7 @@
&.has-logo { &.has-logo {
.el-scrollbar { .el-scrollbar {
height: calc(100% - 50px); height: calc(100% - 110px);
} }
} }

384
src/assets/styles/util.scss Normal file
View File

@ -0,0 +1,384 @@
.u-relative,
.u-rela,
.relative {
position: relative;
}
.u-absolute,
.u-abso,
.absolute {
position: absolute;
}
.u-fixed,
.u-fix {
position: fixed;
}
// nvue不能用标签命名样式不能放在微信组件中否则微信开发工具会报警告无法使用标签名当做选择器
/* #ifndef APP-NVUE */
image {
display: inline-block;
}
// 在weex也即nvue中所有元素默认为border-box
view,
text {
box-sizing: border-box;
}
/* #endif */
.u-font-xs {
font-size: 11px;
}
.u-font-sm {
font-size: 13px;
}
.u-font-md {
font-size: 14px;
}
.u-font-lg {
font-size: 15px;
}
.u-font-xl {
font-size: 17px;
}
.flex {
display: flex;
flex-direction: row;
align-items: center;
}
.u-flex {
display: flex;
flex-direction: row;
align-items: center;
}
.u-flex-wrap {
flex-wrap: wrap;
}
.u-flex-nowrap {
flex-wrap: nowrap;
}
.free-price {
text-decoration: line-through;
color: #999;
}
.cur-pointer{
cursor: pointer;
}
.u-col-center {
align-items: center;
}
.u-col-top {
align-items: flex-start;
}
.u-col-bottom {
align-items: flex-end;
}
.u-row-center {
justify-content: center;
}
.u-row-left {
justify-content: flex-start;
}
.u-row-right {
justify-content: flex-end;
}
.u-row-between {
justify-content: space-between;
}
.u-row-around {
justify-content: space-around;
}
.u-text-left {
text-align: left;
}
.u-text-center {
text-align: center;
}
.u-text-right {
text-align: right;
}
.u-flex-col {
display: flex;
flex-direction: column;
}
// 定义flex等分
@for $i from 0 through 12 {
.u-flex-#{$i} {
flex: $i;
}
}
// 定义字体(px)单位小于20都为px单位字体
@for $i from 9 to 20 {
.u-font-#{$i} {
font-size: $i + px;
}
}
// 定义字体(rpx)单位大于或等于20的都为rpx单位字体
@for $i from 20 through 40 {
.u-font-#{$i} {
font-size: $i + px;
}
}
// 定义内外边距历遍1-80
@for $i from 0 through 80 {
// 只要双数和能被5除尽的数
@if $i % 2==0 or $i % 5==0 {
// 得出u-margin-30或者u-m-30
.u-margin-#{$i},
.u-m-#{$i} {
margin: $i + px !important;
}
// 得出u-padding-30或者u-p-30
.u-padding-#{$i},
.u-p-#{$i} {
padding: $i + px !important;
}
@each $short, $long in l left, t top, r right, b bottom {
// 缩写版结果如 u-m-l-30
// 定义外边距
.u-m-#{$short}-#{$i} {
margin-#{$long}: $i + px !important;
}
// 定义内边距
.u-p-#{$short}-#{$i} {
padding-#{$long}: $i + px !important;
}
// 完整版结果如u-margin-left-30
// 定义外边距
.u-margin-#{$long}-#{$i} {
margin-#{$long}: $i + px !important;
}
// 定义内边距
.u-padding-#{$long}-#{$i} {
padding-#{$long}: $i + px !important;
}
}
}
}
// 重置nvue的默认关于flex的样式
.u-reset-nvue {
flex-direction: row;
align-items: center;
}
/* start--文本行数限制--start */
.u-line-1 {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.u-line-2 {
-webkit-line-clamp: 2;
}
.u-line-3 {
-webkit-line-clamp: 3;
}
.u-line-4 {
-webkit-line-clamp: 4;
}
.u-line-5 {
-webkit-line-clamp: 5;
}
.u-line-2,
.u-line-3,
.u-line-4,
.u-line-5 {
overflow: hidden;
word-break: break-all;
text-overflow: ellipsis;
display: -webkit-box; // 弹性伸缩盒
-webkit-box-orient: vertical; // 设置伸缩盒子元素排列方式
}
/* end--文本行数限制--end */
/* start--不同颜色文字--start */
.color-333 {
color: #333;
}
.color-666 {
color: #666;
}
.color-999 {
color: #999;
}
.color-red {
color: rgb(250, 85, 85);
}
/* end--不同颜色文字--end */
.tranistion {
transition: all .3s ease-in-out;
}
.tranistion-1 {
transition: all .1s ease-in-out;
}
.tranistion-2 {
transition: all .2s ease-in-out;
}
.font-bold {
font-weight: 700;
}
.font-600 {
font-weight: 600;
}
.bg-gray {
background-color: #F9F9F9;
}
.w-full {
width: 100%;
}
.gap-10 {
gap: 10px;
}
.gap-20 {
gap: 20px;
}
.color-aaa {
color: #aaa;
}
.color-000 {
color: #000;
}
.color-fff {
color: #fff;
}
.bg-fff {
background-color: #fff;
}
.bg-gray {
background-color: #F9F9F9;
}
.overflow-hide {
overflow: hidden;
}
.no-wrap {
white-space: nowrap;
}
.border-r-12 {
border-radius: 12px;
}
.border-r-18 {
border-radius: 18px;
}
.border-top {
border-top: 1px solid #E5E5E5;
}
.border-bottom {
border-bottom: 1px solid #E5E5E5;
}
.scale7 {
transform: scale(0.7);
}
.position-all {
left: 0;
right: 0;
top: 0;
bottom: 0;
}
.lh16 {
line-height: 16px;
}
.default-box-padding {
padding: 16px 14px;
}
.zIndex-999 {
z-index: 999;
}
.icon-default-size {
width: 14px;
height: 14px;
}
.filter-gray {
filter: grayscale(1);
}
.youhui-tips.el-tooltip__popper {
background: #fff;
min-width: 150px;
border-radius: 4px;
border: 1px solid #ebeef5 !important;
padding: 12px;
color: #606266;
line-height: 1.4;
text-align: justify;
font-size: 14px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
word-break: break-all;
}
.youhui-tips.el-tooltip__popper[x-placement^="top"] .popper__arrow:after,
.youhui-tips.el-tooltip__popper[x-placement^="top"] .popper__arrow {
border-top-color: #fff;
}

View File

@ -9,15 +9,15 @@ $yellow: #fec171;
$panGreen: #30b08f; $panGreen: #30b08f;
// sidebar // sidebar
$menuText: #bfcbd9; $menuText: #999;
$menuActiveText: #409eff; $menuActiveText: #409eff;
$subMenuActiveText: #f4f4f5; // https://github.com/ElemeFE/element/issues/12951 $subMenuActiveText: #555; // https://github.com/ElemeFE/element/issues/12951
$menuBg: #333; $menuBg: #fff;
$menuHover: #444; $menuHover: rgba(121, 145, 188, 0.18);
$subMenuBg: #444; $subMenuBg: #fff;
$subMenuHover: #555; $subMenuHover: rgba(121, 145, 188, 0.18);
$sideBarWidth: 205px; $sideBarWidth: 205px;

View File

@ -1,8 +1,10 @@
<template> <template>
<el-breadcrumb class="app-breadcrumb" separator="/"> <el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb"> <transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path"> <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
<span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span> <span v-if="item.redirect === 'noredirect' || index == levelList.length - 1" class="no-redirect">{{
item.meta.title
}}</span>
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
</el-breadcrumb-item> </el-breadcrumb-item>
</transition-group> </transition-group>
@ -37,7 +39,7 @@ export default {
const first = matched[0] const first = matched[0]
if (!this.isDashboard(first)) { if (!this.isDashboard(first)) {
matched = [{ path: '/dashboard', meta: { title: '首页' }}].concat(matched) matched = [{ path: '/', meta: { title: '首页' } }].concat(matched)
} }
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
@ -73,6 +75,7 @@ export default {
font-size: 14px; font-size: 14px;
line-height: 50px; line-height: 50px;
margin-left: 8px; margin-left: 8px;
.no-redirect { .no-redirect {
color: #97a8be; color: #97a8be;
cursor: text; cursor: text;

View File

@ -0,0 +1,175 @@
<template>
<el-dialog title="选择优惠劵" top="5vh" :visible.sync="dialogVisible">
<div class="head-container">
<el-table ref="table" :data="tableData.list" height="500" v-loading="tableData.loading">
<!-- <el-table-column type="selection" width="55" align="center" v-if="!radio"></el-table-column> -->
<el-table-column label="名称" prop="title" />
<el-table-column label="使用门槛">
<template v-slot="scope">
{{ `${scope.row.fullAmount}${scope.row.discountAmount ? '减' + scope.row.discountAmount + '元' :
''}` }}
</template>
</el-table-column>
<el-table-column label="总发放数量" prop="number" />
<el-table-column label="已使用" prop="useNumber" />
<el-table-column label="剩余" prop="leftNumber" />
<el-table-column label="操作">
<template v-slot="scope">
<el-button type="primary" @click="selectHandle(scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
@current-change="paginationChange" @size-change="sizeChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
<span slot="footer" class="dialog-footer" v-if="!radio">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmHandle"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { getTbShopCoupon, delTbShopCoupon } from '@/api/coupon'
export default {
props: {
//
radio: {
type: Boolean,
default: false
}
},
data() {
return {
dialogVisible: false,
searhForm: {
name: '',
category: ''
},
categoryList: [],
tableData: {
page: 0,
size: 10,
total: 0,
loading: false,
list: []
},
goods: []
}
},
methods: {
//
selectHandle(row) {
this.$emit('success', [{ ...row }])
this.close()
},
//
confirmHandle() {
let res = this.$refs.table.selection
this.$emit('success', res)
this.close()
},
//
resetHandle() {
this.searhForm.name = ''
this.searhForm.category = ''
this.tableData.page = 0
this.tableData.size = 10
this.tableData.list = []
this.getTableData()
},
//
sizeChange(e) {
this.tableData.size = e
this.getTableData()
},
//
paginationChange(e) {
this.tableData.page = e - 1
this.getTableData()
},
//
async getTableData() {
this.tableData.loading = true
try {
const res = await getTbShopCoupon({
page: this.tableData.page,
size: this.tableData.size,
name: this.searhForm.name,
categoryId: this.searhForm.category,
shopId: localStorage.getItem('shopId'),
sort: 'id',
})
this.tableData.list = res.content
this.tableData.total = res.totalElements
if (this.goods.length) {
this.$nextTick(() => {
this.selection()
})
}
setTimeout(() => {
this.tableData.loading = false
}, 500);
} catch (error) {
console.log(error)
}
},
//
async tbShopCategoryGet() {
try {
const res = await getTbShopCoupon({
page: 0,
size: 100,
sort: 'id',
shopId: localStorage.getItem('shopId')
})
this.categoryList = res.content
} catch (error) {
console.log(error)
}
},
async show(goods, categoryId) {
this.dialogVisible = true
if (goods && goods.length) {
this.goods = goods
} else {
this.goods = []
}
this.resetHandle()
console.log(categoryId);
if (categoryId) {
this.searhForm.category = categoryId
}
console.log(this.searhForm);
},
close() {
this.dialogVisible = false
},
selection() {
this.goods.forEach(row => {
this.tableData.list.forEach((item, index) => {
if (row.id == item.id) {
this.$refs.table.toggleRowSelection(this.tableData.list[index]);
}
})
});
}
}
}
</script>
<style scoped lang="scss">
.shop_info {
display: flex;
align-items: center;
span {
margin-left: 10px;
}
}
</style>

View File

@ -1,11 +1,11 @@
<template> <template>
<el-dialog title="选择商品" :visible.sync="dialogVisible" @open="resetHandle()"> <el-dialog title="选择商品" top="5vh" :visible.sync="dialogVisible">
<el-form :model="searhForm" inline> <el-form :model="searhForm" inline>
<el-form-item> <el-form-item>
<el-input v-model="searhForm.name" placeholder="商品名称"></el-input> <el-input v-model="searhForm.name" placeholder="商品名称"></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-select v-model="searhForm.category" placeholder="商品分类"> <el-select v-model="searhForm.category" placeholder="商品分类" :disabled="disableCategory">
<el-option :label="item.name" :value="item.id" v-for="item in categoryList" <el-option :label="item.name" :value="item.id" v-for="item in categoryList"
:key="item.id"></el-option> :key="item.id"></el-option>
</el-select> </el-select>
@ -16,8 +16,8 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="head-container"> <div class="head-container">
<el-table ref="table" :data="tableData.list" v-loading="tableData.loading"> <el-table ref="table" :data="tableData.list" height="500" v-loading="tableData.loading">
<el-table-column type="selection" width="55" align="center"></el-table-column> <el-table-column type="selection" width="55" align="center" v-if="!radio"></el-table-column>
<el-table-column label="商品信息"> <el-table-column label="商品信息">
<template v-slot="scope"> <template v-slot="scope">
<div class="shop_info"> <div class="shop_info">
@ -36,11 +36,11 @@
</template> </template>
</el-table-column> <el-table-column label=""> </el-table-column> <el-table-column label="">
<template v-slot="scope"> <template v-slot="scope">
{{ scope.row.isPauseSale == 1?'是':'否' }} {{ scope.row.isPauseSale == 1 ? '是' : '否' }}
</template> </template>
</el-table-column> <el-table-column label=""> </el-table-column> <el-table-column label="">
<template v-slot="scope"> <template v-slot="scope">
{{ scope.row.isDistribute == 1?'是':'否' }} {{ scope.row.isDistribute == 1 ? '是' : '否' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="售价"> <el-table-column label="售价">
@ -54,12 +54,17 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="分类名称" prop="categoryName"></el-table-column> <el-table-column label="分类名称" prop="categoryName"></el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
<el-button type="primary" @click="selectHandle(scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table> </el-table>
</div> </div>
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size" <el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
@current-change="paginationChange" @size-change="sizeChange" @current-change="paginationChange" @size-change="sizeChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination> layout="total, sizes, prev, pager, next, jumper"></el-pagination>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer" v-if="!radio">
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmHandle"> </el-button> <el-button type="primary" @click="confirmHandle"> </el-button>
</span> </span>
@ -69,6 +74,18 @@
<script> <script>
import { tbShopCategoryGet, tbProduct } from "@/api/shop"; import { tbShopCategoryGet, tbProduct } from "@/api/shop";
export default { export default {
props: {
//
disableCategory: {
type: Boolean,
default: false
},
//
radio: {
type: Boolean,
default: false
}
},
data() { data() {
return { return {
dialogVisible: false, dialogVisible: false,
@ -88,6 +105,11 @@ export default {
} }
}, },
methods: { methods: {
//
selectHandle(row) {
this.$emit('success', [{ ...row }])
this.close()
},
// //
confirmHandle() { confirmHandle() {
let res = this.$refs.table.selection let res = this.$refs.table.selection
@ -154,7 +176,7 @@ export default {
console.log(error) console.log(error)
} }
}, },
show(goods) { async show(goods, categoryId) {
this.dialogVisible = true this.dialogVisible = true
if (goods && goods.length) { if (goods && goods.length) {
this.goods = goods this.goods = goods
@ -162,8 +184,18 @@ export default {
this.goods = [] this.goods = []
} }
this.resetHandle() this.resetHandle()
this.tbShopCategoryGet()
this.getTableData() console.log(categoryId);
if (categoryId) {
this.searhForm.category = categoryId
}
console.log(this.searhForm);
await this.tbShopCategoryGet()
await this.getTableData()
}, },
close() { close() {
this.dialogVisible = false this.dialogVisible = false

View File

@ -36,7 +36,7 @@ export default {
dialogImageUrl: '', dialogImageUrl: '',
dialogVisible: false, dialogVisible: false,
fileList: [], fileList: [],
files: [], // files: [],
headers: { headers: {
'Authorization': getToken() 'Authorization': getToken()
} }
@ -45,7 +45,13 @@ export default {
methods: { methods: {
handleSuccess(response, file, fileList) { handleSuccess(response, file, fileList) {
// console.log('', response) // console.log('', response)
this.files = response.data setTimeout(() => {
this.fileList.push({
url: response.data[0],
id: response.data.id
})
}, 100);
// this.files = response.data
this.$emit('success', response.data) this.$emit('success', response.data)
}, },
// //
@ -69,6 +75,9 @@ export default {
}, },
handleRemove(file, fileList) { handleRemove(file, fileList) {
let arr = fileList.map(item => item.url) let arr = fileList.map(item => item.url)
//
let index = this.fileList.findIndex(ele => ele.url == file.url)
this.fileList.splice(index, 1);
this.$emit('remove', arr) this.$emit('remove', arr)
}, },
clearFiles() { clearFiles() {
@ -76,4 +85,11 @@ export default {
} }
} }
} }
</script> </script>
<style>
.el-upload-list__item {
transition: none;
}
</style>

View File

@ -38,7 +38,7 @@ export default {
} }
.fixed-header+.app-main { .fixed-header+.app-main {
padding-top: 50px; padding-top: 140px;
} }
.hasTagsView { .hasTagsView {
@ -48,7 +48,7 @@ export default {
} }
.fixed-header+.app-main { .fixed-header+.app-main {
padding-top: 84px; padding-top: 140px;
} }
} }
</style> </style>

View File

@ -16,31 +16,62 @@
<size-select id="size-select" class="right-menu-item hover-effect" /> <size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
</template> --> </template> -->
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover"> <!-- <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover">
<div class="avatar-wrapper"> <div class="avatar-wrapper">
<img :src="logo || Avatar" class="user-avatar"> <img :src="logo || Avatar" class="user-avatar">
<!-- <i class="el-icon-caret-bottom" /> --> <i class="el-icon-caret-bottom" />
<span class="shop_name">{{ shopName }}</span> <span class="shop_name">{{ shopName }}</span>
</div> </div>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<!-- <span style="display:block;" @click="show = true"> <span style="display:block;" @click="show = true">
<el-dropdown-item> <el-dropdown-item>
布局设置 布局设置
</el-dropdown-item> </el-dropdown-item>
</span> --> </span>
<router-link to="/shop/shop/shop_configuration"> <router-link to="/shop/shop/shop_configuration">
<el-dropdown-item> <el-dropdown-item>
个人中心 个人中心
</el-dropdown-item> </el-dropdown-item>
</router-link> </router-link>
<span @click="dialogVisible = true">
<el-dropdown-item>
修改密码
</el-dropdown-item>
</span>
<span style="display:block;" @click="open"> <span style="display:block;" @click="open">
<el-dropdown-item divided> <el-dropdown-item divided>
退出登录 退出登录
</el-dropdown-item> </el-dropdown-item>
</span> </span>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown> -->
</div> </div>
<el-dialog title="修改密码" modal-append-to-body append-to-body :visible.sync="dialogVisible" width="400px">
<el-form ref="form" :model="form" :rules="rules">
<el-form-item label="旧密码" prop="oldPass">
<el-input :type="ip1Type" v-model="form.oldPass" placeholder="请输入旧密码">
<i slot="suffix" :class="`el-input__icon ${ip1Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
@click.stop="changeInputType('ip1Type')"></i>
</el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPass">
<el-input :type="ip2Type" v-model="form.newPass" placeholder="请输入新密码">
<i slot="suffix" :class="`el-input__icon ${ip2Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
@click.stop="changeInputType('ip2Type')"></i>
</el-input>
</el-form-item>
<el-form-item label="确认新密码" prop="rnewPass">
<el-input :type="ip3Type" v-model="form.rnewPass" placeholder="请再次输入新密码">
<i slot="suffix" :class="`el-input__icon ${ip3Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
@click.stop="changeInputType('ip3Type')"></i>
</el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="formLoading" @click="submitHandle"> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
@ -53,6 +84,8 @@ import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect' import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch' import Search from '@/components/HeaderSearch'
import Avatar from '@/assets/images/avatar.png' import Avatar from '@/assets/images/avatar.png'
import { updatePass } from '@/api/login.js'
import { encrypt } from '@/utils/rsaEncrypt'
export default { export default {
components: { components: {
@ -64,11 +97,61 @@ export default {
Doc Doc
}, },
data() { data() {
const validateNewPass = (rule, value, callback) => {
if (!this.form.newPass) {
callback(new Error(' '))
} else if (this.form.newPass === this.form.oldPass) {
callback(new Error('请输入与旧密码不同的新密码'))
} else {
callback()
}
}
const validateRnewPass = (rule, value, callback) => {
if (!this.form.rnewPass) {
callback(new Error(' '))
} else if (this.form.rnewPass !== this.form.newPass) {
callback(new Error('两次密码输入不一致'))
} else {
callback()
}
}
return { return {
Avatar: Avatar, Avatar: Avatar,
dialogVisible: false, dialogVisible: false,
logo: localStorage.getItem('logo'), logo: localStorage.getItem('logo'),
shopName: localStorage.getItem('shopName') shopName: localStorage.getItem('shopName'),
ip1Type: 'password',
ip2Type: 'password',
ip3Type: 'password',
formLoading: false,
form: {
oldPass: '',
newPass: '',
rnewPass: ''
},
rules: {
oldPass: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
newPass: [
{
required: true,
validator: validateNewPass,
trigger: 'blur'
}
],
rnewPass: [
{
required: true,
validator: validateRnewPass,
trigger: 'blur'
}
]
}
} }
}, },
computed: { computed: {
@ -91,6 +174,36 @@ export default {
} }
}, },
methods: { methods: {
//
changeInputType(key) {
if (this[key] == 'text') {
this[key] = 'password'
} else {
this[key] = 'text'
}
},
//
submitHandle() {
this.$refs.form.validate(async vaild => {
if (vaild) {
try {
this.formLoading = true
const res = await updatePass({
loginType: localStorage.getItem('loginType'),
oldPass: encrypt(this.form.oldPass),
newPass: this.form.newPass
})
this.$notify.success('修改成功,请重新登陆')
setTimeout(() => {
this.logout()
}, 1000)
} catch (error) {
this.formLoading = false
console.log(error);
}
}
})
},
toggleSideBar() { toggleSideBar() {
this.$store.dispatch('app/toggleSideBar') this.$store.dispatch('app/toggleSideBar')
}, },

View File

@ -1,20 +1,22 @@
<template> <template>
<div class="sidebar-logo-container" :class="{'collapse':collapse}"> <div class="sidebar-logo-container" :class="{ 'collapse': collapse }">
<transition name="sidebarLogoFade"> <transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> <div v-if="collapse" key="collapse" class="sidebar-logo-link">
<img v-if="logo" :src="logo" class="sidebar-logo"> <img v-if="logo" :src="logo || Avatar" class="sidebar-logo">
<h1 v-else class="sidebar-title">{{ title }} </h1> <h1 v-else class="sidebar-title">{{ shopName }} </h1>
</router-link> <i class="el-icon-arrow-down icon"></i>
<router-link v-else key="expand" class="sidebar-logo-link" to="/"> </div>
<img v-if="logo" :src="logo" class="sidebar-logo"> <div v-else key="expand" class="sidebar-logo-link">
<h1 class="sidebar-title">{{ title }} </h1> <img v-if="logo" :src="logo || Avatar" class="sidebar-logo">
</router-link> <h1 class="sidebar-title">{{ shopName }} </h1>
<i class="el-icon-arrow-down icon"></i>
</div>
</transition> </transition>
</div> </div>
</template> </template>
<script> <script>
import Logo from '@/assets/images/logo.png' import Avatar from '@/assets/images/avatar.png'
export default { export default {
name: 'SidebarLogo', name: 'SidebarLogo',
props: { props: {
@ -25,8 +27,9 @@ export default {
}, },
data() { data() {
return { return {
title: '收银机管理端', shopName: localStorage.getItem('shopName'),
logo: Logo Avatar,
logo: localStorage.getItem('logo'),
} }
} }
} }
@ -42,6 +45,13 @@ export default {
opacity: 0; opacity: 0;
} }
h1 {
width: 100px;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.sidebar-logo-container { .sidebar-logo-container {
position: relative; position: relative;
width: 100%; width: 100%;
@ -53,23 +63,25 @@ export default {
& .sidebar-logo-link { & .sidebar-logo-link {
height: 100%; height: 100%;
width: 100%; width: 100%;
display: flex;
align-items: center;
justify-content: center;
.icon {
font-size: 14px;
margin-left: 6px;
}
& .sidebar-logo { & .sidebar-logo {
width: 32px; width: 36px;
height: 32px; height: 36px;
vertical-align: middle; border-radius: 50%;
margin-right: 6px; margin-right: 6px;
} }
& .sidebar-title { & .sidebar-title {
display: inline-block; color: #333;
margin: 0;
color: #fff;
font-weight: 600;
line-height: 50px;
font-size: 14px; font-size: 14px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle;
} }
} }
@ -77,6 +89,11 @@ export default {
.sidebar-logo { .sidebar-logo {
margin-right: 0px; margin-right: 0px;
} }
.sidebar-logo {
width: 24px;
height: 24px;
}
} }
} }
</style> </style>

View File

@ -1,24 +1,17 @@
<template> <template>
<div id="tags-view-container" class="tags-view-container"> <div id="tags-view-container" class="tags-view-container">
<scroll-pane ref="scrollPane" class="tags-view-wrapper"> <scroll-pane ref="scrollPane" class="tags-view-wrapper">
<router-link <router-link v-for="tag in visitedViews" ref="tag" :key="tag.path" :class="isActive(tag) ? 'active' : ''"
v-for="tag in visitedViews" :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" tag="span" class="tags-view-item"
ref="tag" @click.middle.native="!isAffix(tag) ? closeSelectedTag(tag) : ''"
:key="tag.path" @contextmenu.prevent.native="openMenu(tag, $event)">
:class="isActive(tag)?'active':''"
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span"
class="tags-view-item"
@click.middle.native="closeSelectedTag(tag)"
@contextmenu.prevent.native="openMenu(tag,$event)"
>
{{ tag.title }} {{ tag.title }}
<span v-if="!tag.meta.affix" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
</router-link> </router-link>
</scroll-pane> </scroll-pane>
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu"> <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu">
<li @click="refreshSelectedTag(selectedTag)">刷新</li> <li @click="refreshSelectedTag(selectedTag)">刷新</li>
<li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)">关闭</li> <li v-if="!(selectedTag.meta && selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)">关闭</li>
<li @click="closeOthersTags">关闭其他</li> <li @click="closeOthersTags">关闭其他</li>
<li @click="closeAllTags(selectedTag)">关闭全部</li> <li @click="closeAllTags(selectedTag)">关闭全部</li>
</ul> </ul>
@ -66,6 +59,9 @@ export default {
this.addTags() this.addTags()
}, },
methods: { methods: {
isAffix(tag) {
return tag.meta && tag.meta.affix
},
isActive(route) { isActive(route) {
return route.path === this.$route.path return route.path === this.$route.path
}, },
@ -168,6 +164,7 @@ export default {
} }
}, },
openMenu(tag, e) { openMenu(tag, e) {
console.log(11111)
const menuMinWidth = 105 const menuMinWidth = 105
const offsetLeft = this.$el.getBoundingClientRect().left // container margin left const offsetLeft = this.$el.getBoundingClientRect().left // container margin left
const offsetWidth = this.$el.offsetWidth // container width const offsetWidth = this.$el.offsetWidth // container width
@ -198,6 +195,7 @@ export default {
background: #fff; background: #fff;
border-bottom: 1px solid #d8dce5; border-bottom: 1px solid #d8dce5;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04); box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
.tags-view-wrapper { .tags-view-wrapper {
.tags-view-item { .tags-view-item {
display: inline-block; display: inline-block;
@ -212,29 +210,34 @@ export default {
font-size: 12px; font-size: 12px;
margin-left: 5px; margin-left: 5px;
margin-top: 4px; margin-top: 4px;
&:first-of-type { &:first-of-type {
margin-left: 15px; margin-left: 15px;
} }
&:last-of-type { &:last-of-type {
margin-right: 15px; margin-right: 15px;
} }
&.active { &.active {
background-color: #42b983; background: #7991BC;
color: #fff; color: #fff;
border-color: #42b983; border-color: #42b983;
&::before {
content: ''; // &::before {
background: #fff; // content: '';
display: inline-block; // background: #fff;
width: 8px; // display: inline-block;
height: 8px; // width: 8px;
border-radius: 50%; // height: 8px;
position: relative; // border-radius: 50%;
margin-right: 2px; // position: relative;
} // margin-right: 2px;
// }
} }
} }
} }
.contextmenu { .contextmenu {
margin: 0; margin: 0;
background: #fff; background: #fff;
@ -247,10 +250,12 @@ export default {
font-weight: 400; font-weight: 400;
color: #333; color: #333;
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3); box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
li { li {
margin: 0; margin: 0;
padding: 7px 16px; padding: 7px 16px;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
background: #eee; background: #eee;
} }
@ -271,11 +276,13 @@ export default {
text-align: center; text-align: center;
transition: all .3s cubic-bezier(.645, .045, .355, 1); transition: all .3s cubic-bezier(.645, .045, .355, 1);
transform-origin: 100% 50%; transform-origin: 100% 50%;
&:before { &:before {
transform: scale(.6); transform: scale(.6);
display: inline-block; display: inline-block;
vertical-align: -3px; vertical-align: -3px;
} }
&:hover { &:hover {
background-color: #b4bccc; background-color: #b4bccc;
color: #fff; color: #fff;

View File

@ -1,19 +1,109 @@
<template> <template>
<div :class="classObj" class="app-wrapper"> <div :class="classObj" class="app-wrapper">
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> <div class="top_container">
<sidebar class="sidebar-container" /> <div class="content">
<div :class="{hasTagsView:needTagsView}" class="main-container"> <div class="logo">
<div :class="{'fixed-header':fixedHeader}"> <img class="img" src="@/assets/images/default_logo.png" />
<navbar /> </div>
<tags-view v-if="needTagsView" /> <div class="right-menu">
<template v-if="device !== 'mobile'">
<!-- <search id="header-search" class="right-menu-item" />
<el-tooltip content="项目文档" effect="dark" placement="bottom">
<Doc class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip content="全屏缩放" effect="dark" placement="bottom">
<screenfull id="screenfull" class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip content="布局设置" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip> -->
<i class="left_icon el-icon-search" />
<i class="left_icon el-icon-warning-outline" />
<i class="left_icon el-icon-bell" />
</template>
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover">
<div class="avatar-wrapper">
<img :src="logo || Avatar" class="user-avatar">
<span class="shop_name">{{ shopName }}</span>
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
<!-- <span style="display:block;" @click="show = true">
<el-dropdown-item>
布局设置
</el-dropdown-item>
</span> -->
<router-link to="/shop/shop/shop_configuration">
<el-dropdown-item>
店铺配置
</el-dropdown-item>
</router-link>
<span @click="dialogVisible = true">
<el-dropdown-item>
修改密码
</el-dropdown-item>
</span>
<span style="display:block;" @click="open">
<el-dropdown-item divided>
退出登录
</el-dropdown-item>
</span>
<!-- <span style="display:block;" @click="goFullScreen">
<el-dropdown-item divided>
全屏
</el-dropdown-item>
</span> -->
</el-dropdown-menu>
</el-dropdown>
</div>
</div> </div>
<app-main /> <el-dialog title="修改密码" modal-append-to-body append-to-body :visible.sync="dialogVisible" width="400px">
<right-panel v-if="showSettings"> <el-form ref="form" :model="form" :rules="rules">
<settings /> <el-form-item label="旧密码" prop="oldPass">
</right-panel> <el-input :type="ip1Type" v-model="form.oldPass" placeholder="请输入旧密码">
<i slot="suffix"
:class="`el-input__icon ${ip1Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
@click.stop="changeInputType('ip1Type')"></i>
</el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPass">
<el-input :type="ip2Type" v-model="form.newPass" placeholder="请输入新密码">
<i slot="suffix"
:class="`el-input__icon ${ip2Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
@click.stop="changeInputType('ip2Type')"></i>
</el-input>
</el-form-item>
<el-form-item label="确认新密码" prop="rnewPass">
<el-input :type="ip3Type" v-model="form.rnewPass" placeholder="请再次输入新密码">
<i slot="suffix"
:class="`el-input__icon ${ip3Type == 'text' ? 'el-icon-view' : 'el-icon-remove-outline'}`"
@click.stop="changeInputType('ip3Type')"></i>
</el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="formLoading" @click="submitHandle"> </el-button>
</span>
</el-dialog>
</div>
<div>
<div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
<sidebar class="sidebar-container" />
<div :class="{ hasTagsView: needTagsView }" class="main-container">
<div :class="{ 'fixed-header': fixedHeader }">
<navbar />
<tags-view v-if="needTagsView" />
</div>
<app-main />
<right-panel v-if="showSettings">
<settings />
</right-panel>
</div>
<!-- 防止刷新后主题丢失 -->
<Theme v-show="false" ref="theme" />
</div> </div>
<!-- 防止刷新后主题丢失 -->
<Theme v-show="false" ref="theme" />
</div> </div>
</template> </template>
@ -21,9 +111,12 @@
import RightPanel from '@/components/RightPanel' import RightPanel from '@/components/RightPanel'
import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components' import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components'
import ResizeMixin from './mixin/ResizeHandler' import ResizeMixin from './mixin/ResizeHandler'
import { mapState } from 'vuex' import { mapState, mapGetters } from 'vuex'
import Theme from '@/components/ThemePicker' import Theme from '@/components/ThemePicker'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import Avatar from '@/assets/images/avatar.png'
import { updatePass } from '@/api/login.js'
import { encrypt } from '@/utils/rsaEncrypt'
export default { export default {
name: 'Layout', name: 'Layout',
components: { components: {
@ -36,6 +129,64 @@ export default {
Theme Theme
}, },
mixins: [ResizeMixin], mixins: [ResizeMixin],
data() {
const validateNewPass = (rule, value, callback) => {
if (!this.form.newPass) {
callback(new Error(' '))
} else if (this.form.newPass === this.form.oldPass) {
callback(new Error('请输入与旧密码不同的新密码'))
} else {
callback()
}
}
const validateRnewPass = (rule, value, callback) => {
if (!this.form.rnewPass) {
callback(new Error(' '))
} else if (this.form.rnewPass !== this.form.newPass) {
callback(new Error('两次密码输入不一致'))
} else {
callback()
}
}
return {
dialogVisible: false,
Avatar: Avatar,
logo: localStorage.getItem('logo'),
shopName: localStorage.getItem('shopName'),
ip1Type: 'password',
ip2Type: 'password',
ip3Type: 'password',
formLoading: false,
form: {
oldPass: '',
newPass: '',
rnewPass: ''
},
rules: {
oldPass: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
newPass: [
{
required: true,
validator: validateNewPass,
trigger: 'blur'
}
],
rnewPass: [
{
required: true,
validator: validateRnewPass,
trigger: 'blur'
}
]
}
}
},
computed: { computed: {
...mapState({ ...mapState({
sidebar: state => state.app.sidebar, sidebar: state => state.app.sidebar,
@ -44,6 +195,12 @@ export default {
needTagsView: state => state.settings.tagsView, needTagsView: state => state.settings.tagsView,
fixedHeader: state => state.settings.fixedHeader fixedHeader: state => state.settings.fixedHeader
}), }),
...mapGetters([
'sidebar',
'device',
'user',
'baseApi'
]),
classObj() { classObj() {
return { return {
hideSidebar: !this.sidebar.opened, hideSidebar: !this.sidebar.opened,
@ -63,54 +220,199 @@ export default {
} }
}, },
methods: { methods: {
//
changeInputType(key) {
if (this[key] == 'text') {
this[key] = 'password'
} else {
this[key] = 'text'
}
},
handleClickOutside() { handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
},
//
submitHandle() {
this.$refs.form.validate(async vaild => {
if (vaild) {
try {
this.formLoading = true
const res = await updatePass({
loginType: localStorage.getItem('loginType'),
oldPass: encrypt(this.form.oldPass),
newPass: this.form.newPass
})
this.$notify.success('修改成功,请重新登陆')
setTimeout(() => {
this.logout()
}, 1000)
} catch (error) {
this.formLoading = false
console.log(error);
}
}
})
},
goFullScreen() {
if (document.documentElement.requestFullscreen) {
document.documentElement.requestFullscreen();
} else if (document.documentElement.mozRequestFullScreen) { /* Firefox */
document.documentElement.mozRequestFullScreen();
} else if (document.documentElement.webkitRequestFullscreen) { /* Chrome, Safari & Opera */
document.documentElement.webkitRequestFullscreen();
} else if (document.documentElement.msRequestFullscreen) { /* IE/Edge */
document.documentElement.msRequestFullscreen();
}
},
open() {
this.$confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
localStorage.setItem('logoutHandle', true)
this.logout()
})
},
logout() {
this.$store.dispatch('LogOut').then(() => {
location.reload()
})
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "~@/assets/styles/mixin.scss"; @import "~@/assets/styles/mixin.scss";
@import "~@/assets/styles/variables.scss"; @import "~@/assets/styles/variables.scss";
$top-c-h: 60px;
.app-wrapper { .top_container {
@include clearfix; height: $top-c-h;
position: relative; width: 100%;
height: 100%; position: fixed;
top: 0;
left: 0;
z-index: 10;
background-color: #F5F5F5;
.content {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%; width: 100%;
height: $top-c-h - 10px;
background-color: #fff;
padding: 0 20px;
&.mobile.openSidebar { .logo {
position: fixed; .img {
top: 0; display: block;
width: 123px;
height: auto
}
}
.right-menu {
display: flex;
align-items: center;
.left_icon {
font-size: 18px;
margin-right: 30px;
}
&:focus {
outline: none;
}
.right-menu-item {
display: inline-block;
padding: 0 8px;
height: 100%;
font-size: 18px;
color: #5a5e66;
vertical-align: text-bottom;
&.hover-effect {
cursor: pointer;
transition: background .3s;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
}
.avatar-container {
display: flex;
align-items: center;
.avatar-wrapper {
position: relative;
display: flex;
align-items: center;
.user-avatar {
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 50%;
}
.el-icon-caret-bottom {
font-size: 12px;
margin-left: 6px;
}
.shop_name {
font-size: 16px;
margin-left: 10px;
}
}
}
} }
} }
}
.drawer-bg { .app-wrapper {
background: #000; @include clearfix;
opacity: 0.3; position: relative;
width: 100%; height: 100%;
top: 0; width: 100%;
height: 100%;
position: absolute;
z-index: 999;
}
.fixed-header { &.mobile.openSidebar {
position: fixed; position: fixed;
top: 0; top: 0;
right: 0;
z-index: 9;
width: calc(100% - #{$sideBarWidth});
transition: width 0.28s;
padding: 0;
} }
}
.hideSidebar .fixed-header { .drawer-bg {
width: calc(100% - 54px) background: #000;
} opacity: 0.3;
width: 100%;
top: 0;
height: 100%;
position: absolute;
z-index: 999;
}
.mobile .fixed-header { .fixed-header {
width: 100%; position: fixed;
} top: $top-c-h;
right: 0;
z-index: 9;
width: calc(100% - #{$sideBarWidth});
transition: width 0.28s;
padding: 0;
}
.hideSidebar .fixed-header {
width: calc(100% - 54px)
}
.mobile .fixed-header {
width: 100%;
}
</style> </style>

View File

@ -6,6 +6,11 @@ import "normalize.css/normalize.css";
import Element from "element-ui"; import Element from "element-ui";
// 图片选择器
// import VueSelectImage from 'vue-select-image'
// import "vue-select-image/dist/vue-select-image.css";
// Vue.use(VueSelectImage)
// 数据字典 // 数据字典
import dict from "./components/Dict"; import dict from "./components/Dict";
import Editor from "@/components/Editor"; import Editor from "@/components/Editor";
@ -17,6 +22,7 @@ import "./assets/styles/element-variables.scss";
// global css // global css
import "./assets/styles/index.scss"; import "./assets/styles/index.scss";
import "./assets/styles/util.scss";
import App from "./App"; import App from "./App";
import store from "./store"; import store from "./store";

View File

@ -51,13 +51,19 @@ export const constantRouterMap = [
path: 'data_forms', path: 'data_forms',
component: (resolve) => require(['@/views/home/data_forms'], resolve), component: (resolve) => require(['@/views/home/data_forms'], resolve),
name: 'data_forms', name: 'data_forms',
meta: { title: '数据报表' } meta: { title: '销量统计' }
}, },
{ {
path: 'data_tables', path: 'data_tables',
component: (resolve) => require(['@/views/home/data_tables'], resolve), component: (resolve) => require(['@/views/home/data_tables'], resolve),
name: 'data_tables', name: 'data_tables',
meta: { title: '桌台统计' } meta: { title: '桌台统计' }
},
{
path: 'data_record',
component: (resolve) => require(['@/views/home/data_record'], resolve),
name: 'data_record',
meta: { title: '交班记录' }
} }
] ]
}, },

View File

@ -2,7 +2,7 @@ module.exports = {
/** /**
* @description 网站标题 * @description 网站标题
*/ */
title: '管理后台', title: "管理后台",
/** /**
* @description 是否显示 tagsView * @description 是否显示 tagsView
*/ */
@ -22,7 +22,7 @@ module.exports = {
/** /**
* @description token key * @description token key
*/ */
TokenKey: 'ELADMIN-TOEKN', TokenKey: "ELADMIN-TOEKN",
/** /**
* @description 请求超时时间毫秒默认2分钟 * @description 请求超时时间毫秒默认2分钟
*/ */
@ -38,36 +38,37 @@ module.exports = {
/** /**
* 底部文字支持html语法 * 底部文字支持html语法
*/ */
footerTxt: '© 2018-2024 超掌柜科技 <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License 2.0</a>', footerTxt:
'© 2018-2024 超掌柜科技 <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License 2.0</a>',
/** /**
* 备案号 * 备案号
*/ */
caseNumber: '陕ICP备2022008069号', caseNumber: "陕ICP备2022008069号",
typeEnum: [ typeEnum: [
{ {
label: '计量商品', label: "单规格",
intro: '单价购买', intro: "单价购买",
typeEnum: 'normal' typeEnum: "normal"
}, },
{ {
label: '多规格', label: "多规格",
intro: '多种不同规格', intro: "多种不同规格",
typeEnum: 'sku' typeEnum: "sku"
},
{
label: '套餐商品',
intro: '选职多种组合',
typeEnum: 'group'
},
{
label: '称重商品',
intro: '按重量售卖',
typeEnum: 'weight'
},
{
label: '时价商品',
intro: '收银端可更改价格',
typeEnum: 'currentPrice'
} }
// {
// label: '套餐商品',
// intro: '选职多种组合',
// typeEnum: 'group'
// },
// {
// label: '称重商品',
// intro: '按重量售卖',
// typeEnum: 'weight'
// },
// {
// label: '时价商品',
// intro: '收银端可更改价格',
// typeEnum: 'currentPrice'
// }
] ]
} };

View File

@ -17,6 +17,7 @@ const getters = {
fileUploadApi: state => state.api.fileUploadApi, fileUploadApi: state => state.api.fileUploadApi,
updateAvatarApi: state => state.api.updateAvatarApi, updateAvatarApi: state => state.api.updateAvatarApi,
qiNiuUploadApi: state => state.api.qiNiuUploadApi, qiNiuUploadApi: state => state.api.qiNiuUploadApi,
versionUploadApi: state => state.api.versonUploadApi,
sqlApi: state => state.api.sqlApi, sqlApi: state => state.api.sqlApi,
swaggerApi: state => state.api.swaggerApi, swaggerApi: state => state.api.swaggerApi,
sidebarRouters: state => state.permission.sidebarRouters sidebarRouters: state => state.permission.sidebarRouters

View File

@ -18,6 +18,8 @@ const api = {
swaggerApi: baseUrl + '/doc.html', swaggerApi: baseUrl + '/doc.html',
// 文件上传 // 文件上传
fileUploadApi: baseUrl + '/api/localStorage', fileUploadApi: baseUrl + '/api/localStorage',
// 上传版本文件
versonUploadApi: baseUrl + '/api/qiNiuContent/uploadVersionFile',
// baseUrl // baseUrl
baseApi: baseUrl baseApi: baseUrl
} }

View File

@ -1,5 +1,5 @@
import { login, getInfo, logout } from '@/api/login' import { login, getInfo, logout } from "@/api/login";
import { getToken, setToken, removeToken } from '@/utils/auth' import { getToken, setToken, removeToken } from "@/utils/auth";
const user = { const user = {
state: { state: {
@ -13,91 +13,99 @@ const user = {
mutations: { mutations: {
// 是否为手动退出登录 // 是否为手动退出登录
SD_LOGOUT: (state, f) => { SD_LOGOUT: (state, f) => {
state.sdLogout = f state.sdLogout = f;
}, },
SET_TOKEN: (state, token) => { SET_TOKEN: (state, token) => {
state.token = token state.token = token;
}, },
SET_USER: (state, user) => { SET_USER: (state, user) => {
state.user = user state.user = user;
}, },
SET_ROLES: (state, roles) => { SET_ROLES: (state, roles) => {
state.roles = roles state.roles = roles;
}, },
SET_LOAD_MENUS: (state, loadMenus) => { SET_LOAD_MENUS: (state, loadMenus) => {
state.loadMenus = loadMenus state.loadMenus = loadMenus;
} }
}, },
actions: { actions: {
// 登录 // 登录
Login({ commit }, userInfo) { Login({ commit }, userInfo) {
const rememberMe = userInfo.rememberMe const rememberMe = userInfo.rememberMe;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
login(userInfo.username, userInfo.password, userInfo.code, userInfo.uuid).then(res => { login(userInfo)
// console.log('登录成功后返回===', res) .then(res => {
localStorage.setItem('logoutHandle', false) // console.log('登录成功后返回===', res)
localStorage.setItem('shopId', res.shopId) localStorage.setItem("logoutHandle", false);
localStorage.setItem('shopName', res.shopName) localStorage.setItem("shopId", res.shopId);
localStorage.setItem('logo', res.logo) localStorage.setItem("shopName", res.shopName);
setToken(res.token, rememberMe) localStorage.setItem("logo", res.logo);
commit('SET_TOKEN', res.token) localStorage.setItem("loginType", res.loginType);
setUserInfo(res.user, commit) localStorage.setItem("userInfo", JSON.stringify(res.user.user));
// 第一次加载菜单时用到, 具体见 src 目录下的 permission.js setToken(res.token, rememberMe);
commit('SET_LOAD_MENUS', true) commit("SET_TOKEN", res.token);
resolve() setUserInfo(res.user, commit);
}).catch(error => { // 第一次加载菜单时用到, 具体见 src 目录下的 permission.js
reject(error) commit("SET_LOAD_MENUS", true);
}) resolve();
}) })
.catch(error => {
reject(error);
});
});
}, },
// 获取用户信息 // 获取用户信息
GetInfo({ commit }) { GetInfo({ commit }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getInfo().then(res => { getInfo()
setUserInfo(res, commit) .then(res => {
resolve(res) setUserInfo(res, commit);
}).catch(error => { resolve(res);
reject(error) })
}) .catch(error => {
}) reject(error);
});
});
}, },
// 登出 // 登出
LogOut({ commit }) { LogOut({ commit }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
logout().then(res => { logout()
logOut(commit) .then(res => {
resolve() logOut(commit);
}).catch(error => { resolve();
logOut(commit) })
reject(error) .catch(error => {
}) logOut(commit);
}) reject(error);
});
});
}, },
updateLoadMenus({ commit }) { updateLoadMenus({ commit }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
commit('SET_LOAD_MENUS', false) commit("SET_LOAD_MENUS", false);
}) });
} }
} }
} };
export const logOut = (commit) => { export const logOut = commit => {
commit('SET_TOKEN', '') commit("SET_TOKEN", "");
commit('SET_ROLES', []) commit("SET_ROLES", []);
removeToken() removeToken();
} };
export const setUserInfo = (res, commit) => { export const setUserInfo = (res, commit) => {
// 如果没有任何权限,则赋予一个默认的权限,避免请求死循环 // 如果没有任何权限,则赋予一个默认的权限,避免请求死循环
if (res.roles.length === 0) { if (res.roles.length === 0) {
commit('SET_ROLES', ['ROLE_SYSTEM_DEFAULT']) commit("SET_ROLES", ["ROLE_SYSTEM_DEFAULT"]);
} else { } else {
commit('SET_ROLES', res.roles) commit("SET_ROLES", res.roles);
} }
commit('SET_USER', res.user) commit("SET_USER", res.user);
} };
export default user export default user;

30
src/utils/format.js Normal file
View File

@ -0,0 +1,30 @@
/**
* 格式化价格函数将价格限定在指定的最小值和最大值范围内并保留两位小数
*
* @param {number} price - 需要格式化的价格
* @param {number} min - 价格的最小值
* @param {number} max - 价格的最大值默认为100000000
* @param {Boolean} returnIsArea - 是否返回值符合范围区间默认为false
* @returns {number} - 返回格式化后的价格如果超出范围则返回最小值或最大值
*/
export const formatPrice = (price,min=-Infinity, max = 100000000,returnIsArea=false ) => {
if(price === undefined || price === null||price===''){
return 0
}
// 将价格转换为浮点数并保留两位小数
const newval = parseFloat((Math.floor(price * 100) / 100).toFixed(2))
// 如果价格大于最大值,返回最大值
if (newval > max) {
return returnIsArea?{value:max,error:true}:max
}
// 如果价格小于最小值,返回最小值
if (newval < min) {
return returnIsArea?{value:min,error:true}:min
}
// 如果价格小于最小值,返回最小值
if (newval < min) {
return min
}
// 返回格式化后的价格
return newval
}

View File

@ -0,0 +1,29 @@
// 最新的一个请求
let cancel = null
// 所有请求
let cancelTokenList = []
function setToken(cancelToken) {
cancel = cancelToken
cancelTokenList.push(cancelToken)
}
function cancelToken() {
cancel && cancel()
cancelTokenList.pop()
}
function clearAllToken() {
while (cancelTokenList.length > 0) {
let cancel = cancelTokenList.pop()
console.log(cancel, 'cancel')
cancel && cancel()
}
}
export {
setToken,
cancelToken,
clearAllToken,
}

View File

@ -423,7 +423,7 @@ export function isPcBowser() {
* decimal你保留的几位,默认保留小数后两位 * decimal你保留的几位,默认保留小数后两位
* isInt 是否保留0 * isInt 是否保留0
*/ */
export function formatDecimal(num, decimal = 2, isInt = false) { export function formatDecimal(num = 0, decimal = 2, isInt = false) {
num = num.toFixed(3).toString(); num = num.toFixed(3).toString();
const index = num.indexOf("."); const index = num.indexOf(".");
if (index !== -1) { if (index !== -1) {
@ -438,3 +438,15 @@ export function formatDecimal(num, decimal = 2, isInt = false) {
return parseFloat(num).toFixed(decimal); return parseFloat(num).toFixed(decimal);
} }
} }
/**
* 传入数组以及要交换位置的2个元素的下标
* @param {*} arr
* @param {*} i1
* @param {*} i2
* @returns
*/
export function swapArrayEle(arr, i1, i2) {
arr[i1] = arr.splice(i2, 1, arr[i1])[0];
return arr;
}

153
src/utils/limits.js Normal file
View File

@ -0,0 +1,153 @@
import { getHasPermission } from "@/api/shop";
import { Notification } from 'element-ui'
const userInfo = JSON.parse(localStorage.getItem("userInfo"));
const $PermissionObj = {
data: [{
key: 'yun_xu_cha_kan_jing_ying_shu_ju',
text: '允许查看经营数据'
},
{
key: 'yun_xu_cha_kan_suo_you_jiao_ban_ji_lu',
text: '允许查看所有交班记录'
}
],
default: [{
key: 'yun_xu_xia_dan',
text: '允许下单'
},
{
key: 'yun_xu_shou_kuan',
text: '允许收款'
},
{
key: 'yun_xu_tui_kuan',
text: '允许退款'
},
{
key: 'yun_xu_jiao_ban',
text: '允许交班'
}
],
goods: [{
key: 'yun_xu_xiu_gai_shang_pin',
text: '允许修改商品'
},
{
key: 'yun_xu_shang_xia_jia_shang_pin',
text: '允许上下架商品'
},
{
key: 'yun_xu_xiu_gai_fen_lei',
text: '允许修改分类'
},
{
key: 'yun_xu_xiu_gai_fen_zu',
text: '允许修改分组'
}
],
discount:[
{
key: 'yun_xu_da_zhe',
text: '允许打折'
}
],
vip:[
{
key: 'yun_xu_guan_li_hui_yuan_xin_xi',
text: '允许管理会员信息'
},
{
key: 'yun_xu_xiu_gai_hui_yuan_yu_e',
text: '允许修改会员余额'
}
],
stock:[
{
text: '允许提交报损',
key: 'yun_xu_ti_jiao_bao_sun'
},
{
text: '允许沽清',
key: 'yun_xu_gu_qing'
},
{
text: '允许售罄商品',
key: 'yun_xu_shou_qing_shang_pin'
},
{
text:'允许修改商品库存',
key:'yun_xu_xiu_gai_shang_pin_ku_cun'
},
{
text: '允许耗材入库',
key: 'yun_xu_hao_cai_ru_ku'
},
{
text: '允许耗材出库',
key: 'yun_xu_hao_cai_chu_ku'
},
{
text: '允许耗材盘点',
key: 'yun_xu_hao_cai_pan_dian'
}
]
}
export async function hasPermission (params) {
//如果是商户默认拥有全部权限
const loginType = localStorage.getItem('loginType')
if(loginType=='merchant'){
return true
}
params = returnFormatParams(params)
if (!params) {
return Notification.error('未找到相关权限请检查代码或在权限配置文件commons/utils/hasPermission.js文件进行修改或增加')
}
const option = Object.assign({
tips: true,
key: '',
text: ''
}, params)
const res = await getHasPermission({
userId : userInfo.id,
code: params.key
})
if (!res && option.tips) {
Notification.error({
title: '您没有' + params.text + '权限!',
duration: 5000
})
}
return res
}
export function isObjectButNotArray(value) {
return typeof value === 'object' && Array.isArray(value) === false;
}
export function findPermissionObj(str) {
for (let i in $PermissionObj) {
const obj = $PermissionObj[i].find(v => v.key == str || v.text == str)
if (obj) {
return obj
break
}
}
console.error('未找到相关权限配置请检查权限配置文件commons/utils/hasPermission.js文件进行修改或增加')
return false
}
export function returnFormatParams(params) {
if (typeof params === 'string') {
return findPermissionObj(params)
} else {
if (isObjectButNotArray(params)) {
const obj=findPermissionObj(params.key || params.text)
return {...params,...obj}
} else {
console.error('参数只能是字符串或者对象,不能是数组')
}
}
}

128
src/utils/oss-upload.js Normal file
View File

@ -0,0 +1,128 @@
import OSS from "ali-oss";
import { $getCredentials } from "@/api/version";
const $headers = {
"Access-Control-Allow-Origin": "*"
};
const $config = {
region: "oss-cn-beijing",
accessKeyId: "",
accessKeySecret: "",
bucket: "cashier-oss"
}
import { Notification } from 'element-ui'
function urlConversion(path) {
let reg = /^(https?:\/\/)([0-9a-z.]+)(:[0-9]+)?([/0-9a-z.]+)?(\?[0-9a-z&=]+)?(#[0-9-a-z]+)?/i
path = path.replace(reg, "https://$2$3$4$5$6");
return path
}
async function uploadAndDownloadFile(name, file, headers) {
return new Promise((resolve, reject) => {
try {
ossClient.put(name, file, { ...$headers, ...headers }).then((res) => {
console.log(res);
resolve(res);
});
} catch (error) {
console.error(error)
reject(error);
}
});
}
class ossClient {
constructor(config) {
this.ossClient = new OSS({
...$config, ...config, refreshSTSToken: async () => {
// 向您搭建的STS服务获取临时访问凭证。
const res = await $getCredentials()
return {
accessKeyId: res.accessKeyId, // 自己账户的accessKeyId或临时秘钥
accessKeySecret: res.accessKeySecret, // 自己账户的accessKeySecret或临时秘钥
stsToken: res.securityToken, // 从STS服务获取的安全令牌SecurityToken
}
},
// 刷新临时访问凭证的时间间隔,单位为毫秒。
refreshSTSTokenInterval: 3600 * 1000
});
}
async upload(name, file, progressCallback) {
try {
let options = {
// 获取分片上传进度、断点和返回值。
progress: progressCallback,
headers: $headers
}
const {
res: resp
} = await this.ossClient.put(name, file, options).catch(error => {
reject(error);
})
return resp.requestUrls
} catch (error) {
console.log(error)
reject(error);
}
}
/**
* 分片上传
* @param {Object} client oss客户端
* @param {Object} file 上传的文件
* @param {Object} dir 上传oss的文件夹
* @param {Object} progressCallback 分片进度回调
*/
async partUpload(name, file, progressCallback) {
try {
let options = {
// 获取分片上传进度、断点和返回值。
progress: progressCallback,
// 设置并发上传的分片数量。
parallel: 8,
// 设置分片大小。默认值为1 MB最小值为100 KB。
partSize: 100 * 1024,
mime: file.type
}
const {
res: resp
} = await this.ossClient.multipartUpload(name ? name : file.name, file, options)
// return resp.requestUrls
console.log('------resp---');
console.log(resp)
return urlConversion( `${resp.requestUrls[0]}`.split('?')[0])
} catch (e) {
console.log('------e---');
console.log(e);
if (e.name == 'cancel') {
Notification.error({
title: '上传已取消',
duration: 3000
})
return e
}
}
}
/**
* 结束上传并删除碎片
* @param {Object} client
* @param {Object} uploadId
* @param {Object} name
*/
async abortUpload(uploadId, name) {
try {
const res=await this.ossClient.abortMultipartUpload(name, uploadId)
return res
} catch (error) {
console.log(error)
return error
}
}
}
export default ossClient;

View File

@ -5,7 +5,7 @@ import store from '../store'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import Config from '@/settings' import Config from '@/settings'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import { setToken } from '@/utils/globalCancelToken.js'
// 创建axios实例 // 创建axios实例
const service = axios.create({ const service = axios.create({
// baseURL: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API : '/', // baseURL: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API : '/',
@ -23,6 +23,8 @@ service.interceptors.request.use(
config.headers['loginName'] = 'admin' config.headers['loginName'] = 'admin'
config.headers['token'] = 'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyVHlwZSI6Ik1HIiwiZXhwIjoxNjkwMTgwNzE2LCJ1c2VySWQiOiIyNDQiLCJpYXQiOjE2ODg3MDk0ODcsImxvZ2luTmFtZSI6ImFkbWluIn0.lqxxvv2-FcecQngMBorz4MpkB3mIJQDG-IUULQyV-KQ' config.headers['token'] = 'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyVHlwZSI6Ik1HIiwiZXhwIjoxNjkwMTgwNzE2LCJ1c2VySWQiOiIyNDQiLCJpYXQiOjE2ODg3MDk0ODcsImxvZ2luTmFtZSI6ImFkbWluIn0.lqxxvv2-FcecQngMBorz4MpkB3mIJQDG-IUULQyV-KQ'
config.headers["userId"] = '244' config.headers["userId"] = '244'
// 添加可取消请求配置
config.cancelToken = new axios.CancelToken(c => setToken(c))
return config return config
}, },
error => { error => {
@ -37,6 +39,15 @@ service.interceptors.response.use(
}, },
error => { error => {
console.log(error); console.log(error);
if (axios.isCancel(error)) {
console.log('请求已取消')
Notification.error({
title: '请求已取消',
duration: 5000
})
return Promise.reject('请求已取消')
}
// 兼容blob下载出错json提示 // 兼容blob下载出错json提示
if (error.response.data instanceof Blob && error.response.data.type.toLowerCase().indexOf('json') !== -1) { if (error.response.data instanceof Blob && error.response.data.type.toLowerCase().indexOf('json') !== -1) {
const reader = new FileReader() const reader = new FileReader()

93
src/utils/requestPhp.js Normal file
View File

@ -0,0 +1,93 @@
import axios from 'axios'
import router from '@/router/routers'
import { Notification } from 'element-ui'
import store from '../store'
import { getToken } from '@/utils/auth'
import Config from '@/settings'
import Cookies from 'js-cookie'
// 创建axios实例
const service = axios.create({
baseURL: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_PHP_API: '/source',
// baseURL: process.env.VUE_APP_PHP_API, // api 的 base_url
timeout: Config.timeout // 请求超时时间
})
// request拦截器
service.interceptors.request.use(
config => {
// if (getToken()) {
// config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
// }
config.headers['Content-Type'] = 'text/html; charset=UTF-8'
// config.headers['loginName'] = 'admin'
// config.headers['token'] = 'eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyVHlwZSI6Ik1HIiwiZXhwIjoxNjkwMTgwNzE2LCJ1c2VySWQiOiIyNDQiLCJpYXQiOjE2ODg3MDk0ODcsImxvZ2luTmFtZSI6ImFkbWluIn0.lqxxvv2-FcecQngMBorz4MpkB3mIJQDG-IUULQyV-KQ'
// config.headers["userId"] = '244'
return config
},
error => {
Promise.reject(error)
}
)
// response 拦截器
service.interceptors.response.use(
response => {
return response.data
},
error => {
console.log(error);
// 兼容blob下载出错json提示
if (error.response.data instanceof Blob && error.response.data.type.toLowerCase().indexOf('json') !== -1) {
const reader = new FileReader()
reader.readAsText(error.response.data, 'utf-8')
reader.onload = function (e) {
const errorMsg = JSON.parse(reader.result).message
Notification.error({
title: errorMsg,
duration: 5000
})
}
} else {
let code = 0
try {
code = error.response.data.status
} catch (e) {
if (error.toString().indexOf('Error: timeout') !== -1) {
Notification.error({
title: '网络请求超时',
duration: 5000
})
return Promise.reject(error)
}
}
console.log(code)
if (code) {
if (code === 401) {
store.dispatch('LogOut').then(() => {
// 用户登录界面提示
Cookies.set('point', 401)
location.reload()
})
} else if (code === 403) {
router.push({ path: '/401' })
} else {
const errorMsg = error.response.data.message
if (errorMsg !== undefined) {
Notification.error({
title: errorMsg,
duration: 5000
})
}
}
} else {
Notification.error({
title: '接口请求失败',
duration: 5000
})
}
}
return Promise.reject(error)
}
)
export default service

38
src/utils/table.js Normal file
View File

@ -0,0 +1,38 @@
export const $status= {
pending: {
label: "挂单中",
type: "#E6A23C",
},
using: {
label: "开台中",
type: "#fa5555",
},
paying: {
label: "结算中",
type: "#E6A23C",
},
idle: {
label: "空闲",
type: "#3F9EFF",
},
subscribe: {
label: "预定",
type: "rgb(34, 191, 100)",
},
closed: {
label: "关台",
type: "rgb(221,221,221)",
},
// opening: {
// label: "开台中",
// type: "#67C23A",
// },
cleaning: {
label: "待清台",
type: "#FAAD14",
},
unbind:{
label: "未绑定",
type: "rgb(221,221,221)",
}
}

View File

@ -0,0 +1,257 @@
<template>
<div style="padding: 20px;">
<el-form ref="query" style="display: flex;" :model="query" label-width="80px">
<el-form-item label="展示位置">
<el-select clearable v-model="query.showPosition" placeholder="请选择">
<el-option label="首页" value="home" />
<el-option label="点餐页" value="make_order" />
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-select clearable v-model="query.status" placeholder="请选择">
<el-option label="可见" value="1" />
<el-option label="不可见" value="2" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getList">查询</el-button>
<el-button type="primary" @click="dialogVisible = true; title = '新增'">新增</el-button>
</el-form-item>
</el-form>
<!--表格渲染-->
<el-table ref="table" :data="tableData" style="width: 100%;">
<el-table-column label="弹窗广告">
<template v-slot="scope">
<img :src="scope.row.imgUrl" style="width: 100px;height: 100px;">
</template>
</el-table-column>
<el-table-column prop="showPosition" label="弹窗位置">
<template v-slot="scope">
{{ scope.row.showPosition == 'home' ? '首页' : "点餐页" }}
</template>
</el-table-column>
<el-table-column prop="showPosition" label="是否可见">
<template v-slot="scope">
<el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0"
@change="showChange(scope.row)"></el-switch>
</template>
</el-table-column>
<el-table-column prop="" label="弹窗频率">
<template v-slot="scope">
{{ scope.row.frequency | frequencyFilter }}
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建日期" />
<el-table-column label="操作" width="200">
<template v-slot="scope">
<el-button type="text" @click="edit(scope.row)">编辑</el-button>
<el-popconfirm title="确定删除吗?" @confirm="delHandle(scope.row.id)">
<el-button type="text" round slot="reference">
删除
</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<!-- <div class="">
<el-pagination :total="tableData.length" layout="total, prev, pager, next, jumper"></el-pagination>
</div> -->
<!-- 增减余额弹窗 -->
<el-dialog :title="title + '广告'" :visible.sync="dialogVisible" width="60%">
<el-form ref="form" :model="form" label-width="120px">
<el-form-item label="上传弹窗广告">
<!-- <el-upload
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove">
<i class="el-icon-plus"></i>
</el-upload> -->
<el-upload class="upload-demo" :action="qiNiuUploadApi" list-type="picture-card" :headers="headers"
:limit="1" :on-remove="removeEvent" :on-success="successEvent" :file-list="fileList">
<i class="el-icon-plus"></i>
</el-upload>
<div slot="tip" class="el-upload__tip">建议尺寸520px*680px</div>
</el-form-item>
<el-form-item label="圆角设置">
<el-slider v-model="form.borderRadius" :max="20"></el-slider>
</el-form-item>
<el-form-item label="弹窗位置">
<el-radio-group v-model="form.showPosition">
<el-radio label="home">首页</el-radio>
<el-radio label="make_order">点餐页</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="弹窗频率">
<el-radio-group v-model="form.frequency">
<el-radio label="only_one">仅首次打开显示</el-radio>
<el-radio label="every_show">每次打开显示一次</el-radio>
<el-radio label="thirty_day">每30天显示一次</el-radio>
<el-radio label="seven_day">每7天显示一次</el-radio>
<el-radio label="three_day">每3天显示一次</el-radio>
<el-radio label="every_day">每1天显示一次</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="跳转页面">
<el-select clearable v-model="form.linkPath" placeholder="请选择">
<el-option v-for="item in tourl" :key="item.id" :label="item.name" :value="item.path">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="sumbit"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { miniAppPagesget } from '@/api/goxcx'
import { getToken } from '@/utils/auth'
import { adget, adpost, adput, addelete } from '@/api/application'
import { mapGetters } from 'vuex'
export default {
computed: {
...mapGetters(['qiNiuUploadApi'])
},
data() {
return {
headers: {
Authorization: getToken()
},
tourl: [],
query: {
showPosition: "", status: ""
},
form: {
sort: "",
path: "",
shopId: localStorage.getItem("shopId"),
showPosition: 'home',
frequency: "only_one"
},
title: '新增',
dialogVisible: false,
tableData: [],
fileList: [],
}
},
mounted() {
this.getList()
//
this.getto()
},
filters: {
frequencyFilter(key) {
let str = ""
switch (key) {
case 'only_one':
str = '仅首次展示'
break;
case 'every_show':
str = '每次打开都展示'
break;
case 'every_day':
str = '每天展示一次'
break;
case 'three_day':
str = '每三天展示一次'
break;
case 'seven_day':
str = '每七天展示一次'
break;
case 'thirty_day':
str = '每30天展示一次'
break;
}
return str
},
},
methods: {
successEvent(file) {
this.fileList = [{ url: file.data[0], name: '图片' }]
},
removeEvent(file) {
//
let index = this.fileList.findIndex(ele => ele.url == file.response.data[0])
this.fileList.splice(index, 1);
},
async showChange(d) {
if (!d.imgUrl) {
this.form.imgUrl = this.fileList
}
await adput({
imgUrl:d.imgUrl,
id: d.id,
shopId: this.form.shopId,
status: d.status,
})
this.$message({
message: '成功',
type: 'success'
})
this.getList()
},
async getto() {
let res = await miniAppPagesget()
this.tourl = res
},
async sumbit() {
this.form.imgUrl = this.fileList[0].url
this.dialogVisible = false
if (this.title == '新增') {
await adpost(this.form)
this.$message({
message: '添加成功',
type: 'success'
})
} else {
await adput(this.form)
this.$message({
message: '编辑成功',
type: 'success'
})
}
this.form = {
sort: "",
path: "",
status: 1,
shopId: localStorage.getItem("shopId"),
showPosition: 'home',
frequency: "only_one"
}
this.fileList = []
this.getList()
},
//
async edit(item) {
this.title = '编辑'
this.dialogVisible = true
this.form = item
console.log(item.imgUrl, '调试1')
this.fileList = [{ url: item.imgUrl, name: '图片' }]
},
//
async delHandle(adId) {
let res = await addelete(adId)
this.$message({
message: '删除成功',
type: 'success'
})
this.getList()
},
async getList() {
let res = await adget({
shopId: localStorage.getItem("shopId"),
...this.query
})
this.tableData = res
},
}
}
</script>
<style></style>

View File

@ -0,0 +1,128 @@
<template>
<div class="app-container">
<div class="container">
<el-form ref="form" :model="form" label-width="140px" label-position="left">
<el-form-item label="功能启用">
<el-switch v-model="form.enable"></el-switch>
</el-form-item>
<el-form-item label="充值设置">
<template>
<div class="labelbox">
用户消费结账时成功充值消费
<el-input style="width: 80px;margin: 0 15px;" v-model="form.rechargeTimes"></el-input>
倍的金额本单即可享受免单
</div>
</template>
</el-form-item>
<el-form-item label="充值门槛">
<template>
<div class="labelbox">
订单支付金额需满
<el-input style="width: 80px;margin: 0 15px;" v-model="form.rechargeThreshold"></el-input>
元才能使用
</div>
</template>
</el-form-item>
<!-- <el-form-item label="适用门店">
<el-radio-group v-model="form.resource">
<el-radio label="全部门店"></el-radio>
<el-radio label="指定门店"></el-radio>
<el-radio label="仅本店使用"></el-radio>
</el-radio-group>
</el-form-item> -->
<!-- <el-form-item label="使用方式">
<el-checkbox-group v-model="form.useTypeList">
<el-checkbox label="堂食" name="dine-in" value="dine-in"></el-checkbox>
<el-checkbox label="自取" name="takeout" value="takeout"></el-checkbox>
<el-checkbox label="配送" name="takeaway" value="takeaway"></el-checkbox>
<el-checkbox label="快递" name="post" value="post"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="是否与优惠券共享">
<el-switch v-model="form.withCoupon"></el-switch>
</el-form-item>
<el-form-item label="是否与积分共享">
<el-switch v-model="form.withPoints"></el-switch>
</el-form-item>
<el-form-item label="不参与集章">
<el-switch v-model="form.childShopIdList"></el-switch>
</el-form-item> -->
<el-form-item label="充值说明">
<el-input type="textarea" v-model="form.rechargeDesc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="editlist">保存</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import { get, edit } from "@/api/bwc";
export default {
name: 'bwc',
data() {
return {
form: {
id: '',
enable: '',
rechargeTimes: '',
rechargeThreshold: '',
withCoupon: '',
withPoints: '',
rechargeDesc: '',
useTypeList: [],
childShopIdList: '',
}
}
},
created() {
this.getlist()
},
methods: {
async getlist() {
let res = await get({
shopId: localStorage.getItem("shopId")
})
this.form = res
},
async editlist() {
this.form.shopId = localStorage.getItem("shopId")
let res = await edit(this.form)
this.$message({
message: '保存成功',
type: 'success'
});
this.form = res
},
}
}
</script>
<style scoped lang="scss">
.app-container {
padding: 12px 20px;
height: auto;
background-color: #f4f9ff;
.container {
padding: 30px;
width: 100%;
height: 100%;
background: #FFFFFF;
.labelbox {
display: flex;
justify-content: flex-start;
align-items: center;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 16px;
color: #666666;
}
}
}
</style>

View File

@ -0,0 +1,97 @@
<!-- 添加优惠券 -->
<template>
<el-dialog :title="type == 1 ? '编辑优惠券' : '添加优惠券'" :visible.sync="dialogVisible" @close="reset">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="券名称" prop="couponId">
<el-select v-model="form.couponId" placeholder="请选择优惠券">
<el-option :label="item.title" :value="item.id" v-for="item in coupons" :key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="数量">
<el-input-number v-model="form.couponNum" :min="1"></el-input-number>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="loading" @click="onSubmitHandle"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { getTbShopCoupon } from '@/api/coupon.js'
export default {
data() {
return {
dialogVisible: false,
loading: false,
coupons: [],
type: 1,
form: {
couponId: '',
couponName: '',
couponNum: ''
},
resetForm: {},
rules: {
couponId: [
{
required: true,
message: '请选择优惠券',
trigger: 'blur'
}
],
}
}
},
mounted() {
this.resetForm = { ...this.form }
this.getTbShopCoupon()
},
methods: {
//
onSubmitHandle() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.form.couponName = this.coupons.find(item => item.id == this.form.couponId).title
this.$emit('success', { ...this.form })
this.close()
} catch (error) {
console.log(error)
}
}
})
},
//
async getTbShopCoupon() {
try {
const res = await getTbShopCoupon({
shopId: localStorage.getItem('shopId'),
type: 1,
page: 1,
size: 100
})
this.coupons = res.content
} catch (error) {
console.log(error);
}
},
reset() {
this.form = { ...this.resetForm }
},
close() {
this.dialogVisible = false
},
show(row) {
if (row && row.couponId) {
this.type = 1
this.form = { ...row }
} else {
this.type = 2
}
this.dialogVisible = true
}
}
}
</script>

View File

@ -0,0 +1,263 @@
<template>
<div>
<div>
<el-form :model="query" inline label-position="left">
<el-form-item>
<el-input placeholder="邀请人名称/被邀请人/昵称/手机号" v-model="query.search" style="width: 240px;" />
</el-form-item>
<el-form-item>
<el-select v-model="query.status" placeholder="状态" style="width: 140px;">
<el-option :label="item.label" :value="item.value" v-for="item in statusList"
:key="item.value"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item>
<el-date-picker v-model="query.createdAt" type="daterange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item> -->
<el-form-item>
<el-button type="primary" @click="queryHandle">查询</el-button>
<el-button @click="resetHandle">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="head-container">
<el-table :data="tableData.list" v-loading="tableData.loading">
<el-table-column label="邀请人" prop="invitedName">
<template v-slot="scope">
<div class="goods_info">
<el-image :src="scope.row.invitedHeadImg" style="width:40px;height:40px;flex-shrink: 0;"
:preview-src-list="avatarUrlList1">
<div slot="error" class="image-slot">
<i class="el-icon-folder-delete"></i>
</div>
</el-image>
<span>{{ scope.row.invitedName }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="被邀请人" prop="beInvitedName">
<template v-slot="scope">
<div class="goods_info">
<el-image :src="scope.row.beInvitedHeadImg" style="width:40px;height:40px;flex-shrink: 0;"
:preview-src-list="avatarUrlList2">
<div slot="error" class="image-slot">
<i class="el-icon-folder-delete"></i>
</div>
</el-image>
<span>{{ scope.row.beInvitedName }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="邀请状态" prop="status">
<template v-slot="scope">
<template v-if="scope.row.method == 'get' && scope.row.status == 2">
<el-tag type="success" disable-transitions>已邀请成功</el-tag>
</template>
<template v-else-if="scope.row.method == 'use' && scope.row.status == 3">
<el-tag type="success" disable-transitions>已邀请成功</el-tag>
</template>
<template v-else>
<el-tag type="danger" disable-transitions>未邀请成功</el-tag>
</template>
</template>
</el-table-column>
<el-table-column label="邀请时间" prop="createTime"></el-table-column>
<el-table-column label="生效时间" prop="updateTime">
<template v-slot="scope">
<template v-if="scope.row.method == 'get'">{{ scope.row.updateTime }}</template>
<template v-if="scope.row.method == 'use'">{{ scope.row.rewardTime }}</template>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination :total="tableData.total" @size-change="handleSizeChange" :current-page="tableData.page"
:page-size="tableData.size" @current-change="paginationChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
</div>
</template>
<script>
import { byShare, byShopId } from '@/api/inviteFirend.js'
const statusList = [
{
value: 0,
label: '非新用户'
},
{
value: 1,
label: '未领取'
},
{
value: 2,
label: '已领取'
},
{
value: 3,
label: '已使用'
},
]
export default {
data() {
return {
statusList,
avatarUrlList1: [],
avatarUrlList2: [],
shareId: '',
query: {
search: '',
status: ''
},
resetQuery: '',
tableData: {
list: [],
page: 1,
size: 30,
loading: false,
total: 0
},
}
},
filters: {
statusFilter(t) {
return statusList.find(item => item.value == t).label
}
},
mounted() {
this.resetQuery = { ...this.query }
this.byShopId()
},
methods: {
//
queryHandle() {
this.getTableData()
},
//
resetHandle() {
this.query = { ...this.resetQuery }
this.page = 1
this.size = 30
this.getTableData()
},
//
handleSizeChange(val) {
this.tableData.size = val
this.getTableData()
},
//
paginationChange(e) {
this.tableData.page = e
this.getTableData()
},
//
async byShopId() {
try {
const res = await byShopId()
this.shareId = res.id
this.getTableData()
} catch (error) {
console.log(error);
}
},
//
async getTableData() {
try {
this.tableData.loading = true
const res = await byShare({
page: this.tableData.page,
size: this.tableData.size,
search: this.query.search,
status: this.query.status,
shareId: this.shareId
})
this.tableData.loading = false
this.tableData.list = res.content
this.tableData.total = res.totalElements
//
this.avatarUrlList1 = res.content.map(item => item.invitedHeadImg)
this.avatarUrlList2 = res.content.map(item => item.beInvitedHeadImg)
} catch (error) {
console.log(error);
}
}
}
}
</script>
<style scoped lang="scss">
.goods_info {
display: flex;
align-items: center;
gap: 10px;
}
.collect_wrap {
display: flex;
gap: 14px;
.item {
width: 200px;
display: flex;
align-items: center;
background-color: #f5f5f5;
padding: 20px;
.icon_wrap {
$size: 34px;
$border: 6px;
width: $size;
height: $size;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--bg-color);
border-radius: 50%;
position: relative;
&::after {
content: "";
width: $size + $border;
height: $size + $border;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: var(--bg-color);
opacity: 0.3;
}
.icon {
font-size: 16px;
color: #fff;
}
.img {
width: 20px;
height: 20px;
}
}
.info {
flex: 1;
display: flex;
flex-direction: column;
padding-left: 10px;
.m {
font-weight: bold;
}
.t {
font-size: 12px;
color: #999;
padding-top: 4px;
}
}
}
}
</style>

View File

@ -0,0 +1,377 @@
<template>
<div>
<el-form ref="form" :model="form" :rules="rules" label-width="140px" label-position="left">
<el-form-item label="开启">
<el-switch v-model.trim="form.status" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<template v-if="form.status">
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" style="width: 500px;" placeholder="例如邀请1人可得双方各得10元优惠券"></el-input>
</el-form-item>
<el-form-item label="分享封面图" prop="shareImg">
<div class="img_list">
<div class="item" v-if="form.shareImg">
<el-image :src="form.shareImg" style="width: 100%;height: 100%"
:preview-src-list="urlList" />
<div class="del" @click.stop="form.shareImg = ''">删除</div>
</div>
<div class="item upload" @click="formImgKey = 'shareImg'; $refs.addImg.show()" v-else>
<i class="icon el-icon-plus"></i>
</div>
</div>
<div class="tips">建议尺寸750*622</div>
</el-form-item>
<el-form-item label="邀请顶部图" prop="invitedImg">
<div class="img_list">
<div class="item" v-if="form.invitedImg">
<el-image :src="form.invitedImg" style="width: 100%;height: 100%"
:preview-src-list="urlList" />
<div class="del" @click.stop="form.invitedImg = ''">删除</div>
</div>
<div class="item upload" @click="formImgKey = 'invitedImg'; $refs.addImg.show()" v-else>
<i class="icon el-icon-plus"></i>
</div>
</div>
<div class="tips">建议尺寸750*622</div>
</el-form-item>
<el-form-item label="被邀顶部图" prop="beInvitedImg">
<div class="img_list">
<div class="item" v-if="form.beInvitedImg">
<el-image :src="form.beInvitedImg" style="width: 100%;height: 100%"
:preview-src-list="urlList" />
<div class="del" @click.stop="form.beInvitedImg = ''">删除</div>
</div>
<div class="item upload" @click="formImgKey = 'beInvitedImg'; $refs.addImg.show()" v-else>
<i class="icon el-icon-plus"></i>
</div>
</div>
<div class="tips">建议尺寸750*622</div>
</el-form-item>
<el-form-item label="活动日期" prop="startTime">
<el-date-picker v-model="createdAt" type="daterange" range-separator="" start-placeholder="开始日期"
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss" @change="timeChange">
</el-date-picker>
</el-form-item>
<el-form-item label="新用户获得券" prop="newCoupons">
<div>
<el-button type="primary" @click="addRewardHandle('newCoupons')">添加券</el-button>
<div class="tips">新用户的定义没领过该活动券的都属于新用户不管有没有下过单和是否第一次登录小程序</div>
</div>
<el-table :data="form.newCoupons" border style="width: 600px;">
<el-table-column label="券ID" prop="couponId"></el-table-column>
<el-table-column label="名称" prop="couponName"></el-table-column>
<el-table-column label="数量" prop="couponNum"></el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
<el-button type="text"
@click="addRewardHandle('newCoupons', 2, scope.row, scope.$index)">编辑</el-button>
<el-button type="text" @click="form.newCoupons.splice(scope.$index, 1)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item label="奖励券" prop="invitedNum">
<el-input v-model="form.invitedNum" style="width: 350px;"
@input="inputFilterInt($event, 'invitedNum')">
<template slot="prepend">用户每邀请</template>
<template slot="append">可获得奖励券</template>
</el-input>
<el-button type="primary" @click="addRewardHandle('rewardCoupons')">添加券</el-button>
</el-form-item>
<el-form-item prop="rewardCoupons">
<div>
<div class="tips">奖励券不受优惠券发放数量影响</div>
</div>
<el-table :data="form.rewardCoupons" border style="width: 600px;">
<el-table-column label="券ID" prop="couponId"></el-table-column>
<el-table-column label="名称" prop="couponName"></el-table-column>
<el-table-column label="数量" prop="couponNum"></el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
<el-button type="text"
@click="addRewardHandle('rewardCoupons', 2, scope.row, scope.$index)">编辑</el-button>
<el-button type="text"
@click="form.rewardCoupons.splice(scope.$index, 1)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-form-item label="奖励获得方法">
<el-radio-group v-model="form.getMethod">
<el-radio label="get">新用户领取获得</el-radio>
<el-radio label="use">仅新用户使用获得会员</el-radio>
</el-radio-group>
</el-form-item>
</template>
<el-form-item>
<el-button type="primary" :loading="loading" @click="onSubmitHandle">保存</el-button>
</el-form-item>
</el-form>
<addImg ref="addImg" @successEvent="e => form[formImgKey] = e[0].url" />
<AddCoupon ref="AddCoupon" @success="addCouponSuccess" />
</div>
</template>
<script>
import { byShopId, tbShopShare } from '@/api/inviteFirend.js'
import addImg from "@/views/product/components/addImages.vue";
import AddCoupon from './addCoupon.vue'
export default {
components: { addImg, AddCoupon },
data() {
const imgValidate1 = (rule, value, callback) => {
if (!this.form.shareImg) {
callback(new Error("请上传分享封面图"));
} else {
callback()
}
}
const imgValidate2 = (rule, value, callback) => {
if (!this.form.invitedImg) {
callback(new Error("请上传邀请顶部图"));
} else {
callback()
}
}
const imgValidate3 = (rule, value, callback) => {
if (!this.form.beInvitedImg) {
callback(new Error("请上传被邀顶部图"));
} else {
callback()
}
}
const startTimeValidate = (rule, value, callback) => {
if (!this.form.startTime) {
callback(new Error("请选择活动日期"));
} else {
callback()
}
}
const newCouponsValidate = (rule, value, callback) => {
if (!this.form.newCoupons.length) {
callback(new Error("请添加新用户获得券"));
} else {
callback()
}
}
const rewardCouponsValidate = (rule, value, callback) => {
if (!this.form.rewardCoupons.length) {
callback(new Error("请添加奖励券"));
} else {
callback()
}
}
return {
loading: false,
createdAt: [],
formImgKey: '',
couponKey: '',
tableType: '1', // 1 2
tableEditorIndex: 0, // index
form: {
status: 1,
title: '',
shareImg: '',
invitedImg: '',
beInvitedImg: '',
startTime: '',
endTime: '',
newCoupons: [],
invitedNum: '1',
rewardCoupons: [],
getMethod: 'get'
},
rules: {
title: [
{
required: true,
message: '请输入标题',
trigger: 'blur'
}
],
shareImg: [
{
required: true,
validator: imgValidate1,
trigger: 'change'
}
],
invitedImg: [
{
required: true,
validator: imgValidate2,
trigger: 'change'
}
],
beInvitedImg: [
{
required: true,
validator: imgValidate3,
trigger: 'change'
}
],
startTime: [
{
required: true,
validator: startTimeValidate,
trigger: 'change'
}
],
newCoupons: [
{
required: true,
validator: newCouponsValidate,
trigger: 'change'
}
],
invitedNum: [
{
required: true,
message: '请输入邀请人数',
trigger: 'blur'
}
],
rewardCoupons: [
{
required: true,
validator: rewardCouponsValidate,
trigger: 'change'
}
],
},
urlList: []
}
},
mounted() {
this.byShopId()
},
methods: {
//
addCouponSuccess(e) {
if (this.tableType == 1) {
this.form[this.couponKey].push({ ...e })
} else {
// this.form[this.couponKey][this.tableEditorIndex] = { ...e }
this.$set(this.form[this.couponKey], this.tableEditorIndex, { ...e })
}
},
//
addRewardHandle(key, type = 1, row = {}, index = 0) {
this.tableEditorIndex = index
this.tableType = type
this.couponKey = key
if (key == 'rewardCoupons' && !this.form.invitedNum) {
this.$refs.form.validateField('invitedNum')
return
}
this.$refs.AddCoupon.show(row)
},
//
timeChange(e) {
this.form.startTime = e[0]
this.form.endTime = e[1]
},
// input
inputFilterInt(e, key) {
if (!e) return
setTimeout(() => {
this.form[key] = e.replace(/[^\d]/g, '')
}, 50)
},
//
onSubmitHandle() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true
this.form.shopId = localStorage.getItem('shopId')
await tbShopShare(this.form)
this.loading = false
this.$notify({
title: '成功',
message: `保存成功`,
type: 'success'
});
} catch (error) {
this.loading = false
console.log(error)
}
}
})
},
//
async byShopId() {
try {
const res = await byShopId()
if (res.id) {
this.form = res
this.createdAt = [res.startTime, res.endTime]
this.urlList = [res.shareImg, res.invitedImg, res.beInvitedImg]
}
} catch (error) {
console.log(error);
}
}
}
}
</script>
<style scoped lang="scss">
.img_list {
display: flex;
flex-wrap: wrap;
gap: 10px;
.item {
width: 100px;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
background-color: #F5F7FA;
position: relative;
overflow: hidden;
&.upload {
border: 1px dashed #ddd;
}
&:hover {
cursor: pointer;
.del {
transform: translateY(0);
}
}
.del {
width: 100%;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
left: 0;
bottom: 0;
background-color: rgba(255, 0, 0, 0.6);
backdrop-filter: blur(3px);
color: #fff;
font-size: 12px;
transform: translateY(100%);
transition: all .2s ease-in-out;
}
.img {
width: 100%;
height: 100%;
display: block;
}
.icon {
font-size: 20px;
color: #ddd;
}
}
}
</style>

View File

@ -0,0 +1,447 @@
<template>
<div>
<el-form ref="form" :model="form" :rules="rules" label-width="140px" label-position="left">
<el-form-item label="分享标题" prop="title">
<el-input v-model="form.title" style="width: 500px;" placeholder="例如邀请1人可得双方各得10元优惠券"></el-input>
</el-form-item>
<el-form-item label="分享封面" prop="shareImg">
<div class="img_list">
<div class="item" v-if="form.shareImg">
<el-image :src="form.shareImg" style="width: 100%;height: 100%" :preview-src-list="urlList" />
<div class="del" @click.stop="form.shareImg = ''">删除</div>
</div>
<div class="item upload" @click="formImgKey = 'shareImg'; $refs.addImg.show()" v-else>
<i class="icon el-icon-plus"></i>
</div>
</div>
<div class="tips">建议尺寸630*504</div>
</el-form-item>
<el-form-item label="演示">
<div class="preview_wrap">
<div class="message_wrap">
<div class="msg">
<div class="content">
<div class="name">
<img class="logo" :src="shopInfo.logo">
<span class="t">{{ shopInfo.name }}</span>
</div>
<div class="title">{{ form.title }}</div>
<el-image :src="form.shareImg" style="width: 100%;height: 110px;" fit="cover">
<div slot="error" class="image-slot">
<i class="el-icon-folder-delete"></i>
</div>
</el-image>
<div class="btm">
<i class="icon el-icon-link"></i>
小程序
</div>
</div>
<img class="avatar" src="@/assets/images/avatar.png">
</div>
</div>
<div class="footer">
<i class="icon el-icon-microphone"></i>
<div class="ipt"></div>
<i class="icon el-icon-picture-outline-round"></i>
<i class="icon el-icon-circle-plus-outline"></i>
</div>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" :loading="loading" @click="onSubmitHandle">保存</el-button>
</el-form-item>
</el-form>
<addImg ref="addImg" @successEvent="e => form[formImgKey] = e[0].url" />
<AddCoupon ref="AddCoupon" @success="addCouponSuccess" />
</div>
</template>
<script>
import { byShopId, tbShopShare } from '@/api/inviteFirend.js'
import addImg from "@/views/product/components/addImages.vue";
import AddCoupon from './addCoupon.vue'
export default {
components: { addImg, AddCoupon },
data() {
const imgValidate1 = (rule, value, callback) => {
if (!this.form.shareImg) {
callback(new Error("请上传分享封面图"));
} else {
callback()
}
}
const imgValidate2 = (rule, value, callback) => {
if (!this.form.invitedImg) {
callback(new Error("请上传邀请顶部图"));
} else {
callback()
}
}
const imgValidate3 = (rule, value, callback) => {
if (!this.form.beInvitedImg) {
callback(new Error("请上传被邀顶部图"));
} else {
callback()
}
}
const startTimeValidate = (rule, value, callback) => {
if (!this.form.startTime) {
callback(new Error("请选择活动日期"));
} else {
callback()
}
}
const newCouponsValidate = (rule, value, callback) => {
if (!this.form.newCoupons.length) {
callback(new Error("请添加新用户获得券"));
} else {
callback()
}
}
const rewardCouponsValidate = (rule, value, callback) => {
if (!this.form.rewardCoupons.length) {
callback(new Error("请添加奖励券"));
} else {
callback()
}
}
return {
loading: false,
createdAt: [],
formImgKey: '',
couponKey: '',
tableType: '1', // 1 2
tableEditorIndex: 0, // index
shopInfo: {
name: localStorage.getItem('shopName'),
logo: localStorage.getItem('logo')
},
form: {
status: 1,
title: '',
shareImg: '',
invitedImg: '',
beInvitedImg: '',
startTime: '',
endTime: '',
newCoupons: [],
invitedNum: '1',
rewardCoupons: [],
getMethod: 'get'
},
rules: {
title: [
{
required: true,
message: '请输入标题',
trigger: 'blur'
}
],
shareImg: [
{
required: true,
validator: imgValidate1,
trigger: 'change'
}
],
invitedImg: [
{
required: true,
validator: imgValidate2,
trigger: 'change'
}
],
beInvitedImg: [
{
required: true,
validator: imgValidate3,
trigger: 'change'
}
],
startTime: [
{
required: true,
validator: startTimeValidate,
trigger: 'change'
}
],
newCoupons: [
{
required: true,
validator: newCouponsValidate,
trigger: 'change'
}
],
invitedNum: [
{
required: true,
message: '请输入邀请人数',
trigger: 'blur'
}
],
rewardCoupons: [
{
required: true,
validator: rewardCouponsValidate,
trigger: 'change'
}
],
},
urlList: []
}
},
mounted() {
this.byShopId()
},
methods: {
//
addCouponSuccess(e) {
if (this.tableType == 1) {
this.form[this.couponKey].push({ ...e })
} else {
// this.form[this.couponKey][this.tableEditorIndex] = { ...e }
this.$set(this.form[this.couponKey], this.tableEditorIndex, { ...e })
}
},
//
addRewardHandle(key, type = 1, row = {}, index = 0) {
this.tableEditorIndex = index
this.tableType = type
this.couponKey = key
if (key == 'rewardCoupons' && !this.form.invitedNum) {
this.$refs.form.validateField('invitedNum')
return
}
this.$refs.AddCoupon.show(row)
},
//
timeChange(e) {
this.form.startTime = e[0]
this.form.endTime = e[1]
},
// input
inputFilterInt(e, key) {
if (!e) return
setTimeout(() => {
this.form[key] = e.replace(/[^\d]/g, '')
}, 50)
},
//
onSubmitHandle() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true
this.form.shopId = localStorage.getItem('shopId')
await tbShopShare(this.form)
this.loading = false
this.$notify({
title: '成功',
message: `保存成功`,
type: 'success'
});
} catch (error) {
this.loading = false
console.log(error)
}
}
})
},
//
async byShopId() {
try {
const res = await byShopId()
if (res.id) {
this.form = res
this.createdAt = [res.startTime, res.endTime]
this.urlList = [res.shareImg, res.invitedImg, res.beInvitedImg]
}
} catch (error) {
console.log(error);
}
}
}
}
</script>
<style scoped lang="scss">
.img_list {
display: flex;
flex-wrap: wrap;
gap: 10px;
.item {
width: 100px;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
background-color: #F5F7FA;
position: relative;
overflow: hidden;
&.upload {
border: 1px dashed #ddd;
}
&:hover {
cursor: pointer;
.del {
transform: translateY(0);
}
}
.del {
width: 100%;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
left: 0;
bottom: 0;
background-color: rgba(255, 0, 0, 0.6);
backdrop-filter: blur(3px);
color: #fff;
font-size: 12px;
transform: translateY(100%);
transition: all .2s ease-in-out;
}
.img {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
}
.icon {
font-size: 20px;
color: #ddd;
}
}
}
.preview_wrap {
width: 300px;
height: 368px;
background-color: #EDEDED;
position: relative;
padding: 20px 10px;
.message_wrap {
display: flex;
justify-content: flex-end;
.msg {
display: flex;
.content {
width: 180px;
background-color: #fff;
border-radius: 4px;
padding: 10px 10px 6px;
position: relative;
&::before {
$size: 8px;
content: "";
width: $size;
height: $size;
border-radius: 1px;
background-color: #fff;
position: absolute;
top: 10px;
right: $size / 2 * -1;
transform: rotate(-45deg);
}
.name {
display: flex;
align-items: center;
line-height: 10px;
.logo {
width: 20px;
height: 20px;
border-radius: 50%;
}
.t {
font-size: 10px;
color: #999;
margin-left: 6px;
}
}
.title {
font-size: 12px;
line-height: 16px;
padding: 6px 0;
}
.btm {
font-size: 10px;
color: #999;
line-height: 10px;
display: flex;
align-items: center;
border-top: 1px solid #ececec;
padding-top: 6px;
.icon {
font-size: 14px;
color: rgb(87, 87, 253);
margin-right: 6px;
}
}
}
.avatar {
width: 30px;
height: 30px;
margin-left: 10px;
}
}
}
.footer {
background-color: #F6F6F6;
width: 100%;
position: absolute;
left: 0;
bottom: 0;
display: flex;
align-items: center;
padding: 0 10px;
gap: 10px;
padding-top: 10px;
padding-bottom: 40px;
&::after {
content: "";
width: 100px;
height: 4px;
border-radius: 4px;
position: absolute;
bottom: 10px;
left: 50%;
margin-left: -50px;
background-color: #333;
}
.ipt {
flex: 1;
height: 30px;
background-color: #fff;
border-radius: 4px;
}
.icon {
font-size: 22px;
color: #333;
}
}
}
</style>

View File

@ -0,0 +1,349 @@
<!-- 兑换记录 -->
<template>
<div>
<div>
<el-form :model="query" inline label-position="left">
<el-form-item>
<el-input placeholder="订单编号/核销码" v-model="query.keywords" />
</el-form-item>
<el-form-item>
<el-select v-model="query.pickupMethod" placeholder="领取方式" style="width: 140px;">
<el-option label="自取" value="self"></el-option>
<el-option label="邮寄" value="post"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="query.status" placeholder="状态" style="width: 140px;">
<el-option :label="item.label" :value="item.value" v-for="item in statusList"
:key="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-date-picker v-model="query.createdAt" type="daterange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="queryHandle">查询</el-button>
<el-button @click="resetHandle">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="head-container">
<div class="collect_wrap">
<div class="item">
<div class="icon_wrap" style="--bg-color:#ADDBBC">
<i class="icon el-icon-s-goods"></i>
</div>
<div class="info">
<div class="m">{{ countData.count }}</div>
<div class="t">总订单数</div>
</div>
</div>
<div class="item">
<div class="icon_wrap" style="--bg-color:#8CC4FC">
<i class="icon el-icon-s-goods"></i>
</div>
<div class="info">
<div class="m">{{ countData.totalAmount }}</div>
<div class="t">已支付金额</div>
</div>
</div>
</div>
</div>
<div class="head-container">
<el-table :data="tableData.list" v-loading="tableData.loading">
<el-table-column label="订单编号" prop="orderNo" width="200"></el-table-column>
<el-table-column label="用户名" prop="memberName" width="200">
<template v-slot="scope">
<div class="goods_info">
<el-image :src="scope.row.avatarUrl" style="width:40px;height:40px;flex-shrink: 0;"
:preview-src-list="avatarUrlList">
<div slot="error" class="image-slot">
<i class="el-icon-folder-delete"></i>
</div>
</el-image>
<span>{{ scope.row.memberName }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="商品" prop="pointsGoodsName" width="200">
<template v-slot="scope">
<div class="goods_info">
<el-image :src="scope.row.goodsImageUrl" style="width:40px;height:40px;flex-shrink: 0;"
:preview-src-list="srcList">
<div slot="error" class="image-slot">
<i class="el-icon-folder-delete"></i>
</div>
</el-image>
<span>{{ scope.row.pointsGoodsName }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="使用积分" prop="spendPoints"></el-table-column>
<el-table-column label="支付金额" prop="extraPaymentAmount"></el-table-column>
<el-table-column label="支付方式" prop="payMethod"></el-table-column>
<el-table-column label="实际支付时间" prop="payTime" width="200"></el-table-column>
<el-table-column label="下单时间" prop="createTime" width="200"></el-table-column>
<el-table-column label="领取方式" prop="pickupMethod">
<template v-slot="scope">
<el-tag type="success" effect="plain" disable-transitions
v-if="scope.row.pickupMethod == 'self'">自取</el-tag>
<el-tag type="info" effect="plain" disable-transitions
v-if="scope.row.pickupMethod == 'post'">邮寄
</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" prop="status">
<template v-slot="scope">
<el-tag type="warning" disable-transitions v-if="scope.row.status == 'waiting'">待自取</el-tag>
<el-tag type="success" disable-transitions v-if="scope.row.status == 'done'">已完成</el-tag>
<el-tag type="warning" disable-transitions v-if="scope.row.status == 'unpaid'">待支付</el-tag>
<el-tag type="info" disable-transitions v-if="scope.row.status == 'cancel'">已取消</el-tag>
</template>
</el-table-column>
<el-table-column label="取消/退款" prop="cancelOrRefundTime" width="200">
<template v-slot="scope">
<template v-if="scope.row.status == 'cancel'">
<div>{{ scope.row.cancelOrRefundTime }}</div>
<div>{{ scope.row.cancelOrRefundReason }}</div>
</template>
</template>
</el-table-column>
<el-table-column label="操作" width="120" fixed="right">
<template v-slot="scope">
<template v-if="scope.row.status == 'waiting'">
<el-popconfirm title="确定核销吗?" @confirm="confirmOrder(scope.row.couponCode)">
<el-button type="text" icon="el-icon-finished" slot="reference">待核销</el-button>
</el-popconfirm>
</template>
<el-button type="text" icon="el-icon-finished" disabled v-else>{{
scope.row.status | statusFilter }}</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination :total="tableData.total" @size-change="handleSizeChange" :current-page="tableData.page"
:page-size="tableData.size" @current-change="paginationChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
</div>
</template>
<script>
import { exchangeRecordPage, exchangeRecordTotal, recordCheckout } from '@/api/points.js'
const statusList = [
{
value: 'unpaid',
label: '待支付'
},
{
value: 'waiting',
label: '待自取'
},
{
value: 'done',
label: '已完成'
},
{
value: 'cancel',
label: '已取消'
},
]
export default {
data() {
return {
statusList,
srcList: [],
avatarUrlList: [],
countData: {
count: 0,
totalAmount: 0
},
query: {
keywords: '',
beginDate: '',
endDate: '',
status: '',
pickupMethod: '',
createdAt: []
},
resetQuery: '',
tableData: {
list: [],
page: 1,
size: 30,
loading: false,
total: 0
},
}
},
filters: {
statusFilter(t) {
return statusList.find(item => item.value == t).label
}
},
mounted() {
this.resetQuery = { ...this.query }
this.getTableData()
this.exchangeRecordTotal()
},
methods: {
//
async confirmOrder(couponCode) {
try {
this.tableData.loading = true
await recordCheckout({ couponCode: couponCode })
this.$notify({
title: '成功',
message: '核销成功',
type: 'success'
})
this.getTableData()
} catch (error) {
this.tableData.loading = false
console.log(error);
}
},
//
async exchangeRecordTotal() {
try {
const { count, totalAmount } = await exchangeRecordTotal({
keywords: this.query.keywords,
beginDate: this.query.createdAt[0] || '',
endDate: this.query.createdAt[1] || '',
status: this.query.status,
pickupMethod: this.query.pickupMethod
})
this.countData.count = count
this.countData.totalAmount = totalAmount
} catch (error) {
console.log(error);
}
},
//
queryHandle() {
this.getTableData()
this.exchangeRecordTotal()
},
//
resetHandle() {
this.query = { ...this.resetQuery }
this.page = 1
this.size = 30
this.getTableData()
this.exchangeRecordTotal()
},
//
handleSizeChange(val) {
this.tableData.size = val
this.getTableData()
},
//
paginationChange(e) {
this.tableData.page = e
this.getTableData()
},
//
async getTableData() {
try {
this.tableData.loading = true
const res = await exchangeRecordPage({
page: this.tableData.page,
size: this.tableData.size,
keywords: this.query.keywords,
beginDate: this.query.createdAt[0] || '',
endDate: this.query.createdAt[1] || '',
status: this.query.status,
pickupMethod: this.query.pickupMethod
})
this.tableData.loading = false
this.tableData.list = res.content
this.tableData.total = res.totalElements
//
this.srcList = res.content.map(item => item.goodsImageUrl)
//
this.avatarUrlList = res.content.map(item => item.avatarUrl)
} catch (error) {
console.log(error);
}
}
}
}
</script>
<style scoped lang="scss">
.goods_info {
display: flex;
align-items: center;
gap: 10px;
}
.collect_wrap {
display: flex;
gap: 14px;
.item {
width: 200px;
display: flex;
align-items: center;
background-color: #f5f5f5;
padding: 20px;
.icon_wrap {
$size: 34px;
$border: 6px;
width: $size;
height: $size;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--bg-color);
border-radius: 50%;
position: relative;
&::after {
content: "";
width: $size + $border;
height: $size + $border;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: var(--bg-color);
opacity: 0.3;
}
.icon {
font-size: 16px;
color: #fff;
}
.img {
width: 20px;
height: 20px;
}
}
.info {
flex: 1;
display: flex;
flex-direction: column;
padding-left: 10px;
.m {
font-weight: bold;
}
.t {
font-size: 12px;
color: #999;
padding-top: 4px;
}
}
}
}
</style>

View File

@ -0,0 +1,306 @@
<template>
<div>
<el-form ref="form" :model="form" :rules="rules" label-width="140px" label-position="left">
<el-form-item label="是否消费赠送积分">
<el-switch v-model.trim="form.enableRewards" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<template v-if="form.enableRewards">
<el-form-item label="适用群体">
<el-radio-group v-model="form.rewardsGroup">
<el-radio label="all">全部</el-radio>
<el-radio label="vip">仅会员</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="消费赠送积分" prop="consumeAmount">
<el-input v-model="form.consumeAmount" style="width: 250px;"
@input="inputFilterInt($event, 'consumeAmount')">
<template slot="prepend">每消费</template>
<template slot="append">元赠送1积分</template>
</el-input>
</el-form-item>
</template>
<el-form-item label="开启下单积分抵扣" style="margin-top: 50px;">
<el-switch v-model.trim="form.enableDeduction" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<template v-if="form.enableDeduction">
<el-form-item label="适用群体">
<el-radio-group v-model="form.deductionGroup">
<el-radio label="all">全部</el-radio>
<el-radio label="vip">仅会员</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="下单实付抵扣门槛" prop="minPaymentAmount">
<el-input v-model="form.minPaymentAmount" style="width: 150px;"
@input="inputFilterInt($event, 'minPaymentAmount')">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="下单最高抵扣比例" prop="maxDeductionRatio">
<el-input v-model="form.maxDeductionRatio" style="width: 150px;"
@input="inputFilterInt($event, 'maxDeductionRatio')">
<template slot="append">%</template>
</el-input>
</el-form-item>
<el-form-item label="下单抵扣积分比例" prop="equivalentPoints">
<el-input v-model="form.equivalentPoints" style="width: 220px;"
@input="inputFilterInt($event, 'equivalentPoints')">
<template slot="prepend">1元等于</template>
<template slot="append">积分</template>
</el-input>
</el-form-item>
</template>
<el-form-item label="开启积分商城" style="margin-top: 50px;">
<el-switch v-model.trim="form.enablePointsMall" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<el-form-item label="显示样式" v-if="form.enablePointsMall">
<div class="style_wrap">
<div class="item style1" :class="{ active: form.browseMode == 'list' }"
@click="form.browseMode = 'list'">
<div class="row">
<div class="cover"></div>
<div class="info">
<div class="line"></div>
<div class="line"></div>
<div class="line"></div>
</div>
</div>
<div class="row">
<div class="cover"></div>
<div class="info">
<div class="line"></div>
<div class="line"></div>
<div class="line"></div>
</div>
</div>
</div>
<div class="item style2" :class="{ active: form.browseMode == 'grid' }"
@click="form.browseMode = 'grid'">
<div class="row">
<div class="cover"></div>
<div class="line"></div>
</div>
<div class="row">
<div class="cover"></div>
<div class="line"></div>
</div>
<div class="row">
<div class="cover"></div>
<div class="line"></div>
</div>
<div class="row">
<div class="cover"></div>
<div class="line"></div>
</div>
</div>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" :loading="loading" @click="onSubmitHandle">保存</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { basicSettingGet, basicSettingPost } from '@/api/points.js'
export default {
data() {
return {
loading: false,
form: {
id: '',
rewardsGroup: 'all',
deductionGroup: 'all',
enableRewards: 1,
consumeAmount: "",
enableDeduction: 1,
minPaymentAmount: "",
maxDeductionRatio: "",
equivalentPoints: "",
enablePointsMall: 1,
browseMode: 'list'
},
rules: {
consumeAmount: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
minPaymentAmount: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
maxDeductionRatio: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
equivalentPoints: [
{
required: true,
message: ' ',
trigger: 'blur'
}
]
}
}
},
mounted() {
this.basicSettingGet()
},
methods: {
// input
inputFilterInt(e, key) {
if (!e) return
setTimeout(() => {
this.form[key] = e.replace(/[^\d]/g, '')
}, 50)
},
//
onSubmitHandle() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true
this.form.shopId = localStorage.getItem('shopId')
await basicSettingPost(this.form)
this.loading = false
this.$notify({
title: '成功',
message: `保存成功`,
type: 'success'
});
} catch (error) {
this.loading = false
console.log(error)
}
}
})
},
//
async basicSettingGet() {
try {
const res = await basicSettingGet()
if (res.id) {
this.form = res
}
} catch (error) {
console.log(error);
}
}
}
}
</script>
<style scoped lang="scss">
.style_wrap {
display: flex;
width: 350px;
gap: 50px;
.item {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
$color: #3F9EFF;
&:hover {
cursor: pointer;
}
&.active {
border-color: $color;
}
.cover {
background-color: $color;
}
.line {
background-color: #D9D9D9;
}
&.style1 {
display: flex;
flex-direction: column;
gap: 20px;
.row {
flex: 1;
display: flex;
.cover {
width: 40px;
height: 40px;
}
.info {
flex: 1;
display: flex;
flex-direction: column;
gap: 6px;
padding-left: 10px;
.line {
flex: 1;
&:nth-child(1) {
width: 80%;
flex: 2;
}
&:nth-child(3) {
width: 50%;
}
}
}
}
}
&.style2 {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
grid-column-gap: 10px;
grid-row-gap: 10px;
.row:nth-child(1) {
grid-area: 1 / 1 / 2 / 2;
}
.row:nth-child(2) {
grid-area: 1 / 2 / 2 / 3;
}
.row:nth-child(3) {
grid-area: 2 / 1 / 3 / 2;
}
.row:nth-child(4) {
grid-area: 2 / 2 / 3 / 3;
}
.row {
display: flex;
flex-direction: column;
.cover {
flex: 1;
}
.line {
height: 4px;
margin-top: 4px;
}
}
}
}
}
</style>

View File

@ -0,0 +1,247 @@
<!-- 添加积分商品/优惠券 -->
<template>
<div>
<el-dialog :title="form.id ? '编辑商品' : '添加商品'" :visible.sync="dialogVisible" @close="reset">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="奖品类型">
<el-radio-group v-model="form.goodsCategory">
<el-radio label="physical">实物商品</el-radio>
<!-- <el-radio label="coupon">优惠券</el-radio> -->
</el-radio-group>
</el-form-item>
<el-form-item label="商品图片" prop="goodsImageUrl">
<div class="img_list">
<div class="item" v-if="form.goodsImageUrl" @click="form.goodsImageUrl = ''">
<el-image :src="form.goodsImageUrl" style="width: 100%;height: 100%" />
<div class="del">删除</div>
</div>
<div class="item upload" @click="$refs.addImg.show()" v-else>
<i class="icon el-icon-plus"></i>
</div>
</div>
</el-form-item>
<el-form-item label="商品名称" prop="goodsName">
<el-input v-model="form.goodsName" placeholder="请输入商品名称" style="width: 300px;"></el-input>
</el-form-item>
<el-form-item label="所需积分" prop="requiredPoints">
<el-input v-model="form.requiredPoints" style="width: 130px;"
@input="inputFilterInt($event, 'requiredPoints')">
<template slot="append">积分</template>
</el-input>
</el-form-item>
<el-form-item label="额外价格" prop="extraPrice">
<el-input v-model="form.extraPrice" style="width: 130px;"
@input="inputFilterFloat($event, 'extraPrice')">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="数量">
<el-input-number v-model="form.quantity" :min="1"></el-input-number>
</el-form-item>
<el-form-item label="排序">
<el-input-number v-model="form.sort" :min="0"></el-input-number>
</el-form-item>
<el-form-item label="是否上架">
<el-switch v-model.trim="form.status" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="loading" @click="onSubmitHandle"> </el-button>
</span>
</el-dialog>
<addImg ref="addImg" @successEvent="e => form.goodsImageUrl = e[0].url" />
</div>
</template>
<script>
import { goodsSettingAdd } from '@/api/points.js'
import addImg from "@/views/product/components/addImages.vue";
export default {
components: {
addImg
},
data() {
const validateCoverImg = (rule, value, callback) => {
if (!this.form.goodsImageUrl) {
callback(new Error("请上传商品图片"));
} else {
callback()
}
}
return {
dialogVisible: false,
loading: false,
form: {
goodsCategory: 'physical',
goodsName: '',
goodsImageUrl: '',
requiredPoints: '',
extraPrice: 0,
quantity: '',
status: 1,
sort: 0,
goodsDescription: ''
},
resetForm: '',
rules: {
goodsName: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
goodsImageUrl: [
{
required: true,
validator: validateCoverImg,
trigger: 'change'
}
],
requiredPoints: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
extraPrice: [
{
required: true,
message: ' ',
trigger: 'blur'
}
]
}
}
},
mounted() {
this.resetForm = { ...this.form }
},
methods: {
// input
inputFilterInt(e, key) {
if (!e) return
setTimeout(() => {
this.form[key] = e.replace(/[^\d]/g, '')
}, 50)
},
// input
inputFilterFloat(value, key) {
if (!value) return
//
if (value.startsWith('.')) {
value = value.slice(1);
}
//
value = value.replace(/[^\d.]/g, '');
//
if (value.split('.').length > 2) {
value = value.split('.').slice(0, 2).join('.');
}
//
if (value.split('.')[1] && value.split('.')[1].length > 2) {
value = value.split('.')[0] + '.' + value.split('.')[1].slice(0, 2);
}
setTimeout(() => {
this.form[key] = value
}, 50)
},
//
onSubmitHandle() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true
this.form.shopId = localStorage.getItem('shopId')
await goodsSettingAdd(this.form)
this.loading = false
this.$notify({
title: '成功',
message: `${this.form.id ? '编辑' : '添加'}成功`,
type: 'success'
});
this.$emit('success')
this.close()
} catch (error) {
this.loading = false
console.log(error)
}
}
})
},
reset() {
this.form = { ...this.resetForm }
},
close() {
this.dialogVisible = false
},
show(row) {
if (row && row.id) {
this.form = { ...row }
}
this.dialogVisible = true
}
}
}
</script>
<style scoped lang="scss">
.img_list {
display: flex;
flex-wrap: wrap;
gap: 10px;
.item {
width: 100px;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
background-color: #F5F7FA;
position: relative;
overflow: hidden;
&.upload {
border: 1px dashed #ddd;
}
&:hover {
cursor: pointer;
.del {
transform: translateY(0);
}
}
.del {
width: 100%;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
position: absolute;
left: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(3px);
color: #fff;
font-size: 12px;
transform: translateY(100%);
transition: all .2s ease-in-out;
}
.img {
width: 100%;
height: 100%;
display: block;
}
.icon {
font-size: 20px;
color: #ddd;
}
}
}
</style>

View File

@ -0,0 +1,129 @@
<template>
<div>
<div><el-button type="primary" @click="$refs.ShopAdd.show()">添加商品</el-button></div>
<div class="head-container">
<el-table :data="tableData.list" v-loading="tableData.loading">
<el-table-column label="商品" prop="goodsName">
<template v-slot="scope">
<div class="goods_info">
<el-image :src="scope.row.goodsImageUrl" style="width:40px;height:40px;flex-shrink: 0;"
:preview-src-list="srcList" />
<span>{{ scope.row.goodsName }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="所需积分" prop="requiredPoints"></el-table-column>
<el-table-column label="额外价格「元」" prop="extraPrice"></el-table-column>
<el-table-column label="累计兑换次数" prop="totalExchangeCount"></el-table-column>
<el-table-column label="库存" prop="quantity"></el-table-column>
<el-table-column label="状态" prop="status">
<template v-slot="scope">
<el-tag type="success" disable-transitions v-if="scope.row.status == 1">上架</el-tag>
<el-tag type="danger" disable-transitions v-if="scope.row.status == 0">下架</el-tag>
</template>
</el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
<el-button type="text" icon="el-icon-edit" @click="editorHandle(scope.row)">编辑</el-button>
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle(scope.row.id)">
<el-button type="text" icon="el-icon-delete" slot="reference">删除</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination :total="tableData.total" @size-change="handleSizeChange" :current-page="tableData.page"
:page-size="tableData.size" @current-change="paginationChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
<!-- 添加积分商品/积分 -->
<ShopAdd ref="ShopAdd" @success="resetTable" />
</div>
</template>
<script>
import ShopAdd from './shop_add.vue'
import { goodsSettingPage, goodsDelete } from '@/api/points.js'
export default {
components: { ShopAdd },
data() {
return {
srcList: [],
tableData: {
sort: 'createdAt,desc',
list: [],
page: 1,
size: 30,
loading: false,
total: 0
},
}
},
mounted() {
this.getTableData()
},
methods: {
//
editorHandle(row) {
this.$refs.ShopAdd.show(row)
},
//
async delTableHandle(id) {
try {
await goodsDelete(id)
this.$message.success('已删除')
this.getTableData()
} catch (error) {
console.log(error);
}
},
resetTable() {
this.tableData.page = 1
this.tableData.size = 30
this.getTableData()
},
handleSizeChange(val) {
this.tableData.size = val
this.getTableData()
},
//
paginationChange(e) {
this.tableData.page = e
this.getTableData()
},
//
async getTableData() {
try {
this.tableData.loading = true
const res = await goodsSettingPage({
page: this.tableData.page,
size: this.tableData.size,
goodsName: '',
goodsCategory: 'physical',
status: ''
})
this.tableData.loading = false
this.tableData.list = res.content
this.tableData.total = res.totalElements
//
this.srcList = res.content.map(item => item.goodsImageUrl)
} catch (error) {
console.log(error);
}
}
}
}
</script>
<style scoped lang="scss">
.head-container {
margin-top: 20px;
}
.goods_info {
display: flex;
align-items: center;
gap: 10px;
}
</style>

View File

@ -0,0 +1,38 @@
<template>
<div class="app-container">
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="基本设置" name="1"></el-tab-pane>
<el-tab-pane label="分享设置" name="2"></el-tab-pane>
<el-tab-pane label="邀请记录" name="3"></el-tab-pane>
</el-tabs>
<Setting v-if="activeName == 1" />
<Share v-if="activeName == 2" />
<Record v-if="activeName == 3" />
</div>
</template>
<script>
import Setting from './components/invite_friend/setting.vue'
import Share from './components/invite_friend/share.vue'
import Record from './components/invite_friend/record.vue'
export default {
name: 'invite_friend',
components: {
Setting,
Share,
Record
},
data() {
return {
activeName: '1'
}
},
methods: {}
}
</script>
<style scoped lang="scss">
:deep(.el-tabs) {
margin-bottom: 0;
}
</style>

View File

@ -0,0 +1,37 @@
<template>
<div class="app-container">
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="基本设置" name="1"></el-tab-pane>
<el-tab-pane label="商品设置" name="2"></el-tab-pane>
<el-tab-pane label="兑换记录" name="3"></el-tab-pane>
</el-tabs>
<Setting v-if="activeName == 1" />
<ShopList v-if="activeName == 2" />
<Record v-if="activeName == 3" />
</div>
</template>
<script>
import Setting from './components/member_points/setting.vue'
import ShopList from './components/member_points/shop_list.vue'
import Record from './components/member_points/record.vue'
export default {
name: "member_points",
components: {
Setting,
ShopList,
Record
},
data() {
return {
activeName: '1'
}
}
}
</script>
<style scoped lang="scss">
:deep(.el-tabs) {
margin-bottom: 0;
}
</style>

View File

@ -0,0 +1,501 @@
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
<template>
<div class="app-container">
<div class="tab">
<div v-for="(item,index) in tabList" v-if="(form.id&&form.type == item.type)||!form.id" :key="index" class="tab_item" :class="{active: form.type == item.type}" @click="tabClick(item)"> {{ item.name }} <span class="bor" /></div>
</div>
<!-- 优惠券 -->
<div v-if="form.type == 1" class="content">
<el-form ref="form" :inline="true" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="优惠券券名" prop="title" style="width: 100%;">
<el-input v-model="form.title" placeholder="" style="width: 289px;" />
</el-form-item>
<el-form-item v-if="form.type == 1" label="使用门槛" prop="fullAmount">
<el-input v-model="form.fullAmount" oninput="value= value.replace(/[^\d|\.]/g, '')" placeholder="" style="width: 180px;margin-right: 66px;">
<template slot="prepend"></template>
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="form.type == 1" label="" prop="discountAmount">
<el-input v-model="form.discountAmount" oninput="value= value.replace(/[^\d|\.]/g, '')" placeholder="" style="width: 180px;">
<template slot="prepend"></template>
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="有效期类型" style="width: 100%;">
<el-radio-group v-model="form.validityType">
<el-radio v-for="item in couponEnum.validityType" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.validityType == 'fixed'" label="有效期(天)" prop="validDays" style="width: 100%;">
<el-input v-model="form.validDays" placeholder="" style="width: 200px;">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="form.validityType == 'custom'" label="有效时间" prop="validEndTime" style="width: 100%;">
<el-date-picker
v-model="validityTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['06:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
@change="validityChange"
/>
</el-form-item>
<!-- <el-form-item label="使用门槛" prop="daysToTakeEffect" style="width: 100%;">
<el-input v-model="form.daysToTakeEffect" placeholder="" style="width: 200px;">
<template slot="prepend"></template>
<template slot="append">天生效</template>
</el-input>
<el-tooltip class="item" effect="dark" content="领取后0天后0点0分" placement="top-start">
<i class="el-icon-question" />
</el-tooltip>
</el-form-item> -->
<el-form-item label="可用周期" prop="userDays" style="width: 100%;">
<el-checkbox-group v-model="form.userDays">
<el-checkbox v-for="(city,index) in couponEnum.cycle" :key="index" :label="city.label" @change="userDayChagne">{{ city.label }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="指定时间段" style="width: 100%;">
<el-radio-group v-model="form.useTimeType">
<el-radio v-for="item in couponEnum.useTimeType" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.useTimeType == 'custom'" label="指定时间段" prop="useEndTime" style="width: 100%;">
<el-time-picker
v-model="useTime"
is-range
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
value-format="HH:mm"
@change="useTimeChange"
/>
</el-form-item>
<el-form-item label="发放数量" prop="number" style="width: 100%;">
<el-input v-model="form.number" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 200px;" />
<!-- <el-tooltip class="item" effect="dark" content="限用户自行领取,(当库存为 0时集草等活动仍会赠送" placement="top-start">
<i class="el-icon-question" />
</el-tooltip> -->
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<!-- <el-button @click="dialogVisible = false"> </el-button> -->
<el-button type="primary" :loading="loading" @click="onSubmitHandle"> </el-button>
</span>
</div>
<div v-if="form.type == 2">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="优惠券券名" prop="title" style="width: 100%;">
<el-input v-model="form.title" placeholder="" style="width: 289px;" />
</el-form-item>
<el-form-item label="使用门槛" prop="fullAmount">
金额满<el-input v-model="form.fullAmount" oninput="value= value.replace(/[^\d|\.]/g, '')" placeholder="" style="width: 100px;margin: 0 23px;"><template slot="suffix"></template></el-input>可用
</el-form-item>
<el-form-item label="有效期类型" style="width: 100%;">
<el-radio-group v-model="form.validityType">
<el-radio v-for="item in couponEnum.validityType" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.validityType == 'fixed'" label="有效期(天)" prop="validDays" style="width: 100%;">
<el-input v-model="form.validDays" placeholder="" style="width: 200px;">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item v-if="form.validityType == 'custom'" label="有效时间" prop="validEndTime" style="width: 100%;">
<el-date-picker
v-model="validityTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['06:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
@change="validityChange"
/>
</el-form-item>
<!-- <el-form-item label="使用门槛" prop="daysToTakeEffect" style="width: 100%;">
<el-input v-model="form.daysToTakeEffect" placeholder="" style="width: 200px;">
<template slot="prepend"></template>
<template slot="append">天生效</template>
</el-input>
<el-tooltip class="item" effect="dark" content="领取后0天后0点0分" placement="top-start">
<i class="el-icon-question" />
</el-tooltip>
</el-form-item> -->
<el-form-item label="可用周期" prop="userDays" style="width: 100%;">
<el-checkbox-group v-model="form.userDays">
<el-checkbox v-for="(city,index) in couponEnum.cycle" :key="index" :label="city.label" @change="userDayChagne">{{ city.label }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="指定时间段" style="width: 100%;">
<el-radio-group v-model="form.useTimeType">
<el-radio v-for="item in couponEnum.useTimeType" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.useTimeType == 'custom'" label="指定时间段" prop="useEndTime" style="width: 100%;">
<el-time-picker
v-model="useTime"
is-range
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
value-format="HH:mm"
@change="useTimeChange"
/>
</el-form-item>
<el-form-item label="发放数量" prop="number" style="width: 100%;">
<el-input v-model="form.number" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" placeholder="" style="width: 200px;" />
<!-- <el-tooltip class="item" effect="dark" content="限用户自行领取,(当库存为 0时集草等活动仍会赠送" placement="top-start">
<i class="el-icon-question" />
</el-tooltip> -->
</el-form-item>
<el-form-item label="赠送商品" prop="products">
<div>
<el-button type="primary" icon="el-icon-plus" @click="$refs.shopListRef.show([...form.products])">
添加 </el-button>
</div>
<div class="shop_list">
<div
v-for="(item, index) in form.products"
:key="item.id"
class="item_wrap"
>
<div class="name">{{ item.name }}</div>
<el-input v-model="item.num" placeholder="请填写数量" style="width: 100px;" />
<div class="del" @click="form.products.splice(index, 1)">删除</div>
</div>
</div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<!-- <el-button @click="dialogVisible = false"> </el-button> -->
<el-button type="primary" :loading="loading" @click="onSubmitHandle"> </el-button>
</span>
</div>
<shopList ref="shopListRef" @success="slectShop" />
</div>
</template>
<script>
import couponEnum from './couponEnum'
import shopList from '@/components/shopList'
import { addTbShopCoupon, getTbShopCouponInfo } from '@/api/coupon'
export default {
components: { shopList },
data() {
const validateProduct = (rule, value, callback) => {
if (!this.form.products.length) {
callback(new Error('请选择商品'))
} else {
callback()
}
}
return {
tabList: [
{ name: '新增优惠券', type: 1 },
{ name: '新增商品券', type: 2 }
],
tabActive: 1,
couponEnum,
dialogVisible: false,
loading: false,
validityTime: [],
useTime: ['06:00:00', '23:59:59'],
form: {
id: '',
shopId: '',
type: '1',
title: '',
fullAmount: null,
discountAmount: null,
validityType: 'fixed',
validStartTime: '',
validEndTime: '',
userDays: [],
validDays: '',
useTimeType: 'all',
useStartTime: '',
useEndTime: '',
products: [],
number: ''
},
rules: {
title: [
{
required: true,
message: '填写券名',
trigger: 'blur'
}
],
fullAmount: [
{
required: true,
message: '填写满减金额',
trigger: 'blur'
}
],
discountAmount: [
{
required: true,
message: '填写满减金额',
trigger: 'blur'
}
],
number: [
{
required: true,
message: '填写发放数量',
trigger: 'blur'
}
],
validDays: [
{
required: true,
message: '填写有效天数',
trigger: 'blur'
}
],
daysToTakeEffect: [
{
required: true,
message: '填写生效天数',
trigger: 'blur'
}
],
userDays: [
{
required: true,
message: '选择可用周期',
trigger: 'change'
}
],
validEndTime: [
{
required: true,
message: '选择有效时间段',
trigger: 'change'
}
],
useEndTime: [
{
required: true,
message: '选择指定时间段',
trigger: 'change'
}
],
products: [
{
required: true,
validator: validateProduct,
trigger: 'change'
}
]
},
resetForm: ''
}
},
mounted() {
this.resetForm = { ...this.form }
this.form.type = this.$route.query.type
this.form.useStartTime = this.useTime[0]
this.form.useEndTime = this.useTime[1]
if (this.$route.query.id) { this.form.id = this.$route.query.id; this.getCouponInfo(this.$route.query.id) }
},
methods: {
/**
* 切换类型
* @param item
*/
tabClick(item) {
console.log(this.form)
this.form = this.resetForm
this.form.number = ''
this.form.type = item.type
this.$refs.form.resetFields()
},
/**
* 获取优惠券详情
*/
async getCouponInfo(id) {
const resInfo = await getTbShopCouponInfo(id)
this.form = resInfo
if (resInfo.validityType === 'custom') {
this.validityTime = [resInfo.validStartTime, resInfo.validEndTime]
}
if (resInfo.useTimeType === 'custom') {
this.useTime = [resInfo.useStartTime, resInfo.useEndTime]
}
this.form.userDays = this.form.userDays.split(',')
},
/**
* 选择可用周期
*/
userDayChagne(e) {
console.log(this.form.userDays)
},
/**
* 有效期选择
* @param e
*/
validityChange(e) {
this.form.validStartTime = e[0]
this.form.validEndTime = e[1]
},
/**
* 指定时间段选择
* @param e
*/
useTimeChange(e) {
this.form.useStartTime = e[0]
this.form.useEndTime = e[1]
},
/**
* 选择商品
* @param res
*/
slectShop(res) {
if (res.length <= 0) {
return
}
this.form.products = []
if (this.form.products.length) {
res.map(async item => {
if (!await this.checkShop(item.id)) {
this.form.products.push({
productId: item.id,
name: item.name,
num: null
})
}
})
} else {
this.form.products.push({
productId: res[0].id,
name: res[0].name,
num: null
})
}
},
/**
* 判断是否存在重复商品
* @param id
*/
checkShop(id) {
let falg = false
this.form.products.map(item => {
// eslint-disable-next-line eqeqeq
if (item.id == id) {
falg = true
}
})
return falg
},
/**
* 提交
*/
onSubmitHandle() {
console.log(this.form)
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true
if (!this.form.shopId) { this.form.shopId = localStorage.getItem('shopId') }
this.form.userDays = this.form.userDays.toString()
// eslint-disable-next-line no-unused-vars
const res = await addTbShopCoupon(this.form)
this.$store.dispatch('tagsView/delView', this.$route) //
this.$router.replace({ name: 'coupon_list' }) //
this.$notify({
title: '成功',
message: `${this.form.id ? '编辑' : '添加'}成功`,
type: 'success'
})
this.loading = false
} catch (error) {
this.loading = false
console.log(error)
}
}
})
}
}
}
</script>
<style scoped lang="scss">
.tab{
display: flex;
margin-bottom: 30px;
padding-top: 40px;
padding-left: 10px;
.tab_item{
margin-right: 64px;
font-weight: 400;
font-size: 16px;
color: #666666;
cursor: pointer;
.bor{
display: block;
width: 56px;
height: 6px;
background-color: transparent;
border-radius: 3px 3px 3px 3px;
margin: 5px auto 0;
}
}
.active{
color: #3F9EFF;
.bor{
background-color: #3F9EFF;
}
}
}
.content{
font-weight: 400;
font-size: 16px;
color: #666666;
}
.shop_list {
display: flex;
flex-wrap: wrap;
margin-top: 15px;
.item_wrap {
$size: 80px;
display: flex;
align-items: center;
.name {
width: $size;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.del{
font-weight: 400;
font-size: 14px;
color: #3F9EFF;
margin-left: 11px;
}
}
}
</style>

View File

@ -1,277 +0,0 @@
<template>
<div>
<el-dialog title="添加优惠券" :visible.sync="dialogVisible" @close="reset">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="优惠卷名称" prop="title">
<el-input v-model="form.title" placeholder="请输入优惠卷名称" style="width: 200px;"></el-input>
</el-form-item>
<el-form-item label="类型">
<el-radio-group v-model="form.classType">
<el-radio :label="item.value" v-for="item in couponEnum.classType" :key="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="选择商品" v-if="form.classType == 'product'" prop="classType">
<div>
<el-button type="primary" icon="el-icon-plus" @click="$refs.shopListRef.show([...productIds])">
添加商品
</el-button>
</div>
<div class="shop_list">
<div class="item_wrap" v-for="(item, index) in productIds" :key="item.id"
@click="productIds.splice(index, 1)">
<div class="item" :data-index="index + 1">
<el-image :src="item.coverImg" style="width: 100%;height: 100%;"></el-image>
</div>
<div class="name">{{ item.name }}</div>
</div>
</div>
</el-form-item>
<el-form-item label="优惠类型">
<el-radio-group v-model="form.type">
<el-radio :label="item.value" v-for="item in couponEnum.type" :key="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="满减限制" v-if="form.type == '0'">
<el-input-number v-model="form.limitAmount" controls-position="right" :min="0"></el-input-number>
</el-form-item>
<el-form-item label="折扣" v-if="form.type == '1'">
<el-input-number v-model="form.ratio" controls-position="right" :min="1"></el-input-number>
</el-form-item>
<el-form-item label="优惠券面额">
<el-input-number v-model="form.amount" controls-position="right" :min="0"></el-input-number>
</el-form-item>
<el-form-item label="发放数量">
<el-input-number v-model="form.number" controls-position="right" :min="1"></el-input-number>
</el-form-item>
<el-form-item label="限领数量">
<el-input-number v-model="form.limitNumber" controls-position="right" :min="1"></el-input-number>
</el-form-item>
<el-form-item label="有效期">
<el-radio-group v-model="form.effectType">
<el-radio :label="item.value" v-for="item in couponEnum.effectType" :key="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="有效时间" v-if="form.effectType == 1">
<el-date-picker v-model="selectTime" type="daterange" range-separator="" start-placeholder="开始日期"
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
<el-form-item label="状态">
<el-switch v-model="form.status" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="loading" @click="onSubmitHandle"> </el-button>
</span>
</el-dialog>
<shopList ref="shopListRef" @success="slectShop" />
</div>
</template>
<script>
import couponEnum from './../couponEnum'
import shopList from '@/components/shopList'
import { tbMerchantCoupon } from '@/api/shop'
export default {
components: { shopList },
data() {
const validateProduct = (rule, value, callback) => {
if (!this.productIds.length) {
callback(new Error('请选择商品'))
} else {
callback()
}
}
return {
couponEnum,
dialogVisible: false,
loading: false,
selectTime: [],
form: {
id: '',
title: '',
classType: 'product',
type: '0',
limitAmount: '',
ratio: '1',
amount: '',
number: '1',
limitNumber: '1',
effectType: '0',
fromTime: '',
toTime: '',
relationIds: '',
status: 1
},
rules: {
title: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
classType: [
{
required: true,
validator: validateProduct,
trigger: 'change'
}
]
},
resetForm: '',
productIds: []
}
},
mounted() {
this.resetForm = { ...this.form }
},
methods: {
//
slectShop(res) {
if (this.productIds.length) {
res.map(async item => {
if (!await this.checkShop(item.id)) {
this.productIds.push({ ...item })
}
})
} else {
this.productIds = res
}
},
//
checkShop(id) {
let falg = false
this.productIds.map(item => {
if (item.id == id) {
falg = true
}
})
return falg
},
//
onSubmitHandle() {
console.log(this.form)
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true
this.form.shopId = localStorage.getItem('shopId')
this.form.fromTime = this.selectTime[0] || ''
this.form.toTime = this.selectTime[1] || ''
let arr = []
if (this.form.classType == 'product') {
arr = this.productIds.map(item => item.id)
}
this.form.relationIds = arr.join(',')
let res = await tbMerchantCoupon(this.form, this.form.id ? 'put' : 'post')
this.$emit('success', res)
this.close()
this.$notify({
title: '成功',
message: `${this.form.id ? '编辑' : '添加'}成功`,
type: 'success'
});
this.loading = false
} catch (error) {
this.loading = false
console.log(error)
}
}
})
},
show(obj) {
this.dialogVisible = true
if (obj && obj.id) {
this.form = { ...obj }
}
},
close() {
this.dialogVisible = false
},
reset() {
this.form = { ...this.resetForm }
}
}
}
</script>
<style scoped lang="scss">
.shop_list {
display: flex;
flex-wrap: wrap;
.item_wrap {
$size: 80px;
.item {
$radius: 4px;
width: $size;
height: $size;
border-radius: $radius;
overflow: hidden;
position: relative;
margin-right: 10px;
margin-top: 10px;
&:hover {
cursor: pointer;
}
&::after {
content: attr(data-index);
font-size: 12px;
height: 20px;
display: flex;
padding: 0 10px;
border-radius: 0 0 $radius 0;
align-items: center;
background-color: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
color: #fff;
position: absolute;
top: 0;
left: 0;
z-index: 10;
}
&::before {
content: '删除';
font-size: 12px;
width: 100%;
height: 20px;
display: flex;
padding: 0 10px;
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
color: #fff;
position: absolute;
bottom: 0;
left: 0;
z-index: 10;
transition: all .1s ease-in-out;
}
}
.name {
width: $size;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
</style>

View File

@ -0,0 +1,312 @@
<template>
<div>
<el-dialog title="领取详情" :visible.sync="dialogVisible" width="70%" @close="reset">
<div class="search">
<el-form :model="query" inline label-position="left">
<el-form-item>
<el-input v-model="query.value" placeholder="用户ID/用户昵称/用户手机" style="width: 180px;" />
</el-form-item>
<el-form-item>
<el-select v-model="query.status" placeholder="选择状态" style="width: 154px;">
<el-option
v-for="item in stateList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item />
<el-form-item label="领取时间">
<el-date-picker
v-model="queryTime"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
value-format="yyyy-MM-dd HH:mm:ss"
@change="queryTimeChange"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getTableData">查询</el-button>
<!-- <el-button v-loading="downloadLoading" icon="el-icon-download" @click="downloadHandle">
<span v-if="!downloadLoading">导出</span>
<span v-else>下载中...</span>
</el-button> -->
</el-form-item>
</el-form>
</div>
<div class="head-container">
<el-table v-loading="loading" :data="tableData.data">
<el-table-column label="用户ID" prop="id" />
<el-table-column label="用户名" prpo="name">
<template v-slot="scope">
<div>{{ scope.row.name ? scope.row.name : '-' }}</div>
</template>
</el-table-column>
<el-table-column label="领取时间" prop="receiveTime" />
<el-table-column label="使用时间" prpo="useTime">
<template v-slot="scope">
<div>{{ scope.row.useTime ? scope.row.useTime : '-' }}</div>
</template>
</el-table-column>
<el-table-column label="获得来源" prpo="source">
<template v-slot="scope">
<div>{{ scope.row.source == 'activate' ? '充值活动' :
scope.row.source == 'invited' ? '好友分享' : '' }}</div>
</template>
</el-table-column>
<el-table-column label="状态" align="status">
<template v-slot="scope">
<div style="display: flex;align-items: center;">
<div v-if="scope.row.overNum == scope.row.num" style="color: #FAAD14;">未使用</div>
<div v-if="scope.row.num!=0&&scope.row.overNum != scope.row.num">{{ scope.row.overNum }}/{{ scope.row.num }}</div>
<div v-if="scope.row.overNum == 0" style="color: #52C41A;">已使用</div>
</div>
</template>
</el-table-column>
<el-table-column label="使用门店" prpo="useTime">
<template v-slot="scope">
<div>{{ scope.row.tableName ? scope.row.tableName : '-' }}</div>
</template>
</el-table-column>
<el-table-column label="操作" width="150">
<template v-slot="scope">
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
<el-button
slot="reference"
type="text"
icon="el-icon-delete"
style="color: #FF4D4F;"
>删除</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination
:total="tableData.total"
:current-page="tableData.page"
:page-size="tableData.size"
layout="total, sizes, prev, pager, next, jumper"
@current-change="paginationChange"
@size-change="sizeChange"
/>
</div>
</el-dialog>
</div>
</template>
<script>
import { queryReceive, delReceive } from '@/api/coupon'
export default {
// eslint-disable-next-line vue/require-prop-types
props: ['couponId'],
data() {
return {
dialogVisible: false,
downloadLoading: false,
loading: false,
stateList: [
{ label: '未使用', value: 0 },
{ label: '已使用', value: 1 }
],
queryTime: [],
query: {
couponId: '',
value: '',
status: 0,
startTime: '',
endTime: '',
page: 1,
size: 10
},
resetQuery: null,
tableData: {
data: [],
page: 1,
size: 10,
loading: false,
total: 0
}
}
},
mounted() {
this.resetQuery = { ...this.query }
},
methods: {
/**
* 查询
*/
async getTableData() {
// eslint-disable-next-line no-unused-vars, prefer-const
// console.log(this.couponId)
// eslint-disable-next-line no-unused-vars, prefer-const
let res = await queryReceive({
shopId: localStorage.getItem('shopId'),
couponId: this.query.couponId,
value: this.query.value,
status: this.query.status,
startTime: this.query.startTime,
endTime: this.query.endTime,
page: this.query.page,
size: this.query.size
})
this.tableData.loading = false
this.tableData.data = res.content
this.tableData.total = res.totalElements
},
/**
* 时间选择监听
*/
queryTimeChange(e) {
if (e) {
this.query.startTime = e[0]
this.query.endTime = e[1]
} else {
this.query.startTime = ''
this.query.endTime = ''
}
},
/**
* 删除优惠券
* @param id
*/
async delTableHandle(id) {
// eslint-disable-next-line no-undef
const delRes = await delReceive(id)
console.log(delRes)
this.getTableData()
},
/**
* 打开详情
* @param obj
*/
show(obj) {
console.log(obj)
this.dialogVisible = true
this.query.couponId = obj.id
this.getTableData()
},
//
sizeChange(e) {
this.tableData.size = e
this.getTableData()
},
//
paginationChange(e) {
this.tableData.page = e
this.query.page = e
this.getTableData()
},
/**
* 关闭详情
*/
close() {
this.dialogVisible = false
},
/**
* 导出Excel
*/
async downloadHandle() {
try {
this.downloadLoading = true
// eslint-disable-next-line no-undef
const file = await summaryTableDownload({
startTime: this.query.createdAt[0],
endTime: this.query.createdAt[1]
})
// eslint-disable-next-line no-undef
downloadFile(file, '数据', 'xlsx')
this.downloadLoading = false
} catch (error) {
this.downloadLoading = false
console.log(error)
}
},
reset() {
this.query = { ...this.resetQuery }
}
}
}
</script>
<style scoped lang="scss">
.shop_list {
display: flex;
flex-wrap: wrap;
.item_wrap {
$size: 80px;
.item {
$radius: 4px;
width: $size;
height: $size;
border-radius: $radius;
overflow: hidden;
position: relative;
margin-right: 10px;
margin-top: 10px;
&:hover {
cursor: pointer;
}
&::after {
content: attr(data-index);
font-size: 12px;
height: 20px;
display: flex;
padding: 0 10px;
border-radius: 0 0 $radius 0;
align-items: center;
background-color: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
color: #fff;
position: absolute;
top: 0;
left: 0;
z-index: 10;
}
&::before {
content: '删除';
font-size: 12px;
width: 100%;
height: 20px;
display: flex;
padding: 0 10px;
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
color: #fff;
position: absolute;
bottom: 0;
left: 0;
z-index: 10;
transition: all .1s ease-in-out;
}
}
.name {
width: $size;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
</style>

View File

@ -1,32 +1,51 @@
export default { export default {
classType: [ classType: [
{ {
value: 'product', value: 'product',
label: '商品券' label: '商品券'
}, },
{ {
value: 'common', value: 'common',
label: '通用券' label: '通用券'
} }
], ],
type: [ type: [
{ {
value: '0', value: '0',
label: '满减' label: '满减'
}, },
{ {
value: '1', value: '1',
label: '折扣' label: '折扣'
} }
], ],
effectType: [ cycle: [
{ { label: '周一' },
value: '0', { label: '周二' },
label: '一直有效' { label: '周三' },
}, { label: '周四' },
{ { label: '周五' },
value: '1', { label: '周六' },
label: '时限有效' { label: '周七' }
} ],
] validityType: [
} {
value: 'fixed',
label: '领券后有效期内可用'
},
{
value: 'custom',
label: '固定有效期范围内可用'
}
],
useTimeType: [
{
value: 'all',
label: '全时段可用'
},
{
value: 'custom',
label: '指定时间段'
}
]
}

View File

@ -1,118 +1,163 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<div class="head-container"> <div class="head-container">
<el-button type="primary" icon="el-icon-plus" @click="$refs.addCoupon.show()"> <!-- <el-button type="primary" icon="el-icon-plus" @click="$refs.addCoupon.show()">
添加优惠券 添加优惠券
</el-button> </el-button> -->
</div> <el-button type="primary" icon="el-icon-plus" @click="$router.push({name: 'add_coupon', query: {type:1}})">
<div class="head-container"> 添加优惠券
<el-table :data="tableData.data" v-loading="tableData.loading"> </el-button>
<el-table-column label="优惠券名称" prop="title"></el-table-column>
<el-table-column label="类型" prop="classType">
<template v-slot="scope">
{{ scope.row.classType | classTypeFilter }}
</template>
</el-table-column>
<el-table-column label="优惠类型" prop="type">
<template v-slot="scope">
{{ scope.row.type | typeFilter }}
</template>
</el-table-column>
<el-table-column label="折扣" prop="ratio"></el-table-column>
<el-table-column label="面额" prop="amount"></el-table-column>
<el-table-column label="满减限制" prop="limitAmount"></el-table-column>
<el-table-column label="发放数量" prop="number"></el-table-column>
<el-table-column label="限领数量" prop="limitNumber"></el-table-column>
<el-table-column label="剩余数量" prop="leftNumber"></el-table-column>
<el-table-column label="有效期" prop="effectType">
<template v-slot="scope">
{{ scope.row.effectType | effectTypeFilter }}
</template>
</el-table-column>
<el-table-column label="开始时间" prop="fromTime"></el-table-column>
<el-table-column label="到期时间" prop="toTime"></el-table-column>
<el-table-column label="商品列表" prop="relationIds" width="200">
<template v-slot="scope">
<div style="display: flex;" v-if="scope.row.classType == 'product'">
<el-image :src="scope.row.coverImg" style="width: 30px;height: 30px;"></el-image>
<span style="margin-left: 10px;">{{ scope.row.name }}</span>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
@current-change="paginationChange" @size-change="sizeChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
<addCoupon ref="addCoupon" @success="resetHandle" />
</div> </div>
<div class="head-container">
<el-table v-loading="tableData.loading" :data="tableData.data">
<el-table-column label="ID" prop="id" />
<el-table-column label="名称" prop="title" />
<el-table-column label="使用门槛">
<template v-slot="scope">
{{ `${scope.row.fullAmount}${scope.row.discountAmount?'减'+scope.row.discountAmount+'元':''}` }}
</template>
</el-table-column>
<!-- <el-table-column label="有效期">
<template v-slot="scope">
{{ `领券后${scope.row.validDays}天过期` }}
</template>
</el-table-column> -->
<!-- <el-table-column label="用户领取方式" prpo="source">
<template v-slot="scope">
<div>{{ scope.row.source == 'activate' ? '充值活动' :
scope.row.source == 'invited' ? '好友分享' : '' }}</div>
</template>
</el-table-column> -->
<el-table-column label="总发放数量" prop="number" />
<el-table-column label="已领取" align="center">
<template v-slot="scope">
<div style="display: flex;align-items: center;justify-content: center;">
<div style="width: 30px;">{{ scope.row.number-scope.row.leftNumber }}</div>
<div style="margin: 0 10px;">|</div>
<div style="color: #3F9EFF;cursor: pointer;flex-shrink: 0;" @click="couponDetailsOpen(scope.row)">详情</div>
</div>
</template>
</el-table-column>
<el-table-column label="已使用" prop="useNumber" />
<el-table-column label="剩余" prop="leftNumber" />
<el-table-column label="操作" width="150">
<template v-slot="scope">
<el-button type="text" icon="el-icon-edit" @click="$router.push({name: 'add_coupon', query: {type:scope.row.type ,id: scope.row.id}} )">编辑</el-button>
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
<el-button
slot="reference"
type="text"
icon="el-icon-delete"
style="margin-left: 20px !important;"
>删除</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination
:total="tableData.total"
:current-page="tableData.page"
:page-size="tableData.size"
layout="total, sizes, prev, pager, next, jumper"
@current-change="paginationChange"
@size-change="sizeChange"
/>
</div>
<couponDetails ref="couponDetails" @success="resetHandle" />
</div>
</template> </template>
<script> <script>
import couponEnum from './couponEnum' import couponEnum from './couponEnum'
import addCoupon from './components/addCoupon.vue' import couponDetails from './components/coupon_details.vue'
import { tbMerchantCouponGet } from '@/api/shop' import { getTbShopCoupon, delTbShopCoupon } from '@/api/coupon'
export default { export default {
components: { addCoupon }, // eslint-disable-next-line vue/no-unused-components
data() { components: { couponDetails },
return { filters: {
tableData: {
data: [], typeFilter(value) {
page: 0, // eslint-disable-next-line eqeqeq
size: 10, return couponEnum.type.find(item => item.value == value).label
loading: false,
total: 0
}
}
}, },
filters: { effectTypeFilter(value) {
classTypeFilter(value) { // eslint-disable-next-line eqeqeq
return couponEnum.classType.find(item => item.value == value).label return couponEnum.effectType.find(item => item.value == value).label
},
typeFilter(value) {
return couponEnum.type.find(item => item.value == value).label
},
effectTypeFilter(value) {
return couponEnum.effectType.find(item => item.value == value).label
}
},
mounted() {
this.getTableData()
},
methods: {
//
resetHandle() {
this.page = 0
this.getTableData()
},
//
sizeChange(e) {
this.tableData.size = e
this.getTableData()
},
//
paginationChange(e) {
this.tableData.page = e - 1
this.getTableData()
},
//
async getTableData() {
this.tableData.loading = true
try {
const res = await tbMerchantCouponGet({
page: this.tableData.page,
size: this.tableData.size,
shopId: localStorage.getItem('shopId')
})
this.tableData.loading = false
this.tableData.data = res.content
this.tableData.total = res.totalElements
} catch (error) {
console.log(error)
}
}
} }
},
data() {
return {
tableData: {
data: [],
page: 1,
size: 10,
loading: false,
total: 0
},
couponId: null
}
},
mounted() {
this.getTableData()
},
methods: {
//
toPath(path, row) {
this.$router.push({ path: path, query: row })
},
//
resetHandle() {
this.page = 1
this.getTableData()
},
//
sizeChange(e) {
this.tableData.size = e
this.getTableData()
},
//
paginationChange(e) {
console.log(e)
this.tableData.page = e
this.getTableData()
},
//
async getTableData() {
this.tableData.loading = true
try {
const res = await getTbShopCoupon({
page: this.tableData.page,
size: this.tableData.size,
shopId: localStorage.getItem('shopId')
})
this.tableData.loading = false
this.tableData.data = res.content
this.tableData.total = res.totalElements
console.log(this.tableData)
} catch (error) {
console.log(error)
}
},
/**
* 查看领取详情
*/
couponDetailsOpen(row) {
this.$refs.couponDetails.show(row)
this.couponId = row.id
},
/**
* 删除优惠券
* @param id
*/
async delTableHandle(id) {
const delRes = await delTbShopCoupon(id)
console.log(delRes)
this.getTableData()
}
}
} }
</script> </script>

View File

@ -0,0 +1,217 @@
<template>
<div class="app-container">
<el-form :model="forms">
<el-form-item label="打印机品牌">
<el-select v-model="forms.contentType" placeholder="请选择打印机品牌">
<el-option label="云想印" value="yxyPrinter"></el-option>
<el-option label="飞鹅" value="fePrinter"></el-option>
<!-- <el-option label="本地" value="local"></el-option> -->
<!-- <el-option label="USB" value="printer"></el-option> -->
</el-select>
</el-form-item>
<el-form-item label="小票打印">
<el-select v-model="forms.subType" placeholder="请选择小票打印">
<el-option label="标签" value="label"></el-option>
<el-option label="出品" value="kitchen"></el-option>
<el-option label="小票" value="cash"></el-option>
</el-select>
</el-form-item>
<el-form-item label="打印机名称">
<el-input v-model="forms.name" style="width: 280px;" placeholder="请输入打印机名称"></el-input>
</el-form-item>
<!-- <template v-if="forms.contentType == 'network'"> -->
<el-form-item label="打印机编号">
<el-input v-model="forms.address" style="width: 280px;" placeholder="请输入打印机编号"></el-input>
</el-form-item>
<el-form-item label="打印机秘钥">
<el-input v-model="forms.port" style="width: 280px;" placeholder="请输入打印机秘钥"></el-input><br />
<div style="margin-left: 80px;color: #FF4D4F;">* 可在打印机设备底部查看打印机编号和秘钥(key)</div>
</el-form-item>
<!-- </template> -->
<!-- <template v-if="forms.contentType == 'local'"> <el-form-item label="IP地址">
<el-input v-model="forms.address" style="width: 280px;" placeholder="请输入打印机编号"></el-input>
</el-form-item>
<el-form-item label="端口">
<el-input v-model="forms.port" style="width: 280px;" placeholder="请输入打印机秘钥"></el-input><br />
<div style="margin-left: 80px;color: #FF4D4F;">* 可在打印机设备底部查看打印机编号和秘钥(key)</div>
</el-form-item>
</template> -->
<el-form-item label="小票尺寸">
<el-radio-group v-model="forms.receiptSize">
<el-radio label="58mm"></el-radio>
<el-radio label="80mm"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分类打印">
<el-radio-group v-model="forms.classifyPrint">
<el-radio label="0">打印所有</el-radio>
<el-radio label="1">部分分类(仅打印制作单[厨房])</el-radio>
<!-- <el-radio label="2">部分商品</el-radio> -->
</el-radio-group>
<!-- <div v-if="forms.classifyPrint == 1" style="color: rgb(255, 77, 79);margin-left: 80px;"></div> -->
<div v-if="forms.classifyPrint == 1" style="margin-left:70px">
<!-- <el-tree :data="partList" show-checkbox node-key="id" ref="tree" :default-checked-keys="this.forms.categoryIds"
:props="{ children: 'childrenList', label: 'name' }">
</el-tree> -->
<el-checkbox-group v-model="forms.selectcheckbox">
<el-checkbox v-for="item in partList" :key="item.id" :label="item.name"></el-checkbox>
</el-checkbox-group>
</div>
</el-form-item>
<!-- <el-form-item label="桌台打印">
<el-radio-group v-model="forms.tablePrint">
<el-radio label="0">打印所有</el-radio>
<el-radio label="1">打印部分桌台</el-radio>
</el-radio-group>
</el-form-item> -->
<el-form-item label="打印数量">
<el-radio-group v-model="forms.printQty">
<el-radio label="c1m1^2">顾客联+商家联2</el-radio>
<el-radio label="m1^1">只打印商家联1</el-radio>
<el-radio label="c1^1">只打印顾客联1</el-radio>
<el-radio label="c2m1^3">2张顾客联+1张商家联3</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="打印方式">
<el-radio-group v-model="forms.printMethod">
<el-radio label="all">打印全部</el-radio>
<el-radio label="normal">仅打印结账单[前台]</el-radio>
<el-radio label="one">仅打印制作单[厨房]</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="打印类型">
<el-checkbox-group v-model="forms.printType">
<el-checkbox label="refund">确认退款单</el-checkbox>
<el-checkbox label="handover">交班单</el-checkbox>
<el-checkbox label="queue">排队取号</el-checkbox>
</el-checkbox-group>
</el-form-item>
<!-- <el-form-item label="打印单据">
<el-radio-group v-model="forms.printReceipt">
<el-radio label="0">全部打印</el-radio>
<el-radio label="1">仅厨房</el-radio>
<el-radio label="2">仅前台</el-radio>
</el-radio-group>
<div style="margin-left: 80px;color: #FF4D4F;">如果你的店只使用一台小票机建议选择全部打印</div>
</el-form-item> -->
<el-form-item label="打印机状态">
<el-switch v-model="forms.status" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<el-form-item label-width="80px">
<el-button type="primary" @click="$router.go(-1)">返回</el-button>
<el-button type="primary" @click="onSubmit">保存</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { configprinter, printerd, tbShopCategory } from '@/api/devices'
export default {
components: {
},
data() {
return {
forms: {
sort: "0",
status: 1,
connectionType: "network",
selectcheckbox: [],
receiptSize: '58mm',
classifyPrint: '0',
printQty: 'm1^1',
printType: ["refund", 'handover', 'queue'],
printMethod: "all",
},
partList: []
}
},
filters: {
},
mounted() {
this.getpartList()
},
methods: {
async onSubmit() {
//
if (this.$route.query.id) {
delete this.forms.createdAt
delete this.forms.updatedAt
}
//
if (this.forms.classifyPrint == 1) {
let idstr = ''
let arr = []
this.forms.selectcheckbox.forEach(element => {
let prts = this.partList.filter(ele => ele.name == element)[0]
idstr = idstr + prts.id + ','
arr.push(prts)
})
this.forms.categoryIds = idstr.substring(0, idstr.length - 1)
this.forms.categoryList = JSON.stringify(arr)
}
const res = await configprinter({
shopId: localStorage.getItem('shopId'),
...this.forms,
},
this.$route.query.id ? 'put' : 'post'
)
this.$router.go(-1)
},
async getpartList() {
const res = await tbShopCategory({
shopId: localStorage.getItem('shopId'),
sort: "sort,desc",
page: 0,
size: 500
})
let arr = []
res.content.forEach(ele => {
arr.push({
id: ele.id,
name: ele.name
})
if (ele.childrenList.length > 0) {
ele.childrenList.forEach(element => {
arr.push({
id: element.id,
name: element.name
})
})
}
})
this.partList = arr
if (this.$route.query.id) {
this.getList(this.$route.query.id)
}
},
async getList(id) {
const res = await printerd(id)
this.forms = res
if (res.categoryIds) {
let ids = res.categoryIds.split(',')
let arr = []
ids.forEach(element => {
let prts = this.partList.filter(ele => ele.id == element)[0]
arr.push(prts.name)
})
this.$set(this.forms, 'selectcheckbox', arr)
} else {
this.$set(this.forms, 'selectcheckbox', [])
}
if (res.printType) {
this.forms.printType = JSON.parse(res.printType)
} else {
this.forms.printType = []
}
}
}
}
</script>

View File

@ -1,15 +1,15 @@
export const devices = [ export const devices = [
{ {
value: 'printer', value: 'local',
name: '本地' name: '本地'
}, },
{ {
value: 'yxyPrinter', value: 'network',
name: '云想印' name: '云想印'
}, },
{ {
value: 'fePrinter', value: 'USB',
name: '飞鹅' name: 'USB打印机'
} }
] ]

View File

@ -17,7 +17,7 @@
</el-form> </el-form>
</div> </div>
<div class="head-container"> <div class="head-container">
<el-button type="primary" icon="el-icon-plus" @click="$refs.addDevice.show()"> <el-button type="primary" icon="el-icon-plus" @click="toUrl">
添加云打印机 添加云打印机
</el-button> </el-button>
</div> </div>
@ -30,11 +30,11 @@
{{ scope.row.contentType | devicesName }} {{ scope.row.contentType | devicesName }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="出品模式" prop="config.model"> <!-- <el-table-column label="出品模式" prop="config.model">
<template v-slot="scope"> <template v-slot="scope">
{{ scope.row.config.model | modelsName }} {{ scope.row.config.model | modelsName }}
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column label="打印类型" prop="subType"> <el-table-column label="打印类型" prop="subType">
<template v-slot="scope"> <template v-slot="scope">
{{ scope.row.subType | subTypesName }} {{ scope.row.subType | subTypesName }}
@ -45,7 +45,7 @@
{{ scope.row.createdAt | timeFilter }} {{ scope.row.createdAt | timeFilter }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="排序" sortable prop="sort"></el-table-column> <!-- <el-table-column label="排序" sortable prop="sort"></el-table-column> -->
<el-table-column label="状态" prop="status"> <el-table-column label="状态" prop="status">
<template v-slot="scope"> <template v-slot="scope">
<el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0" <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0"
@ -54,9 +54,8 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
<template v-slot="scope"> <template v-slot="scope">
<el-button type="text" icon="el-icon-edit" <el-button v-if="scope.row.connectionType == 'network'" type="text" icon="el-icon-edit" @click="toUrl(scope.row)">编辑</el-button>
@click="$refs.addDevice.show(scope.row)">编辑</el-button> <el-popconfirm v-if="scope.row.connectionType == 'network'" title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
<el-button type="text" icon="el-icon-delete" style="margin-left: 20px !important;" <el-button type="text" icon="el-icon-delete" style="margin-left: 20px !important;"
slot="reference">删除</el-button> slot="reference">删除</el-button>
</el-popconfirm> </el-popconfirm>
@ -75,7 +74,7 @@
<script> <script>
import { devices, models, subTypes } from './devices' import { devices, models, subTypes } from './devices'
import addDevice from './components/addDevice' import addDevice from './components/addDevice'
import { tbPrintMachineGet, tbPrintMachine } from '@/api/devices' import { tbPrintMachineGet, switchtbPrintMachine, delTableHandle } from '@/api/devices'
import dayjs from 'dayjs' import dayjs from 'dayjs'
export default { export default {
components: { components: {
@ -99,13 +98,20 @@ export default {
}, },
filters: { filters: {
devicesName(value) { devicesName(value) {
return devices.find(item => item.value == value).name if (value == 'yxyPrinter') {
return '云想印'
} else if (value == 'fePrinter') '飞鹅'
// const item=devices.find(item => item.value == value)
// return item?item.name:''
}, },
modelsName(value) { modelsName(value) {
return models.find(item => item.value == value).name const item = models.find(item => item.value == value)
return item ? item.name : ''
}, },
subTypesName(value) { subTypesName(value) {
return subTypes.find(item => item.value == value).name if (value == "label") return '标签'
else if (value == 'kitchen') return '出品'
else if (value == 'cash') return '小票'
}, },
timeFilter(s) { timeFilter(s) {
return dayjs(s).format('YYYY-MM-DD HH:mm:ss') return dayjs(s).format('YYYY-MM-DD HH:mm:ss')
@ -115,13 +121,20 @@ export default {
this.getTableData() this.getTableData()
}, },
methods: { methods: {
toUrl(item) {
this.$router.push({ path: '/devices/details', query: { id: item.id } })
},
// //
async statusChange(e, row) { async statusChange(e, row) {
try { try {
this.tableData.loading = true this.tableData.loading = true
const data = { ...row } const data = { ...row }
data.status = e data.status = e
await tbPrintMachine(data, 'put') if (data.id) {
delete data.createdAt
delete data.updatedAt
}
await switchtbPrintMachine(data)
this.getTableData() this.getTableData()
} catch (error) { } catch (error) {
console.log(error) console.log(error)
@ -139,13 +152,20 @@ export default {
this.tableData.page = e - 1 this.tableData.page = e - 1
this.getTableData() this.getTableData()
}, },
//
async delTableHandle(item) {
const res = await delTableHandle(item)
this.getTableData()
},
// //
async getTableData() { async getTableData() {
this.tableData.loading = true this.tableData.loading = true
try { try {
const res = await tbPrintMachineGet({ const res = await tbPrintMachineGet({
name: this.query.name, name: this.query.name,
contentType: this.query.type shopId: localStorage.getItem('shopId'),
contentType: this.query.type,
sort: '',
}) })
this.tableData.loading = false this.tableData.loading = false
this.tableData.data = res this.tableData.data = res

View File

@ -1,9 +1,9 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-tabs v-model="orderType" @tab-click="getTableData"> <!-- <el-tabs v-model="orderType" @tab-click="getTableData">
<el-tab-pane label="收款" name="1"></el-tab-pane> <el-tab-pane label="收款" name="1"></el-tab-pane>
<el-tab-pane label="销量" name="2"></el-tab-pane> <el-tab-pane label="销量" name="2"></el-tab-pane>
</el-tabs> </el-tabs> -->
<div class="head-container"> <div class="head-container">
<el-form :model="query" inline label-position="left"> <el-form :model="query" inline label-position="left">
<template v-if="orderType == 2"> <template v-if="orderType == 2">
@ -109,17 +109,17 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 2"> <el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 2">
<el-table-column label="商品名称" prop="productName"></el-table-column> <!-- <el-table-column label="商品分类" prop="cateName"></el-table-column>
<el-table-column label="商品分类" prop="cateName"></el-table-column>
<el-table-column label="商品描述" prop="productSkuName"></el-table-column> <el-table-column label="商品描述" prop="productSkuName"></el-table-column>
<el-table-column label="单价" prop="price"></el-table-column> <el-table-column label="单价" prop="price"></el-table-column> -->
<el-table-column label="商品名称" prop="name"></el-table-column>
<el-table-column label="销量" prop="salesNum"></el-table-column> <el-table-column label="销量" prop="salesNum"></el-table-column>
<el-table-column label="退单量" prop="refNum"></el-table-column>
<el-table-column label="销售金额" prop="salesAmount"> <el-table-column label="销售金额" prop="salesAmount">
<template v-slot="scope"> <template v-slot="scope">
{{ scope.row.salesAmount }} {{ scope.row.salesAmount }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="退单量" prop="refNum"></el-table-column>
<el-table-column label="退款金额" prop="refAmount"> <el-table-column label="退款金额" prop="refAmount">
<template v-slot="scope"> <template v-slot="scope">
{{ scope.row.refAmount }} {{ scope.row.refAmount }}
@ -146,7 +146,7 @@ export default {
return { return {
timeValue: "", timeValue: "",
resetQuery: null, resetQuery: null,
orderType: "1", orderType: "2",
categorys: [], categorys: [],
query: { query: {
createdAt: [], createdAt: [],
@ -169,7 +169,7 @@ export default {
timeFilter(time) { timeFilter(time) {
return dayjs(time).format("YYYY-MM-DD HH:mm:ss"); return dayjs(time).format("YYYY-MM-DD HH:mm:ss");
}, },
totalfilter(item,d) { totalfilter(item, d) {
let num = item + d let num = item + d
return num.toFixed(2) return num.toFixed(2)
} }
@ -214,7 +214,11 @@ export default {
try { try {
const res = await daycount({ const res = await daycount({
startTime: this.query.createdAt[0], startTime: this.query.createdAt[0],
endTime: this.query.createdAt[1] endTime: this.query.createdAt[1],
cateId: this.query.cateId,
proName: this.query.proName,
type: this.orderType,
}); });
this.payCountList = res; this.payCountList = res;
} catch (error) { } catch (error) {
@ -358,9 +362,27 @@ export default {
.collect_wrap { .collect_wrap {
display: flex; display: flex;
gap: 14px; gap: 14px;
justify-content: space-between;
.item:nth-child(1) {
background-image: url(../../assets/images/home/data_forms4.png);
}
.item:nth-child(2) {
background-image: url(../../assets/images/home/data_forms3.png);
}
.item:nth-child(3) {
background-image: url(../../assets/images/home/data_forms2.png);
}
.item:nth-child(4) {
background-image: url(../../assets/images/home/data_forms1.png);
}
.item { .item {
flex: 1; background-size: 100% 100%;
width: 255px;
display: flex; display: flex;
align-items: center; align-items: center;
background-color: #f5f5f5; background-color: #f5f5f5;

View File

@ -0,0 +1,387 @@
<template>
<div class="app-container">
<div class="head-container">
<el-form :model="query" inline label-position="left">
<el-radio-group v-model="timeValue" @change="timeChange">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="0">今天</el-radio-button>
<el-radio-button label="-1">昨天</el-radio-button>
<el-radio-button label="-7">最近7天</el-radio-button>
<el-radio-button label="-30">最近30天</el-radio-button>
<el-radio-button label="week">本周</el-radio-button>
<el-radio-button label="month">本月</el-radio-button>
<el-radio-button label="custom">自定义</el-radio-button>
</el-radio-group>
<el-date-picker v-model="query.createdAt" type="daterange" range-separator="" start-placeholder="开始日期"
end-placeholder="结束日期" :clearable="false" :default-time="['00:00:00', '23:59:59']"
value-format="yyyyMMdd">
</el-date-picker>
<el-form-item>
<el-button type="primary" @click="getTableData">查询</el-button>
<el-button @click="resetHandle">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="head-container">
<el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 1">
<el-table-column type="index" width="50">
</el-table-column>
<el-table-column label="商户名称" prop="merchantName"> </el-table-column>
<el-table-column label="职员名称" prop="staffName"></el-table-column>
<el-table-column label="订单数量" prop="orderNum"></el-table-column>
<el-table-column label="应交金额" prop="payable"></el-table-column>
<!-- <el-table-column label="上交金额" prop="handIn"></el-table-column> -->
<el-table-column label="快捷收款金额" prop="quickAmount"></el-table-column>
<el-table-column label="退款金额" prop="returnAmount"></el-table-column>
<el-table-column label="总收入" prop="totalAmount"></el-table-column>
<!-- <el-table-column label="备用金" prop="imprest"></el-table-column> -->
<el-table-column label="开始时间" prop="startTime">
<template v-slot="scope">
<div>
{{ scope.row.startTime }}
</div>
</template>
</el-table-column>
<el-table-column label="交班时间" prop="endTime">
<template v-slot="scope">
<div>
{{ scope.row.endTime }}
</div>
</template>
</el-table-column>
<el-table-column label="" width='120px'>
<template v-slot="scope">
<el-button type="text" @click="clicksee(scope.row)">查看</el-button>
<el-button type="text" @click="clickexport(scope.row)">导出</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
@current-change="paginationChange" @size-change="sizeChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
<el-dialog title="商品销量" :visible.sync="dialogshow">
<el-table :data="tableDatainfo.data" style="width: 100%;height: 500px;overflow: auto;">
<el-table-column prop="productName" label="商品名称" />
<el-table-column prop="num" label="数量" />
<el-table-column prop="amount" label="金额" />
</el-table>
</el-dialog>
</div>
</template>
<script>
import { tbHandoverGet } from '@/api/homes/record.js'
import { hasPermission } from '@/utils/limits.js'
import XLSX from 'xlsx';
import dayjs from "dayjs";
export default {
data() {
return {
timeValue: "",
resetQuery: null,
orderType: "1",
categorys: [],
query: {
createdAt: [],
proName: '',
cateId: '',
sort: 'id,desc'
},
tableData: {
data: [],
page: 0,
size: 10,
loading: false,
total: 0
},
tableDatainfo: {
data: [],
page: 0,
size: 10,
loading: false,
total: 0
},
payCountList: "",
payCountTotal: 0,
dialogshow: false, //
};
},
filters: {
timeFilter(s) {
return dayjs(s).format("YYYY-MM-DD");
}
},
mounted() {
this.resetQuery = { ...this.query };
this.getTableData();
},
methods: {
//table id
toTableOrderList(data) {
this.$router.push({
path: '/order_manage/order_list',
query: {
tableName: data.tableName
}
})
},
//
resetHandle() {
this.timeValue = "";
this.query = { ...this.resetQuery };
this.page = 0;
this.getTableData();
},
//
sizeChange(e) {
this.tableData.size = e;
this.getTableData();
},
//
paginationChange(e) {
this.tableData.page = e - 1;
this.getTableData();
},
async getTableData() {
let res = await hasPermission('允许查看所有交班记录');
if ( !res) { return; }
this.tableData.loading = true;
try {
let urlData = null
if (this.query.createdAt.length == 0) { // key -- 2024.7.30 15:50
urlData = `/api/tbHandover?page=${this.tableData.page}&size=${this.tableData.size}&shopId=${localStorage.getItem("shopId")}&sort=${this.query.sort}`
} else {
urlData = `/api/tbHandover?page=${this.tableData.page}&size=${this.tableData.size}&shopId=${localStorage.getItem("shopId")}&tradeDay=${this.query.createdAt[0] ? this.query.createdAt[0] : ''}&tradeDay=${this.query.createdAt[1] ? this.query.createdAt[1] : ''}&sort=${this.query.sort}`
}
const res = await tbHandoverGet(urlData);
this.tableData.loading = false;
this.tableData.data = res.content;
console.log(this.tableData.productInfos)
this.tableData.total = res.totalElements;
} catch (error) {
console.log(error);
}
},
//
timeChange(e) {
// const format = ["YYYY-MM-DD 00:00:00", "YYYY-MM-DD 23:59:59"];
const format = ["YYYYMMDD", "YYYYMMDD"];
switch (e) {
case "":
//
this.query.createdAt = [];
break;
case "0":
//
this.query.createdAt = [
dayjs().format(format[0]),
dayjs().format(format[1])
];
break;
case "-1":
//
this.query.createdAt = [
dayjs()
.add(-1, "d")
.format(format[0]),
dayjs()
.add(-1, "d")
.format(format[1])
];
break;
case "-7":
// 7
this.query.createdAt = [
dayjs()
.add(-7, "d")
.format(format[0]),
dayjs().format(format[1])
];
break;
case "-30":
// 7
this.query.createdAt = [
dayjs()
.add(-30, "d")
.format(format[0]),
dayjs().format(format[1])
];
break;
case "week":
//
this.query.createdAt = [
dayjs()
.startOf("week")
.format(format[0]),
dayjs()
.endOf("week")
.format(format[1])
];
break;
case "month":
//
this.query.createdAt = [
dayjs()
.startOf("month")
.format(format[0]),
dayjs()
.endOf("month")
.format(format[1])
];
break;
case "custom":
//
this.query.createdAt = [];
break;
default:
break;
}
},
//
clicksee(e) {
this.dialogshow = true
// console.log(JSON.parse(e.productInfos))
this.tableDatainfo.data = JSON.parse(e.productInfos)
},
clickexport(e) {
const arr = JSON.parse(e.productInfos)
let data = [
['商品名称', '数量', '金额'],
]
arr.forEach(element => {
data.push([element.productName, element.num, element.amount])
});
const ws = XLSX.utils.aoa_to_sheet(data);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
XLSX.writeFile(wb, 'data.xlsx');
}
}
};
</script>
<style scoped lang="scss">
.cursor-pointer {
cursor: pointer;
color: #1890ff;
transition: all 0.3s;
}
.cursor-pointer:hover {
opacity: .7;
}
.collect_wrap {
display: flex;
gap: 14px;
.item {
flex: 1;
display: flex;
align-items: center;
background-color: #f5f5f5;
padding: 20px;
.icon_wrap {
$size: 34px;
$border: 6px;
width: $size;
height: $size;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--bg-color);
border-radius: 50%;
position: relative;
&::after {
content: "";
width: $size + $border;
height: $size + $border;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: var(--bg-color);
opacity: 0.3;
}
.icon {
font-size: 16px;
color: #fff;
}
.img {
width: 20px;
height: 20px;
}
}
.info {
flex: 1;
display: flex;
flex-direction: column;
padding-left: 10px;
.m {
font-weight: bold;
}
.t {
font-size: 12px;
color: #999;
padding-top: 4px;
}
}
}
}
.refund {
color: #ff9731;
font-weight: bold;
}
.table_order_info {
.order_no {
color: #999;
}
.type {
color: #e6a23c;
}
}
.goods_info {
.row {
display: flex;
&:not(:first-child) {
margin-top: 10px;
}
.cover {
width: 40px;
height: 40px;
}
.info {
flex: 1;
display: flex;
flex-direction: column;
padding-left: 10px;
.sku {
color: #999;
}
}
}
}
</style>

View File

@ -6,20 +6,19 @@
</el-tabs> --> </el-tabs> -->
<div class="head-container"> <div class="head-container">
<el-form :model="query" inline label-position="left"> <el-form :model="query" inline label-position="left">
<el-radio-group v-model="timeValue" @change="timeChange"> <el-radio-group v-model="timeValue" @change="timeChange">
<el-radio-button label="">全部</el-radio-button> <el-radio-button label="">全部</el-radio-button>
<el-radio-button label="0">今天</el-radio-button> <el-radio-button label="0">今天</el-radio-button>
<el-radio-button label="-1">昨天</el-radio-button> <el-radio-button label="-1">昨天</el-radio-button>
<el-radio-button label="-7">最近7天</el-radio-button> <el-radio-button label="-7">最近7天</el-radio-button>
<el-radio-button label="-30">最近30天</el-radio-button> <el-radio-button label="-30">最近30天</el-radio-button>
<el-radio-button label="week">本周</el-radio-button> <el-radio-button label="week">本周</el-radio-button>
<el-radio-button label="month">本月</el-radio-button> <el-radio-button label="month">本月</el-radio-button>
<el-radio-button label="custom">自定义</el-radio-button> <el-radio-button label="custom">自定义</el-radio-button>
</el-radio-group> </el-radio-group>
<el-date-picker v-model="query.createdAt" type="daterange" range-separator="" start-placeholder="开始日期" <el-date-picker v-model="query.createdAt" type="daterange" range-separator="" start-placeholder="开始日期"
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" value-format="yyyy-MM-dd HH:mm:ss" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" value-format="yyyy-MM-dd HH:mm:ss">
> </el-date-picker>
</el-date-picker>
<el-form-item> <el-form-item>
<el-button type="primary" @click="getTableData">查询</el-button> <el-button type="primary" @click="getTableData">查询</el-button>
<el-button @click="resetHandle">重置</el-button> <el-button @click="resetHandle">重置</el-button>
@ -39,19 +38,17 @@
<div class="info"> <div class="info">
<div class="m"> <div class="m">
<template v-if="item.isAmount == 1"></template> <template v-if="item.isAmount == 1"></template>
{{ item.payAmount }} {{ item.payAmount }}
</div> </div>
<div class="t">{{ item.payType }}</div> <div class="t">{{ item.payType }}</div>
</div> </div>
</div> </div>
</div> </div>
</div> --> </div> -->
<div class="head-container"> <div class="head-container">
<el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 1"> <el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 1">
<el-table-column <el-table-column type="index" width="50">
type="index"
width="50">
</el-table-column> </el-table-column>
<!-- <el-table-column label="序号" prop="id"></el-table-column> --> <!-- <el-table-column label="序号" prop="id"></el-table-column> -->
<!-- <el-table-column label="区域id" prop="areaId"></el-table-column> --> <!-- <el-table-column label="区域id" prop="areaId"></el-table-column> -->
@ -67,7 +64,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="订单金额" prop="orderAmount"></el-table-column> <el-table-column label="订单金额" prop="orderAmount"></el-table-column>
</el-table> </el-table>
<!-- <el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 2"> <!-- <el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 2">
<el-table-column label="商品名称" prop="productName"></el-table-column> <el-table-column label="商品名称" prop="productName"></el-table-column>
@ -87,16 +84,16 @@
</el-table-column> </el-table-column>
</el-table> --> </el-table> -->
</div> </div>
<div class="head-container"> <!-- <div class="head-container">
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size" <el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
@current-change="paginationChange" @size-change="sizeChange" @current-change="paginationChange" @size-change="sizeChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination> layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div> </div> -->
</div> </div>
</template> </template>
<script> <script>
import { summaryTable,summaryTableDownload } from '@/api/table' import { summaryTable, summaryTableDownload } from '@/api/table'
import dayjs from "dayjs"; import dayjs from "dayjs";
import { downloadFile } from "@/utils/index"; import { downloadFile } from "@/utils/index";
@ -135,14 +132,15 @@ export default {
}, },
methods: { methods: {
//table id //table id
toTableOrderList(data){ toTableOrderList(data) {
console.log(data) // console.log(data)
this.$router.push({ this.$router.push({
path:'/order_manage/order_list', path: '/order_manage/order_list',
query:{ query: {
tableName: data.tableName tableName: data.tableName,
timeValue: this.timeValue
} }
}) })
}, },
// Excel // Excel
async downloadHandle() { async downloadHandle() {
@ -180,10 +178,10 @@ export default {
this.tableData.loading = true; this.tableData.loading = true;
try { try {
const res = await summaryTable({ const res = await summaryTable({
page: this.tableData.page+1, page: this.tableData.page + 1,
size: this.tableData.size, size: this.tableData.size,
startTime:this.query.createdAt[0], startTime: this.query.createdAt[0],
endTime:this.query.createdAt[1] endTime: this.query.createdAt[1]
}); });
this.tableData.loading = false; this.tableData.loading = false;
this.tableData.data = res; this.tableData.data = res;
@ -271,12 +269,13 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.cursor-pointer{ .cursor-pointer {
cursor: pointer; cursor: pointer;
color: #1890ff; color: #1890ff;
transition: all 0.3s; transition: all 0.3s;
} }
.cursor-pointer:hover{
.cursor-pointer:hover {
opacity: .7; opacity: .7;
} }

File diff suppressed because it is too large Load Diff

899
src/views/home/home_old.vue Normal file
View File

@ -0,0 +1,899 @@
<template>
<div class="app-container" style="padding-bottom: 100px;">
<div class="card_wrap">
<div class="card">
<div class="header">
<div class="card_title">总销售额</div>
<el-tooltip effect="dark" content="订单支付金额" placement="top">
<i class="icon el-icon-warning-outline"></i>
</el-tooltip>
</div>
<div class="number">{{ topData.totalSales || 0 }}</div>
<div class="row">平均每单{{ topData.averageSales || 0 }}</div>
<div class="row">今日销售额{{ topData.totalSalesToday || 0 }}</div>
</div>
<div class="card">
<div class="header">
<div class="card_title">支付笔数</div>
</div>
<div class="number">{{ topData.paymentsNumber }}</div>
<div class="row" ref="cardPayChart" style="padding-bottom: 2px;"></div>
<div class="row">
今日支付笔数{{ topData.paymentsNumberToday || 0 }}
</div>
</div>
<div class="card">
<div class="header">
<div class="card_title">访问量</div>
</div>
<div class="number">{{ topData.totalVisits }}</div>
<div class="row" ref="cardCountChart" style="padding-bottom: 2px;"></div>
<div class="row">
<div class="dot"></div>
今日访问 {{ topData.totalVisitsToday || 0 }}
</div>
</div>
<div class="card">
<div class="header">
<div class="card_title">用户数</div>
</div>
<div class="number">{{ topData.totalUser }}</div>
<div class="row" ref="cardUserChart" style="padding-bottom: 2px;"></div>
<div class="row">
今日新增 {{ topData.userToday || 0 }}
<i class="icon el-icon-caret-top"></i>
</div>
</div>
</div>
<!-- 销售额 -->
<div class="chart_wrap">
<div class="item">
<div class="header">
<div class="tab_wrap">
<div class="item active">销售额</div>
</div>
<el-radio-group v-model="saleActive" @change="dateAmount">
<el-radio-button label="7">近7天</el-radio-button>
<el-radio-button label="30">30</el-radio-button>
</el-radio-group>
</div>
<div
class="chart"
ref="saleChart"
v-loading="saleLoading"
style="height: 400px;"
></div>
</div>
</div>
<div class="chart_wrap" style="display: flex;">
<!-- 商品销售排行 -->
<div class="item">
<div class="header">
<div class="tab_wrap">
<div class="item active">商品销售排行</div>
</div>
<el-radio-group v-model="saleTableActive" @change="rankChange">
<el-radio-button label="1">今天</el-radio-button>
<el-radio-button label="7">近7天</el-radio-button>
<el-radio-button label="30">30</el-radio-button>
</el-radio-group>
</div>
<div class="sale_data">
<div class="card">
<div class="sale_data_header">
<div class="card_title">销售数量</div>
</div>
<div class="number">{{ productCount }}</div>
<div class="product_chart_wrap" ref="productCountChart"></div>
</div>
<div class="card">
<div class="sale_data_header">
<div class="card_title">销售金额</div>
</div>
<div class="number">{{ productSum }}</div>
<div class="product_chart_wrap" ref="productSumChart"></div>
</div>
</div>
<div class="table">
<el-table :data="saleTable" v-loading="saleTableLoading">
<el-table-column label="排名" prop="productId"></el-table-column>
<el-table-column
label="商品名称"
prop="productName"
></el-table-column>
<el-table-column label="数量" prop="productNum"></el-table-column>
<el-table-column label="金额" prop="amount"></el-table-column>
</el-table>
<div
class="head-container"
style="padding-top: 20px;display: flex;justify-content: flex-end;"
>
<el-pagination
:total="saleTableTotal"
:page-size="saleTableSize"
:current-page="saleTablePage"
@current-change="paginationChange"
layout="total, prev, pager, next, jumper"
></el-pagination>
</div>
</div>
</div>
<!-- 支付类型占比 -->
<div class="item" style="margin-left: 20px;">
<div class="header">
<div class="tab_wrap">
<div class="item active">支付占比类型</div>
</div>
<el-radio-group v-model="payChartDay" @change="datePayType">
<el-radio-button label="7">近7天</el-radio-button>
<el-radio-button label="30">30</el-radio-button>
</el-radio-group>
</div>
<div
style="height: 400px;margin-top: 30px;"
ref="payChart"
v-loading="payChartLoading"
></div>
</div>
</div>
</div>
</template>
<script>
import {
summaryGet,
summaryTodayGet,
dateProduct,
dateAmount,
datePayType,
summaryDateGet
} from "@/api/home";
import echarts from "echarts";
import { debounce } from "@/utils";
export default {
name: "home",
data() {
return {
topData: "",
saleTab: "sale",
saleActive: "7",
cardPayChart: null,
cardCountChart: null,
cardUserChart: null,
saleLoading: false,
saleChart: null,
payChartDay: "7",
payChartLoading: false,
payChart: null,
chartType: 1,
productCount: 0,
productSum: 0,
saleTableActive: "1",
saleTable: [],
saleTableLoading: false,
saleTablePage: 1,
saleTableTotal: 0,
saleTableSize: 5,
__resizeHandler: null,
productCountChart: null,
productSumChart: null
};
},
mounted() {
this.summaryGet();
this.dateAmount();
this.dateProduct();
this.datePayType();
this.summaryDateGet();
this.__resizeHandler = debounce(() => {
if (this.saleChart) {
this.saleChart.resize();
}
if (this.payChart) {
this.payChart.resize();
}
if (this.cardPayChart) {
this.cardPayChart.resize();
}
if (this.cardUserChart) {
this.cardUserChart.resize();
}
if (this.productCountChart) {
this.productCountChart.resize();
}
if (this.productSumChart) {
this.productSumChart.resize();
}
}, 100);
window.addEventListener("resize", this.__resizeHandler);
this.initCardUserChart();
},
methods: {
//
initCardPayChart(time = [], data = []) {
this.cardPayChart = echarts.init(this.$refs.cardPayChart);
this.cardPayChart.setOption({
tooltip: {
trigger: "axis"
},
grid: {
x: 0,
y: 0,
x2: 0,
y2: 0
},
xAxis: [
{
type: "category",
data: time,
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
color: "#409eff",
yAxis: [
{
type: "value",
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
series: [
{
data: data,
type: "bar",
barWidth: "30%"
}
]
});
},
// 访
initCardCountChart(time = [], data = []) {
this.cardCountChart = echarts.init(this.$refs.cardCountChart);
this.cardCountChart.setOption({
tooltip: {
trigger: "axis"
},
grid: {
x: 0,
y: 0,
x2: 0,
y2: 0
},
xAxis: [
{
type: "category",
data: time,
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
color: "#409eff",
yAxis: [
{
type: "value",
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
series: [
{
data: data,
type: "bar",
barWidth: "30%"
}
]
});
},
// 线
initCardUserChart(time = [], data = []) {
this.cardUserChart = echarts.init(this.$refs.cardUserChart);
this.cardUserChart.setOption({
tooltip: {
trigger: "axis"
},
grid: {
x: 0,
y: 10,
x2: 0,
y2: 2
},
xAxis: [
{
type: "category",
data: time,
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
color: "#409eff",
yAxis: [
{
type: "value",
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
series: [
{
data: data,
type: "line",
symbol: "none"
}
]
});
},
//
initSaleChart(time, data) {
this.saleChart = null;
this.saleChart = echarts.init(this.$refs.saleChart);
this.saleChart.setOption({
title: {
text: "销售趋势",
x: "center"
},
tooltip: {
trigger: "axis"
},
xAxis: [
{
type: "category",
data: time,
axisTick: {
alignWithLabel: true
},
axisLine: {
lineStyle: {
color: "#999"
}
},
axisLabel: {
rotate: time.length <= 7 ? 0 : 45,
interval: 0,
textStyle: {
fontSize: "9"
}
}
}
],
color: "#409eff",
yAxis: [
{
type: "value",
axisLine: {
lineStyle: {
color: "#999"
}
},
splitLine: {
lineStyle: {
type: "dashed",
color: "#ececec"
}
}
}
],
series: [
{
data: data,
type: "bar",
barWidth: time.length <= 7 ? "50%" : "30%"
}
]
});
},
//
initPayChart(data) {
this.payChart = echarts.init(this.$refs.payChart);
this.payChart.setOption({
tooltip: {
trigger: "item"
},
legend: {
top: "5%",
left: "center"
},
color: [
"#409eff",
"#91cc75",
"#fac858",
"#ee6666",
"#73c0de",
"#3ba272",
"#fc8452",
"#9a60b4",
"#ea7ccc"
],
series: [
{
type: "pie",
radius: ["40%", "70%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center"
},
emphasis: {
label: {
show: true,
fontSize: 20
}
},
labelLine: {
show: false
},
data: data
}
]
});
},
//
async dateAmount() {
try {
this.saleLoading = true;
const res = await dateAmount(this.saleActive);
const data = res.total.map(item => item.amount);
const time = res.total.map(item => item.tradeDay);
this.initSaleChart(time, data);
setTimeout(() => {
this.saleLoading = false;
}, 300);
} catch (error) {
console.log(error);
}
},
paginationChange(e) {
this.saleTablePage = e;
this.dateProduct();
},
//
async dateProduct() {
try {
this.saleTableLoading = true;
const res = await dateProduct(
this.saleTableActive,
this.saleTablePage,
this.saleTableSize
);
this.saleTable = res.totalProduct;
this.saleTableTotal = res.total;
this.productCount = res.productCount;
this.productSum = res.productSum;
setTimeout(() => {
this.saleTableLoading = false;
}, 300);
} catch (error) {
console.log(error);
}
},
//
async datePayType() {
try {
this.payChartLoading = true;
const res = await datePayType(this.payChartDay);
const data = res.countPayType.map(item => {
return {
value: item.count,
name: item.payType
};
});
setTimeout(() => {
this.payChartLoading = false;
}, 300);
this.initPayChart(data);
} catch (error) {
console.log(error);
}
},
//
async summaryGet() {
try {
const res1 = await summaryGet();
const res2 = await summaryTodayGet();
this.topData = {
...res1,
...res2
};
let payTime = res1.countDateList.map(item => item.tradeDay);
let payData = res1.countDateList.map(item => item.count);
let countTime = res1.visitsCountList.map(item => item.tradeDay);
let countData = res1.visitsCountList.map(item => item.count);
this.initCardPayChart(payTime, payData);
this.initCardCountChart(countTime, countData);
console.log(this.topData);
} catch (error) {
console.log(error);
}
},
rankChange() {
this.dateProduct();
this.summaryDateGet();
},
//
initProduceChart(p1, p2) {
this.productCountChart = echarts.init(this.$refs.productCountChart);
this.productSumChart = echarts.init(this.$refs.productSumChart);
this.productCountChart.setOption({
tooltip: {
trigger: "axis"
},
grid: {
x: 0,
y: 0,
x2: 0,
y2: 0
},
xAxis: [
{
boundaryGap: false,
type: "category",
data: p1[0],
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
color: "#409eff",
yAxis: [
{
type: "value",
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
series: [
{
data: p1[1],
type: "line",
symbol: "none",
smooth: true,
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#409eff" //
},
{
offset: 1,
color: "#409eff" //
}
])
}
}
]
});
this.productSumChart.setOption({
tooltip: {
trigger: "axis"
},
grid: {
x: 0,
y: 0,
x2: 0,
y2: 0
},
xAxis: [
{
boundaryGap: false,
type: "category",
data: p2[0],
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
color: "#409eff",
yAxis: [
{
type: "value",
show: false, // 线线
axisTick: {
show: false // 线
},
axisLine: {
show: false // 线
},
axisLabel: {
show: false //
},
splitLine: {
show: false // 线
}
}
],
series: [
{
data: p2[1],
type: "line",
symbol: "none",
smooth: true,
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#409eff" //
},
{
offset: 1,
color: "#409eff" //
}
])
}
}
]
});
},
//
async summaryDateGet() {
try {
const res = await summaryDateGet(this.saleTableActive);
let p1 = [
res.numList.map(item => item.tradeDay),
res.numList.map(item => item.count)
];
let p2 = [
res.amountList.map(item => item.tradeDay),
res.amountList.map(item => item.count)
];
this.initProduceChart(p1, p2);
} catch (error) {
console.log(error);
}
}
}
};
</script>
<style scoped lang="scss">
.app-container {
padding: 20px;
background-color: #f5f5f5;
}
.card_wrap {
display: flex;
flex-wrap: wrap;
gap: 20px;
.card {
flex: 1;
background-color: #fff;
border-radius: 2px;
padding: 0 20px;
.header {
display: flex;
justify-content: space-between;
color: #999;
padding-top: 20px;
.card_title {
font-size: 14px;
flex: 1;
}
}
.number {
padding: 20px 0 10px 0;
font-size: 24px;
height: 60px;
}
.row {
height: 50px;
color: #555;
font-size: 14px;
display: flex;
align-items: center;
&:not(:last-child) {
border-bottom: 1px solid #ececec;
}
.icon {
color: rgb(255, 85, 85);
margin-left: 4px;
}
.dot {
$size: 6px;
width: $size;
height: $size;
border-radius: 50%;
background-color: #1890ff;
margin-right: 6px;
}
}
}
}
.chart_wrap {
margin-top: 20px;
.sale_data {
display: flex;
.card {
flex: 1;
background-color: #fff;
border-radius: 2px;
padding: 0 20px;
.sale_data_header {
display: flex;
justify-content: space-between;
color: #999;
padding-top: 20px;
.card_title {
font-size: 14px;
flex: 1;
}
}
.number {
padding-top: 10px;
font-size: 24px;
height: 60px;
}
.product_chart_wrap {
height: 50px;
}
}
}
.item {
flex: 1;
background-color: #fff;
border-radius: 2px;
.header {
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid #ececec;
padding: 0 20px;
.tab_wrap {
display: flex;
$color: #1890ff;
.item {
padding: 0 10px;
height: 60px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
color: $color;
&.active {
position: relative;
&::after {
content: "";
width: 100%;
border-bottom: 2px solid $color;
position: absolute;
bottom: 0;
left: 0;
}
}
}
}
}
.chart {
padding: 20px 0;
height: 300px;
}
.table {
padding: 20px;
}
}
}
</style>

View File

@ -1,68 +1,36 @@
<!-- 新增耗材盘点 --> <!-- 耗材列表的新增耗材盘点 -->
<template> <template>
<el-dialog <el-dialog title="耗材盘点" :visible.sync="dialogVisible" width="80%">
title="耗材盘点" <el-form ref="form" :model="form" :rules="rules" label-position="left" inline>
:visible.sync="dialogVisible" <el-form-item label="账存数量">
width="80%" <el-input v-model="form.balance" readonly style="width: 180px;"></el-input>
@open="form.note = ''" </el-form-item>
> <el-form-item label="实际数量">
<el-form <el-input-number v-model="form.stockNumber" :min="0" :step="1" step-strictly
ref="form" style="width: 180px;"></el-input-number>
:model="form" </el-form-item>
:rules="rules" <el-form-item label="盈亏数量">
label-position="left" <el-input v-model="profitNumber" readonly :class="{ lose: profitNumber < 0 }"
inline style="width: 180px;"></el-input>
> </el-form-item>
<el-form-item label="账存数量"> <el-form-item label="单价">
<el-input :value="detail.num" readonly style="width: 180px;"></el-input> <el-input v-model="form.price" readonly></el-input>
</el-form-item> </el-form-item>
<el-form-item label="实际数量"> <el-form-item label="盈亏金额">
<el-input-number <el-input v-model="profitPrice" readonly :class="{ lose: profitNumber < 0 }"
v-model="form.lpNum" style="width: 180px;"></el-input>
:min="0" </el-form-item>
:step="1" <el-form-item label="备注">
step-strictly <el-input v-model="form.remark" placeholder="请输入备注" style="width: 300px;"></el-input>
style="width: 180px;" </el-form-item>
></el-input-number> <el-form-item>
</el-form-item> <el-button @click="dialogVisible = false"> </el-button>
<el-form-item label="盈亏数量"> <el-button type="primary" :loading="loading" @click="onSubmitHandle"> </el-button>
<el-input </el-form-item>
:value="profitNumber" </el-form>
readonly <div class="head-container">
:class="{ lose: profitNumber < 0 }" <el-table ref="table" :data="tableData.list" v-loading="tableData.loading" border stripe>
style="width: 180px;" <el-table-column label="商品信息" width="150px">
></el-input>
</el-form-item>
<el-form-item label="单价">
<el-input v-model="detail.price" readonly></el-input>
</el-form-item>
<el-form-item label="盈亏金额">
<el-input
:value="profitPrice"
readonly
:class="{ lose: profitNumber < 0 }"
style="width: 180px;"
></el-input>
</el-form-item>
<!-- <el-form-item label="备注">
<el-input v-model="form.note" placeholder="请输入备注" style="width: 300px;"></el-input>
</el-form-item> -->
<el-form-item>
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="loading" @click="onSubmitHandle"
> </el-button
>
</el-form-item>
</el-form>
<div class="head-container">
<el-table
ref="table"
:data="tableData.list"
v-loading="tableData.loading"
border
stripe
>
<!-- <el-table-column label="商品信息" width="150px">
<template v-slot="scope"> <template v-slot="scope">
<div class="shop_info"> <div class="shop_info">
<el-image :src="scope.row.coverImg" style="width: 30px;height: 30px;"> <el-image :src="scope.row.coverImg" style="width: 30px;height: 30px;">
@ -70,188 +38,186 @@
<i class="icon el-icon-document-delete"></i> <i class="icon el-icon-document-delete"></i>
</div> </div>
</el-image> </el-image>
<span>{{ scope.row.name }}</span> <span>{{ scope.row.conName }}</span>
</div> </div>
</template> </template>
</el-table-column> --> </el-table-column>
<el-table-column label="售价" prop="price"> <el-table-column label="售价" prop="price">
<template v-slot="scope"> <template v-slot="scope">
{{ formatDecimal(scope.row.price) }} {{ scope.row.price }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="帐存库存" prop="stockNumber"></el-table-column> <el-table-column label="账存数量" prop="stockNumber"></el-table-column>
<el-table-column label="盈亏数量" prop="lpNum"></el-table-column> <el-table-column label="盈亏数量" prop="lpNum"></el-table-column>
<el-table-column label="盈亏金额" prop="lpAmount"> <el-table-column label="盈亏金额" prop="lpAmount">
<template v-slot="scope"> <template v-slot="scope">
{{ formatDecimal(scope.row.lpAmount) }} {{ scope.row.lpAmount }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="实际库存" prop="acStockNumber"></el-table-column>
label="实际库存" <el-table-column label="盘点时间" prop="createTime"></el-table-column>
prop="acStockNumber" <el-table-column label="盘点备注" prop="remark"></el-table-column>
></el-table-column> </el-table>
<el-table-column label="盘点时间" prop="createTime"></el-table-column> </div>
<!-- <el-table-column label="盘点备注" prop="note"></el-table-column> --> <el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-sizes="[5, 10, 30, 50]"
</el-table> :page-size="tableData.size" @current-change="paginationChange" @size-change="sizeChange"
</div> layout="total, sizes, prev, pager, next, jumper"></el-pagination>
<el-pagination </el-dialog>
:total="tableData.total"
:current-page="tableData.page + 1"
:page-sizes="[5, 10, 30, 50]"
:page-size="tableData.size"
@current-change="paginationChange"
@size-change="sizeChange"
layout="total, sizes, prev, pager, next, jumper"
></el-pagination>
</el-dialog>
</template> </template>
<script> <script>
import { formatDecimal } from "@/utils"; import { formatDecimal } from '@/utils'
import { tbConCheck, tbConCheckGet } from "@/api/invoicing"; import { tbConCheck, tbConCheckGet } from '@/api/invoicing'
import { hasPermission } from '@/utils/limits.js'
export default { export default {
data() { data() {
return { return {
formatDecimal, dialogVisible: false,
dialogVisible: false, loading: false,
loading: false, form: {
detail: "", skuId: '', // sku
form: { productId: '', //
conInfoId: "", stocktakinNum: '', //
lpNum: 0 price: '', //
}, remark: "", //
rules: { stockNumber: 0
stocktakinNum: [ },
{ rules: {
required: true, stocktakinNum: [
message: "请输入盘点数量", {
trigger: "blur" required: true,
} message: '请输入盘点数量',
] trigger: 'blur'
}, }
resetForm: "", ]
searhForm: { },
name: "", resetForm: '',
skuId: "", searhForm: {
productId: "" name: '',
}, skuId: '',
tableData: { productId: ''
page: 0, },
size: 5, tableData: {
total: 0, page: 0,
loading: false, size: 5,
list: [] total: 0,
} loading: false,
}; list: []
}, }
mounted() {
this.resetForm = { ...this.form };
},
computed: {
profitNumber() {
return formatDecimal(this.form.lpNum - this.detail.num, 2, true);
},
profitPrice() {
return formatDecimal(
(this.form.lpNum - this.detail.num) * this.detail.price
);
}
},
methods: {
onSubmitHandle() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true;
let res = await tbConCheck({
conInfoId: this.form.conInfoId,
lpNum: this.profitNumber
});
this.detail.num = this.form.lpNum;
this.form.lpNum = 0;
this.form.lpNum = this.detail.num;
this.$emit("success", res);
this.loading = false;
this.$message({
title: "注意",
message: `添加成功`,
type: "success"
});
this.getTableData();
} catch (error) {
this.loading = false;
console.log(error);
}
} }
});
}, },
show(obj) { mounted() {
// console.log(obj); this.resetForm = { ...this.form }
this.detail = { ...obj }; },
this.detail.num = formatDecimal( computed: {
obj.stockNumber - obj.stockConsume, profitNumber() {
2, console.log(this.form, '盈亏数量')
false if (this.form.balance == undefined) {
); return this.form.stockNumber - 0
this.dialogVisible = true; } else {
this.form.conInfoId = obj.id; return this.form.stockNumber - this.form.balance
this.form.lpNum = this.detail.num; }
},
profitPrice() {
console.log(this.form, '盈亏金额')
return formatDecimal((this.form.stockNumber - this.form.balance) * this.form.price)
}
},
methods: {
this.searhForm.skuId = obj.productId; onSubmitHandle() {
this.searhForm.productId = obj.proId; this.$refs.form.validate(async valid => {
if (valid) {
try {
this.form.lpNum = this.profitNumber
this.form.balance = this.form.stockNumber
this.loading = true
this.form.conInfoId = this.form.id
delete this.form['id'];
console.log(this.form)
let res = await tbConCheck(this.form)
console.log(this.form);
this.$emit('success', res)
this.dialogVisible = false
this.loading = false
this.$notify({
title: '注意',
message: `添加成功`,
type: 'success'
});
this.getTableData()
} catch (error) {
this.loading = false
console.log(error)
}
}
})
},
async show(obj) {
let res = await hasPermission('允许耗材盘点');
if (!res) { return; }
this.form.remark = ''
this.form.stocktakinNum = 0
this.form.lpNum = 0
// this.form.stockNumber = 0
this.tableData.page = 0; this.form = Object.assign(this.form, obj)
this.tableData.total = 0; this.dialogVisible = true
this.tableData.list = []; this.form.conInfoId = obj.consId
this.getTableData(); this.form.stockNumber = obj.stockNumber
}, this.form.balance = obj.stockNumber
// this.form.price == null ? 0 : this.form.price
sizeChange(e) { this.searhForm.productId = obj.id
this.tableData.size = e; this.getTableData()
this.getTableData(); },
}, //
// sizeChange(e) {
paginationChange(e) { this.tableData.size = e
this.tableData.page = e - 1; this.getTableData()
this.getTableData(); },
}, //
// paginationChange(e) {
async getTableData() { this.tableData.page = e - 1
try { this.getTableData()
this.tableData.loading = true; },
const res = await tbConCheckGet({ //
page: this.tableData.page, async getTableData() {
size: this.tableData.size, try {
conInfoId: this.form.conInfoId, this.tableData.loading = true
sort: "id,desc" const res = await tbConCheckGet({
});
this.tableData.list = res.content; page: this.tableData.page,
this.tableData.total = res.totalElements; size: this.tableData.size,
setTimeout(() => { conInfoId: this.searhForm.productId,
this.tableData.loading = false; sort: 'id,desc',
}, 500); })
} catch (error) { this.tableData.list = res.content
console.log(error); this.tableData.total = res.totalElements
} setTimeout(() => {
this.tableData.loading = false
}, 500);
} catch (error) {
console.log(error)
}
},
} }
} }
};
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.lose { .lose {
&::v-deep .el-input__inner { &::v-deep .el-input__inner {
color: rgb(238, 29, 29); color: rgb(238, 29, 29);
} }
} }
.shop_info { .shop_info {
display: flex; display: flex;
align-items: center; align-items: center;
span { span {
margin-left: 10px; margin-left: 10px;
} }
} }
</style> </style>

View File

@ -110,9 +110,11 @@ export default {
}, },
computed: { computed: {
profitNumber() { profitNumber() {
//
return this.form.stocktakinNum - this.detail.stockNumber return this.form.stocktakinNum - this.detail.stockNumber
}, },
profitPrice() { profitPrice() {
//
return formatDecimal((this.form.stocktakinNum - this.detail.stockNumber) * this.detail.salePrice) return formatDecimal((this.form.stocktakinNum - this.detail.stockNumber) * this.detail.salePrice)
} }
}, },

View File

@ -0,0 +1,174 @@
<template>
<div>
<el-dialog width="60%" :visible.sync="dialogVisible" :title="query.conName">
<div class="app-container">
<!-- <div class="head-container">
<el-form :model="query" inline>
<el-form-item>
<el-input v-model="query.conName" placeholder="耗材信息名称" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getTableData">查询</el-button>
<el-button @click="resetHandle">重置</el-button>
</el-form-item>
</el-form>
</div> -->
<div class="head-container">
<el-table
ref="table"
:data="clickseetableData.data"
v-loading="clickseetableData.loading"
row-key="id"
height="50vh"
>
<el-table-column label="耗材名称" prop="conName" />
<el-table-column label="变动库存" prop="amount">
<template v-slot="scope">
<span :class="{ red: scope.row.bizType == '-' }"
>{{ scope.row.bizType }}{{ scope.row.amount }}</span
>
</template>
</el-table-column>
<el-table-column label="现有库存" prop="balance" />
<!-- <el-table-column label="业务编码" prop="bizCode" /> -->
<el-table-column label="业务说明" prop="bizName" />
<el-table-column label="商品名称" prop="productName" />
<el-table-column label="订单编号" >
<template v-slot="scope">
<a class="cursor-pointer" @click="toOrderList(scope.row)">{{ scope.row.orderNo||'' }}</a>
</template>
</el-table-column>
<!-- <el-table-column label="正负号标识" prop="bizType" /> -->
<!-- <el-table-column label="耗材id" prop="consId" /> -->
<el-table-column
label="创建时间"
prop="createTime"
></el-table-column>
<!-- <el-table-column label="更新时间" prop="updateTime">
<template v-slot="scope">
{{ dayjs(scope.row.createdAt).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column> -->
</el-table>
</div>
<div class="head-container">
<el-pagination
:total="clickseetableData.total"
:current-page="clickseetableData.page + 1"
:page-size="clickseetableData.size"
layout="total, sizes, prev, pager, next, jumper"
@current-change="paginationChangetype"
@size-change="
(e) => {
clickseetableData.size = e;
clickseetableData.page = 0;
getTableData();
}
"
/>
</div>
</div>
</el-dialog>
<order-detail ref="orderDetail"></order-detail>
</div>
</template>
<script>
import { gettbConsInfo } from "@/api/consumable";
import orderDetail from "@/views/order_manage/components/orderDetail";
export default {
components:{
orderDetail
},
data() {
return {
query: {
conName: "",
consId:''
},
dialogVisible:false,
clickseetableData: {
data: [],
page: 0,
size: 10,
loading: false,
total: 0,
},
};
},
mounted() {
},
methods: {
toOrderList(data){
console.log(data)
// if(data.orderId){
// this.$refs.orderDetail.show({id:data.orderId})
// }
this.$router.push({
path:'/order_manage/order_list',
query:{
orderNo: data.orderNo
}
})
},
open(query){
this.dialogVisible = true;
this.query=query
console.log(query)
this.getTableData();
},
close(){
this.dialogVisible = false;
},
lookDetail(row) {
console.log(row);
},
resetHandle() {
this.clickseetableData.page = 0;
this.clickseetableData.size = 30;
this.query.conName = "";
this.query.consId = "";
this.getTableData();
},
pageSizeChange(e) {
this.clickseetableData.size = e;
this.getTableData();
},
paginationChangetype(e) {
this.clickseetableData.page = e - 1;
this.getTableData();
},
//
async getTableData() {
try {
this.clickseetableData.loading = true;
const res = await gettbConsInfo({
page: this.clickseetableData.page,
size: this.clickseetableData.size,
...this.query,
shopId: localStorage.getItem("shopId"),
});
this.clickseetableData.loading = false;
this.clickseetableData.data = res.content;
this.clickseetableData.total = res.totalElements;
} catch (error) {
console.log(error);
}
},
},
};
</script>
<style scoped lang="scss">
.cursor-pointer{
cursor: pointer;
color: #1890ff;
font-size: 12px;
transition: all 0.3s;
}
.cursor-pointer:hover{
opacity: .7;
}
</style>

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