提交 bbe3e0c5 authored 作者: 庞斌's avatar 庞斌

feat:创建项目

上级 8ea22574
root = true
[*.{js,cjs,ts,jsx,tsx,vue,html,css,scss,md}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = crlf
logs
*.log*
node_modules
dist
lib
dist-ssr
*.local
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
\ No newline at end of file
VITE_BASE_API=/api
# title
VITE_GLOB_APP_TITLE = '地籍调查管理平台'
VITE_BASE_API=/dev-api
NODE_ENV=production
VITE_BASE_API=/prod-api
<!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.ts"></script>
</body>
</html>
{
"name": "yjjbnt-project",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vue-tsc && vite build",
"preview": "vite preview"
},
"dependencies": {
"@layui/icons-vue": "^1.1.1",
"@layui/layer-vue": "^2.3.2",
"@layui/layui-vue": "^2.16.8",
"axios": "^1.5.1",
"core-js": "^3.6.5",
"echarts": "^5.4.3",
"gm-crypt": "^0.0.2",
"less": "^4.2.0",
"mockjs": "^1.1.0",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.0",
"vue": "^3.4.21",
"vue-router": "^4.2.5"
},
"devDependencies": {
"@types/node": "^18.7.8",
"@vitejs/plugin-vue": "^5.0.4",
"@vue/compiler-sfc": "^3.3.4",
"sass": "^1.75.0",
"typescript": "^5.2.2",
"unplugin-auto-import": "^0.11.2",
"unplugin-vue-components": "^0.22.7",
"vite": "^5.2.0",
"vue-tsc": "^2.0.6"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
<script setup lang="ts"></script>
<template>
<router-view></router-view>
</template>
<style scoped lang="scss">
</style>
import axios, {
// AxiosRequestHeaders,
AxiosResponse,
InternalAxiosRequestConfig
} from 'axios'
// import { useUserStore } from '../store/user'
import { layer } from '@layui/layui-vue'
import router from '../router'
type TAxiosOption = {
timeout: number
baseURL: string
}
const config: TAxiosOption = {
timeout: 5000,
// baseURL: import.meta.env.VITE_APP_BASE_API
baseURL: window.location.origin
}
class Http {
service
constructor(config: TAxiosOption) {
this.service = axios.create(config)
/* 请求拦截 */
this.service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
// const userInfoStore = useUserStore();
// if (userInfoStore.token) {
// (config.headers as AxiosRequestHeaders).token = userInfoStore.token as string
// } else {
// if(router.currentRoute.value.path!=='/login') {
// router.push('/login');
// }
// }
return config
},
error => {
return Promise.reject(error)
}
)
/* 响应拦截 */
this.service.interceptors.response.use(
(response: AxiosResponse<never>) => {
console.log(response)
switch (response.data.code) {
case 200:
return response.data
case 400:
return response.data
// eslint-disable-next-line no-unreachable
break
case 401:
return response.data
// eslint-disable-next-line no-unreachable
break
case 403:
return response.data
// eslint-disable-next-line no-unreachable
break
case 404:
return response.data
// eslint-disable-next-line no-unreachable
break
case 408:
return response.data
// eslint-disable-next-line no-unreachable
break
case 500:
return response.data
// eslint-disable-next-line no-unreachable
break
case 501:
return response.data
// eslint-disable-next-line no-unreachable
break
case 502:
return response.data
// eslint-disable-next-line no-unreachable
break
case 503:
return response.data
// eslint-disable-next-line no-unreachable
break
case 504:
return response.data
// eslint-disable-next-line no-unreachable
break
case 505:
return response.data
// eslint-disable-next-line no-unreachable
break
case 99998:
layer.confirm('会话超时, 请重新登录', {
icon: 2,
yes: function () {
router.push('/login')
layer.closeAll()
}
})
return response.data
default:
break
}
if (!response.data.code) {
// eslint-disable-next-line prefer-promise-reject-errors
return Promise.reject({
msg: '请求json失败',
code: '404',
data: '请求json失败'
})
}
},
error => {
return Promise.reject(error)
}
)
}
/* GET 方法 */
// eslint-disable-next-line no-unreachable
get(url: string, params?: object, _object = {}): Promise<never> {
return this.service.get(url, { params, ..._object })
}
/* POST 方法 */
// eslint-disable-next-line no-unreachable
post(url: string, params?: object, _object = {}): Promise<never> {
return this.service.post(url, params, _object)
}
/* PUT 方法 */
// eslint-disable-next-line no-unreachable
put(url: string, params?: object, _object = {}): Promise<never> {
return this.service.put(url, params, _object)
}
/* DELETE 方法 */
// eslint-disable-next-line no-unreachable
delete(url: string, params?: never, _object = {}): Promise<never> {
return this.service.delete(url, { params, ..._object })
}
}
export default new Http(config)
import Http from '../http'
/**
* 保存质检、变更状态
*/
export const saveStatus = function (url: string, data: object) {
return Http.post(url, data)
}
import Http from '../http'
/**
* 获取流程信息
* @param url
* @param data
*/
export const getLcInfo = function (url: string, data: object) {
return Http.get(url, data)
}
/**
* 获取配置文件(图形检查公共配置)
* @param url
* @param data
*/
export const getConfigInfo = function (url: string, data: object) {
return Http.get(url, data)
}
/**
* 获取已保存数据
* @param url
* @param data
*/
export const getZjDataFromDB = function (url: string, data: object) {
return Http.get(url, data)
}
import Http from '../http'
/**
* 从指定路径获取 JSON 数据。
* @param code 一个字符串,代表要获取的 JSON 文件的名称(不包含扩展名)。
* @returns 返回一个 Promise 对象,它解析为从指定路径加载的 JSON 数据。
*/
export const getJsonCode = function (code: string) {
// 使用 Http.get 方法请求指定路径的 JSON 数据
return Http.get(`/src/data/${code}.json`)
}
export const getList = function (url: string) {
return Http.get(`/src/data/${url}.json`)
}
import Http from '../http'
export const login = function (loginForm: any) {
return Http.post('/user/login', loginForm)
}
//登录验证码
export const verificationImg = function () {
return Http.get('/login/verificationImg')
}
//登录二维码
export const loginQrcode = function () {
return Http.get('/login/loginQrcode')
}
export const menu = function (url) {
return Http.get(url)
}
export const portalMenu = function () {
return Http.get('/portalMenu/portalMenu')
}
/**
* 获取子系统菜单
*
* @param {string} clientId 应用ID
*/
// export const portalMenu = function(id) {
// return Http.get('/account/rest/v1/modules/find-subsystem-by-clientid?clientId='+id)
// }
/**
* 获取当前子系统下的菜单目录
*
* @param {string} clientId 应用ID
* @param {string} parentId 子系统ID
*/
// export const menu = function(clientId,parentId) {
// return Http.get('/account/rest/v1/modules/find-subsystem-by-clientid?clientId='+clientId+'&parentId='+parentId)
// }
差异被折叠。
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
差异被折叠。
This source diff could not be displayed because it is too large. You can view the blob instead.
差异被折叠。
差异被折叠。
差异被折叠。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
\ No newline at end of file
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_BASE_API: string;
readonly VITE_APP_NAME: string;
}
// eslint-disable-next-line no-unused-vars
interface ImportMeta {
readonly env: ImportMetaEnv
}
import { createApp } from 'vue'
import Router from './router'
import Store from './store'
import './style.css'
import Layui from '@layui/layui-vue'
import '@layui/layui-vue/lib/index.css'
import App from './App.vue'
// 引入iconfont
import '@/assets/iconfont/iconfont.js'
import '@/assets/iconfont/iconfont.css'
const env = import.meta.env
const app = createApp(App)
app.use(Store)
app.use(Router)
app.use(Layui)
app.mount('#app')
import { createRouter, createWebHashHistory, NavigationGuardNext, RouteLocationNormalized } from 'vue-router'
import routes from './module/basicRoutes'
const router = createRouter({
history: createWebHashHistory(),
routes
})
/**
* Router 前置拦截
*
* 1.验证 token 存在, 并且有效, 否则 -> login.vue
* 2.验证 permission 存在, 否则 -> 403.vue
* 3.验证 router 是否存在, 否则 -> 404.vue
*
* @param to 目标
* @param from 来至
*/
router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
if (to.meta.requireAuth) {
next()
} else if (to.matched.length === 0) {
next({ path: '/error/404' })
} else {
next()
}
})
router.afterEach(() => {})
export default router
import Home from '@/views/home/index.vue'
export default [
{
path: '/',
redirect: '/home'
},
{
path: '/home',
name: 'Home',
component: Home
}
]
import { defineStore } from 'pinia'
export const useAppStore = defineStore({
id: 'app',
state: () => {
return {
tab: true,
logo: true,
level: true,
inverted: false,
routerAlive: true,
collapse: false,
subfield: false,
locale: 'zh_CN',
subfieldPosition: 'side',
theme: 'light',
breadcrumb: true,
sideWidth: '220px',
sideTheme: 'dark',
greyMode: false,
accordion: true,
tagsTheme: 'concise',
keepAliveList: [],
themeVariable: {
'--global-checked-color': '#5fb878',
'--global-primary-color': '#009688',
'--global-normal-color': '#1e9fff',
'--global-danger-color': '#ff5722',
'--global-warm-color': '#ffb800',
'--global-border-radius': '4px'
}
}
},
persist: {
storage: localStorage,
paths: [
'tab',
'locale',
'theme',
'logo',
'level',
'inverted',
'breadcrumb',
'sideTheme',
'greyMode',
'accordion',
'keepAliveList',
'themeVariable',
'subfield',
'tagsTheme'
]
}
})
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
const store = createPinia()
store.use(piniaPluginPersistedstate)
export default store
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body,html{
width: 100%;
height: 100%;
overflow: hidden;
}
#app{
width: 100%;
height: 100%;
}
/**
* 获取数据差异
*
* @param arr1 数组
* @param arr2 数组
*/
const diff = function (arr1: any[], arr2: any[]) {
arr1 = Array.from(new Set(arr1))
arr2 = Array.from(new Set(arr2))
const mergeArr = arr1.concat(arr2)
return mergeArr.filter(x => !(arr1.includes(x) && arr2.includes(x)))
}
export { diff }
import mitt from 'mitt'
const emitter = new mitt()
export default emitter
/**
* 获取当前节点
*
* @param list 集合
* @param id 节点编号
*/
export const getNode = function (list: any[], id: string): any {
for (const i in list) {
const item = list[i]
if (item.id === id) {
return item
} else {
if (item.children) {
const value = getNode(item.children, id)
if (value) {
return value
}
}
}
}
}
/**
* 获取所有父节点 ( 包含当前节点 )
*
* @param list 集合
* @param id 节点编号
*/
export const getParents = function (list: any[], id: string): any {
for (const i in list) {
if (list[i].id === id) {
return [list[i]]
}
if (list[i].children) {
const node = getParents(list[i].children, id)
if (node !== undefined) {
return node.concat(list[i])
}
}
}
}
export const renameKeys = function (node, newKeys) {
if (typeof node !== 'object' || node === null) {
return node
}
const keys = Object.keys(node)
const newNode = Array.isArray(node) ? [] : {}
keys.forEach(key => {
const newKey = newKeys[key] || key
newNode[newKey] = renameKeys(node[key], newKeys)
})
return newNode
}
<template>
<lay-card class="error-page">
<lay-exception
status="401"
title="401"
describe="抱歉,你无权访问该页面"
>
<template #extra>
<lay-button>刷新</lay-button>
<lay-button type="primary">返回</lay-button>
</template>
</lay-exception>
</lay-card>
</template>
<style>
.error-page {
padding-top: 200px;
padding-bottom: 200px;
margin: 10px;
}
</style>
<template>
<lay-card class="error-page">
<lay-exception
status="403"
title="403"
describe="抱歉,你无权访问该页面"
>
<template #extra>
<lay-button>刷新</lay-button>
<lay-button type="primary">返回</lay-button>
</template>
</lay-exception>
</lay-card>
</template>
<style>
.error-page {
padding-top: 200px;
padding-bottom: 200px;
margin: 10px;
}
</style>
<template>
<lay-card class="error-page">
<lay-exception
status="404"
title="404"
describe="抱歉,你访问的页面不存在"
>
<template #extra>
<lay-button>刷新</lay-button>
<lay-button type="primary">返回</lay-button>
</template>
</lay-exception>
</lay-card>
</template>
<style>
.error-page {
padding-top: 200px;
padding-bottom: 200px;
margin: 10px;
}
</style>
<template>
<lay-card class="error-page">
<lay-exception
status="500"
title="500"
describe="抱歉,服务器出错了"
>
<template #extra>
<lay-button>刷新</lay-button>
<lay-button type="primary">返回</lay-button>
</template>
</lay-exception>
</lay-card>
</template>
<style>
.error-page {
padding-top: 200px;
padding-bottom: 200px;
margin: 10px;
}
</style>
<script setup lang="ts">
let a="fdasfda"
</script>
<template>
<div>
156156556
</div>
</template>
<style scoped lang="scss">
div{
color: #fff;
}
</style>
/// <reference types="vite/client" />
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
},
server: {
port: 3000,
cors: true,
proxy: {}
},
build: {
outDir: path.resolve(__dirname, '../dist')
},
envDir: path.resolve(__dirname, 'env')
})
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论