diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 5e67c27..040ebaf 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -9,7 +9,9 @@
"Bash(pnpm lint:*)",
"Bash(pnpm prettier:fix)",
"Bash(pnpm eslint:*)",
- "Bash(mkdir:*)"
+ "Bash(mkdir:*)",
+ "Bash(pnpm build)",
+ "Bash(pnpm eslint:fix)"
],
"deny": [],
"ask": []
diff --git a/src/api/generated/docs/KamiApiCamelOilV1AccountHistoryItem.md b/src/api/generated/docs/KamiApiCamelOilV1AccountHistoryItem.md
index 76651bc..76d2292 100644
--- a/src/api/generated/docs/KamiApiCamelOilV1AccountHistoryItem.md
+++ b/src/api/generated/docs/KamiApiCamelOilV1AccountHistoryItem.md
@@ -4,7 +4,6 @@
| Name | Type | Description | Notes |
| ---------------- | ---------- | ------------ | --------------------------------- |
-| **historyUuid** | **string** | 历史记录UUID | [optional] [default to undefined] |
| **accountId** | **number** | 账号ID | [optional] [default to undefined] |
| **changeType** | **string** | 变更类型 | [optional] [default to undefined] |
| **changeText** | **string** | 变更类型文本 | [optional] [default to undefined] |
@@ -20,7 +19,6 @@
import { KamiApiCamelOilV1AccountHistoryItem } from './api';
const instance: KamiApiCamelOilV1AccountHistoryItem = {
- historyUuid,
accountId,
changeType,
changeText,
diff --git a/src/api/generated/docs/KamiApiCamelOilV1CreateTokenReq.md b/src/api/generated/docs/KamiApiCamelOilV1CreateTokenReq.md
index f7d4543..6bad826 100644
--- a/src/api/generated/docs/KamiApiCamelOilV1CreateTokenReq.md
+++ b/src/api/generated/docs/KamiApiCamelOilV1CreateTokenReq.md
@@ -2,11 +2,12 @@
## Properties
-| Name | Type | Description | Notes |
-| -------------- | ---------- | ----------- | --------------------------------- |
-| **tokenName** | **string** | Token名称 | [default to undefined] |
-| **tokenValue** | **string** | Token值 | [default to undefined] |
-| **remark** | **string** | 备注 | [optional] [default to undefined] |
+| Name | Type | Description | Notes |
+| -------------- | ---------- | ------------ | --------------------------------- |
+| **tokenName** | **string** | Token名称 | [default to undefined] |
+| **tokenValue** | **string** | Token值 | [default to undefined] |
+| **phone** | **string** | 绑定的手机号 | [optional] [default to undefined] |
+| **remark** | **string** | 备注 | [optional] [default to undefined] |
## Example
@@ -16,6 +17,7 @@ import { KamiApiCamelOilV1CreateTokenReq } from './api';
const instance: KamiApiCamelOilV1CreateTokenReq = {
tokenName,
tokenValue,
+ phone,
remark
};
```
diff --git a/src/api/generated/docs/KamiApiCamelOilV1OrderHistoryItem.md b/src/api/generated/docs/KamiApiCamelOilV1OrderHistoryItem.md
index 3c07194..209da7a 100644
--- a/src/api/generated/docs/KamiApiCamelOilV1OrderHistoryItem.md
+++ b/src/api/generated/docs/KamiApiCamelOilV1OrderHistoryItem.md
@@ -4,7 +4,6 @@
| Name | Type | Description | Notes |
| --------------- | ---------- | ------------ | --------------------------------- |
-| **historyUuid** | **string** | 历史记录UUID | [optional] [default to undefined] |
| **orderNo** | **string** | 订单号 | [optional] [default to undefined] |
| **changeType** | **string** | 变更类型 | [optional] [default to undefined] |
| **changeText** | **string** | 变更类型文本 | [optional] [default to undefined] |
@@ -20,7 +19,6 @@
import { KamiApiCamelOilV1OrderHistoryItem } from './api';
const instance: KamiApiCamelOilV1OrderHistoryItem = {
- historyUuid,
orderNo,
changeType,
changeText,
diff --git a/src/api/generated/docs/KamiApiCamelOilV1TokenInfo.md b/src/api/generated/docs/KamiApiCamelOilV1TokenInfo.md
index 0fa124e..4eff154 100644
--- a/src/api/generated/docs/KamiApiCamelOilV1TokenInfo.md
+++ b/src/api/generated/docs/KamiApiCamelOilV1TokenInfo.md
@@ -7,6 +7,7 @@
| **id** | **number** | Token ID | [optional] [default to undefined] |
| **tokenName** | **string** | Token名称 | [optional] [default to undefined] |
| **tokenValue** | **string** | Token值 | [optional] [default to undefined] |
+| **phone** | **string** | 绑定的手机号 | [optional] [default to undefined] |
| **status** | **number** | 状态 | [optional] [default to undefined] |
| **bindCount** | **number** | 已绑定卡密数量 | [optional] [default to undefined] |
| **totalBindAmount** | **object** | | [optional] [default to undefined] |
@@ -25,6 +26,7 @@ const instance: KamiApiCamelOilV1TokenInfo = {
id,
tokenName,
tokenValue,
+ phone,
status,
bindCount,
totalBindAmount,
diff --git a/src/api/generated/models/kami-api-camel-oil-v1-account-history-item.ts b/src/api/generated/models/kami-api-camel-oil-v1-account-history-item.ts
index 7b1d4a2..aafc1ac 100644
--- a/src/api/generated/models/kami-api-camel-oil-v1-account-history-item.ts
+++ b/src/api/generated/models/kami-api-camel-oil-v1-account-history-item.ts
@@ -13,10 +13,6 @@
*/
export interface KamiApiCamelOilV1AccountHistoryItem {
- /**
- * 历史记录UUID
- */
- historyUuid?: string;
/**
* 账号ID
*/
diff --git a/src/api/generated/models/kami-api-camel-oil-v1-create-token-req.ts b/src/api/generated/models/kami-api-camel-oil-v1-create-token-req.ts
index 57208ad..9260db0 100644
--- a/src/api/generated/models/kami-api-camel-oil-v1-create-token-req.ts
+++ b/src/api/generated/models/kami-api-camel-oil-v1-create-token-req.ts
@@ -21,6 +21,10 @@ export interface KamiApiCamelOilV1CreateTokenReq {
* Token值
*/
tokenValue: string;
+ /**
+ * 绑定的手机号
+ */
+ phone?: string;
/**
* 备注
*/
diff --git a/src/api/generated/models/kami-api-camel-oil-v1-order-history-item.ts b/src/api/generated/models/kami-api-camel-oil-v1-order-history-item.ts
index 8df020c..594988b 100644
--- a/src/api/generated/models/kami-api-camel-oil-v1-order-history-item.ts
+++ b/src/api/generated/models/kami-api-camel-oil-v1-order-history-item.ts
@@ -13,10 +13,6 @@
*/
export interface KamiApiCamelOilV1OrderHistoryItem {
- /**
- * 历史记录UUID
- */
- historyUuid?: string;
/**
* 订单号
*/
@@ -57,6 +53,7 @@ export enum KamiApiCamelOilV1OrderHistoryItemChangeTypeEnum {
CheckPay = 'check_pay',
Create = 'create',
Fail = 'fail',
+ FillCard = 'fill_card',
GetPayUrl = 'get_pay_url',
Paid = 'paid',
Submit = 'submit',
diff --git a/src/api/generated/models/kami-api-camel-oil-v1-token-info.ts b/src/api/generated/models/kami-api-camel-oil-v1-token-info.ts
index 0e29138..4fb2aad 100644
--- a/src/api/generated/models/kami-api-camel-oil-v1-token-info.ts
+++ b/src/api/generated/models/kami-api-camel-oil-v1-token-info.ts
@@ -25,6 +25,10 @@ export interface KamiApiCamelOilV1TokenInfo {
* Token值
*/
tokenValue?: string;
+ /**
+ * 绑定的手机号
+ */
+ phone?: string;
/**
* 状态
*/
diff --git a/src/views/camel-oil-info/account/components/account-orders.vue b/src/views/camel-oil-info/account/components/account-orders.vue
deleted file mode 100644
index 1368990..0000000
--- a/src/views/camel-oil-info/account/components/account-orders.vue
+++ /dev/null
@@ -1,257 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ statistics.totalOrders }} 单
-
-
- {{ statistics.paidOrders }} 单
-
-
- {{ statistics.pendingOrders }} 单
-
-
- {{ statistics.timeoutOrders }} 单
-
-
- {{ paymentRate }}%
-
-
- {{ pendingRate }}%
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/camel-oil-info/account/components/detail.vue b/src/views/camel-oil-info/account/components/detail.vue
index 6ac9ec3..f2ff42b 100644
--- a/src/views/camel-oil-info/account/components/detail.vue
+++ b/src/views/camel-oil-info/account/components/detail.vue
@@ -10,9 +10,6 @@
-
- {{ accountDetail.accountId }}
-
{{ accountDetail.accountName }}
@@ -35,33 +32,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -98,13 +68,6 @@ const loading = ref(false);
const accountDetail =
ref(null);
-// 统计数据
-const statistics = ref({
- todayAmount: '0',
- todayCount: '0',
- monthAmount: '0'
-});
-
// 计算属性
const modalVisible = computed({
get: () => props.visible,
@@ -112,26 +75,19 @@ const modalVisible = computed({
});
/**
- * 获取账号详情和统计信息
+ * 获取账号详情
*/
const fetchAccountDetail = async () => {
if (!props.accountId) return;
loading.value = true;
try {
- // 获取账号统计信息
+ // 获取账号详情信息
const { data } = await jdV2AccountClient.apiJdV2AccountStatisticsGet({
accountId: parseInt(props.accountId)
});
accountDetail.value = data.accountInfo;
-
- // 暂时使用默认统计信息,等待API完善
- statistics.value = {
- todayAmount: '0',
- todayCount: '0',
- monthAmount: '0'
- };
} catch (error) {
console.error('获取账号详情失败:', error);
accountDetail.value = null;
@@ -148,20 +104,20 @@ const fetchAccountDetail = async () => {
const statusMapper = (
status: number | undefined
): { text: string; color: string } => {
- if (!status) return { text: '未知', color: 'gray' };
+ if (!status) return { text: '未知状态', color: 'gray' };
switch (status) {
case 0:
- return { text: '失效', color: 'red' };
+ return { text: '待登录', color: 'orange' }; // 需要登录验证
case 1:
- return { text: '正常', color: 'green' };
+ return { text: '发送验证码', color: 'blue' }; // 正在发送验证码
case 2:
- return { text: '充值过快', color: 'orange' };
+ return { text: '在线', color: 'green' }; // 账户在线,可用
case 3:
- return { text: '账号受限', color: 'red' };
+ return { text: '已暂停', color: 'orange' }; // 账户被暂停使用
case 4:
- return { text: '异常', color: 'gray' };
+ return { text: '已失效', color: 'red' }; // 账户已失效
default:
- return { text: '未知', color: 'gray' };
+ return { text: '未知状态', color: 'gray' };
}
};
@@ -200,39 +156,8 @@ watch(
margin-bottom: 0;
}
-.balance-text {
- color: #00b42a;
- font-weight: 600;
- font-size: 16px;
-}
-
-.recharge-text {
- color: #165dff;
- font-weight: 600;
- font-size: 16px;
-}
-
:deep(.arco-descriptions-item-label) {
font-weight: 600;
- background-color: #f7f8fa;
-}
-
-:deep(.arco-statistic) {
- text-align: center;
- padding: 16px;
- border-radius: 6px;
- background-color: #f7f8fa;
-}
-
-:deep(.arco-statistic-title) {
- color: #86909c;
- font-size: 14px;
- margin-bottom: 8px;
-}
-
-:deep(.arco-statistic-value) {
- color: #1d2129;
- font-size: 24px;
- font-weight: 600;
+ background-color: var(--color-fill-2);
}
diff --git a/src/views/camel-oil-info/account/components/history.vue b/src/views/camel-oil-info/account/components/history.vue
index 31f4b9f..e53d5ee 100644
--- a/src/views/camel-oil-info/account/components/history.vue
+++ b/src/views/camel-oil-info/account/components/history.vue
@@ -27,18 +27,26 @@
-
+
- 创建
- 更新
- 删除
- 充值
- 消费
+ 创建账号
+ 登录成功
+ 检测到掉线
+ 登录失败
+ 订单数达到10,暂停使用
+ 次日重置,恢复使用
+
+ 单日下单不足10个,账号失效
+
+ 绑定订单
+ 订单完成
+ 更新账号信息
+ 删除账号
@@ -79,31 +87,39 @@
@page-change="onPageChange"
@page-size-change="onPageSizeChange"
>
-
-
- {{ actionMapper(record.action).text }}
+
+
+ {{ changeTypeMapper(record.changeType).text }}
-
-
+
- {{ record.amount > 0 ? '+' : '' }}¥{{ record.amount }}
-
+ {{ statusMapper(record.statusBefore).text }}
+
-
-
- ¥{{ record.balance || 0 }}
+
+
+ {{ statusMapper(record.statusAfter).text }}
+
+ -
-
-
+
+
@@ -120,10 +136,9 @@
-
-
diff --git a/src/views/camel-oil-info/account/index.vue b/src/views/camel-oil-info/account/index.vue
index d905d78..b3c4a29 100644
--- a/src/views/camel-oil-info/account/index.vue
+++ b/src/views/camel-oil-info/account/index.vue
@@ -27,11 +27,11 @@
placeholder="请选择状态"
allow-clear
>
- 失效
- 正常
- 充值过快
- 账号受限
- 异常
+ 待登录
+ 发送验证码
+ 在线
+ 已暂停
+ 已失效
@@ -88,8 +88,8 @@
>
-
- {{ statusMapper(record.status).text }}
+
+ {{ record.statusText || statusMapper(record.status).text }}
@@ -110,13 +110,6 @@
-
-
-
-
-
-
-
@@ -133,33 +126,22 @@
v-model:visible="state.historyModalVisible"
:account-id="state.accountId"
/>
-
-
-
@@ -205,48 +156,41 @@ const formatJson = (json: any): string => {
}
.amount-text {
- color: #165dff;
+ color: rgb(var(--primary-6));
font-weight: 600;
font-size: 16px;
}
.actual-amount-text {
- color: #00b42a;
+ color: rgb(var(--success-6));
font-weight: 600;
font-size: 16px;
}
-.callback-url {
- background-color: #f7f8fa;
- padding: 4px 8px;
- border-radius: 4px;
- font-family: Monaco, Menlo, 'Ubuntu Mono', monospace;
- font-size: 12px;
- word-break: break-all;
-}
-
-.request-params,
-.response-params {
- background-color: #f7f8fa;
- padding: 12px;
- border-radius: 6px;
- font-family: Monaco, Menlo, 'Ubuntu Mono', monospace;
- font-size: 12px;
- line-height: 1.4;
- white-space: pre-wrap;
- word-break: break-all;
- max-height: 200px;
- overflow-y: auto;
- margin: 0;
-}
-
:deep(.arco-descriptions-item-label) {
font-weight: 600;
- background-color: #f7f8fa;
+ background-color: var(--color-fill-2);
}
:deep(.arco-modal-body) {
max-height: 80vh;
overflow-y: auto;
+
+ /* 确保滚动条样式跟随主题 */
+ scrollbar-width: thin;
+ scrollbar-color: var(--color-border-3) transparent;
+}
+
+:deep(.arco-modal-body::-webkit-scrollbar) {
+ width: 6px;
+}
+
+:deep(.arco-modal-body::-webkit-scrollbar-thumb) {
+ background-color: var(--color-border-3);
+ border-radius: 3px;
+}
+
+:deep(.arco-modal-body::-webkit-scrollbar-track) {
+ background-color: transparent;
}
diff --git a/src/views/camel-oil-info/order/index.vue b/src/views/camel-oil-info/order/index.vue
index e6e30e1..7de2ed4 100644
--- a/src/views/camel-oil-info/order/index.vue
+++ b/src/views/camel-oil-info/order/index.vue
@@ -21,21 +21,13 @@
-
+
-
-
-
-
-
待处理
- 成功
- 失败
- 已取消
+ 处理中
+ 已完成
+ 已失败
@@ -140,8 +132,8 @@
-
- {{ record.callbackStatus === 1 ? '成功' : '失败' }}
+
+ {{ callbackStatusMapper(record.notifyStatus).text }}
@@ -198,6 +190,11 @@ import type {
ApiJdV2OrderListGetStatusEnum,
ApiJdV2OrderListGetPayStatusEnum
} from '@/api/generated/apis/jdv2-order-api';
+import type {
+ KamiApiCamelOilV1OrderListItemStatusEnum,
+ KamiApiCamelOilV1OrderListItemPayStatusEnum,
+ KamiApiCamelOilV1OrderListItemNotifyStatusEnum
+} from '@/api/generated/models/index.ts';
import OrderDetailModal from './components/order-detail-modal.vue';
import OrderHistoryModal from './components/order-history-modal.vue';
@@ -280,14 +277,9 @@ const columns: TableColumnData[] = [
tooltip: true
},
{
- title: '账号ID',
- dataIndex: 'accountId',
- width: 120
- },
- {
- title: '充值手机',
- dataIndex: 'accountPhone',
- width: 130
+ title: '账号名称',
+ dataIndex: 'accountName',
+ width: 150
},
{
title: '订单金额',
@@ -309,18 +301,27 @@ const columns: TableColumnData[] = [
},
{
title: '回调状态',
- dataIndex: 'callbackStatus',
+ dataIndex: 'notifyStatus',
slotName: 'callbackStatus',
width: 100
},
{
- title: '创建时间',
- dataIndex: 'createdAt',
- width: 180
+ title: '支付完成时间',
+ dataIndex: 'paidAt',
+ width: 180,
+ ellipsis: true,
+ tooltip: true
},
{
- title: '更新时间',
- dataIndex: 'updatedAt',
+ title: '失败原因',
+ dataIndex: 'failureReason',
+ width: 150,
+ ellipsis: true,
+ tooltip: true
+ },
+ {
+ title: '创建时间',
+ dataIndex: 'createdAt',
width: 180
},
{
@@ -335,8 +336,7 @@ const columns: TableColumnData[] = [
// 表单模型
const generateFormModel = () => ({
orderNo: '',
- merchantOrderNo: '',
- accountPhone: '',
+ merchantOrderId: '',
status: undefined as ApiJdV2OrderListGetStatusEnum | undefined,
payStatus: undefined as ApiJdV2OrderListGetPayStatusEnum | undefined,
dateRange: [] as Date[]
@@ -456,39 +456,64 @@ const showOrderHistory = (record: KamiApiCamelOilV1OrderListItem) => {
/**
* 订单状态映射器
+ * 基于后端Go定义的CamelOilOrderStatus
* @param status 状态值
* @returns 状态文本和颜色
*/
const statusMapper = (status: number): { text: string; color: string } => {
switch (status) {
case 0:
- return { text: '待处理', color: 'orange' };
+ return { text: '待处理', color: 'orange' }; // CamelOilOrderStatusPending
case 1:
- return { text: '成功', color: 'green' };
+ return { text: '处理中', color: 'blue' }; // CamelOilOrderStatusProcessing
case 2:
- return { text: '失败', color: 'red' };
+ return { text: '已完成', color: 'green' }; // CamelOilOrderStatusCompleted
case 3:
- return { text: '已取消', color: 'gray' };
+ return { text: '已失败', color: 'red' }; // CamelOilOrderStatusFailed
default:
- return { text: '未知', color: 'gray' };
+ return { text: '未知状态', color: 'gray' };
}
};
/**
* 支付状态映射器
+ * 基于后端Go定义的CamelOilPayStatus
* @param status 支付状态
* @returns 支付状态文本和颜色
*/
const payStatusMapper = (status: number): { text: string; color: string } => {
switch (status) {
case 0:
- return { text: '未支付', color: 'orange' };
+ return { text: '未支付', color: 'orange' }; // CamelOilPaymentStatusUnpaid
case 1:
- return { text: '已支付', color: 'green' };
+ return { text: '已支付', color: 'green' }; // CamelOilPaymentStatusPaid
case 2:
- return { text: '支付失败', color: 'red' };
+ return { text: '已退款', color: 'blue' }; // CamelOilPaymentStatusRefunded
+ case 3:
+ return { text: '已超时', color: 'red' }; // CamelOilPaymentStatusTimeout
default:
- return { text: '未知', color: 'gray' };
+ return { text: '未知状态', color: 'gray' };
+ }
+};
+
+/**
+ * 回调状态映射器
+ * 基于后端Go定义的CamelOilNotifyStatus
+ * @param status 回调状态
+ * @returns 回调状态文本和颜色
+ */
+const callbackStatusMapper = (
+ status: number
+): { text: string; color: string } => {
+ switch (status) {
+ case 0:
+ return { text: '未回调', color: 'orange' }; // CamelOilCallbackStatusPending
+ case 1:
+ return { text: '回调成功', color: 'green' }; // CamelOilCallbackStatusSuccess
+ case 2:
+ return { text: '回调失败', color: 'red' }; // CamelOilCallbackStatusFailed
+ default:
+ return { text: '未知状态', color: 'gray' };
}
};
@@ -516,7 +541,7 @@ onMounted(() => {
}
.amount-text {
- color: #165dff;
+ color: rgb(var(--primary-6));
font-weight: 600;
}
diff --git a/src/views/camel-oil-info/token/components/add-edit-modal.vue b/src/views/camel-oil-info/token/components/add-edit-modal.vue
index 8720c2f..9868e8e 100644
--- a/src/views/camel-oil-info/token/components/add-edit-modal.vue
+++ b/src/views/camel-oil-info/token/components/add-edit-modal.vue
@@ -31,6 +31,13 @@
show-word-limit
/>
+
+
+
{
return {
tokenName: '',
tokenValue: '',
+ phone: '',
remark: ''
};
};
@@ -89,6 +97,10 @@ const rules = {
{ required: true, message: '请输入Token值' },
{ min: 1, max: 1000, message: 'Token值长度为1-1000个字符' }
],
+ phone: [
+ { required: true, message: '请输入绑定手机号' },
+ { match: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码' }
+ ],
remark: [{ max: 500, message: '备注长度不能超过500个字符' }]
};
@@ -144,8 +156,26 @@ const handleBeforeOk = async () => {
diff --git a/src/views/camel-oil-info/token/components/binding-records-modal.vue b/src/views/camel-oil-info/token/components/binding-records-modal.vue
index 8c521aa..d593160 100644
--- a/src/views/camel-oil-info/token/components/binding-records-modal.vue
+++ b/src/views/camel-oil-info/token/components/binding-records-modal.vue
@@ -211,8 +211,26 @@ watch(
diff --git a/src/views/camel-oil-info/token/index.vue b/src/views/camel-oil-info/token/index.vue
index 014c5a4..2c10e76 100644
--- a/src/views/camel-oil-info/token/index.vue
+++ b/src/views/camel-oil-info/token/index.vue
@@ -178,12 +178,31 @@ const columns: TableColumnData[] = [
width: 150
},
{
- title: 'Token',
- dataIndex: 'token',
+ title: 'Token值',
+ dataIndex: 'tokenValue',
width: 300,
ellipsis: true,
tooltip: true
},
+ {
+ title: '绑定手机号',
+ dataIndex: 'phone',
+ width: 130,
+ ellipsis: true,
+ tooltip: true
+ },
+ {
+ title: '绑定数量',
+ dataIndex: 'bindCount',
+ width: 100
+ },
+ {
+ title: '最后使用时间',
+ dataIndex: 'lastUsedAt',
+ width: 180,
+ ellipsis: true,
+ tooltip: true
+ },
{
title: '状态',
dataIndex: 'status',
@@ -191,20 +210,17 @@ const columns: TableColumnData[] = [
width: 100
},
{
- title: '创建人',
- dataIndex: 'createdBy',
- width: 120
+ title: '备注',
+ dataIndex: 'remark',
+ width: 150,
+ ellipsis: true,
+ tooltip: true
},
{
title: '创建时间',
dataIndex: 'createdAt',
width: 180
},
- {
- title: '更新时间',
- dataIndex: 'updatedAt',
- width: 180
- },
{
title: '操作',
dataIndex: 'operations',
@@ -342,4 +358,8 @@ onMounted(() => {
.container {
padding: 0 20px 20px;
}
+
+.general-card {
+ min-height: calc(100vh - 170px);
+}