├── public ├── CNAME ├── favicon.svg ├── element-plus-logo-small.svg └── vite.svg ├── src ├── composables │ ├── index.ts │ └── dark.ts ├── assets │ ├── fonts │ │ ├── Poppins-Bold.ttf │ │ └── Poppins-Regular.otf │ ├── vue.svg │ └── images │ │ └── logo.svg ├── types │ ├── common_type.ts │ └── user_type.ts ├── pages │ ├── front │ │ ├── UserInfo.vue │ │ ├── Notice.vue │ │ ├── Wanted.vue │ │ ├── Home.vue │ │ └── Publish.vue │ ├── error │ │ └── 404.vue │ └── Login │ │ └── index.vue ├── router │ ├── index.ts │ └── routes.ts ├── styles │ ├── element │ │ ├── dark.scss │ │ └── index.scss │ └── index.scss ├── App.vue ├── api │ ├── common.ts │ ├── user.ts │ └── request.ts ├── env.d.ts ├── main.ts ├── components │ ├── layouts │ │ ├── index.vue │ │ ├── BaseHeader.vue │ │ ├── BaseSide.vue │ │ └── BaseFooter.vue │ └── Logos.vue ├── utils │ ├── validate.ts │ └── message.ts ├── store │ └── user.ts ├── components.d.ts └── auto-imports.d.ts ├── .npmrc ├── .vscode └── extensions.json ├── scanshoot └── kd-shop.png ├── .env.development ├── .gitignore ├── index.html ├── tsconfig.json ├── package.json ├── README.md └── vite.config.ts /public/CNAME: -------------------------------------------------------------------------------- 1 | vite-starter.element-plus.org 2 | -------------------------------------------------------------------------------- /src/composables/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./dark"; 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | strict-peer-dependencies=false 3 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "recommendations": ["Vue.volar"] 4 | } 5 | -------------------------------------------------------------------------------- /scanshoot/kd-shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvr1997/kd-shop-web/HEAD/scanshoot/kd-shop.png -------------------------------------------------------------------------------- /src/assets/fonts/Poppins-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvr1997/kd-shop-web/HEAD/src/assets/fonts/Poppins-Bold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Poppins-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lvr1997/kd-shop-web/HEAD/src/assets/fonts/Poppins-Regular.otf -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | NODE_ENV=development 2 | VITE_APP_BASE_URL=/devApi 3 | VITE_APP_BASE_API=http://localhost:3000 4 | VITE_APP_TITLE=I have -------------------------------------------------------------------------------- /src/composables/dark.ts: -------------------------------------------------------------------------------- 1 | import { useDark, useToggle } from "@vueuse/core"; 2 | 3 | export const isDark = useDark(); 4 | export const toggleDark = useToggle(isDark); 5 | -------------------------------------------------------------------------------- /src/types/common_type.ts: -------------------------------------------------------------------------------- 1 | type ResponseType = { 2 | code: number, 3 | data: any, 4 | msg: string 5 | } 6 | 7 | export { 8 | ResponseType 9 | } 10 | -------------------------------------------------------------------------------- /src/types/user_type.ts: -------------------------------------------------------------------------------- 1 | type RequestData = { 2 | username: string, 3 | password: string, 4 | code: string 5 | } 6 | 7 | export { 8 | RequestData 9 | } 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vite-ssg-temp 2 | 3 | node_modules 4 | .DS_Store 5 | dist 6 | dist-ssr 7 | *.local 8 | 9 | # lock 10 | yarn.lock 11 | package-lock.json 12 | pnpm-lock.yaml 13 | 14 | *.log 15 | 16 | .vscode/ 17 | -------------------------------------------------------------------------------- /src/pages/front/UserInfo.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /src/pages/error/404.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHashHistory } from 'vue-router' 2 | import routes from './routes' 3 | 4 | const router = createRouter({ 5 | history: createWebHashHistory(), 6 | routes 7 | }) 8 | 9 | export default router -------------------------------------------------------------------------------- /src/styles/element/dark.scss: -------------------------------------------------------------------------------- 1 | // only scss variables 2 | 3 | $--colors: ( 4 | "primary": ( 5 | "base": #589ef8, 6 | ), 7 | ); 8 | 9 | @forward "element-plus/theme-chalk/src/dark/var.scss" with ( 10 | $colors: $--colors 11 | ); 12 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 17 | -------------------------------------------------------------------------------- /src/api/common.ts: -------------------------------------------------------------------------------- 1 | import instance from "./request"; 2 | /** 3 | * 获取验证码 4 | */ 5 | export function GetCode(data: any) { 6 | return instance.request({ 7 | method: "POST", 8 | url: "/getCode/", 9 | data, 10 | }); 11 | } 12 | 13 | /** 14 | * http状态码异常演示接口 15 | */ 16 | export function ErrorHttp(data: any) { 17 | return instance.request({ 18 | method: "POST", 19 | url: "/error/", 20 | data, 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import { DefineComponent } from 'vue' 5 | const component: DefineComponent<{}, {}, any> 6 | export default component 7 | } 8 | 9 | interface ImportMetaEnv { 10 | readonly VITE_APP_TITLE: string 11 | readonly VITE_APP_BASE_URL: string 12 | readonly VITE_APP_BASE_API: string 13 | } 14 | 15 | interface ImportMeta { 16 | readonly env: ImportMetaEnv 17 | } -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createPinia } from 'pinia'; 2 | import { createApp } from "vue"; 3 | import App from "./App.vue"; 4 | import router from "./router"; 5 | 6 | // import "~/styles/element/index.scss"; 7 | 8 | import "element-plus/theme-chalk/src/message.scss"; 9 | 10 | import "uno.css"; 11 | import "~/styles/index.scss"; 12 | 13 | const pinia = createPinia() 14 | 15 | const app = createApp(App); 16 | 17 | app.use(router); 18 | app.use(pinia) 19 | app.mount("#app"); 20 | -------------------------------------------------------------------------------- /src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/components/layouts/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 17 | 18 | -------------------------------------------------------------------------------- /src/api/user.ts: -------------------------------------------------------------------------------- 1 | import instance from "./request"; 2 | /** 3 | * 注册接口 4 | */ 5 | export function Register(data = {}) { 6 | return instance.request({ 7 | method: "POST", 8 | url: "/register/", 9 | data, 10 | }); 11 | } 12 | 13 | /** 登录 */ 14 | export function Login(data = {}) { 15 | return instance.request({ 16 | method: "post", 17 | url: "/login/", 18 | data, 19 | }); 20 | } 21 | 22 | /** 登出 */ 23 | export function Logout() { 24 | return instance.request({ 25 | method: "post", 26 | url: "/logout/", 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Element Plus Vite Starter 8 | 9 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "target": "esnext", 5 | "useDefineForClassFields": true, 6 | "module": "esnext", 7 | "moduleResolution": "node", 8 | "strict": true, 9 | "jsx": "preserve", 10 | "sourceMap": true, 11 | "resolveJsonModule": true, 12 | "esModuleInterop": true, 13 | "lib": ["esnext", "dom"], 14 | "paths": { 15 | "~/*": ["src/*"] 16 | }, 17 | "skipLibCheck": true, 18 | "types": ["element-plus/global"] 19 | }, 20 | "vueCompilerOptions": { 21 | "target": 3 22 | }, 23 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], 24 | "exclude": ["node_modules"] 25 | } 26 | -------------------------------------------------------------------------------- /src/styles/index.scss: -------------------------------------------------------------------------------- 1 | // import dark theme 2 | @use "element-plus/theme-chalk/src/dark/css-vars.scss" as *; 3 | 4 | :root { 5 | // --ep-color-primary: red; 6 | --footer: 96px; 7 | } 8 | 9 | body { 10 | font-family: Inter, system-ui, Avenir, "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", 11 | "Microsoft YaHei", "微软雅黑", Arial, sans-serif; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | margin: 0; 15 | // overflow: hidden; 16 | } 17 | 18 | a { 19 | color: var(--ep-color-primary); 20 | } 21 | 22 | code { 23 | border-radius: 2px; 24 | padding: 2px 4px; 25 | background-color: var(--ep-color-primary-light-9); 26 | color: var(--ep-color-primary); 27 | } 28 | -------------------------------------------------------------------------------- /src/utils/validate.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 校验规则 3 | */ 4 | const regEmail = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/; 5 | const regPhone = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/; 6 | const reg_username = /^[a-zA-Z][a-zA-Z0-9]{4,15}$/; 7 | const regPassword = /^(?!\D+$)(?![^a-zA-Z]+$)\S{6,20}$/; 8 | const regCode = /^[a-z0-9]{6}$/; 9 | 10 | // 校验手机号 11 | export const validate_phone = (value: string) : boolean => regPhone.test(value); 12 | 13 | //校验邮箱 14 | export const validate_email = (value: string) : boolean => regEmail.test(value); 15 | 16 | // 校验密码 17 | export const validate_password = (value: string) : boolean => regPassword.test(value); 18 | 19 | // 校验验证码 20 | export const validate_code = (value: any) : boolean => regCode.test(value); 21 | -------------------------------------------------------------------------------- /src/components/Logos.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 32 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "element-plus-vite-starter", 3 | "private": true, 4 | "version": "0.1.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "generate": "vite-ssg build", 9 | "preview": "vite preview", 10 | "typecheck": "vue-tsc --noEmit" 11 | }, 12 | "dependencies": { 13 | "axios": "^1.7.7", 14 | "element-plus": "^2.8.5", 15 | "pinia": "^2.2.4", 16 | "vue": "^3.5.12", 17 | "vue-router": "^4.4.5", 18 | "zod": "^3.23.8" 19 | }, 20 | "devDependencies": { 21 | "@iconify-json/ep": "^1.1.15", 22 | "@types/node": "^20.11.30", 23 | "@vitejs/plugin-vue": "^5.0.4", 24 | "sass": "^1.79.3", 25 | "typescript": "^5.4.3", 26 | "unocss": "^0.58.6", 27 | "unplugin-auto-import": "^0.18.3", 28 | "unplugin-vue-components": "^0.26.0", 29 | "vite": "^5.2.5", 30 | "vite-ssg": "^0.23.6", 31 | "vue-tsc": "^2.0.7" 32 | }, 33 | "license": "MIT" 34 | } 35 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | element plus-logo-small 副本 -------------------------------------------------------------------------------- /public/element-plus-logo-small.svg: -------------------------------------------------------------------------------- 1 | element plus-logo-small 副本 -------------------------------------------------------------------------------- /src/styles/element/index.scss: -------------------------------------------------------------------------------- 1 | $--colors: ( 2 | "primary": ( 3 | "base": green, 4 | ), 5 | "success": ( 6 | "base": #21ba45, 7 | ), 8 | "warning": ( 9 | "base": #f2711c, 10 | ), 11 | "danger": ( 12 | "base": #db2828, 13 | ), 14 | "error": ( 15 | "base": #db2828, 16 | ), 17 | "info": ( 18 | "base": #42b8dd, 19 | ), 20 | ); 21 | 22 | // we can add this to custom namespace, default is 'el' 23 | @forward "element-plus/theme-chalk/src/mixins/config.scss" with ( 24 | $namespace: "ep" 25 | ); 26 | 27 | // You should use them in scss, because we calculate it by sass. 28 | // comment next lines to use default color 29 | @forward "element-plus/theme-chalk/src/common/var.scss" with ( 30 | // do not use same name, it will override. 31 | $colors: $--colors, 32 | $button-padding-horizontal: ("default": 50px) 33 | ); 34 | 35 | // if you want to import all 36 | // @use "element-plus/theme-chalk/src/index.scss" as *; 37 | 38 | // You can comment it to hide debug info. 39 | // @debug $--colors; 40 | 41 | // custom dark variables 42 | @use "./dark.scss"; 43 | -------------------------------------------------------------------------------- /src/store/user.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from "pinia"; 2 | import { Login } from "~/api/user"; 3 | import { RequestData } from "~/types/user_type"; 4 | 5 | export const useUserStore = defineStore("user", { 6 | state: () => ({ 7 | username: "", 8 | role: 'STUDENT', 9 | }), 10 | getters: { 11 | 12 | }, 13 | actions: { 14 | //执行登录请求 15 | LoginAction(requestData: RequestData) { 16 | return new Promise((resolve) => { 17 | Login(requestData).then((res) => { 18 | resolve(res) 19 | }).catch(err => { 20 | resolve(err) 21 | }) 22 | }); 23 | }, 24 | testlogin(requestData: RequestData) { 25 | let res: any; 26 | if(requestData.username === '13212341234' && requestData.password === '123456aa') { 27 | this.username = requestData.username 28 | this.role = 'STUDENT' 29 | res = { code: 200, msg: '登录成功', role: 'STUDENT' } 30 | } else { 31 | res = { code: 400, msg: '账号或密码错误' } 32 | } 33 | return new Promise((resolve) => { 34 | resolve(res) 35 | }) 36 | 37 | } 38 | }, 39 | }); -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 『kd-shop』科大二手工坊V2.0 2 | 3 | > 2024年9月3日,我再次回到这个项目,最重要的是积累和坚持✊ 4 | > 不能放弃!! 5 | 6 | ![images](https://img.shields.io/badge/vue-3.4-green) 7 | ![Static Badge](https://img.shields.io/badge/Radixvue-1.9.5-darkgreen) 8 | 9 | 🙆‍♀️项目的灵感是来源于我的2019年毕业设计:[科大二手工坊](https://github.com/lvr1997/kd-second-hand-workshop);科大二手工坊是基于Java语言编写由SSM框架构建,页面是基于jsp+layui编写的,项目相关技术还比较老旧 10 | 11 | 🙋‍♀️而如今,由于我个人职业发展因素的变更以及前端技术的不断更新迭代,我想就这个项目,完成一个新的尝试。也作为我毕业这么长时间以来,对前端方面学习上的一些总结吧。 12 | 13 | ## ⚒️技术选型 14 | 15 | 前端页面使用Vue3+pinia+vue-router。使用Vite构建工具搭建项目 16 | 17 | 学生端:[kd-shop-web](https://github.com/lvr1997/kd-shop-web) 18 | 19 | 管理端+后台 [kd-shop](https://github.com/lvr1997/kd-shop) 20 | 21 | kd-shop项目对我而言,我想实现在我职业技术生涯中的一项新的挑战。 22 | 23 | ## 📖项目介绍 24 | 25 | 一个专为各大高校开发的校园二手交易平台。实现校园内闲置物品的流通交易。真正让闲置物品“活”起来。 26 | 27 | ## 🧠项目脑图 28 | 29 | ![kd-shop.png](./src/scanshoot/kd-shop.png) 30 | 31 | ## 📑项目需求 32 | 33 | 按学生、管理员不同角色登录,学生用户跳转到商铺页,管理用户登入到管理端页面 34 | 35 | ## ⏰更新记录 36 | 37 | - [X] 2022/8/17 项目搭建 38 | - [X] 2022/8/18 首页导航部分完成 39 | - [X] 2022/8/19 首页大图及Banner区 40 | - [x] 学生用户登录(前后端) 41 | - [x] 学生用户注册 42 | - [x] 解决kd-shop-web启动报错问题 43 | 44 | ## 🐞项目Bug与踩坑 45 | 46 | 1. 前端在配置axios请求代理时一定要加上请求前缀baseUrl,否则当前端路由地址刚好与后端接口地址一样时,你会发现惊喜🙃 47 | 48 | ## ⛏️项目二次开发 49 | 50 | ① `Star`本项目; 51 | 52 | ② `Fork`本仓库; 53 | 54 | ③ `clone`项目到本地 55 | 56 | ④ 安装依赖 57 | 58 | ```sh 59 | npm install 60 | ``` 61 | ⑤ 编译并热启动 62 | 63 | ```sh 64 | npm run dev 65 | ``` 66 | 67 | ## 致谢 68 | 69 | ♪(・ω・)ノ最后感谢各位小伙伴们的支持,也希望项目会对你们有所帮助 70 | 71 | -------------------------------------------------------------------------------- /src/assets/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Layer 1 16 | 17 | KD. 18 | Shop 19 | 20 | -------------------------------------------------------------------------------- /src/router/routes.ts: -------------------------------------------------------------------------------- 1 | import Layout from '~/components/layouts/index.vue'; 2 | 3 | const routes = [ 4 | { 5 | path: '/', 6 | name: 'Layout', 7 | redirect: '/home', 8 | component: Layout, 9 | children: [ 10 | { 11 | path: '/home', 12 | name: 'FrontHome', 13 | component: () => import(`~/pages/front/Home.vue`), 14 | meta: { 15 | title: '首页' 16 | } 17 | }, 18 | { 19 | path: '/notice', 20 | name: 'FrontNotice', 21 | component: () => import(`~/pages/front/Notice.vue`), 22 | meta: { 23 | title: '公告' 24 | } 25 | }, 26 | { 27 | path: '/wanted', 28 | name: 'FrontWanted', 29 | component: () => import(`~/pages/front/Wanted.vue`), 30 | meta: { 31 | title: '公告' 32 | } 33 | }, 34 | { 35 | path: '/publish', 36 | name: 'FrontPublish', 37 | component: () => import(`~/pages/front/Publish.vue`), 38 | meta: { 39 | title: '发布闲置' 40 | } 41 | } 42 | ] 43 | }, 44 | { 45 | path: '/login', 46 | name: 'Login', 47 | component: () => import(`~/pages/Login/index.vue`), 48 | meta: { 49 | title: '登录' 50 | } 51 | }, 52 | { path: '/:pathMatch(.*)*', name: '404', component: () => import(`~/pages/error/404.vue`) } 53 | 54 | ] 55 | 56 | export default routes -------------------------------------------------------------------------------- /src/api/request.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | console.log(`====================当前环境:${import.meta.env.VITE_APP_BASE_URL}=======================`); 4 | 5 | 6 | //创建实例 7 | const service = axios.create({ 8 | baseURL: import.meta.env.VITE_APP_BASE_URL, 9 | timeout: 5000, //超时 10 | }); 11 | 12 | //添加请求拦截器 13 | service.interceptors.request.use( 14 | function (config) { 15 | //在发送请求之前做些什么 16 | return config; 17 | }, 18 | function (error) { 19 | console.log(error.request); 20 | const errorData = JSON.parse(error.request.response); 21 | if (errorData.message) { 22 | //判断是否具有message属性 23 | ElMessage({ 24 | message: errorData.message, 25 | type: "error", 26 | }); 27 | } 28 | //对请求错误做些什么 29 | return Promise.reject(errorData); 30 | } 31 | ); 32 | 33 | //添加响 应拦截器 34 | service.interceptors.response.use( 35 | function (response) { 36 | //对响应数据做些什么 37 | console.log("响应数据", response); 38 | const data = response.data; 39 | if (data.resCode === 0) { 40 | return Promise.resolve(data); 41 | } else { 42 | ElMessage({ 43 | message: data.message, 44 | type: "error", 45 | }); 46 | return Promise.reject(data); 47 | } 48 | }, 49 | function (error) { 50 | //对响应错误做些什么 51 | const errorData = JSON.parse(error.request.response); 52 | if (errorData.message) { 53 | //判断是否具有message属性 54 | ElMessage({ 55 | message: errorData.message, 56 | type: "error", 57 | }); 58 | } 59 | 60 | return Promise.reject(errorData); 61 | } 62 | ); 63 | 64 | //暴露service 65 | export default service; -------------------------------------------------------------------------------- /src/components/layouts/BaseHeader.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 47 | 52 | -------------------------------------------------------------------------------- /src/utils/message.ts: -------------------------------------------------------------------------------- 1 | // import { ElMessage, ElMessageBox } from 'element-plus'; 2 | 3 | // 普通信息提示 4 | export const infoMsg = (msgInfo: string) => { 5 | ElMessage({ 6 | type: 'info', 7 | showClose: true, 8 | dangerouslyUseHTMLString: true, 9 | message: msgInfo, 10 | plain: true, 11 | }) 12 | } 13 | 14 | // 成功提示 15 | export const successMsg = (msgInfo: string) => { 16 | ElMessage({ 17 | type: 'success', 18 | showClose: true, 19 | dangerouslyUseHTMLString: true, 20 | message: msgInfo, 21 | plain: true, 22 | }) 23 | } 24 | 25 | // 错误提示 26 | export const errorMsg = (msgInfo: string) => { 27 | ElMessage({ 28 | type: 'error', 29 | showClose: true, 30 | dangerouslyUseHTMLString: true, 31 | message: msgInfo, 32 | plain: true, 33 | }) 34 | } 35 | 36 | // 警告提示 37 | export const warnMsg = (msgInfo: string) => { 38 | ElMessage({ 39 | type: 'warning', 40 | showClose: true, 41 | dangerouslyUseHTMLString: true, 42 | message: msgInfo, 43 | plain: true, 44 | }) 45 | } 46 | 47 | // 带一个确定按钮或是按钮的alertBox 48 | export const alertBox = (msg: string, btnName: string, type: any, title?: string,) => { 49 | let confirmName = btnName == '确定' ? '确定' : '是' 50 | return ElMessageBox.alert(msg, title || '提示', { 51 | type: type || 'warning', 52 | confirmButtonText: confirmName, 53 | buttonSize: "default", 54 | dangerouslyUseHTMLString: true 55 | }); 56 | 57 | } 58 | // 带确定取消按钮或者是否按钮的弹出提示框 59 | export const confirmBox = (msg: string, btnName: string, type: any, title?: string,) => { 60 | let confirmName = btnName == '确定' ? '确定' : '是' 61 | let cancelsName = btnName == '确定' ? '取消' : '否' 62 | return ElMessageBox.confirm(msg, title || '提示', { 63 | type: type || 'warning', 64 | confirmButtonText: confirmName, 65 | cancelButtonText: cancelsName, 66 | buttonSize: "default", 67 | closeOnClickModal: false, 68 | closeOnPressEscape: false, 69 | dangerouslyUseHTMLString: true 70 | }) 71 | } 72 | -------------------------------------------------------------------------------- /src/pages/front/Notice.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 48 | 49 | -------------------------------------------------------------------------------- /src/components/layouts/BaseSide.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | -------------------------------------------------------------------------------- /src/pages/front/Wanted.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 60 | 61 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import vue from '@vitejs/plugin-vue' 2 | import path from 'path' 3 | import { defineConfig } from 'vite' 4 | 5 | import AutoImport from 'unplugin-auto-import/vite' 6 | import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' 7 | import Components from 'unplugin-vue-components/vite' 8 | 9 | import { 10 | presetAttributify, 11 | presetIcons, 12 | presetUno, 13 | transformerDirectives, 14 | transformerVariantGroup, 15 | } from 'unocss' 16 | import Unocss from 'unocss/vite' 17 | 18 | const pathSrc = path.resolve(__dirname, 'src') 19 | 20 | // https://vitejs.dev/config/ 21 | export default defineConfig({ 22 | server: { 23 | port: 8080, 24 | proxy: { 25 | '/devApi': { 26 | target: 'http://localhost:3000', 27 | changeOrigin: true, 28 | rewrite: (path) => path.replace(/^\/devApi/, ''), 29 | } 30 | } 31 | }, 32 | resolve: { 33 | alias: { 34 | '~/': `${pathSrc}/`, 35 | }, 36 | }, 37 | css: { 38 | preprocessorOptions: { 39 | scss: { 40 | api: 'modern-compiler', 41 | additionalData: `@use "~/styles/element/index.scss" as *;`, 42 | }, 43 | }, 44 | }, 45 | plugins: [ 46 | vue(), 47 | AutoImport({ 48 | imports: ["vue", "@vueuse/core", "pinia", "vue-router"], 49 | dts: 'src/auto-imports.d.ts', 50 | //elements 51 | resolvers: [ElementPlusResolver()], 52 | vueTemplate: true, 53 | }), 54 | Components({ 55 | // allow auto load markdown components under `./src/components/` 56 | extensions: ['vue', 'md'], 57 | // allow auto import and register components used in markdown 58 | include: [/\.vue$/, /\.vue\?vue/, /\.md$/], 59 | resolvers: [ 60 | ElementPlusResolver({ 61 | importStyle: 'sass', 62 | }), 63 | ], 64 | dts: 'src/components.d.ts', 65 | }), 66 | 67 | // https://github.com/antfu/unocss 68 | // see unocss.config.ts for config 69 | Unocss({ 70 | presets: [ 71 | presetUno(), 72 | presetAttributify(), 73 | presetIcons({ 74 | scale: 1.2, 75 | warn: true, 76 | }), 77 | ], 78 | transformers: [ 79 | transformerDirectives(), 80 | transformerVariantGroup(), 81 | ] 82 | }), 83 | ], 84 | }) 85 | -------------------------------------------------------------------------------- /src/components/layouts/BaseFooter.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | -------------------------------------------------------------------------------- /src/pages/front/Home.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 74 | 75 | 96 | -------------------------------------------------------------------------------- /src/components.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // Generated by unplugin-vue-components 5 | // Read more: https://github.com/vuejs/core/pull/3399 6 | export {} 7 | 8 | declare module 'vue' { 9 | export interface GlobalComponents { 10 | BaseFooter: typeof import('./components/layouts/BaseFooter.vue')['default'] 11 | BaseHeader: typeof import('./components/layouts/BaseHeader.vue')['default'] 12 | BaseSide: typeof import('./components/layouts/BaseSide.vue')['default'] 13 | ElBacktop: typeof import('element-plus/es')['ElBacktop'] 14 | ElButton: typeof import('element-plus/es')['ElButton'] 15 | ElCard: typeof import('element-plus/es')['ElCard'] 16 | ElCarousel: typeof import('element-plus/es')['ElCarousel'] 17 | ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem'] 18 | ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] 19 | ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] 20 | ElCol: typeof import('element-plus/es')['ElCol'] 21 | ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] 22 | ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] 23 | ElDialog: typeof import('element-plus/es')['ElDialog'] 24 | ElForm: typeof import('element-plus/es')['ElForm'] 25 | ElFormItem: typeof import('element-plus/es')['ElFormItem'] 26 | ElIcon: typeof import('element-plus/es')['ElIcon'] 27 | ElInput: typeof import('element-plus/es')['ElInput'] 28 | ElMenu: typeof import('element-plus/es')['ElMenu'] 29 | ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] 30 | ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup'] 31 | ElOption: typeof import('element-plus/es')['ElOption'] 32 | ElPopover: typeof import('element-plus/es')['ElPopover'] 33 | ElRadio: typeof import('element-plus/es')['ElRadio'] 34 | ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] 35 | ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] 36 | ElRow: typeof import('element-plus/es')['ElRow'] 37 | ElSelect: typeof import('element-plus/es')['ElSelect'] 38 | ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] 39 | ElSwitch: typeof import('element-plus/es')['ElSwitch'] 40 | ElTable: typeof import('element-plus/es')['ElTable'] 41 | ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] 42 | ElTag: typeof import('element-plus/es')['ElTag'] 43 | ElTimePicker: typeof import('element-plus/es')['ElTimePicker'] 44 | ElUpload: typeof import('element-plus/es')['ElUpload'] 45 | HelloWorld: typeof import('./components/HelloWorld.vue')['default'] 46 | Layouts: typeof import('./components/layouts/index.vue')['default'] 47 | Login: typeof import('./components/Login/index.vue')['default'] 48 | Logos: typeof import('./components/Logos.vue')['default'] 49 | RouterLink: typeof import('vue-router')['RouterLink'] 50 | RouterView: typeof import('vue-router')['RouterView'] 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/pages/front/Publish.vue: -------------------------------------------------------------------------------- 1 | 71 | 72 | -------------------------------------------------------------------------------- /src/pages/Login/index.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | 267 | 268 | 269 | -------------------------------------------------------------------------------- /src/auto-imports.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // noinspection JSUnusedGlobalSymbols 5 | // Generated by unplugin-auto-import 6 | // biome-ignore lint: disable 7 | export {} 8 | declare global { 9 | const EffectScope: typeof import('vue')['EffectScope'] 10 | const ElMessage: typeof import('element-plus/es')['ElMessage'] 11 | const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] 12 | const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] 13 | const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] 14 | const autoResetRef: typeof import('@vueuse/core')['autoResetRef'] 15 | const computed: typeof import('vue')['computed'] 16 | const computedAsync: typeof import('@vueuse/core')['computedAsync'] 17 | const computedEager: typeof import('@vueuse/core')['computedEager'] 18 | const computedInject: typeof import('@vueuse/core')['computedInject'] 19 | const computedWithControl: typeof import('@vueuse/core')['computedWithControl'] 20 | const controlledComputed: typeof import('@vueuse/core')['controlledComputed'] 21 | const controlledRef: typeof import('@vueuse/core')['controlledRef'] 22 | const createApp: typeof import('vue')['createApp'] 23 | const createEventHook: typeof import('@vueuse/core')['createEventHook'] 24 | const createGlobalState: typeof import('@vueuse/core')['createGlobalState'] 25 | const createInjectionState: typeof import('@vueuse/core')['createInjectionState'] 26 | const createPinia: typeof import('pinia')['createPinia'] 27 | const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn'] 28 | const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable'] 29 | const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn'] 30 | const customRef: typeof import('vue')['customRef'] 31 | const debouncedRef: typeof import('@vueuse/core')['debouncedRef'] 32 | const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch'] 33 | const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] 34 | const defineComponent: typeof import('vue')['defineComponent'] 35 | const defineStore: typeof import('pinia')['defineStore'] 36 | const eagerComputed: typeof import('@vueuse/core')['eagerComputed'] 37 | const effectScope: typeof import('vue')['effectScope'] 38 | const extendRef: typeof import('@vueuse/core')['extendRef'] 39 | const getActivePinia: typeof import('pinia')['getActivePinia'] 40 | const getCurrentInstance: typeof import('vue')['getCurrentInstance'] 41 | const getCurrentScope: typeof import('vue')['getCurrentScope'] 42 | const h: typeof import('vue')['h'] 43 | const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] 44 | const inject: typeof import('vue')['inject'] 45 | const isDefined: typeof import('@vueuse/core')['isDefined'] 46 | const isProxy: typeof import('vue')['isProxy'] 47 | const isReactive: typeof import('vue')['isReactive'] 48 | const isReadonly: typeof import('vue')['isReadonly'] 49 | const isRef: typeof import('vue')['isRef'] 50 | const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] 51 | const mapActions: typeof import('pinia')['mapActions'] 52 | const mapGetters: typeof import('pinia')['mapGetters'] 53 | const mapState: typeof import('pinia')['mapState'] 54 | const mapStores: typeof import('pinia')['mapStores'] 55 | const mapWritableState: typeof import('pinia')['mapWritableState'] 56 | const markRaw: typeof import('vue')['markRaw'] 57 | const nextTick: typeof import('vue')['nextTick'] 58 | const onActivated: typeof import('vue')['onActivated'] 59 | const onBeforeMount: typeof import('vue')['onBeforeMount'] 60 | const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] 61 | const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] 62 | const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] 63 | const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] 64 | const onClickOutside: typeof import('@vueuse/core')['onClickOutside'] 65 | const onDeactivated: typeof import('vue')['onDeactivated'] 66 | const onErrorCaptured: typeof import('vue')['onErrorCaptured'] 67 | const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke'] 68 | const onLongPress: typeof import('@vueuse/core')['onLongPress'] 69 | const onMounted: typeof import('vue')['onMounted'] 70 | const onRenderTracked: typeof import('vue')['onRenderTracked'] 71 | const onRenderTriggered: typeof import('vue')['onRenderTriggered'] 72 | const onScopeDispose: typeof import('vue')['onScopeDispose'] 73 | const onServerPrefetch: typeof import('vue')['onServerPrefetch'] 74 | const onStartTyping: typeof import('@vueuse/core')['onStartTyping'] 75 | const onUnmounted: typeof import('vue')['onUnmounted'] 76 | const onUpdated: typeof import('vue')['onUpdated'] 77 | const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] 78 | const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] 79 | const provide: typeof import('vue')['provide'] 80 | const reactify: typeof import('@vueuse/core')['reactify'] 81 | const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] 82 | const reactive: typeof import('vue')['reactive'] 83 | const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed'] 84 | const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit'] 85 | const reactivePick: typeof import('@vueuse/core')['reactivePick'] 86 | const readonly: typeof import('vue')['readonly'] 87 | const ref: typeof import('vue')['ref'] 88 | const refAutoReset: typeof import('@vueuse/core')['refAutoReset'] 89 | const refDebounced: typeof import('@vueuse/core')['refDebounced'] 90 | const refDefault: typeof import('@vueuse/core')['refDefault'] 91 | const refThrottled: typeof import('@vueuse/core')['refThrottled'] 92 | const refWithControl: typeof import('@vueuse/core')['refWithControl'] 93 | const resolveComponent: typeof import('vue')['resolveComponent'] 94 | const resolveRef: typeof import('@vueuse/core')['resolveRef'] 95 | const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] 96 | const setActivePinia: typeof import('pinia')['setActivePinia'] 97 | const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix'] 98 | const shallowReactive: typeof import('vue')['shallowReactive'] 99 | const shallowReadonly: typeof import('vue')['shallowReadonly'] 100 | const shallowRef: typeof import('vue')['shallowRef'] 101 | const storeToRefs: typeof import('pinia')['storeToRefs'] 102 | const syncRef: typeof import('@vueuse/core')['syncRef'] 103 | const syncRefs: typeof import('@vueuse/core')['syncRefs'] 104 | const templateRef: typeof import('@vueuse/core')['templateRef'] 105 | const throttledRef: typeof import('@vueuse/core')['throttledRef'] 106 | const throttledWatch: typeof import('@vueuse/core')['throttledWatch'] 107 | const toRaw: typeof import('vue')['toRaw'] 108 | const toReactive: typeof import('@vueuse/core')['toReactive'] 109 | const toRef: typeof import('vue')['toRef'] 110 | const toRefs: typeof import('vue')['toRefs'] 111 | const toValue: typeof import('vue')['toValue'] 112 | const triggerRef: typeof import('vue')['triggerRef'] 113 | const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount'] 114 | const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount'] 115 | const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted'] 116 | const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose'] 117 | const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted'] 118 | const unref: typeof import('vue')['unref'] 119 | const unrefElement: typeof import('@vueuse/core')['unrefElement'] 120 | const until: typeof import('@vueuse/core')['until'] 121 | const useActiveElement: typeof import('@vueuse/core')['useActiveElement'] 122 | const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery'] 123 | const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter'] 124 | const useArrayFind: typeof import('@vueuse/core')['useArrayFind'] 125 | const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex'] 126 | const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast'] 127 | const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin'] 128 | const useArrayMap: typeof import('@vueuse/core')['useArrayMap'] 129 | const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce'] 130 | const useArraySome: typeof import('@vueuse/core')['useArraySome'] 131 | const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique'] 132 | const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue'] 133 | const useAsyncState: typeof import('@vueuse/core')['useAsyncState'] 134 | const useAttrs: typeof import('vue')['useAttrs'] 135 | const useBase64: typeof import('@vueuse/core')['useBase64'] 136 | const useBattery: typeof import('@vueuse/core')['useBattery'] 137 | const useBluetooth: typeof import('@vueuse/core')['useBluetooth'] 138 | const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints'] 139 | const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel'] 140 | const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] 141 | const useCached: typeof import('@vueuse/core')['useCached'] 142 | const useClipboard: typeof import('@vueuse/core')['useClipboard'] 143 | const useCloned: typeof import('@vueuse/core')['useCloned'] 144 | const useColorMode: typeof import('@vueuse/core')['useColorMode'] 145 | const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] 146 | const useCounter: typeof import('@vueuse/core')['useCounter'] 147 | const useCssModule: typeof import('vue')['useCssModule'] 148 | const useCssVar: typeof import('@vueuse/core')['useCssVar'] 149 | const useCssVars: typeof import('vue')['useCssVars'] 150 | const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement'] 151 | const useCycleList: typeof import('@vueuse/core')['useCycleList'] 152 | const useDark: typeof import('@vueuse/core')['useDark'] 153 | const useDateFormat: typeof import('@vueuse/core')['useDateFormat'] 154 | const useDebounce: typeof import('@vueuse/core')['useDebounce'] 155 | const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn'] 156 | const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory'] 157 | const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion'] 158 | const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation'] 159 | const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio'] 160 | const useDevicesList: typeof import('@vueuse/core')['useDevicesList'] 161 | const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia'] 162 | const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility'] 163 | const useDraggable: typeof import('@vueuse/core')['useDraggable'] 164 | const useDropZone: typeof import('@vueuse/core')['useDropZone'] 165 | const useElementBounding: typeof import('@vueuse/core')['useElementBounding'] 166 | const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint'] 167 | const useElementHover: typeof import('@vueuse/core')['useElementHover'] 168 | const useElementSize: typeof import('@vueuse/core')['useElementSize'] 169 | const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility'] 170 | const useEventBus: typeof import('@vueuse/core')['useEventBus'] 171 | const useEventListener: typeof import('@vueuse/core')['useEventListener'] 172 | const useEventSource: typeof import('@vueuse/core')['useEventSource'] 173 | const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper'] 174 | const useFavicon: typeof import('@vueuse/core')['useFavicon'] 175 | const useFetch: typeof import('@vueuse/core')['useFetch'] 176 | const useFileDialog: typeof import('@vueuse/core')['useFileDialog'] 177 | const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess'] 178 | const useFocus: typeof import('@vueuse/core')['useFocus'] 179 | const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin'] 180 | const useFps: typeof import('@vueuse/core')['useFps'] 181 | const useFullscreen: typeof import('@vueuse/core')['useFullscreen'] 182 | const useGamepad: typeof import('@vueuse/core')['useGamepad'] 183 | const useGeolocation: typeof import('@vueuse/core')['useGeolocation'] 184 | const useId: typeof import('vue')['useId'] 185 | const useIdle: typeof import('@vueuse/core')['useIdle'] 186 | const useImage: typeof import('@vueuse/core')['useImage'] 187 | const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] 188 | const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver'] 189 | const useInterval: typeof import('@vueuse/core')['useInterval'] 190 | const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] 191 | const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] 192 | const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] 193 | const useLink: typeof import('vue-router')['useLink'] 194 | const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] 195 | const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys'] 196 | const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory'] 197 | const useMediaControls: typeof import('@vueuse/core')['useMediaControls'] 198 | const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery'] 199 | const useMemoize: typeof import('@vueuse/core')['useMemoize'] 200 | const useMemory: typeof import('@vueuse/core')['useMemory'] 201 | const useModel: typeof import('vue')['useModel'] 202 | const useMounted: typeof import('@vueuse/core')['useMounted'] 203 | const useMouse: typeof import('@vueuse/core')['useMouse'] 204 | const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement'] 205 | const useMousePressed: typeof import('@vueuse/core')['useMousePressed'] 206 | const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver'] 207 | const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage'] 208 | const useNetwork: typeof import('@vueuse/core')['useNetwork'] 209 | const useNow: typeof import('@vueuse/core')['useNow'] 210 | const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl'] 211 | const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination'] 212 | const useOnline: typeof import('@vueuse/core')['useOnline'] 213 | const usePageLeave: typeof import('@vueuse/core')['usePageLeave'] 214 | const useParallax: typeof import('@vueuse/core')['useParallax'] 215 | const usePermission: typeof import('@vueuse/core')['usePermission'] 216 | const usePointer: typeof import('@vueuse/core')['usePointer'] 217 | const usePointerLock: typeof import('@vueuse/core')['usePointerLock'] 218 | const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe'] 219 | const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme'] 220 | const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast'] 221 | const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark'] 222 | const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages'] 223 | const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] 224 | const usePrevious: typeof import('@vueuse/core')['usePrevious'] 225 | const useRafFn: typeof import('@vueuse/core')['useRafFn'] 226 | const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] 227 | const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] 228 | const useRoute: typeof import('vue-router')['useRoute'] 229 | const useRouter: typeof import('vue-router')['useRouter'] 230 | const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] 231 | const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea'] 232 | const useScriptTag: typeof import('@vueuse/core')['useScriptTag'] 233 | const useScroll: typeof import('@vueuse/core')['useScroll'] 234 | const useScrollLock: typeof import('@vueuse/core')['useScrollLock'] 235 | const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage'] 236 | const useShare: typeof import('@vueuse/core')['useShare'] 237 | const useSlots: typeof import('vue')['useSlots'] 238 | const useSorted: typeof import('@vueuse/core')['useSorted'] 239 | const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition'] 240 | const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis'] 241 | const useStepper: typeof import('@vueuse/core')['useStepper'] 242 | const useStorage: typeof import('@vueuse/core')['useStorage'] 243 | const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync'] 244 | const useStyleTag: typeof import('@vueuse/core')['useStyleTag'] 245 | const useSupported: typeof import('@vueuse/core')['useSupported'] 246 | const useSwipe: typeof import('@vueuse/core')['useSwipe'] 247 | const useTemplateRef: typeof import('vue')['useTemplateRef'] 248 | const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList'] 249 | const useTextDirection: typeof import('@vueuse/core')['useTextDirection'] 250 | const useTextSelection: typeof import('@vueuse/core')['useTextSelection'] 251 | const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize'] 252 | const useThrottle: typeof import('@vueuse/core')['useThrottle'] 253 | const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn'] 254 | const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory'] 255 | const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo'] 256 | const useTimeout: typeof import('@vueuse/core')['useTimeout'] 257 | const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn'] 258 | const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll'] 259 | const useTimestamp: typeof import('@vueuse/core')['useTimestamp'] 260 | const useTitle: typeof import('@vueuse/core')['useTitle'] 261 | const useToNumber: typeof import('@vueuse/core')['useToNumber'] 262 | const useToString: typeof import('@vueuse/core')['useToString'] 263 | const useToggle: typeof import('@vueuse/core')['useToggle'] 264 | const useTransition: typeof import('@vueuse/core')['useTransition'] 265 | const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams'] 266 | const useUserMedia: typeof import('@vueuse/core')['useUserMedia'] 267 | const useVModel: typeof import('@vueuse/core')['useVModel'] 268 | const useVModels: typeof import('@vueuse/core')['useVModels'] 269 | const useVibrate: typeof import('@vueuse/core')['useVibrate'] 270 | const useVirtualList: typeof import('@vueuse/core')['useVirtualList'] 271 | const useWakeLock: typeof import('@vueuse/core')['useWakeLock'] 272 | const useWebNotification: typeof import('@vueuse/core')['useWebNotification'] 273 | const useWebSocket: typeof import('@vueuse/core')['useWebSocket'] 274 | const useWebWorker: typeof import('@vueuse/core')['useWebWorker'] 275 | const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn'] 276 | const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus'] 277 | const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll'] 278 | const useWindowSize: typeof import('@vueuse/core')['useWindowSize'] 279 | const watch: typeof import('vue')['watch'] 280 | const watchArray: typeof import('@vueuse/core')['watchArray'] 281 | const watchAtMost: typeof import('@vueuse/core')['watchAtMost'] 282 | const watchDebounced: typeof import('@vueuse/core')['watchDebounced'] 283 | const watchEffect: typeof import('vue')['watchEffect'] 284 | const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable'] 285 | const watchOnce: typeof import('@vueuse/core')['watchOnce'] 286 | const watchPausable: typeof import('@vueuse/core')['watchPausable'] 287 | const watchPostEffect: typeof import('vue')['watchPostEffect'] 288 | const watchSyncEffect: typeof import('vue')['watchSyncEffect'] 289 | const watchThrottled: typeof import('@vueuse/core')['watchThrottled'] 290 | const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable'] 291 | const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter'] 292 | const whenever: typeof import('@vueuse/core')['whenever'] 293 | } 294 | // for type re-export 295 | declare global { 296 | // @ts-ignore 297 | export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' 298 | import('vue') 299 | } 300 | // for vue template auto import 301 | import { UnwrapRef } from 'vue' 302 | declare module 'vue' { 303 | interface GlobalComponents {} 304 | interface ComponentCustomProperties { 305 | readonly EffectScope: UnwrapRef 306 | readonly ElMessage: UnwrapRef 307 | readonly ElMessageBox: UnwrapRef 308 | readonly acceptHMRUpdate: UnwrapRef 309 | readonly asyncComputed: UnwrapRef 310 | readonly autoResetRef: UnwrapRef 311 | readonly computed: UnwrapRef 312 | readonly computedAsync: UnwrapRef 313 | readonly computedEager: UnwrapRef 314 | readonly computedInject: UnwrapRef 315 | readonly computedWithControl: UnwrapRef 316 | readonly controlledComputed: UnwrapRef 317 | readonly controlledRef: UnwrapRef 318 | readonly createApp: UnwrapRef 319 | readonly createEventHook: UnwrapRef 320 | readonly createGlobalState: UnwrapRef 321 | readonly createInjectionState: UnwrapRef 322 | readonly createPinia: UnwrapRef 323 | readonly createReactiveFn: UnwrapRef 324 | readonly createSharedComposable: UnwrapRef 325 | readonly createUnrefFn: UnwrapRef 326 | readonly customRef: UnwrapRef 327 | readonly debouncedRef: UnwrapRef 328 | readonly debouncedWatch: UnwrapRef 329 | readonly defineAsyncComponent: UnwrapRef 330 | readonly defineComponent: UnwrapRef 331 | readonly defineStore: UnwrapRef 332 | readonly eagerComputed: UnwrapRef 333 | readonly effectScope: UnwrapRef 334 | readonly extendRef: UnwrapRef 335 | readonly getActivePinia: UnwrapRef 336 | readonly getCurrentInstance: UnwrapRef 337 | readonly getCurrentScope: UnwrapRef 338 | readonly h: UnwrapRef 339 | readonly ignorableWatch: UnwrapRef 340 | readonly inject: UnwrapRef 341 | readonly isDefined: UnwrapRef 342 | readonly isProxy: UnwrapRef 343 | readonly isReactive: UnwrapRef 344 | readonly isReadonly: UnwrapRef 345 | readonly isRef: UnwrapRef 346 | readonly makeDestructurable: UnwrapRef 347 | readonly mapActions: UnwrapRef 348 | readonly mapGetters: UnwrapRef 349 | readonly mapState: UnwrapRef 350 | readonly mapStores: UnwrapRef 351 | readonly mapWritableState: UnwrapRef 352 | readonly markRaw: UnwrapRef 353 | readonly nextTick: UnwrapRef 354 | readonly onActivated: UnwrapRef 355 | readonly onBeforeMount: UnwrapRef 356 | readonly onBeforeRouteLeave: UnwrapRef 357 | readonly onBeforeRouteUpdate: UnwrapRef 358 | readonly onBeforeUnmount: UnwrapRef 359 | readonly onBeforeUpdate: UnwrapRef 360 | readonly onClickOutside: UnwrapRef 361 | readonly onDeactivated: UnwrapRef 362 | readonly onErrorCaptured: UnwrapRef 363 | readonly onKeyStroke: UnwrapRef 364 | readonly onLongPress: UnwrapRef 365 | readonly onMounted: UnwrapRef 366 | readonly onRenderTracked: UnwrapRef 367 | readonly onRenderTriggered: UnwrapRef 368 | readonly onScopeDispose: UnwrapRef 369 | readonly onServerPrefetch: UnwrapRef 370 | readonly onStartTyping: UnwrapRef 371 | readonly onUnmounted: UnwrapRef 372 | readonly onUpdated: UnwrapRef 373 | readonly onWatcherCleanup: UnwrapRef 374 | readonly pausableWatch: UnwrapRef 375 | readonly provide: UnwrapRef 376 | readonly reactify: UnwrapRef 377 | readonly reactifyObject: UnwrapRef 378 | readonly reactive: UnwrapRef 379 | readonly reactiveComputed: UnwrapRef 380 | readonly reactiveOmit: UnwrapRef 381 | readonly reactivePick: UnwrapRef 382 | readonly readonly: UnwrapRef 383 | readonly ref: UnwrapRef 384 | readonly refAutoReset: UnwrapRef 385 | readonly refDebounced: UnwrapRef 386 | readonly refDefault: UnwrapRef 387 | readonly refThrottled: UnwrapRef 388 | readonly refWithControl: UnwrapRef 389 | readonly resolveComponent: UnwrapRef 390 | readonly resolveRef: UnwrapRef 391 | readonly resolveUnref: UnwrapRef 392 | readonly setActivePinia: UnwrapRef 393 | readonly setMapStoreSuffix: UnwrapRef 394 | readonly shallowReactive: UnwrapRef 395 | readonly shallowReadonly: UnwrapRef 396 | readonly shallowRef: UnwrapRef 397 | readonly storeToRefs: UnwrapRef 398 | readonly syncRef: UnwrapRef 399 | readonly syncRefs: UnwrapRef 400 | readonly templateRef: UnwrapRef 401 | readonly throttledRef: UnwrapRef 402 | readonly throttledWatch: UnwrapRef 403 | readonly toRaw: UnwrapRef 404 | readonly toReactive: UnwrapRef 405 | readonly toRef: UnwrapRef 406 | readonly toRefs: UnwrapRef 407 | readonly toValue: UnwrapRef 408 | readonly triggerRef: UnwrapRef 409 | readonly tryOnBeforeMount: UnwrapRef 410 | readonly tryOnBeforeUnmount: UnwrapRef 411 | readonly tryOnMounted: UnwrapRef 412 | readonly tryOnScopeDispose: UnwrapRef 413 | readonly tryOnUnmounted: UnwrapRef 414 | readonly unref: UnwrapRef 415 | readonly unrefElement: UnwrapRef 416 | readonly until: UnwrapRef 417 | readonly useActiveElement: UnwrapRef 418 | readonly useArrayEvery: UnwrapRef 419 | readonly useArrayFilter: UnwrapRef 420 | readonly useArrayFind: UnwrapRef 421 | readonly useArrayFindIndex: UnwrapRef 422 | readonly useArrayFindLast: UnwrapRef 423 | readonly useArrayJoin: UnwrapRef 424 | readonly useArrayMap: UnwrapRef 425 | readonly useArrayReduce: UnwrapRef 426 | readonly useArraySome: UnwrapRef 427 | readonly useArrayUnique: UnwrapRef 428 | readonly useAsyncQueue: UnwrapRef 429 | readonly useAsyncState: UnwrapRef 430 | readonly useAttrs: UnwrapRef 431 | readonly useBase64: UnwrapRef 432 | readonly useBattery: UnwrapRef 433 | readonly useBluetooth: UnwrapRef 434 | readonly useBreakpoints: UnwrapRef 435 | readonly useBroadcastChannel: UnwrapRef 436 | readonly useBrowserLocation: UnwrapRef 437 | readonly useCached: UnwrapRef 438 | readonly useClipboard: UnwrapRef 439 | readonly useCloned: UnwrapRef 440 | readonly useColorMode: UnwrapRef 441 | readonly useConfirmDialog: UnwrapRef 442 | readonly useCounter: UnwrapRef 443 | readonly useCssModule: UnwrapRef 444 | readonly useCssVar: UnwrapRef 445 | readonly useCssVars: UnwrapRef 446 | readonly useCurrentElement: UnwrapRef 447 | readonly useCycleList: UnwrapRef 448 | readonly useDark: UnwrapRef 449 | readonly useDateFormat: UnwrapRef 450 | readonly useDebounce: UnwrapRef 451 | readonly useDebounceFn: UnwrapRef 452 | readonly useDebouncedRefHistory: UnwrapRef 453 | readonly useDeviceMotion: UnwrapRef 454 | readonly useDeviceOrientation: UnwrapRef 455 | readonly useDevicePixelRatio: UnwrapRef 456 | readonly useDevicesList: UnwrapRef 457 | readonly useDisplayMedia: UnwrapRef 458 | readonly useDocumentVisibility: UnwrapRef 459 | readonly useDraggable: UnwrapRef 460 | readonly useDropZone: UnwrapRef 461 | readonly useElementBounding: UnwrapRef 462 | readonly useElementByPoint: UnwrapRef 463 | readonly useElementHover: UnwrapRef 464 | readonly useElementSize: UnwrapRef 465 | readonly useElementVisibility: UnwrapRef 466 | readonly useEventBus: UnwrapRef 467 | readonly useEventListener: UnwrapRef 468 | readonly useEventSource: UnwrapRef 469 | readonly useEyeDropper: UnwrapRef 470 | readonly useFavicon: UnwrapRef 471 | readonly useFetch: UnwrapRef 472 | readonly useFileDialog: UnwrapRef 473 | readonly useFileSystemAccess: UnwrapRef 474 | readonly useFocus: UnwrapRef 475 | readonly useFocusWithin: UnwrapRef 476 | readonly useFps: UnwrapRef 477 | readonly useFullscreen: UnwrapRef 478 | readonly useGamepad: UnwrapRef 479 | readonly useGeolocation: UnwrapRef 480 | readonly useId: UnwrapRef 481 | readonly useIdle: UnwrapRef 482 | readonly useImage: UnwrapRef 483 | readonly useInfiniteScroll: UnwrapRef 484 | readonly useIntersectionObserver: UnwrapRef 485 | readonly useInterval: UnwrapRef 486 | readonly useIntervalFn: UnwrapRef 487 | readonly useKeyModifier: UnwrapRef 488 | readonly useLastChanged: UnwrapRef 489 | readonly useLink: UnwrapRef 490 | readonly useLocalStorage: UnwrapRef 491 | readonly useMagicKeys: UnwrapRef 492 | readonly useManualRefHistory: UnwrapRef 493 | readonly useMediaControls: UnwrapRef 494 | readonly useMediaQuery: UnwrapRef 495 | readonly useMemoize: UnwrapRef 496 | readonly useMemory: UnwrapRef 497 | readonly useModel: UnwrapRef 498 | readonly useMounted: UnwrapRef 499 | readonly useMouse: UnwrapRef 500 | readonly useMouseInElement: UnwrapRef 501 | readonly useMousePressed: UnwrapRef 502 | readonly useMutationObserver: UnwrapRef 503 | readonly useNavigatorLanguage: UnwrapRef 504 | readonly useNetwork: UnwrapRef 505 | readonly useNow: UnwrapRef 506 | readonly useObjectUrl: UnwrapRef 507 | readonly useOffsetPagination: UnwrapRef 508 | readonly useOnline: UnwrapRef 509 | readonly usePageLeave: UnwrapRef 510 | readonly useParallax: UnwrapRef 511 | readonly usePermission: UnwrapRef 512 | readonly usePointer: UnwrapRef 513 | readonly usePointerLock: UnwrapRef 514 | readonly usePointerSwipe: UnwrapRef 515 | readonly usePreferredColorScheme: UnwrapRef 516 | readonly usePreferredContrast: UnwrapRef 517 | readonly usePreferredDark: UnwrapRef 518 | readonly usePreferredLanguages: UnwrapRef 519 | readonly usePreferredReducedMotion: UnwrapRef 520 | readonly usePrevious: UnwrapRef 521 | readonly useRafFn: UnwrapRef 522 | readonly useRefHistory: UnwrapRef 523 | readonly useResizeObserver: UnwrapRef 524 | readonly useRoute: UnwrapRef 525 | readonly useRouter: UnwrapRef 526 | readonly useScreenOrientation: UnwrapRef 527 | readonly useScreenSafeArea: UnwrapRef 528 | readonly useScriptTag: UnwrapRef 529 | readonly useScroll: UnwrapRef 530 | readonly useScrollLock: UnwrapRef 531 | readonly useSessionStorage: UnwrapRef 532 | readonly useShare: UnwrapRef 533 | readonly useSlots: UnwrapRef 534 | readonly useSorted: UnwrapRef 535 | readonly useSpeechRecognition: UnwrapRef 536 | readonly useSpeechSynthesis: UnwrapRef 537 | readonly useStepper: UnwrapRef 538 | readonly useStorage: UnwrapRef 539 | readonly useStorageAsync: UnwrapRef 540 | readonly useStyleTag: UnwrapRef 541 | readonly useSupported: UnwrapRef 542 | readonly useSwipe: UnwrapRef 543 | readonly useTemplateRef: UnwrapRef 544 | readonly useTemplateRefsList: UnwrapRef 545 | readonly useTextDirection: UnwrapRef 546 | readonly useTextSelection: UnwrapRef 547 | readonly useTextareaAutosize: UnwrapRef 548 | readonly useThrottle: UnwrapRef 549 | readonly useThrottleFn: UnwrapRef 550 | readonly useThrottledRefHistory: UnwrapRef 551 | readonly useTimeAgo: UnwrapRef 552 | readonly useTimeout: UnwrapRef 553 | readonly useTimeoutFn: UnwrapRef 554 | readonly useTimeoutPoll: UnwrapRef 555 | readonly useTimestamp: UnwrapRef 556 | readonly useTitle: UnwrapRef 557 | readonly useToNumber: UnwrapRef 558 | readonly useToString: UnwrapRef 559 | readonly useToggle: UnwrapRef 560 | readonly useTransition: UnwrapRef 561 | readonly useUrlSearchParams: UnwrapRef 562 | readonly useUserMedia: UnwrapRef 563 | readonly useVModel: UnwrapRef 564 | readonly useVModels: UnwrapRef 565 | readonly useVibrate: UnwrapRef 566 | readonly useVirtualList: UnwrapRef 567 | readonly useWakeLock: UnwrapRef 568 | readonly useWebNotification: UnwrapRef 569 | readonly useWebSocket: UnwrapRef 570 | readonly useWebWorker: UnwrapRef 571 | readonly useWebWorkerFn: UnwrapRef 572 | readonly useWindowFocus: UnwrapRef 573 | readonly useWindowScroll: UnwrapRef 574 | readonly useWindowSize: UnwrapRef 575 | readonly watch: UnwrapRef 576 | readonly watchArray: UnwrapRef 577 | readonly watchAtMost: UnwrapRef 578 | readonly watchDebounced: UnwrapRef 579 | readonly watchEffect: UnwrapRef 580 | readonly watchIgnorable: UnwrapRef 581 | readonly watchOnce: UnwrapRef 582 | readonly watchPausable: UnwrapRef 583 | readonly watchPostEffect: UnwrapRef 584 | readonly watchSyncEffect: UnwrapRef 585 | readonly watchThrottled: UnwrapRef 586 | readonly watchTriggerable: UnwrapRef 587 | readonly watchWithFilter: UnwrapRef 588 | readonly whenever: UnwrapRef 589 | } 590 | } 591 | --------------------------------------------------------------------------------