minitest2.0 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +8 -0
- package/.env.development +3 -0
- package/.env.production +3 -0
- package/.env.test +3 -0
- package/.gitattributes +1 -0
- package/.oxlintrc.json +10 -0
- package/.prettierrc.json +6 -0
- package/.vscode/extensions.json +9 -0
- package/.vscode/settings.json +13 -0
- package/README.md +179 -0
- package/auto-imports.d.ts +629 -0
- package/components.d.ts +21 -0
- package/design-qa.md +36 -0
- package/docs/MX_API.md +244 -0
- package/docs/REQUEST.md +217 -0
- package/docs/jsapi.js +515 -0
- package/docs/package-json-guide.md +132 -0
- package/env.d.ts +15 -0
- package/eslint.config.ts +26 -0
- package/index.html +16 -0
- package/package.json +83 -0
- package/plugins/bump-version.ts +61 -0
- package/postcss.config.ts +15 -0
- package/public/favicon.ico +0 -0
- package/public/images/12a73787-86a9-4891-a65f-66104746f6a8.png +0 -0
- package/public/images/5798d7aa-ba8b-4605-8079-58b35495ac55.png +0 -0
- package/public/images/73fef1e4-0fd0-4a1a-9b8b-a70a5b6acbbc.png +0 -0
- package/public/images/bc685b4c-0cca-4a79-924c-a8ee10e6f8eb.png +0 -0
- package/public/images/c3dbbd9d-be56-490e-b9f4-6ee17ebefffc.png +0 -0
- package/public/images/ea745a10-42aa-4f44-8d7f-3ab02cc0adcd.png +0 -0
- package/public/images/f5876785-b927-4347-ba19-999114240649.png +0 -0
- package/public/images/img.png +0 -0
- package/public/images/opening-reserve-estimate.png +0 -0
- package/public/images/position-estimate-report.png +0 -0
- package/src/App.vue +131 -0
- package/src/api/announcement.ts +405 -0
- package/src/api/health.ts +13 -0
- package/src/api/pbc-position.ts +178 -0
- package/src/api/rmb-position.ts +233 -0
- package/src/api/tam.ts +173 -0
- package/src/api/user.ts +92 -0
- package/src/auto-imports.d.ts +633 -0
- package/src/components/AppTitleBar.vue +376 -0
- package/src/components.d.ts +33 -0
- package/src/config/config.properties +3 -0
- package/src/config/env.ts +6 -0
- package/src/config/plugin.properties.pro +6 -0
- package/src/config/plugin.properties.test +6 -0
- package/src/core/mxApi/index.ts +451 -0
- package/src/core/request/index.ts +135 -0
- package/src/main.ts +40 -0
- package/src/router/index.ts +144 -0
- package/src/stores/app.ts +103 -0
- package/src/stores/counter.ts +12 -0
- package/src/stores/user.ts +137 -0
- package/src/styles/nprogress.css +22 -0
- package/src/styles/vant-overrides.css +42 -0
- package/src/types/api.d.ts +14 -0
- package/src/types/nprogress.d.ts +8 -0
- package/src/utils/auth-token.ts +241 -0
- package/src/utils/code-highlight.ts +165 -0
- package/src/utils/copy.ts +36 -0
- package/src/utils/query.ts +27 -0
- package/src/utils/request.ts +238 -0
- package/src/utils/rmb-forecast.ts +84 -0
- package/src/utils/toast.ts +61 -0
- package/src/views/article-detail/index.vue +289 -0
- package/src/views/article-edit/index.vue +600 -0
- package/src/views/articles/index.vue +293 -0
- package/src/views/clearing-detail/index.vue +26 -0
- package/src/views/dashboard/index.vue +18 -0
- package/src/views/foreign-position/index.vue +26 -0
- package/src/views/home/index.vue +213 -0
- package/src/views/login/index.vue +275 -0
- package/src/views/mine/index.vue +147 -0
- package/src/views/net-debit/index.vue +26 -0
- package/src/views/opening-reserve-estimate/index.vue +28 -0
- package/src/views/pbc-position/index.vue +357 -0
- package/src/views/position-estimate/index.vue +67 -0
- package/src/views/position-estimate-report/index.vue +28 -0
- package/src/views/rmb-position/index.vue +1013 -0
- package/src/views/rmb-position-create/index.vue +221 -0
- package/src/views/rmb-position-detail/index.vue +355 -0
- package/src/views/settings/index.vue +67 -0
- package/src/views/warning/index.vue +26 -0
- package/tsconfig.app.json +18 -0
- package/tsconfig.json +11 -0
- package/tsconfig.node.json +28 -0
- package/vite.config.ts +100 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useRouter } from 'vue-router'
|
|
3
|
+
import { getLastLoginTimeApi, getOrgByUserNameApi, loginApi, loginByAppTokenApi } from '@/api/user'
|
|
4
|
+
import { useAppStore } from '@/stores/app'
|
|
5
|
+
import { useUserStore } from '@/stores/user'
|
|
6
|
+
import { getAppToken } from '@/core/mxApi'
|
|
7
|
+
import { appEnv } from '@/config/env'
|
|
8
|
+
import { saveAuthTokens, type AuthTokenResponse } from '@/utils/auth-token'
|
|
9
|
+
import { showAppToast } from '@/utils/toast'
|
|
10
|
+
|
|
11
|
+
const router = useRouter()
|
|
12
|
+
const appStore = useAppStore()
|
|
13
|
+
const userStore = useUserStore()
|
|
14
|
+
|
|
15
|
+
const form = ref({
|
|
16
|
+
username: '',
|
|
17
|
+
password: '',
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
const loading = ref(false)
|
|
21
|
+
const appVersion = __APP_VERSION__
|
|
22
|
+
const APP_TOKEN_TIMEOUT = 30000
|
|
23
|
+
const LOGIN_UNAVAILABLE_MESSAGE = '抱歉暂时无法登录'
|
|
24
|
+
const MOCK_APP_TOKEN = 'mock_token'
|
|
25
|
+
const isDevelopment = appEnv === 'development'
|
|
26
|
+
|
|
27
|
+
onMounted(() => {
|
|
28
|
+
if (!appStore.isNative) return
|
|
29
|
+
|
|
30
|
+
loginWithAppToken()
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
async function loginWithAppToken() {
|
|
34
|
+
loading.value = true
|
|
35
|
+
try {
|
|
36
|
+
await loginByAppToken(await getLoginAppToken())
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error('[登录页] APP token 自动登录失败', error)
|
|
39
|
+
if (!isLoginUnavailableError(error)) {
|
|
40
|
+
showAppToast({ message: 'APP 自动登录失败,请手动登录', duration: 3000 })
|
|
41
|
+
}
|
|
42
|
+
appStore.isNative = false
|
|
43
|
+
} finally {
|
|
44
|
+
loading.value = false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function getLoginAppToken() {
|
|
49
|
+
return isDevelopment ? Promise.resolve(MOCK_APP_TOKEN) : getAppTokenWithTimeout()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function getAppTokenWithTimeout() {
|
|
53
|
+
return Promise.race([
|
|
54
|
+
getAppToken(),
|
|
55
|
+
new Promise<string>((_, reject) => {
|
|
56
|
+
window.setTimeout(() => {
|
|
57
|
+
reject(new Error('30 秒内未获取到敏行 token'))
|
|
58
|
+
}, APP_TOKEN_TIMEOUT)
|
|
59
|
+
}),
|
|
60
|
+
])
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function onSubmit() {
|
|
64
|
+
loading.value = true
|
|
65
|
+
try {
|
|
66
|
+
if (isDevelopment) {
|
|
67
|
+
await loginByAppToken(MOCK_APP_TOKEN)
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
await loginByPassword()
|
|
72
|
+
} catch (error) {
|
|
73
|
+
if (!isLoginUnavailableError(error)) {
|
|
74
|
+
console.error('[登录页] 账号密码登录失败', error)
|
|
75
|
+
}
|
|
76
|
+
// 错误已由 request.ts 拦截器统一处理
|
|
77
|
+
} finally {
|
|
78
|
+
loading.value = false
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function loginByAppToken(appToken: string) {
|
|
83
|
+
const res = await loginByAppTokenApi(appToken)
|
|
84
|
+
await saveBusinessTokenAndOrg(res)
|
|
85
|
+
showAppToast('登录成功')
|
|
86
|
+
router.push('/')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function loginByPassword() {
|
|
90
|
+
const res = await loginApi(form.value)
|
|
91
|
+
await saveBusinessTokenAndOrg(res)
|
|
92
|
+
showAppToast('登录成功')
|
|
93
|
+
router.push('/')
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function saveBusinessTokenAndOrg(response: unknown) {
|
|
97
|
+
// 先保存 token,后续机构接口需要携带 Authorization 访问。
|
|
98
|
+
saveAuthTokens(response as AuthTokenResponse)
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
await saveSystemWorkDate()
|
|
102
|
+
|
|
103
|
+
const username = userStore.username.trim()
|
|
104
|
+
if (!username) {
|
|
105
|
+
rejectLoginWithoutOrg()
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const orgResponse = await getOrgByUserNameApi(username)
|
|
109
|
+
// 后端约定第一条机构就是当前登录机构;空数组表示该用户暂不可进入系统。
|
|
110
|
+
const firstOrg = Array.isArray(orgResponse.data) ? orgResponse.data[0] : undefined
|
|
111
|
+
|
|
112
|
+
if (!firstOrg) {
|
|
113
|
+
rejectLoginWithoutOrg()
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// 机构列表第一条就是当前用户本次登录机构,保存后供 TAM 公共 head 使用。
|
|
117
|
+
userStore.setLoginOrg(firstOrg)
|
|
118
|
+
} catch (error) {
|
|
119
|
+
// 机构校验失败时撤销刚保存的登录态,避免后续路由误认为已登录。
|
|
120
|
+
userStore.clearToken()
|
|
121
|
+
appStore.clearSystemAppDate()
|
|
122
|
+
throw error
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function saveSystemWorkDate() {
|
|
127
|
+
const response = await getLastLoginTimeApi()
|
|
128
|
+
const appDt = response.data?.appDt
|
|
129
|
+
|
|
130
|
+
if (!appDt) {
|
|
131
|
+
throw new Error('系统工作日期为空')
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
appStore.setSystemAppDate(appDt)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function rejectLoginWithoutOrg(): never {
|
|
138
|
+
showAppToast(LOGIN_UNAVAILABLE_MESSAGE)
|
|
139
|
+
throw new Error(LOGIN_UNAVAILABLE_MESSAGE)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function isLoginUnavailableError(error: unknown) {
|
|
143
|
+
return error instanceof Error && error.message === LOGIN_UNAVAILABLE_MESSAGE
|
|
144
|
+
}
|
|
145
|
+
</script>
|
|
146
|
+
|
|
147
|
+
<template>
|
|
148
|
+
<div class="login-page">
|
|
149
|
+
<van-loading v-if="appStore.isNative" vertical class="native-loading">
|
|
150
|
+
正在登录...
|
|
151
|
+
</van-loading>
|
|
152
|
+
|
|
153
|
+
<template v-else>
|
|
154
|
+
<section class="login-header">
|
|
155
|
+
<p class="login-eyebrow">Welcome back</p>
|
|
156
|
+
<h1 class="login-title">账号登录</h1>
|
|
157
|
+
<p class="login-subtitle">请输入账号信息继续访问</p>
|
|
158
|
+
</section>
|
|
159
|
+
|
|
160
|
+
<van-form class="login-form" @submit="onSubmit">
|
|
161
|
+
<van-cell-group inset class="form-panel">
|
|
162
|
+
<van-field
|
|
163
|
+
v-model="form.username"
|
|
164
|
+
name="username"
|
|
165
|
+
label="用户名"
|
|
166
|
+
placeholder="请输入用户名"
|
|
167
|
+
:rules="[{ required: true, message: '请输入用户名' }]"
|
|
168
|
+
/>
|
|
169
|
+
<van-field
|
|
170
|
+
v-model="form.password"
|
|
171
|
+
type="password"
|
|
172
|
+
name="password"
|
|
173
|
+
label="密码"
|
|
174
|
+
placeholder="请输入密码"
|
|
175
|
+
:rules="[{ required: true, message: '请输入密码' }]"
|
|
176
|
+
/>
|
|
177
|
+
</van-cell-group>
|
|
178
|
+
<div class="btn-wrap">
|
|
179
|
+
<van-button block round type="primary" native-type="submit" :loading="loading">
|
|
180
|
+
登录
|
|
181
|
+
</van-button>
|
|
182
|
+
</div>
|
|
183
|
+
</van-form>
|
|
184
|
+
</template>
|
|
185
|
+
|
|
186
|
+
<footer class="login-version">v{{ appVersion }}</footer>
|
|
187
|
+
</div>
|
|
188
|
+
</template>
|
|
189
|
+
|
|
190
|
+
<style scoped>
|
|
191
|
+
.login-page {
|
|
192
|
+
min-height: var(--app-page-min-height, 100vh);
|
|
193
|
+
padding: 72px 24px 24px;
|
|
194
|
+
display: flex;
|
|
195
|
+
flex-direction: column;
|
|
196
|
+
background:
|
|
197
|
+
radial-gradient(circle at 18% 8%, rgba(25, 137, 250, 0.16), transparent 110px),
|
|
198
|
+
linear-gradient(180deg, #f6f9ff 0%, #ffffff 44%, #f7f8fa 100%);
|
|
199
|
+
box-sizing: border-box;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.login-header {
|
|
203
|
+
margin-bottom: 36px;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.login-eyebrow {
|
|
207
|
+
margin: 0 0 10px;
|
|
208
|
+
color: #1989fa;
|
|
209
|
+
font-size: 14px;
|
|
210
|
+
font-weight: 600;
|
|
211
|
+
line-height: 1.2;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.login-title {
|
|
215
|
+
margin: 0;
|
|
216
|
+
color: #1f2937;
|
|
217
|
+
font-size: 28px;
|
|
218
|
+
font-weight: 700;
|
|
219
|
+
line-height: 1.18;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.login-subtitle {
|
|
223
|
+
margin: 10px 0 0;
|
|
224
|
+
color: #6b7280;
|
|
225
|
+
font-size: 15px;
|
|
226
|
+
line-height: 1.5;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.login-form {
|
|
230
|
+
--van-cell-font-size: 15px;
|
|
231
|
+
--van-cell-line-height: 24px;
|
|
232
|
+
--van-cell-vertical-padding: 15px;
|
|
233
|
+
--van-cell-horizontal-padding: 16px;
|
|
234
|
+
--van-field-label-width: 66px;
|
|
235
|
+
--van-field-label-margin-right: 8px;
|
|
236
|
+
--van-field-placeholder-text-color: #b6bdc8;
|
|
237
|
+
--van-button-large-height: 48px;
|
|
238
|
+
--van-button-default-height: 48px;
|
|
239
|
+
--van-button-default-font-size: 17px;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.form-panel {
|
|
243
|
+
margin: 0;
|
|
244
|
+
border-radius: 14px;
|
|
245
|
+
overflow: hidden;
|
|
246
|
+
box-shadow: 0 10px 30px rgba(31, 41, 55, 0.08);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.btn-wrap {
|
|
250
|
+
margin-top: 28px;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.btn-wrap :deep(.van-button) {
|
|
254
|
+
border: 0;
|
|
255
|
+
background: linear-gradient(135deg, #1989fa 0%, #1268e5 100%);
|
|
256
|
+
box-shadow: 0 9px 18px rgba(25, 137, 250, 0.26);
|
|
257
|
+
font-weight: 600;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.native-loading {
|
|
261
|
+
display: flex;
|
|
262
|
+
justify-content: center;
|
|
263
|
+
align-items: center;
|
|
264
|
+
min-height: 60vh;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.login-version {
|
|
268
|
+
margin-top: auto;
|
|
269
|
+
padding-top: 28px;
|
|
270
|
+
color: #9ca3af;
|
|
271
|
+
font-size: 12px;
|
|
272
|
+
line-height: 1.4;
|
|
273
|
+
text-align: center;
|
|
274
|
+
}
|
|
275
|
+
</style>
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useUserStore } from '@/stores/user'
|
|
3
|
+
import { showAppToast } from '@/utils/toast'
|
|
4
|
+
|
|
5
|
+
defineOptions({ name: 'MinePage' })
|
|
6
|
+
|
|
7
|
+
const router = useRouter()
|
|
8
|
+
const userStore = useUserStore()
|
|
9
|
+
const appVersion = __APP_VERSION__
|
|
10
|
+
|
|
11
|
+
const tokenText = computed(() => (userStore.token ? '已登录' : '未登录'))
|
|
12
|
+
const displayName = computed(() => userStore.realName || userStore.username || tokenText.value)
|
|
13
|
+
const organizationNameText = computed(() => userStore.organizationName || '暂无所属机构')
|
|
14
|
+
|
|
15
|
+
function openSettings() {
|
|
16
|
+
router.push('/settings')
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function handleLogout() {
|
|
20
|
+
try {
|
|
21
|
+
await showConfirmDialog({
|
|
22
|
+
title: '退出登录',
|
|
23
|
+
message: '确认退出当前账号?',
|
|
24
|
+
confirmButtonText: '退出',
|
|
25
|
+
confirmButtonColor: '#f22f3d',
|
|
26
|
+
})
|
|
27
|
+
userStore.clearToken()
|
|
28
|
+
showAppToast('已退出登录')
|
|
29
|
+
router.replace('/login')
|
|
30
|
+
} catch {
|
|
31
|
+
// 用户取消时不需要处理
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<template>
|
|
37
|
+
<main class="mine-page">
|
|
38
|
+
<section class="profile-header">
|
|
39
|
+
<div class="avatar" aria-hidden="true">
|
|
40
|
+
<van-icon name="manager-o" />
|
|
41
|
+
</div>
|
|
42
|
+
<div class="profile-copy">
|
|
43
|
+
<h1>{{ displayName }}</h1>
|
|
44
|
+
<p>{{ organizationNameText }}</p>
|
|
45
|
+
</div>
|
|
46
|
+
</section>
|
|
47
|
+
|
|
48
|
+
<section class="info-section">
|
|
49
|
+
<van-cell-group inset>
|
|
50
|
+
<van-cell title="登录状态" :value="tokenText" />
|
|
51
|
+
<van-cell title="应用版本" :value="`v${appVersion}`" />
|
|
52
|
+
<van-cell title="设置" icon="setting-o" is-link @click="openSettings" />
|
|
53
|
+
</van-cell-group>
|
|
54
|
+
</section>
|
|
55
|
+
|
|
56
|
+
<section class="action-section">
|
|
57
|
+
<van-button block round type="danger" plain @click="handleLogout">重新登录</van-button>
|
|
58
|
+
</section>
|
|
59
|
+
</main>
|
|
60
|
+
</template>
|
|
61
|
+
|
|
62
|
+
<style scoped>
|
|
63
|
+
.mine-page {
|
|
64
|
+
width: 100%;
|
|
65
|
+
max-width: 750px;
|
|
66
|
+
min-height: var(--app-page-min-height, 100vh);
|
|
67
|
+
margin: 0 auto;
|
|
68
|
+
padding: 22px 11px 24px;
|
|
69
|
+
color: #171b20;
|
|
70
|
+
background: radial-gradient(circle at 16% 4%, rgba(242, 47, 61, 0.1), transparent 112px), #f7f8fa;
|
|
71
|
+
box-sizing: border-box;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.profile-header {
|
|
75
|
+
display: flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: 14px;
|
|
78
|
+
min-height: 92px;
|
|
79
|
+
padding: 18px 16px;
|
|
80
|
+
border-radius: 8px;
|
|
81
|
+
background: linear-gradient(135deg, #ffffff 0%, #fff5f6 100%);
|
|
82
|
+
box-shadow: 0 6px 18px rgba(22, 27, 34, 0.05);
|
|
83
|
+
box-sizing: border-box;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.avatar {
|
|
87
|
+
display: flex;
|
|
88
|
+
align-items: center;
|
|
89
|
+
justify-content: center;
|
|
90
|
+
width: 54px;
|
|
91
|
+
height: 54px;
|
|
92
|
+
flex: 0 0 54px;
|
|
93
|
+
border-radius: 50%;
|
|
94
|
+
color: #ffffff;
|
|
95
|
+
font-size: 28px;
|
|
96
|
+
background: linear-gradient(135deg, #f22f3d 0%, #ff6a71 100%);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.profile-copy {
|
|
100
|
+
flex: 1;
|
|
101
|
+
min-width: 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.profile-copy h1 {
|
|
105
|
+
margin: 0;
|
|
106
|
+
color: #171b20;
|
|
107
|
+
font-size: 22px;
|
|
108
|
+
font-weight: 700;
|
|
109
|
+
line-height: 1.25;
|
|
110
|
+
overflow: hidden;
|
|
111
|
+
text-overflow: ellipsis;
|
|
112
|
+
white-space: nowrap;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.profile-copy p {
|
|
116
|
+
margin: 6px 0 0;
|
|
117
|
+
color: #6b7280;
|
|
118
|
+
font-size: 14px;
|
|
119
|
+
line-height: 1.4;
|
|
120
|
+
overflow: hidden;
|
|
121
|
+
text-overflow: ellipsis;
|
|
122
|
+
white-space: nowrap;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.info-section {
|
|
126
|
+
margin-top: 14px;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.info-section :deep(.van-cell-group--inset) {
|
|
130
|
+
margin: 0;
|
|
131
|
+
border-radius: 8px;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.info-section :deep(.van-cell) {
|
|
135
|
+
align-items: center;
|
|
136
|
+
min-height: 50px;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.action-section {
|
|
140
|
+
margin-top: 22px;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.action-section :deep(.van-button) {
|
|
144
|
+
height: 46px;
|
|
145
|
+
font-size: 16px;
|
|
146
|
+
}
|
|
147
|
+
</style>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<main class="page">
|
|
3
|
+
<section class="page-body">
|
|
4
|
+
<p class="placeholder">页面建设中…</p>
|
|
5
|
+
</section>
|
|
6
|
+
</main>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<style scoped>
|
|
10
|
+
.page {
|
|
11
|
+
max-width: 750px;
|
|
12
|
+
min-height: var(--app-page-min-height, 100vh);
|
|
13
|
+
margin: 0 auto;
|
|
14
|
+
padding: 0 11px;
|
|
15
|
+
background: #f7f8fa;
|
|
16
|
+
}
|
|
17
|
+
.page-body {
|
|
18
|
+
padding: 24px 0;
|
|
19
|
+
}
|
|
20
|
+
.placeholder {
|
|
21
|
+
text-align: center;
|
|
22
|
+
color: #969799;
|
|
23
|
+
font-size: 14px;
|
|
24
|
+
padding-top: 120px;
|
|
25
|
+
}
|
|
26
|
+
</style>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<main class="page">
|
|
3
|
+
<section class="page-body">
|
|
4
|
+
<p class="placeholder">页面建设中…</p>
|
|
5
|
+
</section>
|
|
6
|
+
</main>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<style scoped>
|
|
10
|
+
.page {
|
|
11
|
+
max-width: 750px;
|
|
12
|
+
min-height: var(--app-page-min-height, 100vh);
|
|
13
|
+
margin: 0 auto;
|
|
14
|
+
padding: 0 11px;
|
|
15
|
+
background: #f7f8fa;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.page-body {
|
|
19
|
+
padding: 24px 0;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.placeholder {
|
|
23
|
+
padding-top: 120px;
|
|
24
|
+
color: #969799;
|
|
25
|
+
font-size: 14px;
|
|
26
|
+
text-align: center;
|
|
27
|
+
}
|
|
28
|
+
</style>
|