init: 初始化: ⏳ init
|
@ -0,0 +1,4 @@
|
|||
> 1%
|
||||
last 2 versions
|
||||
not dead
|
||||
not ie 11
|
|
@ -0,0 +1,14 @@
|
|||
# http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*] # 表示所有文件适用
|
||||
charset = utf-8 # 设置文件字符集为 utf-8
|
||||
end_of_line = lf # 控制换行类型(lf | cr | crlf)
|
||||
insert_final_newline = false # 始终在文件末尾插入一个新行
|
||||
indent_style = tab # 缩进风格(tab | space)
|
||||
indent_size = 2 # 缩进大小
|
||||
max_line_length = 130 # 最大行长度
|
||||
|
||||
[*.md] # 表示仅 md 文件适用以下规则
|
||||
max_line_length = off # 关闭最大行长度限制
|
||||
trim_trailing_whitespace = false # 关闭末尾空格修剪
|
|
@ -0,0 +1,3 @@
|
|||
# 请求api地址:process.env.VUE_APP_URL
|
||||
VUE_APP_URL=http://localhost:8088/xxx
|
||||
VUE_APP_FLAG = 'prod'
|
|
@ -0,0 +1,3 @@
|
|||
# 请求api地址:process.env.VUE_APP_URL
|
||||
VUE_APP_URL=http://localhost:8088/xxx
|
||||
VUE_APP_FLAG = 'dev'
|
|
@ -0,0 +1,4 @@
|
|||
NODE_ENV = 'production'
|
||||
# 请求api地址:process.env.VUE_APP_URL
|
||||
VUE_APP_URL=http://localhost:8088/xxx
|
||||
VUE_APP_FLAG = 'test'
|
|
@ -0,0 +1,5 @@
|
|||
vue.config.js
|
||||
list
|
||||
.prettierrc.js
|
||||
.stylelintrc.js
|
||||
src/utils/request.js
|
|
@ -0,0 +1,16 @@
|
|||
module.exports = {
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
extends: ['plugin:vue/vue3-essential', 'eslint:recommended', '@vue/typescript/recommended', 'plugin:prettier/recommended'],
|
||||
parserOptions: {
|
||||
ecmaVersion: 2020,
|
||||
},
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'vue/multi-word-component-names': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
},
|
||||
};
|
|
@ -0,0 +1,23 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
/dist
|
||||
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
npx --no-install commitlint --edit $1
|
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
npm run lint:lint-staged
|
|
@ -0,0 +1 @@
|
|||
list
|
|
@ -0,0 +1,39 @@
|
|||
// @see: https://www.prettier.cn
|
||||
|
||||
module.exports = {
|
||||
// 超过最大值换行
|
||||
printWidth: 130,
|
||||
// 缩进字节数
|
||||
tabWidth: 1,
|
||||
// 使用制表符而不是空格缩进行
|
||||
useTabs: true,
|
||||
// 结尾不用分号(true有,false没有)
|
||||
semi: true,
|
||||
// 使用单引号(true单引号,false双引号)
|
||||
singleQuote: true,
|
||||
// 更改引用对象属性的时间 可选值"<as-needed|consistent|preserve>"
|
||||
quoteProps: 'as-needed',
|
||||
// 在对象,数组括号与文字之间加空格 "{ foo: bar }"
|
||||
bracketSpacing: true,
|
||||
// 多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"<none|es5|all>",默认none
|
||||
trailingComma: 'all',
|
||||
// 在JSX中使用单引号而不是双引号
|
||||
jsxSingleQuote: true,
|
||||
// (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号 ,always:不省略括号
|
||||
arrowParens: 'avoid',
|
||||
// 如果文件顶部已经有一个 doclock,这个选项将新建一行注释,并打上@format标记。
|
||||
insertPragma: false,
|
||||
// 指定要使用的解析器,不需要写文件开头的 @prettier
|
||||
requirePragma: false,
|
||||
// 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行
|
||||
proseWrap: 'preserve',
|
||||
// 在html中空格是否是敏感的 "css" - 遵守CSS显示属性的默认值, "strict" - 空格被认为是敏感的 ,"ignore" - 空格被认为是不敏感的
|
||||
htmlWhitespaceSensitivity: 'css',
|
||||
// 换行符使用 lf 结尾是 可选值"<auto|lf|crlf|cr>"
|
||||
endOfLine: 'auto',
|
||||
// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码
|
||||
rangeStart: 0,
|
||||
rangeEnd: Infinity,
|
||||
|
||||
vueIndentScriptAndStyle: false, // Vue文件脚本和样式标签缩进
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
build
|
|
@ -0,0 +1,40 @@
|
|||
module.exports = {
|
||||
extends: [
|
||||
'stylelint-config-standard',
|
||||
'stylelint-config-html/vue',
|
||||
'stylelint-config-standard-scss',
|
||||
'stylelint-config-recommended-vue/scss',
|
||||
'stylelint-config-recess-order',
|
||||
'stylelint-config-prettier',
|
||||
],
|
||||
overrides: [
|
||||
{
|
||||
files: ['**/*.{vue,html}'],
|
||||
customSyntax: 'postcss-html',
|
||||
},
|
||||
],
|
||||
rules: {
|
||||
'value-keyword-case': null,
|
||||
'no-descending-specificity': null,
|
||||
'function-url-quotes': 'always',
|
||||
'string-quotes': 'double',
|
||||
'unit-case': null,
|
||||
'color-hex-case': 'lower',
|
||||
'color-hex-length': 'long',
|
||||
'rule-empty-line-before': 'never',
|
||||
'font-family-no-missing-generic-family-keyword': null,
|
||||
'block-opening-brace-space-before': 'always',
|
||||
'property-no-unknown': null,
|
||||
'no-empty-source': null,
|
||||
'declaration-block-trailing-semicolon': null,
|
||||
'selector-class-pattern': null,
|
||||
'scss/at-import-partial-extension': null,
|
||||
'value-no-vendor-prefix': null,
|
||||
'selector-pseudo-class-no-unknown': [
|
||||
true,
|
||||
{
|
||||
ignorePseudoClasses: ['global', 'v-deep', 'deep'],
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
|
@ -0,0 +1,18 @@
|
|||
# vue-pinia 看板 rem 布局
|
||||
|
||||
欢迎使用 bunny-cli。
|
||||
|
||||
这个项目模板只涉及 rem,不涉及其它内容。
|
||||
|
||||
## 注意事项
|
||||
|
||||
### 打包成 apk
|
||||
|
||||
1. 如果需要打包成 apk,要将路由改为 hash 路由
|
||||
2. 打包成 apk 将公共路径改为`./`
|
||||
3. 打包成 apk,需要考虑跨域,跨域由于打包时没有 NGINX 做代理,所以无法完成,只能后端做跨域,否则接口访问不到。
|
||||
4. 要设置 APPID,因为 HBuilderX 必须要获取。
|
||||
|
||||
### docker 配置
|
||||
|
||||
默认配置中已经集成了 NGINX 和 dockfile 文件,后面自动化部署等直接用即可
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = {
|
||||
presets: ['@vue/cli-plugin-babel/preset'],
|
||||
};
|
|
@ -0,0 +1,106 @@
|
|||
// @see: https://cz-git.qbenben.com/zh/guide
|
||||
/** @type {import('cz-git').UserConfig} */
|
||||
|
||||
module.exports = {
|
||||
ignores: [commit => commit === 'init'],
|
||||
extends: ['@commitlint/config-conventional'],
|
||||
rules: {
|
||||
// @see: https://commitlint.js.org/#/reference-rules
|
||||
'body-leading-blank': [2, 'always'],
|
||||
'footer-leading-blank': [1, 'always'],
|
||||
'header-max-length': [2, 'always', 108],
|
||||
'subject-empty': [2, 'never'],
|
||||
'type-empty': [2, 'never'],
|
||||
'subject-case': [0],
|
||||
'type-enum': [
|
||||
2,
|
||||
'always',
|
||||
[
|
||||
'init',
|
||||
'feat',
|
||||
'page',
|
||||
'completepage',
|
||||
'fix',
|
||||
'fixbug',
|
||||
'docs',
|
||||
'style',
|
||||
'refactor',
|
||||
'perf',
|
||||
'test',
|
||||
'build',
|
||||
'ci',
|
||||
'chore',
|
||||
'revert',
|
||||
'wip',
|
||||
'workflow',
|
||||
'types',
|
||||
'release',
|
||||
'optimize',
|
||||
],
|
||||
],
|
||||
},
|
||||
prompt: {
|
||||
messages: {
|
||||
type: '选择你要提交的类型 :',
|
||||
scope: '选择一个提交范围(可选):',
|
||||
customScope: '请输入自定义的提交范围 :',
|
||||
subject: '填写简短精炼的变更描述 :\n',
|
||||
body: '填写更加详细的变更描述(可选)。使用 "|" 换行 :\n',
|
||||
breaking: '列举非兼容性重大的变更(可选)。使用 "|" 换行 :\n',
|
||||
footerPrefixsSelect: '选择关联issue前缀(可选):',
|
||||
customFooterPrefixs: '输入自定义issue前缀 :',
|
||||
footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
|
||||
confirmCommit: '是否提交或修改commit ?',
|
||||
},
|
||||
types: [
|
||||
{ value: 'init: 初始化', name: '初始化: ⏳ 初始化项目', emoji: '⏳' },
|
||||
{ value: 'optimize: 优化代码', name: '优化代码: ♻️ 优化项目代码', emoji: '♻️' },
|
||||
{ value: 'feat: 新增功能', name: '新增: 🚀 新增功能', emoji: '🚀' },
|
||||
{ value: 'page: 新增页面', name: '页面: 📄 新增页面', emoji: '📄' },
|
||||
{ value: 'completepage: 完成页面', name: '完成页面: 🍻 完成页面', emoji: '🍻' },
|
||||
{ value: 'fixbug: 修改bug', name: 'bug: 🐛 修改bug', emoji: '🐛' },
|
||||
{ value: 'fix: 修复', name: '修复: 🧩 修复缺陷', emoji: '🧩' },
|
||||
{ value: 'docs: 文档', name: '文档: 📚 文档变更', emoji: '📚' },
|
||||
{ value: 'style: 格式', name: '格式: 🎨 代码格式(不影响功能,例如空格、分号等格式修正)', emoji: '🎨' },
|
||||
{ value: 'refactor: 重构', name: '重构: 〽️ 代码重构(不包括 bug 修复、功能新增)', emoji: '〽️' },
|
||||
{ value: 'perf: 性能', name: '性能: ⚡️ 性能优化', emoji: '⚡️' },
|
||||
{ value: 'test: 测试', name: '测试: ✅ 添加疏漏测试或已有测试改动', emoji: '✅' },
|
||||
{
|
||||
value: 'chore: 构建',
|
||||
name: '构建: 📦️ 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等)',
|
||||
emoji: '📦️',
|
||||
},
|
||||
{ value: 'ci: 集成', name: '集成: 🎡 修改 CI 配置、脚本', emoji: '🎡' },
|
||||
{ value: 'revert: 回退', name: '回退: ⏪️ 回滚 commit', emoji: '⏪️' },
|
||||
{ value: 'build: 打包', name: '打包: 🔨 项目打包发布', emoji: '🔨' },
|
||||
],
|
||||
useEmoji: true,
|
||||
themeColorCode: '',
|
||||
scopes: [],
|
||||
allowCustomScopes: true,
|
||||
allowEmptyScopes: true,
|
||||
customScopesAlign: 'bottom',
|
||||
customScopesAlias: 'custom',
|
||||
emptyScopesAlias: 'empty',
|
||||
upperCaseSubject: false,
|
||||
allowBreakingChanges: ['feat', 'fix'],
|
||||
breaklineNumber: 100,
|
||||
breaklineChar: '|',
|
||||
skipQuestions: [],
|
||||
issuePrefixs: [{ value: 'closed', name: 'closed: ISSUES has been processed' }],
|
||||
customIssuePrefixsAlign: 'top',
|
||||
emptyIssuePrefixsAlias: 'skip',
|
||||
customIssuePrefixsAlias: 'custom',
|
||||
allowCustomIssuePrefixs: true,
|
||||
allowEmptyIssuePrefixs: true,
|
||||
confirmColorize: true,
|
||||
maxHeaderLength: Infinity,
|
||||
maxSubjectLength: Infinity,
|
||||
minSubjectLength: 0,
|
||||
scopeOverrides: undefined,
|
||||
defaultBody: '',
|
||||
defaultIssues: '',
|
||||
defaultScope: '',
|
||||
defaultSubject: '',
|
||||
},
|
||||
};
|
|
@ -0,0 +1,23 @@
|
|||
# 使用官方的 Nginx 镜像作为基础镜像
|
||||
FROM nginx
|
||||
|
||||
# 删除默认的 Nginx 配置文件
|
||||
RUN rm /etc/nginx/conf.d/default.conf
|
||||
|
||||
# 将自定义的 Nginx 配置文件复制到容器中
|
||||
COPY nginx.conf /etc/nginx/conf.d/
|
||||
|
||||
# 创建一个目录来存放前端项目文件
|
||||
WORKDIR /usr/share/nginx/html
|
||||
|
||||
# 将前端项目打包文件复制到 Nginx 的默认静态文件目录
|
||||
COPY dist/ /usr/share/nginx/html
|
||||
# 复制到nginx目录下
|
||||
COPY dist/ /etc/nginx/html
|
||||
|
||||
# 暴露 Nginx 的默认端口
|
||||
EXPOSE 80
|
||||
|
||||
# 自动启动 Nginx
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
root /etc/nginx/html;
|
||||
index index.html index.htm;
|
||||
try_files $uri /index.html;
|
||||
}
|
||||
|
||||
# 后端跨域请求
|
||||
location ~/api/ {
|
||||
proxy_pass http://192.168.3.98:1001;
|
||||
}
|
||||
|
||||
error_page 404 404.html;
|
||||
|
||||
location = /50x.html {
|
||||
root html;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
module.exports = {
|
||||
'*.{js,jsx,ts,tsx,vue}': ['eslint --fix', 'prettier --write'],
|
||||
'{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --write--parser json'],
|
||||
'package.json': ['prettier --write'],
|
||||
'*.{scss,less,styl,html,vue}': ['prettier --write'],
|
||||
'*.md': ['prettier --write'],
|
||||
};
|
|
@ -0,0 +1,76 @@
|
|||
{
|
||||
"name": "vue_ts_pina",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"testbuild": "vue-cli-service build --mode test",
|
||||
"lint": "vue-cli-service lint",
|
||||
"lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
|
||||
"lint:prettier": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"",
|
||||
"lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
|
||||
"lint:lint-staged": "lint-staged",
|
||||
"prepare": "husky install",
|
||||
"release": "standard-version",
|
||||
"commit": "git status && git add -A && git-cz"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^1.6.2",
|
||||
"core-js": "^3.8.3",
|
||||
"dayjs": "^1.11.10",
|
||||
"echarts": "^5.5.0",
|
||||
"loadsh": "^0.0.4",
|
||||
"pinia": "^2.1.7",
|
||||
"postcss-pxtorem": "^6.1.0",
|
||||
"stylelint-config-recess-order": "^4.6.0",
|
||||
"stylelint-config-recommended-vue": "^1.5.0",
|
||||
"stylelint-config-standard": "^36.0.0",
|
||||
"stylelint-config-standard-scss": "^13.0.0",
|
||||
"uuid": "^9.0.1",
|
||||
"vue": "^3.2.13",
|
||||
"vue-cookies": "^1.8.3",
|
||||
"vue-echarts": "^6.6.9",
|
||||
"vue-lazyload": "^3.0.0",
|
||||
"vue-router": "^4.0.3",
|
||||
"vue3-scale-box": "^0.1.9",
|
||||
"webpackbar": "^6.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^18.4.3",
|
||||
"@commitlint/config-conventional": "^18.4.3",
|
||||
"@typescript-eslint/eslint-plugin": "^5.4.0",
|
||||
"@typescript-eslint/parser": "^5.4.0",
|
||||
"@vue/cli-plugin-babel": "~5.0.0",
|
||||
"@vue/cli-plugin-eslint": "~5.0.0",
|
||||
"@vue/cli-plugin-router": "~5.0.0",
|
||||
"@vue/cli-plugin-typescript": "~5.0.0",
|
||||
"@vue/cli-service": "~5.0.0",
|
||||
"@vue/eslint-config-typescript": "^9.1.0",
|
||||
"commitizen": "^4.3.0",
|
||||
"cz-git": "^1.8.0",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
"eslint-plugin-vue": "^8.0.3",
|
||||
"husky": "^8.0.3",
|
||||
"lint-staged": "^11.2.6",
|
||||
"postcss": "^8.4.32",
|
||||
"postcss-html": "^1.5.0",
|
||||
"prettier": "^2.4.1",
|
||||
"sass": "^1.71.0",
|
||||
"sass-loader": "^12.0.0",
|
||||
"stylelint": "^14.16.1",
|
||||
"stylelint-config-html": "^1.1.0",
|
||||
"stylelint-config-prettier": "^9.0.5",
|
||||
"typescript": "~4.5.5"
|
||||
},
|
||||
"gitHooks": {
|
||||
"pre-commit": "lint-staged"
|
||||
},
|
||||
"config": {
|
||||
"commitizen": {
|
||||
"path": "node_modules/cz-git"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
const autoprefixer = require('autoprefixer');
|
||||
const px2rem = require('postcss-pxtorem');
|
||||
|
||||
module.exports = {
|
||||
plugins: [autoprefixer(), px2rem({ rootValue: 80, unitPrecision: 5, propList: ['*'] })],
|
||||
};
|
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,21 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>
|
||||
<strong
|
||||
>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to
|
||||
continue.</strong
|
||||
>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,28 @@
|
|||
<template>
|
||||
<ScaleBox :width="1920" :height="1080">
|
||||
<router-view />
|
||||
</ScaleBox>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import ScaleBox from 'vue3-scale-box';
|
||||
|
||||
const debounce = (callback: (...args: any[]) => void, delay: number) => {
|
||||
let tid: any;
|
||||
return function (...args: any[]) {
|
||||
const ctx = self;
|
||||
tid && clearTimeout(tid);
|
||||
tid = setTimeout(() => {
|
||||
callback.apply(ctx, args);
|
||||
}, delay);
|
||||
};
|
||||
};
|
||||
|
||||
const _ = (window as any).ResizeObserver;
|
||||
(window as any).ResizeObserver = class ResizeObserver extends _ {
|
||||
constructor(callback: (...args: any[]) => void) {
|
||||
callback = debounce(callback, 20);
|
||||
super(callback);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style lang="scss"></style>
|
|
@ -0,0 +1,8 @@
|
|||
import Request from '@/utils/request';
|
||||
|
||||
export const reqGetLoadBoard = () => {
|
||||
return Request({
|
||||
url: '/board/loadBoard',
|
||||
method: 'GET',
|
||||
});
|
||||
};
|
|
@ -0,0 +1,92 @@
|
|||
/* 选中文字颜色 */
|
||||
*::selection {
|
||||
color: #1f1f1f;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
/*定义滚动条高宽及背景高宽分别对应横竖滚动条的尺寸*/
|
||||
::-webkit-scrollbar {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
/*定义滚动条轨道内阴影+圆角*/
|
||||
::-webkit-scrollbar-track {
|
||||
-webkit-box-shadow: inset 0 0 6px #ccc;
|
||||
border-radius: 5px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
/*定义滑块内阴影+圆角*/
|
||||
::-webkit-scrollbar-thumb {
|
||||
border-radius: 5px;
|
||||
-webkit-box-shadow: inset 0 0 6px #ccc;
|
||||
background-color: #ccc;
|
||||
}
|
||||
|
||||
html,body{width: 100%;height:100%;}
|
||||
html,body,h1,h2,h3,h4,h5,h6,div,dl,dt,dd,ul,ol,li,p,blockquote,pre,hr,figure,table,caption,th,td,form,fieldset,legend,input,button,textarea,menu{margin:0;padding:0;}
|
||||
header,footer,section,article,aside,nav,hgroup,address,figure,figcaption,menu,details{display:block;}
|
||||
table{border-collapse:collapse;border-spacing:0;}
|
||||
caption,th{text-align:left;font-weight:normal;}
|
||||
html,body,fieldset,img,iframe,abbr{border:0;}
|
||||
i,cite,em,var,address,dfn{font-style:normal;}
|
||||
[hidefocus],summary{outline:0;}
|
||||
li{list-style:none;}
|
||||
h1,h2,h3,h4,h5,h6,small{font-size:100%;}
|
||||
sup,sub{font-size:83%;}
|
||||
pre,code,kbd,samp{font-family:inherit;}
|
||||
q:before,q:after{content:none;}
|
||||
textarea{overflow:auto;resize:none;}
|
||||
label,summary{cursor:default;}
|
||||
a,button{cursor:pointer;}
|
||||
h1,h2,h3,h4,h5,h6,em,strong,b{font-weight:bold;}
|
||||
del,ins,u,s,a,a:hover{text-decoration:none;}
|
||||
body,textarea,input,button,select,keygen,legend{font: Microsoft YaHei,arial,\5b8b\4f53;color:#333;outline:0;}
|
||||
body{background:#fff;}
|
||||
a,a:hover{color:#333;}
|
||||
*{box-sizing: border-box;}
|
||||
|
||||
/* 去除input默认填充的背景颜色 */
|
||||
input:-webkit-autofill {
|
||||
-webkit-box-shadow: 0 0 0px 1000px white inset;
|
||||
}
|
||||
|
||||
/* 清除input[type=number]的默认样式 */
|
||||
input[type=number] {
|
||||
-moz-appearance:textfield;
|
||||
}
|
||||
input[type=number]::-webkit-inner-spin-button,
|
||||
input[type=number]::-webkit-outer-spin-button {
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* 清除移动端 a 标签等点击区域变色 */
|
||||
*{
|
||||
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
|
||||
}
|
||||
|
||||
/* 清除移动端 input 样式 */
|
||||
input{
|
||||
border: none;
|
||||
-moz-appearance:none;
|
||||
-webkit-appearance : none ; /*解决ios上按钮的圆角问题*/
|
||||
border-radius: 0; /*解决ios上输入框圆角问题*/
|
||||
outline:medium; /*去掉鼠标点击的默认黄色边框*/
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/* 避免ios滑动滚动条卡顿 */
|
||||
*{
|
||||
-webkit-overflow-scrolling : touch
|
||||
}
|
||||
|
||||
|
||||
body {
|
||||
position: relative;
|
||||
width: 1920px;
|
||||
height: 1080px;
|
||||
box-sizing: border-box;
|
||||
|
||||
transform-origin: left top;
|
||||
}
|
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 111 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 113 KiB |
After Width: | Height: | Size: 111 KiB |
After Width: | Height: | Size: 111 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 117 KiB |
After Width: | Height: | Size: 120 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 107 KiB |
After Width: | Height: | Size: 133 KiB |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 6.7 KiB |
|
@ -0,0 +1,29 @@
|
|||
<template>
|
||||
<el-table :data="tableData" size="large" v-bind="$attrs">
|
||||
<el-table-column v-for="item in column" :key="item.prop" v-bind="item">
|
||||
<template v-if="$slots[item.prop]" #default="scope">
|
||||
<slot :name="item.prop" v-bind="scope"></slot>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { defineProps } from 'vue';
|
||||
|
||||
interface TableData {
|
||||
[propName: string]: any;
|
||||
}
|
||||
|
||||
interface Column {
|
||||
prop: string;
|
||||
label: string;
|
||||
|
||||
[propName: string]: any;
|
||||
}
|
||||
|
||||
defineProps<{
|
||||
tableData: TableData[];
|
||||
column: Column[];
|
||||
}>();
|
||||
</script>
|
|
@ -0,0 +1,90 @@
|
|||
<template>
|
||||
<div ref="refContainer" class="table-container">
|
||||
<table ref="refTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">序号</th>
|
||||
<th scope="col">工厂</th>
|
||||
<th scope="col">产量</th>
|
||||
<th scope="col">库存</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(item, index) in data" :key="index">
|
||||
<td>{{ index + 1 }}</td>
|
||||
<td>{{ item.name }}</td>
|
||||
<td>{{ item.hobby }}</td>
|
||||
<td>{{ item.address }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref } from 'vue';
|
||||
|
||||
const data = new Array(100).fill(0).map(() => ({ name: '工厂1', date: '711', hobby: '133', address: '0.333' }));
|
||||
const refContainer = ref<HTMLTableElement | null>(null);
|
||||
const refTable = ref<HTMLTableElement | null>(null);
|
||||
const scrollSpeed = ref(1); // 滚动速度,可以根据需要调整
|
||||
const scrollInterval = 16; // 滚动间隔,单位为毫秒
|
||||
|
||||
const scrollTable = () => {
|
||||
if (refTable.value != null && refContainer.value != null) {
|
||||
refContainer.value.scrollTop += scrollSpeed.value;
|
||||
if (
|
||||
refContainer.value.scrollTop + 1 >= refTable.value.clientHeight - refContainer.value.clientHeight ||
|
||||
refContainer.value.scrollTop <= 0
|
||||
) {
|
||||
scrollSpeed.value = -scrollSpeed.value;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
// 开始滚动
|
||||
setInterval(scrollTable, scrollInterval);
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.table-container {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: calc(100vh - 810px);
|
||||
margin: 15px 0 0 0;
|
||||
overflow: hidden;
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size: 15px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
thead {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
background-color: #002134;
|
||||
z-index: 999;
|
||||
|
||||
th {
|
||||
height: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
tbody {
|
||||
td,
|
||||
th {
|
||||
height: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
tr:nth-child(2n) {
|
||||
background-color: #001a27;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,13 @@
|
|||
import 'echarts';
|
||||
import { createPinia } from 'pinia';
|
||||
import { createApp } from 'vue';
|
||||
import ECharts from 'vue-echarts';
|
||||
import App from './App.vue';
|
||||
import './assets/css/index.scss';
|
||||
import './assets/css/reset.css';
|
||||
import router from './router';
|
||||
|
||||
const app = createApp(App);
|
||||
app.component('VChart', ECharts);
|
||||
|
||||
app.use(router).use(createPinia()).mount('#app');
|
|
@ -0,0 +1,21 @@
|
|||
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';
|
||||
|
||||
const routes: Array<RouteRecordRaw> = [
|
||||
{
|
||||
path: '/',
|
||||
name: 'layout',
|
||||
component: () => import(/* webpackChunkName: "layout" */ '@/views/layout.vue'),
|
||||
},
|
||||
];
|
||||
|
||||
/**
|
||||
* 如果需要打包成app,则要将路由改为Hash路由,createWebHashHistory
|
||||
* 如果不需要 createWebHistory
|
||||
*/
|
||||
const router = createRouter({
|
||||
history:
|
||||
process.env.NODE_ENV === 'production' ? createWebHashHistory(process.env.BASE_URL) : createWebHashHistory(process.env.BASE_URL),
|
||||
routes,
|
||||
});
|
||||
|
||||
export default router;
|
|
@ -0,0 +1,7 @@
|
|||
/* eslint-disable */
|
||||
declare module '*.vue' {
|
||||
import type { DefineComponent } from 'vue';
|
||||
const component: DefineComponent<{}, {}, any>;
|
||||
export default component;
|
||||
}
|
||||
declare module 'vue3-scale-box';
|
|
@ -0,0 +1,11 @@
|
|||
import { defineStore } from 'pinia';
|
||||
|
||||
export const testStore = defineStore('testStore', {
|
||||
state: () => {
|
||||
return {
|
||||
count: 0,
|
||||
};
|
||||
},
|
||||
getters: {},
|
||||
actions: {},
|
||||
});
|
|
@ -0,0 +1,23 @@
|
|||
import axios from 'axios';
|
||||
|
||||
const request = axios.create({
|
||||
baseURL: '/api',
|
||||
timeout: 10000,
|
||||
});
|
||||
|
||||
// 请求拦截器
|
||||
request.interceptors.request.use(config => {
|
||||
return config;
|
||||
});
|
||||
|
||||
// 响应拦截器
|
||||
request.interceptors.response.use(
|
||||
response => {
|
||||
return response.data;
|
||||
},
|
||||
error => {
|
||||
return Promise.reject(new Error('网络错误'));
|
||||
},
|
||||
);
|
||||
|
||||
export default request;
|
|
@ -0,0 +1,89 @@
|
|||
<template>
|
||||
<h1>成功</h1>
|
||||
<div class="box"></div>
|
||||
<div class="charts">
|
||||
<ECharts :option="option" autoresize theme="dark" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive } from 'vue';
|
||||
import ECharts from 'vue-echarts';
|
||||
const option = reactive({
|
||||
title: {
|
||||
text: 'Rainfall vs Evaporation',
|
||||
subtext: 'Fake Data',
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
},
|
||||
legend: {
|
||||
data: ['Rainfall', 'Evaporation'],
|
||||
},
|
||||
toolbox: {
|
||||
show: true,
|
||||
feature: {
|
||||
dataView: { show: true, readOnly: false },
|
||||
magicType: { show: true, type: ['line', 'bar'] },
|
||||
restore: { show: true },
|
||||
saveAsImage: { show: true },
|
||||
},
|
||||
},
|
||||
calculable: true,
|
||||
xAxis: [
|
||||
{
|
||||
type: 'category',
|
||||
// prettier-ignore
|
||||
data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
|
||||
},
|
||||
],
|
||||
yAxis: [
|
||||
{
|
||||
type: 'value',
|
||||
},
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: 'Rainfall',
|
||||
type: 'bar',
|
||||
data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
|
||||
markPoint: {
|
||||
data: [
|
||||
{ type: 'max', name: 'Max' },
|
||||
{ type: 'min', name: 'Min' },
|
||||
],
|
||||
},
|
||||
markLine: {
|
||||
data: [{ type: 'average', name: 'Avg' }],
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'Evaporation',
|
||||
type: 'bar',
|
||||
data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
|
||||
markPoint: {
|
||||
data: [
|
||||
{ name: 'Max', value: 182.2, xAxis: 7, yAxis: 183 },
|
||||
{ name: 'Min', value: 2.3, xAxis: 11, yAxis: 3 },
|
||||
],
|
||||
},
|
||||
markLine: {
|
||||
data: [{ type: 'average', name: 'Avg' }],
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
.box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: #e54;
|
||||
}
|
||||
|
||||
.charts {
|
||||
margin: 0 auto;
|
||||
width: 800px;
|
||||
height: 500px;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,40 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "esnext",
|
||||
"module": "esnext",
|
||||
"strict": true,
|
||||
"jsx": "preserve",
|
||||
"moduleResolution": "node",
|
||||
"skipLibCheck": true,
|
||||
"esModuleInterop": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"useDefineForClassFields": true,
|
||||
"sourceMap": true,
|
||||
"baseUrl": ".",
|
||||
"types": [
|
||||
"webpack-env"
|
||||
],
|
||||
"paths": {
|
||||
"@/*": [
|
||||
"src/*"
|
||||
]
|
||||
},
|
||||
"lib": [
|
||||
"esnext",
|
||||
"dom",
|
||||
"dom.iterable",
|
||||
"scripthost"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
"src/**/*.ts",
|
||||
"src/**/*.tsx",
|
||||
"src/**/*.vue",
|
||||
"tests/**/*.ts",
|
||||
"tests/**/*.tsx"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
const { defineConfig } = require('@vue/cli-service');
|
||||
const WebpackBar = require('webpackbar');
|
||||
module.exports = defineConfig({
|
||||
transpileDependencies: true,
|
||||
productionSourceMap: false, // 不生成map文件-优化打包
|
||||
// 生产环境,开启js\css压缩--- 打包优化
|
||||
chainWebpack: config => {
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
config.plugin('compressionPlugin').use(
|
||||
new CompressionPlugin({
|
||||
test: /\.(js|css|less|map)$/, // 匹配文件名
|
||||
threshold: 1024, // 对超过10k的数据压缩
|
||||
minRatio: 0.8,
|
||||
}),
|
||||
);
|
||||
}
|
||||
},
|
||||
// 代理设置
|
||||
devServer: {
|
||||
port: 6367,
|
||||
open: true,
|
||||
https: false,
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: process.env.VUE_APP_URL,
|
||||
changeOrigin: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
configureWebpack: {
|
||||
plugins: [
|
||||
// 设置进度条颜色
|
||||
new WebpackBar({ color: '#F6DCE0', profile: true }),
|
||||
],
|
||||
},
|
||||
publicPath: process.env.NODE_ENV === 'production' ? './' : './',
|
||||
});
|