test 10 months ago
parent
commit
39462630e3

+ 10 - 6
build/cool/temp/eps.d.ts

@@ -689,6 +689,10 @@ declare namespace Eps {
 		 * 金额
 		 */
 		amount?: number;
+		/**
+		 * 货币单位
+		 */
+		currency?: string;
 		/**
 		 * 通道手续费
 		 */
@@ -2428,6 +2432,10 @@ declare namespace Eps {
 	}
 
 	interface DjOpen {
+		/**
+		 * 交易订单回调通知
+		 */
+		notifyOrder(data?: any): Promise<any>;
 		/**
 		 * 交易订单回调通知
 		 */
@@ -2456,10 +2464,6 @@ declare namespace Eps {
 		 * kyc topay
 		 */
 		toPay(data?: any): Promise<any>;
-		/**
-		 * 交易订单回调通知
-		 */
-		notifyOrder(data?: any): Promise<any>;
 		/**
 		 * 回调通知
 		 */
@@ -2504,6 +2508,7 @@ declare namespace Eps {
 		 * 权限标识
 		 */
 		permission: {
+			notifyOrder: string;
 			notifyOrder: string;
 			countries: string;
 			advanced: string;
@@ -2511,7 +2516,6 @@ declare namespace Eps {
 			level: string;
 			basic: string;
 			toPay: string;
-			notifyOrder: string;
 			notifyTest: string;
 			order: string;
 			query: string;
@@ -2526,6 +2530,7 @@ declare namespace Eps {
 		 * 权限状态
 		 */
 		_permission: {
+			notifyOrder: boolean;
 			notifyOrder: boolean;
 			countries: boolean;
 			advanced: boolean;
@@ -2533,7 +2538,6 @@ declare namespace Eps {
 			level: boolean;
 			basic: boolean;
 			toPay: boolean;
-			notifyOrder: boolean;
 			notifyTest: boolean;
 			order: boolean;
 			query: boolean;

File diff suppressed because it is too large
+ 0 - 0
build/cool/temp/eps.json


+ 2 - 1
src/modules/base/pages/login/components/captcha.vue

@@ -24,7 +24,8 @@ function refresh() {
 	service.base.open
 		.captcha({
 			height: 40,
-			width: 150
+			width: 150,
+			color: '#000'
 		})
 		.then(({ captchaId, data }) => {
 			if (data.includes(";base64,")) {

+ 204 - 0
src/modules/base/pages/login/index.bat.vue

@@ -0,0 +1,204 @@
+<template>
+	<div class="page-login">
+		<div class="box">
+			<div class="logo">
+				<img src="/logo.png" alt="Logo" />
+				<span>{{ app.info.name }}</span>
+			</div>
+			<p class="desc">I’m the best! I’m the greatest! I’m invincible</p>
+
+			<el-form label-position="top" class="form" :disabled="saving">
+				<el-form-item label="用户名">
+					<input v-model="form.username" placeholder="请输入用户名" maxlength="20" autocomplete="on" />
+				</el-form-item>
+
+				<el-form-item label="密码">
+					<input v-model="form.password" type="password" placeholder="请输入密码" maxlength="20"
+						autocomplete="off" />
+				</el-form-item>
+
+				<el-form-item label="验证码">
+					<div class="row">
+						<input v-model="form.verifyCode" placeholder="图片验证码" maxlength="4" @keyup.enter="toLogin" />
+
+						<captcha :ref="setRefs('captcha')" v-model="form.captchaId" @change="() => {
+							form.verifyCode = '';
+						}
+							" />
+					</div>
+				</el-form-item>
+
+				<div class="op">
+					<el-button round :loading="saving" @click="toLogin">登录</el-button>
+				</div>
+			</el-form>
+		</div>
+	</div>
+</template>
+
+<script lang="ts" name="login" setup>
+import { reactive, ref } from "vue";
+import { ElMessage } from "element-plus";
+import { useCool } from "/@/cool";
+import { useBase } from "/$/base";
+import Captcha from "./components/captcha.vue";
+
+const { refs, setRefs, router, service } = useCool();
+const { user, app } = useBase();
+
+// 状态1
+const saving = ref(false);
+
+// 表单数据
+const form = reactive({
+	username: "",
+	password: "",
+	captchaId: "",
+	verifyCode: ""
+});
+
+// 登录
+async function toLogin() {
+	if (!form.username) {
+		return ElMessage.error("用户名不能为空");
+	}
+
+	if (!form.password) {
+		return ElMessage.error("密码不能为空");
+	}
+
+	if (!form.verifyCode) {
+		return ElMessage.error("图片验证码不能为空");
+	}
+
+	saving.value = true;
+
+	try {
+		// 登录
+		await service.base.open.login(form).then((res) => {
+			user.setToken(res);
+		});
+
+		// token 事件
+		await Promise.all(app.events.hasToken.map((e) => e()));
+
+		// 跳转
+		router.push("/");
+	} catch (err: any) {
+		refs.captcha.refresh();
+		ElMessage.error(err.message);
+	}
+
+	saving.value = false;
+}
+</script>
+
+<style lang="scss" scoped>
+.page-login {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	height: 100%;
+	width: 100%;
+	position: relative;
+	background-color: #2f3447;
+
+	.box {
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+
+		.logo {
+			height: 50px;
+			margin-bottom: 30px;
+			display: flex;
+			align-items: center;
+			color: #fff;
+
+			img {
+				height: 50px;
+			}
+
+			span {
+				font-size: 38px;
+				margin-left: 10px;
+				letter-spacing: 5px;
+				font-weight: bold;
+			}
+		}
+
+		.desc {
+			color: #eee;
+			font-size: 14px;
+			letter-spacing: 1px;
+			margin-bottom: 50px;
+		}
+
+		.el-form {
+			width: 300px;
+
+			:deep(.el-form-item) {
+				margin-bottom: 20px;
+
+				.el-form-item__label {
+					color: #ccc;
+				}
+			}
+
+			input {
+				background-color: transparent;
+				color: #fff;
+				border: 0;
+				height: 40px;
+				width: calc(100% - 4px);
+				margin: 0 2px;
+				padding: 0 2px;
+				box-sizing: border-box;
+				-webkit-text-fill-color: #fff;
+				font-size: 15px;
+				border-bottom: 1px solid rgba(255, 255, 255, 0.5);
+				border-radius: 0;
+
+				&:-webkit-autofill {
+					box-shadow: 0 0 0px 1000px transparent inset !important;
+					transition: background-color 50000s ease-in-out 0s;
+				}
+
+				&::-webkit-input-placeholder {
+					font-size: 12px;
+				}
+
+				&:focus {
+					border-color: #fff;
+				}
+			}
+
+			.row {
+				display: flex;
+				align-items: center;
+				width: 100%;
+				position: relative;
+
+				.captcha {
+					position: absolute;
+					right: 0;
+					bottom: 1px;
+				}
+			}
+		}
+
+		.op {
+			display: flex;
+			justify-content: center;
+			margin-top: 50px;
+
+			:deep(.el-button) {
+				height: 40px;
+				width: 140px;
+				font-size: 15px;
+			}
+		}
+	}
+}
+</style>

File diff suppressed because it is too large
+ 1057 - 35
src/modules/base/pages/login/index.vue


+ 23 - 1
src/modules/dj/views/channel.vue

@@ -16,7 +16,13 @@
 
 		<cl-row>
 			<!-- 数据表格 -->
-			<cl-table ref="Table" :contextMenu="[]" />
+			<cl-table ref="Table" :contextMenu="[]">
+				<template #column-balance="{ scope }">
+					<el-link type="primary" @click="getBalanceByCode(scope.row)">{{
+						scope.row.balance || '查询'
+					}}</el-link>
+				</template>
+			</cl-table>
 		</cl-row>
 
 		<cl-row>
@@ -50,6 +56,7 @@
 <script lang="ts" name="dj-channel" setup>
 import { useCrud, useTable, useUpsert, useForm } from "@cool-vue/crud";
 import { useCool } from "/@/cool";
+import { ElMessage } from "element-plus";
 
 const { service } = useCool();
 
@@ -131,6 +138,10 @@ const Table = useTable({
 				return "[" + +row.min + "," + +row.max + "]";
 			}
 		},
+		{
+			prop: "balance",
+			label: "通道余额",
+		},
 		{ prop: "status", label: "状态", component: { name: "cl-switch" } },
 		{ prop: "remark", label: "备注", showOverflowTooltip: true },
 		// { prop: "createTime", label: "创建时间", sortable: "desc", width: 160 },
@@ -147,4 +158,15 @@ const Crud = useCrud(
 		app.refresh();
 	}
 );
+
+const getBalanceByCode = async (row: any) => {
+	try {
+		const data = await service.dj.channel.queryChannelBalance({ code: row.code })
+		if (data) {
+			row.balance = data.balance;
+		}
+	} catch (e: any) {
+		ElMessage.error(e.message);
+	}
+}
 </script>

+ 1 - 0
src/modules/dj/views/order.vue

@@ -285,6 +285,7 @@ const Table = useTable({
 				return (+row.amount).toFixed(2);
 			}
 		},
+		{ prop: "currency", label: "货币单位" },
 		{
 			prop: "charge",
 			label: "手续费",

+ 7 - 3
src/modules/dj/views/test.vue

@@ -25,6 +25,9 @@
         <el-form-item label="金额(amount)" required>
           <el-input-number :min="1" :max="99999" :precision="2" v-model="form.amount" />
         </el-form-item>
+        <el-form-item label="货币单位(currency)" required>
+          <el-input v-model="form.currency" />
+        </el-form-item>
         <el-form-item label="支付类型(payType)" required>
           <el-input v-model="form.payType" />
         </el-form-item>
@@ -84,12 +87,13 @@ const key = ref("7bde11c1e5be0fca046f099c4264076e");
 const defaultForm = {
   mchId: "test",
   outOrderNo: "",
-  notifyUrl: "http://205.234.252.199/api/admin/dj/open/Alipay/notifyTest",
+  notifyUrl: "http://205.234.252.199/api/admin/dj/open/notifyTest",
   returnUrl: "https://www.baidu.com",
-  amount: 1,
+  amount: 100,
   payType: "SunCard",
   userIp: "127.0.0.1",
-  userId: "test"
+  userId: "test",
+  currency: 'USD'
 };
 const form = ref({
   ...defaultForm

File diff suppressed because it is too large
+ 0 - 0
stats.html


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