diff --git a/src/api/pay/demo/index.ts b/src/api/pay/demo/index.ts index c40ceeb..9e3d1a3 100644 --- a/src/api/pay/demo/index.ts +++ b/src/api/pay/demo/index.ts @@ -16,6 +16,6 @@ export function createDemoOrder(data) { } // 退款示例订单 -export function updateApp(id: number) { +export function refundDemoOrder(id: number) { return defHttp.put({ url: '/pay/demo-order/refund?id=' + id }) } diff --git a/src/api/pay/order/index.ts b/src/api/pay/order/index.ts index 140ac79..929cc52 100644 --- a/src/api/pay/order/index.ts +++ b/src/api/pay/order/index.ts @@ -112,3 +112,8 @@ export function deleteOrder(id: number) { export function exportOrder(params: OrderExportReqVO) { return defHttp.download({ url: '/pay/order/export-excel', params }, '支付订单.xls') } + +// 提交支付订单 +export function submitOrder(data) { + return defHttp.post({ url: '/pay/order/submit', data }) +} diff --git a/src/assets/images/pay/icon/alipay_app.svg b/src/assets/images/pay/icon/alipay_app.svg new file mode 100644 index 0000000..ebf1188 --- /dev/null +++ b/src/assets/images/pay/icon/alipay_app.svg @@ -0,0 +1 @@ +<svg t="1627279997305" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11904" width="40" height="40"><path d="M938.7008 669.525333L938.7008 249.412267c0-90.555733-73.5232-164.078933-164.1472-164.078933L249.378133 85.333333c-90.555733 0-164.078933 73.48906699-164.078933 164.078933l0 525.2096c0 90.555733 73.454933 164.078933 164.07893301 164.078933l525.20959999 0c80.725333 0 147.8656-58.368 161.553067-135.099733-43.52-18.8416-232.106667-100.283733-330.376533-147.182933-74.786133 90.589867-153.088 144.930133-271.121067 144.930133s-196.81279999-72.704-187.357867-161.655467c6.2464-58.402133 46.2848-153.9072 220.296533-137.5232 91.682133 8.6016 133.666133 25.736533 208.418133 50.414933 19.3536-35.4304 35.4304-74.513067 47.616-116.0192L292.0448 436.565333l0-32.8704 164.0448 0 0-58.9824L256 344.712533l1e-8-36.181333 200.12373299 0L456.123733 223.3344c0 0 1.809067-13.312 16.520533-13.31200001l82.056533 1e-8 0 98.474667 213.333333 0 0 36.181333-213.333333 1e-8 0 58.98239999 174.045867 0c-16.00853301 65.1264-40.277333 124.962133-70.690133 177.220267C708.608 599.176533 938.7008 669.525333 938.7008 669.525333L938.7008 669.525333 938.7008 669.525333 938.7008 669.525333zM321.57013299 744.994133c-124.7232 0-144.452267-78.7456-137.83039999-111.65013299 6.5536-32.733867 42.666667-75.502933 112.0256-75.50293301 79.6672 0 151.04 20.445867 236.714667 62.088533C472.302933 698.333867 398.370133 744.994133 321.57013299 744.994133L321.57013299 744.994133 321.57013299 744.994133zM321.57013299 744.994133" fill="#1296db" p-id="11905"></path></svg> \ No newline at end of file diff --git a/src/assets/images/pay/icon/alipay_bar.svg b/src/assets/images/pay/icon/alipay_bar.svg new file mode 100644 index 0000000..eb1e1e8 --- /dev/null +++ b/src/assets/images/pay/icon/alipay_bar.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1627279586085" class="icon" viewBox="0 0 1036 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6737" xmlns:xlink="http://www.w3.org/1999/xlink" width="40.46875" height="40"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.eot?#iefix") format("embedded-opentype"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.woff2") format("woff2"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.woff") format("woff"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.ttf") format("truetype"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.svg#iconfont") format("svg"); } +</style></defs><path d="M27.587124 336.619083h69.148134a13.978733 13.978733 0 0 0 13.79235-13.978733V13.989916A13.978733 13.978733 0 0 0 96.735258 0.011183H27.587124a13.978733 13.978733 0 0 0-13.792351 13.978733v308.650434a13.978733 13.978733 0 0 0 13.792351 13.978733z m165.880969 0h27.584701a13.978733 13.978733 0 0 0 13.79235-13.978733V13.989916a13.978733 13.978733 0 0 0-13.79235-13.978733h-27.584701a13.978733 13.978733 0 0 0-13.79235 13.978733v308.650434a13.978733 13.978733 0 0 0 13.79235 13.978733z m138.109886 322.629167h-110.525185a27.771084 27.771084 0 0 0-27.584701 28.14385v111.829867a27.771084 27.771084 0 0 0 27.584701 28.14385h110.525185a27.957467 27.957467 0 0 0 27.584701-28.14385v-111.829867a27.957467 27.957467 0 0 0-27.584701-28.14385z m484.596091-322.629167h27.584701a13.978733 13.978733 0 0 0 13.79235-13.978733V13.989916a13.978733 13.978733 0 0 0-14.537883-13.978733h-27.5847a13.978733 13.978733 0 0 0-13.978734 13.978733v308.650434a13.978733 13.978733 0 0 0 13.978734 13.978733z m-469.871825 0H428.68358a13.978733 13.978733 0 0 0 13.792351-13.978733V13.989916A13.978733 13.978733 0 0 0 428.68358 0.011183h-83.126867a13.978733 13.978733 0 0 0-13.792351 13.978733v308.650434a13.978733 13.978733 0 0 0 13.792351 13.978733z m594.189361 0h69.148134a13.978733 13.978733 0 0 0 13.792351-13.978733V13.989916a13.978733 13.978733 0 0 0-14.537883-13.978733h-69.148135a13.978733 13.978733 0 0 0-13.79235 13.978733v308.650434a13.978733 13.978733 0 0 0 13.79235 13.978733z m-412.279444 126.181367H66.91396A67.470687 67.470687 0 0 0 0.002423 530.830286v425.139878a67.470687 67.470687 0 0 0 66.911537 68.029836h418.802853a67.470687 67.470687 0 0 0 66.911537-68.029836V487.775787a24.788954 24.788954 0 0 0-24.416188-24.975337z m-58.337914 433.899885a42.681733 42.681733 0 0 1-42.495349 43.054498H125.438257a42.681733 42.681733 0 0 1-42.495349-43.054498V590.100115a42.681733 42.681733 0 0 1 42.495349-43.054498h301.940642a42.681733 42.681733 0 0 1 42.495349 43.054498z m525.22761-433.899885a41.749817 41.749817 0 0 0-41.377051 42.122583v55.914934a41.377051 41.377051 0 1 0 82.940485 0v-55.914934a41.749817 41.749817 0 0 0-41.563434-42.122583z m0 223.659734a41.749817 41.749817 0 0 0-41.377051 42.122584V894.65012a45.477479 45.477479 0 0 1-45.291096 45.850246h-159.730327a43.240882 43.240882 0 0 0-43.613649 37.276622A41.9362 41.9362 0 0 0 745.534871 1024h233.538039a57.778765 57.778765 0 0 0 57.405999-58.337914V729.3283a41.749817 41.749817 0 0 0-41.377051-41.9362zM732.488053 322.64035V13.989916a13.978733 13.978733 0 0 0-13.79235-13.978733h-82.940485a13.978733 13.978733 0 0 0-13.79235 13.978733v308.650434a13.978733 13.978733 0 0 0 13.79235 13.978733h82.940485a13.978733 13.978733 0 0 0 13.79235-13.978733zM532.126208 0.011183c-11.36937 0-20.688525 6.337026-20.688526 13.978733v308.650434c0 7.828091 9.319156 13.978733 20.688526 13.978733s20.688525-6.337026 20.688525-13.978733V13.989916c0-7.641708-9.319156-13.978733-20.688525-13.978733z" p-id="6738" fill="#1977FD"></path><path d="M745.534871 462.80045a41.749817 41.749817 0 0 0-41.377051 42.122583v252.549117a41.377051 41.377051 0 1 0 82.940485 0V504.923033A41.749817 41.749817 0 0 0 745.534871 462.80045" p-id="6739" fill="#1977FD"></path></svg> diff --git a/src/assets/images/pay/icon/alipay_pc.svg b/src/assets/images/pay/icon/alipay_pc.svg new file mode 100644 index 0000000..2a75277 --- /dev/null +++ b/src/assets/images/pay/icon/alipay_pc.svg @@ -0,0 +1 @@ +<svg t="1627279878333" class="icon" viewBox="0 0 1285 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8535" width="40" height="40"><path d="M1141.76 855.04h-286.72c0 40.96 30.72 71.68 71.68 71.68h107.52c20.48 0 35.84 15.36 35.84 35.84s-15.36 35.84-35.84 35.84h-783.36c-20.48 0-35.84-15.36-35.84-35.84s15.36-35.84 35.84-35.84h107.52c40.96 0 71.68-30.72 71.68-71.68h-286.72c-76.8 0-143.36-61.44-143.36-143.36v-568.32c0-76.8 61.44-143.36 143.36-143.36h993.28c76.8 0 143.36 61.44 143.36 143.36v568.32c5.12 76.8-56.32 143.36-138.24 143.36z m71.68-711.68c0-40.96-30.72-71.68-71.68-71.68h-993.28c-40.96 0-71.68 30.72-71.68 71.68v568.32c0 40.96 30.72 71.68 71.68 71.68h993.28c40.96 0 71.68-30.72 71.68-71.68v-568.32z m-143.36 568.32h-855.04c-40.96 0-71.68-30.72-71.68-71.68v-424.96c0-40.96 30.72-71.68 71.68-71.68h855.04c40.96 0 71.68 30.72 71.68 71.68v424.96c0 40.96-30.72 71.68-71.68 71.68z" p-id="8536" fill="#1977FD"></path></svg> \ No newline at end of file diff --git a/src/assets/images/pay/icon/alipay_qr.svg b/src/assets/images/pay/icon/alipay_qr.svg new file mode 100644 index 0000000..4833750 --- /dev/null +++ b/src/assets/images/pay/icon/alipay_qr.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1627279238245" class="icon" viewBox="0 0 1115 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4112" width="43.5546875" height="40" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.eot?#iefix") format("embedded-opentype"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.woff2") format("woff2"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.woff") format("woff"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.ttf") format("truetype"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.svg#iconfont") format("svg"); } +</style></defs><path d="M751.388 68.267a34.133 34.133 0 0 1 0-68.267h227.556a91.022 91.022 0 0 1 91.022 91.022v227.556a34.133 34.133 0 1 1-68.266 0V91.022a22.756 22.756 0 0 0-22.756-22.755H751.388M1001.7 705.422a34.133 34.133 0 0 1 68.266 0v227.556A91.022 91.022 0 0 1 978.944 1024H748.885a34.133 34.133 0 0 1 0-68.267H978.49a22.756 22.756 0 0 0 22.755-22.755V705.422M364.09 955.733a34.133 34.133 0 1 1 0 68.267H136.533a91.022 91.022 0 0 1-91.022-91.022V705.422a34.133 34.133 0 0 1 68.267 0v227.556a22.756 22.756 0 0 0 22.755 22.755H364.09M113.778 318.578a34.133 34.133 0 1 1-68.267 0V91.022A91.022 91.022 0 0 1 136.533 0H364.09a34.133 34.133 0 0 1 0 68.267H136.533a22.756 22.756 0 0 0-22.755 22.755v227.556M34.133 477.867a34.133 34.133 0 0 0 0 68.266h168.619v-68.266z m1046.756 0H912.27v68.266h168.619a34.133 34.133 0 0 0 0-68.266zM202.752 157.24h709.746v320.627H202.752z m0 388.893h709.746V866.76H202.752z" fill="#1977FD" p-id="4113"></path></svg> \ No newline at end of file diff --git a/src/assets/images/pay/icon/alipay_wap.svg b/src/assets/images/pay/icon/alipay_wap.svg new file mode 100644 index 0000000..87075db --- /dev/null +++ b/src/assets/images/pay/icon/alipay_wap.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1645964864184" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8460" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="40"><defs><style type="text/css"></style></defs><path d="M768.3 0 255.7 0c-70.8 0-128.1 57.4-128.1 128.1l0 767.8c0 70.8 57.4 128.1 128.1 128.1L512 1024l256.3 0c70.8 0 128.1-57.4 128.1-128.1L896.4 128.1C896.4 57.3 839 0 768.3 0zM383.9 96.1c0-17.7 14.3-32 32-32l192.2 0c17.7 0 32 14.3 32 32l0 0c0 17.7-14.3 32-32 32L415.9 128.1C398.2 128.1 383.9 113.8 383.9 96.1L383.9 96.1zM512 959.9 512 959.9 512 959.9c-35.4 0-64.1-28.8-64.1-64.1 0-35.4 28.7-64.1 64.1-64.1l0 0 0 0c35.4 0 64.1 28.7 64.1 64.1C576.1 931.1 547.4 959.9 512 959.9zM832.3 755.6c0 6.7-5.4 12.2-12.2 12.2L203.9 767.8c-6.7 0-12.2-5.4-12.2-12.2L191.7 204.3c0-6.7 5.4-12.2 12.2-12.2l616.3 0c6.7 0 12.2 5.4 12.2 12.2L832.4 755.6z" p-id="8461" fill="#1977FD"></path></svg> \ No newline at end of file diff --git a/src/assets/images/pay/icon/mock.svg b/src/assets/images/pay/icon/mock.svg new file mode 100644 index 0000000..27b09ea --- /dev/null +++ b/src/assets/images/pay/icon/mock.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1676209854312" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3033" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M173.077333 362.666667l91.114667-214.677334a65.6 65.6 0 0 1 86.016-34.773333c11.584 4.906667 24.96 10.282667 40.896 16.448 8.277333 3.2 16.789333 6.464 27.904 10.666667 28.202667 10.709333 39.296 14.933333 46.144 17.642666l51.477333-51.669333c28.181333-28.16 74.112-27.946667 102.570667 0.533333l195.925333 195.925334c16.426667 16.426667 23.445333 38.634667 21.056 59.904H896a42.666667 42.666667 0 0 1 42.666667 42.666666v490.666667a42.666667 42.666667 0 0 1-42.666667 42.666667H128a42.666667 42.666667 0 0 1-42.666667-42.666667V405.333333a42.666667 42.666667 0 0 1 42.666667-42.666666h45.077333z m48.96 0h39.104l169.194667-169.770667-27.328-10.389333c-11.2-4.245333-19.818667-7.530667-28.224-10.794667a1459.2 1459.2 0 0 1-42.197333-17.002667 20.522667 20.522667 0 0 0-26.901334 10.88L222.037333 362.666667z m108.842667 0h454.954667a23.509333 23.509333 0 0 0-5.290667-25.322667l-195.925333-195.925333a23.36 23.36 0 0 0-33.024-0.213334L330.88 362.666667zM128 405.333333v490.666667h768V405.333333H128z m597.333333 320a85.333333 85.333333 0 1 1 0-170.666666 85.333333 85.333333 0 0 1 0 170.666666z m0-42.666666a42.666667 42.666667 0 1 0 0-85.333334 42.666667 42.666667 0 0 0 0 85.333334z" fill="#4296d5" p-id="3034"></path></svg> \ No newline at end of file diff --git a/src/assets/images/pay/icon/wx_app.svg b/src/assets/images/pay/icon/wx_app.svg new file mode 100644 index 0000000..ad40b2a --- /dev/null +++ b/src/assets/images/pay/icon/wx_app.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1627279375144" class="icon" viewBox="0 0 1115 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4399" width="43.5546875" height="40" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.eot?#iefix") format("embedded-opentype"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.woff2") format("woff2"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.woff") format("woff"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.ttf") format("truetype"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.svg#iconfont") format("svg"); } +</style></defs><path d="M751.388 68.267a34.133 34.133 0 0 1 0-68.267h227.556a91.022 91.022 0 0 1 91.022 91.022v227.556a34.133 34.133 0 1 1-68.266 0V91.022a22.756 22.756 0 0 0-22.756-22.755H751.388M1001.7 705.422a34.133 34.133 0 0 1 68.266 0v227.556A91.022 91.022 0 0 1 978.944 1024H748.885a34.133 34.133 0 0 1 0-68.267H978.49a22.756 22.756 0 0 0 22.755-22.755V705.422M364.09 955.733a34.133 34.133 0 1 1 0 68.267H136.533a91.022 91.022 0 0 1-91.022-91.022V705.422a34.133 34.133 0 0 1 68.267 0v227.556a22.756 22.756 0 0 0 22.755 22.755H364.09M113.778 318.578a34.133 34.133 0 1 1-68.267 0V91.022A91.022 91.022 0 0 1 136.533 0H364.09a34.133 34.133 0 0 1 0 68.267H136.533a22.756 22.756 0 0 0-22.755 22.755v227.556M34.133 477.867a34.133 34.133 0 0 0 0 68.266h168.619v-68.266z m1046.756 0H912.27v68.266h168.619a34.133 34.133 0 0 0 0-68.266zM202.752 157.24h709.746v320.627H202.752z m0 388.893h709.746V866.76H202.752z" fill="#04C361" p-id="4400"></path></svg> \ No newline at end of file diff --git a/src/assets/images/pay/icon/wx_lite.svg b/src/assets/images/pay/icon/wx_lite.svg new file mode 100644 index 0000000..0c925cf --- /dev/null +++ b/src/assets/images/pay/icon/wx_lite.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1676209433089" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2990" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M608.6 290.3c67.1 0 121.7 50.5 121.7 112.9 0 19.4-5.6 38.4-15.7 55.5-15.3 25-39.8 43.5-69.4 52.3-7.9 2.3-13.9 3.2-19.4 3.2-13 0-23.1-10.2-23.1-23.1 0-13 10.2-23.1 23.1-23.1 0.9 0 2.8 0 5.1-0.9 19.9-5.6 35.6-17.1 44.4-32.4 6-9.7 8.8-20.4 8.8-31.5 0-36.6-33.8-66.6-75-66.6-14.4 0-28.2 3.7-40.7 10.6-21.8 12.5-34.7 33.3-34.7 56v193.9c0 39.3-21.8 75.4-57.9 95.8-19.4 11.1-41.2 16.7-63.4 16.7-67.1 0-121.7-50.5-121.7-112.9 0-19.4 5.6-38.4 15.7-55.5 15.3-25 39.8-43.5 69.4-52.3 8.3-2.3 13.9-3.2 19.4-3.2 13 0 23.1 10.2 23.1 23.1 0 13-10.2 23.1-23.1 23.1-0.9 0-2.8 0-5.1 0.9-19.9 6-35.6 17.6-44.4 32.4-6 9.7-8.8 20.4-8.8 31.5 0 36.6 33.8 66.6 75.4 66.6 14.4 0 28.2-3.7 40.7-10.6 21.8-12.5 34.7-33.3 34.7-56V403.3c0-39.3 21.8-75.4 57.9-95.8 19-11.6 40.7-17.2 63-17.2zM510.8 929c231.1 0 418.4-187.3 418.4-418.4S741.9 92.1 510.8 92.1 92.4 279.5 92.4 510.6 279.7 929 510.8 929z m0 22C267.5 951 70.3 753.8 70.3 510.6S267.5 70.1 510.8 70.1s440.5 197.2 440.5 440.5S754.1 951 510.8 951z" p-id="2991" fill="#58bf6b"></path></svg> \ No newline at end of file diff --git a/src/assets/images/pay/icon/wx_pub.svg b/src/assets/images/pay/icon/wx_pub.svg new file mode 100644 index 0000000..3a6d15b --- /dev/null +++ b/src/assets/images/pay/icon/wx_pub.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1627279797174" class="icon" viewBox="0 0 1260 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7665" xmlns:xlink="http://www.w3.org/1999/xlink" width="49.21875" height="40"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.eot?#iefix") format("embedded-opentype"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.woff2") format("woff2"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.woff") format("woff"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.ttf") format("truetype"), url("//at.alicdn.com/t/font_1031158_1uhr8ri0pk5.svg#iconfont") format("svg"); } +</style></defs><path d="M797.14798 481.753a269.194 269.194 0 0 0 102.892-211.929C900.03998 120.99 779.02998 0 630.15698 0 481.28298 0 360.27398 120.99 360.27398 269.824c0 85.878 40.33 162.462 102.912 211.929A450.974 450.974 0 0 0 309.84198 582.774c-85.543 85.524-132.608 199.208-132.608 320.236 0 25.01 0 51.712 0.197 76.367a44.898 44.898 0 0 0 44.82 44.623h816.01a44.8 44.8 0 0 0 44.82-44.623V903.01c0-121.009-47.066-234.732-132.609-320.236a451.072 451.072 0 0 0-153.344-101.021z" p-id="7666" fill="#04C361"></path><path d="M1186.18898 580.391A378.644 378.644 0 0 0 1061.81198 473.03a223.783 223.783 0 0 0 64.237-157.657c0-49.742-15.872-96.67-45.746-136.074A225.34 225.34 0 0 0 964.70998 99.9a37.297 37.297 0 0 0-46.14 25.718c-5.592 19.89 5.79 40.724 25.6 46.356 63.114 18.196 107.363 77.135 107.363 143.4a148.913 148.913 0 0 1-81.23 133.06 38.065 38.065 0 0 0-20.363 36.608c1.32 15.203 11.58 28.16 25.975 32.65 125.479 39.601 209.703 155.038 209.703 287.173v63.074c0 20.638 16.62 37.534 37.16 37.711h0.196a37.396 37.396 0 0 0 37.337-37.336V805.06c-0.197-81.644-25.777-159.35-74.142-224.69z m-901.77-62.503a36.982 36.982 0 0 0 25.955-32.65 37.455 37.455 0 0 0-20.362-36.628 148.913 148.913 0 0 1-81.231-133.06c0-66.245 44.071-125.184 107.382-143.4a37.612 37.612 0 0 0 25.58-46.356 37.376 37.376 0 0 0-46.139-25.718 225.32 225.32 0 0 0-115.593 79.4 223.252 223.252 0 0 0-45.746 136.074c0 60.258 23.533 116.381 64.237 157.676A380.475 380.475 0 0 0 74.14498 580.569 373.839 373.839 0 0 0 0.00198 805.258v63.232c0 20.657 16.798 37.356 37.356 37.356h0.197a37.317 37.317 0 0 0 37.14-37.73V805.06c0-132.332 84.401-247.769 209.723-287.173z" p-id="7667" fill="#04C361"></path></svg> \ No newline at end of file diff --git a/src/components/CardList/src/CardList.vue b/src/components/CardList/src/CardList.vue index 611a461..ffc2ab0 100644 --- a/src/components/CardList/src/CardList.vue +++ b/src/components/CardList/src/CardList.vue @@ -6,8 +6,8 @@ <div class="p-2 bg-white"> <List :grid="{ gutter: 5, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: grid }" :data-source="data" :pagination="paginationProp"> <template #header> - <div class="flex justify-end space-x-2" - ><slot name="header"></slot> + <div class="flex justify-end space-x-2"> + <slot name="header"></slot> <Tooltip> <template #title> <div class="w-50">每行显示数量</div> diff --git a/src/router/routes/index.ts b/src/router/routes/index.ts index 95883fe..db929ac 100644 --- a/src/router/routes/index.ts +++ b/src/router/routes/index.ts @@ -124,6 +124,31 @@ export const JobLogRoute: AppRouteRecordRaw = { ] } +export const PayRoute: AppRouteRecordRaw = { + path: '/cashRegister', + component: LAYOUT, + name: 'cashRegister', + meta: { + title: '收银台', + hidden: true + }, + children: [ + { + path: 'submit', + component: () => import('@/views/pay/submit/index.vue'), + name: 'PayOrderSubmit', + meta: { + canTo: true, + hidden: true, + noTagsView: false, + icon: 'ep:edit', + title: '收银台', + activeMenu: 'pay/order/index' + } + } + ] +} + // Basic routing without permission // 未经许可的基本路由 -export const basicRoutes = [LoginRoute, RootRoute, ProfileRoute, CodegenRoute, JobLogRoute, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE] +export const basicRoutes = [LoginRoute, RootRoute, ProfileRoute, CodegenRoute, JobLogRoute, PayRoute, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE] diff --git a/src/views/pay/demo/DemoModal.vue b/src/views/pay/demo/DemoModal.vue new file mode 100644 index 0000000..40ff1b3 --- /dev/null +++ b/src/views/pay/demo/DemoModal.vue @@ -0,0 +1,43 @@ +<template> + <BasicModal v-bind="$attrs" @register="registerModal" title="发起订单" @ok="handleSubmit"> + <BasicForm @register="registerForm" /> + </BasicModal> +</template> +<script lang="ts" setup name="PayDemoModal"> +import { useI18n } from '@/hooks/web/useI18n' +import { useMessage } from '@/hooks/web/useMessage' +import { BasicForm, useForm } from '@/components/Form' +import { BasicModal, useModalInner } from '@/components/Modal' +import { formSchema } from './demo.data' +import { createDemoOrder } from '@/api/pay/demo' + +const { t } = useI18n() +const { createMessage } = useMessage() +const emit = defineEmits(['success', 'register']) + +const [registerForm, { resetFields, validate }] = useForm({ + labelWidth: 120, + baseColProps: { span: 24 }, + schemas: formSchema, + showActionButtonGroup: false, + actionColOptions: { span: 23 } +}) + +const [registerModal, { setModalProps, closeModal }] = useModalInner(async () => { + resetFields() + setModalProps({ confirmLoading: false }) +}) + +async function handleSubmit() { + try { + const values = await validate() + setModalProps({ confirmLoading: true }) + await createDemoOrder(values) + closeModal() + emit('success') + createMessage.success(t('common.saveSuccessText')) + } finally { + setModalProps({ confirmLoading: false }) + } +} +</script> diff --git a/src/views/pay/demo/demo.data.ts b/src/views/pay/demo/demo.data.ts new file mode 100644 index 0000000..a183eca --- /dev/null +++ b/src/views/pay/demo/demo.data.ts @@ -0,0 +1,110 @@ +import { BasicColumn, FormSchema, useRender } from '@/components/Table' +import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' + +export const columns: BasicColumn[] = [ + { + title: '订单编号', + dataIndex: 'id', + width: 100 + }, + { + title: '用户编号', + dataIndex: 'userId', + width: 100 + }, + { + title: '商品名字', + dataIndex: 'spuName', + width: 100 + }, + { + title: '支付价格', + dataIndex: 'price', + width: 100, + customRender: ({ text }) => { + return useRender.renderTag('¥' + (text / 100.0).toFixed(2)) + } + }, + { + title: '退款金额', + dataIndex: 'refundPrice', + width: 100, + customRender: ({ text }) => { + return useRender.renderTag('¥' + (text / 100.0).toFixed(2)) + } + }, + { + title: '支付单号', + dataIndex: 'payOrderId', + width: 100 + }, + { + title: '创建时间', + dataIndex: 'createTime', + width: 180, + customRender: ({ text }) => { + return useRender.renderDate(text) + } + }, + { + title: '是否支付', + dataIndex: 'payed', + width: 100, + customRender: ({ text }) => { + return useRender.renderDict(text, DICT_TYPE.INFRA_BOOLEAN_STRING) + } + }, + { + title: '支付时间', + dataIndex: 'payTime', + width: 180, + customRender: ({ text }) => { + return useRender.renderDate(text) + } + }, + { + title: '退款时间', + dataIndex: 'refundTime', + width: 180, + customRender: ({ text }) => { + return useRender.renderDate(text) + } + } +] + +export const searchFormSchema: FormSchema[] = [ + { + label: '支付单号', + field: 'payOrderId', + component: 'Input', + colProps: { span: 8 } + }, + { + label: '是否支付', + field: 'payed', + component: 'Select', + componentProps: { + options: getIntDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING) + }, + colProps: { span: 8 } + } +] + +export const formSchema: FormSchema[] = [ + { + label: '商品', + field: 'spuId', + component: 'Select', + defaultValue: 0, + required: true, + componentProps: { + options: [ + { value: 1, label: '华为手机', price: 1 }, + { value: 2, label: '小米电视', price: 10 }, + { value: 3, label: '苹果手表', price: 100 }, + { value: 4, label: '华硕笔记本', price: 1000 }, + { value: 5, label: '蔚来汽车', price: 200000 } + ] + } + } +] diff --git a/src/views/pay/demo/index.vue b/src/views/pay/demo/index.vue index 3b64cfc..a8e05c3 100644 --- a/src/views/pay/demo/index.vue +++ b/src/views/pay/demo/index.vue @@ -1,3 +1,74 @@ <template> - <div>开发中</div> + <div> + <BasicTable @register="registerTable"> + <template #toolbar> + <a-button type="primary" v-auth="['pay:app:create']" :preIcon="IconEnum.ADD" @click="handleAdd"> 发起订单 </a-button> + </template> + <template #bodyCell="{ column, record }"> + <template v-if="column.key === 'action'"> + <TableAction + :actions="[ + { icon: IconEnum.EDIT, label: '前往支付', onClick: handlePay.bind(null, record) }, + { icon: IconEnum.DELETE, color: 'error', label: '发起退款', onClick: handleRefund.bind(null, record) } + ]" + /> + </template> + </template> + </BasicTable> + <DemoModal @register="registerModal" @success="reload()" /> + </div> </template> +<script lang="ts" setup name="PayDemo"> +import { useGo } from '@/hooks/web/usePage' +import { useI18n } from '@/hooks/web/useI18n' +import { useMessage } from '@/hooks/web/useMessage' +import { useModal } from '@/components/Modal' +import DemoModal from './DemoModal.vue' +import { IconEnum } from '@/enums/appEnum' +import { BasicTable, useTable, TableAction } from '@/components/Table' +import { getDemoOrderPage, refundDemoOrder } from '@/api/pay/demo' +import { columns, searchFormSchema } from './demo.data' + +const go = useGo() +const { t } = useI18n() +const { createConfirm, createMessage } = useMessage() +const [registerModal, { openModal }] = useModal() + +const [registerTable, { reload }] = useTable({ + title: '接入示例列表', + api: getDemoOrderPage, + columns, + formConfig: { labelWidth: 120, schemas: searchFormSchema }, + useSearchForm: true, + showTableSetting: true, + actionColumn: { + width: 180, + title: t('common.action'), + dataIndex: 'action', + fixed: 'right' + } +}) + +function handleAdd() { + openModal(true) +} + +/** 支付按钮操作 */ +function handlePay(record: Recordable) { + go('/cashRegister/submit?id=' + record.id) +} + +/** 退款按钮操作 */ +async function handleRefund(record: Recordable) { + createConfirm({ + title: '退款', + iconType: 'warning', + content: '是否确认退款编号为"' + record.id + '"的示例订单?', + async onOk() { + await refundDemoOrder(record.id) + createMessage.success(t('common.successText')) + reload() + } + }) +} +</script> diff --git a/src/views/pay/submit/index.vue b/src/views/pay/submit/index.vue new file mode 100644 index 0000000..ad0ee01 --- /dev/null +++ b/src/views/pay/submit/index.vue @@ -0,0 +1,121 @@ +<template> + <div> + <Card> + <Description :bordered="false" :column="3" :data="orderData" :schema="descSchema" /> + </Card> + <Card class="mt-4 justify-center"> + <List :grid="{ column: 8 }" header="选择支付宝支付" :data-source="aliPayChannels"> + <template #renderItem="{ item }"> + <ListItem> + <Card hoverable class="w-30 h-28 mt-3 pb-3"> + <template #cover> + <img class="w-40px h-40px mt-2" :src="icons[item.code]" /> + <p class="mt-3 text-center"> {{ item.name }} </p> + </template> + <template #actions> + <Icon icon="ant-design:alipay-outlined" @click="submit(item.code)" /> + </template> + </Card> + </ListItem> + </template> + </List> + <List :grid="{ column: 8 }" class="mt-4" header="选择微信支付" :data-source="wxPayChannels"> + <template #renderItem="{ item }"> + <ListItem> + <Card hoverable class="w-30 h-28 pt-3 pb-3"> + <template #cover> + <img class="w-40px h-40px mt-2" :src="icons[item.code]" /> + <p class="mt-3 text-center"> {{ item.name }} </p> + </template> + </Card> + </ListItem> + </template> + </List> + <List :grid="{ column: 8 }" class="mt-4" header="选择其它支付" :data-source="otherPayChannels"> + <template #renderItem="{ item }"> + <ListItem> + <Card hoverable class="w-30 h-28 pt-3 pb-3"> + <template #cover> + <img class="w-40px h-40px mt-2" :src="icons[item.code]" /> + <p class="mt-3 text-center"> {{ item.name }} </p> + </template> + </Card> + </ListItem> + </template> + </List> + </Card> + </div> +</template> +<script lang="ts" setup name="PayOrderSubmit"> +import { ref, onMounted } from 'vue' +import { Card, List } from 'ant-design-vue' +import { Description } from '@/components/Description' +import { descSchema } from './submit.data' +import { getOrder, submitOrder } from '@/api/pay/order' +import { DICT_TYPE, getStrDictOptions } from '@/utils/dict' +import { useRoute } from 'vue-router' +import alipay_qr from '@/assets/images/pay/icon/alipay_qr.svg' +import alipay_app from '@/assets/images/pay/icon/alipay_app.svg' +import alipay_wap from '@/assets/images/pay/icon/alipay_wap.svg' +import alipay_pc from '@/assets/images/pay/icon/alipay_pc.svg' +import alipay_bar from '@/assets/images/pay/icon/alipay_bar.svg' +import wx_app from '@/assets/images/pay/icon/wx_app.svg' +import wx_lite from '@/assets/images/pay/icon/wx_lite.svg' +import wx_pub from '@/assets/images/pay/icon/wx_pub.svg' +import mock from '@/assets/images/pay/icon/mock.svg' + +const ListItem = List.Item + +const icons = { + alipay_qr: alipay_qr, + alipay_app: alipay_app, + alipay_wap: alipay_wap, + alipay_pc: alipay_pc, + alipay_bar: alipay_bar, + wx_app: wx_app, + wx_lite: wx_lite, + wx_pub: wx_pub, + mock: mock +} + +const { query } = useRoute() +const orderData = ref() +const aliPayChannels = ref<any[]>([]) +const wxPayChannels = ref<any[]>([]) +const otherPayChannels = ref<any[]>([]) + +function initPayChannels() { + // 微信支付 + for (const dict of getStrDictOptions(DICT_TYPE.PAY_CHANNEL_CODE_TYPE)) { + const payChannel = { + name: dict.label, + code: dict.value as string + } + if (payChannel.code.startsWith('wx_')) { + wxPayChannels.value.push(payChannel) + } else if (payChannel.code.startsWith('alipay_')) { + aliPayChannels.value.push(payChannel) + } else if (payChannel.code) { + otherPayChannels.value.push(payChannel) + } + } +} +async function getDetail() { + const queryId = query.id as unknown as number + if (!queryId) { + return + } + + const res = await getOrder(queryId) + orderData.value = res +} + +function submit(channelCode) { + submitOrder({ id: query.id as unknown as number, channelCode }) +} + +onMounted(async () => { + await initPayChannels() + await getDetail() +}) +</script> diff --git a/src/views/pay/submit/submit.data.ts b/src/views/pay/submit/submit.data.ts new file mode 100644 index 0000000..64d9764 --- /dev/null +++ b/src/views/pay/submit/submit.data.ts @@ -0,0 +1,38 @@ +import { DescItem } from '@/components/Description' +import { useRender } from '@/components/Table' + +export const descSchema: DescItem[] = [ + { + label: '支付单号', + field: 'id' + }, + { + label: '商品标题', + field: 'subject' + }, + { + label: '商品内容', + field: 'body' + }, + { + label: '支付金额', + field: 'amount', + render: (curVal) => { + return useRender.renderText('¥', parseFloat(curVal || 0 / 100).toFixed(2)) + } + }, + { + label: '创建时间', + field: 'createTime', + render: (curVal) => { + return useRender.renderDate(curVal) + } + }, + { + label: '过期时间', + field: 'expireTime', + render: (curVal) => { + return useRender.renderDate(curVal) + } + } +]