ソースを参照

vue

feature/20220929首页静态开发
王露 3年前
コミット
8977bec4e3

+ 6
- 0
digital-park/.browserslistrc ファイルの表示

@@ -0,0 +1,6 @@
> 1%
last 2 versions
last 10 Chrome versions
last 5 Firefox versions
Safari >= 6
ie > 8

+ 3
- 0
digital-park/.env.development ファイルの表示

@@ -0,0 +1,3 @@
NODE_ENV = 'development'
VUE_APP_BASE_API = '/domain'
VUE_APP_PARK_DOMAIN = 'http://localhost'

+ 3
- 0
digital-park/.env.production ファイルの表示

@@ -0,0 +1,3 @@
NODE_ENV = 'production'
VUE_APP_BASE_API = '/'
VUE_APP_PARK_DOMAIN = ''

+ 19
- 0
digital-park/.eslintrc.js ファイルの表示

@@ -0,0 +1,19 @@
module.exports = {
root: true,
env: {
node: true
},
extends: ['plugin:vue/essential', 'eslint:recommended'],
parserOptions: {
parser: 'babel-eslint'
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
},
//过滤掉layui检测
globals: {
layui: true
},

};

+ 23
- 0
digital-park/.gitignore ファイルの表示

@@ -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*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
*.md
*.history

+ 3
- 0
digital-park/babel.config.js ファイルの表示

@@ -0,0 +1,3 @@
module.exports = {
presets: ['@vue/cli-plugin-babel/preset']
};

+ 13757
- 0
digital-park/package-lock.json
ファイル差分が大きすぎるため省略します
ファイルの表示


+ 56
- 0
digital-park/package.json ファイルの表示

@@ -0,0 +1,56 @@
{
"name": "hhr",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"test": "vue-cli-service build --mode prod --report"
},
"dependencies": {
"@tinymce/tinymce-vue": "^3.2.2",
"axios": "^0.19.2",
"core-js": "^3.6.4",
"crypto-js": "^4.0.0",
"dayjs": "^1.10.4",
"echarts": "^4.9.0",
"element-ui": "^2.13.0",
"fundebug-javascript": "^2.4.2",
"fundebug-revideo": "^0.6.2",
"fundebug-vue": "0.0.1",
"html2canvas": "^1.0.0-rc.7",
"js-base64": "^3.6.0",
"prerender-spa-plugin": "^3.4.0",
"qs": "^6.9.4",
"tinymce": "^5.4.1",
"vue": "^2.6.11",
"vue-clipboard2": "^0.3.1",
"vue-lazyload": "^1.3.3",
"vue-meta-info": "^0.1.7",
"vue-router": "^3.1.6",
"vue-seamless-scroll": "^1.1.21",
"vue-wxlogin": "^1.0.2",
"vuedraggable": "^2.24.0",
"vuex": "^3.1.3",
"webpack-spritesmith": "^1.1.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.3.0",
"@vue/cli-plugin-eslint": "^4.3.0",
"@vue/cli-service": "^4.3.0",
"@vue/eslint-config-prettier": "^6.0.0",
"babel-eslint": "^10.1.0",
"compression-webpack-plugin": "^3.1.0",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.1.1",
"eslint-plugin-vue": "^6.2.2",
"node-sass": "^4.14.1",
"prettier": "^1.19.1",
"sass-loader": "^8.0.2",
"swiper": "^3.4.2",
"useless-files-webpack-plugin": "^1.0.1",
"vue-awesome-swiper": "^4.1.0",
"vue-template-compiler": "^2.6.11"
}
}

バイナリ
digital-park/public/hhr.ico ファイルの表示


+ 25
- 0
digital-park/public/index.html ファイルの表示

@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="zh">

<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<title>园区数字化系统</title>
<link rel="icon" href="/web/<%= BASE_URL %>hhr.ico" />
</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 -->
<script></script>
</body>

</html>

+ 20
- 0
digital-park/src/App.vue ファイルの表示

@@ -0,0 +1,20 @@
<template>
<div id="app">
<router-view></router-view>
</div>
</template>

<script>
export default {
name: "Home",
components: {},
computed: {},
watch: {},
data() {
return {};
},
created() {},
methods: {},
};
</script>
<style lang="scss" scoped></style>

+ 31
- 0
digital-park/src/main.js ファイルの表示

@@ -0,0 +1,31 @@
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import VueLazyload from "vue-lazyload";
import MetaInfo from "vue-meta-info";

Vue.use(VueLazyload, {
preLoad: 1.3,
attempt: 1,
});

Vue.use(scroll);

Vue.use(MetaInfo);

Vue.config.productionTip = false;
Vue.use(ElementUI);

// 克隆对象 方便克隆以及调试
Vue.prototype.$cloneDeep = data => JSON.parse(JSON.stringify(data));
new Vue({
router,
store,
render: h => h(App),
mounted() {
document.dispatchEvent(new Event("render-event"));
},
}).$mount("#app");

+ 4
- 0
digital-park/src/router/hhr.js ファイルの表示

@@ -0,0 +1,4 @@
export default [{
path: "*",
redirect: "/index", // 重定向
}, ];

+ 29
- 0
digital-park/src/router/index.js ファイルの表示

@@ -0,0 +1,29 @@
import Vue from "vue";
import VueRouter from "vue-router";
import store from "../store/index";
import hhr from "./hhr";
Vue.use(VueRouter);

const routes = [
...hhr, // 禾获仁官网
];

const router = new VueRouter({
mode: "history",
base: "web",
routes,
});

router.beforeEach((to, from, next) => {
/* 路由发生变化修改页面title */
if (to.meta.title) {
document.title = to.meta.title;
}
});

const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err);
};

export default router;

+ 1
- 0
digital-park/src/store/actions.js ファイルの表示

@@ -0,0 +1 @@
export default {};

+ 2
- 0
digital-park/src/store/getters.js ファイルの表示

@@ -0,0 +1,2 @@
const getters = {};
export default getters;

+ 19
- 0
digital-park/src/store/index.js ファイルの表示

@@ -0,0 +1,19 @@
import Vue from "vue";
import Vuex from "vuex";
import getters from "./getters";
import state from "./state";
import mutations from "./mutations";
import actions from "./actions";
Vue.use(Vuex);
// export default new Vuex.Store({
// state,
// actions,
// bottomNav,
// });
export default new Vuex.Store({
modules: {},
state,
mutations,
actions,
getters,
});

+ 0
- 0
digital-park/src/store/mutation-types.js ファイルの表示


+ 2
- 0
digital-park/src/store/mutations.js ファイルの表示

@@ -0,0 +1,2 @@
import {} from "./mutation-types";
export default {};

+ 2
- 0
digital-park/src/store/state.js ファイルの表示

@@ -0,0 +1,2 @@
// 状态对象
export default {};

+ 243
- 0
digital-park/src/utils/http.js ファイルの表示

@@ -0,0 +1,243 @@
/**axios封装
* 请求拦截、相应拦截、错误统一处理
*/
import axios from "axios";
import { Message } from "element-ui";
// import QS from "qs";

// 环境的切换
axios.defaults.baseURL = process.env.VUE_APP_BASE_API;

// 请求超时时间
axios.defaults.timeout = 300000;

// post请求头
axios.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8";

// delete请求头
axios.defaults.headers.delete["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8";

let pending = []; //声明一个数组用于存储每个请求的取消函数和axios标识
let cancelRepeatUrl = [
"/mall/registry/registrationHall.action",
"/rentalProduct/getAreaRentalProductListAll.action",
]; // 园区服务、物业租售
let cancelToken = axios.CancelToken;
let removePending = config => {
// console.log(config);
for (let i in pending) {
if (pending[i].url === axios.defaults.baseURL + config.url) {
//在当前请求在数组中存在时执行取消函数
pending[i].f(); //执行取消操作
// pending.splice(i, 1); // 根据具体情况决定是否在这里就把pending去掉
// console.log("重复的:" + pending[i].url);
}
}
};

// 请求拦截器
axios.interceptors.request.use(
config => {
// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
// const token = store.state.token;
// token && (config.headers.Authorization = token);
// return config;

removePending(config); //在一个axios发送前执行一下判定操作,在removePending中执行取消操作
// console.log(config.url);
config.cancelToken = new cancelToken(function executor(c) {
//本次axios请求的配置添加cancelToken
if (cancelRepeatUrl.indexOf(config.url) > -1) {
pending.push({
// url: config.url,
url: axios.defaults.baseURL + config.url,
f: c,
});
// console.log(axios.defaults.baseURL + config.url);
//将本次的url添加到pending中,因此对于某个url第一次发起的请求不会被取消,因为还没有配置取消函数
}
});
return Promise.resolve(config);
},
error => {
return Promise.error(error);
}
);

// 响应拦截器
axios.interceptors.response.use(
response => {
if (response.status === 200) {
// removePending(response.config); //在一个axios响应后再执行一下取消操作,把已经完成的请求从pending中移除
return Promise.resolve(response);
} else {
return Promise.reject(response);
}
},
// 服务器状态码不是200的情况
error => {
if (error.response.status) {
return Promise.reject(error.response);
}
}
);

/**
* get方法,对应get请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export function get(url, params) {
return new Promise((resolve, reject) => {
axios
.get(url, {
params: params,
})
.then(res => {
if (res.data.status === 1) {
Message.error("意外错误!");
return;
}
if (res.data.status === 101) {
Message.error("非法请求!");
return;
}
if (res.data.status === 103) {
Message.error("权限不足!");
if (location.pathname.indexOf("independent-product") > -1) {
location.href = "/page/managerIndex.action";
}
return;
}
if (res.data.status === 110) {
Message.error("CRM系统异常!");
return;
}
if (res.data.status === 113) {
Message.error("请求过于频繁!");
return;
}
resolve(res);
})
.catch(err => {
reject(err);
});
});
}

/**
* post方法,对应post请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export function post(url, params) {
return new Promise((resolve, reject) => {
axios
.post(url, params)
.then(res => {
if (res.data.status === 1) {
Message.error("意外错误!");
return;
}
if (res.data.status === 101) {
Message.error("非法请求!");
return;
}
if (res.data.status === 103) {
Message.error("权限不足!");
return;
}
if (res.data.status === 110) {
Message.error("CRM系统异常!");
return;
}
if (res.data.status === 113) {
Message.error("请求过于频繁!");
return;
}
resolve(res);
})
.catch(err => {
reject(err);
});
});
}

/**
* put方法,对应put请求
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export function put(url, params) {
return new Promise((resolve, reject) => {
axios
.put(url, params)
.then(res => {
if (res.data.status === 1) {
Message.error("意外错误!");
return;
}
if (res.data.status === 101) {
Message.error("非法请求!");
return;
}
if (res.data.status === 103) {
Message.error("权限不足!");
return;
}
if (res.data.status === 110) {
Message.error("CRM系统异常!");
return;
}
if (res.data.status === 113) {
Message.error("请求过于频繁!");
return;
}
resolve(res);
})
.catch(err => {
reject(err);
});
});
}

/**
* delete方法,对应delete请求,delete是保留字,使用del代替
* @param {String} url [请求的url地址]
* @param {Object} params [请求时携带的参数]
*/
export function del(url, params) {
return new Promise((resolve, reject) => {
axios
.delete(url, {
params: params,
})
.then(res => {
if (res.data.status === 1) {
Message.error("意外错误!");
return;
}
if (res.data.status === 101) {
Message.error("非法请求!");
return;
}
if (res.data.status === 103) {
Message.error("权限不足!");
return;
}
if (res.data.status === 110) {
Message.error("CRM系统异常!");
return;
}
if (res.data.status === 113) {
Message.error("请求过于频繁!");
return;
}
resolve(res);
})
.catch(err => {
reject(err);
});
});
}

+ 64
- 0
digital-park/vue.config.js ファイルの表示

@@ -0,0 +1,64 @@
const path = require("path");
const resolve = dir => path.join(__dirname, dir);
const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV);
const CompressionWebpackPlugin = require("compression-webpack-plugin");
const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;

module.exports = {
publicPath: "/", // 默认'/',部署应用包时的基本 URL
outputDir: "dist", // 'dist', 生产环境构建文件的目录
assetsDir: "pc", // 相对于outputDir的静态资源(js、css、img、fonts)目录
lintOnSave: false,
indexPath: "pc.html",
runtimeCompiler: true, // 是否使用包含运行时编译器的 Vue 构建版本
productionSourceMap: false, // 生产环境的 source map
devServer: {
open: true,
index: "index.html", //默认启动serve 打开index页面
port: 8088,
https: false,
hotOnly: false,
disableHostCheck: true,
proxy: {
"/domain": {
// target: "http://192.168.18.138:80",
target: "http://localhost:80",
changeOrigin: true,
pathRewrite: {
"^/domain": "",
},
},
},
},
chainWebpack: config => {
// 修复热更新
config.resolve.symlinks(true);
// 添加别名
config.resolve.alias
.set("@", resolve("./src"))
.set("@assets", resolve("./src/assets"))
.set("@api", resolve("./src/api"))
.set("@utils", resolve("./src/utils"))
.set("@components", resolve("./src/components"))
.set("@views", resolve("./src/views"));
},
configureWebpack: config => {
config.optimization = {
runtimeChunk: true,
};
const plugins = [];
if (IS_PROD) {
plugins.push(
// 开启gzip
new CompressionWebpackPlugin({
filename: "[path].gz[query]",
algorithm: "gzip",
test: productionGzipExtensions,
threshold: 10240,
minRatio: 0.8,
})
);
}
config.plugins = [...config.plugins, ...plugins];
},
};

読み込み中…
キャンセル
保存