commit
b7b9dd950c
19 changed files with 410 additions and 0 deletions
@ -0,0 +1,26 @@
|
||||
# Logs |
||||
logs |
||||
*.log |
||||
npm-debug.log* |
||||
yarn-debug.log* |
||||
yarn-error.log* |
||||
pnpm-debug.log* |
||||
lerna-debug.log* |
||||
|
||||
node_modules |
||||
dist |
||||
dist-ssr |
||||
*.local |
||||
|
||||
# Editor directories and files |
||||
.vscode/* |
||||
!.vscode/extensions.json |
||||
.idea |
||||
.DS_Store |
||||
*.suo |
||||
*.ntvs* |
||||
*.njsproj |
||||
*.sln |
||||
*.sw? |
||||
|
||||
.history |
||||
@ -0,0 +1,3 @@
|
||||
{ |
||||
"recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] |
||||
} |
||||
@ -0,0 +1,13 @@
|
||||
<!doctype html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="UTF-8" /> |
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||
<title>局长信箱 即接即办</title> |
||||
</head> |
||||
<body> |
||||
<div id="app"></div> |
||||
<script type="module" src="/src/main.js"></script> |
||||
</body> |
||||
</html> |
||||
@ -0,0 +1,23 @@
|
||||
{ |
||||
"name": "mailbox-outer-h5", |
||||
"private": true, |
||||
"version": "0.0.0", |
||||
"type": "module", |
||||
"scripts": { |
||||
"dev": "vite", |
||||
"build": "vite build", |
||||
"preview": "vite preview" |
||||
}, |
||||
"dependencies": { |
||||
"vant": "^4.8.2", |
||||
"vue": "^3.3.11", |
||||
"vue-router": "^4.2.5" |
||||
}, |
||||
"devDependencies": { |
||||
"@vitejs/plugin-vue": "^4.5.2", |
||||
"sass": "^1.69.7", |
||||
"unplugin-auto-import": "^0.17.3", |
||||
"vite": "^5.0.8", |
||||
"vite-svg-loader": "^5.1.0" |
||||
} |
||||
} |
||||
|
After Width: | Height: | Size: 362 KiB |
@ -0,0 +1,11 @@
|
||||
<script setup> |
||||
|
||||
</script> |
||||
|
||||
<template> |
||||
<router-view /> |
||||
</template> |
||||
|
||||
<style scoped> |
||||
|
||||
</style> |
||||
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 13 KiB |
@ -0,0 +1,29 @@
|
||||
<template> |
||||
<div :style="{ fontSize: size ? `${size}px` : '' }"> |
||||
<IconSvg /> |
||||
</div> |
||||
</template> |
||||
<script setup> |
||||
const props = defineProps({ |
||||
name: { |
||||
type: String, |
||||
require: true, |
||||
}, |
||||
size: { |
||||
type: Number, |
||||
}, |
||||
}); |
||||
|
||||
let IconSvg = ref(h("template")); |
||||
|
||||
import(`@/assets/icons/${props.name}.svg`).then((data) => { |
||||
IconSvg.value = data.render(); |
||||
}); |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
:deep() { |
||||
svg { |
||||
display: block; |
||||
} |
||||
} |
||||
</style> |
||||
@ -0,0 +1,16 @@
|
||||
import { createApp } from 'vue' |
||||
import router from './router/index' |
||||
|
||||
import './style.scss' |
||||
import 'vant/lib/index.css'; |
||||
import App from './App.vue' |
||||
import { Button, Tab, Tabs } from 'vant'; |
||||
import Icon from '@/components/Icon.vue' |
||||
|
||||
createApp(App) |
||||
.use(router) |
||||
.use(Button) |
||||
.use(Tab) |
||||
.use(Tabs) |
||||
.component('Icon', Icon) |
||||
.mount('#app') |
||||
@ -0,0 +1,32 @@
|
||||
import { createRouter, createWebHashHistory } from 'vue-router' |
||||
|
||||
import Home from '@/views/Home.vue' |
||||
import Mail from '@/views/mail/Index.vue' |
||||
|
||||
import NotFound from '@/views/error/404.vue' |
||||
|
||||
const constantRoutes = [ |
||||
{ |
||||
path: '/', |
||||
component: Home |
||||
}, |
||||
{ |
||||
path: '/mail', |
||||
component: Mail |
||||
}, |
||||
{ |
||||
path: '/:catchAll(.*)', |
||||
name: 'not-found', |
||||
component: NotFound, |
||||
meta: { |
||||
title: '404' |
||||
} |
||||
} |
||||
]; |
||||
|
||||
const router = createRouter({ |
||||
history: createWebHashHistory(), |
||||
routes: constantRoutes |
||||
}); |
||||
|
||||
export default router; |
||||
@ -0,0 +1,136 @@
|
||||
:root:root { |
||||
--primary-color: #184DCF; |
||||
--van-blue: var(--primary-color); |
||||
|
||||
} |
||||
|
||||
body { |
||||
font-size: 14px; |
||||
font-family: PingFang-SC-Heavy; |
||||
margin: 0; |
||||
--header-height: 8.377vh; |
||||
} |
||||
|
||||
#app { |
||||
max-width: 1200px; |
||||
margin: auto; |
||||
} |
||||
|
||||
p { |
||||
margin: 0.5em 0; |
||||
} |
||||
|
||||
svg { |
||||
width: 1em; |
||||
} |
||||
|
||||
svg+span { |
||||
margin-left: .5em; |
||||
} |
||||
|
||||
.none { |
||||
display: none; |
||||
} |
||||
.flex { |
||||
display: flex; |
||||
} |
||||
.flex-inline { |
||||
display: inline-flex; |
||||
} |
||||
|
||||
.flex.v-center, .flex-inline.v-center { |
||||
align-items: center; |
||||
} |
||||
|
||||
.flex.center, .flex-inline.center { |
||||
justify-content: center; |
||||
} |
||||
|
||||
.flex.between, .flex-inline.between { |
||||
justify-content: space-between; |
||||
} |
||||
|
||||
.flex.end, .flex-inline.end { |
||||
justify-content: flex-end; |
||||
} |
||||
|
||||
.flex.wrap, .flex-inline.wrap { |
||||
flex-wrap: wrap; |
||||
} |
||||
.flex.max-content, .flex-inline.max-content { |
||||
width: max-content; |
||||
} |
||||
.flex.gap, .flex-inline.gap { |
||||
gap: 0 8px; |
||||
} |
||||
.flex.gap-10 { |
||||
gap: 0 10px; |
||||
} |
||||
.flex.gap-16 { |
||||
gap: 0 16px; |
||||
} |
||||
|
||||
.text-center { |
||||
text-align: center; |
||||
} |
||||
.text-nowrap { |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
overflow: hidden; |
||||
} |
||||
.text-wrap { |
||||
white-space: pre-wrap; |
||||
} |
||||
|
||||
.container { |
||||
padding: 18px 36px; |
||||
} |
||||
|
||||
.pointer:hover { |
||||
cursor: pointer; |
||||
} |
||||
.relative { |
||||
position: relative; |
||||
} |
||||
.ml-4 { |
||||
margin-left: 4px; |
||||
} |
||||
.ml-8 { |
||||
margin-left: 8px; |
||||
} |
||||
.ml-10 { |
||||
margin-left: 10px; |
||||
} |
||||
.mr-4 { |
||||
margin-right: 4px; |
||||
} |
||||
.mr-8 { |
||||
margin-right: 8px; |
||||
} |
||||
.mr-10 { |
||||
margin-right: 10px; |
||||
} |
||||
.mr-20 { |
||||
margin-right: 20px; |
||||
} |
||||
.mt-8 { |
||||
margin-top: 8px; |
||||
} |
||||
.mt-10 { |
||||
margin-top: 10px; |
||||
} |
||||
.mt-20 { |
||||
margin-top: 20px; |
||||
} |
||||
.mb-8 { |
||||
margin-bottom: 8px; |
||||
} |
||||
.mb-10 { |
||||
margin-bottom: 10px; |
||||
} |
||||
.mb-20 { |
||||
margin-bottom: 20px; |
||||
} |
||||
.mb-40 { |
||||
margin-bottom: 40px; |
||||
} |
||||
@ -0,0 +1,43 @@
|
||||
<template> |
||||
<header> |
||||
<img src="/imgs/bg.png" alt=""> |
||||
</header> |
||||
<main> |
||||
<div class="flex gap-10 center mt-20"> |
||||
<a class="flex v-center center gap-16" @click="router.push('/mail')"> |
||||
<Icon name="write" :size="48" /> |
||||
<span>我要写信</span> |
||||
</a> |
||||
<a class="flex v-center center gap-16"> |
||||
<Icon name="search" :size="48" /> |
||||
<span>回复查询</span> |
||||
</a> |
||||
</div> |
||||
<p class="text-center mt-20">局长信箱只接受实名举报投诉,不受理报警业务</p> |
||||
<p class="text-center">如遇紧急情况请拨打110</p> |
||||
</main> |
||||
</template> |
||||
<script setup> |
||||
import { useRouter } from 'vue-router' |
||||
|
||||
const router = useRouter() |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
header { |
||||
img { |
||||
width: 100%; |
||||
} |
||||
} |
||||
a { |
||||
width: 45.2%; |
||||
height: 84px; |
||||
text-decoration: none; |
||||
border: 1px solid var(--primary-color); |
||||
color: var(--primary-color); |
||||
font-weight: bold; |
||||
font-size: 18px; |
||||
&:hover { |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
</style> |
||||
@ -0,0 +1,9 @@
|
||||
<template> |
||||
<h1>404</h1> |
||||
</template> |
||||
<script setup> |
||||
|
||||
</script> |
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
||||
@ -0,0 +1,11 @@
|
||||
<template> |
||||
<van-tabs v-model:active="active"> |
||||
<van-tab title="我要写信">我要写信</van-tab> |
||||
<van-tab title="我的信件">我的信件</van-tab> |
||||
<van-tab title="草稿箱">草稿箱</van-tab> |
||||
</van-tabs> |
||||
</template> |
||||
<script setup> |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
@ -0,0 +1,29 @@
|
||||
import { defineConfig } from 'vite' |
||||
import vue from '@vitejs/plugin-vue' |
||||
import AutoImport from 'unplugin-auto-import/vite' |
||||
import svgLoader from 'vite-svg-loader' |
||||
import path from 'path' |
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({ |
||||
plugins: [ |
||||
vue(), |
||||
svgLoader(), |
||||
AutoImport({ |
||||
imports: [ |
||||
'vue' |
||||
] |
||||
}), |
||||
], |
||||
resolve: { |
||||
// https://cn.vitejs.dev/config/#resolve-alias
|
||||
alias: { |
||||
// 设置路径
|
||||
'~': path.resolve(__dirname, './'), |
||||
// 设置别名
|
||||
'@': path.resolve(__dirname, './src/') |
||||
}, |
||||
// https://cn.vitejs.dev/config/#resolve-extensions
|
||||
extensions: ['.js'] |
||||
}, |
||||
}) |
||||
Loading…
Reference in new issue