feat: docker部署方案

This commit is contained in:
osiris
2024-05-15 17:21:54 +08:00
parent ad8a1179cd
commit 097d8fc0b8
15 changed files with 128 additions and 395 deletions
+4
View File
@@ -0,0 +1,4 @@
node_modules
dist
.env.development
.env.production
+1 -3
View File
@@ -6,12 +6,10 @@ VITE_APP_TITLE = 'Tools-Web'
VITE_APP_DESC = '一个轻量的工具集合站'
# base api
VITE_APP_BASE_API = '/v1'
# 服务端地址: https://xxx.xxx.com; 使用mock时不需要填写
# 服务端地址: https://xxx.xxx.com;
VITE_SERVE = ''
# 自定义启动host
VITE_HOST = '127.0.0.1'
# 是否使用mock: bool
VITE_IS_MOCK = 'true'
# 第三方反馈互动地址
VITE_FEEDBACK_URL = ''
# 广告位开关
+16
View File
@@ -0,0 +1,16 @@
# build stage
FROM node:18-alpine3.19 AS build-stage
# Set environment variables for non-interactive npm installs
ENV NPM_CONFIG_LOGLEVEL warn
WORKDIR /app
COPY . .
COPY .env.example .env.development
RUN npm install -g pnpm && pnpm i
RUN pnpm build
# production stage
FROM nginx:stable-alpine AS production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
+26 -21
View File
@@ -1,18 +1,35 @@
# 基于Vite4.x + Vue3.x + ElementPlus + Typescript + Tailwind的工具站
<div align="center">
<h1 align="center">Tools-Web</h1>
<p> 只需简单几步,即可快速搭建属于自己的综合工具站。</p>
<p>基于Vite4.x + Vue3.x + ElementPlus + Typescript + Tailwind的工具站</p>
[![node](https://img.shields.io/badge/any_text-18.14.2-red?label=node)](node)
[![vue](https://img.shields.io/badge/any_text-3.3.10-origin?label=vue)](vue)
[![tailwindcss](https://img.shields.io/badge/any_text-3.3.5-yellow?label=tailwindcss)](tailwindcss)
[![elementplus](https://img.shields.io/badge/any_text-2.7-blue?label=element-plus)](elementplus)
[![license](https://img.shields.io/github/license/taoran1401/tools-web)](LICENSE)
> 演示站点:https://tools.ranblogs.com
</div>
# 介绍
免费开源的工具站,目前已开发数十种工具,对平板和手机适配进行了响应式设计,同时为了让seo更为友好做了ssr处理,搭建简单使用方便
## 功能展览
![](/public/index.png)
# 快速使用
## 开始使用
安装`pnpm`, 为避免因为不同包管理器工具下载同一个依赖,可能版本不一样的问题,本项目强制使用`pnpm`
### Docker方式(推荐)
```
docker run -d --name tools-web --restart unless-stopped -p 8080:80 docker0796/tools-web:latest
```
访问:
### 手动
安装`pnpm`
```
npm install pnpm -g
```
@@ -41,17 +58,5 @@ pnpm dev
打包
```
pnpm build:dev
```
# 后端功能(非必须)
主要包含登录后的收藏功能,若只用工具可以忽略该部分
项目地址:https://github.com/taoran1401/tools-web-api
使用方法见内`README`
# 其他
有问题或建议请提`issue`
pnpm build
```
+10
View File
@@ -0,0 +1,10 @@
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
+2 -5
View File
@@ -5,10 +5,9 @@
"type": "module",
"scripts": {
"dev": "vite",
"build:dev": "vue-tsc && vite build --mode development",
"build": "vue-tsc --noEmit && node --max_old_space_size=8192 node_modules/vite/bin/vite.js build --mode development",
"build:pro": "vue-tsc && vite build --mode production",
"preview": "vite preview",
"preinstall": "node ./scripts/preinstall.js"
"preview": "vite preview"
},
"dependencies": {
"@codemirror/commands": "^6.3.0",
@@ -54,14 +53,12 @@
"autoprefixer": "^10.4.16",
"fast-glob": "^3.3.2",
"less": "^4.2.0",
"mockjs": "^1.1.0",
"path": "^0.12.7",
"pinia": "^2.1.7",
"tailwindcss": "^3.3.5",
"typescript": "^5.0.2",
"vite": "^4.4.5",
"vite-plugin-html": "^3.2.0",
"vite-plugin-mock": "2.9.6",
"vite-plugin-svg-icons": "^2.0.1",
"vue-router": "^4.2.5",
"vue-tsc": "^1.8.5"
+1 -188
View File
@@ -130,9 +130,6 @@ devDependencies:
less:
specifier: ^4.2.0
version: 4.2.0
mockjs:
specifier: ^1.1.0
version: 1.1.0
path:
specifier: ^0.12.7
version: 0.12.7
@@ -151,9 +148,6 @@ devDependencies:
vite-plugin-html:
specifier: ^3.2.0
version: 3.2.0([email protected])
vite-plugin-mock:
specifier: 2.9.6
version: 2.9.6([email protected])([email protected])([email protected])
vite-plugin-svg-icons:
specifier: ^2.0.1
version: 2.0.1([email protected])
@@ -726,33 +720,6 @@ packages:
- supports-color
dev: false
/@rollup/[email protected]([email protected]):
resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==}
engines: {node: '>= 10.0.0'}
peerDependencies:
rollup: ^2.42.0
dependencies:
'@rollup/pluginutils': 3.1.0([email protected])
'@types/resolve': 1.17.1
deepmerge: 4.3.1
is-builtin-module: 3.2.1
is-module: 1.0.0
resolve: 1.22.8
rollup: 2.79.1
dev: true
/@rollup/[email protected]([email protected]):
resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
engines: {node: '>= 8.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0
dependencies:
'@types/estree': 0.0.39
estree-walker: 1.0.1
picomatch: 2.3.1
rollup: 2.79.1
dev: true
/@rollup/[email protected]:
resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
engines: {node: '>= 8.0.0'}
@@ -825,10 +792,6 @@ packages:
'@types/json-schema': 7.0.15
dev: false
/@types/[email protected]:
resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
dev: true
/@types/[email protected]:
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
dev: false
@@ -868,10 +831,6 @@ packages:
resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
dev: false
/@types/[email protected]:
resolution: {integrity: sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==}
dev: true
/@types/[email protected]:
resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
dev: false
@@ -888,12 +847,6 @@ packages:
undici-types: 5.26.5
dev: false
/@types/[email protected]:
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
dependencies:
'@types/node': 20.10.3
dev: true
/@types/[email protected]:
resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
dependencies:
@@ -1915,11 +1868,6 @@ packages:
ieee754: 1.2.1
dev: false
/[email protected]:
resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
engines: {node: '>=6'}
dev: true
/[email protected]:
resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
engines: {node: '>=0.10.0'}
@@ -2172,11 +2120,6 @@ packages:
delayed-stream: 1.0.0
dev: false
/[email protected]:
resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
engines: {node: '>=16'}
dev: true
/[email protected]:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -2212,18 +2155,6 @@ packages:
engines: {node: '>=0.8'}
dev: true
/[email protected]:
resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
engines: {node: '>= 0.10.0'}
dependencies:
debug: 2.6.9
finalhandler: 1.1.2
parseurl: 1.3.3
utils-merge: 1.0.1
transitivePeerDependencies:
- supports-color
dev: true
/[email protected]:
resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==}
dev: true
@@ -2774,11 +2705,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
/[email protected]:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
dev: true
/[email protected]:
resolution: {integrity: sha512-eMtt76GpDVngZQ3ocgvRcNCklUMwID1PaNbCNxfpDXuiOXttSh0HzBbda1HU9SIUsDc02vb7g9+3I5tlqe/qMQ==}
dev: false
@@ -2979,10 +2905,6 @@ packages:
zrender: 5.5.0
dev: false
/[email protected]:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
dev: true
/[email protected]:
resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==}
engines: {node: '>=0.10.0'}
@@ -3032,11 +2954,6 @@ packages:
engines: {node: '>= 4'}
dev: true
/[email protected]:
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
engines: {node: '>= 0.8'}
dev: true
/[email protected]:
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
dependencies:
@@ -3112,12 +3029,6 @@ packages:
ext: 1.7.0
dev: false
/[email protected]:
resolution: {integrity: sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw==}
hasBin: true
requiresBuild: true
dev: true
/[email protected]:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'}
@@ -3154,6 +3065,7 @@ packages:
/[email protected]:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
dev: false
/[email protected]:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
@@ -3218,10 +3130,6 @@ packages:
engines: {node: '>=4.0'}
dev: false
/[email protected]:
resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
dev: true
/[email protected]:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
@@ -3429,21 +3337,6 @@ packages:
dependencies:
to-regex-range: 5.0.1
/[email protected]:
resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
engines: {node: '>= 0.8'}
dependencies:
debug: 2.6.9
encodeurl: 1.0.2
escape-html: 1.0.3
on-finished: 2.3.0
parseurl: 1.3.3
statuses: 1.5.0
unpipe: 1.0.0
transitivePeerDependencies:
- supports-color
dev: true
/[email protected]:
resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
engines: {node: '>=4.0'}
@@ -4005,13 +3898,6 @@ packages:
/[email protected]:
resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
/[email protected]:
resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
engines: {node: '>=6'}
dependencies:
builtin-modules: 3.3.0
dev: true
/[email protected]:
resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
dependencies:
@@ -4079,10 +3965,6 @@ packages:
resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==}
dev: false
/[email protected]:
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
dev: true
/[email protected]:
resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
engines: {node: '>=0.10.0'}
@@ -5004,13 +4886,6 @@ packages:
dev: false
optional: true
/[email protected]:
resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==}
hasBin: true
dependencies:
commander: 11.1.0
dev: true
/[email protected]:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
@@ -5216,13 +5091,6 @@ packages:
dependencies:
isobject: 3.0.1
/[email protected]:
resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
engines: {node: '>= 0.8'}
dependencies:
ee-first: 1.1.1
dev: true
/[email protected]:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies:
@@ -5343,11 +5211,6 @@ packages:
dev: false
optional: true
/[email protected]:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
dev: true
/[email protected]:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
dependencies:
@@ -5375,10 +5238,6 @@ packages:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true
/[email protected]:
resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==}
dev: true
/[email protected]:
resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==}
engines: {node: '>=4'}
@@ -5973,14 +5832,6 @@ packages:
resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
dev: false
/[email protected]:
resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==}
engines: {node: '>=10.0.0'}
hasBin: true
optionalDependencies:
fsevents: 2.3.3
dev: true
/[email protected]:
resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
@@ -6329,11 +6180,6 @@ packages:
define-property: 0.2.5
object-copy: 0.1.0
/[email protected]:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
dev: true
/[email protected]:
resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==}
engines: {node: '>=0.10.0'}
@@ -6844,11 +6690,6 @@ packages:
engines: {node: '>= 10.0.0'}
dev: true
/[email protected]:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
dev: true
/[email protected]:
resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
engines: {node: '>=0.10.0'}
@@ -6895,11 +6736,6 @@ packages:
inherits: 2.0.3
dev: true
/[email protected]:
resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
engines: {node: '>= 0.4.0'}
dev: true
/[email protected]:
resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==}
dependencies:
@@ -6994,29 +6830,6 @@ packages:
vite: 4.5.1([email protected])([email protected])
dev: true
/[email protected]([email protected])([email protected])([email protected]):
resolution: {integrity: sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==}
engines: {node: '>=12.0.0'}
peerDependencies:
mockjs: '>=1.1.0'
vite: '>=2.0.0'
dependencies:
'@rollup/plugin-node-resolve': 13.3.0([email protected])
'@types/mockjs': 1.0.10
chalk: 4.1.2
chokidar: 3.5.3
connect: 3.7.0
debug: 4.3.4
esbuild: 0.11.3
fast-glob: 3.3.2
mockjs: 1.1.0
path-to-regexp: 6.2.1
vite: 4.5.1([email protected])([email protected])
transitivePeerDependencies:
- rollup
- supports-color
dev: true
/[email protected]([email protected]):
resolution: {integrity: sha512-qzhnu6Vl3Bw484OOBJkTdjhWvCXFgvGe4ysFf3BI3AsdtO6qxDtX7nMeJNe7dQTSsaGWgTpk9WEjMDPKngPZxg==}
dependencies:
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 987 KiB

After

Width:  |  Height:  |  Size: 795 KiB

-27
View File
@@ -1,27 +0,0 @@
//统一管理咱们项目用户相关的接口
import request from '@/utils/request'
import type {
ToolsReqData,
ToolsResponseData,
ToolCateResponseData,
ToolRecommendResponseData,
} from './type'
//项目用户相关的请求地址
enum API {
//获取tools
GET_TOOLS = '/tools',
//获取tool cate
GET_TOOL_CATES = '/tool/cates',
//获取推荐
GET_TOOL_RECOMMEND = '/tool/recommends',
}
//获取tools
export const getTools = (data: ToolsReqData) => request.get<any, ToolsResponseData>(API.GET_TOOLS, {
params: data
})
//获取tool cate
export const getToolCate = () => request.get<any, ToolCateResponseData>(API.GET_TOOL_CATES)
//获取推荐
export const getToolRecommend = () => request.get<any, ToolRecommendResponseData>(API.GET_TOOL_RECOMMEND)
+1 -1
View File
@@ -4,7 +4,7 @@ import { Search } from '@element-plus/icons-vue';
import { useToolsStore } from '@/store/modules/tools'
import { useComponentStore } from '@/store/modules/component'
import 'element-plus/theme-chalk/display.css'
import { ToolsInfo } from '@/api/tools/type';
import { ToolsInfo } from '@/components/Tools/tools.type.ts';
import router from '@/router';
// const isNavDrawer = ref(false)
-25
View File
@@ -1,6 +1,5 @@
<script setup lang="ts">
import { Tools } from '@element-plus/icons-vue'
import { Message } from '@element-plus/icons-vue'
import { reactive, onMounted } from 'vue';
import { useToolsStore } from '@/store/modules/tools'
const info = reactive({
@@ -21,42 +20,18 @@ const info = reactive({
//store
const toolsStore = useToolsStore()
//获取随机推荐
const getToolRecommend = async () => {
try {
await toolsStore.getToolRecommend()
} catch (e) {
console.log(e)
}
}
//点击走马灯
const clickCarousel = (url: string) => {
let w = window.open('')
w?.document.write(`<!DOCTYPE html><html><body ><img src='${url}'/></body></html>`)
}
//反馈
const feedback = () => {
window.open(info.feedbackUrl)
}
onMounted(() => {
getToolRecommend()
})
</script>
<template>
<div>
<!-- feedback -->
<div class="flex flex-col text-center mt-3 border-solid rounded border-gray border p-3 c-xs:mr-3 c-xs:ml-3">
<div @click="feedback()" class="text-2xl flex items-center justify-center cursor-pointer">
<el-icon><Message /></el-icon>
<div class="ml-2">
建议反馈
</div>
</div>
</div>
<!-- adv -->
<div class="mt-3" v-if="info.advShow == 'true'">
<el-carousel
+60 -94
View File
@@ -1,17 +1,7 @@
//获取tools
function getTools() {
let tools = [] as any[]
let toolsCate = getToolsCate()
for (let item in toolsCate) {
for (let _item in toolsCate[item].list) {
tools.push(toolsCate[item].list[_item])
}
}
return tools
}
import type { ToolsReqData } from '@/components/Tools/tools.type.ts'
//获取tools分类与对应的工具
function getToolsCate() {
export function getToolsCate() {
return [
{
id: 2,
@@ -306,31 +296,31 @@ function getToolsCate() {
},
]
},
{
id: 6,
title: '查询相关',
icon: '',
list: [
// {
// id: 1,
// title: 'IP查询',
// logo: '/images/logo/IP.png',
// desc: '在线查询ip地址、ip归属地',
// url: '/ip',
// cateId: 6,
// cate: '查询相关',
// },
{
id: 1,
title: '网站favicon获取',
logo: '/images/logo/text_to_img.png',
desc: '获取网站logo、icon、favicon、标题、关键词、描述等信息',
url: '/webInfo',
cateId: 6,
cate: '查询相关',
}
]
},
// {
// id: 6,
// title: '查询相关',
// icon: '',
// list: [
// {
// id: 1,
// title: 'IP查询',
// logo: '/images/logo/IP.png',
// desc: '在线查询ip地址、ip归属地',
// url: '/ip',
// cateId: 6,
// cate: '查询相关',
// },
// {
// id: 1,
// title: '网站favicon获取',
// logo: '/images/logo/text_to_img.png',
// desc: '获取网站logo、icon、favicon、标题、关键词、描述等信息',
// url: '/webInfo',
// cateId: 6,
// cate: '查询相关',
// }
// ]
// },
{
id: 7,
title: '其他工具',
@@ -368,61 +358,37 @@ function getToolsCate() {
]
}
export default [
{
url: '/v1/tools',
method: 'get',//请求方式
response: (request) => {
//接收参数
const { cateId, title } = request.query
//调用获取用户信息函数,用于判断是否有此用户
let list = getTools()
//标题筛选
if (title != '') {
list = list.filter(item => {
let tmpValue = item.title.toLowerCase()
let tmpDesc = item.desc.toLowerCase()
return tmpValue.indexOf(title.toLowerCase()) !== -1 || tmpDesc.indexOf(title.toLowerCase()) !== -1;
});
}
//分类筛选
if (cateId > 0) {
list = list.filter(item => {
return item.cateId == cateId;
});
}
return { code: 200, message: 'ok', data: list }
},
},
{
url: '/v1/tool/cates',
method: 'get',//请求方式
response: ({ body }) => {
const list = getToolsCate()
return { code: 200, message: 'ok', data: list }
},
},
{
url: '/v1/tool/recommends',
method: 'get',//请求方式
response: () => {
let list = [] as any
//获取推荐数量
let num = 10
const toolList = getTools()
//使用Set数据结构来存储已经生成的随机数
const set = new Set();
while (set.size < num) {
// 生成随机数
const randomNum = Math.floor(Math.random() * toolList.length);
// 如果随机数不在Set中,则添加到Set中并赋值给randomNumber变量
if (!set.has(randomNum)) {
set.add(randomNum);
list.push(toolList[randomNum])
}
}
return { code: 200, message: 'ok', data: list }
},
//获取工具
export function getTools(data: ToolsReqData) {
//接收参数
const { cateId, title } = data
//获取工具
let list = [] as any[]
let toolsCate = getToolsCate()
for (let item in toolsCate) {
for (let _item in toolsCate[item].list) {
list.push(toolsCate[item].list[_item])
}
}
]
//标题筛选
if (title != '') {
list = list.filter(item => {
let tmpValue = item.title.toLowerCase()
let tmpDesc = item.desc.toLowerCase()
return tmpValue.indexOf(title.toLowerCase()) !== -1 || tmpDesc.indexOf(title.toLowerCase()) !== -1;
});
}
//分类筛选
if (cateId > 0) {
list = list.filter(item => {
return item.cateId == cateId;
});
}
}
const ToolsExport = {
getTools,
getToolsCate,
};
export default ToolsExport;
@@ -1,5 +1,3 @@
import { ResponseData } from "../common"
export interface ToolsReqData {
cateId: number,
title: string,
@@ -32,16 +30,16 @@ export interface CollectReqData {
}
//tools list response
export interface ToolsResponseData extends ResponseData {
export interface ToolsResponseData {
data: ToolsInfo[]
}
//tools cate response
export interface ToolCateResponseData extends ResponseData {
export interface ToolCateResponseData{
data: ToolCate[]
}
//tools recommend response
export interface ToolRecommendResponseData extends ResponseData {
export interface ToolRecommendResponseData{
data: ToolsInfo[]
}
+4 -20
View File
@@ -1,8 +1,8 @@
//创建tools相关的小工具
import { defineStore } from 'pinia'
import { getTools, getToolCate, getToolRecommend } from '@/api/tools'
import { getTools, getToolsCate } from '@/components/Tools/tools.ts'
import { getIp } from '@/api/ip'
import type { ToolsReqData, ToolsInfo, ToolCate } from '@/api/tools/type'
import type { ToolsReqData, ToolsInfo } from '@/components/Tools/tools.type.ts'
import type { IpReqData, IpInfo } from '@/api/ip/type'
import type { WebInfo, WebInfoReqData } from '@/api/webinfo/type'
import { fetchWebInfo } from '@/api/webinfo'
@@ -12,7 +12,7 @@ export const useToolsStore = defineStore('tools', {
state: () => ({
list: [] as ToolsInfo[],
toolInfo: {} as ToolsInfo,
cates: [] as ToolCate[],
cates: [] as any[],
recommends: [] as ToolsInfo[],
ipData: {} as IpInfo,
webInfo: {} as WebInfo,
@@ -46,23 +46,7 @@ export const useToolsStore = defineStore('tools', {
//获取tools cate
async getToolCate() {
//发送请求
const result: any = await getToolCate()
if (result.code == 200) {
this.cates = result.data
return result.message
} else {
return Promise.reject(new Error(result.message))
}
},
//获取推荐
async getToolRecommend() {
const result: any = await getToolRecommend()
if (result.code == 200) {
this.recommends = result.data
return result.message
} else {
return Promise.reject(new Error(result.message))
}
this.cates = await getToolsCate()
},
//获取ip
async getIp(data: IpReqData) {
-6
View File
@@ -1,9 +1,7 @@
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import {viteMockServe} from 'vite-plugin-mock'
import path from 'path'
import { createHtmlPlugin } from 'vite-plugin-html'
import {seoperender} from "./ssr.config";
// https://vitejs.dev/config/
@@ -21,10 +19,6 @@ export default defineConfig(({command, mode}) => {
// Specify symbolId format
symbolId: 'icon-[dir]-[name]',
}),
//mock
viteMockServe({
localEnabled: env.VITE_IS_MOCK == 'true' ? command === 'serve' : false,
}),
seoperender()
],
resolve: {