├── 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 |
2 |
5 |
6 |
7 |
9 |
10 |
13 |
--------------------------------------------------------------------------------
/src/pages/error/404.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
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 |
2 |
3 |
4 |
5 |
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 |
2 |
3 |
8 |
9 |
10 |
11 |
12 |
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 |
2 |
13 |
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 |
--------------------------------------------------------------------------------
/public/element-plus-logo-small.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 | 
7 | 
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 | 
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 |
--------------------------------------------------------------------------------
/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 |
17 |
18 |
19 |
45 |
46 |
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 |
2 |
3 |
4 |
9 | {{ notice.title }}
10 |
11 |
12 | {{ notice.name }}
13 |
14 | {{ notice.time }}
15 |
16 | {{ notice.content }}
17 |
18 | 阅读全文
19 |
20 |
21 |
22 |
23 |
24 | {{ currentNotice?.content }}
25 |
26 |
27 |
28 |
29 |
48 |
49 |
--------------------------------------------------------------------------------
/src/components/layouts/BaseSide.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/src/pages/front/Wanted.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 | {{ item.title }}
10 |
11 |
12 |
13 | {{ item.name }}
14 |
15 | {{ item.time }}
16 |
17 | {{ item.description }}
18 |
19 | 查看详情
20 |
21 | 联系TA
22 |
23 |
24 |
25 |
26 |
27 | {{ currentWanted?.description }}
28 |
29 |
30 |
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 |
2 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/src/pages/front/Home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
你想要的,这儿都有~
7 |
让闲置不再闲置...
8 |
立即发布
9 |
10 |
11 |
12 | {{ item }}
13 |
14 |
15 |
16 |
17 |
18 |
19 |
最新发布
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
34 |
35 | 搜索
36 |
37 |
38 |
39 |
40 |
41 |
42 | Yummy hamburger
43 |
47 |
48 |
49 |
50 |
51 |
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 |
2 |
3 |
4 |
5 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | 在线交易
57 | 线下交易
58 | 在线交易/线下交易
59 |
60 |
61 |
62 |
63 |
64 |
65 | 确认发布
66 | 取消
67 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/src/pages/Login/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |

5 |
{{ data.type === "login" ? "登 录" : "注 册" }}
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | {{ data.code_button_text }}
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | 忘记密码?
34 |
35 |
36 |
37 |
38 |
39 | {{ data.type === "login" ? "登录" : "注册" }}
40 |
41 |
42 |
43 |
44 |
45 |
47 | 还没有账号? 去注册
48 |
49 |
51 | 已有账号? 去登录
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
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