dedsudiyu 7 mesi fa
commit
e0509c3877
19 ha cambiato i file con 11326 aggiunte e 0 eliminazioni
  1. 101 0
      .env.development
  2. 63 0
      .env.production
  3. 3 0
      .gitignore
  4. 29 0
      README.md
  5. 5 0
      babel.config.js
  6. 10525 0
      package-lock.json
  7. 24 0
      package.json
  8. 5 0
      postcss.config.js
  9. BIN
      public/favicon.ico
  10. 17 0
      public/index.html
  11. 146 0
      src/App.vue
  12. 10 0
      src/api/index.js
  13. 36 0
      src/api/request.js
  14. BIN
      src/assets/icon_0.png
  15. BIN
      src/assets/icon_1.png
  16. BIN
      src/assets/logo.png
  17. 8 0
      src/main.js
  18. 347 0
      src/utils/ruoyi.js
  19. 7 0
      vue.config.js

+ 101 - 0
.env.development

@@ -0,0 +1,101 @@
+# ######################页面标题######################
+
+#西农页面标题
+VUE_APP_TITLE = 实验室安全智慧化管控系统
+
+# ####################生产环境配置####################
+
+ENV = 'development'
+
+# #######################版本号#######################
+
+VUE_APP_VERSION_NUMBER = 'V3.0'
+
+# #######################版本编码#######################
+
+VUE_APP_RENEWAL_ENCODING = ''
+
+
+# ####################版本差异字段####################
+
+VUE_APP_VERSION_DIFFERENCE_FIELD = 'kuangYeDaXue_nanHu'
+# VUE_APP_VERSION_DIFFERENCE_FIELD = 'suZhouDaXue'
+# VUE_APP_VERSION_DIFFERENCE_FIELD = 'xiBeiNongLinDaXue'
+
+# ####################内网接口配置####################
+
+# 现场
+# VUE_APP_BASE_LOCAL_API = '172.16.0.65/api'
+# 现场开发
+# VUE_APP_BASE_LOCAL_API = '10.129.55.200:8080'
+# 43内网
+# VUE_APP_BASE_LOCAL_API = '192.168.1.43/labSystem'
+# 43内网V3地址
+# VUE_APP_BASE_LOCAL_API = '192.168.1.43/api'
+# 1.8内网V3地址
+VUE_APP_BASE_LOCAL_API = '192.168.1.8/api'
+# 88内网
+# VUE_APP_BASE_LOCAL_API = '192.168.1.88/labSystem'
+# 柴
+# VUE_APP_BASE_LOCAL_API = '192.168.1.9:8080'
+# 小飞
+# VUE_APP_BASE_LOCAL_API = '192.168.1.17:8080'
+# 志伟
+# VUE_APP_BASE_LOCAL_API = '192.168.1.20:8080'
+# 林总
+# VUE_APP_BASE_LOCAL_API = '192.168.1.24:8080'
+# 高升
+# VUE_APP_BASE_LOCAL_API = '192.168.1.39:8080'
+
+
+# ####################外网接口配置####################
+
+# 现场
+# VUE_APP_BASE_API = '172.16.0.65/api'
+# 现场开发
+# VUE_APP_BASE_API = '10.129.55.200:8080'
+# 实验室安全管理系统/开发环境
+# 1.8内网V3地址
+VUE_APP_BASE_API = '192.168.1.8/api'
+# 43内网V3地址
+# VUE_APP_BASE_API = '192.168.1.43/api'
+# 林总
+# VUE_APP_BASE_API = '192.168.1.24:8080'
+# 高升
+# VUE_APP_BASE_API = '192.168.1.39:8080'
+# 43外网地址
+# VUE_APP_BASE_API = 'lab.zjznai.com/labAppTest'
+# 43内网V3地址
+# VUE_APP_BASE_API = '192.168.1.43/api'
+# 88服务器
+# VUE_APP_BASE_API = '192.168.1.88/labSystem'
+# VUE_APP_BASE_API = '192.168.1.43:9800'
+# 柴
+# VUE_APP_BASE_API = '192.168.1.9:8080'
+# 志伟
+# VUE_APP_BASE_API = '192.168.1.20:8080'
+# 小飞
+# VUE_APP_BASE_API = '192.168.1.17:8080'
+# 高升
+# VUE_APP_BASE_API = '192.168.1.39:8080'
+
+
+# 矿大
+# VUE_APP_BASE_API = 'lab.sxitdlc.com/labSystem'
+# 交大
+# VUE_APP_BASE_API = 'lab.sxitdlc.com/jdlabSystem'
+# VUE_APP_BASE_API ='/dev-api'
+# 文昌
+# VUE_APP_BASE_API = 'lab.sxitdlc.com/kdwclabSystem'
+# 暨南大学
+# VUE_APP_BASE_API = 'lab.sxitdlc.com/jndxlabSystem'
+# 化工学院
+# VUE_APP_BASE_API = 'lab.sxitdlc.com/labSaasSystem'
+# 苏大
+# VUE_APP_BASE_API = 'znyj.labcenter.suda.edu.cn/labSystem'
+
+
+
+# ####################认证平台版本退出接口####################
+
+VUE_APP_OUT_URL = 'http://192.168.1.43/labSystem/auth/logout'

+ 63 - 0
.env.production

@@ -0,0 +1,63 @@
+# ######################页面标题######################
+
+VUE_APP_TITLE = 实验室安全智慧化管控系统
+
+# ####################生产环境配置####################
+
+ENV = 'production'
+
+# #######################版本号#######################
+
+VUE_APP_VERSION_NUMBER = 'V3.0'
+
+# #######################版本编码#######################
+
+VUE_APP_RENEWAL_ENCODING = ''
+
+# ####################版本差异字段####################
+
+VUE_APP_VERSION_DIFFERENCE_FIELD = 'kuangYeDaXue_nanHu'
+# VUE_APP_VERSION_DIFFERENCE_FIELD = 'suZhouDaXue'
+# VUE_APP_VERSION_DIFFERENCE_FIELD = 'xiBeiNongLinDaXue'
+
+# ####################外网接口配置####################
+
+# 现场
+VUE_APP_BASE_API = 'labcontrol.nwafu.edu.cn/api'
+
+# 1.8外网地址
+# VUE_APP_BASE_API = 'lab.zjznai.com/labTest'
+
+# 43外网地址
+# VUE_APP_BASE_API = 'lab.zjznai.com/labapp'
+
+# 开发人员地址
+# VUE_APP_BASE_API = '192.168.1.24:8080'
+
+# ####################内网接口配置####################
+
+# 现场
+VUE_APP_BASE_LOCAL_API = '172.16.0.65/api'
+
+# 1.8内网地址
+# VUE_APP_BASE_LOCAL_API = '192.168.1.8/api'
+
+# 43内网地址
+# VUE_APP_BASE_LOCAL_API = '192.168.1.43/api'
+
+# 开发人员地址
+# VUE_APP_BASE_LOCAL_API = '192.168.1.24:8080'
+
+# ####################登录方式####################
+
+# 账户登录
+VUE_APP_LOGIN_TYPE = 'account'
+
+# 统一认证登录
+# VUE_APP_LOGIN_TYPE = 'certification'
+
+
+# ####################认证平台版本退出接口####################
+
+VUE_APP_OUT_URL = 'http://lab.zjznai.com/labapp/auth/cas/logout'
+

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+/node_modules
+/.idea
+/dist

+ 29 - 0
README.md

@@ -0,0 +1,29 @@
+# default
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your tests
+```
+npm run test
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/app'
+  ]
+}

File diff suppressed because it is too large
+ 10525 - 0
package-lock.json


+ 24 - 0
package.json

@@ -0,0 +1,24 @@
+{
+  "name": "video-preview",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build"
+  },
+  "dependencies": {
+    "@vue-office/docx": "^1.6.2",
+    "@vue-office/excel": "^1.7.11",
+    "@vue-office/pdf": "^2.0.2",
+    "@vue/composition-api": "^1.7.2",
+    "axios": "^1.7.2",
+    "core-js": "^2.6.5",
+    "vue": "^2.6.10",
+    "vue-demi": "^0.14.10"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.8.0",
+    "@vue/cli-service": "^3.8.0",
+    "vue-template-compiler": "^2.6.10"
+  }
+}

+ 5 - 0
postcss.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  plugins: {
+    autoprefixer: {}
+  }
+}

BIN
public/favicon.ico


+ 17 - 0
public/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <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>文件预览</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but default 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>

+ 146 - 0
src/App.vue

@@ -0,0 +1,146 @@
+<template>
+    <div id="app">
+        <div class="max-img-box" ref="viewBox">
+            <transition name="fade" mode="in-out">
+                <vue-office-docx
+                        v-if="officeType === 'docx'&&!officeNullType"
+                        :src="lookUrl"
+                        @rendered="renderedHandler"
+                        @error="errorHandler"
+                />
+                <vue-office-excel
+                        v-if="officeType === 'excel'&&!officeNullType"
+                        :src="lookUrl"
+                        @rendered="renderedHandler"
+                        @error="errorHandler"
+                />
+                <vue-office-pdf
+                        v-if="officeType === 'pdf'&&!officeNullType"
+                        :src="lookUrl"
+                        @rendered="renderedHandler"
+                        @error="errorHandler"
+                />
+                <p v-if="officeNullType" class="office-null-text">加载失败...</p>
+            </transition>
+        </div>
+    </div>
+</template>
+
+<script>
+    //引入VueOfficeDocx组件
+    import VueOfficeDocx from '@vue-office/docx'
+    import '@vue-office/docx/lib/index.css'
+    //引入VueOfficeExcel组件
+    import VueOfficeExcel from '@vue-office/excel'
+    import '@vue-office/excel/lib/index.css'
+    //引入VueOfficePdf组件
+    import VueOfficePdf from '@vue-office/pdf'
+    import { iotCameraFindByCondition } from "@/api/index";
+
+    export default {
+        name: 'app',
+        components: {
+            VueOfficeDocx,
+            VueOfficeExcel,
+            VueOfficePdf
+        },
+        data() {
+            return {
+                showType:false,
+                officeNullType:false,
+                //文档类型
+                officeType:null,
+                //文档名称
+                lookName:"",
+                //文档地址
+                lookUrl:"",
+            }
+        },
+        created() {
+
+        },
+        mounted(){
+            this.getUrl();
+        },
+        methods: {
+            //文件加载成功
+            renderedHandler() {
+                console.log("渲染完成")
+                this.$set(this,'officeNullType',false);
+            },
+            //文件加载失败
+            errorHandler() {
+                console.log("渲染失败")
+                this.$set(this,'officeNullType',true);
+            },
+            getUrl() {
+                let self = this;
+                let text = window.location.href;
+                console.log('text',text);
+                let urlList = text.split("?")[1].split("&");
+                let urlData = {};
+                urlList.forEach((item) => {
+                    urlData[item.split("=")[0]] = item.split("=")[1];
+                });
+                console.log('urlData',urlData)
+
+                if(urlData.url&&urlData.type){
+                    this.$set(this,'officeType',urlData.type);
+                    this.$set(this,'lookUrl',urlData.url);
+                    this.$set(this,'officeNullType',false);
+                    this.$set(this,'showType',true);
+                }else{
+                    console.log('参数异常')
+                }
+            },
+            //乘法
+            accMul(arg1, arg2) {
+                var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
+                try {
+                    m += s1.split(".")[1].length
+                } catch (e) {
+                }
+                try {
+                    m += s2.split(".")[1].length
+                } catch (e) {
+                }
+                return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
+            },
+        },
+    }
+</script>
+
+<style>
+    html, body {
+        width: 100%;
+        height: 100%;
+    }
+
+    * {
+        margin: 0;
+        padding: 0;
+    }
+
+    #app {
+        font-family: 'Avenir', Helvetica, Arial, sans-serif;
+        -webkit-font-smoothing: antialiased;
+        -moz-osx-font-smoothing: grayscale;
+        text-align: center;
+        color: #2c3e50;
+        width: 100%;
+        height: 100%;
+    }
+    .null-text{
+        text-align: center;
+        font-size:16px;
+        line-height:80px;
+    }
+    .video-max-box {
+        overflow: hidden;
+        padding-top:10px;
+    }
+
+    .video-box {
+        margin: 0 auto 10px;
+    }
+</style>

+ 10 - 0
src/api/index.js

@@ -0,0 +1,10 @@
+import request from './request'
+
+//获取摄像头流地址
+export function iotCameraFindByCondition(data) {
+  return request({
+    url: '/iot/camera/findByCondition',
+    method: 'post',
+    data: data
+  })
+}

+ 36 - 0
src/api/request.js

@@ -0,0 +1,36 @@
+import axios from 'axios'
+import { tansParams,judgmentNetworkReturnAddress } from "@/utils/ruoyi";
+
+//判定http或者https
+let urlText = window.location.href.split('://')[0]+'://';
+
+axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+// 创建axios实例
+const service = axios.create({
+  // axios中请求配置有baseURL选项,表示请求URL公共部分
+  baseURL: urlText+judgmentNetworkReturnAddress(),
+  // 超时
+  timeout: 10000
+})
+// request拦截器
+service.interceptors.request.use(config => {
+  // get请求映射params参数
+  if (config.method === 'get' && config.params) {
+    let url = config.url + '?' + tansParams(config.params);
+    url = url.slice(0, -1);
+    config.params = {};
+    config.url = url;
+  }
+  return config
+}, error => {
+  Promise.reject(error)
+})
+// 响应拦截器
+service.interceptors.response.use(res => {
+    return res.data
+  },
+  error => {
+    return Promise.reject(error)
+  }
+)
+export default service

BIN
src/assets/icon_0.png


BIN
src/assets/icon_1.png


BIN
src/assets/logo.png


+ 8 - 0
src/main.js

@@ -0,0 +1,8 @@
+import Vue from 'vue'
+import App from './App.vue'
+
+Vue.config.productionTip = false
+
+new Vue({
+  render: h => h(App),
+}).$mount('#app')

+ 347 - 0
src/utils/ruoyi.js

@@ -0,0 +1,347 @@
+/**
+ * 通用js方法封装处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+// 判断当前用户网络 外网/内网 返回接口地址
+export function judgmentNetworkReturnAddress() {
+  /*判断是否是内网IP*/
+    // 获取当前页面url
+    var curPageUrl = window.location.href;
+
+    var reg1 = /(http|ftp|https|www):\/\//g;//去掉前缀
+    curPageUrl =curPageUrl.replace(reg1,'');
+
+    var reg2 = /\:+/g;//替换冒号为一点
+    curPageUrl =curPageUrl.replace(reg2,'.');
+
+    curPageUrl = curPageUrl.split('.');//通过一点来划分数组
+
+
+    var ipAddress = curPageUrl[0]+'.'+curPageUrl[1]+'.'+curPageUrl[2]+'.'+curPageUrl[3];
+
+    var isInnerIp = false;//默认给定IP不是内网IP
+    var ipNum = getIpNum(ipAddress);
+    /**
+     * 私有IP:A类  10.0.0.0    -10.255.255.255
+     *       B类  172.16.0.0  -172.31.255.255
+     *       C类  192.168.0.0 -192.168.255.255
+     *       D类   127.0.0.0   -127.255.255.255(环回地址)
+     **/
+    var aBegin = getIpNum("10.0.0.0");
+    var aEnd = getIpNum("10.255.255.255");
+    var bBegin = getIpNum("172.16.0.0");
+    var bEnd = getIpNum("172.31.255.255");
+    var cBegin = getIpNum("192.168.0.0");
+    var cEnd = getIpNum("192.168.255.255");
+    var dBegin = getIpNum("127.0.0.0");
+    var dEnd = getIpNum("127.255.255.255");
+    isInnerIp = isInner(ipNum,aBegin,aEnd) || isInner(ipNum,bBegin,bEnd) || isInner(ipNum,cBegin,cEnd) || isInner(ipNum,dBegin,dEnd);
+    return isInnerIp?process.env.VUE_APP_BASE_LOCAL_API:process.env.VUE_APP_BASE_API;
+  /*获取IP数*/
+  function getIpNum(ipAddress) {
+    var ip = ipAddress.split(".");
+    var a = parseInt(ip[0]);
+    var b = parseInt(ip[1]);
+    var c = parseInt(ip[2]);
+    var d = parseInt(ip[3]);
+    var ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
+    return ipNum;
+  }
+  function isInner(userIp,begin,end){
+    return (userIp>=begin) && (userIp<=end);
+  }
+}
+
+const baseURL = window.location.href.split('://')[0]+'://' + judgmentNetworkReturnAddress()
+
+// 日期格式化
+export function parseTime(time, pattern) {
+	if (arguments.length === 0 || !time) {
+		return null
+	}
+	if(time.indexOf('T')!== -1){
+    let newTime = time.split('T')
+    time = newTime[0] + ' ' + newTime[1]
+  }
+	const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+	let date
+	if (typeof time === 'object') {
+		date = time
+	} else {
+		if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+			time = parseInt(time)
+		} else if (typeof time === 'string') {
+			time = time.replace(new RegExp(/-/gm), '/');
+		}
+		if ((typeof time === 'number') && (time.toString().length === 10)) {
+			time = time * 1000
+		}
+		date = new Date(time)
+	}
+	const formatObj = {
+		y: date.getFullYear(),
+		m: date.getMonth() + 1,
+		d: date.getDate(),
+		h: date.getHours(),
+		i: date.getMinutes(),
+		s: date.getSeconds(),
+		a: date.getDay()
+	}
+	const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+		let value = formatObj[key]
+		// Note: getDay() returns 0 on Sunday
+		if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
+		if (result.length > 0 && value < 10) {
+			value = '0' + value
+		}
+		return value || 0
+	})
+	return time_str
+}
+
+// 表单重置
+export function resetForm(refName) {
+	if (this.$refs[refName]) {
+		this.$refs[refName].resetFields();
+	}
+}
+
+// 添加日期范围
+export function addDateRange(params, dateRange, propName) {
+	var search = params;
+	search.params = {};
+	if (null != dateRange && '' != dateRange) {
+		if (typeof (propName) === "undefined") {
+			search.params["beginTime"] = dateRange[0];
+			search.params["endTime"] = dateRange[1];
+		} else {
+			search.params["begin" + propName] = dateRange[0];
+			search.params["end" + propName] = dateRange[1];
+		}
+	}
+	return search;
+}
+
+// 回显数据字典
+export function selectDictLabel(datas, value) {
+	var actions = [];
+	Object.keys(datas).some((key) => {
+		if (datas[key].dictValue == ('' + value)) {
+			actions.push(datas[key].dictLabel);
+			return true;
+		}
+	})
+	return actions.join('');
+}
+
+// 回显数据字典(字符串数组)
+export function selectDictLabels(datas, value, separator) {
+	var actions = [];
+	var currentSeparator = undefined === separator ? "," : separator;
+	var temp = value.split(currentSeparator);
+	Object.keys(value.split(currentSeparator)).some((val) => {
+		Object.keys(datas).some((key) => {
+			if (datas[key].dictValue == ('' + temp[val])) {
+				actions.push(datas[key].dictLabel + currentSeparator);
+			}
+		})
+	})
+	return actions.join('').substring(0, actions.join('').length - 1);
+}
+
+// 通用下载方法
+export function download(fileName) {
+	window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true;
+}
+
+// 通用上传地址
+export function uploadUrl() {
+  return baseURL + "/system/file/upload";
+}
+
+// 字符串格式化(%s )
+export function sprintf(str) {
+	var args = arguments, flag = true, i = 1;
+	str = str.replace(/%s/g, function () {
+		var arg = args[i++];
+		if (typeof arg === 'undefined') {
+			flag = false;
+			return '';
+		}
+		return arg;
+	});
+	return flag ? str : '';
+}
+
+// 转换字符串,undefined,null等转化为""
+export function praseStrEmpty(str) {
+	if (!str || str == "undefined" || str == "null") {
+		return "";
+	}
+	return str;
+}
+
+/**
+ * 构造树型结构数据
+ * @param {*} data 数据源
+ * @param {*} id id字段 默认 'id'
+ * @param {*} parentId 父节点字段 默认 'parentId'
+ * @param {*} children 孩子节点字段 默认 'children'
+ */
+export function handleTree(data, id, parentId, children) {
+	let config = {
+		id: id || 'id',
+		parentId: parentId || 'parentId',
+		childrenList: children || 'children'
+	};
+
+	var childrenListMap = {};
+	var nodeIds = {};
+	var tree = [];
+
+	for (let d of data) {
+		let parentId = d[config.parentId];
+		if (childrenListMap[parentId] == null) {
+			childrenListMap[parentId] = [];
+		}
+		nodeIds[d[config.id]] = d;
+		childrenListMap[parentId].push(d);
+	}
+
+	for (let d of data) {
+		let parentId = d[config.parentId];
+		if (nodeIds[parentId] == null) {
+			tree.push(d);
+		}
+	}
+
+	for (let t of tree) {
+		adaptToChildrenList(t);
+	}
+
+  forLevel(tree,1);
+
+	function adaptToChildrenList(o) {
+		if (childrenListMap[o[config.id]] !== null) {
+			o[config.childrenList] = childrenListMap[o[config.id]];
+		}
+		if (o[config.childrenList]) {
+			for (let c of o[config.childrenList]) {
+				adaptToChildrenList(c);
+			}
+		}
+	}
+
+  function forLevel(list,level) {
+	  for(let i=0;i<list.length;i++){
+      list[i].level = level
+      if(list[i].children){
+        forLevel(list[i].children,level+1)
+      }
+    }
+  }
+	return tree;
+}
+
+/**
+ * 参数处理
+ * @param {*} params  参数
+ */
+export function tansParams(params) {
+  let result = ''
+  for (const propName of Object.keys(params)) {
+    const value = params[propName];
+    var part = encodeURIComponent(propName) + "=";
+    if (value !== null && typeof (value) !== "undefined") {
+      if (typeof value === 'object') {
+        for (const key of Object.keys(value)) {
+          if (value[key] !== null && typeof (value[key]) !== 'undefined') {
+            let params = propName + '[' + key + ']';
+            var subPart = encodeURIComponent(params) + "=";
+            result += subPart + encodeURIComponent(value[key]) + "&";
+          }
+        }
+      } else {
+        result += part + encodeURIComponent(value) + "&";
+      }
+    }
+  }
+  return result
+}
+
+/**
+ * input 空格判断
+ */
+export function spaceJudgment(rule, value, callback) {
+  let reg = /^\s+$/;
+  if(reg.test(value)){
+    return callback(new Error('请不要只输入空格'));
+  }else{
+    callback()
+  }
+}
+
+/**
+ * input 是否是数字判断
+ */
+export function isNum(rule, value, callback) {
+  const num= /^[0-9]*$/;
+  if (!num.test(value)) {
+    return callback(new Error('只能输入数字'))
+  }else{
+    callback()
+  }
+}
+
+/**
+ * 富文本 空格判断
+ */
+export function spaceJudgmentHTML(rule, value, callback) {
+  let obj = {value:value}
+  let text = JSON.parse(JSON.stringify(obj));
+  let newText = text.value.replace(/<[^>]+>/g, '');
+  let reg = /^\s+$/;
+  if(reg.test(newText)){
+    return callback(new Error('请不要只输入空格'));
+  }else if(newText.length<1){
+    return callback(new Error('请输入内容'));
+  }else{
+    callback()
+  }
+}
+
+/**
+ * 预览地址判断
+ */
+export function urlJudge(url) {
+  let src = window.location.href.split('://')[0]+'://' + judgmentNetworkReturnAddress()+'/statics'+ url.split('statics')[1]
+  return localStorage.getItem('filePreviewUrl')+'/onlinePreview?url='+encodeURIComponent(btoa(unescape(encodeURIComponent(src))));
+}
+
+/**
+ * 返回版本字符字段
+ */
+export function versionField() {
+  return process.env.VUE_APP_VERSION_DIFFERENCE_FIELD
+}
+
+/**
+ * 点击复制文本
+ */
+export function clickCopy(context,name) {
+  // 创建输入框元素
+  let oInput = document.createElement('input');
+  // 将想要复制的值
+  oInput.value = context;
+  // 页面底部追加输入框
+  document.body.appendChild(oInput);
+  // 选中输入框
+  oInput.select();
+  // 执行浏览器复制命令
+  document.execCommand('Copy');
+  // 弹出复制成功信息
+  this.msgSuccess(name?name+'复制成功':'复制成功');
+  // 复制后移除输入框
+  oInput.remove();
+}

+ 7 - 0
vue.config.js

@@ -0,0 +1,7 @@
+module.exports = {
+  publicPath: "/stream",
+  // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
+  outputDir: 'dist',
+  // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
+  assetsDir: 'static'
+}