From 32fd7fdf24938273a0f37320576e76ebab9f6a6e Mon Sep 17 00:00:00 2001 From: wystan_rin Date: Thu, 21 Nov 2024 01:09:07 +0800 Subject: [PATCH] developing --- payment_backend/app.py | 32 +++- payment_backend/config/param.yaml | 2 +- payment_backend/database.py | 3 - payment_backend/models.py | 40 ++++ payment_backend/repositories/order.py | 37 +++- payment_backend/services/order.py | 14 +- payment_backend/services/payment.py | 2 + payment_backend/services/user.py | 2 +- payment_backend/utils/datetime.py | 4 +- ...min-system-adminMoneyRecharge.5cf4644c.css | 1 - payment_headend/css/app.f2b97341.css | 3 - payment_headend/css/customAlert.css | 17 ++ payment_headend/index.html | 19 +- payment_headend/index1.html | 177 ------------------ payment_headend/js/customAlert.js | 15 ++ payment_headend/{ => js}/index.js | 105 ++++++++--- payment_headend/package.json | 2 +- payment_headend/success.html | 10 + 18 files changed, 242 insertions(+), 243 deletions(-) delete mode 100644 payment_headend/css/admin-system-adminMoneyRecharge.5cf4644c.css delete mode 100644 payment_headend/css/app.f2b97341.css create mode 100644 payment_headend/css/customAlert.css delete mode 100644 payment_headend/index1.html create mode 100644 payment_headend/js/customAlert.js rename payment_headend/{ => js}/index.js (78%) create mode 100644 payment_headend/success.html diff --git a/payment_backend/app.py b/payment_backend/app.py index 9c2146f..79fa682 100644 --- a/payment_backend/app.py +++ b/payment_backend/app.py @@ -6,6 +6,7 @@ from flask import Flask, request, jsonify, make_response from flask_cors import CORS from config import get_config +from loguru import logger from services.order import OrderService from services.user import UserService from utils.datetime import parse_time_string, to_milliseconds @@ -30,6 +31,9 @@ def add_cors_headers(response): @app.route('/createOrder', methods=['POST']) def create_order(): data = request.get_json() + name = data.get('name', None) + phone = data.get('phone', None) + email = data.get('email', None) payment_method = data.get('paymentMethod', None) if payment_method not in config['PaymentAddresses']: return jsonify({ @@ -43,9 +47,6 @@ def create_order(): wallet_address = data.get('wallet_address', None) if wallet_address is None: - name = data.get('name', None) - phone = data.get('phone', None) - email = data.get('email', None) wallet_addresses = user_service.get_wallet_addresses(name, phone, email) if not wallet_addresses: @@ -60,7 +61,8 @@ def create_order(): # 单个地址 wallet_address = wallet_addresses[0] - order_id, create_timestamp = order_service.create_order(quant, wallet_address) + order_id, create_timestamp = order_service.create_order(name=name, phone=phone, email=email, + quant=quant, wallet_address=wallet_address) return jsonify({"orderID": order_id, "amount": quant, @@ -68,13 +70,31 @@ def create_order(): "orderExpirationTime": config.order.lifetime}), 200 +@app.route('/queryOrder', methods=['POST']) +def query_order(): + data = request.get_json() + name = data.get('name', None) + phone = data.get('phone', None) + email = data.get('email', None) + wallet_address = data.get('wallet_address', None) + page = data.get('page', 1) # 获取页码,默认为第 1 页 + page_size = data.get('page_size', 10) + + offset = (page - 1) * page_size + limit = page_size + + + orders = order_service.queryOrder(name, phone, email, wallet_address, offset, limit) + return jsonify({"orders": orders}), 200 + + order_status = config.order.order_status @app.route('/finishOrder', methods=['GET']) def finish_order(): - data = request.get_json() - order_id = data.get('orderID', None) + order_id = request.args.get('orderID', None) + logger.debug(f"complete oreder: {order_id}") status = order_service.finish_order(order_id) return jsonify({"order_id": order_id, "status": status, diff --git a/payment_backend/config/param.yaml b/payment_backend/config/param.yaml index 0065b26..d722913 100644 --- a/payment_backend/config/param.yaml +++ b/payment_backend/config/param.yaml @@ -10,7 +10,7 @@ order: mysql: user: wystan password: Wystan14Brown! - host: 100.64.0.1 + host: 100.64.0.4 port: 3306 database: payment autocommit: false \ No newline at end of file diff --git a/payment_backend/database.py b/payment_backend/database.py index 5c0c388..46ae37d 100644 --- a/payment_backend/database.py +++ b/payment_backend/database.py @@ -54,9 +54,6 @@ class Database: except db_errors.Error as e: logger.info(f"Database error: {e}") raise - finally: - if cursor: - cursor.close() def commit(self): """Commit the current transaction.""" diff --git a/payment_backend/models.py b/payment_backend/models.py index dc46c9d..cff785a 100644 --- a/payment_backend/models.py +++ b/payment_backend/models.py @@ -84,3 +84,43 @@ class User: def __hash__(self): return hash((self.name, self.phone, self.email, self.wallet_address, self.payment_method)) + +class Order: + def __init__(self, id_=None, order_id=None, name=None, phone=None, email=None, quant=None, from_address=None, + to_address=None, create_timestamp=None, update_timestamp=None, status=None): + self.id = id_ + self.order_id = order_id + self.name = name + self.phone = phone + self.email = email + self.quant = quant + self.from_address = from_address + self.to_address = to_address + self.create_timestamp = create_timestamp + self.update_timestamp = update_timestamp + self.status = status + + def insert_sql(self, params_format="list"): + params_sql, params = pack_params(params_format=params_format, param_sql="{param}", join_str=",", + order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, + quant=self.quant, + from_address=self.from_address, to_address=self.to_address, + create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp, + status=self.status) + return f"INSERT INTO orders ({params_sql}) VALUES ({','.join('%s' for _ in params)})", params + + def select_sql(self, condition="AND", params_format="list"): + params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ", + order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant, + from_address=self.from_address, to_address=self.to_address, + create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp, + status=self.status) + return f"SELECT id, name, phone, email, wallet_address, payment_method FROM orders WHERE {params_sql}", params + + def exists_sql(self, condition="AND", params_format="list"): + params_sql, params = pack_params(params_format=params_format, param_sql="{param}=%s", join_str=f" {condition} ", + order_id=self.order_id, name=self.name, phone=self.phone, email=self.email, quant=self.quant, + from_address=self.from_address, to_address=self.to_address, + create_timestamp=self.create_timestamp, update_timestamp=self.update_timestamp, + status=self.status) + return f"SELECT id FROM orders WHERE {params_sql} LIMIT 1", params \ No newline at end of file diff --git a/payment_backend/repositories/order.py b/payment_backend/repositories/order.py index 01eb143..b2d9640 100644 --- a/payment_backend/repositories/order.py +++ b/payment_backend/repositories/order.py @@ -1,5 +1,8 @@ +import loguru + from custom_decorators import singleton from database import Database +from loguru import logger from utils.datetime import current_timestamp @@ -8,14 +11,16 @@ class OrderRepository: def __init__(self, config): self.db = Database(config['MYSQL']) - def create(self, order_id, quant, from_address, to_address): + def create(self, order): timestamp = current_timestamp() + order.create_timestamp = timestamp + order.update_timestamp = timestamp + sql, params = order.insert_sql() + logger.debug(sql) + logger.debug(params) try: - self.db.execute_query( - "INSERT INTO orders (order_id, quant, from_address, to_address, create_timestamp, update_timestamp) " - "VALUES (%s, %s, %s, %s, %s, %s)", - [order_id, quant, from_address, to_address, timestamp, timestamp] - ) + cursor = self.db.execute_query(sql, params) + cursor.close() self.db.commit() return timestamp except Exception: @@ -34,7 +39,19 @@ class OrderRepository: raise def get_order_info(self, order_id): - self.db.execute_query("SELECT quant, from_address, to_address, create_timestamp " - "FROM orders " - "WHERE order_id = %s", - [order_id]) + sql = 'SELECT quant, from_address, to_address, create_timestamp FROM orders WHERE order_id = %s' + logger.debug(f'getting order {order_id} info') + cursor = self.db.execute_query(sql, [order_id]) + result = cursor.fetchone() + cursor.close() + logger.debug(f'order {order_id} info: {result}') + return result + + def query(self, order, offset, limit): + select_sql, params = order.select_sql() + select_sql = f"{select_sql} LIMIT %s OFFSET %s" + params = params + [limit, offset] + cursor = self.db.execute_query(select_sql, params) + result = cursor.fetchmany(limit) + cursor.close() + return result diff --git a/payment_backend/services/order.py b/payment_backend/services/order.py index e233905..6ce47be 100644 --- a/payment_backend/services/order.py +++ b/payment_backend/services/order.py @@ -1,6 +1,7 @@ import uuid from custom_decorators import singleton +from models import Order from repositories.order import OrderRepository from services.payment import PaymentService from utils.datetime import current, current_timestamp, is_time_difference_greater_than @@ -13,13 +14,18 @@ class OrderService: self.payment_service = PaymentService(config.APIKey.tronscan) self.order_repo = OrderRepository(config) - def create_order(self, quant, address): + def queryOrder(self, name, phone, email, wallet_address, offset, limit): + orders = self.order_repo.query(Order(name=name, phone=phone, email=email, from_address=wallet_address), + offset, limit) + return orders + + def create_order(self, name, phone, email, quant, wallet_address): date_str = current().strftime('%Y%m%d%H%M%S') unique_id = str(uuid.uuid4()).split('-')[0] order_id = f"{date_str}-{unique_id}" - - create_timestamp = self.order_repo.create(order_id, quant, - address, self.config['PaymentAddresses']['usdt']) + order = Order(order_id=order_id, name=name, phone=phone, email=email, quant=quant, + from_address=wallet_address, to_address=self.config['PaymentAddresses']['usdt']) + create_timestamp = self.order_repo.create(order) return order_id, create_timestamp def finish_order(self, order_id): diff --git a/payment_backend/services/payment.py b/payment_backend/services/payment.py index 75a6824..b5b2363 100644 --- a/payment_backend/services/payment.py +++ b/payment_backend/services/payment.py @@ -9,6 +9,8 @@ class PaymentService: self.tronscan = Tronscan(api_key) def check_payment(self, quant, from_address, to_address, order_create_timestamp, end_timestamp=None): + # # 删除测试代码 + # return 1, 1 if end_timestamp is None: end_timestamp = current_timestamp() result = self.tronscan.token_trc20_transfers(limit=100, diff --git a/payment_backend/services/user.py b/payment_backend/services/user.py index 63ba904..0c1ca14 100644 --- a/payment_backend/services/user.py +++ b/payment_backend/services/user.py @@ -14,4 +14,4 @@ class UserService: users = self.user_repo.get_or_create(User(name=name, phone=phone, email=email)) addresses = set(user.address for user in users if user.address) return list(addresses) - raise ValueError('A phone number, email, or address is required.') + return [] diff --git a/payment_backend/utils/datetime.py b/payment_backend/utils/datetime.py index 014925c..2ed3dee 100644 --- a/payment_backend/utils/datetime.py +++ b/payment_backend/utils/datetime.py @@ -25,8 +25,8 @@ def is_time_difference_greater_than(timestamp1, timestamp2, hours=0, minutes=0, bool: 如果时间差大于指定的小时、分钟和秒数返回True,否则返回False """ # 将时间戳转换为 datetime 对象 - time1 = datetime.fromtimestamp(timestamp1) / 1000.0 - time2 = datetime.fromtimestamp(timestamp2) / 1000.0 + time1 = datetime.datetime.fromtimestamp(timestamp1 / 1000.0) + time2 = datetime.datetime.fromtimestamp(timestamp2 / 1000.0) # 计算时间差 time_difference = abs(time2 - time1) diff --git a/payment_headend/css/admin-system-adminMoneyRecharge.5cf4644c.css b/payment_headend/css/admin-system-adminMoneyRecharge.5cf4644c.css deleted file mode 100644 index b2b0c94..0000000 --- a/payment_headend/css/admin-system-adminMoneyRecharge.5cf4644c.css +++ /dev/null @@ -1 +0,0 @@ -.el-card[data-v-0f66bda2] .el-card__header{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-bottom:1px solid var(--el-card-border-color)}.description[data-v-0f66bda2]{margin-bottom:15px;padding:10px 20px 12px;color:#0d236d;-webkit-text-size-adjust:none;background:rgba(52,100,255,.1);border:1px solid rgba(52,100,255,.3);font:12px Microsoft YaHei,Arial}.description p.title[data-v-0f66bda2]{line-height:30px} \ No newline at end of file diff --git a/payment_headend/css/app.f2b97341.css b/payment_headend/css/app.f2b97341.css deleted file mode 100644 index 9616cc8..0000000 --- a/payment_headend/css/app.f2b97341.css +++ /dev/null @@ -1,3 +0,0 @@ -/* -! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com -*/*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:currentColor}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:PingFang SC,Arial,Hiragino Sans GB,Microsoft YaHei,sans-serif;font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.left-1\/2{left:50%}.top-1\/2{top:50%}.m-10{margin:40px}.m-2{margin:8px}.mb-1{margin-bottom:4px}.mb-4{margin-bottom:16px}.mb-5{margin-bottom:20px}.ml-2{margin-left:8px}.ml-3{margin-left:12px}.ml-6{margin-left:24px}.mr-2{margin-right:8px}.mr-20{margin-right:80px}.mr-3{margin-right:12px}.mr-5{margin-right:20px}.mr-\[10px\]{margin-right:10px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.\!table{display:table!important}.table{display:table}.hidden{display:none}.h-5{height:20px}.h-\[16px\]{height:16px}.h-full{height:100%}.min-h-0{min-height:0}.w-5{width:20px}.w-60{width:240px}.w-\[200px\]{width:200px}.w-\[20px\]{width:20px}.w-full{width:100%}.min-w-0{min-width:0}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.translate-x-\[-50\%\]{--tw-translate-x:-50%}.translate-x-\[-50\%\],.translate-y-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y:-50%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.\!border-none{border-style:none!important}.border-br{border-color:var(--el-border-color)}.bg-\[rgba\(0\2c 0\2c 0\2c 0\.3\)\]{background-color:rgba(0,0,0,.3)}.bg-br-extra-light{background-color:var(--el-border-color-extra-light)}.\!p-0{padding:0!important}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.pl-20{padding-left:80px}.pr-4{padding-right:16px}.pt-4{padding-top:16px}.text-center{text-align:center}.text-sm{font-size:var( --el-font-size-small)}.text-xs{font-size:var(--el-font-size-extra-small)}.font-medium{font-weight:500}.text-primary{color:var(--el-color-primary)}.underline{text-decoration-line:underline}.shadow{--tw-shadow:var(--el-box-shadow);--tw-shadow-colored:var(--el-box-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.blur{--tw-blur:blur(8px)}.blur,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}#app,body,html{width:100%;height:100%;background-color:#f6f8f9;font-size:12px}a{color:#333}a,a:focus,a:hover{text-decoration:none}a:focus,a:hover{color:#000}a:link{text-decoration:none}a:-webkit-any-link{text-decoration:none}a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing:border-box;outline:none!important;-webkit-appearance:none}*{margin:0;padding:0;box-sizing:border-box;outline:none}.w100{width:100%!important}.h100{height:100%!important}.aminui{display:flex;flex-flow:column}.aminui-wrapper{display:flex;flex:1;overflow:auto}.scrollable{-webkit-overflow-scrolling:touch}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-thumb{background-color:rgba(50,50,50,.3)}::-webkit-scrollbar-thumb:hover{background-color:rgba(50,50,50,.6)}::-webkit-scrollbar-track{background-color:rgba(50,50,50,.1)}::-webkit-scrollbar-track:hover{background-color:rgba(50,50,50,.2)}.layout-setting{position:fixed;width:40px;height:40px;border-radius:3px 0 0 3px;bottom:100px;right:0;z-index:100;background:#409eff;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer}.layout-setting i{font-size:18px;color:#fff}.adminui-header{height:58px;background:#222b45;color:#fff;display:flex;justify-content:space-between}.adminui-header-left{padding-left:20px}.adminui-header .logo-bar,.adminui-header-left,.adminui-header-right{display:flex;align-items:center}.adminui-header .logo-bar{font-size:20px;font-weight:700}.adminui-header .logo-bar .logo{margin-right:10px;width:35px;height:35px}.adminui-header .nav{display:flex;height:100%;margin-left:40px}.adminui-header .nav li{padding:0 10px;margin:0 10px 0 0;font-size:14px;color:hsla(0,0%,100%,.6);list-style:none;height:100%;display:flex;align-items:center;cursor:pointer}.adminui-header .nav li i{margin-right:5px}.adminui-header .nav li:hover{color:#fff}.adminui-header .nav li.active{background:hsla(0,0%,100%,.1);color:#fff}.adminui-header .user-bar .panel-item:hover{background:hsla(0,0%,100%,.1)!important}.adminui-header .user-bar .user label{color:#fff}.aminui-side-split{width:65px;flex-shrink:0;background:#222b45;display:flex;flex-flow:column}.aminui-side-split-top{height:49px}.aminui-side-split-top a{display:inline-block;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.aminui-side-split-top .logo{height:30px;vertical-align:bottom}.adminui-side-split-scroll{overflow:auto;overflow-x:hidden;height:100%;flex:1}.aminui-side-split li{cursor:pointer;width:65px;height:65px;color:#fff;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center}.aminui-side-split li i{font-size:18px}.aminui-side-split li p{margin-top:5px}.aminui-side-split li:hover{background:hsla(0,0%,100%,.1)}.aminui-side-split li.active{background:#409eff}.adminui-side-split-scroll::-webkit-scrollbar-thumb{background-color:hsla(0,0%,100%,.4);border-radius:5px}.adminui-side-split-scroll::-webkit-scrollbar-thumb:hover{background-color:hsla(0,0%,100%,.5)}.adminui-side-split-scroll::-webkit-scrollbar-track,.adminui-side-split-scroll::-webkit-scrollbar-track:hover{background-color:hsla(0,0%,100%,0)}.aminui-side{display:flex;flex-flow:column;flex-shrink:0;width:210px;background:#fff;box-shadow:2px 0 8px 0 rgba(29,35,41,.05);border-right:1px solid #e6e6e6;transition:width .3s}.adminui-side-top{border-bottom:1px solid #ebeef5;height:50px;line-height:50px}.adminui-side-top h2{padding:0 20px;font-size:17px;color:#3c4a54}.adminui-side-scroll{overflow:auto;overflow-x:hidden;flex:1}.adminui-side-bottom{border-top:1px solid #ebeef5;height:51px;cursor:pointer;display:flex;align-items:center;justify-content:center}.adminui-side-bottom i{font-size:16px}.adminui-side-bottom:hover{color:var(--el-color-primary)}.aminui-side.isCollapse{width:65px}.el-menu .menu-tag{position:absolute;height:18px;line-height:18px;background:var(--el-color-danger);font-size:12px;color:#fff;right:20px;border-radius:18px;padding:0 6px}.el-menu .el-sub-menu__title .menu-tag{right:40px}.el-menu--horizontal>li .menu-tag{display:none}.aminui-body{flex:1;display:flex;flex-flow:column}.adminui-topbar{height:50px;border-bottom:1px solid #ebeef5;background:#fff;box-shadow:0 1px 4px rgba(0,21,41,.08);display:flex;justify-content:space-between}.adminui-topbar .left-panel,.adminui-topbar .right-panel,.right-panel-search{display:flex;align-items:center}.right-panel-search>*+*{margin-left:10px}.adminui-tags{height:35px;background:#fff;border-bottom:1px solid #e6e6e6}.adminui-tags ul{display:flex;overflow:hidden}.adminui-tags li{cursor:pointer;display:inline-block;float:left;height:34px;line-height:34px;position:relative;flex-shrink:0}.adminui-tags li:after{content:" ";width:1px;height:100%;position:absolute;right:0;background-image:linear-gradient(#fff,#e6e6e6)}.adminui-tags li a{display:inline-block;padding:0 10px;width:100%;height:100%;color:#999;text-decoration:none;display:flex;align-items:center}.adminui-tags li i{margin-left:10px;border-radius:3px;width:18px;height:18px;display:flex;align-items:center;justify-content:center}.adminui-tags li i:hover{background:rgba(0,0,0,.2);color:#fff}.adminui-tags li:hover{background:#ecf5ff}.adminui-tags li.active{background:#409eff}.adminui-tags li.active a{color:#fff}.adminui-tags li.sortable-ghost{opacity:0}.adminui-main{overflow:auto;background-color:#f5f5f5;flex:1}.aminui.main-maximize .main-maximize-exit{display:block}.aminui.main-maximize .adminui-header,.aminui.main-maximize .adminui-tags,.aminui.main-maximize .adminui-topbar,.aminui.main-maximize .aminui-side,.aminui.main-maximize .aminui-side-split{display:none}.main-maximize-exit{display:none;position:fixed;z-index:3000;top:-20px;left:50%;margin-left:-20px;border-radius:50%;width:40px;height:40px;cursor:pointer;background:rgba(0,0,0,.2);text-align:center}.main-maximize-exit i{font-size:14px;margin-top:22px;color:#fff}.main-maximize-exit:hover{background:rgba(0,0,0,.4)}.sc-page{width:1230px;margin:0 auto}.block-help{display:block;width:100%;color:#909399;font-size:13px;line-height:16px;padding-top:5px}:root{--el-color-primary:#409eff;--el-color-primary-light-1:#53a7ff;--el-color-primary-light-2:#66b1ff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-4:#8cc4ff;--el-color-primary-light-5:#9fceff;--el-color-primary-light-6:#b2d8ff;--el-color-primary-light-7:#c5e1ff;--el-color-primary-light-8:#d8ebff;--el-color-primary-light-9:#ebf5ff;--el-color-primary-dark-1:#398ee5;--el-color-primary-dark-2:#337ecc;--el-color-primary-dark-3:#2c6eb2;--el-color-primary-dark-4:#265e99;--el-color-primary-dark-5:#204f7f;--el-color-primary-dark-6:#193f66;--el-color-primary-dark-7:#132f4c;--el-color-primary-dark-8:#0c1f32;--el-color-primary-dark-9:#060f19}.el-menu{border:none!important}.el-menu .el-menu-item a{color:inherit;text-decoration:none;display:block;width:100%;height:100%;position:absolute;top:0;left:0}.el-form-item-msg{font-size:12px;color:#999;clear:both;width:100%}.el-container{height:100%}.el-aside{border-right:1px solid var(--el-border-color-light)}.el-container+.el-aside{border-right:0;border-left:1px solid var(--el-border-color-light)}.el-header{background:#fff;border-bottom:1px solid var(--el-border-color-light);padding:13px 15px;justify-content:space-between}.el-header,.el-header .left-panel,.el-header .right-panel{display:flex;align-items:center}.el-header .right-panel>*+*{margin-left:10px}.el-footer{background:#fff;border-top:1px solid var(--el-border-color-light);padding:13px 15px;height:51px}.el-main{padding:15px}.el-main.nopadding{padding:0;background:#fff}.el-drawer__body{overflow:auto;padding:0}.el-popconfirm__main{margin:14px 0}.el-card__header{border-bottom:0;padding:15px 20px 0 20px}.el-card__header,.el-dialog__title,.el-drawer__header>:first-child{font-size:17px;font-weight:700}.el-tree.menu .el-tree-node__content{height:36px}.el-tree.menu .el-tree-node__content .el-tree-node__label .icon{margin-right:5px}.el-progress__text{font-size:12px!important}.el-progress__text i{font-size:14.4px!important}.el-step.is-horizontal .el-step__line{height:1px}.el-step__title{font-size:14px}.drawerBG{background:#f6f8f9}.el-button{background-color:var(--el-button-bg-color,var(--el-color-white))}.el-button+.el-dropdown,.el-button-group+.el-button-group,.el-button-group+.el-dropdown,.el-tag+.el-tag{margin-left:10px}.el-tabs__nav-wrap:after{height:1px}.el-table th.is-sortable{transition:.1s}.el-table th.is-sortable:hover{background:#eee}.el-table .el-table__body-wrapper{background:#f6f8f9}.el-col .el-card{margin-bottom:15px}.el-main{flex-basis:100%}.el-main>.scTable .el-table--border .el-table__inner-wrapper:after,.el-main>.scTable .el-table--border:after,.el-main>.scTable .el-table--border:before,.el-main>.scTable .el-table__border-left-patch{display:none}.el-main>.scTable .el-table--border .el-table__inner-wrapper tr:first-child td:first-child,.el-main>.scTable .el-table--border .el-table__inner-wrapper tr:first-child th:first-child{border-left:0}.el-table.el-table--large{font-size:14px}.el-checkbox-button__inner,.el-radio-button__inner,.el-table,.el-table.el-table--small{font-size:12px}.el-sub-menu .el-icon{font-size:17px}.el-sub-menu .el-sub-menu__icon-arrow{font-size:12px}.aminui-side-split li.active{background-color:var(--el-color-primary)}.adminui-tags li:hover{background-color:var(--el-color-primary-light-9)}.adminui-tags li.active{background-color:var(--el-color-primary)!important}.contextmenu li:hover{background-color:var(--el-color-primary-light-9)!important;color:var(--el-color-primary-light-2)!important}.data-box .item-background,.diy-grid-setting,.layout-setting{background-color:var(--el-color-primary)!important}.sceditor .tox-tinymce{border:1px solid #dcdfe6;border-radius:0}body .tox-tinymce-aux{z-index:5700}.page-user .user-info-top{text-align:center}.page-user .user-info-top h2{font-size:18px;margin-top:5px}.page-user .user-info-top p{margin:8px 0 10px 0}.page-user .menu{background:none}.page-user .menu .el-menu-item{font-size:12px;--el-menu-item-height:50px}.page-user .menu .el-menu-item-group{border-top:1px solid var(--el-border-color-light)}.page-user .menu .el-menu-item-group:first-child{border:0}.static-table{border-collapse:collapse;width:100%;font-size:14px;margin-bottom:45px;line-height:1.5em}.static-table th{text-align:left;white-space:nowrap;color:#909399;font-weight:400}.static-table td,.static-table th{border-bottom:1px solid #dcdfe6;padding:15px;max-width:250px}.static-table td{color:#606266}.header-tabs{padding:10px 0 0 0;display:block;border:0!important;height:50px;background:none}.header-tabs .el-tabs__header{padding-left:10px;margin:0}.header-tabs .el-tabs__content{display:none}.header-tabs .el-tabs__nav{border-radius:0!important}.header-tabs .el-tabs__item{font-size:13px}.header-tabs .el-tabs__item.is-active{background-color:var(--el-bg-color-overlay)}.common-header-left,.common-header-logo{display:flex;align-items:center}.common-header-logo img{height:30px;margin-right:10px;vertical-align:bottom}.common-header-logo label{font-size:20px}.common-header-title{font-size:16px;border-left:1px solid var(--el-border-color-light);margin-left:15px;padding-left:15px}.common-header-right{display:flex;align-items:center}.common-header-right a{font-size:14px;color:var(--el-color-primary);cursor:pointer}.common-header-right a:hover{color:var(--el-color-primary-light-3)}.common-container{max-width:1240px;margin:30px auto 30px auto}.common-main{padding:20px}.common-title{font-size:26px;margin-bottom:20px;font-weight:400}.common-main .el-form{width:500px;margin:30px auto}.common-main .el-steps .el-step__title{font-size:14px}.common-main .el-steps .el-step__icon{border:1px solid}.common-main .yzm{display:flex;width:100%}.common-main .yzm .el-button{margin-left:10px}.common-main .link{color:var(--el-color-primary);cursor:pointer}.common-main .link:hover{color:var(--el-color-primary-light-3)}.popup-dialog .el-dialog__body{padding:0}.operate-dialog{min-width:400px;overflow:hidden;border-radius:var(--el-border-radius-base)}.operate-dialog .el-dialog__header{padding-bottom:16px;border-bottom:1px solid #f5f5f5}.operate-dialog .el-dialog__body{padding-top:0;padding-bottom:52px}.operate-dialog .el-dialog__footer{padding:10px var(--el-dialog-padding-primary);box-shadow:var(--el-box-shadow);position:absolute;width:100%;bottom:0}.operate-form{padding-top:30px}.table-form-scrollbar{height:60vh;max-height:60vh}.zoom-handle{position:absolute;width:20px;height:20px;bottom:-10px;right:-10px;cursor:se-resize}@media(max-width:992px){.el-form-item{display:block}.el-form-item__label{display:block;text-align:left;padding:0 0 10px}.el-dialog{width:90%!important}.el-dialog.is-fullscreen{width:100%!important}.el-drawer.rtl{width:90%!important}.el-form-item__content{margin-left:0!important}.adminui-main>.el-container{display:block;height:auto}.adminui-main>.el-container>.el-aside{width:100%!important;border:0}.scTable .el-table,.scTable .el-table__body-wrapper{display:block!important;height:auto!important}.scTable .el-scrollbar__wrap{height:auto!important}.scTable .scTable-page{padding:0 5px!important}.scTable .el-pagination__jump,.scTable .el-pagination__sizes,.scTable .el-pagination__total{display:none!important}.adminui-main>.el-container>.el-container>.el-header,.adminui-main>.el-container>.el-header,.headerPublic{height:auto!important;display:block}.adminui-main>.el-container>.el-header .left-panel,.headerPublic .left-panel{overflow:auto}.adminui-main>.el-container>.el-header .left-panel::-webkit-scrollbar,.headerPublic .left-panel::-webkit-scrollbar{display:none}.adminui-main>.el-container>.el-header .right-panel,.headerPublic .right-panel{display:block;border-top:1px solid var(--el-border-color-light);margin-top:15px}.adminui-main>.el-container>.el-header .right-panel .right-panel-search,.headerPublic .right-panel .right-panel-search{display:block}.adminui-main>.el-container>.el-header .right-panel .right-panel-search>*,.headerPublic .right-panel .right-panel-search>*{width:100%;margin:0;margin-top:15px}.adminui-main>.el-container>:first-child:not(.el-aside):not(.el-header){border:0;margin-top:0}.adminui-main>.el-container>:first-child:not(.el-aside):not(.el-header)+.el-aside{margin-top:0}.adminui-main>.el-container>.el-aside{border-bottom:1px solid var(--el-border-color-light)!important}.adminui-main>.el-container>.el-container{border-bottom:1px solid var(--el-border-color-light)}.adminui-main>.el-container>.el-container,.adminui-main>.el-container>.el-container+.el-aside,.adminui-main>.el-container>.el-main.nopadding{border-top:1px solid var(--el-border-color-light);margin-top:15px}.adminui-main>.el-container>.el-main.nopadding{border-bottom:1px solid var(--el-border-color-light)}.adminui-main>.el-container>.el-main+.el-aside{border-left:0!important;border-top:1px solid var(--el-border-color-light);margin-top:15px}.adminui-main>.el-container>.el-footer{margin-top:15px;border-bottom:1px solid var(--el-border-color-light)}.adminui-main>.el-container>.el-container>.el-header .left-panel{display:block}.adminui-main>.el-container>.el-container>.el-header .right-panel{display:block;margin-top:15px}.sc-page{width:100%;margin:0}.common-main .el-form{width:100%!important}.common-header-logo label,.common-header-title{display:none}}html.dark{color-scheme:dark;--el-color-primary:#409eff;--el-color-primary-light-3:#3375b9;--el-color-primary-light-5:#2a598a;--el-color-primary-light-7:#213d5b;--el-color-primary-light-8:#1d3043;--el-color-primary-light-9:#18222c;--el-color-primary-dark-2:#66b1ff;--el-color-success:#67c23a;--el-color-success-light-3:#4e8e2f;--el-color-success-light-5:#3e6b27;--el-color-success-light-7:#2d481f;--el-color-success-light-8:#25371c;--el-color-success-light-9:#1c2518;--el-color-success-dark-2:#85ce61;--el-color-warning:#e6a23c;--el-color-warning-light-3:#a77730;--el-color-warning-light-5:#7d5b28;--el-color-warning-light-7:#533f20;--el-color-warning-light-8:#3e301c;--el-color-warning-light-9:#292218;--el-color-warning-dark-2:#ebb563;--el-color-danger:#f56c6c;--el-color-danger-light-3:#b25252;--el-color-danger-light-5:#854040;--el-color-danger-light-7:#582e2e;--el-color-danger-light-8:#412626;--el-color-danger-light-9:#2b1d1d;--el-color-danger-dark-2:#f78989;--el-color-error:#f56c6c;--el-color-error-light-3:#b25252;--el-color-error-light-5:#854040;--el-color-error-light-7:#582e2e;--el-color-error-light-8:#412626;--el-color-error-light-9:#2b1d1d;--el-color-error-dark-2:#f78989;--el-color-info:#909399;--el-color-info-light-3:#6b6d71;--el-color-info-light-5:#525457;--el-color-info-light-7:#393a3c;--el-color-info-light-8:#2d2d2f;--el-color-info-light-9:#202121;--el-color-info-dark-2:#a6a9ad;--el-box-shadow:0px 12px 32px 4px rgba(0,0,0,.36),0px 8px 20px rgba(0,0,0,.72);--el-box-shadow-light:0px 0px 12px rgba(0,0,0,.72);--el-box-shadow-lighter:0px 0px 6px rgba(0,0,0,.72);--el-box-shadow-dark:0px 16px 48px 16px rgba(0,0,0,.72),0px 12px 32px #000,0px 8px 16px -8px #000;--el-bg-color-page:#0a0a0a;--el-bg-color:#141414;--el-bg-color-overlay:#1d1e1f;--el-text-color-primary:#e5eaf3;--el-text-color-regular:#cfd3dc;--el-text-color-secondary:#a3a6ad;--el-text-color-placeholder:#8d9095;--el-text-color-disabled:#6c6e72;--el-border-color-darker:#636466;--el-border-color-dark:#58585b;--el-border-color:#4c4d4f;--el-border-color-light:#414243;--el-border-color-lighter:#363637;--el-border-color-extra-light:#2b2b2c;--el-fill-color-darker:#424243;--el-fill-color-dark:#39393a;--el-fill-color:#303030;--el-fill-color-light:#262727;--el-fill-color-lighter:#1d1d1d;--el-fill-color-extra-light:#191919;--el-fill-color-blank:transparent;--el-mask-color:rgba(0,0,0,.8);--el-mask-color-extra-light:rgba(0,0,0,.3)}html.dark .el-button{--el-button-disabled-text-color:hsla(0,0%,100%,.5)}html.dark .el-card{--el-card-bg-color:var(--el-bg-color-overlay)}html.dark .el-empty{--el-empty-fill-color-0:var(--el-color-black);--el-empty-fill-color-1:#4b4b52;--el-empty-fill-color-2:#36383d;--el-empty-fill-color-3:#1e1e20;--el-empty-fill-color-4:#262629;--el-empty-fill-color-5:#202124;--el-empty-fill-color-6:#212224;--el-empty-fill-color-7:#1b1c1f;--el-empty-fill-color-8:#1c1d1f;--el-empty-fill-color-9:#18181a}html.dark{--el-text-color-primary:#d0d0d0;--el-color-primary-dark-2:var(--el-color-primary-light-2)!important;--el-color-primary-light-9:var(--el-color-primary-dark-8)!important;--el-color-primary-light-8:var(--el-color-primary-dark-7)!important;--el-color-primary-light-7:var(--el-color-primary-dark-6)!important;--el-color-primary-light-5:var(--el-color-primary-dark-4)!important;--el-color-primary-light-3:var(--el-color-primary-dark-3)!important}html.dark #app,html.dark .login_bg{background:var(--el-bg-color)}html.dark .adminui-header{background:var(--el-bg-color-overlay);border-bottom:1px solid var(--el-border-color-light);height:59px}html.dark .aminui-side-split{background:var(--el-bg-color)}html.dark .aminui-side-split li{color:var(--el-text-color-primary)}html.dark .aminui-side{background:var(--el-bg-color-overlay)}html.dark .adminui-side-bottom,html.dark .adminui-side-top,html.dark .aminui-side{border-color:var(--el-border-color-light)}html.dark .adminui-side-top h2{color:var(--el-text-color-primary)}html.dark .adminui-tags,html.dark .adminui-topbar{background:var(--el-bg-color-overlay);border-color:var(--el-border-color-light)}html.dark .adminui-main,html.dark .drawerBG{background:var(--el-bg-color)}html.dark .adminui-header-menu .el-menu{--el-menu-bg-color:var(--el-bg-color-overlay)!important;--el-menu-hover-bg-color:#171819!important}html.dark .el-footer,html.dark .el-header,html.dark .el-main.nopadding{background:var(--el-bg-color-overlay);border-color:var(--el-border-color-light)}html.dark .el-main{background:var(--el-bg-color)}html.dark .el-aside{background:var(--el-bg-color-overlay);border-color:var(--el-border-color-light)}html.dark .el-table .el-table__body-wrapper{background:var(--el-bg-color)}html.dark .el-table th.is-sortable:hover{background:#111} \ No newline at end of file diff --git a/payment_headend/css/customAlert.css b/payment_headend/css/customAlert.css new file mode 100644 index 0000000..b267e8d --- /dev/null +++ b/payment_headend/css/customAlert.css @@ -0,0 +1,17 @@ +.custom-alert { + display: none; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: rgba(0, 0, 0, 0.8); + color: white; + padding: 15px 30px; + border-radius: 5px; + font-size: 16px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + z-index: 1000; + opacity: 0; + transition: opacity 0.3s ease-in-out; + text-align: center; +} \ No newline at end of file diff --git a/payment_headend/index.html b/payment_headend/index.html index 8209fb7..36d28b3 100644 --- a/payment_headend/index.html +++ b/payment_headend/index.html @@ -6,8 +6,10 @@ Recharge Page - - + + + +
@@ -115,7 +117,8 @@
- + + @@ -149,6 +152,16 @@ + +