init
This commit is contained in:
commit
8c9532125b
|
|
@ -0,0 +1,8 @@
|
|||
# 页面标题
|
||||
VITE_APP_TITLE=里派基础框架
|
||||
|
||||
# 开发环境配置
|
||||
VITE_APP_ENV='development'
|
||||
|
||||
# 开发环境
|
||||
VITE_APP_BASE_API='/dev-api'
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# 页面标题
|
||||
VITE_APP_TITLE=里派基础框架
|
||||
|
||||
# 生产环境配置
|
||||
VITE_APP_ENV='production'
|
||||
|
||||
# 生产环境
|
||||
VITE_APP_BASE_API='/prod-api'
|
||||
|
||||
# 是否在打包时开启压缩,支持 gzip 和 brotli
|
||||
VITE_BUILD_COMPRESS=gzip
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# 页面标题
|
||||
VITE_APP_TITLE=里派基础框架
|
||||
|
||||
# 生产环境配置
|
||||
VITE_APP_ENV='staging'
|
||||
|
||||
# 生产环境
|
||||
VITE_APP_BASE_API='/staging-api'
|
||||
|
||||
# 是否在打包时开启压缩,支持 gzip 和 brotli
|
||||
VITE_BUILD_COMPRESS=gzip
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
.DS_Store
|
||||
node_modules/
|
||||
dist/
|
||||
src/views/system/menu/test
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
**/*.log
|
||||
|
||||
tests/**/coverage/
|
||||
tests/e2e/reports
|
||||
selenium-debug.log
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.hbuilder
|
||||
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
vite.config.js.*
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2025 leapy
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
|
@ -0,0 +1,174 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="icon" href="images/logo.png">
|
||||
<title>%VITE_APP_TITLE%</title>
|
||||
<script type="text/javascript">
|
||||
document.write("<script src='config.ts?" + new Date().getTime() + "'><\/script>");
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but %VITE_APP_TITLE% doesn't work properly without JavaScript
|
||||
enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<script type="text/javascript">
|
||||
var dark = window.localStorage.getItem('APP_DARK');
|
||||
if (dark) {
|
||||
document.documentElement.classList.add("dark")
|
||||
}
|
||||
</script>
|
||||
<div id="app">
|
||||
<div class="app-loading">
|
||||
<div class="app-loading__logo">
|
||||
<img src="images/logo.png"/>
|
||||
</div>
|
||||
<div class="app-loading__loader"></div>
|
||||
<div class="app-loading__title">%VITE_APP_TITLE%</div>
|
||||
</div>
|
||||
<style>
|
||||
.app-loading {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
bottom: 0px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.app-loading__logo {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.app-loading__logo img {
|
||||
width: 90px;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.app-loading__loader {
|
||||
box-sizing: border-box;
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
border: 5px solid transparent;
|
||||
border-top-color: #000;
|
||||
border-radius: 50%;
|
||||
animation: .5s loader linear infinite;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.app-loading__loader:before {
|
||||
box-sizing: border-box;
|
||||
content: '';
|
||||
display: block;
|
||||
width: inherit;
|
||||
height: inherit;
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
left: -5px;
|
||||
border: 5px solid #ccc;
|
||||
border-radius: 50%;
|
||||
opacity: .5;
|
||||
}
|
||||
|
||||
.app-loading__title {
|
||||
font-size: 24px;
|
||||
color: #333;
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.dark .app-loading {
|
||||
background: #222225;
|
||||
}
|
||||
|
||||
.dark .app-loading__loader {
|
||||
border-top-color: #fff;
|
||||
}
|
||||
|
||||
.dark .app-loading__title {
|
||||
color: #d0d0d0;
|
||||
}
|
||||
|
||||
@keyframes loader {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
<div id="versionCheck"
|
||||
style="display: none;position: absolute;z-index: 99;top:0;left:0;right:0;bottom:0;padding:40px;background:rgba(255,255,255,0.9);color: #333;">
|
||||
<h2 style="line-height: 1;margin: 0;font-size: 24px;">当前使用的浏览器内核版本过低 :(</h2>
|
||||
<p style="line-height: 1;margin: 0;font-size: 14px;margin-top: 20px;opacity: 0.8;">当前版本:<span
|
||||
id="versionCheck-type">--</span> <span id="versionCheck-version">--</span></p>
|
||||
<p style="line-height: 1;margin: 0;font-size: 14px;margin-top: 10px;opacity: 0.8;">最低版本要求:Chrome 71+、Firefox
|
||||
65+、Safari 12+、Edge 97+。</p>
|
||||
<p style="line-height: 1;margin: 0;font-size: 14px;margin-top: 10px;opacity: 0.8;">
|
||||
请升级浏览器版本,或更换现代浏览器,如果你使用的是双核浏览器,请切换到极速/高速模式。</p>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
function getBrowerInfo() {
|
||||
var userAgent = window.navigator.userAgent;
|
||||
var browerInfo = {
|
||||
type: 'unknown',
|
||||
version: 'unknown',
|
||||
userAgent: userAgent
|
||||
};
|
||||
if (document.documentMode) {
|
||||
browerInfo.type = "IE"
|
||||
browerInfo.version = document.documentMode + ''
|
||||
} else if (indexOf(userAgent, "Firefox")) {
|
||||
browerInfo.type = "Firefox"
|
||||
browerInfo.version = userAgent.match(/Firefox\/([\d.]+)/)[1]
|
||||
} else if (indexOf(userAgent, "Opera")) {
|
||||
browerInfo.type = "Opera"
|
||||
browerInfo.version = userAgent.match(/Opera\/([\d.]+)/)[1]
|
||||
} else if (indexOf(userAgent, "Edg")) {
|
||||
browerInfo.type = "Edg"
|
||||
browerInfo.version = userAgent.match(/Edg\/([\d.]+)/)[1]
|
||||
} else if (indexOf(userAgent, "Chrome")) {
|
||||
browerInfo.type = "Chrome"
|
||||
browerInfo.version = userAgent.match(/Chrome\/([\d.]+)/)[1]
|
||||
} else if (indexOf(userAgent, "Safari")) {
|
||||
browerInfo.type = "Safari"
|
||||
browerInfo.version = userAgent.match(/Safari\/([\d.]+)/)[1]
|
||||
}
|
||||
return browerInfo
|
||||
}
|
||||
|
||||
function indexOf(userAgent, brower) {
|
||||
return userAgent.indexOf(brower) > -1
|
||||
}
|
||||
|
||||
function isSatisfyBrower() {
|
||||
var minVer = {
|
||||
"Chrome": 71,
|
||||
"Firefox": 65,
|
||||
"Safari": 12,
|
||||
"Edg": 97,
|
||||
"IE": 999
|
||||
}
|
||||
var browerInfo = getBrowerInfo()
|
||||
var materVer = browerInfo.version.split('.')[0]
|
||||
return materVer >= minVer[browerInfo.type]
|
||||
}
|
||||
|
||||
if (!isSatisfyBrower()) {
|
||||
document.getElementById('versionCheck').style.display = 'block';
|
||||
document.getElementById('versionCheck-type').innerHTML = getBrowerInfo().type;
|
||||
document.getElementById('versionCheck-version').innerHTML = getBrowerInfo().version;
|
||||
}
|
||||
</script>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
{
|
||||
"name": "admin",
|
||||
"version": "1.0.0",
|
||||
"description": "one basic framework",
|
||||
"author": "cfn",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build:prod": "vite build",
|
||||
"build:stage": "vite build --mode staging",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "^2.3.1",
|
||||
"axios": "^1.9.0",
|
||||
"crypto-js": "^4.2.0",
|
||||
"element-plus": "^2.9.10",
|
||||
"nprogress": "^0.2.0",
|
||||
"sortablejs": "^1.15.6",
|
||||
"vue": "^3.5.14",
|
||||
"vue-i18n": "^12.0.0-alpha.2",
|
||||
"vue-router": "^4.5.1",
|
||||
"vuedraggable": "^2.24.3",
|
||||
"vuex": "^4.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.15.21",
|
||||
"@vitejs/plugin-vue": "^5.2.4",
|
||||
"eslint": "^9.27.0",
|
||||
"sass": "^1.89.0",
|
||||
"vite": "^6.3.5"
|
||||
},
|
||||
"license": "MIT"
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 6.8 KiB |
|
|
@ -0,0 +1,24 @@
|
|||
<template>
|
||||
<el-config-provider :locale="locale" :size="config.size" :zIndex="config.zIndex" :button="config.button">
|
||||
<router-view></router-view>
|
||||
</el-config-provider>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { computed } from 'vue'
|
||||
|
||||
const config = {
|
||||
size: "default",
|
||||
zIndex: 2000,
|
||||
button: {
|
||||
autoInsertSpace: false
|
||||
}
|
||||
}
|
||||
|
||||
const locale = computed(() => {
|
||||
const {locale, messages} = useI18n()
|
||||
return messages.value[locale.value]
|
||||
})
|
||||
|
||||
</script>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
const modules = import.meta.glob('./model/**/*.ts') // 异步加载
|
||||
|
||||
// 使用示例
|
||||
const loadModel = async (modelName: string) => {
|
||||
const path = `./model/${modelName}.ts`
|
||||
const module = await modules[path]()
|
||||
return module.default
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
export default {
|
||||
//语言
|
||||
LANG: 'zh-cn',
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
import { createI18n } from 'vue-i18n'
|
||||
import el_zh_cn from 'element-plus/dist/locale/zh-cn'
|
||||
import el_en from 'element-plus/dist/locale/en'
|
||||
|
||||
import config from "@/config"
|
||||
import tools from '@/utils/tools'
|
||||
import zh_cn from './lang/zh-cn.js'
|
||||
import en from './lang/en.js'
|
||||
|
||||
const messages = {
|
||||
'zh-cn': {
|
||||
el: el_zh_cn,
|
||||
...zh_cn
|
||||
},
|
||||
'en': {
|
||||
el: el_en,
|
||||
...en
|
||||
}
|
||||
}
|
||||
|
||||
const i18n = createI18n({
|
||||
legacy: false,
|
||||
fallbackLocale: 'zh-cn',
|
||||
locale: tools.data.get("APP_LANG") || config.LANG,
|
||||
globalInjection: true,
|
||||
messages,
|
||||
})
|
||||
|
||||
export default i18n;
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
export default {
|
||||
system: {
|
||||
webTitleDev: 'Property Management System (Testing)',
|
||||
webTitle: 'Property Management System',
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
export default {
|
||||
system: {
|
||||
webTitleDev: '物业管理系统(测试)',
|
||||
webTitle: '物业管理系统',
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
import { createApp } from 'vue'
|
||||
import ElementPlus from 'element-plus'
|
||||
import 'element-plus/dist/index.css'
|
||||
import 'element-plus/theme-chalk/display.css'
|
||||
import i18n from './locales'
|
||||
|
||||
// import leapy from './leapy'
|
||||
// import router from './router'
|
||||
// import store from './store'
|
||||
import App from './App.vue'
|
||||
|
||||
const app = createApp(App);
|
||||
|
||||
// app.use(store);
|
||||
// app.use(router);
|
||||
app.use(ElementPlus);
|
||||
app.use(i18n);
|
||||
// app.use(leapy);
|
||||
|
||||
//挂载app
|
||||
app.mount('#app');
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
import CryptoJS from 'crypto-js';
|
||||
|
||||
const tools = {
|
||||
data: {
|
||||
set(cacheKey, data, expireIn = 0) {
|
||||
let cacheValue = {
|
||||
content: data,
|
||||
expireIn: expireIn === 0 ? 0 : new Date().getTime() + expireIn * 1000
|
||||
}
|
||||
return localStorage.setItem(cacheKey, tools.base64.encrypt(JSON.stringify(cacheValue)))
|
||||
},
|
||||
get(cacheKey) {
|
||||
try {
|
||||
const cacheValue = JSON.parse(tools.base64.decrypt(localStorage.getItem(cacheKey)))
|
||||
if (cacheValue) {
|
||||
let nowTime = new Date().getTime()
|
||||
if (nowTime > cacheValue.expireIn && cacheValue.expireIn !== 0) {
|
||||
localStorage.removeItem(cacheKey)
|
||||
return null;
|
||||
}
|
||||
return cacheValue.content
|
||||
}
|
||||
return null
|
||||
} catch (err) {
|
||||
return null
|
||||
}
|
||||
},
|
||||
remove(cacheKey) {
|
||||
return localStorage.removeItem(cacheKey)
|
||||
},
|
||||
clear() {
|
||||
return localStorage.clear()
|
||||
}
|
||||
},
|
||||
base64: {
|
||||
encrypt(data){
|
||||
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data))
|
||||
},
|
||||
decrypt(cipher){
|
||||
return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default tools
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "node",
|
||||
"types": ["node"],
|
||||
"baseUrl": "./",
|
||||
"paths": {
|
||||
"@/*": ["src/*"]
|
||||
},
|
||||
"esModuleInterop": true,
|
||||
"allowSyntheticDefaultImports": true
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
declare module "*.vue" {
|
||||
import { DefineComponent } from "vue";
|
||||
const component: DefineComponent<{}, {}, any>;
|
||||
export default component;
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
import {defineConfig, loadEnv} from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
import * as path from 'path'
|
||||
|
||||
export default defineConfig(({mode, command}) => {
|
||||
const env = loadEnv(mode, process.cwd())
|
||||
const {VITE_APP_ENV} = env
|
||||
return {
|
||||
resolve: {
|
||||
alias: {
|
||||
// 设置路径
|
||||
'~': path.resolve(__dirname, './'),
|
||||
// 设置别名
|
||||
'@': path.resolve(__dirname, './src'),
|
||||
// 资源地址
|
||||
'@assets': path.resolve(__dirname, './src/assets')
|
||||
},
|
||||
extensions: ['.ts', '.json', '.vue', '.js']
|
||||
},
|
||||
base: '/',
|
||||
// vite 相关配置
|
||||
server: {
|
||||
port: 8611,
|
||||
host: true,
|
||||
// open: true,
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://dev.api.eswhyf.cn',
|
||||
changeOrigin: true,
|
||||
rewrite: (p) => p.replace(/^\/api/, '')
|
||||
}
|
||||
}
|
||||
},
|
||||
build: {
|
||||
outDir: 'dist',
|
||||
assetsDir: 'static',
|
||||
sourcemap: true,
|
||||
rollupOptions: {
|
||||
output: {
|
||||
manualChunks(id) {
|
||||
if (id.includes('node_modules')) {
|
||||
return 'vendor'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: [vue()],
|
||||
css: {
|
||||
preprocessorOptions: {
|
||||
scss: {
|
||||
additionalData: `@use "@/styles/variables.scss" as *;`
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
Loading…
Reference in New Issue