Commit fc3819cb authored by Kimber's avatar Kimber

'update'

parent 219b0ded
......@@ -5,7 +5,6 @@ ENV = 'production'
# 如果接口是 http 形式, wss 需要改为 ws
# ------------------------
VUE_APP_BASE_API = 'http://39.164.225.220:5003'
VUE_APP_LOCAL_API = 'http://39.164.225.220:5004'
VUE_APP_D3Tileset = 'http://39.164.225.220:5003/b3dms'
VUE_APP_liveQing = 'http://39.164.225.220:5008'
\ No newline at end of file
VUE_APP_LOCAL_API = 'http://gqyjpt.weihai.cn:8001'
#VUE_APP_weather = 'http://192.168.1.142:9003'
VUE_APP_GIS = 'http://gqyjpt.weihai.cn:8005/Assets'
var ServiceURL = 'http://192.168.3.216:9002';
var ServiceURL = 'http://gqyjpt.weihai.cn:8001';
window.VUE_APP_API = {ServiceURL:ServiceURL}
[.ShellClassInfo]
ConfirmFileOp=0
IconFile=C:\Users\zhr\AppData\Local\SynologyDrive\SynologyDrive.app\bin\cloud-drive-ui.exe
IconIndex=3
InfoTip=Synology Drive Client.
......@@ -17,7 +17,7 @@
<!-- <link rel="stylesheet" href="/Build/Cesium/Widgets/widgets.css"> -->
<script src="/config/settings.js"></script>
<script src="/static/js/qf_web.min.js"></script>
<script type="text/javascript">qf.openCalcLayout();</script>
<script type="text/javascript">qf.openCalcLayout({dpr:1});</script>
<script src="/static/js/Cesium/Cesium.js"></script>
<script src="/static/js/fg3d.min.js"></script>
</head>
......
public/favicon.ico

8.21 KB | W: | H:

public/favicon.ico

66.1 KB | W: | H:

public/favicon.ico
public/favicon.ico
public/favicon.ico
public/favicon.ico
  • 2-up
  • Swipe
  • Onion skin
This diff is collapsed.
......@@ -2,177 +2,6 @@
var Tools = function(){
var cuPrint = function(dom, options){
var Print = function () {
if (!(this instanceof Print)) return new Print(dom, options);
this.options = this.extend({
'noPrint': '.no-print'
}, options);
if ((typeof dom) === "string") {
this.dom = document.querySelector(dom);
} else {
this.isDOM(dom)
this.dom = this.isDOM(dom) ? dom : dom.$el;
}
this.init();
};
Print.prototype = {
init: function () {
var content = this.getStyle() + this.getHtml();
this.writeIframe(content);
},
extend: function (obj, obj2) {
for (var k in obj2) {
obj[k] = obj2[k];
}
return obj;
},
getStyle: function () {
var str = "",
styles = document.querySelectorAll('style,link');
for (var i = 0; i < styles.length; i++) {
str += styles[i].outerHTML;
}
str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";
return str;
},
getHtml: function () {
var inputs = document.querySelectorAll('input');
var textareas = document.querySelectorAll('textarea');
var selects = document.querySelectorAll('select');
for (var k = 0; k < inputs.length; k++) {
if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
if (inputs[k].checked == true) {
inputs[k].setAttribute('checked', "checked")
} else {
inputs[k].removeAttribute('checked')
}
} else if (inputs[k].type == "text") {
inputs[k].setAttribute('value', inputs[k].value)
} else {
inputs[k].setAttribute('value', inputs[k].value)
}
}
for (var k2 = 0; k2 < textareas.length; k2++) {
if (textareas[k2].type == 'textarea') {
textareas[k2].innerHTML = textareas[k2].value
}
}
for (var k3 = 0; k3 < selects.length; k3++) {
if (selects[k3].type == 'select-one') {
var child = selects[k3].children;
for (var i in child) {
if (child[i].tagName == 'OPTION') {
if (child[i].selected == true) {
child[i].setAttribute('selected', "selected")
} else {
child[i].removeAttribute('selected')
}
}
}
}
}
// 包裹要打印的元素
// fix: https://github.com/xyl66/vuePlugs_printjs/issues/36
let outerHTML = this.wrapperRefDom(this.dom).outerHTML
return outerHTML;
},
// 向父级元素循环,包裹当前需要打印的元素
// 防止根级别开头的 css 选择器不生效
wrapperRefDom: function (refDom) {
let prevDom = null
let currDom = refDom
// 判断当前元素是否在 body 中,不在文档中则直接返回该节点
if (!this.isInBody(currDom)) return currDom
while (currDom) {
if (prevDom) {
let element = currDom.cloneNode(false)
element.appendChild(prevDom)
prevDom = element
} else {
prevDom = currDom.cloneNode(true)
}
currDom = currDom.parentElement
}
return prevDom
},
writeIframe: function (content) {
var w, doc, iframe = document.createElement('iframe'),
f = document.body.appendChild(iframe);
iframe.id = "myIframe";
//iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;');
w = f.contentWindow || f.contentDocument;
doc = f.contentDocument || f.contentWindow.document;
doc.open();
doc.write(content);
doc.close();
var _this = this
iframe.onload = function(){
_this.toPrint(w);
setTimeout(function () {
document.body.removeChild(iframe)
}, 100)
}
},
toPrint: function (frameWindow) {
try {
setTimeout(function () {
frameWindow.focus();
try {
if (!frameWindow.document.execCommand('print', false, null)) {
frameWindow.print();
}
} catch (e) {
frameWindow.print();
}
frameWindow.close();
}, 10);
} catch (err) {
console.log('err', err);
}
},
// 检查一个元素是否是 body 元素的后代元素且非 body 元素本身
isInBody: function (node) {
return (node === document.body) ? false : document.body.contains(node);
},
isDOM: (typeof HTMLElement === 'object') ?
function (obj) {
return obj instanceof HTMLElement;
} :
function (obj) {
return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
}
};
Print();
};
var downloadFile = function(obj, name, suffix){
var url = window.URL.createObjectURL(new Blob([obj]));
var link = document.createElement('a');
link.style.display = 'none';
link.href = url;
var fileName = name + '.' + suffix;
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
// 水波图表
var waveMapChart = function(ctn, val, opts){
opts = opts || {};
......@@ -426,71 +255,11 @@ var Tools = function(){
};
return {
cuPrint, downloadFile, waveMapChart
waveMapChart
}
};
/**
* 文件下载
* @return: Object
* @author: Kimber
* @updatetime: 2021/7/20
* @createtime: 2021/7/20
*/
var FileStream = function(){
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
};
/**
* 字符转换 Blob 对象
* @param: {String} str
* @example1: var aaa = FileStream.toBlob(str);
* @return:
* @author: Kimber
* @updatetime: 2021/7/20
* @createtime: 2021/7/20
*/
var toBlob = function(str){
return new Blob([s2ab(str)], {
type: "application/octet-stream"
});
};
/**
* 利用 A标签 下载文件
* @param: {Blob} url
* @param: {String} saveName // 文件名
* @example1: FileStream.download(blob, 'Test.xlsx');
* @return:
* @author: Kimber
* @updatetime: 2021/7/20
* @createtime: 2021/7/20
*/
var download = function(url, saveName){
if (typeof url == 'object' && url instanceof Blob) {
url = URL.createObjectURL(url); // 创建blob地址
}
var aLink = document.createElement('a');
aLink.href = url;
aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
var event;
if (window.MouseEvent) event = new MouseEvent('click');
else {
event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
}
aLink.dispatchEvent(event);
};
return {toBlob:toBlob, download:download}
};
export var Tools = Tools();
export var FileStream = FileStream();
/* exports = {
HttpReq: HttpReq(),
......
import { Notification } from 'element-ui';
import request from '@/utils/request';
import { Tools } from './common';
import { Highchart } from '@/assets/js/chartTemplates.js';
import { initData, download } from '@/api/data';
//var baseAPI = process.env.VUE_APP_LOCAL_API + '/';
var baseAPI = process.env.NODE_ENV
......@@ -19,61 +16,36 @@ var reqPublic = function(url, type, param, opts){
};
reqConfig[paramKey] = param;
opts.responseType && (reqConfig['responseType'] = opts.responseType);
opts.key && (reqConfig['token'] = opts.key);
return request(reqConfig)
};
var reqApis = function(){
return {
//donwloadURl:DownloadUrl,
getWeather: function(param) {
return request({
url: process.env.VUE_APP_BASE_API + '/weather',
method: 'post',
params:param
})
},
getRules:function(baseInfo){
var rules = {};
for(var key in baseInfo){
var item = baseInfo[key];
if(item.must){
var typeStr = item.type ? '请选择' : '请输入';
var rule = {required: true, message:typeStr+item.name, trigger:'blur'};
item.ruleType && (rule.type = item.ruleType)
rules[key] = [rule];
};
};return Object.keys(rules)[0] ? rules : void 0;
},
// 根据设备code获取设备字典列表
sensorListByCode: function(param){
return reqPublic('/tab/drybeachequipinfor/sensorList', 'get', param)
},
// 设备在线状态字典
getDictDeviceStatus: function(){
return reqPublic('/dic/alarm/status', 'get', {})
},
getBaseParams: function(searchItem){
var searchItem = searchItem || reqApi.common.getSearchParam(this.form) || {};
var param = searchItem || {};
param.page = this.table.page - 1;
param.size = this.table.size;
param.sort = 'date,desc';
return param;
},
common:{
requst:function(type, url, param){
var param = param || {};
return reqPublic(url, type, param).then((res)=>{
var opts = this.query || {};
/* return reqPublic(url, type, param, opts).then((res)=>{
return res
}).catch(function(error) {
console.log('requst catch ________________ ', error);
}); */
return qf.Async.Promise((resolve, reject) => {
reqPublic(url, type, param, opts).then((res)=>{
return resolve(res)
}).catch(function(error) {
console.log('requst catch ________________ ', error);
return reject(error);
});
});
},
requstEdge:function(type, url, param){
var param = param || {};
return new Promise((resolve, reject) => {
reqPublic(url, type, param).then((res)=>{
if(res && res.code === 200){
if(res && (res.code === 200 || res.status === 200)){
return resolve(res)
}else{
Notification({
......@@ -89,134 +61,6 @@ var reqApis = function(){
});
});
},
getRequst: function(searchItem){
var param = reqApi.getBaseParams.call(this);
this.table.loading = true;
this.pageApi.request('get', param).then((res) => {
this.table.loading = false;
if(res && res.code){
var body = res.body || {};
var list = body.list || [];
this.table.dataList = list;
this.table.total = body.total * 1;
}else{
this.$notify({
title: res.msg || res.message,
type: 'error',
duration: 2500
})
};
}).catch(function(error) {
this.table.loading = false;
})
},
removeRequst: function(item){
return this.pageApi.request('delete', item).then((res) => {
if(res.code === 200){
this.$notify({
title: '删除成功!',
type: 'success',
duration: 2500
});
this.loadData()
}else{
this.$notify({
title: res.msg || res.message,
type: 'error',
duration: 2500
})
};
});
},
addRequst: function(item){
return this.pageApi.request('post', item).then((res) => {
this.form.visible = false;
if(res.code === 200){
this.$notify({
title: '添加成功!',
type: 'success',
duration: 2500
});
this.loadData()
}else{
this.$notify({
title: res.msg || res.message,
type: 'error',
duration: 2500
})
};
}).catch(function(error) {
this.form.status.cu = 0
});
},
putRequst: function(item){
return this.pageApi.request('put', item).then((res) => {
this.form.visible = false;
if(res.code === 200){
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}else{
this.$notify({
title: res.msg || res.message,
type: 'error',
duration: 2500
})
};
}).catch(function(error) {
this.form.status.cu = 0
});
},
upload:function(e, key){
var tag = e.target || e.srcElement;
var file = tag.files[0];
if(file){
this.fullLoading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
var data = new FormData();
data.append('file', file);
return this.pageApi.upload(data).then((res) => {
this.fullLoading.close();
if(res.code === 200){
tag.value = '';
this.form.item[key] = res.body;
this.$notify({
title: '提示',
message: '文件上传成功',
type: 'success',
duration: 5000
})
};
}).catch(function(error) {
this.form.status.cu = 0
});
};
},
getSearchParam:function(form){
var search = form.config.search, query = form.query, searchItem = {};
if(Object.prototype.toString.call(search) === '[object Array]' && Object.keys(query || [])[0]){
for(var item of search){
var queryVal = query[item.word];
if(queryVal && item.type !== "button"){
var key = item.mode === 0 ? 'vague' : 'exact';
if(item.type === "daterange"){
searchItem[item.type] = queryVal.join(',');
}else{
var groub = searchItem[key] || (searchItem[key] = {});
groub[item.word] = queryVal;
};
};
};
};return searchItem
},
getPermission: function(item){
var list = item.permission || [];
var username = this.$store.state.user.user.username;
......@@ -227,26 +71,8 @@ var reqApis = function(){
};
};
// 配制信息
var Config = function(){
// 获取单元信息
var getModuleInfo = function(that){
var path = that.$route.path || '';
var parts = path.replace('/', '').split('/');
var i = 0;
// 递归遍历
return (function loop(json){
var key = parts[i]; i++;
return json[key] ? loop(json[key]) : json;
})(reqApi);
};
return {getModuleInfo:getModuleInfo}
};
//export var tailingPond = tailingPond();
export var reqApi = reqApis();
export var Config = Config();
// WEBPACK FOOTER //
// ./src/common/js/common.js
\ No newline at end of file
......@@ -131,16 +131,22 @@ body .el-dialog__body{padding:10px 20px;}
/* 滚动条 */
.scrolling{}
.scrolling::-webkit-scrollbar{width:3px;height:5px;cursor:pointer;}
.scrolling4::-webkit-scrollbar{width:4px;cursor:pointer;}
.scrolling, .scrolling4::-webkit-scrollbar-thumb{border-radius: 10px;background:#1674ee;margin-right: 10px;cursor:pointer;}
.scrolling::-webkit-scrollbar{width:6px;height:5px;cursor:pointer;}
.scrolling4::-webkit-scrollbar{width:.06rem;height:.08rem;cursor:pointer;}
.scrolling, .scrolling4::-webkit-scrollbar-thumb{
border-radius:10px;margin-right: 10px;cursor:pointer;
/* background:#1674ee; */
background-color:rgba(23,121,230, .70);
background-image:-webkit-linear-gradient(45deg, rgba(31,181,219, .70) 25%, transparent 0, transparent 50%, rgba(31,181,219, .70) 0, rgba(31,181,219, .70) 75%, transparent 0, transparent);
}
.scrolling, .scrolling4::-webkit-scrollbar-thumb:hover{background-color:#1854e8;}
.scrolling, .scrolling4::-webkit-scrollbar-track{border-radius: 10px;background:rgba(255, 255, 255, 0.1);margin-right: 10px;}
/* 滚动条-火狐 */
.scrolling, .scrolling4{scrollbar-width:thin;scrollbar-color:#1674ee rgba(255, 255, 255, 0.1);}
.scrolling, .scrolling4::-webkit-scrollbar-track{border-radius:10px;background:rgba(255, 255, 255, 0.1);margin-right:10px;}
/* 暂无数据提示 */
/* .home_user .el-table__empty-block, .common-page .el-table__empty-block{background-color:#00344D} */
.no-data{flex:1;display:flex;justify-content:center;align-items:center;height:100%;padding-bottom:10%;}
......
......@@ -9,7 +9,7 @@ import { filterAsyncRouter } from '@/store/modules/permission'
NProgress.configure({ showSpinner: false }) // NProgress Configuration
const whiteList = ['/plus/login', '/register', '/edge/Screen'] // no redirect whitelist
const whiteList = ['/register', '/edge/Screen'] // no redirect whitelist
router.beforeEach((to, from, next) => {
if (to.meta.title) {
......@@ -47,7 +47,7 @@ router.beforeEach((to, from, next) => {
if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入
next()
} else {
window.location.href = `/plus/login?redirect=${to.fullPath}`;
//window.location.href = `/plus/login?redirect=${to.fullPath}`;
NProgress.done()
}
}
......
......@@ -5,14 +5,6 @@ import HomeLayout from "../layout/home";
Vue.use(Router);
export const constantRouterMap = [
{
path: "/plus/login",
meta: { title: "登录login", noCache: true },
component: (resolve) => {
require(["@/views/system/user/login"], resolve)
},
hidden: true
},
{
path: "/404",
redirect: "/edge/Screen",
......@@ -26,31 +18,6 @@ export const constantRouterMap = [
component: resolve => require(["@/views/features/401"], resolve),
hidden: true
},
{
path: "/redirect",
//component: Layout,
component: HomeLayout,
hidden: true,
children: [
{
path: "/redirect/:path*",
component: resolve => require(["@/views/features/redirect"], resolve)
}
]
},
/* {
path: "/dashboard",
component: HomeLayout,
//redirect: "/dashboard",
children: [
{
path: 'dashboard',
component: (resolve) => require(['@/views/home_manage'], resolve),
name: 'Dashboard',
meta: { title: '主页面', icon: 'index', affix: true, noCache: true }
}
]
}, */
{
path: "/user",
//component: Layout,
......@@ -73,13 +40,7 @@ export const constantRouterMap = [
},
hidden: true
},
{
path: "/edge/ScreenTest",
component: (resolve) => {
return require(["@/views/Screen/indexTest"], resolve)
},
hidden: true
},
{
path: "/",
//redirect: "/edge/Screen",
......@@ -90,6 +51,16 @@ export const constantRouterMap = [
},
];
if(process.env.NODE_ENV === 'development'){
constantRouterMap.push({
path: "/edge/ScreenTest",
component: (resolve) => {
return require(["@/views/Screen/indexTest"], resolve)
},
hidden: true
});
};
export default new Router({
// mode: 'hash',
mode:"history",
......
......@@ -2,7 +2,7 @@ module.exports = {
/**
* @description 网站标题
*/
title: '恒源矿业智慧矿山管理平台',
title: '高区应急监测平台',
/**
* @description 是否显示 tagsView
*/
......@@ -26,7 +26,7 @@ module.exports = {
/**
* @description token key
*/
TokenKey: 'V3-TailingPond',
TokenKey: 'GEMHO-GAOQUYINGJI-TOEKN',
/**
* @description 请求超时时间,毫秒(默认2分钟)
*/
......@@ -49,5 +49,5 @@ module.exports = {
*/
caseNumber: '鲁ICP备09100748号-5',
"version": "0.950"
"version": "1.105"
}
......@@ -7,9 +7,9 @@ export function getToken() {
return Cookies.get(TokenKey)
}
export function setToken(token, rememberMe) {
export function setToken(token, rememberMe, date) {
if (rememberMe) {
return Cookies.set(TokenKey, token, { expires: Config.tokenCookieExpires })
return Cookies.set(TokenKey, token, { expires: date || Config.tokenCookieExpires })
} else return Cookies.set(TokenKey, token)
}
......
......@@ -3,7 +3,7 @@ import { Notification } from 'element-ui'
import { getToken } from '@/utils/auth'
import Config from '@/settings'
//const settings = require('@/../static/config/settings')
//const settings = require('@/../static/config/settings');
// 使请求头可以携带cookie
axios.defaults.withCredentials = true;
......@@ -21,8 +21,10 @@ const service = axios.create({
// request拦截器
service.interceptors.request.use(
config => {
if (getToken()) {
config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
var token = getToken();
var Token = token && (token !== typeof(void 0)) && token || config.token;
if (Token) {
config.headers['Authorization'] = Token // 让每个请求携带自定义token 请根据实际情况自行修改
}
config.headers['Content-Type'] = 'application/json'
return config
......@@ -39,8 +41,9 @@ service.interceptors.response.use(
},
error => {
if (error.response.status) {
const responseCode = error.response.status
const responseCode = error.response.status;
/*
switch (responseCode) {
case 400:
// Message.error('操作失败');
......@@ -65,7 +68,7 @@ service.interceptors.response.use(
default:
break
}
}*/
return error.response.data
}
}
......
This diff is collapsed.
This diff is collapsed.
<template>
<div class="login" :style="'background-image:url('+ Background +');'">
<div class="headder">
<h2>尾矿库数据在线监测系统</h2>
<h4>ONLINE MONITORING SYSTEM FOR TAILINGS POND DATA</h4>
<!-- <h2>边坡数据在线监测系统</h2>
<h4>ONLINE MONITORING SYSTEM FOR SIDE SLOPE DATA</h4> -->
</div>
<div class="logo-place">
<div class="logo-title">登录窗口</div>
<h3 class="subtitle">欢迎登录后台系统</h3>
<div class="ctn-place">
<div class="inbox-range">
<div class="ctn-fix">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" label-position="left" label-width="0px" class="login-form">
<el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码" @keyup.enter.native="handleLogin">
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<!--
<el-form-item prop="code">
<el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter.native="handleLogin">
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode">
</div>
</el-form-item>
-->
<el-form-item style="width:100%;">
<el-button :loading="loading" size="medium" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
<span v-if="!loading">登 录</span>
<span v-else>登 录 中...</span>
</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</div>
<!-- 底部 -->
<div v-if="$store.state.settings.showFooter" id="el-login-footer">
<span v-html="$store.state.settings.footerTxt" />
<span></span>
<!-- <a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">{{ $store.state.settings.caseNumber }}</a> -->
<span class="">技术支持:威海晶合数字矿山技术有限公司</span>
</div>
</div>
</template>
<script>
import Config from '@/settings'
import { getCodeImg } from '@/api/login'
import Cookies from 'js-cookie'
import qs from 'qs'
//import Background from '@/assets/images/login_bg.png';
import { encrypt } from '@/utils/rsaEncrypt'
import '@/assets/icons' // icon
export default {
name: 'Login',
data() {
return {
//Background: Background,
//Background:'',
codeUrl: '',
cookiePass: '',
loginForm: {
username: '',
password: '',
rememberMe: false,
code: '',
uuid: '',
},
loginRules: {
username: [{ required: true, trigger: 'blur', message: '用户名不能为空' }],
password: [{ required: true, trigger: 'blur', message: '密码不能为空' }],
code: [{ required: true, trigger: 'change', message: '验证码不能为空' }],
},
loading: false,
redirect: undefined
}
},
watch: {
$route: {
handler: function(route) {
const data = route.query
if (data && data.redirect) {
this.redirect = data.redirect
delete data.redirect
if (JSON.stringify(data) !== '{}') {
this.redirect = this.redirect + '&' + qs.stringify(data, { indices: false })
}
}
},
immediate: true
}
},
created() {
// 获取验证码
this.getCode()
// 获取用户名密码等Cookie
this.getCookie()
// token 过期提示
this.point()
},
methods: {
getCode() {
getCodeImg().then(res => {
this.codeUrl = res.img
this.loginForm.uuid = res.uuid
})
},
getCookie() {
const username = Cookies.get('username')
let password = Cookies.get('password')
const rememberMe = Cookies.get('rememberMe')
// 保存cookie里面的加密后的密码
this.cookiePass = password === undefined ? '' : password
password = password === undefined ? this.loginForm.password : password
this.loginForm = {
username: username === undefined ? this.loginForm.username : username,
password: password,
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
code: '',
}
},
handleLogin() {
this.$refs.loginForm.validate(valid => {
const user = {
username: this.loginForm.username,
password: this.loginForm.password,
rememberMe: this.loginForm.rememberMe,
code: this.loginForm.code,
uuid: this.loginForm.uuid,
}
if (user.password !== this.cookiePass) {
user.password = encrypt(user.password);
};
if (valid) {
this.loading = true
if (user.rememberMe) {
Cookies.set('username', user.username, { expires: Config.passCookieExpires })
Cookies.set('password', user.password, { expires: Config.passCookieExpires })
Cookies.set('rememberMe', user.rememberMe, { expires: Config.passCookieExpires })
} else {
Cookies.remove('username')
Cookies.remove('password')
Cookies.remove('rememberMe')
}
this.$store.dispatch('Login', user).then((res) => {
this.loading = false
if(/* res.head.code !== '0000' */ res.code){
return this.$notify({
title: '提示',
message: res.msg,
type: 'warning',
duration: 5000
})
};
//this.$router.push({ path: this.redirect || '/' })
window.location.href = this.redirect || '/';
}).catch((err) => {
this.loading = false
this.getCode()
})
} else {
console.log('error submit!!')
return false
}
})
},
point() {
const point = Cookies.get('point') !== undefined
if (point) {
this.$notify({
title: '提示',
message: '当前登录状态已过期,请重新登录!',
type: 'warning',
duration: 5000
})
Cookies.remove('point')
}
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scope>
.login {
display:flex;justify-content:center;align-items:center;flex-direction:column;
height:100%;background-size:cover;position:relative;
.headder{
margin-bottom:.48rem;text-align:center;
h2, h4{
margin:0;padding:0;line-height:1;background-image:-webkit-linear-gradient(top, #fff, #a2deff, #23a5f9);
-webkit-background-clip:text;-webkit-text-fill-color:transparent;
}
h2{font-size:.66rem;letter-spacing:.06rem;}
h4{margin-top:.20rem;font-size:.285rem;}
}
.logo-place{
position:relative;width:9.68rem;height:5.56rem;/* margin:2.01rem auto 0; */
//background:no-repeat top center url('~@/assets/images/login_adorn1.png');background-size:100% 100%;
}
.ctn-place{
position:absolute;top:1.61rem;right:.06rem;height:auto;width:4.79rem;
flex:1;display:flex;
.inbox-range{
flex:1;
.ctn-fix{width:3.8rem;margin:0 auto;}
}
.login-form {
.el-input {
height:.58rem;min-height:38px;
input {
height:.58rem;padding-left:.40rem;
background-color:#1042a1 !important;color:#fff;border-color:#085fa2;
}
}
.input-icon{
height:.58rem;width:.24rem;margin-left:.02rem;
}
.el-form-item__content{
line-height:.58rem;
}
.el-form-item{
margin-bottom:.25rem;
&:last-child{margin-bottom:0}
.el-select{width:100%;}
}
}
}
.logo-title{
position:absolute;top:.15rem;left:0;height:auto;width:100%;text-align:center;cursor:default;font-size:.26rem;line-height:1;letter-spacing:10px;color: rgb(56, 230, 255);text-shadow:0px 0px 2px rgb(56 230 255);
}
.subtitle{
position:absolute;top:.91rem;left:0;height:auto;width:100%;text-align:center;cursor:default;font-size:.34rem;line-height:1;letter-spacing:10px;color:#b1edf8;
}
}
.login-code {
width: 33%;
display: inline-block;
height: 38px;
float: right;
img{
cursor: pointer;
vertical-align:middle
}
}
</style>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<title>矿山模型测试</title>
<meta name="description" content="description">
<meta name="keywords" content="keywords, 梨酒客">
<meta content="yes" name="apple-mobile-web-app-capable" />
<meta content="black" name="apple-mobile-web-app-status-bar-style" />
<style type="text/css">
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td{margin:0px;padding:0px}
html, body{height:100%;width:100%;display:flex;}
body{font-family:"微软雅黑";color:#000;/* display:block;width:100%;height:100%; */}
*{box-sizing:border-box;}
.view{height:100%;}
#kmbBaseLayer_e3d8{width:'100%' !improtant;background-color:transparent !improtant;}
</style>
<script type="text/javascript" src="../js/qf_web.min.js"></script>
<script type="text/javascript">qf.openCalcLayout();</script>
</head>
<body>
<div class="view" id="view"></div>
</body>
<script src="../js/qf_web_ui.min.js"></script>
<script src="./js/md5.js"></script>
<script type="importmap">
{
"imports": {
"three": "./js/three.module.js",
"three/addons/": "./jsm/"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { OrbitControls } from './js/OrbitControls_module.js';
import { FBXLoader } from './js/FBXLoader_module.js';
qf(function(){
var vm = document.getElementById("view");
var scene = new THREE.Scene();
// 材质组
var ViewGroup = new THREE.Group();
scene.add(ViewGroup);
var loader = new FBXLoader();
window.onMessage = function(filename){
loaderModel(filename);
};
// loader
function loaderModel(filename){
clearModel();
var dir = window.location.port === '8050' ? '../' : '../../';
filename = filename || 'default.fbx';
// 进度条
var Progress = new qf.UI.progressBar({top:'1.2rem',width:'19.2rem', display:'flex', justifyContent:'center'});
// 加载模型
loader.load(dir + 'oldFbx' + filename, function(data) {
vm.modelData = data;
// 创建模型
create(data)
}, function(xhr){ // 加载进度
var progressValue = ~~(xhr.loaded / xhr.total * 10000) / 100;
Progress.setValue(progressValue);
if (progressValue === 100) {
setTimeout(() => {
Progress.remove();
}, 500);
}
});
};
function create(Obj) {
Obj.traverse(function(child) {
if (child instanceof THREE.Mesh) {
// MeshLambertMaterial材质用来渲染看上去暗淡不光亮的表面
//child.material = new THREE.MeshLambertMaterial( { color: child.material.color });
var color = qf.Utils.getRandomColor(md5(child.material.name));
child.material = new THREE.MeshLambertMaterial({color: new THREE.Color(color[0], color[1], color[2])});
// 重新计算顶点法线
var geometry = child.geometry;
if(geometry){
geometry.computeVertexNormals(0);
child.material.shading = THREE.SmoothShading;
};
}
});
var box3 = new THREE.Box3();
box3.expandByObject(Obj);
var v3 = new THREE.Vector3();
box3.getSize(v3);
function num() {
var max;
if (v3.x > v3.y) {
max = v3.x
} else {
max = v3.y
}
if (max > v3.z) {} else {
max = v3.z
}
return max;
}
var S = 100 / num();
Obj.scale.set(S, S, S)
var newBox3 = new THREE.Box3()
newBox3.expandByObject(Obj)
var center = new THREE.Vector3();
newBox3.getCenter(center)
Obj.position.x = Obj.position.x - center.x
Obj.position.y = Obj.position.y - center.y
Obj.position.z = Obj.position.z - center.z
ViewGroup.add(Obj);
render();
}
function clearModel(){
ViewGroup.clear();
render();
};
var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(100, 350, 200);
scene.add(directionalLight);
var directionalLight2 = new THREE.DirectionalLight(0xffffff, 1);
directionalLight2.position.set(-300, -100, -400);
scene.add(directionalLight2);
var directionalLight3 = new THREE.DirectionalLight(0xffffff, 1);
directionalLight3.position.set(10, 300, 30);
scene.add(directionalLight3);
/* var point = new THREE.PointLight(0xffffff, 0.9);
point.position.set(400, 150, 300);
scene.add(point);
var ambient = new THREE.AmbientLight(0xffffff, 0.3);
scene.add(ambient); */
var width = window.innerWidth;
var height = window.innerHeight;
var k = width / height;
var s = 45;
var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
camera.position.set(162, 164, 341);
var renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(width, height);
renderer.setClearColor(0x000000, .1);
vm.appendChild(renderer.domElement);
function render() {
renderer.render(scene, camera);
};
var controls = new OrbitControls(camera, renderer.domElement);
controls.addEventListener('change', function() {
var worldPosition = new THREE.Vector3();
vm.modelData && vm.modelData.getWorldPosition(worldPosition)
var standardVector = worldPosition.project(camera);
var a = window.innerWidth * qf.envir.dpr / 2;
var b = window.innerHeight * qf.envir.dpr / 2;
vm.left = Math.round(standardVector.x * a + a);
vm.top = Math.round(-standardVector.y * b + b) - 250;
render();
});
window.onresize = function() {
vm.bool = false
vm.width = window.innerWidth * qf.envir.dpr;
vm.height = window.innerHeight * qf.envir.dpr;
renderer.setSize(vm.width, vm.height);
k = (vm.width) / (vm.height);
camera.left = -s * k;
camera.right = s * k;
camera.top = s;
camera.bottom = -s;
camera.updateProjectionMatrix();
render();
};
});
</script>
</html>
This diff is collapsed.
This diff is collapsed.
import {
Curve,
Vector3,
Vector4
} from 'three';
import * as NURBSUtils from '../curves/NURBSUtils.js';
/**
* NURBS curve object
*
* Derives from Curve, overriding getPoint and getTangent.
*
* Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.
*
**/
class NURBSCurve extends Curve {
constructor(
degree,
knots /* array of reals */,
controlPoints /* array of Vector(2|3|4) */,
startKnot /* index in knots */,
endKnot /* index in knots */
) {
super();
this.degree = degree;
this.knots = knots;
this.controlPoints = [];
// Used by periodic NURBS to remove hidden spans
this.startKnot = startKnot || 0;
this.endKnot = endKnot || ( this.knots.length - 1 );
for ( let i = 0; i < controlPoints.length; ++ i ) {
// ensure Vector4 for control points
const point = controlPoints[ i ];
this.controlPoints[ i ] = new Vector4( point.x, point.y, point.z, point.w );
}
}
getPoint( t, optionalTarget = new Vector3() ) {
const point = optionalTarget;
const u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u
// following results in (wx, wy, wz, w) homogeneous point
const hpoint = NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );
if ( hpoint.w !== 1.0 ) {
// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)
hpoint.divideScalar( hpoint.w );
}
return point.set( hpoint.x, hpoint.y, hpoint.z );
}
getTangent( t, optionalTarget = new Vector3() ) {
const tangent = optionalTarget;
const u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] );
const ders = NURBSUtils.calcNURBSDerivatives( this.degree, this.knots, this.controlPoints, u, 1 );
tangent.copy( ders[ 1 ] ).normalize();
return tangent;
}
}
export { NURBSCurve };
import {
Vector3,
Vector4
} from 'three';
/**
* NURBS utils
*
* See NURBSCurve and NURBSSurface.
**/
/**************************************************************
* NURBS Utils
**************************************************************/
/*
Finds knot vector span.
p : degree
u : parametric value
U : knot vector
returns the span
*/
function findSpan( p, u, U ) {
const n = U.length - p - 1;
if ( u >= U[ n ] ) {
return n - 1;
}
if ( u <= U[ p ] ) {
return p;
}
let low = p;
let high = n;
let mid = Math.floor( ( low + high ) / 2 );
while ( u < U[ mid ] || u >= U[ mid + 1 ] ) {
if ( u < U[ mid ] ) {
high = mid;
} else {
low = mid;
}
mid = Math.floor( ( low + high ) / 2 );
}
return mid;
}
/*
Calculate basis functions. See The NURBS Book, page 70, algorithm A2.2
span : span in which u lies
u : parametric point
p : degree
U : knot vector
returns array[p+1] with basis functions values.
*/
function calcBasisFunctions( span, u, p, U ) {
const N = [];
const left = [];
const right = [];
N[ 0 ] = 1.0;
for ( let j = 1; j <= p; ++ j ) {
left[ j ] = u - U[ span + 1 - j ];
right[ j ] = U[ span + j ] - u;
let saved = 0.0;
for ( let r = 0; r < j; ++ r ) {
const rv = right[ r + 1 ];
const lv = left[ j - r ];
const temp = N[ r ] / ( rv + lv );
N[ r ] = saved + rv * temp;
saved = lv * temp;
}
N[ j ] = saved;
}
return N;
}
/*
Calculate B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.
p : degree of B-Spline
U : knot vector
P : control points (x, y, z, w)
u : parametric point
returns point for given u
*/
function calcBSplinePoint( p, U, P, u ) {
const span = findSpan( p, u, U );
const N = calcBasisFunctions( span, u, p, U );
const C = new Vector4( 0, 0, 0, 0 );
for ( let j = 0; j <= p; ++ j ) {
const point = P[ span - p + j ];
const Nj = N[ j ];
const wNj = point.w * Nj;
C.x += point.x * wNj;
C.y += point.y * wNj;
C.z += point.z * wNj;
C.w += point.w * Nj;
}
return C;
}
/*
Calculate basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.
span : span in which u lies
u : parametric point
p : degree
n : number of derivatives to calculate
U : knot vector
returns array[n+1][p+1] with basis functions derivatives
*/
function calcBasisFunctionDerivatives( span, u, p, n, U ) {
const zeroArr = [];
for ( let i = 0; i <= p; ++ i )
zeroArr[ i ] = 0.0;
const ders = [];
for ( let i = 0; i <= n; ++ i )
ders[ i ] = zeroArr.slice( 0 );
const ndu = [];
for ( let i = 0; i <= p; ++ i )
ndu[ i ] = zeroArr.slice( 0 );
ndu[ 0 ][ 0 ] = 1.0;
const left = zeroArr.slice( 0 );
const right = zeroArr.slice( 0 );
for ( let j = 1; j <= p; ++ j ) {
left[ j ] = u - U[ span + 1 - j ];
right[ j ] = U[ span + j ] - u;
let saved = 0.0;
for ( let r = 0; r < j; ++ r ) {
const rv = right[ r + 1 ];
const lv = left[ j - r ];
ndu[ j ][ r ] = rv + lv;
const temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];
ndu[ r ][ j ] = saved + rv * temp;
saved = lv * temp;
}
ndu[ j ][ j ] = saved;
}
for ( let j = 0; j <= p; ++ j ) {
ders[ 0 ][ j ] = ndu[ j ][ p ];
}
for ( let r = 0; r <= p; ++ r ) {
let s1 = 0;
let s2 = 1;
const a = [];
for ( let i = 0; i <= p; ++ i ) {
a[ i ] = zeroArr.slice( 0 );
}
a[ 0 ][ 0 ] = 1.0;
for ( let k = 1; k <= n; ++ k ) {
let d = 0.0;
const rk = r - k;
const pk = p - k;
if ( r >= k ) {
a[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];
d = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];
}
const j1 = ( rk >= - 1 ) ? 1 : - rk;
const j2 = ( r - 1 <= pk ) ? k - 1 : p - r;
for ( let j = j1; j <= j2; ++ j ) {
a[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];
d += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];
}
if ( r <= pk ) {
a[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];
d += a[ s2 ][ k ] * ndu[ r ][ pk ];
}
ders[ k ][ r ] = d;
const j = s1;
s1 = s2;
s2 = j;
}
}
let r = p;
for ( let k = 1; k <= n; ++ k ) {
for ( let j = 0; j <= p; ++ j ) {
ders[ k ][ j ] *= r;
}
r *= p - k;
}
return ders;
}
/*
Calculate derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.
p : degree
U : knot vector
P : control points
u : Parametric points
nd : number of derivatives
returns array[d+1] with derivatives
*/
function calcBSplineDerivatives( p, U, P, u, nd ) {
const du = nd < p ? nd : p;
const CK = [];
const span = findSpan( p, u, U );
const nders = calcBasisFunctionDerivatives( span, u, p, du, U );
const Pw = [];
for ( let i = 0; i < P.length; ++ i ) {
const point = P[ i ].clone();
const w = point.w;
point.x *= w;
point.y *= w;
point.z *= w;
Pw[ i ] = point;
}
for ( let k = 0; k <= du; ++ k ) {
const point = Pw[ span - p ].clone().multiplyScalar( nders[ k ][ 0 ] );
for ( let j = 1; j <= p; ++ j ) {
point.add( Pw[ span - p + j ].clone().multiplyScalar( nders[ k ][ j ] ) );
}
CK[ k ] = point;
}
for ( let k = du + 1; k <= nd + 1; ++ k ) {
CK[ k ] = new Vector4( 0, 0, 0 );
}
return CK;
}
/*
Calculate "K over I"
returns k!/(i!(k-i)!)
*/
function calcKoverI( k, i ) {
let nom = 1;
for ( let j = 2; j <= k; ++ j ) {
nom *= j;
}
let denom = 1;
for ( let j = 2; j <= i; ++ j ) {
denom *= j;
}
for ( let j = 2; j <= k - i; ++ j ) {
denom *= j;
}
return nom / denom;
}
/*
Calculate derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.
Pders : result of function calcBSplineDerivatives
returns array with derivatives for rational curve.
*/
function calcRationalCurveDerivatives( Pders ) {
const nd = Pders.length;
const Aders = [];
const wders = [];
for ( let i = 0; i < nd; ++ i ) {
const point = Pders[ i ];
Aders[ i ] = new Vector3( point.x, point.y, point.z );
wders[ i ] = point.w;
}
const CK = [];
for ( let k = 0; k < nd; ++ k ) {
const v = Aders[ k ].clone();
for ( let i = 1; i <= k; ++ i ) {
v.sub( CK[ k - i ].clone().multiplyScalar( calcKoverI( k, i ) * wders[ i ] ) );
}
CK[ k ] = v.divideScalar( wders[ 0 ] );
}
return CK;
}
/*
Calculate NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.
p : degree
U : knot vector
P : control points in homogeneous space
u : parametric points
nd : number of derivatives
returns array with derivatives.
*/
function calcNURBSDerivatives( p, U, P, u, nd ) {
const Pders = calcBSplineDerivatives( p, U, P, u, nd );
return calcRationalCurveDerivatives( Pders );
}
/*
Calculate rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.
p1, p2 : degrees of B-Spline surface
U1, U2 : knot vectors
P : control points (x, y, z, w)
u, v : parametric values
returns point for given (u, v)
*/
function calcSurfacePoint( p, q, U, V, P, u, v, target ) {
const uspan = findSpan( p, u, U );
const vspan = findSpan( q, v, V );
const Nu = calcBasisFunctions( uspan, u, p, U );
const Nv = calcBasisFunctions( vspan, v, q, V );
const temp = [];
for ( let l = 0; l <= q; ++ l ) {
temp[ l ] = new Vector4( 0, 0, 0, 0 );
for ( let k = 0; k <= p; ++ k ) {
const point = P[ uspan - p + k ][ vspan - q + l ].clone();
const w = point.w;
point.x *= w;
point.y *= w;
point.z *= w;
temp[ l ].add( point.multiplyScalar( Nu[ k ] ) );
}
}
const Sw = new Vector4( 0, 0, 0, 0 );
for ( let l = 0; l <= q; ++ l ) {
Sw.add( temp[ l ].multiplyScalar( Nv[ l ] ) );
}
Sw.divideScalar( Sw.w );
target.set( Sw.x, Sw.y, Sw.z );
}
export {
findSpan,
calcBasisFunctions,
calcBSplinePoint,
calcBasisFunctionDerivatives,
calcBSplineDerivatives,
calcKoverI,
calcRationalCurveDerivatives,
calcNURBSDerivatives,
calcSurfacePoint,
};
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment