askin 2 anni fa
parent
commit
34f3b4e612
100 ha cambiato i file con 24369 aggiunte e 0 eliminazioni
  1. 16 0
      sources/client/vrv-moblie/.hbuilderx/launch.json
  2. 26 0
      sources/client/vrv-moblie/App.vue
  3. 321 0
      sources/client/vrv-moblie/components/best-gauge/best-gauge.vue
  4. 0 0
      sources/client/vrv-moblie/components/canvasList/canvasList.js
  5. 663 0
      sources/client/vrv-moblie/components/curve-charts/canvas.js
  6. 18 0
      sources/client/vrv-moblie/components/curve-charts/datas.js
  7. 63 0
      sources/client/vrv-moblie/components/curve-charts/index.vue
  8. 187 0
      sources/client/vrv-moblie/components/jerry-gauge/index.js
  9. 54 0
      sources/client/vrv-moblie/components/jerry-gauge/index.vue
  10. 123 0
      sources/client/vrv-moblie/components/mpvue-echarts/src/echarts.vue
  11. 73 0
      sources/client/vrv-moblie/components/mpvue-echarts/src/wx-canvas.js
  12. 5046 0
      sources/client/vrv-moblie/components/u-charts/u-charts.js
  13. 20 0
      sources/client/vrv-moblie/index.html
  14. 21 0
      sources/client/vrv-moblie/main.js
  15. 75 0
      sources/client/vrv-moblie/manifest.json
  16. 16 0
      sources/client/vrv-moblie/package.json
  17. 200 0
      sources/client/vrv-moblie/pages.json
  18. 71 0
      sources/client/vrv-moblie/pages/alarm/alarm.vue
  19. 82 0
      sources/client/vrv-moblie/pages/alarmRecord/alarmRecord.vue
  20. 290 0
      sources/client/vrv-moblie/pages/dataCurve/dataCurve.vue
  21. 107 0
      sources/client/vrv-moblie/pages/device/device.vue
  22. 171 0
      sources/client/vrv-moblie/pages/device/deviceInfo/deviceInfo.vue
  23. 30 0
      sources/client/vrv-moblie/pages/error/error.vue
  24. 234 0
      sources/client/vrv-moblie/pages/login/login.vue
  25. 82 0
      sources/client/vrv-moblie/pages/maintenanceRecord/maintenanceRecord.vue
  26. 82 0
      sources/client/vrv-moblie/pages/operator/operator.vue
  27. 143 0
      sources/client/vrv-moblie/pages/operator/operatorInfo/operatorInfo.vue
  28. 76 0
      sources/client/vrv-moblie/pages/operatorLog/operatorLog.vue
  29. 354 0
      sources/client/vrv-moblie/pages/parameterSetting/parameterSetting.vue
  30. 67 0
      sources/client/vrv-moblie/pages/project/project.vue
  31. 304 0
      sources/client/vrv-moblie/pages/project/projectInfo/projectInfo.vue
  32. 102 0
      sources/client/vrv-moblie/pages/rolePower/rolePower.vue
  33. 336 0
      sources/client/vrv-moblie/pages/runningState/runningState.vue
  34. 269 0
      sources/client/vrv-moblie/pages/staticProject/staticProject.vue
  35. 195 0
      sources/client/vrv-moblie/pages/systemParameter/systemParameter.vue
  36. 79 0
      sources/client/vrv-moblie/pages/systemSet/systemSet.vue
  37. 78 0
      sources/client/vrv-moblie/pages/user/user.vue
  38. 28 0
      sources/client/vrv-moblie/project.config.json
  39. 7 0
      sources/client/vrv-moblie/project.private.config.json
  40. BIN
      sources/client/vrv-moblie/static/底部按钮/报警管理@2x.png
  41. BIN
      sources/client/vrv-moblie/static/底部按钮/操作日志@2x.png
  42. BIN
      sources/client/vrv-moblie/static/底部按钮/系统设置@2x.png
  43. BIN
      sources/client/vrv-moblie/static/底部按钮/运营商管理@2x.png
  44. BIN
      sources/client/vrv-moblie/static/底部按钮/项目管理@2x.png
  45. BIN
      sources/client/vrv-moblie/static/权限管理/管理员@2x.png
  46. BIN
      sources/client/vrv-moblie/static/权限管理/运营商@2x.png
  47. BIN
      sources/client/vrv-moblie/static/登录/bg@2x.png
  48. BIN
      sources/client/vrv-moblie/static/系统设置/系统设置@2x.png
  49. BIN
      sources/client/vrv-moblie/static/设备菜单/前往列表@2x.png
  50. BIN
      sources/client/vrv-moblie/static/设备菜单/参数设置@2x.png
  51. BIN
      sources/client/vrv-moblie/static/设备菜单/报警记录@2x.png
  52. BIN
      sources/client/vrv-moblie/static/设备菜单/数据曲线@2x.png
  53. BIN
      sources/client/vrv-moblie/static/设备菜单/系统参数@2x.png
  54. BIN
      sources/client/vrv-moblie/static/设备菜单/维保记录@2x.png
  55. BIN
      sources/client/vrv-moblie/static/设备菜单/运行状态@2x.png
  56. BIN
      sources/client/vrv-moblie/static/运营商管理/1@3x.png
  57. BIN
      sources/client/vrv-moblie/static/运营商管理/ico2@3x.png
  58. BIN
      sources/client/vrv-moblie/static/项目管理/图像@2x.png
  59. BIN
      sources/client/vrv-moblie/static/项目管理/地址@2x.png
  60. BIN
      sources/client/vrv-moblie/static/项目管理/联系人@2x.png
  61. BIN
      sources/client/vrv-moblie/static/项目管理/项目管理@2x.png
  62. 76 0
      sources/client/vrv-moblie/uni.scss
  63. 246 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/changelog.md
  64. 1607 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue
  65. 46 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue
  66. 162 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue
  67. 170 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading2.vue
  68. 173 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading3.vue
  69. 222 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading4.vue
  70. 229 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading5.vue
  71. 36 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/qiun-loading.vue
  72. 422 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/config-echarts.js
  73. 601 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js
  74. 5 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/readme.md
  75. 7297 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js
  76. 18 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js
  77. 201 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/license.md
  78. 84 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/package.json
  79. 102 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/readme.md
  80. 23 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/static/app-plus/echarts.min.js
  81. 23 0
      sources/client/vrv-moblie/uni_modules/qiun-data-charts/static/h5/echarts.min.js
  82. 22 0
      sources/client/vrv-moblie/uni_modules/uni-icons/changelog.md
  83. 1169 0
      sources/client/vrv-moblie/uni_modules/uni-icons/components/uni-icons/icons.js
  84. 96 0
      sources/client/vrv-moblie/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
  85. 663 0
      sources/client/vrv-moblie/uni_modules/uni-icons/components/uni-icons/uniicons.css
  86. BIN
      sources/client/vrv-moblie/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
  87. 86 0
      sources/client/vrv-moblie/uni_modules/uni-icons/package.json
  88. 8 0
      sources/client/vrv-moblie/uni_modules/uni-icons/readme.md
  89. 8 0
      sources/client/vrv-moblie/uni_modules/uni-scss/changelog.md
  90. 1 0
      sources/client/vrv-moblie/uni_modules/uni-scss/index.scss
  91. 82 0
      sources/client/vrv-moblie/uni_modules/uni-scss/package.json
  92. 4 0
      sources/client/vrv-moblie/uni_modules/uni-scss/readme.md
  93. 7 0
      sources/client/vrv-moblie/uni_modules/uni-scss/styles/index.scss
  94. 3 0
      sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_border.scss
  95. 66 0
      sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_color.scss
  96. 55 0
      sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_radius.scss
  97. 56 0
      sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_space.scss
  98. 167 0
      sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_styles.scss
  99. 24 0
      sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_text.scss
  100. 0 0
      sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_variables.scss

+ 16 - 0
sources/client/vrv-moblie/.hbuilderx/launch.json

@@ -0,0 +1,16 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 26 - 0
sources/client/vrv-moblie/App.vue

@@ -0,0 +1,26 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		},
+		onPageNotFound() {
+			uni.navigateTo({
+				url:'pages/error/error'
+			})
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+	page{
+		background-color:  #F6F7FB;
+	}
+	
+</style>

+ 321 - 0
sources/client/vrv-moblie/components/best-gauge/best-gauge.vue

@@ -0,0 +1,321 @@
+<template>
+	<view class="gauge-box" :style="{'background-color': bgColor}">
+		<canvas :canvas-id="config.id" :style="{'width' : _width + 'px','height' : _width + 'px'}"></canvas>
+	</view>
+</template>
+
+<script>
+	const mainDefault = {
+		bgColor: 'rgba(30,130,250,1)',
+		startAngle: 0.75,
+		endAngle: 0.25,
+		width: uni.upx2px(350),
+		padding: 10,
+		min: 0,
+		max: 100,
+		value: 0,
+		unit: '℃',
+		name: 'CK01排风温度显示',
+		detail: {},
+		axisTick: []
+	};
+	const detailDefault = { //标题、数值、单位设置
+		title: { //name字体位置设置
+			offsetCenter: [0, uni.upx2px(160)], //距离圆心直径偏移
+			color: '#A9CCFD',
+			fontSize: uni.upx2px(28),
+			fontWeight: 'normal',
+			textAlign: 'center'
+		},
+		value: {
+			color: '#FFFFFF',
+			fontSize: uni.upx2px(48),
+			fontWeight: 'bolder',
+			offsetCenter: [-10, uni.upx2px(15)], //距离圆心直径偏移
+			textAlign: 'center'
+		},
+		unit: {
+			color: '#FFFFFF',
+			fontSize: uni.upx2px(48),
+			fontWeight: 'normal',
+			offsetCenter: [0, uni.upx2px(15)], //距离圆心直径偏移
+			textAlign: 'center'
+		}
+	};
+	const axisTickDefault = { //轴刻度线
+		width: uni.upx2px(25), //轴长
+		number: 6, //轴数量(相当于几等分)
+		color: '#33ff33,#ff9933', //轴颜色(第一个值--指针之前的颜色,之后的颜色)
+		subNumber: 10, //一个大刻度分成几个小刻度
+		subWidth: uni.upx2px(25),
+		subHeight: 1,
+		padding: uni.upx2px(10) //刻度距离边距
+	};
+	const axisTickDefaultSmall = { //轴刻度线(里圈)
+		width: uni.upx2px(10), //轴长
+		number: 6, //轴数量(相当于几等分)
+		color: '#33ff33,#ff9933', //轴颜色(第一个值--指针之前的颜色,之后的颜色)
+		subNumber: 10, //大刻度之间分成几个小刻度
+		subWidth: uni.upx2px(6),
+		subHeight: 1,
+		padding: uni.upx2px(25) //刻度距离边距
+	};
+	export default {
+		data: function() {
+			return {
+				gaugeOption: {}
+			}
+		},
+		props: {
+			config: {
+				type: Object,
+				default: () => {
+					return {};
+				}
+			},
+			bgColor: {
+				type: String,
+				default: 'linear-gradient(180deg, #2A8FFB 0%, #0467FB 100%)',
+
+			}
+		},
+		computed: {
+			_width: function() {
+				return this.config.width || mainDefault.width
+			},
+			_status: function() {
+				return String(this.config.status) !== 'false' ? true : false;
+			},
+			_dStatus: function() {
+				return String(this.config.status) === 'true' || this.config.status === 1 ? 1 : 0;
+			}
+		},
+		watch: {
+			config: {
+				handler(newVal, oldVal) {
+					this.initCharts();
+				},
+				deep: true
+			}
+		},
+		mounted: function() {
+			this.initCharts();
+		},
+		methods: {
+			initCharts: function() {
+				// 自动填充数据
+				var gaugeOption = this.fillInData();
+				var uChartsGauge = null;
+				uChartsGauge = uni.createCanvasContext(gaugeOption.id, this);
+				uChartsGauge.fillStyle = gaugeOption.bgColor;
+				uChartsGauge.fillRect(0, 0, gaugeOption.width, gaugeOption.width);
+				uChartsGauge.save();
+				this.drawGauge(gaugeOption, uChartsGauge);
+			},
+			drawGauge: function(options, ctx) {
+				var centerPosition = {
+					x: options.width / 2,
+					y: options.width / 2
+				};
+				// 总角度数(为什么要加1)假装下图是个圆  0.75PI ~ 0.25PI 实际间隔1.5PI 
+				//   1.5PI
+				//     ——
+			 // 1.0PI	|	   |  0PI
+				//     ——
+				//   0.5PI
+				var totalAngle = options.startAngle - options.endAngle + 1;
+				// 计算半径
+				var radius = Math.min(centerPosition.x, centerPosition.y);
+
+				//画刻度线
+				for (let idx = 0, len = options.axisTick.length; idx < len; idx++) {
+					var gaugeOption = options.axisTick[idx];
+					radius -= (gaugeOption.padding + gaugeOption.width / 2);
+					var criticalPoint = Math.floor(options.value / (options.max / gaugeOption.number)); //大刻度临界点
+					var subCriticalPoint = Math.floor(options.value / (options.max / gaugeOption.subNumber /
+						gaugeOption.number)); //小刻度临界点
+					if (options.value * 1 === 0) {
+						criticalPoint = -1; //防止0的时候被上颜色
+						subCriticalPoint = -1;
+					}
+					var colors = gaugeOption.color.split(',');
+					colors[1] = colors[1] || colors[0];
+					var splitAngle = totalAngle / gaugeOption.number;
+					var childAngle = totalAngle / gaugeOption.number / gaugeOption.subNumber;
+					var startX = -radius - gaugeOption.width * 0.5;
+					var endX = -radius - gaugeOption.width * 0.5 + gaugeOption.width;
+					var childEndX = -radius - gaugeOption.width * 0.5 + gaugeOption.subWidth;
+
+					// 画大刻度
+					let maxScaleData = {
+						...centerPosition,
+						startX,
+						endX,
+						splitAngle,
+						criticalPoint,
+						colors,
+						startAngle: options.startAngle,
+						width: gaugeOption.subHeight,
+						number: gaugeOption.number,
+					}
+					this.drawScale(ctx, maxScaleData);
+
+					// 画小刻度
+					let minScaleData = {
+						...centerPosition,
+						startX,
+						colors,
+						criticalPoint: subCriticalPoint,
+						endX: childEndX,
+						splitAngle: childAngle,
+						startAngle: options.startAngle,
+						width: gaugeOption.subHeight,
+						number: gaugeOption.number * gaugeOption.subNumber,
+					}
+					this.drawScale(ctx, minScaleData);
+				}
+				// 标题
+				var titleObj = {
+					...options.detail.title,
+					...centerPosition,
+					name: options.name
+				}
+				this.drawText(ctx, titleObj);
+
+				// 数值
+				var _fillText = (options.value * 1) === 0 ? 0 : (options.value * 1).toFixed(1);
+				var valueObj = {
+					...options.detail.value,
+					...centerPosition,
+					name: _fillText
+				}
+				this.drawText(ctx, valueObj);
+
+				// 单位
+				if (String(options.unit) !== 'false') {
+					let unitObj = {
+						...options.detail.unit,
+						...centerPosition,
+						name: options.unit
+					}
+					var valueLength = (options.value * 1).toFixed(1).length;
+					var _oftX = ((valueLength - 1.5) / 2) * valueObj.fontSize; //需要保证单位在数值后面
+					unitObj.offsetCenter[0] += _oftX;
+					this.drawText(ctx, unitObj);
+				}
+
+				ctx.draw();
+			},
+			// 画字
+			drawText: function(ctx, data) {
+				let {
+					fontSize,
+					fontWeight,
+					color,
+					textAlign,
+					offsetCenter,
+					x,
+					y,
+					name
+				} = data;
+				// 画标题
+				ctx.beginPath();
+				// 设置字体
+				ctx.font = fontWeight + " " + fontSize + "px MicrosoftYaHei";
+				// 设置颜色
+				ctx.fillStyle = color;
+				// 设置水平对齐方式
+				ctx.textAlign = textAlign;
+				// 设置中心点
+				ctx.translate(x, y);
+				// 绘制文字(参数:要写的字,x坐标,y坐标)
+				ctx.fillText(name, ...offsetCenter);
+				ctx.closePath();
+				ctx.stroke();
+				ctx.restore();
+				ctx.save();
+			},
+			// 画刻度
+			drawScale: function(ctx, data) {
+				let {
+					number,
+					criticalPoint,
+					startX,
+					endX,
+					splitAngle,
+					width,
+					x,
+					y,
+					startAngle,
+					colors
+				} = data;
+				// 设置中心点
+				ctx.translate(x, y);
+				ctx.rotate((startAngle - 1) * Math.PI);
+				for (let i = 0; i <= number; i++) {
+					ctx.beginPath();
+					ctx.setStrokeStyle(i <= criticalPoint ? colors[0] : colors[1]);
+					ctx.setLineWidth(width);
+					ctx.moveTo(startX, 0);
+					ctx.lineTo(endX, 0);
+					ctx.stroke();
+					ctx.rotate(splitAngle * Math.PI);
+				}
+				// 清除状态
+				ctx.restore();
+				ctx.save();
+			},
+			fillInData: function() {
+				var gaugeOption = this.deepClone(mainDefault, this.config);
+				for (var _k in detailDefault) {
+					gaugeOption.detail[_k] = this.deepClone(detailDefault[_k], gaugeOption.detail[_k])
+				}
+				if (gaugeOption.axisTickLength === undefined || gaugeOption.axisTickLength === null) {
+					if (!(gaugeOption.axisTick instanceof Array)) {
+						gaugeOption.axisTick = [gaugeOption.axisTick]
+					}
+				} else {
+					gaugeOption.axisTick = gaugeOption.axisTick || [];
+				}
+				var axisTickLength = gaugeOption.axisTickLength || gaugeOption.axisTick.length || 1;
+				var axisTick = [].concat(gaugeOption.axisTick);
+				for (var idx = 0, len = axisTickLength; idx < len; idx++) {
+					var defaultData = idx == 0 ? axisTickDefault : axisTickDefaultSmall;
+					axisTick[idx] = axisTick[idx] || {};
+					if (idx > 0 && !axisTick[idx].padding) {
+						axisTick[idx].padding = +axisTick[idx - 1].width;
+					}
+					axisTick[idx] = this.deepClone(defaultData, axisTick[idx]);
+				}
+				gaugeOption.axisTick = axisTick
+				return gaugeOption;
+			},
+			deepClone: function(source, target) { //待优化代码
+				var _obj = {};
+				source = source || {};
+				target = target || {};
+				Object.assign(_obj, source, target);
+				return JSON.parse(JSON.stringify(_obj));
+			}
+		}
+	};
+</script>
+
+<style>
+	.gauge-box {
+		position: relative;
+		width: 360rpx;
+		height: 180rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		text-align: center;
+	}
+
+	.gauge-box canvas {
+		width: 100%;
+		margin: 0 auto;
+		height: auto;
+		display: block;
+	}
+</style>

+ 0 - 0
sources/client/vrv-moblie/components/canvasList/canvasList.js


+ 663 - 0
sources/client/vrv-moblie/components/curve-charts/canvas.js

@@ -0,0 +1,663 @@
+/**
+ * 发现bug 
+ * android app上字体要大于等于20px才能画多个字体,不然要每次调用fillText时都要设置字体
+ * android app上,重绘时会一直闪烁
+ * */
+class canvasDraw {
+	/*
+	* @params{ DOM } canvasEl canvas元素节点
+	* @params{ Object } option 统计图配置信息
+	*/
+	constructor(el, option) {
+		// canvas DOM;
+		this.option = option;
+		this.context = el.context;
+		// canvas宽高
+		this.width = el.width;
+		this.height = el.height;
+		// 预留XY文字间距
+		this.reservedSpace = 55;
+		this.textAndDotSpace = 10;
+		// X点之间的间隔 宽高
+		this.spaceX = 1;
+		this.spaceY = 70;
+		this.xWidth = 1;
+		this.xHeight = 1;
+		
+		this.XList = [];
+		this.YList = [];
+
+		let yAxis = this.option.yAxis || {};
+		
+		this.xAxis = this.option.xAxis.map(e => { 
+			let date = new Date(e) 
+			return date.getFullYear() + '年' + (date.getMonth() + 1) + '月' + date.getDate() + '日';
+		})
+		let measure = this.context.measureText(this.xAxis[0]).width;
+		this.xAxisLength = measure || (this.width - this.reservedSpace) / 2;
+		
+		this.drawDataList = this.option.data || [];
+		this.xScaleListLength = this.drawDataList[0] && this.drawDataList[0].data.length || 0;
+
+		// 刻度数量
+		this.scale = yAxis.subsection ? yAxis.subsection + 1 : 5;
+
+		this.xScaleSizeOriginal = 0;
+
+		// XY文字颜色  X线条点颜色 数据线颜色
+		this.XYTextColor = '#666666';
+		this.XDotColor = '#666666';
+		this.dataLineXColor = this.option.dataLineXColor || [];
+		if (this.dataLineXColor.length < this.xScaleListLength) {
+			this.dataLineXColor = this.dataLineXColor.concat(
+				[...Array(this.xScaleListLength - this.dataLineXColor.length).keys()]
+				.map(e => this.getColor16())
+			)
+		}
+		this.dataDotSize = 5;
+		this.dataLineSize = 0.5;
+		
+		let data = this.drawDataList.length > 1 ? 
+		this.drawDataList.map(e => e.data).reduce((a,b) => a.concat(b || [])) 
+		: this.drawDataList[0].data;
+		
+		this.max = Math.max.apply(null, data);
+		this.min = Math.min.apply(null, data);
+		
+		
+		this.yScaleList = [];
+		this.xScaleList = [];
+
+		// 获取鼠标手势事件参数
+		this.touchX = 0;
+		this.touchY = 0;
+
+		// 计数的做优化的值
+		this.timeout = null;
+
+		// 初始化
+		this.init();
+
+		// 绑定事件
+		if(el.addEventListener){
+			this.el.addEventListener('touchstart', touchstart, false);
+			this.el.addEventListener('touchmove', touchmove, false);
+			this.el.addEventListener('touchend', touchend, false);
+			this.el.addEventListener('mouseout', mouseout, false);
+			this.el.addEventListener('mousemove', mousemove, false);
+		}
+	}
+	/**
+	* 获取刻度数据
+	* @return {Array} kedu
+	*/
+	getDatas(){
+		let max =  this.max;
+		let keduObject = this.keduObject = this.getMeanInfo();
+		
+		let kedu = [];
+		if(keduObject.lose){
+			for (let i = keduObject.lose; i > 0; i--) {
+				if(keduObject.mean < 0){
+					kedu.push(parseFloat((keduObject.mean * i).toFixed(2)));
+				}else{
+					kedu.push(parseFloat('-' + (keduObject.mean * i).toFixed(2)));
+				}
+			}
+		}
+		kedu.push(0)
+		for (let i = 1, length = keduObject.just; i <= length; i++) {
+			kedu.push(parseFloat((Math.abs(keduObject.mean) * i).toFixed(2)));
+		}
+		return kedu
+	}
+	/**
+	* 刻度算法
+	* @return {Number} 刻度大小
+	*/
+	meanFun(max, num = 4, bool) {
+		if(max == 0 || num == 0){
+			return 0
+		}
+		if(max < 0){
+			Math.abs(max)
+		}
+		if (bool) {
+			max = max.toFixed(2) * 100;
+			return ((max + max % num) / num) / 100;
+		}
+		return Math.ceil((max + max % num) / num);
+	}
+	/**
+	* 计算刻度数据
+	* @return {Object} .just 正刻度量  .lose 负刻度量 .mean刻度大小
+	*/
+	getMeanInfo() {
+		let max = this.max;
+		let min = this.min;
+		let subsection = this.scale - 1;
+		
+		let boolEan =  Math.floor(max) === Math.floor(min);
+		
+		if (max > 0 && min < 0) {
+			let copyMin = Math.abs(min);
+			let mean = this.meanFun(copyMin + max, subsection, boolEan);
+			let bool = copyMin > max;
+			let num = Math.floor([bool ? copyMin : max][0] / mean);
+			let nMean = this.meanFun([bool ? copyMin : max][0], num, boolEan);
+			
+			return {
+				just: bool ? subsection - num : num,
+				mean: nMean,
+				lose: !bool ? subsection - num : num
+			}
+		} else if (max >= 0 && min >= 0) {
+			return {
+				just: subsection,
+				mean: this.meanFun(max, subsection,boolEan),
+				lose: 0
+			}
+		} else if (max <= 0 && min < 0) {
+			this.isLose = true;
+			return {
+				just: 0,
+				mean: this.meanFun(min, subsection,boolEan),
+				lose: subsection
+			}
+		}
+	}
+	/**
+	* 初始化统计图
+	*/
+	init() {
+		this.YText = this.getDatas().reverse();
+		this.getYAxisList();
+		this.getXAxisList();
+		
+		this.drawXYAxis();
+		this.drawYText();
+		this.drawXText();
+		this.initData();
+	}
+	
+	/**
+	* 悬停线
+	*/
+	drawMouseTooltipLine() {
+		if (!this.isTouch()) return;
+		this.dataLineSize = 1;
+		// this.redraw();
+		this.drawMouseTooltipLineContext();
+		this.drawMouseTooltip();
+	}
+	/**
+	* 绘制悬停线
+	*/
+	drawMouseTooltipLineContext(){
+		this.context.beginPath();
+		this.context.strokeStyle = 'rgba(0,0,0,0.3)';
+		this.context.lineTo(this.touchX, this.YList[0]);
+		this.context.lineTo(this.touchX, this.YList[this.YList.length - 1]);
+		this.context.stroke();
+	}
+	/**
+	* 用于判断是否是在图指定区域里
+	* @return {Boolean} true在指定区域里
+	*/
+	isTouch() {
+		let XList = this.XList;
+		let YList = this.YList;
+		let touchX = this.touchX;
+		let touchY = this.touchY;
+
+		let maxX = XList[XList.length - 1];
+		let minX = XList[0];
+		let maxY = YList[YList.length - 1];
+		let minY = YList[0];
+
+		return (
+			touchX >= minX && touchX <= maxX &&
+			touchY >= minY && touchY <= maxY
+		)
+	}
+
+
+	/**
+	* 绘制悬停圈
+	* 绘制坐标点数据
+	*/
+	drawMouseTooltip() {
+		let XList = this.XList;
+		let YList = this.YList;
+		let touchX = this.touchX;
+		let list = this.drawDataList;
+		let fontTxtSize = this.fontTxtSize;
+		let xScaleList = this.xScaleList;
+		let yScaleList = this.yScaleList;
+		let dataLineXColor = this.dataLineXColor;
+		let lineHeight = this.lineHeight;
+		let textIndent = this.textIndent;
+		let minXValue = XList[0];
+		let minYValue = YList[0];
+		let xAxis = this.xAxis;
+
+		let index = this.touchIndex = this.getBigValueMin(xScaleList, touchX);
+
+		this.tooltipHeight = (fontTxtSize + lineHeight) * (list.length + 1) + lineHeight;
+		
+		list.forEach((e, i) => {
+			
+			this.context.beginPath();
+			if(touchX > xScaleList[index] - 2 && touchX < xScaleList[index] + 2){
+				this.context.fillStyle = dataLineXColor[i];
+				this.context.globalAlpha=0.3;
+				this.context.arc(touchX, yScaleList[i][index], fontTxtSize / 2, 0, 2 * Math.PI);
+				this.context.fill();
+				
+				this.context.beginPath();
+				this.context.globalAlpha= 1;
+				this.context.fillStyle = '#FFFFFF';
+				this.context.arc(touchX, yScaleList[i][index], fontTxtSize / 4 + 0.5, 0, 2 * Math.PI);
+				this.context.fill();
+				
+				this.context.beginPath();
+				this.context.globalAlpha= 1;
+				this.context.fillStyle = dataLineXColor[i];
+				this.context.arc(touchX, yScaleList[i][index], fontTxtSize / 4, 0, 2 * Math.PI);
+				this.context.fill();
+			}
+			
+		})
+		
+		// tip长度
+		this.context.textAlign = 'start';
+		this.context.textBaseline = 'middle';
+		this.context.fillStyle = '#FFFFFF';
+		let measure = this.context.measureText(xAxis[index]).width;
+		this.tooltipWidth = measure ? measure + this.fontTxtSize * 2 : (this.width - this.reservedSpace) / 2;
+		list.forEach((e, i) => {
+			let dataTxt = e.data;
+			let title = (e.title || '') + ':' + dataTxt[index];
+			let measure = this.context.measureText(title).width;
+			let tooltipWidth = measure ? measure + this.fontTxtSize * 2 : (this.width - this.reservedSpace) / 2;
+			if(tooltipWidth > this.tooltipWidth){
+				this.tooltipWidth = tooltipWidth;
+			}
+		})
+		
+		this.context.beginPath()
+		this.context.fillStyle = 'rgba(255,255,255,1)';
+		this.roundRect(minXValue, minYValue, this.tooltipWidth, this.tooltipHeight, 3);
+		this.context.fill();
+		
+		this.context.beginPath()
+		this.context.strokeStyle = 'rgba(220,65,55,1)';
+		this.context.moveTo(minXValue, minYValue);
+		this.context.lineTo(minXValue + this.tooltipWidth, minYValue);
+		this.context.lineTo(minXValue + this.tooltipWidth, minYValue + this.tooltipHeight);
+		this.context.lineTo(minXValue, minYValue + this.tooltipHeight);
+		this.context.closePath()
+		this.context.stroke();
+		
+		this.context.beginPath()
+		this.context.fillStyle = '#333333';
+		this.context.font = this.fontTxtSize + this.fontFamily;
+		this.context.fillText(xAxis[index], minXValue + textIndent, minYValue + lineHeight + textIndent / 2, );
+		let x = 0;
+		let y = 0;
+		list.forEach((e, i) => {
+			this.context.beginPath();
+			this.context.fillStyle = '#333333';
+			let dataTxt = e.data;
+			let title = (e.title || '') + ':' + dataTxt[index];
+			x = minXValue + textIndent;
+			y = minYValue + (fontTxtSize + lineHeight) * (i + 1) + textIndent / 2;
+			this.context.font = this.fontTxtSize + this.fontFamily;
+			this.context.fillText(title, x + textIndent * 2, y + lineHeight);
+			
+			this.context.beginPath();
+			this.context.fillStyle = dataLineXColor[i];
+			this.context.arc(x + textIndent / 2, y + lineHeight, fontTxtSize / 4, 0, 2 * Math.PI);
+			this.context.fill();
+		})
+		// #ifdef H5
+		setTimeout(() => {
+			this.context.draw(true);
+		},100)
+		// #endif
+		// #ifndef H5
+		this.context.draw(true);
+		// #endif
+	}
+	/**
+	* 绘制圆角矩形
+	*/
+	roundRect(x, y, w, h, r) {
+		if (w < 2 * r) r = w / 2;
+		if (h < 2 * r) r = h / 2;
+		this.context.beginPath();
+		this.context.moveTo(x + r, y);
+		this.context.arcTo(x + w, y, x + w, y + h, r);
+		this.context.arcTo(x + w, y + h, x, y + h, r);
+		this.context.arcTo(x, y + h, x, y, r);
+		this.context.arcTo(x, y, x + w, y, r);
+		this.context.closePath();
+	}
+	/**
+	* 获取数据点下标
+	*/
+	getBigValueMin(array, x) {
+		for (let i = 0, length = array.length; i < length; i++) {
+			if (array[i] >= x) {
+				return i;
+			}
+		}
+		return array.length - 1;
+	}
+	/**
+	* 获取数据对应坐标
+	*/
+	initData() {
+		let YList = this.YList;
+		let XList = this.XList;
+		let YText = this.YText;
+		let reservedSpace = this.reservedSpace;
+		let xAxisLength = this.xAxisLength;
+		// 刻度最大值最小值
+		let minData = YText[YText.length - 1];
+		let maxScaleList = YText[0];
+		// 0坐标到Y刻度总高度的距离
+		let XYHeight = YList[YList.length - 1];
+		// Y刻度总高度
+		let yHeight = XYHeight - this.spaceY;
+		// x总刻度
+		let xScaleAll = XList[XList.length - 1];
+		// X每刻度大小
+		this.xScaleSizeOriginal = this.xScaleSize = parseFloat(((xScaleAll - reservedSpace) / (this.xScaleListLength - 1)).toFixed(
+			2));
+		// y刻度每份大小
+		let yScaleSize = this.yScaleSize = 0;
+		// 当刻度最大值是0或者负数的时候
+		if (YText[0] <= 0) {
+			this.yScaleSize = yScaleSize = parseFloat((yHeight / (Math.abs(minData) - Math.abs(maxScaleList))).toFixed(8));
+			this.drawDataList.forEach(data => {
+				let list = data.data;
+				this.yScaleList.push(list.map(e => Math.floor((Math.abs(e)) * yScaleSize + this.spaceY)));
+			})
+		} else {
+			this.yScaleSize = yScaleSize = parseFloat((yHeight / (maxScaleList - minData)).toFixed(8));
+			this.drawDataList.forEach(data => {
+				let list = data.data;
+				this.yScaleList.push(list.map(e => Math.floor((maxScaleList - e) * yScaleSize + this.spaceY)));
+			})
+		}
+
+		this.drawDataLine();
+	}
+	/**
+	* 重绘统计图 xy坐标轴 刻度文字 坐标线 统计线
+	*/
+	redraw() {
+		this.context.clearRect(0, 0, this.width, this.height);
+		this.drawXYAxis();
+		this.drawYText();
+		this.drawDataLine();
+	}
+	/**
+	* 调节X坐标间距
+	* @param {String,Number} size = [1-10] 
+	*/
+	handleXScaleSize(size) {
+		this.xScaleSize = this.xScaleSizeOriginal * size;
+		this.redraw();
+	}
+	/**
+	* 绘制统计线
+	*/
+	drawDataLine() {
+		let dataLineSize = this.dataLineSize;
+		let dataDotSize = this.dataDotSize;
+		let dataLineXColor = this.dataLineXColor;
+		let reservedSpace = this.reservedSpace;
+		let xScaleSize = this.xScaleSize;
+		
+		let YList = this.YList;
+		let xScaleList = this.xScaleList = [...Array(this.xScaleListLength).keys()].map(i => Math.floor(i * xScaleSize + reservedSpace));
+		
+		this.context.lineJoin = 'round';
+		
+		let indexOf0 = this.YText.indexOf(0);
+		let index0 = YList[indexOf0];
+		let drawDataList = this.drawDataList;
+		
+		let gradient = this.context
+		.createLinearGradient(this.xScaleList[0], YList[0], this.xScaleList[0], YList[YList.length - 1]);
+		drawDataList.forEach((e, i) => {
+			if(e.isBg){
+				let bg = e.bgColor || [{ key:0, value: 'rgba(231, 0, 18, 0.5)' },{ key:1, value: 'rgba(231, 0, 18, 0.1)' }];
+				if(typeof bg === 'string'){
+					gradient = bg;
+				}else{
+					bg.forEach((ee,ii) => {
+						gradient.addColorStop(ee.key, ee.value);
+					})
+				}
+			}
+		})
+		this.context.fillStyle = gradient;
+		this.yScaleList.forEach((yD, yI) => {
+			for (var i = 1, length = xScaleList.length; i < length; i++) {
+				let xx = this.xScaleList[i - 1];
+				let xx1 = this.xScaleList[i];
+				let yy = yD[i - 1];
+				let yy1 = yD[i];
+				let ax = (xx1 - xx) / 3;
+				let bx = xx + ax;
+				let bx1 = xx + ax * 2;
+				
+				this.context.beginPath();
+				this.context.moveTo(xx, yy);
+				this.context.bezierCurveTo(bx, yy, bx1, yy1, xx1, yy1);
+				if(drawDataList[yI].isBg){
+					this.context.lineTo(xx1, index0)
+					this.context.lineTo(xx, index0)
+					this.context.lineTo(xx, yy)
+					this.context.fill();
+				}
+			}
+		})
+		this.context.lineWidth = this.dataLineSize;
+		this.yScaleList.forEach((yD, yI) => {
+			this.context.beginPath();
+			this.context.strokeStyle = dataLineXColor[yI];
+			for (var i = 1, length = xScaleList.length; i < length; i++) {
+				let xx = this.xScaleList[i - 1];
+				let xx1 = this.xScaleList[i];
+				let yy = yD[i - 1];
+				let yy1 = yD[i];
+				let ax = (xx1 - xx) / 3;
+				let bx = xx + ax;
+				let bx1 = xx + ax * 2;
+				
+				this.context.moveTo(xx, yy);
+				this.context.bezierCurveTo(bx, yy, bx1, yy1, xx1, yy1);
+			}
+			this.context.stroke();
+		})
+		// #ifdef H5
+		setTimeout(() => {
+			this.context.draw(true);
+		},100)
+		// #endif
+		// #ifndef H5
+		this.context.draw(true);
+		// #endif
+	}
+	/**
+	* 随机生成16位字符颜色
+	*/
+	getColor16() {
+		return '#' + Math.random().toString(16).slice(-6);
+	}
+	/**
+	* 绘制Y刻度文字
+	*/
+	drawYText() {
+		let YText = this.YText;
+		let YList = this.YList;
+		let XYTextColor = this.XYTextColor;
+		let reservedSpace = this.reservedSpace;
+		let textAndDotSpace = this.textAndDotSpace;
+		let x = reservedSpace - textAndDotSpace;
+		
+		
+		this.context.fillStyle = XYTextColor;
+		this.context.textAlign = 'end';
+		this.context.textBaseline = 'middle';
+		YList.forEach((y, i) => {
+			this.context.font = this.fontTxtSize + this.fontFamily;
+			this.context.fillText(this.YText[i], x, y, x);
+		})
+		this.drawXText();
+	}
+	/**
+	* 绘制X刻度文字,由于时间问题,这里只绘制了起始和结束文字
+	*/
+	drawXText() {
+		let xAxis = this.xAxis;
+		let YList = this.YList;
+		let XList = this.XList;
+		let xAxisLength = this.xAxisLength;
+		let XYTextColor = this.XYTextColor;
+		let reservedSpace = this.reservedSpace;
+		
+		this.context.fillStyle = XYTextColor;
+		
+		this.context.textAlign = 'start';
+		this.context.textBaseline = 'middle';
+		this.context.font = this.fontTxtSize + this.fontFamily;
+		this.context.fillText(xAxis[0], XList[0], 
+		YList[YList.length - 1] + this.fontTxtSize, 
+		xAxisLength + this.fontTxtSize * 4);
+		this.context.font = this.fontTxtSize + this.fontFamily;
+		this.context.textAlign = 'end';
+		this.context.fillText(xAxis[xAxis.length - 1], 
+		XList[XList.length - 1], YList[YList.length - 1] + this.fontTxtSize,
+		xAxisLength + this.fontTxtSize * 4);
+		
+		 
+		// #ifdef H5
+		setTimeout(() => {
+			this.context.draw(true);
+		},100)
+		// #endif
+		// #ifndef H5
+		this.context.draw(true);
+		// #endif
+	}
+	/**
+	* 绘制XY统计图雏形
+	*/
+	drawXYAxis() {
+		let XList = this.XList;
+		let YList = this.YList;
+		let xWidth = this.xWidth;
+		let xHeight = this.xHeight;
+		let XDotColor = this.XDotColor;
+		let reservedSpace = this.reservedSpace;
+		this.context.fillStyle = XDotColor;
+		YList.forEach((y, i) => {
+			XList.forEach((x, j) => {
+				this.context.fillRect(x, y, xWidth, xHeight);
+			})
+		})
+		// #ifdef H5
+		setTimeout(() => {
+			this.context.draw(true);
+		},100)
+		// #endif
+		// #ifndef H5
+		this.context.draw(true);
+		// #endif
+	}
+	/**
+	* 获取X轴对应坐标点
+	*/
+	getXAxisList() {
+		let width = this.width;
+		let spaceX = this.spaceX;
+		let xWidth = this.xWidth;
+		let xHeight = this.xHeight;
+		
+		let reservedSpace = this.reservedSpace;
+		let length = (width - reservedSpace - this.fontTxtSize) / (xWidth + spaceX);
+		for (let i = 0; i < length; i++) {
+			this.XList.push(i * (spaceX + xWidth) + reservedSpace);
+		}
+	}
+	/**
+	* 获取y轴对应坐标点
+	*/
+	getYAxisList() {
+		let height = this.height;
+		let scale = this.scale;
+		let reservedSpace = this.reservedSpace;
+		this.spaceY = Math.floor((height - reservedSpace) / scale);
+		for (let i = 0; i < scale; i++) {
+			this.YList.push(i * this.spaceY + this.spaceY);
+		}
+		this.setTextStyle();
+	}
+	/**
+	* 设置字体类型,行高,字体大小,缩进
+	*/
+	setTextStyle() {
+		// 字体
+		this.fontFamily = 'px 宋体';
+		this.lineHeight = 10;
+		this.textIndent = 10;
+		this.fontTxtSize = this.spaceY / 5 < 14 ? 14 : this.spaceY / 5;
+	}
+
+};
+
+let touchstart = function (e) {
+	if (!e.touches[0]) return
+	this.ctx.touchX = e.touches[0].x;
+	this.ctx.touchY = e.touches[0].y;
+	this.ctx.drawMouseTooltipLine()
+}
+
+let touchmove = function (e) {
+	if (!e.touches[0]) return
+	this.ctx.touchX = e.touches[0].x;
+	this.ctx.touchY = e.touches[0].y;
+	this.ctx.drawMouseTooltipLine()
+}
+
+let mousemove = function (e){
+	if (e.pageX){
+		this.ctx.touchX = e.x;
+		this.ctx.touchY = e.y;
+		this.ctx.drawMouseTooltipLine()
+	}
+}
+
+let mouseout = function (e) {
+	this.ctx.dataLineSize = 0.5;
+	this.ctx.redraw()
+}
+
+let touchend = function (e) {
+	this.ctx.dataLineSize = 0.5;
+	this.ctx.redraw()
+}
+
+export default {
+	canvasDraw,
+	touchstart,
+	touchmove,
+	mousemove,
+	mouseout,
+	touchend
+}

+ 18 - 0
sources/client/vrv-moblie/components/curve-charts/datas.js

@@ -0,0 +1,18 @@
+let option = {
+	xAxis: [...Array(100).keys()].map(e => +new Date('2019/05/01') + (e * 3600000 * 24 * 10)),
+	yAxis: {
+		// subsection: 5
+	},
+	data: [{
+			title: '呵呵呵',
+			isBg: true,
+			data:[...Array(100).keys()].map(e => 
+			e > 50 
+			? parseInt( Math.random() * 1000 + 1)
+			: -parseInt( Math.random() * 1000 + 1))
+		},
+		{ title: '哈哈哈',data:[...Array(100).keys()].map(e => parseInt( Math.random() * 1000 + 1))},
+	],
+	dataLineXColor: ['#E70012', '#49A6E9']
+};
+export default option

+ 63 - 0
sources/client/vrv-moblie/components/curve-charts/index.vue

@@ -0,0 +1,63 @@
+<template>
+	<view >
+		<canvas canvas-id="canvas" 
+		@touchstart="touchstart" 
+		@touchmove="touchmove" 
+		@touchend="touchend" 
+		style="width: 750rpx; height: 600rpx;"></canvas>
+	</view>
+</template>
+
+<script>
+	import canvas from '@/components/curve-charts/canvas.js';
+	import option from '@/components/curve-charts/datas.js'
+	export default {
+		data() {
+			return {
+				cWidth: 0,
+				cHeight: 0
+			}
+		},
+		onLoad() {
+			
+		},
+		onReady() {
+			let width = this.cWidth = uni.upx2px(750);
+			let height = this.cHeight = uni.upx2px(600);
+			let context = uni.createCanvasContext('canvas', this)
+			this.ctx = new this.canvasDraw({context,width,height}, option);
+		},
+		methods: {
+			...canvas,
+			
+		}
+	}
+</script>
+
+<style>
+	.content {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.logo {
+		height: 200rpx;
+		width: 200rpx;
+		margin-top: 200rpx;
+		margin-left: auto;
+		margin-right: auto;
+		margin-bottom: 50rpx;
+	}
+
+	.text-area {
+		display: flex;
+		justify-content: center;
+	}
+
+	.title {
+		font-size: 36rpx;
+		color: #8f8f94;
+	}
+</style>

+ 187 - 0
sources/client/vrv-moblie/components/jerry-gauge/index.js

@@ -0,0 +1,187 @@
+class Gauge {
+	constructor({
+		canvasId,
+		startAngle = 3 / 4 * Math.PI, // 135
+		endAngle = 1 / 4 * Math.PI, // 45
+		width = 200,
+		min = 0,
+		max = 100,
+		value = 0,
+		unit = '%',
+		showTick = false,
+		valueColor = '#555',
+		progressColor = '#f58220',
+		trackColor = '#F1F1F1',
+		lineWidth = 10
+	}) {
+		this.ctx = uni.createCanvasContext(canvasId)
+		this.startAngle = startAngle
+		this.endAngle = endAngle
+		this.width = width
+		this.min = min
+		this.max = max
+		this.value = value
+		this.unit = unit
+		this.showTick = showTick
+		this.valueColor = valueColor
+		this.progressColor = progressColor
+		this.trackColor = trackColor
+		// track width
+		this.lineWidth = lineWidth
+
+		this.radius = this.width / 2
+		this.process = min || -1
+		this.tickLength = this.max - this.min
+		// track radius
+		this.trackRadius = this.radius - this.lineWidth / 2
+		// one tick rad
+		this.tickRad = (2 * Math.PI - this.startAngle + this.endAngle) / this.tickLength
+		this.start()
+	}
+	draw() {
+		// 将坐标中心点移动到圆心位置
+		this.ctx.translate(this.radius, this.radius)
+
+		this.drawTrack()
+		this.drawValueText()
+		this.drawProgress()
+		if (this.showTick) {
+			this.drawTick()
+			this.drawTickText()
+		}
+		this.ctx.draw()
+	}
+	// 轨迹圆环
+	drawTrack() {
+		this.ctx.save()
+		this.ctx.lineWidth = this.lineWidth
+		// this.ctx.lineCap = 'round'
+		this.ctx.strokeStyle = this.trackColor
+		this.ctx.arc(0, 0, this.trackRadius, this.startAngle, this.endAngle)
+		this.ctx.stroke()
+		this.ctx.restore()
+	}
+	// 当前值显示
+	drawValueText() {
+		this.ctx.save()
+		this.ctx.fillStyle = this.valueColor
+		this.ctx.font = "34px serif"
+		this.ctx.textAlign = 'center'
+		this.ctx.textBaseline = 'middle'
+		this.ctx.fillText(`${this.value}${this.unit}`, 0, 0)
+		this.ctx.restore()
+	}
+	// 进度圆环
+	drawProgress() {
+		this.ctx.save()
+		const valueRad = this.getValueRad()
+		this.ctx.beginPath()
+		this.ctx.lineWidth = this.lineWidth
+		this.ctx.strokeStyle = typeof this.progressColor === 'string' ? this.progressColor : this.getGradient(this.progressColor)
+		// this.ctx.lineCap = 'round' // 会导致进度条加长
+		this.ctx.lineJoin = 'round'
+		// 终点角度是动态的
+		this.ctx.arc(0, 0, this.trackRadius, this.startAngle, valueRad)
+		this.ctx.stroke()
+		this.ctx.restore()
+	}
+	// 刻度线
+	drawTick() {
+		// 不可是使用旋转,否则文字也会旋转
+		let deg = this.startAngle
+		for (let i = this.min; i <= this.max; i++) {
+			this.ctx.save()
+			this.ctx.lineWidth = 1
+			this.ctx.strokeStyle = '#999'
+			this.ctx.beginPath()
+			// 刻度起点
+			let x0 = (this.radius - this.lineWidth - 2) * Math.cos(deg)
+			let y0 = (this.radius - this.lineWidth - 2) * Math.sin(deg)
+			// 刻度终点
+			var x1 = (this.radius - this.lineWidth - 8) * Math.cos(deg)
+			var y1 = (this.radius - this.lineWidth - 8) * Math.sin(deg)
+			this.ctx.moveTo(x0, y0)
+			this.ctx.lineTo(x1, y1)
+			deg += this.tickRad
+			this.ctx.stroke()
+			this.ctx.restore()
+		}
+
+	}
+	// 刻度值
+	drawTickText() {
+		let deg = this.startAngle
+		for (let i = this.min; i <= this.max; i++) {
+			let x = (this.radius - this.lineWidth - 20) * Math.cos(deg)
+			let y = (this.radius - this.lineWidth - 20) * Math.sin(deg)
+			deg += this.tickRad
+			this.ctx.save()
+			this.ctx.font = '12px serif'
+			this.ctx.fillStyle = '#999'
+			this.ctx.textAlign = 'center'
+			// 不设置会与tick错位
+			this.ctx.textBaseline = 'middle'
+			this.ctx.fillText(i, x, y)
+			this.ctx.restore()
+		}
+
+	}
+	// 当前值的弧度
+	getValueRad() {
+		// 超出
+		if (this.value > this.max) {
+			return (this.max - this.min) * this.tickRad + this.startAngle
+		}
+		return (this.process - this.min) * this.tickRad + this.startAngle
+	}
+	start() {
+		let update = () => {
+			this.process = this.process + (this.max - this.min) / 100
+			if (this.process > this.value) {
+				cancelAnimationFrame(update)
+			} else {
+				this.draw()
+				requestAnimationFrame(update)
+			}
+		}
+		requestAnimationFrame(update)
+	}
+	// 渐变
+	getGradient(colorList) {
+		let grd = this.ctx.createLinearGradient(0, 0, this.trackRadius, 0)
+		colorList.forEach((color, index) => {
+			grd.addColorStop(index / (colorList.length - 1), color)
+		})
+		return grd
+	}
+}
+
+
+// https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
+(function () {
+	var lastTime = 0;
+	var vendors = ['webkit', 'moz'];
+	for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+		window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
+		window.cancelAnimationFrame =
+			window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
+	}
+
+	if (!window.requestAnimationFrame)
+		window.requestAnimationFrame = function (callback, element) {
+			var currTime = new Date().getTime();
+			var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+			var id = window.setTimeout(function () { callback(currTime + timeToCall); },
+				timeToCall);
+			lastTime = currTime + timeToCall;
+			return id;
+		};
+
+	if (!window.cancelAnimationFrame)
+		window.cancelAnimationFrame = function (id) {
+			clearTimeout(id);
+		};
+}());
+
+
+export default Gauge

+ 54 - 0
sources/client/vrv-moblie/components/jerry-gauge/index.vue

@@ -0,0 +1,54 @@
+<template>
+  <view class="gauge-container">
+    <view class="title">温度类</view>
+    <canvas class="canvas" canvas-id="canvas"></canvas>
+    <view class="title">进度类</view>
+    <canvas class="canvas" canvas-id="canvas2"></canvas>
+  </view>
+</template>
+
+<script>
+import Gauge from "./index.js";
+export default {
+  name: "gauge",
+  data() {
+    return {};
+  },
+  mounted() {
+    new Gauge({
+      canvasId: "canvas",
+      width: 200,
+      min: 16,
+      max: 30,
+      value: 20.5,
+      unit: "℃",
+      showTick: true,
+    });
+    new Gauge({
+      canvasId: "canvas2",
+      value: 80,
+      lineWidth: 20,
+      progressColor: ["#2196F3", "#9C27B0", "#F44336"],
+      valueColor: "blue",
+    });
+  },
+};
+</script>
+
+<style>
+.gauge-container {
+  padding: 20rpx 40rpx;
+  text-align: left;
+}
+.title {
+  margin-bottom: 20rpx;
+  color: #000;
+  font-size: 32rpx;
+  font-weight: 500;
+}
+.canvas {
+  width: 200px;
+  height: 200px;
+  margin: 40rpx auto;
+}
+</style>

+ 123 - 0
sources/client/vrv-moblie/components/mpvue-echarts/src/echarts.vue

@@ -0,0 +1,123 @@
+<template>
+	<canvas v-if="canvasId" class="ec-canvas" :id="canvasId" :canvasId="canvasId" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd" @error="error"></canvas>
+</template>
+
+<script>
+import WxCanvas from './wx-canvas';
+
+export default {
+	props: {
+		canvasId: {
+			type: String,
+			default: 'ec-canvas'
+		},
+		lazyLoad: {
+			type: Boolean,
+			default: false
+		},
+		disableTouch: {
+			type: Boolean,
+			default: false
+		},
+		throttleTouch: {
+			type: Boolean,
+			default: false
+		}
+	},
+	// #ifdef H5
+	mounted() {
+		if (!this.lazyLoad) this.init();
+	},
+	// #endif
+	// #ifndef H5
+	onReady() {
+		if (!this.lazyLoad) this.init();
+	},
+	// #endif
+	methods: {
+		setChart(chart){
+			this.chart = chart
+		},
+		init() {
+			const { canvasId } = this;
+			this.ctx = wx.createCanvasContext(canvasId, this);
+
+			this.canvas = new WxCanvas(this.ctx, canvasId);
+
+			const query = wx.createSelectorQuery().in(this);
+			query
+				.select(`#${canvasId}`)
+				.boundingClientRect(res => {
+					if (!res) {
+						setTimeout(() => this.init(), 50);
+						return;
+					}
+					this.$emit('onInit', {
+						width: res.width,
+						height: res.height
+					});
+				})
+				.exec();
+		},
+		canvasToTempFilePath(opt) {
+			const { canvasId } = this;
+			this.ctx.draw(true, () => {
+				wx.canvasToTempFilePath({
+					canvasId,
+					...opt
+				});
+			});
+		},
+		touchStart(e) {
+			const { disableTouch, chart } = this;
+			if (disableTouch || !chart || !e.mp.touches.length) return;
+			const touch = e.mp.touches[0];
+			chart._zr.handler.dispatch('mousedown', {
+				zrX: touch.x,
+				zrY: touch.y
+			});
+			chart._zr.handler.dispatch('mousemove', {
+				zrX: touch.x,
+				zrY: touch.y
+			});
+		},
+		touchMove(e) {
+			const { disableTouch, throttleTouch, chart, lastMoveTime } = this;
+			if (disableTouch || !chart || !e.mp.touches.length) return;
+
+			if (throttleTouch) {
+				const currMoveTime = Date.now();
+				if (currMoveTime - lastMoveTime < 240) return;
+				this.lastMoveTime = currMoveTime;
+			}
+
+			const touch = e.mp.touches[0];
+			chart._zr.handler.dispatch('mousemove', {
+				zrX: touch.x,
+				zrY: touch.y
+			});
+		},
+		touchEnd(e) {
+			const { disableTouch, chart } = this;
+			if (disableTouch || !chart) return;
+			const touch = e.mp.changedTouches ? e.mp.changedTouches[0] : {};
+			chart._zr.handler.dispatch('mouseup', {
+				zrX: touch.x,
+				zrY: touch.y
+			});
+			chart._zr.handler.dispatch('click', {
+				zrX: touch.x,
+				zrY: touch.y
+			});
+		}
+	}
+};
+</script>
+
+<style scoped>
+.ec-canvas {
+	width: 100%;
+	height: 100%;
+	flex: 1;
+}
+</style>

+ 73 - 0
sources/client/vrv-moblie/components/mpvue-echarts/src/wx-canvas.js

@@ -0,0 +1,73 @@
+export default class WxCanvas {
+  constructor(ctx, canvasId) {
+    this.ctx = ctx;
+    this.canvasId = canvasId;
+    this.chart = null;
+
+    WxCanvas.initStyle(ctx);
+    this.initEvent();
+  }
+
+  getContext(contextType) {
+    return contextType === '2d' ? this.ctx : null;
+  }
+
+  setChart(chart) {
+    this.chart = chart;
+  }
+
+  attachEvent() {
+    // noop
+  }
+
+  detachEvent() {
+    // noop
+  }
+
+  static initStyle(ctx) {
+    const styles = ['fillStyle', 'strokeStyle', 'globalAlpha',
+      'textAlign', 'textBaseAlign', 'shadow', 'lineWidth',
+      'lineCap', 'lineJoin', 'lineDash', 'miterLimit', 'fontSize'];
+
+    styles.forEach((style) => {
+      Object.defineProperty(ctx, style, {
+        set: (value) => {
+          if ((style !== 'fillStyle' && style !== 'strokeStyle')
+            || (value !== 'none' && value !== null)
+          ) {
+            ctx[`set${style.charAt(0).toUpperCase()}${style.slice(1)}`](value);
+          }
+        },
+      });
+    });
+
+    ctx.createRadialGradient = () => ctx.createCircularGradient(arguments);
+  }
+
+  initEvent() {
+    this.event = {};
+    const eventNames = [{
+      wxName: 'touchStart',
+      ecName: 'mousedown',
+    }, {
+      wxName: 'touchMove',
+      ecName: 'mousemove',
+    }, {
+      wxName: 'touchEnd',
+      ecName: 'mouseup',
+    }, {
+      wxName: 'touchEnd',
+      ecName: 'click',
+    }];
+
+    eventNames.forEach((name) => {
+      this.event[name.wxName] = (e) => {
+        const touch = e.mp.touches[0];
+        this.chart._zr.handler.dispatch(name.ecName, {
+          zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
+          zrY: name.wxName === 'tap' ? touch.clientY : touch.y,
+        });
+      };
+    });
+  }
+}

File diff suppressed because it is too large
+ 5046 - 0
sources/client/vrv-moblie/components/u-charts/u-charts.js


+ 20 - 0
sources/client/vrv-moblie/index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 21 - 0
sources/client/vrv-moblie/main.js

@@ -0,0 +1,21 @@
+import App from './App'
+
+// #ifndef VUE3
+import Vue from 'vue'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+    ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif

+ 75 - 0
sources/client/vrv-moblie/manifest.json

@@ -0,0 +1,75 @@
+{
+    "name" : "vrv-platform",
+    "appid" : "__UNI__CA02DBC",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx95c3daeeb44f85f6",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : true,
+            "postcss" : true,
+            "minified" : true
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
+}

+ 16 - 0
sources/client/vrv-moblie/package.json

@@ -0,0 +1,16 @@
+{
+    "id": "jerry-gauge",
+    "name": "仪表盘或者环形进度条",
+    "version": "1.0.3",
+    "description": "基于canvas自定义仪表盘",
+    "keywords": [
+        "canvas",
+        "gauge"
+    ],
+    "dcloudext": {
+        "category": [
+            "前端组件",
+            "通用组件"
+        ]
+    }
+}

+ 200 - 0
sources/client/vrv-moblie/pages.json

@@ -0,0 +1,200 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/operator/operator",
+			"style": {
+				"navigationBarTitleText": "运营商管理",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/login/login",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/operator/operatorInfo/operatorInfo",
+			"style": {
+				"navigationBarTitleText": "运营商管理详情",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/device/device",
+			"style": {
+				"navigationBarTitleText": "设备列表",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/device/deviceInfo/deviceInfo",
+			"style": {
+				"navigationBarTitleText": "菜单",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/staticProject/staticProject",
+			"style": {
+				"navigationBarTitleText": "项目管理详情",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/project/project",
+			"style": {
+				"navigationBarTitleText": "项目管理",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/project/projectInfo/projectInfo",
+			"style": {
+				"navigationBarTitleText": "项目管理详情",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/alarm/alarm",
+			"style": {
+				"navigationBarTitleText": "报警管理",
+				"enablePullDownRefresh": false
+			}
+
+		},
+		{
+			"path": "pages/operatorLog/operatorLog",
+			"style": {
+				"navigationBarTitleText": "操作日志",
+				"enablePullDownRefresh": false
+			}
+
+		},
+		{
+			"path": "pages/systemSet/systemSet",
+			"style": {
+				"navigationBarTitleText": "系统设置",
+				"enablePullDownRefresh": false
+			}
+		},
+		{
+			"path": "pages/error/error",
+			"style": {
+				"navigationBarTitleText": "找不到页面",
+				"enablePullDownRefresh": false
+			}
+
+		}
+
+		, {
+			"path": "pages/parameterSetting/parameterSetting",
+			"style": {
+				"navigationBarTitleText": "参数设置",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/systemParameter/systemParameter",
+			"style": {
+				"navigationBarTitleText": "系统参数",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/alarmRecord/alarmRecord",
+			"style": {
+				"navigationBarTitleText": "报警记录",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/maintenanceRecord/maintenanceRecord",
+			"style": {
+				"navigationBarTitleText": "维保记录",
+				"enablePullDownRefresh": false
+			}
+
+		}
+	    ,{
+            "path" : "pages/user/user",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "系统管理员账号管理",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+		,{
+		    "path" : "pages/rolePower/rolePower",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "角色与权限管理",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		}
+        ,{
+            "path" : "pages/runningState/runningState",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "运行状态",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+		,{
+		    "path" : "pages/dataCurve/dataCurve",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "数据曲线",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		}
+    ],
+
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8"
+	},
+
+	"tabBar": {
+		"color": "#7A7E83",
+		"selectedColor": "#3cc51f",
+		"borderStyle": "black",
+		"backgroundColor": "#ffffff",
+		"list": [{
+			"pagePath": "pages/operator/operator", //首页
+			"iconPath": "static/底部按钮/项目管理@2x.png",
+			"selectedIconPath": "static/底部按钮/项目管理@2x.png",
+			"text": "运营商管理"
+		}, {
+			"pagePath": "pages/project/project",
+			"iconPath": "static/底部按钮/项目管理@2x.png",
+			"selectedIconPath": "static/底部按钮/项目管理@2x.png",
+			"text": "项目管理"
+
+		}, {
+			"pagePath": "pages/alarm/alarm",
+			"iconPath": "static/底部按钮/报警管理@2x.png",
+			"selectedIconPath": "static/底部按钮/报警管理@2x.png",
+			"text": "报警管理"
+		}, {
+			"pagePath": "pages/operatorLog/operatorLog",
+			"iconPath": "static/底部按钮/操作日志@2x.png",
+			"selectedIconPath": "static/底部按钮/操作日志@2x.png",
+			"text": "操作日志"
+		}, {
+			"pagePath": "pages/systemSet/systemSet",
+			"iconPath": "static/底部按钮/系统设置@2x.png",
+			"selectedIconPath": "static/底部按钮/系统设置@2x.png",
+			"text": "系统设置"
+		}]
+	},
+
+	"uniIdRouter": {}
+}

+ 71 - 0
sources/client/vrv-moblie/pages/alarm/alarm.vue

@@ -0,0 +1,71 @@
+<template>
+	<view>
+		<view class="alarm" v-for="item in deviceAlarmRecords" :key="item.code">
+			<text class="title">{{item.alarmName}}</text>
+
+			<view class="content">
+				<text>地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;区:</text> 
+				<text>客户名称:</text>
+				<text>报警类型:{{item.alarmType}}</text>
+				<text>报警时间:{{item.startTime}}</text>
+			</view>
+
+
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				deviceAlarmRecords: [],
+			}
+		},
+		onLoad() {
+			uni.request({
+				url: 'http://127.0.0.1:9999/deviceAlarmRecord/list',
+				method: 'GET',
+				data: {},
+				success: res => {
+
+					this.deviceAlarmRecords = res.data.data.deviceAlarmRecords;
+					console.log(res.data.data.deviceAlarmRecords);
+				},
+
+			})
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.alarm {
+		width: 702rpx;
+		height: 329rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+		font-size: 28rpx;
+		display: flex;
+		flex-direction: column;
+		margin-top: 30rpx;
+		margin-left: 30rpx;
+		line-height: 55rpx;
+		color: #444546;
+	}
+
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+</style>

+ 82 - 0
sources/client/vrv-moblie/pages/alarmRecord/alarmRecord.vue

@@ -0,0 +1,82 @@
+<template>
+	<view>
+		<view class="alarm" v-for="item in deviceAlarmRecords" :key="item.code">
+			<text class="title">{{item.alarmName}}</text>
+
+			<view class="content">
+				<text>报警时间:{{item.startTime}}</text>
+				<text>变量ID:{{item.variableId}}</text>
+				<text>报警状态:{{item.status}}</text>
+				<text>持续时长:{{item.status}}</text>
+
+			</view>
+		</view>
+
+		<view class="anniu">
+			<image class="anniu" src="../../static/设备菜单/前往列表@2x.png"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				deviceAlarmRecords: [],
+			}
+		},
+		onLoad() {
+			uni.request({
+				url: 'http://127.0.0.1:9999/deviceAlarmRecord/list',
+				method: 'GET',
+				data: {},
+				success: res => {
+
+					this.deviceAlarmRecords = res.data.data.deviceAlarmRecords;
+					console.log(res.data.data.deviceAlarmRecords);
+				},
+
+			})
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.anniu {
+		width: 116rpx;
+		height: 116rpx;
+		float: right;
+		margin-top: 10rpx;
+		margin-right: 4rpx;
+	}
+
+	.alarm {
+		width: 702rpx;
+		height: 329rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		margin-top: 30rpx;
+		margin-left: 30rpx;
+		line-height: 55rpx;
+		font-size: 28rpx;
+		color: #444546;
+	}
+
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+</style>

+ 290 - 0
sources/client/vrv-moblie/pages/dataCurve/dataCurve.vue

@@ -0,0 +1,290 @@
+<template>
+	<view>
+		<view class="all">
+
+			<view class="chart">
+				<view class="charts-box">
+					<best-gauge :config="gaugeOption"></best-gauge>
+				</view>
+
+				<view class="charts-box">
+					<best-gauge :config="gaugeOption2"></best-gauge>
+				</view>
+			</view>
+
+			<view class="white">
+				<view class="title1">
+					<text class="param">空调排风温度变化</text>
+					<view class="tiao"></view>
+				</view>
+
+				<view>
+					<canvas canvas-id="canvasLineA" id="canvasLineA" class="charts" @touchmove="moveLineA"
+						@touchend="moveLineA"></canvas>
+					<!-- 画布,图表的HTML部分-->
+				</view>
+
+			</view>
+
+			<view class="white1">
+				<view class="title1">
+					<text class="param">空调排风湿度变化</text>
+					<view class="tiao"></view>
+				</view>
+
+				<view>
+					<canvas canvas-id="canvasLineA11" id="canvasLineA11" class="charts" @touchmove="moveLineA11"
+						@touchend="moveLineA11"></canvas>
+					<!-- 画布,图表的HTML部分-->
+				</view>
+			</view>
+
+			<view class="anniu">
+				<image class="anniu" src="../../static/设备菜单/前往列表@2x.png"></image>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	//仪表盘组件
+	import bestGauge from '@/components/best-gauge/best-gauge.vue'
+
+	//引入u-charts组件
+	import uCharts from '@/components/u-charts/u-charts.js'
+
+	var _self; //用于全局使用this
+
+	var _self11; //用于全局使用this
+
+	var canvaLineA = null; //uCharts实例
+
+	var canvaLineA11 = null; //uCharts实例
+
+
+	export default {
+		components: {
+			bestGauge,
+		},
+
+		data() {
+			let _width = uni.upx2px(350);
+			return {
+				cWidth: '',
+				cHeight: '', //画布的宽高
+
+				//仪表盘部分
+				gaugeOption: { //定义参数
+					id: 'gaugeId0',
+					value: 75.8,
+					axisTickLength: 2 //该属性与axisTick互斥,存在axisTickLength并大于0,axisTick就无效
+				},
+
+				gaugeOption2: { //定义参数
+					name: 'CK01排风湿度显示',
+					id: 'gaugeId1',
+					value: 60.5,
+					unit: '%',
+					axisTickLength: 2 //该属性与axisTick互斥,存在axisTickLength并大于0,axisTick就无效
+				},
+
+				//折线图部分
+
+				//温度
+				data: { //数据
+					categories: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
+					series: [{
+						name: "温度",
+						data: [40, 30, 36, 44, 34, 30, 22],
+					}]
+				},
+
+				//湿度
+				data11: { //数据
+					categories11: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
+					series11: [{
+						name: "湿度",
+						data: [40, 30, 36, 44, 38, 34, 30],
+					}]
+				},
+			}
+		},
+
+		onLoad() {
+			this.cWidth = uni.upx2px(702);
+			this.cHeight = uni.upx2px(500); //设置宽高
+			_self = this //声明this
+			_self.showLineA("canvasLineA", _self.data); //触发执行函数
+
+			_self11 = this //声明this
+			_self11.showLineA11("canvasLineA11", _self11.data11); //触发执行函数
+		},
+
+		methods: {
+			showLineA(canvasId, chartData) {
+				canvaLineA = new uCharts({ //这些配置项的意思看这:https://www.kancloud.cn/qiun/ucharts/1172125
+					$this: _self, //指针
+					canvasId: canvasId, //id
+					type: 'line', //类型
+					colors: ['#F45E41'], //每一条的颜色
+					fontSize: 14, //字体大小
+					padding: [15, 15, 0, 15], //空白区域值
+					legend: { //图例相关配置
+						show: true,
+						padding: 5,
+						lineHeight: 11,
+						margin: 0,
+					},
+					dataLabel: false, //显示数据标签内容值
+					categories: chartData.categories, //数据类别
+					series: chartData.series, //数据列表
+					xAxis: { //X轴配置
+						gridColor: '#CCCCCC', //X轴网格颜色
+						gridType: 'dash', //X轴网格线型 'solid'为实线、'dash'为虚线`
+						dashLength: 8, //X轴网格为虚线时,单段虚线长度
+					},
+					yAxis: { //y轴配置
+						gridType: 'dash',
+						gridColor: '#CCCCCC',
+						dashLength: 8,
+					},
+					width: _self.cWidth, //canvas宽度,单位为px
+					height: _self.cHeight, //canvas高度,单位为px
+					extra: { //扩展配置
+						line: {
+							type: 'curve' //曲线  curve曲线,straight直线
+						}
+					}
+				});
+			},
+			moveLineA(e) {
+				canvaLineA.showToolTip(e, { //详情框
+					format: function(item, category) {
+						return category + ' ' + item.name + ':' + item.data + '℃'
+					}
+				});
+			},
+
+
+			//湿度
+			showLineA11(canvasId, chartData) {
+				canvaLineA11 = new uCharts({ //这些配置项的意思看这:https://www.kancloud.cn/qiun/ucharts/1172125
+					$this: _self11, //指针
+					canvasId: canvasId, //id
+					type: 'line', //类型
+					colors: ['#007AFF'], //每一条的颜色
+					fontSize: 14, //字体大小
+					padding: [15, 15, 0, 15], //空白区域值
+					legend: { //图例相关配置
+						show: true,
+						padding: 5,
+						lineHeight: 11,
+						margin: 0,
+					},
+					dataLabel: false, //显示数据标签内容值
+					categories: chartData.categories11, //数据类别
+					series: chartData.series11, //数据列表
+					xAxis: { //X轴配置
+						gridColor: '#CCCCCC', //X轴网格颜色
+						gridType: 'dash', //X轴网格线型 'solid'为实线、'dash'为虚线`
+						dashLength: 8, //X轴网格为虚线时,单段虚线长度
+					},
+					yAxis: { //y轴配置
+						gridType: 'dash',
+						gridColor: '#CCCCCC',
+						dashLength: 8,
+					},
+					width: _self11.cWidth, //canvas宽度,单位为px
+					height: _self11.cHeight, //canvas高度,单位为px
+					extra: { //扩展配置
+						line: {
+							type: 'curve' //曲线  curve曲线,straight直线
+						}
+					}
+				});
+			},
+			moveLineA11(e) {
+				canvaLineA11.showToolTip(e, { //详情框
+					format: function(item, category) {
+						return category + ' ' + item.name + ':' + item.data + '%'
+					}
+				});
+			},
+
+		}
+
+	}
+</script>
+
+<style>
+	.anniu {
+		width: 116rpx;
+		height: 116rpx;
+		float: right;
+		margin-top: 20rpx;
+	}
+
+	.charts {
+		margin-top: 60rpx;
+		width: 702rpx;
+		height: 500rpx;
+		background-color: #FFFFFF;
+	}
+
+	.title1 {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+
+	.tiao {
+		width: 60px;
+		height: 3px;
+		margin-top: 20rpx;
+		background: #007AFF;
+	}
+
+	.param {
+		font-size: 38rpx;
+		font-weight: 550;
+		margin-top: 40rpx;
+	}
+
+	.white {
+		width: 702rpx;
+		height: 720rpx;
+		margin-left: 24rpx;
+		background-color: white;
+		margin-top: 28rpx;
+		border-radius: 10rpx;
+	}
+
+	.white1 {
+		width: 702rpx;
+		height: 720rpx;
+		margin-left: 24rpx;
+		background-color: white;
+		margin-top: 28rpx;
+		border-radius: 10rpx;
+	}
+
+	.chart {
+		font-size: 26rpx;
+		height: 300px;
+		/* background:white; */
+		background: rgb(30, 130, 250);
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+
+	}
+
+
+
+
+	.charts-box {
+		margin-left: 8rpx;
+		margin-right: 8rpx;
+	}
+</style>

+ 107 - 0
sources/client/vrv-moblie/pages/device/device.vue

@@ -0,0 +1,107 @@
+<template>
+	<view>
+
+		<view class="device" v-for="item in devices" :key="item.code">
+
+			<view class="col">
+				<view class="switch">
+					<switch checked color="#007AFE" @change="switchChange" />
+				</view>
+				<view class="list" @tap="showDetail" :data-code="item.code">查看 ></view>
+			</view>
+
+
+
+			<text class="title">{{item.name}}</text>
+
+			<view class="content">
+				<text>设备SN:{{item.sn}}</text>
+				<text>设备类型:{{item.type}}</text>
+			</view>
+		</view>
+
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				devices: [],
+
+			}
+		},
+		onLoad(e) {
+			console.log(e);
+
+			uni.request({
+				url: 'http://127.0.0.1:9999/device/list?gatewayCode=' + e.code,
+				method: 'GET',
+				data: {},
+				success: res => {
+					this.devices = res.data.data.devices;
+					console.log(this.devices);
+				},
+
+			});
+		},
+		methods: {
+			showDetail(e) {
+				console.log(e);
+				var code = e.currentTarget.dataset.code;
+
+				uni.navigateTo({
+					url: '/pages/device/deviceInfo/deviceInfo?code=' + code,
+				});
+
+			}
+		}
+	}
+</script>
+
+<style>
+	.list {
+		font-size: 28rpx;
+		color: #007AFF;
+		margin-right: 20rpx;
+		margin-top: 85rpx;
+	}
+
+	.switch {
+		transform: scale(0.6);
+	}
+
+	.col {
+		float: right;
+	}
+
+
+	.device {
+		width: 702rpx;
+		height: 230rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		margin-top: 30rpx;
+		margin-left: 30rpx;
+		line-height: 60rpx;
+		color: #444546;
+		font-size: 28rpx;
+	}
+
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+</style>

+ 171 - 0
sources/client/vrv-moblie/pages/device/deviceInfo/deviceInfo.vue

@@ -0,0 +1,171 @@
+<template>
+	<view>
+		<view class="white">
+			<view class="menu">
+				<view class="menuItem" @tap="runningState">
+					<view class="all">
+						<image class="image" src="../../../static/设备菜单/运行状态@2x.png"></image>
+
+						<view class="text">
+							<text class="big">运行状态</text>
+							<text class="small">Running state</text>
+						</view>
+					</view>
+				</view>
+				<view class="menuItem" @tap="dataCurve">
+					<view class="all">
+						<image class="image" src="../../../static/设备菜单/数据曲线@2x.png"></image>
+
+						<view class="text">
+							<text class="big">数据曲线</text>
+							<text class="small">Data curve</text>
+						</view>
+					</view>
+				</view>
+				<view class="menuItem" @tap="parameterSetting">
+					<view class="all">
+						<image class="image" src="../../../static/设备菜单/参数设置@2x.png"></image>
+
+						<view class="text">
+							<text class="big">参数设置</text>
+							<text class="small">Parameter setting</text>
+						</view>
+					</view>
+				</view>
+				<view class="menuItem" @tap="systemParameter">
+					<view class="all">
+						<image class="image" src="../../../static/设备菜单/系统参数@2x.png"></image>
+
+						<view class="text">
+							<text class="big">系统参数</text>
+							<text class="small">System parameter</text>
+						</view>
+					</view>
+				</view>
+				<view class="menuItem" @tap="alarmRecord">
+					<view class="all">
+						<image class="image" src="../../../static/设备菜单/报警记录@2x.png"></image>
+
+						<view class="text">
+							<text class="big">报警记录</text>
+							<text class="small">Alarm record</text>
+						</view>
+					</view>
+				</view>
+				<view class="menuItem" @tap="maintenanceRecord">
+					<view class="all">
+						<image class="image" src="../../../static/设备菜单/维保记录@2x.png"></image>
+
+						<view class="text">
+							<text class="big">维保记录</text>
+							<text class="small">Maintenance record</text>
+						</view>
+					</view>
+				</view>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		onLoad(e) {
+			console.log(e);
+		},
+		methods: {
+			parameterSetting() {
+				uni.navigateTo({
+					url: '/pages/parameterSetting/parameterSetting',
+				});
+			},
+
+			systemParameter() {
+				uni.navigateTo({
+					url: '/pages/systemParameter/systemParameter',
+				});
+			},
+
+			alarmRecord() {
+				uni.navigateTo({
+					url: '/pages/alarmRecord/alarmRecord'
+				});
+			},
+			maintenanceRecord() {
+				uni.navigateTo({
+					url: '/pages/maintenanceRecord/maintenanceRecord'
+				});
+			},
+			dataCurve() {
+				uni.navigateTo({
+					url: '/pages/dataCurve/dataCurve'
+				});
+			},
+			runningState() {
+				uni.navigateTo({
+					url: '/pages/runningState/runningState'
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+	.all {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.image {
+		width: 68rpx;
+		height: 68rpx;
+		margin-left: 24rpx;
+	}
+
+	.text {
+		display: flex;
+		flex-direction: column;
+		margin-left: 24rpx;
+		line-height: 32rpx;
+	}
+
+	.big {
+		font-size: 30rpx;
+	}
+
+	.small {
+		font-size: 20rpx;
+		color: #848586;
+	}
+
+	.white {
+		height: 1316rpx;
+		width: 702rpx;
+		margin-top: 26rpx;
+		margin-left: 24rpx;
+		margin-right: 24rpx;
+		background-color: white;
+		border-radius: 10rpx;
+	}
+
+	.menuItem {
+		margin-left: 24rpx;
+		margin-top: 24rpx;
+		display: flex;
+		width: 319rpx;
+		height: 160rpx;
+		background-color: #f0f0f0;
+		border-radius: 10rpx;
+	}
+
+	.menu {
+		display: flex;
+		flex-wrap: wrap;
+	}
+</style>

+ 30 - 0
sources/client/vrv-moblie/pages/error/error.vue

@@ -0,0 +1,30 @@
+<template>
+	<view>
+		<text>找不到页面</text>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		onLoad() {
+			let timer = setTimeout(() => {
+				clearTimeout(timer)
+				uni.switchTab({
+					url: '/pages/operator/operator'
+				})
+			}, 2000)
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 234 - 0
sources/client/vrv-moblie/pages/login/login.vue

@@ -0,0 +1,234 @@
+<template>
+	<view>
+		<!-- 	<view class="head"></view>
+ -->
+		<view class="img">
+			<image src="../../static/登录/bg@2x.png" class="image"></image>
+
+			<view class="white">
+				<view class="title">
+					<text class="title1">中央空调管理系统</text>
+					<text class="title2">MANAGEMENT SYSTEM</text>
+				</view>
+
+				<view class="form">
+					<form @submit="formSubmit">
+						<view class="uni-form-item">
+							<view class="titleA">用户名</view>
+							<view class="input">
+								<input placeholder="请输入用户名" v-model="formData.account" style="margin-left: 30rpx;" />
+							</view>
+						</view>
+						<view class="uni-form-item">
+							<view class="titleA">密码</view>
+							<view class="input">
+								<input password type="text" placeholder="请输入密码" style="margin-left: 30rpx;" />
+								<!-- 	<input placeholder="请输入密码" v-model="formData.password" style="margin-left: 30rpx;" />
+								<view class="icon">
+									<uni-icons type="eye" size="26" @click="isC" v-show="block"></uni-icons>
+									<uni-icons type="eye-slash" size="26" @click="isC" v-show="toggle"></uni-icons>
+								</view> -->
+							</view>
+
+						</view>
+
+						<view class="uni-form-item">
+							<view class="titleA">验证码</view>
+							<view class="AAA">
+								<view class="input1">
+									<input placeholder="请输入验证码" v-model="formData.verifyCode"
+										style="margin-left: 30rpx;" />
+								</view>
+
+								<view class="code" @tap="handleRefreshVerifyCode">
+									<img class="verify-img" :src="verifyCodeUrl" style="cursor: pointer">
+								</view>
+							</view>
+
+						</view>
+
+						<view class="login">
+							<button class="loginBut" form-type="submit">登录</button>
+						</view>
+						<view class="forget">忘记密码</view>
+
+					</form>
+				</view>
+
+
+
+			</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				verifyCodeUrl: 'http://127.0.0.1:9999/auth/verifyCode',
+
+				isCollapse: false,
+				toggle: false, //第二个图标默认隐藏
+				block: true, //默认显示第一个图标
+
+
+				formData: {
+					account: '',
+					password: '',
+					verifyCode: '',
+				}
+			}
+		},
+
+		onLoad() {
+
+		},
+
+		methods: {
+			handleRefreshVerifyCode() {
+				this.verifyCodeUrl = 'http://127.0.0.1:9999/auth/verifyCode' + "?t=" + new Date()
+					.getTime();
+			},
+
+			isC() {
+				this.isCollapse = !this.isCollapse;
+				this.toggle = !this.toggle;
+				this.block = !this.block;
+			},
+
+			formSubmit(e) {
+				console.log('form发生了submit事件')
+
+				uni.request('http://127.0.0.1:9999/auth/login', {
+						account: this.formData.account,
+						password: this.formData.password,
+						verifyCode: this.formData.verifyCode
+					},
+					'POST').then(function(res) {
+					console.log(res);
+				})
+			}
+
+		},
+	}
+</script>
+
+<style>
+	.AAA {
+		display: flex;
+		flex-direction: row;
+	}
+
+	.icon {
+		margin-left: 200rpx;
+	}
+
+	.form {
+		margin-top: 80rpx;
+	}
+
+	.titleA {
+		font-size: 30rpx;
+		margin-bottom: 20rpx;
+		margin-left: 32rpx;
+		margin-top: 24rpx;
+	}
+
+	.input {
+		background-color: white;
+		width: 654rpx;
+		margin-left: 24rpx;
+		height: 98rpx;
+		border-radius: 10rpx;
+		border: 4rpx solid #F7F8F9;
+
+		display: flex;
+		align-items: center;
+	}
+
+	.verify-img {
+		margin-left: 20rpx;
+		width: 320rpx;
+		height: 100rpx;
+		border-radius: 10rpx;
+	}
+
+	.input1 {
+		background-color: white;
+		width: 320rpx;
+		margin-left: 24rpx;
+		height: 98rpx;
+		border-radius: 10rpx;
+		border: 4rpx solid #F7F8F9;
+
+		display: flex;
+		align-items: center;
+	}
+
+	.title1 {
+		font-size: 44rpx;
+		font-weight: 550;
+	}
+
+	.title2 {
+		font-size: 26rpx;
+		color: #AAAAAA;
+		margin-top: 10rpx;
+	}
+
+	.title {
+		margin-top: 60rpx;
+		margin-left: 30rpx;
+		display: flex;
+		flex-direction: column;
+	}
+
+	.img {
+		width: 750rpx;
+		height: 1520rpx;
+		z-index: 9;
+	}
+
+	.white {
+		position: absolute;
+		bottom: 40rpx;
+		z-index: 10;
+		width: 702rpx;
+		height: 1060rpx;
+		margin-left: 24rpx;
+		background-color: #FFFFFF;
+		opacity: 0.8;
+	}
+
+	.image {
+		width: 750rpx;
+		height: 1500rpx;
+	}
+
+	/* 	.head {
+		height: 80rpx;
+		background-color: white;
+	} */
+
+	.loginBut {
+		margin-top: 60rpx;
+		background-color: #007AFF;
+		color: white;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		width: 654rpx;
+		height: 98rpx;
+	}
+
+	.forget {
+		font-size: 30rpx;
+		color: #007AFF;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-top: 30rpx;
+	}
+</style>

+ 82 - 0
sources/client/vrv-moblie/pages/maintenanceRecord/maintenanceRecord.vue

@@ -0,0 +1,82 @@
+<template>
+	<view>
+		<view class="alarm" v-for="item in deviceAlarmRepairRecords" :key="item.code">
+			<text class="title">{{item.repairName}}</text>
+
+			<view class="content">
+				<text>变 量&nbsp;&nbsp;ID:{{item.variableId}}</text>
+				<text>提醒周期:{{item.promptInterval}}</text>
+				<text>上次提醒:</text>
+				<text>操&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作:</text>
+
+			</view>
+		</view>
+
+		<view class="anniu">
+			<image class="anniu" src="../../static/设备菜单/前往列表@2x.png"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				deviceAlarmRepairRecords: [],
+			}
+		},
+		onLoad() {
+			uni.request({
+				url: 'http://127.0.0.1:9999/deviceAlarmRepairRecord/list',
+				method: 'GET',
+				data: {},
+				success: res => {
+
+					this.deviceAlarmRepairRecords = res.data.data.deviceAlarmRepairRecords;
+					console.log(res.data.data.deviceAlarmRepairRecords);
+				},
+
+			})
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.anniu {
+		width: 116rpx;
+		height: 116rpx;
+		float: right;
+		margin-top: 10rpx;
+		margin-right: 4rpx;
+	}
+
+	.alarm {
+		width: 702rpx;
+		height: 329rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		margin-top: 30rpx;
+		margin-left: 30rpx;
+		line-height: 55rpx;
+		font-size: 28rpx;
+		color: #444546;
+	}
+
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+</style>

+ 82 - 0
sources/client/vrv-moblie/pages/operator/operator.vue

@@ -0,0 +1,82 @@
+<template>
+	<view class="back">
+		<view class="operatorList" v-for="item in operators" :key="item.number" @tap="showDetail"
+			:data-code="item.code">
+			<image class="image1" src="../../static/运营商管理/1@3x.png"></image>
+			<text style="margin-top: 38rpx;margin-left: 30rpx; width: 500rpx;">{{item.name}}</text>
+			<image class="image2" src="../../static/运营商管理/ico2@3x.png"></image>
+		</view>
+
+	</view>
+
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				operators: [],
+
+			}
+		},
+		onLoad() {
+			uni.request({
+				url: 'http://127.0.0.1:9999/operator/list',
+				method: 'GET',
+				data: {},
+				success: res => {
+
+					this.operators = res.data.data.operators;
+					console.log(res.data.data.operators);
+				},
+
+			})
+		},
+
+		methods: {
+			showDetail(e) {
+				console.log(e);
+				var code = e.currentTarget.dataset.code;
+
+				uni.navigateTo({
+					url: '/pages/operator/operatorInfo/operatorInfo?code=' + code,
+				});
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.operatorList {
+		display: flex;
+		flex-direction: row;
+		height: 125rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		width: 704rpx;
+		margin-left: 23rpx;
+		border-radius: 10rpx;
+	}
+
+	.image1 {
+		width: 90rpx;
+		height: 90rpx;
+		margin-top: 20rpx;
+		margin-left: 20rpx;
+	}
+
+	.image2 {
+		width: 10px;
+		height: 10px;
+		margin-top: 50rpx;
+		// margin-left: 400rpx;
+
+	}
+
+	.back {
+		background-color: aliceblue;
+		width: 100%;
+		height: 100%;
+	}
+</style>

+ 143 - 0
sources/client/vrv-moblie/pages/operator/operatorInfo/operatorInfo.vue

@@ -0,0 +1,143 @@
+<template>
+	<view>
+		<view class="form">
+			<form>
+				<view class="uni-form-item">
+					<view class="title">运营商名称</view>
+					<view class="input">
+						<input placeholder="运营商名称" v-model="formData.name" style="margin-left: 30rpx;" />
+					</view>
+				</view>
+				<view class="uni-form-item">
+					<view class="title">运营商编号</view>
+					<view class="input">
+						<input placeholder="运营商编号" v-model="formData.number" style="margin-left: 30rpx;" />
+					</view>
+				</view>
+				<view class="uni-form-item">
+					<view class="title">省份</view>
+					<view class="input">
+						<input placeholder="省份" v-model="formData.province" style="margin-left: 30rpx;" />
+					</view>
+				</view>
+				<view class="uni-form-item">
+					<view class="title">城市</view>
+					<view class="input">
+						<input placeholder="城市" v-model="formData.city" style="margin-left: 30rpx;" />
+					</view>
+				</view>
+				<view class="uni-form-item">
+					<view class="title">详细地址</view>
+					<view class="input">
+						<input placeholder="详细地址" v-model="formData.address" style="margin-left: 30rpx;" />
+					</view>
+				</view>
+				<view class="uni-form-item">
+					<view class="title">联系人</view>
+					<view class="input">
+						<input placeholder="联系人" v-model="formData.contact" style="margin-left: 30rpx;" />
+					</view>
+				</view>
+				<view class="uni-form-item">
+					<view class="title">联系电话</view>
+					<view class="input">
+						<input placeholder="联系电话" v-model="formData.tel" style="margin-left: 30rpx;" />
+					</view>
+				</view>
+			</form>
+		</view>
+
+		<view class="uni-btn-v">
+			<button form-type="submit" class="button1">删除</button>
+			<button form-type="submit" class="button2">修改</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				formData: {
+					name: '',
+					number: '',
+					contact: '',
+					tel: '',
+					address: '',
+					province: '',
+					city: '',
+				}
+			}
+		},
+		onLoad(e) {
+			console.log(e);
+			uni.request({
+				url: 'http://127.0.0.1:9999/operator/detail?code=' + e.code,
+				method: 'GET',
+				data: {},
+				success: res => {
+					this.formData = res.data.data.operator;
+					console.log(this.formData);
+				},
+
+			});
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.title {
+		margin-left: 30rpx;
+		margin-top: 20rpx;
+		margin-bottom: 20rpx;
+		font-size: 26rpx;
+	}
+
+	.form {
+		margin-top: 26rpx;
+		padding-top: 10rpx;
+		background-color: white;
+		width: 702rpx;
+		height: 1220rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+	}
+
+
+	.input {
+		background-color: #F7F8F9;
+		width: 654rpx;
+		margin-left: 24rpx;
+		height: 98rpx;
+		border-radius: 10rpx;
+
+		display: flex;
+		align-items: center;
+	}
+
+	.uni-btn-v {
+		display: flex;
+		flex-direction: row;
+	}
+
+	.button1 {
+		width: 315rpx;
+		height: 76rpx;
+		margin-top: 30rpx;
+		background-color: #E02021;
+		color: white;
+		font-size: unset;
+	}
+
+	.button2 {
+		width: 315rpx;
+		height: 76rpx;
+		margin-top: 30rpx;
+		background-color: #007AFF;
+		color: white;
+		font-size: unset;
+	}
+</style>

+ 76 - 0
sources/client/vrv-moblie/pages/operatorLog/operatorLog.vue

@@ -0,0 +1,76 @@
+<template>
+	<view>
+		<view class="log" v-for="item in operatorLogs" :key="item.code">
+
+<view class="oper">
+	<text class="title">操作内容:{{item.content}}</text>
+	
+</view>
+		
+			<view class="content">
+				<text>操 作 人:{{item.userReal}}</text>
+				<text>操作时间:{{item.updateTime}}</text>
+			</view>
+
+
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				operatorLogs: [],
+			}
+		},
+		onLoad() {
+			uni.request({
+				url: 'http://127.0.0.1:9999/operatorLog/list',
+				method: 'GET',
+				data: {},
+				success: res => {
+
+					this.operatorLogs = res.data.data.operatorLogs;
+					console.log(res.data.data.operatorLogs);
+				},
+
+			})
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.log {
+		width: 702rpx;
+		height: 329rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		margin-top: 20rpx;
+		margin-left: 30rpx;
+		line-height: 55rpx;
+		color: #444546;
+		font-size: 28rpx;
+	}
+
+.oper{
+	height: 180rpx;
+}
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+</style>

+ 354 - 0
sources/client/vrv-moblie/pages/parameterSetting/parameterSetting.vue

@@ -0,0 +1,354 @@
+<template>
+	<view>
+		<view class="white">
+
+			<view class="title">
+				<text class="param">参数设定</text>
+				<view class="tiao"></view>
+			</view>
+
+
+			<view class="setmenu">
+				<view class="setItem">
+					<view class="text">
+						<text>排风温度设定</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+						<view class="danwei">
+							<text style="margin-left: 10rpx;">℃</text>
+						</view>
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>排风湿度设定</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+						<view class="danwei"> <text style="margin-left: 14rpx;">%</text></view>
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>停机延时设定</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+						<view class="danwei"> <text style="margin-left: 20rpx;">S</text></view>
+					</view>
+				</view>
+			</view>
+
+
+			<view class="buttonItem">
+				<view class="item">
+					<view class="text">
+						<text>控制选择模式</text>
+					</view>
+					<button class="button">CK-1</button>
+				</view>
+				<view class="item">
+					<view class="text">
+						<text>控制模式复位</text>
+					</view>
+					<button class="button">复位</button>
+				</view>
+			</view>
+		</view>
+
+		<view class="xiabu">
+
+			<view class="title">
+				<text class="param">运行状态</text>
+				<view class="tiao"></view>
+			</view>
+
+			<view class="head">
+				<text>设备名称</text>
+				<text style="margin-left: 30rpx">控制模式</text>
+				<text>手动命令</text>
+				<text>实时反馈</text>
+			</view>
+			<view class="whiteItem">
+				<text class="text1">空调送风机</text>
+				<button class="auto">自动</button>
+				<button class="stop">停止</button>
+				<text class="four">运行</text>
+			</view>
+			<view class="grayItem">
+				<text class="text1">空调送风机</text>
+				<button class="auto">自动</button>
+				<button class="stop">停止</button>
+				<text class="four">运行</text>
+			</view>
+			<view class="whiteItem">
+				<text class="text1">一级电加热</text>
+				<button class="auto">自动</button>
+				<button class="stop">停止</button>
+				<text class="four">开启</text>
+			</view>
+			<view class="grayItem">
+				<text class="text1">二级电加热</text>
+				<button class="auto">自动</button>
+				<button class="stop">停止</button>
+				<text class="four">开启</text>
+			</view>
+			<view class="whiteItem">
+				<text class="text1">三级电加热</text>
+				<button class="auto">自动</button>
+				<button class="stop">停止</button>
+				<text class="four">运行</text>
+			</view>
+			<view class="grayItem">
+				<text class="text1">空调送风阀</text>
+				<button class="auto">自动</button>
+				<button class="stop">停止</button>
+				<text class="four">开启</text>
+			</view>
+			<view class="whiteItem">
+				<text class="text1">空调排水阀</text>
+				<button class="auto">自动</button>
+				<button class="stop">停止</button>
+				<text class="four">开启</text>
+			</view>
+			<view class="grayItem">
+				<text class="text1">空调冷水阀</text>
+				<button class="auto">自动</button>
+				<view style="display: flex;flex-direction: row;align-items: center;">
+					<button class="three">100</button>%
+				</view>
+
+				<view class="four1">
+					<text>76%</text>
+				</view>
+			</view>
+			<view class="whiteItem">
+				<text class="text1">空调热水阀</text>
+				<button class="auto">自动</button>
+				<view style="display: flex;flex-direction: row;align-items: center;">
+					<button class="three">0</button>%
+				</view>
+				<view class="four1">
+					<text>87%</text>
+				</view>
+			</view>
+			<view class="grayItem">
+				<text class="text1">空调加湿器</text>
+				<button class="auto">自动</button>
+				<view style="display: flex;flex-direction: row;align-items: center;">
+					<button class="three">0</button>%
+				</view>
+				<view class="four1">
+					<text>98%</text>
+				</view>
+			</view>
+		</view>
+
+		<view class="anniu">
+			<image class="anniu" src="../../static/设备菜单/前往列表@2x.png"></image>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+
+		}
+	}
+</script>
+<style>
+	.anniu {
+		width: 116rpx;
+		height: 116rpx;
+		float: right;
+		margin-right: 10rpx;
+	}
+
+	.four1 {
+		margin-right: 60rpx;
+		margin-left: 40rpx;
+	}
+
+	.four {
+		margin-right: 60rpx;
+	}
+
+	.whiteItem {
+		height: 60px;
+		background: white;
+		border-radius: 4px;
+		font-size: 30rpx;
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+		color: #444546;
+	}
+
+	.grayItem {
+		height: 60px;
+		background: #F6F7FB;
+		border-radius: 4px;
+		font-size: 30rpx;
+		display: flex;
+		align-items: center;
+		color: #444546;
+	}
+
+	.text1 {
+		margin-left: 20rpx;
+		font-size: 30rpx;
+		color: #444546;
+	}
+
+	.auto {
+		width: 60px;
+		height: 33px;
+		background: #007AFF;
+		border-radius: 4px;
+		font-size: 30rpx;
+		color: white;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.three {
+		margin-right: 10rpx;
+		margin-left: 0rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 30rpx;
+		color: #007AFF;
+		width: 60px;
+		height: 33px;
+		border-radius: 4px;
+		border: 1px solid #007AFF;
+	}
+
+	.stop {
+		margin-right: 75rpx;
+		margin-left: 0rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 30rpx;
+		color: #007AFF;
+		width: 60px;
+		height: 33px;
+		border-radius: 4px;
+		border: 1px solid #007AFF;
+	}
+
+	.head {
+		height: 60px;
+		background: #EAF1FE;
+		border-radius: 4px;
+		font-size: 30rpx;
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+		color: #444546;
+	}
+
+	.xiabu {
+		margin-left: 24rpx;
+		margin-top: 24rpx;
+		background-color: white;
+		width: 702rpx;
+		height: 1420rpx;
+		border-radius: 10rpx;
+	}
+
+	.buttonItem {
+		display: flex;
+		flex-direction: row;
+		margin-top: 5rpx;
+	}
+
+	.button {
+		width: 320rpx;
+		height: 98rpx;
+		margin-top: 20rpx;
+		background-color: #007AFF;
+		color: white;
+		font-size: unset;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.item {
+		margin-left: 20rpx;
+	}
+
+	.setmenu {
+		display: flex;
+		flex-wrap: wrap;
+	}
+
+	.setItem {
+		margin-left: 20rpx;
+	}
+
+	.text {
+		margin-top: 40rpx;
+		margin-bottom: 16rpx;
+		color: #444546;
+		font-size: 26rpx;
+	}
+
+	.input {
+		width: 320rpx;
+		height: 98rpx;
+		background-color: #eaeaea;
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		border-radius: 5rpx;
+		border: 1px solid #eaeaea;
+	}
+
+	.danwei {
+		width: 78rpx;
+		height: 98rpx;
+		background-color: white;
+		display: flex;
+		align-items: center;
+	}
+
+	.white {
+		width: 702rpx;
+		height: 711rpx;
+		background-color: white;
+		margin-left: 24rpx;
+		margin-top: 26rpx;
+	}
+
+	.title {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+
+	.tiao {
+		width: 60px;
+		height: 3px;
+		margin-top: 20rpx;
+		background: #007AFF;
+	}
+
+	.param {
+		font-size: 38rpx;
+		font-weight: 550;
+		margin-top: 40rpx;
+	}
+</style>

+ 67 - 0
sources/client/vrv-moblie/pages/project/project.vue

@@ -0,0 +1,67 @@
+<template>
+	<view style="display: flex;flex-wrap: wrap;">
+		<view class="project" v-for="item in projects" :key="item.number" @tap="showDetail" :data-code="item.code">
+			<image class="image" src="../../static/项目管理/项目管理@2x.png"></image>
+			<text class="text">{{item.name}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				projects: [],
+
+			}
+		},
+		onLoad() {
+			uni.request({
+				url: 'http://127.0.0.1:9999/project/list',
+				method: 'GET',
+				data: {},
+				success: res => {
+					this.projects = res.data.data.projects;
+					console.log(res.data.data.projects);
+				},
+
+			})
+		},
+		methods: {
+			showDetail(e) {
+				console.log(e);
+				var code = e.currentTarget.dataset.code;
+
+				uni.navigateTo({
+					url: '/pages/project/projectInfo/projectInfo?code=' + code,
+				});
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.project {
+		width: 343rpx;
+		height: 260rpx;
+		background-color: white;
+		display: flex;
+		flex-direction: column;
+		margin-left: 22rpx;
+		margin-top: 30rpx;
+		border-radius: 10rpx;
+		text-align: center;
+	}
+
+	.image {
+		margin-left: 100rpx;
+		margin-top: 30rpx;
+		width: 140rpx;
+		height: 140rpx;
+	}
+
+	.text {
+		margin-top: 10rpx;
+	}
+</style>

+ 304 - 0
sources/client/vrv-moblie/pages/project/projectInfo/projectInfo.vue

@@ -0,0 +1,304 @@
+<template>
+	<view>
+		<view class="head">
+
+			<view class="nameImage">
+				<image class="image1" src="../../../static/项目管理/图像@2x.png"></image>
+				<text class="name">{{formData.name}}</text>
+
+				<view class="tianchong"></view>
+
+
+				<view class="bottom">
+					<view class="contact">
+						<view class="con">
+
+							<image class="image2" src="../../../static/项目管理/联系人@2x.png"></image>
+							<text class="con1">联系人</text>
+						</view>
+
+						<text class="contact1">{{formData.customer}} {{formData.customerTel}}</text>
+					</view>
+					<view class="address">
+						<view class="add">
+							<image class="image3" src="../../../static/项目管理/地址@2x.png"></image>
+							<text class="add1">地 址</text>
+						</view>
+						<text class="address1">{{formData.province}}{{formData.city}}{{formData.address}}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="xiaban"></view>
+		<view class="mid">
+			<text class="gateway" style="font-size: 40rpx;font-weight: 550;">网关列表</text>
+			<view class="tiao"></view>
+		</view>
+
+		<view class="gatewayList" v-for="item in gateways" :key="item.code">
+
+			<view class="col">
+				<view class="switch">
+					<switch checked color="#007AFE" @change="switchChange" />
+				</view>
+				<view class="list" @tap="showDevice" :data-code="item.code">设备列表 ></view>
+			</view>
+
+
+
+			<text class="title">{{item.number}}</text>
+
+			<view class="content">
+				<text>网关IP:{{item.ip}}</text>
+				<text>点位名称:{{item.location}}</text>
+			</view>
+		</view>
+
+		<view class="uni-btn-v">
+			<button form-type="submit" class="button1">删除项目</button>
+			<button form-type="submit" class="button2">修改项目信息</button>
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				gateways: [],
+
+				formData: {
+					name: '',
+					number: '',
+					description: '',
+					customer: '',
+					customerTel: '',
+					address: '',
+					province: '',
+					city: '',
+				}
+			}
+		},
+		onLoad(e) {
+			console.log(e);
+
+			uni.request({
+				url: 'http://127.0.0.1:9999/project/detail?code=' + e.code,
+				method: 'GET',
+				data: {},
+				success: res => {
+					this.formData = res.data.data.project;
+					console.log(this.formData);
+				},
+
+			});
+
+			uni.request({
+				url: 'http://127.0.0.1:9999/gateway/list?projectCode=' + e.code,
+				method: 'GET',
+				data: {},
+				success: res => {
+					this.gateways = res.data.data.gateways;
+					console.log(this.gateways);
+				},
+
+			});
+		},
+		methods: {
+			showDevice(e) {
+				console.log(e);
+				var code = e.currentTarget.dataset.code;
+				
+				uni.navigateTo({
+					url: '/pages/device/device?code=' + code,
+				});
+				
+			}
+		}
+	}
+</script>
+
+<style>
+	.list {
+		font-size: 28rpx;
+		color: #007AFF;
+		margin-right: 20rpx;
+		margin-top: 85rpx;
+	}
+
+	.switch {
+		transform: scale(0.6);
+		margin-left: 30rpx;
+	}
+
+	.col {
+		float: right;
+	}
+
+	.uni-btn-v {
+		display: flex;
+		flex-direction: row;
+		margin-top: 100rpx;
+	}
+
+	.button1 {
+		width: 315rpx;
+		height: 76rpx;
+		margin-top: 30rpx;
+		background-color: #E02021;
+		color: white;
+		font-size: unset;
+	}
+
+	.button2 {
+		width: 315rpx;
+		height: 76rpx;
+		margin-top: 30rpx;
+		background-color: #007AFF;
+		color: white;
+		font-size: unset;
+	}
+
+	.gatewayList {
+		width: 702rpx;
+		height: 230rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		margin-top: 30rpx;
+		margin-left: 30rpx;
+		line-height: 60rpx;
+		color: #444546;
+	}
+
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+
+	.mid {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		margin-top: 36rpx;
+	}
+
+	.tiao {
+		width: 60px;
+		height: 3px;
+		margin-top: 20rpx;
+		background: #007AFF;
+	}
+
+	.address1 {
+		float: right;
+		margin-right: 40rpx;
+		margin-top: 40rpx;
+	}
+
+	.add1 {
+		color: #848586;
+		margin-left: 20rpx;
+	}
+
+	.add {
+		float: left;
+		margin-left: 60rpx;
+		margin-top: 40rpx;
+		display: flex;
+		flex-direction: row;
+	}
+
+	.contact1 {
+		float: right;
+		margin-right: 40rpx;
+		margin-top: 40rpx;
+	}
+
+	.con1 {
+		color: #848586;
+		margin-left: 20rpx;
+		padding-top: 20rpx;
+	}
+
+	.con {
+		float: left;
+		margin-left: 60rpx;
+		margin-top: 40rpx;
+	}
+
+	.image2 {
+		float: left;
+		width: 36rpx;
+		height: 36rpx;
+	}
+
+	.image3 {
+		width: 36rpx;
+		height: 36rpx;
+	}
+
+	.xiaban {
+		height: 50rpx;
+		width: 702rpx;
+		background-color: white;
+		margin-left: 24rpx;
+		border-bottom-left-radius: 10rpx;
+		border-bottom-right-radius: 10rpx;
+	}
+
+	.head {
+		height: 420rpx;
+		background: linear-gradient(180deg, #2A8FFB 0%, #0467FB 100%);
+		display: flex;
+		justify-content: center;
+	}
+
+	.image1 {
+		margin-left: 280rpx;
+		height: 200rpx;
+		width: 140rpx;
+		margin-top: 41rpx;
+	}
+
+	.name {
+		font-size: 36rpx;
+		color: white;
+		margin-top: 20rpx;
+		margin-bottom: ;
+	}
+
+	.nameImage {
+		display: flex;
+		flex-direction: column;
+		text-align: center;
+	}
+
+	.tianchong {
+		width: 702rpx;
+		height: 65rpx;
+	}
+
+	.bottom {
+		width: 702rpx;
+		height: 145rpx;
+		background-color: white;
+		border-top-left-radius: 10rpx;
+		border-top-right-radius: 10rpx;
+		display: flex;
+		flex-direction: column;
+		font-size: 26rpx;
+	}
+</style>

+ 102 - 0
sources/client/vrv-moblie/pages/rolePower/rolePower.vue

@@ -0,0 +1,102 @@
+<template>
+	<view>
+		<view class="user" v-for="item in rolePowers" :key="item.code">
+
+			<view class="all">
+				<view class="img">
+					<image class="image" src="../../static/权限管理/管理员@2x.png"></image>
+				</view>
+
+				<view class="text">
+					<text class="title">{{item.roleFlag}}</text>
+
+					<view class="content">
+						<text>角色权限:{{item.powerFlag}}</text>
+					</view>
+				</view>
+
+			</view>
+
+
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				rolePowers: [],
+			}
+		},
+		onLoad() {
+			uni.request({
+				url: 'http://127.0.0.1:9999/rolePower/list',
+				method: 'GET',
+				data: {},
+				success: res => {
+
+					this.rolePowers = res.data.data.rolePowers;
+					console.log(res.data.data.rolePowers);
+				},
+
+			})
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.text {
+		margin-top: 24rpx;
+	}
+
+	.all {
+		display: flex;
+		flex-direction: row;
+	}
+
+	.image {
+		margin-left: 24rpx;
+		margin-top: 30rpx;
+		width: 100rpx;
+		height: 100rpx;
+	}
+
+	.anniu {
+		width: 116rpx;
+		height: 116rpx;
+		float: right;
+		margin-top: 10rpx;
+		margin-right: 4rpx;
+	}
+
+	.user {
+		width: 702rpx;
+		height: 207rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+
+		margin-top: 20rpx;
+		margin-left: 30rpx;
+		font-size: 28rpx;
+		color: #444546;
+	}
+
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+</style>

+ 336 - 0
sources/client/vrv-moblie/pages/runningState/runningState.vue

@@ -0,0 +1,336 @@
+<template>
+	<view>
+		<view class="head">
+			<view class="shang">
+				<view class="shangItem">
+					<text>冷水阀</text>
+					<text>94%</text>
+				</view>
+				<view class="shangItem">
+					<text style="margin-left: 6rpx;">电加热</text>
+					<view class="buttonItem">
+						<button class="but">一</button>
+						<button class="but">二</button>
+						<button class="but">三</button>
+					</view>
+				</view>
+				<view class="shangItem">
+					<text>加湿器</text>
+					<text>0%</text>
+				</view>
+
+			</view>
+
+
+			<view class="comp"></view>
+
+
+			<view class="xia">
+				<view class="xiaItem">
+					<text>初效滤网</text>
+					<view class="xiaBut">
+						<button class="xiaButton">正常</button>
+					</view>
+				</view>
+				<view class="xiaItem">
+					<text>热水阀</text>
+					<text>87%</text>
+				</view>
+				<view class="xiaItem">
+					<text>高温报警</text>
+					<view class="xiaBut">
+						<button class="xiaButton">正常</button>
+					</view>
+				</view>
+				<view class="xiaItem">
+					<text>缺风压差</text>
+					<view class="xiaBut">
+						<button class="xiaButton">正常</button>
+					</view>
+				</view>
+				<view class="xiaItem">
+					<text>中效滤网</text>
+					<view class="xiaBut">
+						<button class="xiaButton">正常</button>
+					</view>
+				</view>
+
+			</view>
+		</view>
+
+		<view class="hold">
+			<view class="tiao">
+				<text class="tiaoText">CK-1</text>
+			</view>
+			<view class="param">
+				<view class="paramItem">
+					<text class="name">温度</text>
+					<text class="value">22.5℃</text>
+				</view>
+				<view class="paramItem">
+					<text class="name">湿度</text>
+					<text class="value">59.7%</text>
+				</view>
+				<view class="paramItem">
+					<text class="name">含湿量</text>
+					<text class="value">10.2g/kg</text>
+				</view>
+
+			</view>
+		</view>
+
+		<view class="hold">
+			<view class="tiao">
+				<text class="tiaoText">CK-2</text>
+			</view>
+			<view class="param">
+				<view class="paramItem">
+					<text class="name">温度</text>
+					<text class="value">22.5℃</text>
+				</view>
+				<view class="paramItem">
+					<text class="name">湿度</text>
+					<text class="value">59.7%</text>
+				</view>
+				<view class="paramItem">
+					<text class="name">含湿量</text>
+					<text class="value">10.2g/kg</text>
+				</view>
+
+			</view>
+		</view>
+
+		<view class="stop">
+			<view class="stopTiao">
+				<text class="stopTiaoText">停机延时:180S</text>
+			</view>
+			<view class="param">
+				<view class="paramItem1">
+					<text class="name1">排风温度设定</text>
+					<text class="value">22.5℃</text>
+				</view>
+				<view class="paramItem1">
+					<text class="name1">排风湿度设定</text>
+					<text class="value">55%</text>
+				</view>
+				<view class="paramItem1">
+					<text class="name1">排风含湿量设定</text>
+					<text class="value">9.6g/kg</text>
+				</view>
+
+			</view>
+		</view>
+
+		<view class="stopButton">
+			<button class="button">停止按钮</button>
+		</view>
+
+		<view class="anniu">
+			<image class="anniu" src="../../static/设备菜单/前往列表@2x.png"></image>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.anniu {
+		width: 116rpx;
+		height: 116rpx;
+		float: right;
+		margin-right: 10rpx;
+	}
+
+	.button {
+		background-color: #E12A1F;
+		color: white;
+		width: 654rpx;
+		margin-left: 48rpx;
+		margin-top: 44rpx;
+	}
+
+	.name1 {
+		color: #848586;
+		font-size: 24rpx;
+	}
+
+	.name {
+		color: #848586;
+		font-size: 30rpx;
+
+	}
+
+	.value {
+		font-size: 38rpx;
+		color: #444546;
+	}
+
+	.paramItem {
+		display: flex;
+		flex-direction: column;
+		margin-left: 58rpx;
+		margin-right: 58rpx;
+	}
+
+	.paramItem1 {
+		display: flex;
+		flex-direction: column;
+		margin-left: 40rpx;
+		margin-right: 40rpx;
+	}
+
+	.param {
+		display: flex;
+		flex-direction: row;
+		margin-left: 24rpx;
+		align-items: center;
+		justify-content: center;
+		width: 702rpx;
+		height: 140rpx;
+		background-color: white;
+		border-bottom-right-radius: 8rpx;
+		border-bottom-left-radius: 8rpx;
+	}
+
+	.tiaoText {
+		margin-left: 44rpx;
+		font-size: 34rpx;
+		font-weight: 550;
+
+	}
+
+	.stopTiaoText {
+		margin-left: 44rpx;
+		font-size: 36rpx;
+		font-weight: 550;
+	}
+
+	.tiao {
+		margin-top: 26rpx;
+		border-top-left-radius: 8rpx;
+		border-top-right-radius: 8rpx;
+		margin-left: 24rpx;
+		width: 702rpx;
+		height: 60px;
+		background: #EAF1FE;
+		font-size: 30rpx;
+		color: #007AFF;
+		display: flex;
+		align-items: center;
+	}
+
+	.stopTiao {
+		margin-top: 26rpx;
+		border-top-left-radius: 8rpx;
+		border-top-right-radius: 8rpx;
+		margin-left: 24rpx;
+		width: 702rpx;
+		height: 60px;
+		background: #007AFF;
+		font-size: 38rpx;
+		color: white;
+		display: flex;
+		align-items: center;
+	}
+
+	.xia {
+
+		display: flex;
+		flex-direction: row;
+	}
+
+	.xiaItem {
+		color: white;
+		display: flex;
+		flex-direction: column;
+		margin-left: 20rpx;
+		margin-right: 20rpx;
+		align-items: center;
+		justify-content: center;
+		margin-bottom: 16rpx;
+	}
+
+	.shang {
+
+		display: flex;
+		flex-direction: row;
+	}
+
+	.shangItem {
+		color: white;
+		display: flex;
+		flex-direction: column;
+		margin-left: 30rpx;
+		margin-right: 30rpx;
+		align-items: center;
+		justify-content: center;
+		margin-bottom: 16rpx;
+	}
+
+	.buttonItem {
+		display: flex;
+		flex-direction: row;
+		font-size: 20rpx;
+		color: #444546;
+	}
+
+	.but {
+		width: 50rpx;
+		height: 50rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-left: 10rpx;
+		margin-top: 5rpx;
+		font-size: 24rpx;
+
+	}
+
+	.xiaBut {
+		display: flex;
+		flex-direction: row;
+		font-size: 20rpx;
+		color: #444546;
+	}
+
+	.xiaButton {
+		width: 100rpx;
+		height: 50rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-left: 10rpx;
+		margin-top: 5rpx;
+		font-size: 24rpx;
+	}
+
+	.head {
+		font-size: 26rpx;
+		height: 300px;
+		background: linear-gradient(180deg, #2A8FFB 0%, #0467FB 100%);
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.comp {
+		background-color: #D6D6D6;
+		width: 702rpx;
+		height: 200rpx;
+		border-radius: 8rpx;
+		margin-bottom: 20rpx;
+	}
+</style>

+ 269 - 0
sources/client/vrv-moblie/pages/staticProject/staticProject.vue

@@ -0,0 +1,269 @@
+<template>
+	<view>
+		<view class="head">
+
+			<view class="nameImage">
+				<image class="image1" src="../../static/项目管理/图像@2x.png"></image>
+				<text class="name">仲恺公司</text>
+
+				<view class="tianchong"></view>
+
+
+				<view class="bottom">
+					<view class="contact">
+						<view class="con">
+
+							<image class="image2" src="../../static/项目管理/联系人@2x.png"></image>
+							<text class="con1">联系人</text>
+						</view>
+
+						<text class="contact1">陈一 13512345124</text>
+					</view>
+					<view class="address">
+						<view class="add">
+							<image class="image3" src="../../static/项目管理/地址@2x.png"></image>
+							<text class="add1">地 址</text>
+						</view>
+						<text class="address1">广东省广州市海珠区东沙街24号</text>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="xiaban"></view>
+		<view class="mid">
+			<text class="gateway" style="font-size: 40rpx;font-weight: 550;">网关列表</text>
+			<view class="tiao"></view>
+		</view>
+
+		<view class="gatewayList" >
+			
+			<view class="col">
+			<view class="switch">
+				<switch checked color="#007AFE" @change="switchChange" />
+			</view>
+			<view class="list">设备列表 ></view>
+			</view>
+			
+			
+			
+			<text class="title">GATEWAY001</text>
+
+			<view class="content">
+				<text>网关IP:192.168.0.1</text>
+				<text>点位名称:1楼2层3栋</text>
+			</view>
+		</view>
+
+		<view class="uni-btn-v">
+			<button form-type="submit" class="button1">删除项目</button>
+			<button form-type="submit" class="button2">修改项目信息</button>
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				gateways: [],
+
+				formData: {
+					name: '',
+					number: '',
+					description: '',
+					customer: '',
+					customerTel: '',
+					address: '',
+					province: '',
+					city: '',
+				}
+			}
+		},
+	
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.list{
+		font-size: 28rpx;
+		color: #007AFF;
+		margin-right: 20rpx;
+		margin-top: 85rpx;
+	}
+	.switch{
+		transform: scale(0.6);
+		margin-left: 30rpx;
+	}
+	.col{
+		float: right;
+	}
+	.uni-btn-v {
+		display: flex;
+		flex-direction: row;
+		margin-top: 100rpx;
+	}
+
+	.button1 {
+		width: 315rpx;
+		height: 76rpx;
+		margin-top: 30rpx;
+		background-color: #E02021;
+		color: white;
+		font-size: unset;
+	}
+
+	.button2 {
+		width: 315rpx;
+		height: 76rpx;
+		margin-top: 30rpx;
+		background-color: #007AFF;
+		color: white;
+		font-size: unset;
+	}
+
+	.gatewayList {
+		width: 702rpx;
+		height: 230rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		margin-top: 30rpx;
+		margin-left: 30rpx;
+		line-height: 60rpx;
+		color: #444546;
+	}
+
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+
+	.mid {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		margin-top: 36rpx;
+	}
+
+	.tiao {
+		width: 60px;
+		height: 3px;
+		margin-top: 20rpx;
+		background: #007AFF;
+	}
+
+	.address1 {
+		float: right;
+		margin-right: 40rpx;
+		margin-top: 40rpx;
+	}
+
+	.add1 {
+		color: #848586;
+		margin-left: 20rpx;
+	}
+
+	.add {
+		float: left;
+		margin-left: 60rpx;
+		margin-top: 40rpx;
+		display: flex;
+		flex-direction: row;
+	}
+
+	.contact1 {
+		float: right;
+		margin-right: 40rpx;
+		margin-top: 40rpx;
+	}
+
+	.con1 {
+		color: #848586;
+		margin-left: 20rpx;
+		padding-top: 20rpx;
+	}
+
+	.con {
+		float: left;
+		margin-left: 60rpx;
+		margin-top: 40rpx;
+	}
+
+	.image2 {
+		float: left;
+		width: 36rpx;
+		height: 36rpx;
+	}
+
+	.image3 {
+		width: 36rpx;
+		height: 36rpx;
+	}
+
+	.xiaban {
+		height: 50rpx;
+		width: 702rpx;
+		background-color: white;
+		margin-left: 24rpx;
+		border-bottom-left-radius: 10rpx;
+		border-bottom-right-radius: 10rpx;
+	}
+
+	.head {
+		height: 420rpx;
+		background: linear-gradient(180deg, #2A8FFB 0%, #0467FB 100%);
+		display: flex;
+		justify-content: center;
+	}
+
+	.image1 {
+		margin-left: 280rpx;
+		height: 140rpx;
+		width: 140rpx;
+		margin-top: 41rpx;
+	}
+
+	.name {
+		font-size: 36rpx;
+		color: white;
+		margin-top: 20rpx;
+		margin-bottom: ;
+	}
+
+	.nameImage {
+		display: flex;
+		flex-direction: column;
+		text-align: center;
+	}
+
+	.tianchong {
+		width: 702rpx;
+		height: 65rpx;
+	}
+
+	.bottom {
+		width: 702rpx;
+		height: 145rpx;
+		background-color: white;
+		border-top-left-radius: 10rpx;
+		border-top-right-radius: 10rpx;
+		display: flex;
+		flex-direction: column;
+		font-size: 26rpx;
+	}
+</style>

+ 195 - 0
sources/client/vrv-moblie/pages/systemParameter/systemParameter.vue

@@ -0,0 +1,195 @@
+<template>
+	<view>
+		<view class="white">
+			<view class="title">
+				<text class="param">参数修正</text>
+				<view class="tiao"></view>
+			</view>
+
+			<view class="setmenu">
+				<view class="setItem">
+					<view class="text">
+						<text>排风温度修正</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+						<view class="danwei">
+							<text style="margin-left: 10rpx;">℃</text>
+						</view>
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>排风湿度修正</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+						<view class="danwei"> <text style="margin-left: 14rpx;">%</text></view>
+					</view>
+				</view>
+
+				<view class="setItem">
+					<view class="text">
+						<text>加热比例</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>加热积分</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>降温比例</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>降温积分</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>加湿比例</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>加湿积分</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>除湿比例</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+					</view>
+				</view>
+				<view class="setItem">
+					<view class="text">
+						<text>除湿积分</text>
+					</view>
+					<view class="input">
+						<input style="margin-left: 20rpx;" placeholder="请输入" />
+					</view>
+				</view>
+
+			</view>
+
+			<view class="anniu">
+				<image class="anniu" src="../../static/设备菜单/前往列表@2x.png"></image>
+			</view>
+
+
+
+
+		</view>
+
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.text {
+		margin-top: 40rpx;
+		margin-bottom: 16rpx;
+		color: #444546;
+		font-size: 26rpx;
+	}
+
+	.input {
+		width: 320rpx;
+		height: 98rpx;
+		background-color: #eaeaea;
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		border-radius: 6rpx;
+		border: 1px solid #eaeaea;
+	}
+
+	.danwei {
+		width: 78rpx;
+		height: 98rpx;
+		background-color: white;
+		display: flex;
+		align-items: center;
+	}
+
+	.setmenu {
+		display: flex;
+		flex-wrap: wrap;
+	}
+
+	.setItem {
+		margin-left: 20rpx;
+	}
+
+	.white {
+		width: 702rpx;
+		height: 1200rpx;
+		margin-left: 24rpx;
+		margin-top: 24rpx;
+		border-radius: 10rpx;
+		background-color: white;
+	}
+
+	.title {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+
+	.tiao {
+		width: 60px;
+		height: 3px;
+		margin-top: 20rpx;
+		background: #007AFF;
+	}
+
+	.param {
+		font-size: 38rpx;
+		font-weight: 550;
+		margin-top: 40rpx;
+	}
+
+	.anniu {
+		width: 116rpx;
+		height: 116rpx;
+		float: right;
+		margin-top: 20rpx;
+	}
+</style>

+ 79 - 0
sources/client/vrv-moblie/pages/systemSet/systemSet.vue

@@ -0,0 +1,79 @@
+<template>
+	<view>
+		<view class="systemSet" @tap="showUser">
+			<image class="image1" src="../../static/系统设置/系统设置@2x.png"></image>
+			<text style="margin-top: 40rpx;margin-left: 30rpx; width: 500rpx;">系统管理员账号管理</text>
+			<image class="image2" src="../../static/运营商管理/ico2@3x.png"></image>
+		</view>
+
+		<view class="rolePower" @tap="showRolePower">
+			<image class="image1" src="../../static/系统设置/系统设置@2x.png"></image>
+			<text style="margin-top: 40rpx;margin-left: 30rpx; width: 500rpx;">角色与权限管理</text>
+			<image class="image2" src="../../static/运营商管理/ico2@3x.png"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+			showUser() {
+				uni.navigateTo({
+					url: '/pages/user/user',
+
+				});
+			},
+
+			showRolePower() {
+				uni.navigateTo({
+					url: '/pages/rolePower/rolePower',
+
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+	.systemSet {
+		display: flex;
+		flex-direction: row;
+		height: 125rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		width: 704rpx;
+		margin-left: 23rpx;
+		border-radius: 10rpx;
+	}
+
+	.rolePower {
+		display: flex;
+		flex-direction: row;
+		height: 125rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		width: 704rpx;
+		margin-left: 23rpx;
+		border-radius: 10rpx;
+	}
+
+	.image1 {
+		width: 90rpx;
+		height: 90rpx;
+		margin-top: 20rpx;
+		margin-left: 20rpx;
+	}
+
+	.image2 {
+		width: 10px;
+		height: 10px;
+		margin-top: 50rpx;
+		// margin-left: 400rpx;
+
+	}
+</style>

+ 78 - 0
sources/client/vrv-moblie/pages/user/user.vue

@@ -0,0 +1,78 @@
+<template>
+	<view>
+		<view class="user" v-for="item in users" :key="item.code">
+			<text class="title">账户 {{item.account}}</text>
+
+			<view class="content">
+				<text>密码:{{item.password}}</text>
+				<text>角色:{{item.roleFlag}}</text>
+				<text>电话:{{item.phone}}</text>
+			</view>
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				users: [],
+			}
+		},
+		onLoad() {
+			uni.request({
+				url: 'http://127.0.0.1:9999/user/list',
+				method: 'GET',
+				data: {},
+				success: res => {
+
+					this.users = res.data.data.users;
+					console.log(res.data.data.users);
+				},
+
+			})
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.anniu {
+		width: 116rpx;
+		height: 116rpx;
+		float: right;
+		margin-top: 10rpx;
+		margin-right: 4rpx;
+	}
+
+	.user {
+		width: 702rpx;
+		height: 280rpx;
+		background-color: white;
+		margin-top: 30rpx;
+		margin-left: 24rpx;
+		border-radius: 10rpx;
+		padding-top: 30rpx;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: column;
+		margin-top: 30rpx;
+		margin-left: 30rpx;
+		line-height: 55rpx;
+		font-size: 28rpx;
+		color: #444546;
+	}
+
+	.title {
+		font-size: 36rpx;
+		margin-left: 30rpx;
+		color: #282828;
+		font-weight: 600;
+	}
+</style>

+ 28 - 0
sources/client/vrv-moblie/project.config.json

@@ -0,0 +1,28 @@
+{
+    "appid": "wx95c3daeeb44f85f6",
+    "compileType": "miniprogram",
+    "libVersion": "2.26.0",
+    "packOptions": {
+        "ignore": [],
+        "include": []
+    },
+    "setting": {
+        "coverView": true,
+        "es6": true,
+        "postcss": true,
+        "minified": true,
+        "enhance": true,
+        "showShadowRootInWxmlPanel": true,
+        "packNpmRelationList": [],
+        "babelSetting": {
+            "ignore": [],
+            "disablePlugins": [],
+            "outputPath": ""
+        }
+    },
+    "condition": {},
+    "editorSetting": {
+        "tabIndent": "insertSpaces",
+        "tabSize": 4
+    }
+}

+ 7 - 0
sources/client/vrv-moblie/project.private.config.json

@@ -0,0 +1,7 @@
+{
+    "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+    "projectname": "vrv-platform",
+    "setting": {
+        "compileHotReLoad": true
+    }
+}

BIN
sources/client/vrv-moblie/static/底部按钮/报警管理@2x.png


BIN
sources/client/vrv-moblie/static/底部按钮/操作日志@2x.png


BIN
sources/client/vrv-moblie/static/底部按钮/系统设置@2x.png


BIN
sources/client/vrv-moblie/static/底部按钮/运营商管理@2x.png


BIN
sources/client/vrv-moblie/static/底部按钮/项目管理@2x.png


BIN
sources/client/vrv-moblie/static/权限管理/管理员@2x.png


BIN
sources/client/vrv-moblie/static/权限管理/运营商@2x.png


BIN
sources/client/vrv-moblie/static/登录/bg@2x.png


BIN
sources/client/vrv-moblie/static/系统设置/系统设置@2x.png


BIN
sources/client/vrv-moblie/static/设备菜单/前往列表@2x.png


BIN
sources/client/vrv-moblie/static/设备菜单/参数设置@2x.png


BIN
sources/client/vrv-moblie/static/设备菜单/报警记录@2x.png


BIN
sources/client/vrv-moblie/static/设备菜单/数据曲线@2x.png


BIN
sources/client/vrv-moblie/static/设备菜单/系统参数@2x.png


BIN
sources/client/vrv-moblie/static/设备菜单/维保记录@2x.png


BIN
sources/client/vrv-moblie/static/设备菜单/运行状态@2x.png


BIN
sources/client/vrv-moblie/static/运营商管理/1@3x.png


BIN
sources/client/vrv-moblie/static/运营商管理/ico2@3x.png


BIN
sources/client/vrv-moblie/static/项目管理/图像@2x.png


BIN
sources/client/vrv-moblie/static/项目管理/地址@2x.png


BIN
sources/client/vrv-moblie/static/项目管理/联系人@2x.png


BIN
sources/client/vrv-moblie/static/项目管理/项目管理@2x.png


+ 76 - 0
sources/client/vrv-moblie/uni.scss

@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;

+ 246 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/changelog.md

@@ -0,0 +1,246 @@
+## 2.4.3-20220505(2022-05-05)
+- 秋云图表组件 修复开启canvas2d后将series赋值为空数组显示加载图标时,再次赋值后画布闪动的bug
+- 秋云图表组件 修复升级hbx最新版后ECharts的highlight方法报错的bug
+- uCharts.js 雷达图新增参数opts.extra.radar.gridEval,数据点位网格抽希,默认1
+- uCharts.js 雷达图新增参数opts.extra.radar.axisLabel,	是否显示刻度点值,默认false
+- uCharts.js 雷达图新增参数opts.extra.radar.axisLabelTofix,刻度点值小数位数,默认0
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointShow,是否显示末端刻度圆点,默认false
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointRadius,刻度圆点的半径,默认3
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointColor,刻度圆点的颜色,默认#cccccc
+- uCharts.js 雷达图新增参数opts.extra.radar.linearType,渐变色类型,可选值"none"关闭渐变,"custom"开启渐变
+- uCharts.js 雷达图新增参数opts.extra.radar.customColor,自定义渐变颜色,数组类型对应series的数组长度以匹配不同series颜色的不同配色方案,例如["#FA7D8D", "#EB88E2"]
+- uCharts.js 雷达图优化支持series.textColor、series.textSize属性
+- uCharts.js 柱状图中温度计式图标,优化支持全圆角类型,修复边框有缝隙的bug,详见官网【演示】中的温度计图表
+- uCharts.js 柱状图新增参数opts.extra.column.activeWidth,当前点击柱状图的背景宽度,默认一个单元格单位
+- uCharts.js 混合图增加opts.extra.mix.area.gradient 区域图是否开启渐变色
+- uCharts.js 混合图增加opts.extra.mix.area.opacity 区域图透明度,默认0.2
+- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelText,自定义标签文字,避免formatter格式化的繁琐,详见官网【演示】中的饼图
+- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelShow,自定义是否显示某一个指示标签,避免因饼图类别太多导致标签重复或者居多导致图形变形的问题,详见官网【演示】中的饼图
+- uCharts.js 增加opts.series[i].legendText/opts.series[0].data[i].legendText(与series.name同级)自定义图例显示文字的方法
+- uCharts.js 优化X轴、Y轴formatter格式化方法增加形参,统一为fromatter:function(value,index,opts){}
+- uCharts.js 修复横屏模式下无法使用双指缩放方法的bug
+- uCharts.js 修复当只有一条数据或者多条数据值相等的时候Y轴自动计算的最大值错误的bug
+- 【官网模板】增加外部自定义图例与图表交互的例子,[点击跳转](https://www.ucharts.cn/v2/#/layout/info?id=2)
+
+## 注意:非unimodules 版本如因更新 hbx 至 3.4.7 导致报错如下,请到码云更新非 unimodules 版本组件,[点击跳转](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6)
+> Error in callback for immediate watcher "uchartsOpts": "SyntaxError: Unexpected token u in JSON at position 0"
+## 2.4.2-20220421(2022-04-21)
+- 秋云图表组件 修复HBX升级3.4.6.20220420版本后echarts报错的问题
+## 2.4.2-20220420(2022-04-20)
+## 重要!此版本uCharts新增了很多功能,修复了诸多已知问题
+- 秋云图表组件 新增onzoom开启双指缩放功能(仅uCharts),前提需要直角坐标系类图表类型,并且ontouch为true、opts.enableScroll为true,详见实例项目K线图
+- 秋云图表组件 新增optsWatch是否监听opts变化,关闭optsWatch后,动态修改opts不会触发图表重绘
+- 秋云图表组件 修复开启canvas2d功能后,动态更新数据后画布闪动的bug
+- 秋云图表组件 去除directory属性,改为自动获取echarts.min.js路径(升级不受影响)
+- 秋云图表组件 增加getImage()方法及@getImage事件,通过ref调用getImage()方法获,触发@getImage事件获取当前画布的base64图片文件流。
+- 秋云图表组件 支付宝、字节跳动、飞书、快手小程序支持开启canvas2d同层渲染设置。
+- 秋云图表组件 新增加【非uniCloud】版本组件,避免有些不需要uniCloud的使用组件发布至小程序需要提交隐私声明问题,请到码云[【非uniCloud版本】](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6),或npm[【非uniCloud版本】](https://www.npmjs.com/package/@qiun/uni-ucharts)下载使用。
+- uCharts.js 新增dobuleZoom双指缩放功能
+- uCharts.js 新增山峰图type="mount",数据格式为饼图类格式,不需要传入categories,具体详见新版官网在线演示
+- uCharts.js 修复折线图当数据中存在null时tooltip报错的bug
+- uCharts.js 修复饼图类当画布比较小时自动计算的半径是负数报错的bug
+- uCharts.js 统一各图表类型的series.formatter格式化方法的形参为(val, index, series, opts),方便格式化时有更多参数可用
+- uCharts.js 标记线功能增加labelText自定义显示文字,增加labelAlign标签显示位置(左侧或右侧),增加标签显示位置微调labelOffsetX、labelOffsetY
+- uCharts.js 修复条状图当数值很小时开启圆角后样式错误的bug
+- uCharts.js 修复X轴开启disabled后,X轴仍占用空间的bug
+- uCharts.js 修复X轴开启滚动条并且开启rotateLabel后,X轴文字与滚动条重叠的bug
+- uCharts.js 增加X轴rotateAngle文字旋转自定义角度,取值范围(-90至90)
+- uCharts.js 修复地图文字标签层级显示不正确的bug
+- uCharts.js 修复饼图、圆环图、玫瑰图当数据全部为0的时候不显示数据标签的bug
+- uCharts.js 修复当opts.padding上边距为0时,Y轴顶部刻度标签位置不正确的bug
+
+## 另外我们还开发了各大原生小程序组件,已发布至码云和npm
+[https://gitee.com/uCharts/uCharts](https://gitee.com/uCharts/uCharts)
+[https://www.npmjs.com/~qiun](https://www.npmjs.com/~qiun)
+
+## 对于原生uCharts文档我们已上线新版官方网站,详情点击下面链接进入官网
+[https://www.uCharts.cn/v2/](https://www.ucharts.cn/v2/)
+## 2.3.7-20220122(2022-01-22)
+## 重要!使用vue3编译,请使用cli模式并升级至最新依赖,HbuilderX编译需要使用3.3.8以上版本
+- uCharts.js 修复uni-app平台组件模式使用vue3编译到小程序报错的bug。
+## 2.3.7-20220118(2022-01-18)
+## 注意,使用vue3的前提是需要3.3.8.20220114-alpha版本的HBuilder!
+## 2.3.67-20220118(2022-01-18)
+- 秋云图表组件 组件初步支持vue3,全端编译会有些问题,具体详见下面修改:
+1. 小程序端运行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new uni_modules_qiunDataCharts_js_sdk_uCharts_uCharts.uCharts,将.uCharts去掉。
+2. 小程序端发行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new e.uCharts,将.uCharts去掉,变为 new e。
+3. 如果觉得上述步骤比较麻烦,如果您的项目只编译到小程序端,可以修改u-charts.js最后一行导出方式,将 export default uCharts;变更为 export default { uCharts: uCharts }; 这样变更后,H5和App端的renderjs会有问题,请开发者自行选择。(此问题非组件问题,请等待DC官方修复Vue3的小程序端)
+## 2.3.6-20220111(2022-01-11)
+- 秋云图表组件 修改组件 props 属性中的 background 默认值为 rgba(0,0,0,0)
+## 2.3.6-20211201(2021-12-01)
+- uCharts.js 修复bar条状图开启圆角模式时,值很小时圆角渲染错误的bug
+## 2.3.5-20211014(2021-10-15)
+- uCharts.js 增加vue3的编译支持(仅原生uCharts,qiun-data-charts组件后续会支持,请关注更新)
+## 2.3.4-20211012(2021-10-12)
+- 秋云图表组件 修复 mac os x 系统 mouseover 事件丢失的 bug
+## 2.3.3-20210706(2021-07-06)
+- uCharts.js 增加雷达图开启数据点值(opts.dataLabel)的显示
+## 2.3.2-20210627(2021-06-27)
+- 秋云图表组件 修复tooltipCustom个别情况下传值不正确报错TypeError: Cannot read property 'name' of undefined的bug
+## 2.3.1-20210616(2021-06-16)
+- uCharts.js 修复圆角柱状图使用4角圆角时,当数值过大时不正确的bug
+## 2.3.0-20210612(2021-06-12)
+- uCharts.js 【重要】uCharts增加nvue兼容,可在nvue项目中使用gcanvas组件渲染uCharts,[详见码云uCharts-demo-nvue](https://gitee.com/uCharts/uCharts)
+- 秋云图表组件 增加tapLegend属性,是否开启图例点击交互事件
+- 秋云图表组件 getIndex事件中增加返回uCharts实例中的opts参数,以便在页面中调用参数
+- 示例项目 pages/other/other.vue增加app端自定义tooltip的方法,详见showOptsTooltip方法
+## 2.2.1-20210603(2021-06-03)
+- uCharts.js 修复饼图、圆环图、玫瑰图,当起始角度不为0时,tooltip位置不准确的bug
+- uCharts.js 增加温度计式柱状图开启顶部半圆形的配置
+## 2.2.0-20210529(2021-05-29)
+- uCharts.js 增加条状图type="bar"
+- 示例项目 pages/ucharts/ucharts.vue增加条状图的demo
+## 2.1.7-20210524(2021-05-24)
+- uCharts.js 修复大数据量模式下曲线图不平滑的bug
+## 2.1.6-20210523(2021-05-23)
+- 秋云图表组件 修复小程序端开启滚动条更新数据后滚动条位置不符合预期的bug
+## 2.1.5-2021051702(2021-05-17)
+- uCharts.js 修复自定义Y轴min和max值为0时不能正确显示的bug
+## 2.1.5-20210517(2021-05-17)
+- uCharts.js 修复Y轴自定义min和max时,未按指定的最大值最小值显示坐标轴刻度的bug
+## 2.1.4-20210516(2021-05-16)
+- 秋云图表组件 优化onWindowResize防抖方法
+- 秋云图表组件 修复APP端uCharts更新数据时,清空series显示loading图标后再显示图表,图表抖动的bug
+- uCharts.js 修复开启canvas2d后,x轴、y轴、series自定义字体大小未按比例缩放的bug
+- 示例项目 修复format-e.vue拼写错误导致app端使用uCharts渲染图表
+## 2.1.3-20210513(2021-05-13)
+- 秋云图表组件 修改uCharts变更chartData数据为updateData方法,支持带滚动条的数据动态打点
+- 秋云图表组件 增加onWindowResize防抖方法 fix by ど誓言,如尘般染指流年づ 
+- 秋云图表组件 H5或者APP变更chartData数据显示loading图表时,原数据闪现的bug
+- 秋云图表组件 props增加errorReload禁用错误点击重新加载的方法
+- uCharts.js 增加tooltip显示category(x轴对应点位)标题的功能,opts.extra.tooltip.showCategory,默认为false
+- uCharts.js 修复mix混合图只有柱状图时,tooltip的分割线显示位置不正确的bug
+- uCharts.js 修复开启滚动条,图表在拖动中动态打点,滚动条位置不正确的bug
+- uCharts.js 修复饼图类数据格式为echarts数据格式,series为空数组报错的bug
+- 示例项目 修改uCharts.js更新到v2.1.2版本后,@getIndex方法获取索引值变更为e.currentIndex.index
+- 示例项目 pages/updata/updata.vue增加滚动条拖动更新(数据动态打点)的demo
+- 示例项目 pages/other/other.vue增加errorReload禁用错误点击重新加载的demo
+## 2.1.2-20210509(2021-05-09)
+秋云图表组件 修复APP端初始化时就传入chartData或lacaldata不显示图表的bug
+## 2.1.1-20210509(2021-05-09)
+- 秋云图表组件 变更ECharts的eopts配置在renderjs内执行,支持在config-echarts.js配置文件内写function配置。
+- 秋云图表组件 修复APP端报错Prop being mutated: "onmouse"错误的bug。
+- 秋云图表组件 修复APP端报错Error: Not Found:Page[6][-1,27] at view.umd.min.js:1的bug。
+## 2.1.0-20210507(2021-05-07)
+- 秋云图表组件 修复初始化时就有数据或者数据更新的时候loading加载动画闪动的bug
+- uCharts.js 修复x轴format方法categories为字符串类型时返回NaN的bug
+- uCharts.js 修复series.textColor、legend.fontColor未执行全局默认颜色的bug
+## 2.1.0-20210506(2021-05-06)
+- 秋云图表组件 修复极个别情况下报错item.properties undefined的bug
+- 秋云图表组件 修复极个别情况下关闭加载动画reshow不起作用,无法显示图表的bug
+- 示例项目 pages/ucharts/ucharts.vue 增加时间轴折线图(type="tline")、时间轴区域图(type="tarea")、散点图(type="scatter")、气泡图demo(type="bubble")、倒三角形漏斗图(opts.extra.funnel.type="triangle")、金字塔形漏斗图(opts.extra.funnel.type="pyramid")
+- 示例项目 pages/format-u/format-u.vue 增加X轴format格式化示例
+- uCharts.js 升级至v2.1.0版本
+- uCharts.js 修复 玫瑰图面积模式点击tooltip位置不正确的bug
+- uCharts.js 修复 玫瑰图点击图例,只剩一个类别显示空白的bug
+- uCharts.js 修复 饼图类图点击图例,其他图表tooltip位置某些情况下不准的bug
+- uCharts.js 修复 x轴为矢量轴(时间轴)情况下,点击tooltip位置不正确的bug
+- uCharts.js 修复 词云图获取点击索引偶尔不准的bug
+- uCharts.js 增加 直角坐标系图表X轴format格式化方法(原生uCharts.js用法请使用formatter)
+- uCharts.js 增加 漏斗图扩展配置,倒三角形(opts.extra.funnel.type="triangle"),金字塔形(opts.extra.funnel.type="pyramid")
+- uCharts.js 增加 散点图(opts.type="scatter")、气泡图(opts.type="bubble")
+- 后期计划 完善散点图、气泡图,增加markPoints标记点,增加横向条状图。
+## 2.0.0-20210502(2021-05-02)
+- uCharts.js 修复词云图获取点击索引不正确的bug
+## 2.0.0-20210501(2021-05-01)
+- 秋云图表组件 修复QQ小程序、百度小程序在关闭动画效果情况下,v-for循环使用图表,显示不正确的bug
+## 2.0.0-20210426(2021-04-26)
+- 秋云图表组件 修复QQ小程序不支持canvas2d的bug
+- 秋云图表组件 修复钉钉小程序某些情况点击坐标计算错误的bug
+- uCharts.js 增加 extra.column.categoryGap 参数,柱状图类每个category点位(X轴点)柱子组之间的间距
+- uCharts.js 增加 yAxis.data[i].titleOffsetY 参数,标题纵向偏移距离,负数为向上偏移,正数向下偏移
+- uCharts.js 增加 yAxis.data[i].titleOffsetX 参数,标题横向偏移距离,负数为向左偏移,正数向右偏移
+- uCharts.js 增加 extra.gauge.labelOffset 参数,仪表盘标签文字径向便宜距离,默认13px
+## 2.0.0-20210422-2(2021-04-22)
+秋云图表组件 修复 formatterAssign 未判断 args[key] == null 的情况导致栈溢出的 bug
+## 2.0.0-20210422(2021-04-22)
+- 秋云图表组件 修复H5、APP、支付宝小程序、微信小程序canvas2d模式下横屏模式的bug
+## 2.0.0-20210421(2021-04-21)
+- uCharts.js 修复多行图例的情况下,图例在上方或者下方时,图例float为左侧或者右侧时,第二行及以后的图例对齐方式不正确的bug
+## 2.0.0-20210420(2021-04-20)
+- 秋云图表组件 修复微信小程序开启canvas2d模式后,windows版微信小程序不支持canvas2d模式的bug
+- 秋云图表组件 修改非uni_modules版本为v2.0版本qiun-data-charts组件
+## 2.0.0-20210419(2021-04-19)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 修复混合图中柱状图单独设置颜色不生效的bug
+- uCharts.js 修复多Y轴单独设置fontSize时,开启canvas2d后,未对应放大字体的bug
+## 2.0.0-20210418(2021-04-18)
+- 秋云图表组件 增加directory配置,修复H5端history模式下如果发布到二级目录无法正确加载echarts.min.js的bug
+## 2.0.0-20210416(2021-04-16)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复APP端某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员
+- 示例项目 修复APP端v-for循环某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员
+- uCharts.js 修复非直角坐标系tooltip提示窗右侧超出未变换方向显示的bug
+## 2.0.0-20210415(2021-04-15)
+- 秋云图表组件 修复H5端发布到二级目录下echarts无法加载的bug
+- 秋云图表组件 修复某些情况下echarts.off('finished')移除监听事件报错的bug
+## 2.0.0-20210414(2021-04-14)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复H5端在cli项目下ECharts引用地址错误的bug
+- 示例项目 增加ECharts的formatter用法的示例(详见示例项目format-e.vue)
+- uCharts.js 增加圆环图中心背景色的配置extra.ring.centerColor
+- uCharts.js 修复微信小程序安卓端柱状图开启透明色后显示不正确的bug
+## 2.0.0-20210413(2021-04-13)
+- 秋云图表组件 修复百度小程序多个图表真机未能正确获取根元素dom尺寸的bug
+- 秋云图表组件 修复百度小程序横屏模式方向不正确的bug
+- 秋云图表组件 修改ontouch时,@getTouchStart@getTouchMove@getTouchEnd的触发条件
+- uCharts.js 修复饼图类数据格式series属性不生效的bug
+- uCharts.js 增加时序区域图 详见示例项目中ucharts.vue
+## 2.0.0-20210412-2(2021-04-12)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX。如仍不好用,请重启电脑,此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复uCharts在APP端横屏模式下不能正确渲染的bug
+- 示例项目 增加ECharts柱状图渐变色、圆角柱状图、横向柱状图(条状图)的示例
+## 2.0.0-20210412(2021-04-12)
+- 秋云图表组件 修复created中判断echarts导致APP端无法识别,改回mounted中判断echarts初始化
+- uCharts.js 修复2d模式下series.textOffset未乘像素比的bug
+## 2.0.0-20210411(2021-04-11)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,并清空小程序开发者工具缓存。
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 折线图区域图增加connectNulls断点续连的功能,详见示例项目中ucharts.vue
+- 秋云图表组件 变更初始化方法为created,变更type2d默认值为true,优化2d模式下组件初始化后dom获取不到的bug
+- 秋云图表组件 修复左右布局时,右侧图表点击坐标错误的bug,修复tooltip柱状图自定义颜色显示object的bug
+## 2.0.0-20210410(2021-04-10)
+- 修复左右布局时,右侧图表点击坐标错误的bug,修复柱状图自定义颜色tooltip显示object的bug
+- 增加标记线及柱状图自定义颜色的demo
+## 2.0.0-20210409(2021-04-08)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
+## 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 修复钉钉小程序百度小程序measureText不准确的bug,修复2d模式下饼图类activeRadius为按比例放大的bug
+- 修复组件在支付宝小程序端点击位置不准确的bug
+## 2.0.0-20210408(2021-04-07)
+- 修复组件在支付宝小程序端不能显示的bug(目前支付宝小程不能点击交互,后续修复)
+- uCharts.js 修复高分屏下柱状图类,圆弧进度条 自定义宽度不能按比例放大的bug
+## 2.0.0-20210407(2021-04-06)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
+## 增加 通过tofix和unit快速格式化y轴的demo add by `howcode`
+## 增加 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+## 2.0.0-20210406(2021-04-05)
+# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页
+## 2.0.0(2021-04-05)
+# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页

File diff suppressed because it is too large
+ 1607 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue


File diff suppressed because it is too large
+ 46 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue


+ 162 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue

@@ -0,0 +1,162 @@
+<template>
+	 <view class="container loading1">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading1',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+.container.loading1 {
+  -webkit-transform: rotate(45deg);
+          transform: rotate(45deg);
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+.loading1 .shape1 {
+  -webkit-animation: animation1shape1 0.5s ease 0s infinite alternate;
+          animation: animation1shape1 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, 16px);
+            transform: translate(16px, 16px);
+  }
+}
+
+@keyframes animation1shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, 16px);
+            transform: translate(16px, 16px);
+  }
+}
+.loading1 .shape2 {
+  -webkit-animation: animation1shape2 0.5s ease 0s infinite alternate;
+          animation: animation1shape2 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, 16px);
+            transform: translate(-16px, 16px);
+  }
+}
+
+@keyframes animation1shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, 16px);
+            transform: translate(-16px, 16px);
+  }
+}
+.loading1 .shape3 {
+  -webkit-animation: animation1shape3 0.5s ease 0s infinite alternate;
+          animation: animation1shape3 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, -16px);
+            transform: translate(16px, -16px);
+  }
+}
+
+@keyframes animation1shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, -16px);
+            transform: translate(16px, -16px);
+  }
+}
+.loading1 .shape4 {
+  -webkit-animation: animation1shape4 0.5s ease 0s infinite alternate;
+          animation: animation1shape4 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, -16px);
+            transform: translate(-16px, -16px);
+  }
+}
+
+@keyframes animation1shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, -16px);
+            transform: translate(-16px, -16px);
+  }
+}
+
+
+</style>

+ 170 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading2.vue

@@ -0,0 +1,170 @@
+<template>
+	 <view class="container loading2">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading2',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+
+.container.loading2 {
+  -webkit-transform: rotate(10deg);
+          transform: rotate(10deg);
+}
+.container.loading2 .shape {
+  border-radius: 5px;
+}
+.container.loading2{
+  -webkit-animation: rotation 1s infinite;
+          animation: rotation 1s infinite;
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+
+.loading2 .shape1 {
+  -webkit-animation: animation2shape1 0.5s ease 0s infinite alternate;
+          animation: animation2shape1 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation2shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(20px, 20px);
+            transform: translate(20px, 20px);
+  }
+}
+
+@keyframes animation2shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(20px, 20px);
+            transform: translate(20px, 20px);
+  }
+}
+.loading2 .shape2 {
+  -webkit-animation: animation2shape2 0.5s ease 0s infinite alternate;
+          animation: animation2shape2 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation2shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-20px, 20px);
+            transform: translate(-20px, 20px);
+  }
+}
+
+@keyframes animation2shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-20px, 20px);
+            transform: translate(-20px, 20px);
+  }
+}
+.loading2 .shape3 {
+  -webkit-animation: animation2shape3 0.5s ease 0s infinite alternate;
+          animation: animation2shape3 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation2shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(20px, -20px);
+            transform: translate(20px, -20px);
+  }
+}
+
+@keyframes animation2shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(20px, -20px);
+            transform: translate(20px, -20px);
+  }
+}
+.loading2 .shape4 {
+  -webkit-animation: animation2shape4 0.5s ease 0s infinite alternate;
+          animation: animation2shape4 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation2shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-20px, -20px);
+            transform: translate(-20px, -20px);
+  }
+}
+
+@keyframes animation2shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-20px, -20px);
+            transform: translate(-20px, -20px);
+  }
+}
+
+</style>

+ 173 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading3.vue

@@ -0,0 +1,173 @@
+<template>
+	 <view class="container loading3">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading3',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+
+ .container.loading3 {
+  -webkit-animation: rotation 1s infinite;
+          animation: rotation 1s infinite;
+}
+.container.loading3 .shape1 {
+  border-top-left-radius: 10px;
+}
+.container.loading3 .shape2 {
+  border-top-right-radius: 10px;
+}
+.container.loading3 .shape3 {
+  border-bottom-left-radius: 10px;
+}
+.container.loading3 .shape4 {
+  border-bottom-right-radius: 10px;
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+.loading3 .shape1 {
+  -webkit-animation: animation3shape1 0.5s ease 0s infinite alternate;
+          animation: animation3shape1 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation3shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(5px, 5px);
+            transform: translate(5px, 5px);
+  }
+}
+
+@keyframes animation3shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(5px, 5px);
+            transform: translate(5px, 5px);
+  }
+}
+.loading3 .shape2 {
+  -webkit-animation: animation3shape2 0.5s ease 0s infinite alternate;
+          animation: animation3shape2 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation3shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-5px, 5px);
+            transform: translate(-5px, 5px);
+  }
+}
+
+@keyframes animation3shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-5px, 5px);
+            transform: translate(-5px, 5px);
+  }
+}
+.loading3 .shape3 {
+  -webkit-animation: animation3shape3 0.5s ease 0s infinite alternate;
+          animation: animation3shape3 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation3shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(5px, -5px);
+            transform: translate(5px, -5px);
+  }
+}
+
+@keyframes animation3shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(5px, -5px);
+            transform: translate(5px, -5px);
+  }
+}
+.loading3 .shape4 {
+  -webkit-animation: animation3shape4 0.5s ease 0s infinite alternate;
+          animation: animation3shape4 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation3shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-5px, -5px);
+            transform: translate(-5px, -5px);
+  }
+}
+
+@keyframes animation3shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-5px, -5px);
+            transform: translate(-5px, -5px);
+  }
+}
+</style>

+ 222 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading4.vue

@@ -0,0 +1,222 @@
+<template>
+	 <view class="container loading5">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading5',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+
+.container.loading5 .shape {
+  width: 15px;
+  height: 15px;
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+.loading5 .shape1 {
+  animation: animation5shape1 2s ease 0s infinite reverse;
+}
+
+@-webkit-keyframes animation5shape1 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, 15px);
+            transform: translate(0, 15px);
+  }
+  50% {
+    -webkit-transform: translate(15px, 15px);
+            transform: translate(15px, 15px);
+  }
+  75% {
+    -webkit-transform: translate(15px, 0);
+            transform: translate(15px, 0);
+  }
+}
+
+@keyframes animation5shape1 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, 15px);
+            transform: translate(0, 15px);
+  }
+  50% {
+    -webkit-transform: translate(15px, 15px);
+            transform: translate(15px, 15px);
+  }
+  75% {
+    -webkit-transform: translate(15px, 0);
+            transform: translate(15px, 0);
+  }
+}
+.loading5 .shape2 {
+  animation: animation5shape2 2s ease 0s infinite reverse;
+}
+
+@-webkit-keyframes animation5shape2 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(-15px, 0);
+            transform: translate(-15px, 0);
+  }
+  50% {
+    -webkit-transform: translate(-15px, 15px);
+            transform: translate(-15px, 15px);
+  }
+  75% {
+    -webkit-transform: translate(0, 15px);
+            transform: translate(0, 15px);
+  }
+}
+
+@keyframes animation5shape2 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(-15px, 0);
+            transform: translate(-15px, 0);
+  }
+  50% {
+    -webkit-transform: translate(-15px, 15px);
+            transform: translate(-15px, 15px);
+  }
+  75% {
+    -webkit-transform: translate(0, 15px);
+            transform: translate(0, 15px);
+  }
+}
+.loading5 .shape3 {
+  animation: animation5shape3 2s ease 0s infinite reverse;
+}
+
+@-webkit-keyframes animation5shape3 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(15px, 0);
+            transform: translate(15px, 0);
+  }
+  50% {
+    -webkit-transform: translate(15px, -15px);
+            transform: translate(15px, -15px);
+  }
+  75% {
+    -webkit-transform: translate(0, -15px);
+            transform: translate(0, -15px);
+  }
+}
+
+@keyframes animation5shape3 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(15px, 0);
+            transform: translate(15px, 0);
+  }
+  50% {
+    -webkit-transform: translate(15px, -15px);
+            transform: translate(15px, -15px);
+  }
+  75% {
+    -webkit-transform: translate(0, -15px);
+            transform: translate(0, -15px);
+  }
+}
+.loading5 .shape4 {
+  animation: animation5shape4 2s ease 0s infinite reverse;
+}
+
+@-webkit-keyframes animation5shape4 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, -15px);
+            transform: translate(0, -15px);
+  }
+  50% {
+    -webkit-transform: translate(-15px, -15px);
+            transform: translate(-15px, -15px);
+  }
+  75% {
+    -webkit-transform: translate(-15px, 0);
+            transform: translate(-15px, 0);
+  }
+}
+
+@keyframes animation5shape4 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, -15px);
+            transform: translate(0, -15px);
+  }
+  50% {
+    -webkit-transform: translate(-15px, -15px);
+            transform: translate(-15px, -15px);
+  }
+  75% {
+    -webkit-transform: translate(-15px, 0);
+            transform: translate(-15px, 0);
+  }
+}
+
+</style>

+ 229 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/loading5.vue

@@ -0,0 +1,229 @@
+<template>
+	 <view class="container loading6">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading6',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+
+.container.loading6 {
+  -webkit-animation: rotation 1s infinite;
+          animation: rotation 1s infinite;
+}
+.container.loading6 .shape {
+  width: 12px;
+  height: 12px;
+  border-radius: 2px;
+}
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+
+.loading6 .shape1 {
+  -webkit-animation: animation6shape1 2s linear 0s infinite normal;
+          animation: animation6shape1 2s linear 0s infinite normal;
+}
+
+@-webkit-keyframes animation6shape1 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, 18px);
+            transform: translate(0, 18px);
+  }
+  50% {
+    -webkit-transform: translate(18px, 18px);
+            transform: translate(18px, 18px);
+  }
+  75% {
+    -webkit-transform: translate(18px, 0);
+            transform: translate(18px, 0);
+  }
+}
+
+@keyframes animation6shape1 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, 18px);
+            transform: translate(0, 18px);
+  }
+  50% {
+    -webkit-transform: translate(18px, 18px);
+            transform: translate(18px, 18px);
+  }
+  75% {
+    -webkit-transform: translate(18px, 0);
+            transform: translate(18px, 0);
+  }
+}
+.loading6 .shape2 {
+  -webkit-animation: animation6shape2 2s linear 0s infinite normal;
+          animation: animation6shape2 2s linear 0s infinite normal;
+}
+
+@-webkit-keyframes animation6shape2 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(-18px, 0);
+            transform: translate(-18px, 0);
+  }
+  50% {
+    -webkit-transform: translate(-18px, 18px);
+            transform: translate(-18px, 18px);
+  }
+  75% {
+    -webkit-transform: translate(0, 18px);
+            transform: translate(0, 18px);
+  }
+}
+
+@keyframes animation6shape2 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(-18px, 0);
+            transform: translate(-18px, 0);
+  }
+  50% {
+    -webkit-transform: translate(-18px, 18px);
+            transform: translate(-18px, 18px);
+  }
+  75% {
+    -webkit-transform: translate(0, 18px);
+            transform: translate(0, 18px);
+  }
+}
+.loading6 .shape3 {
+  -webkit-animation: animation6shape3 2s linear 0s infinite normal;
+          animation: animation6shape3 2s linear 0s infinite normal;
+}
+
+@-webkit-keyframes animation6shape3 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(18px, 0);
+            transform: translate(18px, 0);
+  }
+  50% {
+    -webkit-transform: translate(18px, -18px);
+            transform: translate(18px, -18px);
+  }
+  75% {
+    -webkit-transform: translate(0, -18px);
+            transform: translate(0, -18px);
+  }
+}
+
+@keyframes animation6shape3 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(18px, 0);
+            transform: translate(18px, 0);
+  }
+  50% {
+    -webkit-transform: translate(18px, -18px);
+            transform: translate(18px, -18px);
+  }
+  75% {
+    -webkit-transform: translate(0, -18px);
+            transform: translate(0, -18px);
+  }
+}
+.loading6 .shape4 {
+  -webkit-animation: animation6shape4 2s linear 0s infinite normal;
+          animation: animation6shape4 2s linear 0s infinite normal;
+}
+
+@-webkit-keyframes animation6shape4 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, -18px);
+            transform: translate(0, -18px);
+  }
+  50% {
+    -webkit-transform: translate(-18px, -18px);
+            transform: translate(-18px, -18px);
+  }
+  75% {
+    -webkit-transform: translate(-18px, 0);
+            transform: translate(-18px, 0);
+  }
+}
+
+@keyframes animation6shape4 {
+  0% {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  25% {
+    -webkit-transform: translate(0, -18px);
+            transform: translate(0, -18px);
+  }
+  50% {
+    -webkit-transform: translate(-18px, -18px);
+            transform: translate(-18px, -18px);
+  }
+  75% {
+    -webkit-transform: translate(-18px, 0);
+            transform: translate(-18px, 0);
+  }
+}
+</style>

+ 36 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/components/qiun-loading/qiun-loading.vue

@@ -0,0 +1,36 @@
+<template>
+	<view>
+	 <Loading1 v-if="loadingType==1"/>
+	 <Loading2 v-if="loadingType==2"/>
+	 <Loading3 v-if="loadingType==3"/>
+	 <Loading4 v-if="loadingType==4"/>
+	 <Loading5 v-if="loadingType==5"/>
+	</view>
+</template>
+
+<script>
+	import Loading1 from "./loading1.vue";
+	import Loading2 from "./loading2.vue";
+	import Loading3 from "./loading3.vue";
+	import Loading4 from "./loading4.vue";
+	import Loading5 from "./loading5.vue";
+	export default {
+		components:{Loading1,Loading2,Loading3,Loading4,Loading5},
+		name: 'qiun-loading',
+		props: {
+			loadingType: {
+				type: Number,
+				default: 2
+			},
+		},
+		data() {
+			return {
+				
+			};
+		},
+	}
+</script>
+
+<style>
+
+</style>

+ 422 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/config-echarts.js

@@ -0,0 +1,422 @@
+/*
+ * uCharts®
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台
+ * Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ * 
+ * uCharts®官方网站
+ * https://www.uCharts.cn
+ * 
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ * 
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ * 
+ */
+
+// 通用配置项
+
+// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
+const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'];
+
+const cfe = {
+  //demotype为自定义图表类型
+	"type": ["pie", "ring", "rose", "funnel", "line", "column", "area", "radar", "gauge","candle","demotype"],
+  //增加自定义图表类型,如果需要categories,请在这里加入您的图表类型例如最后的"demotype"
+	"categories": ["line", "column", "area", "radar", "gauge", "candle","demotype"],
+  //instance为实例变量承载属性,option为eopts承载属性,不要删除
+	"instance": {},
+	"option": {},
+  //下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
+  "formatter":{
+    "tooltipDemo1":function(res){
+      let result = ''
+      for (let i in res) {
+      	if (i == 0) {
+      		result += res[i].axisValueLabel + '年销售额'
+      	}
+      	let value = '--'
+      	if (res[i].data !== null) {
+      		value = res[i].data
+      	}
+      	// #ifdef H5
+      	result += '\n' + res[i].seriesName + ':' + value + ' 万元'
+      	// #endif
+      	
+      	// #ifdef APP-PLUS
+      	result += '<br/>' + res[i].marker + res[i].seriesName + ':' + value + ' 万元'
+      	// #endif
+      }
+      return result;
+    },
+    legendFormat:function(name){
+      return "自定义图例+"+name;
+    },
+    yAxisFormatDemo:function (value, index) {
+      return value + '元';
+    },
+    seriesFormatDemo:function(res){
+      return res.name + '年' + res.value + '元';
+    }
+  },
+  //这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在eopts参数,会将demotype与eopts中option合并后渲染图表。
+  "demotype":{
+    "color": color,
+    //在这里填写echarts的option即可
+    
+  },
+  //下面是自定义配置,请添加项目所需的通用配置
+	"column": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'axis'
+		},
+		"grid": {
+			"top": 30,
+			"bottom": 50,
+			"right": 15,
+			"left": 40
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"toolbox": {
+			"show": false,
+		},
+		"xAxis": {
+			"type": 'category',
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+			"boundaryGap": true,
+			"data": []
+		},
+		"yAxis": {
+			"type": 'value',
+			"axisTick": {
+				"show": false,
+			},
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'bar',
+			"data": [],
+			"barwidth": 20,
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+		},
+	},
+	"line": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'axis'
+		},
+		"grid": {
+			"top": 30,
+			"bottom": 50,
+			"right": 15,
+			"left": 40
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"toolbox": {
+			"show": false,
+		},
+		"xAxis": {
+			"type": 'category',
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+			"boundaryGap": true,
+			"data": []
+		},
+		"yAxis": {
+			"type": 'value',
+			"axisTick": {
+				"show": false,
+			},
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'line',
+			"data": [],
+			"barwidth": 20,
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+		},
+	},
+	"area": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'axis'
+		},
+		"grid": {
+			"top": 30,
+			"bottom": 50,
+			"right": 15,
+			"left": 40
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"toolbox": {
+			"show": false,
+		},
+		"xAxis": {
+			"type": 'category',
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+			"boundaryGap": true,
+			"data": []
+		},
+		"yAxis": {
+			"type": 'value',
+			"axisTick": {
+				"show": false,
+			},
+			"axisLabel": {
+				"color": '#666666'
+			},
+			"axisLine": {
+				"lineStyle": {
+					"color": '#CCCCCC'
+				}
+			},
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'line',
+			"data": [],
+			"areaStyle": {},
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+		},
+	},
+	"pie": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'item'
+		},
+		"grid": {
+			"top": 40,
+			"bottom": 30,
+			"right": 15,
+			"left": 15
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'pie',
+			"data": [],
+			"radius": '50%',
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+		},
+	},
+	"ring": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'item'
+		},
+		"grid": {
+			"top": 40,
+			"bottom": 30,
+			"right": 15,
+			"left": 15
+		},
+		"legend": {
+			"bottom": 'left',
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'pie',
+			"data": [],
+			"radius": ['40%', '70%'],
+			"avoidLabelOverlap": false,
+			"label": {
+				"show": true,
+        "color": "#666666",
+				"position": 'top',
+			},
+			"labelLine": {
+				"show": true
+			},
+		},
+	},
+	"rose": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'item'
+		},
+		"legend": {
+			"top": 'bottom'
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'pie',
+			"data": [],
+			"radius": "55%",
+			"center": ['50%', '50%'],
+			"roseType": 'area',
+		},
+	},
+	"funnel": {
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"tooltip": {
+			"trigger": 'item',
+			"formatter": "{b} : {c}%"
+		},
+		"legend": {
+			"top": 'bottom'
+		},
+		"seriesTemplate": {
+			"name": '',
+			"type": 'funnel',
+			"left": '10%',
+			"top": 60,
+			"bottom": 60,
+			"width": '80%',
+			"min": 0,
+			"max": 100,
+			"minSize": '0%',
+			"maxSize": '100%',
+			"sort": 'descending',
+			"gap": 2,
+			"label": {
+				"show": true,
+				"position": 'inside'
+			},
+			"labelLine": {
+				"length": 10,
+				"lineStyle": {
+					"width": 1,
+					"type": 'solid'
+				}
+			},
+			"itemStyle": {
+				"bordercolor": '#fff',
+				"borderwidth": 1
+			},
+			"emphasis": {
+				"label": {
+					"fontSize": 20
+				}
+			},
+			"data": [],
+		},
+	},
+	"gauge": {
+		"color": color,
+		"tooltip": {
+        "formatter": '{a} <br/>{b} : {c}%'
+    },
+		"seriesTemplate": {
+			"name": '业务指标',
+      "type": 'gauge',
+      "detail": {"formatter": '{value}%'},
+      "data": [{"value": 50, "name": '完成率'}]
+		},
+	},
+	"candle": {
+		"xAxis": {
+			"data": []
+		},
+		"yAxis": {},
+		"color": color,
+		"title": {
+			"text": ''
+		},
+		"dataZoom": [{
+				"type": 'inside',
+				"xAxisIndex": [0, 1],
+				"start": 10,
+				"end": 100
+			},
+			{
+				"show": true,
+				"xAxisIndex": [0, 1],
+				"type": 'slider',
+				"bottom": 10,
+				"start": 10,
+				"end": 100
+			}
+		],
+		"seriesTemplate": {
+			"name": '',
+			"type": 'k',
+			"data": [],
+		},
+	}
+}
+
+export default cfe;

+ 601 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/config-ucharts.js

@@ -0,0 +1,601 @@
+/*
+ * uCharts®
+ * 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台
+ * Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ * 
+ * uCharts®官方网站
+ * https://www.uCharts.cn
+ * 
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ * 
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ * 
+ */
+
+// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
+const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'];
+
+//事件转换函数,主要用作格式化x轴为时间轴,根据需求自行修改
+const formatDateTime = (timeStamp, returnType)=>{
+  var date = new Date();
+  date.setTime(timeStamp * 1000);
+  var y = date.getFullYear();
+  var m = date.getMonth() + 1;
+  m = m < 10 ? ('0' + m) : m;
+  var d = date.getDate();
+  d = d < 10 ? ('0' + d) : d;
+  var h = date.getHours();
+  h = h < 10 ? ('0' + h) : h;
+  var minute = date.getMinutes();
+  var second = date.getSeconds();
+  minute = minute < 10 ? ('0' + minute) : minute;
+  second = second < 10 ? ('0' + second) : second;
+  if(returnType == 'full'){return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;}
+  if(returnType == 'y-m-d'){return y + '-' + m + '-' + d;}
+  if(returnType == 'h:m'){return  h +':' + minute;}
+  if(returnType == 'h:m:s'){return  h +':' + minute +':' + second;}
+  return [y, m, d, h, minute, second];
+}
+
+const cfu = {
+  //demotype为自定义图表类型,一般不需要自定义图表类型,只需要改根节点上对应的类型即可
+	"type":["pie","ring","rose","word","funnel","map","arcbar","line","column","mount","bar","area","radar","gauge","candle","mix","tline","tarea","scatter","bubble","demotype"],
+	"range":["饼状图","圆环图","玫瑰图","词云图","漏斗图","地图","圆弧进度条","折线图","柱状图","山峰图","条状图","区域图","雷达图","仪表盘","K线图","混合图","时间轴折线","时间轴区域","散点图","气泡图","自定义类型"],
+  //增加自定义图表类型,如果需要categories,请在这里加入您的图表类型,例如最后的"demotype"
+  //自定义类型时需要注意"tline","tarea","scatter","bubble"等时间轴(矢量x轴)类图表,没有categories,不需要加入categories
+	"categories":["line","column","mount","bar","area","radar","gauge","candle","mix","demotype"],
+  //instance为实例变量承载属性,不要删除
+  "instance":{},
+  //option为opts及eopts承载属性,不要删除
+  "option":{},
+  //下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
+  "formatter":{
+    "yAxisDemo1":function(val, index, opts){return val+'元'},
+    "yAxisDemo2":function(val, index, opts){return val.toFixed(2)},
+    "xAxisDemo1":function(val, index, opts){return val+'年';},
+    "xAxisDemo2":function(val, index, opts){return formatDateTime(val,'h:m')},
+    "seriesDemo1":function(val, index, series, opts){return val+'元'},
+    "tooltipDemo1":function(item, category, index, opts){
+      if(index==0){
+      	return '随便用'+item.data+'年'
+      }else{
+      	return '其他我没改'+item.data+'天'
+      }
+    },
+    "pieDemo":function(val, index, series, opts){
+      if(index !== undefined){
+        return series[index].name+':'+series[index].data+'元'
+      }
+    },
+  },
+  //这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在opts参数,会将demotype与opts中option合并后渲染图表。
+  "demotype":{
+    //我这里把曲线图当做了自定义图表类型,您可以根据需要随意指定类型或配置
+    "type": "line",
+    "color": color,
+    "padding": [15,10,0,15],
+    "xAxis": {
+      "disableGrid": true,
+    },
+    "yAxis": {
+      "gridType": "dash",
+      "dashLength": 2,
+    },
+    "legend": {
+    },
+    "extra": {
+    	"line": {
+    		"type": "curve",
+    		"width": 2
+    	},
+    }
+  },
+  //下面是自定义配置,请添加项目所需的通用配置
+	"pie":{
+		"type": "pie",
+    "color": color,
+		"padding": [5,5,5,5],
+		"extra": {
+			"pie": {
+				"activeOpacity": 0.5,
+				"activeRadius": 10,
+				"offsetAngle": 0,
+				"labelWidth": 15,
+				"border": true,
+				"borderWidth": 3,
+				"borderColor": "#FFFFFF"
+			},
+		}
+	},
+	"ring":{
+		"type": "ring",
+    "color": color,
+		"padding": [5,5,5,5],
+		"rotate": false,
+		"dataLabel": true,
+		"legend": {
+			"show": true,
+			"position": "right",
+      "lineHeight": 25,
+		},
+		"title": {
+			"name": "收益率",
+			"fontSize": 15,
+			"color": "#666666"
+		},
+		"subtitle": {
+			"name": "70%",
+			"fontSize": 25,
+			"color": "#7cb5ec"
+		},
+		"extra": {
+			"ring": {
+				"ringWidth":30,
+				"activeOpacity": 0.5,
+				"activeRadius": 10,
+				"offsetAngle": 0,
+				"labelWidth": 15,
+				"border": true,
+				"borderWidth": 3,
+				"borderColor": "#FFFFFF"
+			},
+		},
+	},
+	"rose":{
+		"type": "rose",
+    "color": color,
+		"padding": [5,5,5,5],
+		"legend": {
+			"show": true,
+			"position": "left",
+      "lineHeight": 25,
+		},
+		"extra": {
+			"rose": {
+				"type": "area",
+				"minRadius": 50,
+				"activeOpacity": 0.5,
+				"activeRadius": 10,
+				"offsetAngle": 0,
+				"labelWidth": 15,
+				"border": false,
+				"borderWidth": 2,
+				"borderColor": "#FFFFFF"
+			},
+		}
+	},
+	"word":{
+		"type": "word",
+    "color": color,
+		"extra": {
+			"word": {
+				"type": "normal",
+				"autoColors": false
+			}
+		}
+	},
+	"funnel":{
+		"type": "funnel",
+    "color": color,
+		"padding": [15,15,0,15],
+		"extra": {
+			"funnel": {
+				"activeOpacity": 0.3,
+				"activeWidth": 10,
+				"border": true,
+				"borderWidth": 2,
+				"borderColor": "#FFFFFF",
+				"fillOpacity": 1,
+				"labelAlign": "right"
+			},
+		}
+	},
+	"map":{
+		"type": "map",
+    "color": color,
+		"padding": [0,0,0,0],
+    "dataLabel": true,
+		"extra": {
+			"map": {
+				"border": true,
+				"borderWidth": 1,
+				"borderColor": "#666666",
+				"fillOpacity": 0.6,
+				"activeBorderColor": "#F04864",
+				"activeFillColor": "#FACC14",
+				"activeFillOpacity": 1
+			},
+		}
+	},
+	"arcbar":{
+		"type": "arcbar",
+    "color": color,
+		"title": {
+			"name": "百分比",
+			"fontSize": 25,
+			"color": "#00FF00"
+		},
+		"subtitle": {
+			"name": "默认标题",
+			"fontSize": 15,
+			"color": "#666666"
+		},
+		"extra": {
+			"arcbar": {
+				"type": "default",
+				"width": 12,
+				"backgroundColor": "#E9E9E9",
+				"startAngle": 0.75,
+				"endAngle": 0.25,
+				"gap": 2
+			}
+		}
+	},
+	"line":{
+		"type": "line",
+    "color": color,
+		"padding": [15,10,0,15],
+		"xAxis": {
+      "disableGrid": true,
+		},
+		"yAxis": {
+      "gridType": "dash",
+      "dashLength": 2,
+		},
+		"legend": {
+		},
+		"extra": {
+			"line": {
+				"type": "straight",
+				"width": 2
+			},
+		}
+	},
+  "tline":{
+  	"type": "line",
+    "color": color,
+  	"padding": [15,10,0,15],
+  	"xAxis": {
+      "disableGrid": false,
+      "boundaryGap":"justify",
+  	},
+  	"yAxis": {
+      "gridType": "dash",
+      "dashLength": 2,
+      "data":[
+        {
+          "min":0,
+          "max":80
+        }
+      ]
+  	},
+  	"legend": {
+  	},
+  	"extra": {
+  		"line": {
+  			"type": "curve",
+  			"width": 2
+  		},
+  	}
+  },
+  "tarea":{
+  	"type": "area",
+    "color": color,
+  	"padding": [15,10,0,15],
+  	"xAxis": {
+      "disableGrid": true,
+      "boundaryGap":"justify",
+  	},
+  	"yAxis": {
+      "gridType": "dash",
+      "dashLength": 2,
+      "data":[
+        {
+          "min":0,
+          "max":80
+        }
+      ]
+  	},
+  	"legend": {
+  	},
+  	"extra": {
+  		"area": {
+  			"type": "curve",
+  			"opacity": 0.2,
+  			"addLine": true,
+  			"width": 2,
+  			"gradient": true
+  		},
+  	}
+  },
+	"column":{
+		"type": "column",
+    "color": color,
+		"padding": [15,15,0,5],
+		"xAxis": {
+      "disableGrid": true,
+		},
+		"yAxis": {
+      "data":[{"min":0}]
+		},
+		"legend": {
+		},
+		"extra": {
+			"column": {
+				"type": "group",
+				"width": 30,
+				"activeBgColor": "#000000",
+				"activeBgOpacity": 0.08
+			},
+		}
+	},
+  "mount":{
+  	"type": "mount",
+    "color": color,
+  	"padding": [15,15,0,5],
+  	"xAxis": {
+      "disableGrid": true,
+  	},
+  	"yAxis": {
+      "data":[{"min":0}]
+  	},
+  	"legend": {
+  	},
+  	"extra": {
+  		"mount": {
+  			"type": "mount",
+  			"widthRatio": 1.5,
+  		},
+  	}
+  },
+  "bar":{
+  	"type": "bar",
+    "color": color,
+  	"padding": [15,30,0,5],
+  	"xAxis": {
+      "boundaryGap":"justify",
+      "disableGrid":false,
+      "min":0,
+      "axisLine":false
+  	},
+  	"yAxis": {
+  	},
+  	"legend": {
+  	},
+  	"extra": {
+  		"bar": {
+  			"type": "group",
+  			"width": 30,
+  			"meterBorde": 1,
+  			"meterFillColor": "#FFFFFF",
+  			"activeBgColor": "#000000",
+  			"activeBgOpacity": 0.08
+  		},
+  	}
+  },
+	"area":{
+		"type": "area",
+		"color": color,
+		"padding": [15,15,0,15],
+		"xAxis": {
+      "disableGrid": true,
+		},
+		"yAxis": {
+      "gridType": "dash",
+      "dashLength": 2,
+		},
+		"legend": {
+		},
+		"extra": {
+			"area": {
+				"type": "straight",
+				"opacity": 0.2,
+				"addLine": true,
+				"width": 2,
+				"gradient": false
+			},
+		}
+	},
+	"radar":{
+		"type": "radar",
+		"color": color,
+		"padding": [5,5,5,5],
+    "dataLabel": false,
+		"legend": {
+			"show": true,
+			"position": "right",
+      "lineHeight": 25,
+		},
+		"extra": {
+			"radar": {
+				"gridType": "radar",
+				"gridColor": "#CCCCCC",
+				"gridCount": 3,
+				"opacity": 0.2,
+				"max": 200
+			},
+		}
+	},
+	"gauge":{
+		"type": "gauge",
+		"color": color,
+		"title": {
+			"name": "66Km/H",
+			"fontSize": 25,
+			"color": "#2fc25b",
+			"offsetY": 50
+		},
+		"subtitle": {
+			"name": "实时速度",
+			"fontSize": 15,
+			"color": "#1890ff",
+			"offsetY": -50
+		},
+		"extra": {
+			"gauge": {
+				"type": "default",
+				"width": 30,
+				"labelColor": "#666666",
+				"startAngle": 0.75,
+				"endAngle": 0.25,
+				"startNumber": 0,
+				"endNumber": 100,
+				"labelFormat": "",
+				"splitLine": {
+					"fixRadius": 0,
+					"splitNumber": 10,
+					"width": 30,
+					"color": "#FFFFFF",
+					"childNumber": 5,
+					"childWidth": 12
+				},
+				"pointer": {
+					"width": 24,
+					"color": "auto"
+				}
+			}
+		}
+	},
+	"candle":{
+		"type": "candle",
+		"color": color,
+		"padding": [15,15,0,15],
+		"enableScroll": true,
+		"enableMarkLine": true,
+		"dataLabel": false,
+		"xAxis": {
+			"labelCount": 4,
+			"itemCount": 40,
+			"disableGrid": true,
+			"gridColor": "#CCCCCC",
+			"gridType": "solid",
+			"dashLength": 4,
+			"scrollShow": true,
+			"scrollAlign": "left",
+			"scrollColor": "#A6A6A6",
+			"scrollBackgroundColor": "#EFEBEF"
+		},
+		"yAxis": {
+		},
+		"legend": {
+		},
+		"extra": {
+			"candle": {
+				"color": {
+					"upLine": "#f04864",
+					"upFill": "#f04864",
+					"downLine": "#2fc25b",
+					"downFill": "#2fc25b"
+				},
+				"average": {
+					"show": true,
+					"name": ["MA5","MA10","MA30"],
+					"day": [5,10,20],
+					"color": ["#1890ff","#2fc25b","#facc14"]
+				}
+			},
+			"markLine": {
+				"type": "dash",
+				"dashLength": 5,
+				"data": [
+					{
+						"value": 2150,
+						"lineColor": "#f04864",
+						"showLabel": true
+					},
+					{
+						"value": 2350,
+						"lineColor": "#f04864",
+						"showLabel": true
+					}
+				]
+			}
+		}
+	},
+	"mix":{
+		"type": "mix",
+		"color": color,
+		"padding": [15,15,0,15],
+		"xAxis": {
+      "disableGrid": true,
+		},
+		"yAxis": {
+			"disabled": false,
+			"disableGrid": false,
+			"splitNumber": 5,
+			"gridType": "dash",
+			"dashLength": 4,
+			"gridColor": "#CCCCCC",
+			"padding": 10,
+			"showTitle": true,
+			"data": []
+		},
+		"legend": {
+		},
+		"extra": {
+			"mix": {
+				"column": {
+					"width": 20
+				}
+			},
+		}
+	},
+	"scatter":{
+		"type": "scatter",
+		"color":color,
+		"padding":[15,15,0,15],
+    "dataLabel":false,
+    "xAxis": {
+      "disableGrid": false,
+      "gridType":"dash",
+      "splitNumber":5,
+      "boundaryGap":"justify",
+      "min":0
+    },
+    "yAxis": {
+      "disableGrid": false,
+      "gridType":"dash",
+    },
+    "legend": {
+    },
+    "extra": {
+    	"scatter": {
+    	},
+    }
+	},
+	"bubble":{
+		"type": "bubble",
+		"color":color,
+		"padding":[15,15,0,15],
+    "xAxis": {
+      "disableGrid": false,
+      "gridType":"dash",
+      "splitNumber":5,
+      "boundaryGap":"justify",
+      "min":0,
+      "max":250
+    },
+    "yAxis": {
+      "disableGrid": false,
+      "gridType":"dash",
+      "data":[{
+        "min":0,
+        "max":150
+      }]
+    },
+    "legend": {
+    },
+    "extra": {
+    	"bubble": {
+        "border":2,
+        "opacity": 0.5,
+    	},
+    }
+	}
+}
+
+export default cfu;

+ 5 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/readme.md

@@ -0,0 +1,5 @@
+# uCharts JSSDK说明
+1、如不使用uCharts组件,可直接引用u-charts.js,打包编译后会`自动压缩`,压缩后体积约为`120kb`。
+2、如果120kb的体积仍需压缩,请手到uCharts官网通过在线定制选择您需要的图表。
+3、config-ucharts.js为uCharts组件的用户配置文件,升级前请`自行备份config-ucharts.js`文件,以免被强制覆盖。
+4、config-echarts.js为ECharts组件的用户配置文件,升级前请`自行备份config-echarts.js`文件,以免被强制覆盖。

File diff suppressed because it is too large
+ 7297 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.js


File diff suppressed because it is too large
+ 18 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/js_sdk/u-charts/u-charts.min.js


+ 201 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/license.md

@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 84 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/package.json

@@ -0,0 +1,84 @@
+{
+  "id": "qiun-data-charts",
+  "displayName": "秋云 ucharts echarts 高性能跨全端图表组件",
+  "version": "2.4.3-20220505",
+  "description": "uCharts 新增双指缩放、新增山峰图!支持H5及APP用 ucharts echarts 渲染图表,uniapp可视化首选组件",
+  "keywords": [
+    "ucharts",
+    "echarts",
+    "f2",
+    "图表",
+    "可视化"
+],
+  "repository": "https://gitee.com/uCharts/uCharts",
+  "engines": {
+    "HBuilderX": "^3.3.8"
+  },
+  "dcloudext": {
+    "category": [
+        "前端组件",
+        "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": "474119"
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "插件不采集任何数据",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/~qiun"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "y",
+          "联盟": "y"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

File diff suppressed because it is too large
+ 102 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/readme.md


File diff suppressed because it is too large
+ 23 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/static/app-plus/echarts.min.js


File diff suppressed because it is too large
+ 23 - 0
sources/client/vrv-moblie/uni_modules/qiun-data-charts/static/h5/echarts.min.js


+ 22 - 0
sources/client/vrv-moblie/uni_modules/uni-icons/changelog.md

@@ -0,0 +1,22 @@
+## 1.3.5(2022-01-24)
+- 优化 size 属性可以传入不带单位的字符串数值
+## 1.3.4(2022-01-24)
+- 优化 size 支持其他单位
+## 1.3.3(2022-01-17)
+- 修复 nvue 有些图标不显示的bug,兼容老版本图标
+## 1.3.2(2021-12-01)
+- 优化 示例可复制图标名称
+## 1.3.1(2021-11-23)
+- 优化 兼容旧组件 type 值
+## 1.3.0(2021-11-19)
+- 新增 更多图标
+- 优化 自定义图标使用方式
+- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
+## 1.1.7(2021-11-08)
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.5(2021-05-12)
+- 新增 组件示例地址
+## 1.1.4(2021-02-05)
+- 调整为uni_modules目录规范

File diff suppressed because it is too large
+ 1169 - 0
sources/client/vrv-moblie/uni_modules/uni-icons/components/uni-icons/icons.js


+ 96 - 0
sources/client/vrv-moblie/uni_modules/uni-icons/components/uni-icons/uni-icons.vue

@@ -0,0 +1,96 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text>
+	<!-- #endif -->
+	<!-- #ifndef APP-NVUE -->
+	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text>
+	<!-- #endif -->
+</template>
+
+<script>
+	import icons from './icons.js';
+	const getVal = (val) => {
+		const reg = /^[0-9]*$/g
+		return (typeof val === 'number' || reg.test(val) )? val + 'px' : val;
+	} 
+	// #ifdef APP-NVUE
+	var domModule = weex.requireModule('dom');
+	import iconUrl from './uniicons.ttf'
+	domModule.addRule('fontFace', {
+		'fontFamily': "uniicons",
+		'src': "url('"+iconUrl+"')"
+	});
+	// #endif
+
+	/**
+	 * Icons 图标
+	 * @description 用于展示 icons 图标
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=28
+	 * @property {Number} size 图标大小
+	 * @property {String} type 图标图案,参考示例
+	 * @property {String} color 图标颜色
+	 * @property {String} customPrefix 自定义图标
+	 * @event {Function} click 点击 Icon 触发事件
+	 */
+	export default {
+		name: 'UniIcons',
+		emits:['click'],
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			color: {
+				type: String,
+				default: '#333333'
+			},
+			size: {
+				type: [Number, String],
+				default: 16
+			},
+			customPrefix:{
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				icons: icons.glyphs
+			}
+		},
+		computed:{
+			unicode(){
+				let code = this.icons.find(v=>v.font_class === this.type)
+				if(code){
+					return unescape(`%u${code.unicode}`)
+				}
+				return ''
+			},
+			iconSize(){
+				return getVal(this.size)
+			}
+		},
+		methods: {
+			_onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	/* #ifndef APP-NVUE */
+	@import './uniicons.css';
+	@font-face {
+		font-family: uniicons;
+		src: url('./uniicons.ttf') format('truetype');
+	}
+
+	/* #endif */
+	.uni-icons {
+		font-family: uniicons;
+		text-decoration: none;
+		text-align: center;
+	}
+
+</style>

+ 663 - 0
sources/client/vrv-moblie/uni_modules/uni-icons/components/uni-icons/uniicons.css

@@ -0,0 +1,663 @@
+.uniui-color:before {
+  content: "\e6cf";
+}
+
+.uniui-wallet:before {
+  content: "\e6b1";
+}
+
+.uniui-settings-filled:before {
+  content: "\e6ce";
+}
+
+.uniui-auth-filled:before {
+  content: "\e6cc";
+}
+
+.uniui-shop-filled:before {
+  content: "\e6cd";
+}
+
+.uniui-staff-filled:before {
+  content: "\e6cb";
+}
+
+.uniui-vip-filled:before {
+  content: "\e6c6";
+}
+
+.uniui-plus-filled:before {
+  content: "\e6c7";
+}
+
+.uniui-folder-add-filled:before {
+  content: "\e6c8";
+}
+
+.uniui-color-filled:before {
+  content: "\e6c9";
+}
+
+.uniui-tune-filled:before {
+  content: "\e6ca";
+}
+
+.uniui-calendar-filled:before {
+  content: "\e6c0";
+}
+
+.uniui-notification-filled:before {
+  content: "\e6c1";
+}
+
+.uniui-wallet-filled:before {
+  content: "\e6c2";
+}
+
+.uniui-medal-filled:before {
+  content: "\e6c3";
+}
+
+.uniui-gift-filled:before {
+  content: "\e6c4";
+}
+
+.uniui-fire-filled:before {
+  content: "\e6c5";
+}
+
+.uniui-refreshempty:before {
+  content: "\e6bf";
+}
+
+.uniui-location-filled:before {
+  content: "\e6af";
+}
+
+.uniui-person-filled:before {
+  content: "\e69d";
+}
+
+.uniui-personadd-filled:before {
+  content: "\e698";
+}
+
+.uniui-back:before {
+  content: "\e6b9";
+}
+
+.uniui-forward:before {
+  content: "\e6ba";
+}
+
+.uniui-arrow-right:before {
+  content: "\e6bb";
+}
+
+.uniui-arrowthinright:before {
+  content: "\e6bb";
+}
+
+.uniui-arrow-left:before {
+  content: "\e6bc";
+}
+
+.uniui-arrowthinleft:before {
+  content: "\e6bc";
+}
+
+.uniui-arrow-up:before {
+  content: "\e6bd";
+}
+
+.uniui-arrowthinup:before {
+  content: "\e6bd";
+}
+
+.uniui-arrow-down:before {
+  content: "\e6be";
+}
+
+.uniui-arrowthindown:before {
+  content: "\e6be";
+}
+
+.uniui-bottom:before {
+  content: "\e6b8";
+}
+
+.uniui-arrowdown:before {
+  content: "\e6b8";
+}
+
+.uniui-right:before {
+  content: "\e6b5";
+}
+
+.uniui-arrowright:before {
+  content: "\e6b5";
+}
+
+.uniui-top:before {
+  content: "\e6b6";
+}
+
+.uniui-arrowup:before {
+  content: "\e6b6";
+}
+
+.uniui-left:before {
+  content: "\e6b7";
+}
+
+.uniui-arrowleft:before {
+  content: "\e6b7";
+}
+
+.uniui-eye:before {
+  content: "\e651";
+}
+
+.uniui-eye-filled:before {
+  content: "\e66a";
+}
+
+.uniui-eye-slash:before {
+  content: "\e6b3";
+}
+
+.uniui-eye-slash-filled:before {
+  content: "\e6b4";
+}
+
+.uniui-info-filled:before {
+  content: "\e649";
+}
+
+.uniui-reload:before {
+  content: "\e6b2";
+}
+
+.uniui-micoff-filled:before {
+  content: "\e6b0";
+}
+
+.uniui-map-pin-ellipse:before {
+  content: "\e6ac";
+}
+
+.uniui-map-pin:before {
+  content: "\e6ad";
+}
+
+.uniui-location:before {
+  content: "\e6ae";
+}
+
+.uniui-starhalf:before {
+  content: "\e683";
+}
+
+.uniui-star:before {
+  content: "\e688";
+}
+
+.uniui-star-filled:before {
+  content: "\e68f";
+}
+
+.uniui-calendar:before {
+  content: "\e6a0";
+}
+
+.uniui-fire:before {
+  content: "\e6a1";
+}
+
+.uniui-medal:before {
+  content: "\e6a2";
+}
+
+.uniui-font:before {
+  content: "\e6a3";
+}
+
+.uniui-gift:before {
+  content: "\e6a4";
+}
+
+.uniui-link:before {
+  content: "\e6a5";
+}
+
+.uniui-notification:before {
+  content: "\e6a6";
+}
+
+.uniui-staff:before {
+  content: "\e6a7";
+}
+
+.uniui-vip:before {
+  content: "\e6a8";
+}
+
+.uniui-folder-add:before {
+  content: "\e6a9";
+}
+
+.uniui-tune:before {
+  content: "\e6aa";
+}
+
+.uniui-auth:before {
+  content: "\e6ab";
+}
+
+.uniui-person:before {
+  content: "\e699";
+}
+
+.uniui-email-filled:before {
+  content: "\e69a";
+}
+
+.uniui-phone-filled:before {
+  content: "\e69b";
+}
+
+.uniui-phone:before {
+  content: "\e69c";
+}
+
+.uniui-email:before {
+  content: "\e69e";
+}
+
+.uniui-personadd:before {
+  content: "\e69f";
+}
+
+.uniui-chatboxes-filled:before {
+  content: "\e692";
+}
+
+.uniui-contact:before {
+  content: "\e693";
+}
+
+.uniui-chatbubble-filled:before {
+  content: "\e694";
+}
+
+.uniui-contact-filled:before {
+  content: "\e695";
+}
+
+.uniui-chatboxes:before {
+  content: "\e696";
+}
+
+.uniui-chatbubble:before {
+  content: "\e697";
+}
+
+.uniui-upload-filled:before {
+  content: "\e68e";
+}
+
+.uniui-upload:before {
+  content: "\e690";
+}
+
+.uniui-weixin:before {
+  content: "\e691";
+}
+
+.uniui-compose:before {
+  content: "\e67f";
+}
+
+.uniui-qq:before {
+  content: "\e680";
+}
+
+.uniui-download-filled:before {
+  content: "\e681";
+}
+
+.uniui-pyq:before {
+  content: "\e682";
+}
+
+.uniui-sound:before {
+  content: "\e684";
+}
+
+.uniui-trash-filled:before {
+  content: "\e685";
+}
+
+.uniui-sound-filled:before {
+  content: "\e686";
+}
+
+.uniui-trash:before {
+  content: "\e687";
+}
+
+.uniui-videocam-filled:before {
+  content: "\e689";
+}
+
+.uniui-spinner-cycle:before {
+  content: "\e68a";
+}
+
+.uniui-weibo:before {
+  content: "\e68b";
+}
+
+.uniui-videocam:before {
+  content: "\e68c";
+}
+
+.uniui-download:before {
+  content: "\e68d";
+}
+
+.uniui-help:before {
+  content: "\e679";
+}
+
+.uniui-navigate-filled:before {
+  content: "\e67a";
+}
+
+.uniui-plusempty:before {
+  content: "\e67b";
+}
+
+.uniui-smallcircle:before {
+  content: "\e67c";
+}
+
+.uniui-minus-filled:before {
+  content: "\e67d";
+}
+
+.uniui-micoff:before {
+  content: "\e67e";
+}
+
+.uniui-closeempty:before {
+  content: "\e66c";
+}
+
+.uniui-clear:before {
+  content: "\e66d";
+}
+
+.uniui-navigate:before {
+  content: "\e66e";
+}
+
+.uniui-minus:before {
+  content: "\e66f";
+}
+
+.uniui-image:before {
+  content: "\e670";
+}
+
+.uniui-mic:before {
+  content: "\e671";
+}
+
+.uniui-paperplane:before {
+  content: "\e672";
+}
+
+.uniui-close:before {
+  content: "\e673";
+}
+
+.uniui-help-filled:before {
+  content: "\e674";
+}
+
+.uniui-paperplane-filled:before {
+  content: "\e675";
+}
+
+.uniui-plus:before {
+  content: "\e676";
+}
+
+.uniui-mic-filled:before {
+  content: "\e677";
+}
+
+.uniui-image-filled:before {
+  content: "\e678";
+}
+
+.uniui-locked-filled:before {
+  content: "\e668";
+}
+
+.uniui-info:before {
+  content: "\e669";
+}
+
+.uniui-locked:before {
+  content: "\e66b";
+}
+
+.uniui-camera-filled:before {
+  content: "\e658";
+}
+
+.uniui-chat-filled:before {
+  content: "\e659";
+}
+
+.uniui-camera:before {
+  content: "\e65a";
+}
+
+.uniui-circle:before {
+  content: "\e65b";
+}
+
+.uniui-checkmarkempty:before {
+  content: "\e65c";
+}
+
+.uniui-chat:before {
+  content: "\e65d";
+}
+
+.uniui-circle-filled:before {
+  content: "\e65e";
+}
+
+.uniui-flag:before {
+  content: "\e65f";
+}
+
+.uniui-flag-filled:before {
+  content: "\e660";
+}
+
+.uniui-gear-filled:before {
+  content: "\e661";
+}
+
+.uniui-home:before {
+  content: "\e662";
+}
+
+.uniui-home-filled:before {
+  content: "\e663";
+}
+
+.uniui-gear:before {
+  content: "\e664";
+}
+
+.uniui-smallcircle-filled:before {
+  content: "\e665";
+}
+
+.uniui-map-filled:before {
+  content: "\e666";
+}
+
+.uniui-map:before {
+  content: "\e667";
+}
+
+.uniui-refresh-filled:before {
+  content: "\e656";
+}
+
+.uniui-refresh:before {
+  content: "\e657";
+}
+
+.uniui-cloud-upload:before {
+  content: "\e645";
+}
+
+.uniui-cloud-download-filled:before {
+  content: "\e646";
+}
+
+.uniui-cloud-download:before {
+  content: "\e647";
+}
+
+.uniui-cloud-upload-filled:before {
+  content: "\e648";
+}
+
+.uniui-redo:before {
+  content: "\e64a";
+}
+
+.uniui-images-filled:before {
+  content: "\e64b";
+}
+
+.uniui-undo-filled:before {
+  content: "\e64c";
+}
+
+.uniui-more:before {
+  content: "\e64d";
+}
+
+.uniui-more-filled:before {
+  content: "\e64e";
+}
+
+.uniui-undo:before {
+  content: "\e64f";
+}
+
+.uniui-images:before {
+  content: "\e650";
+}
+
+.uniui-paperclip:before {
+  content: "\e652";
+}
+
+.uniui-settings:before {
+  content: "\e653";
+}
+
+.uniui-search:before {
+  content: "\e654";
+}
+
+.uniui-redo-filled:before {
+  content: "\e655";
+}
+
+.uniui-list:before {
+  content: "\e644";
+}
+
+.uniui-mail-open-filled:before {
+  content: "\e63a";
+}
+
+.uniui-hand-down-filled:before {
+  content: "\e63c";
+}
+
+.uniui-hand-down:before {
+  content: "\e63d";
+}
+
+.uniui-hand-up-filled:before {
+  content: "\e63e";
+}
+
+.uniui-hand-up:before {
+  content: "\e63f";
+}
+
+.uniui-heart-filled:before {
+  content: "\e641";
+}
+
+.uniui-mail-open:before {
+  content: "\e643";
+}
+
+.uniui-heart:before {
+  content: "\e639";
+}
+
+.uniui-loop:before {
+  content: "\e633";
+}
+
+.uniui-pulldown:before {
+  content: "\e632";
+}
+
+.uniui-scan:before {
+  content: "\e62a";
+}
+
+.uniui-bars:before {
+  content: "\e627";
+}
+
+.uniui-cart-filled:before {
+  content: "\e629";
+}
+
+.uniui-checkbox:before {
+  content: "\e62b";
+}
+
+.uniui-checkbox-filled:before {
+  content: "\e62c";
+}
+
+.uniui-shop:before {
+  content: "\e62f";
+}
+
+.uniui-headphones:before {
+  content: "\e630";
+}
+
+.uniui-cart:before {
+  content: "\e631";
+}

BIN
sources/client/vrv-moblie/uni_modules/uni-icons/components/uni-icons/uniicons.ttf


+ 86 - 0
sources/client/vrv-moblie/uni_modules/uni-icons/package.json

@@ -0,0 +1,86 @@
+{
+  "id": "uni-icons",
+  "displayName": "uni-icons 图标",
+  "version": "1.3.5",
+  "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "icon",
+    "图标"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.2.14"
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 8 - 0
sources/client/vrv-moblie/uni_modules/uni-icons/readme.md

@@ -0,0 +1,8 @@
+## Icons 图标
+> **组件名:uni-icons**
+> 代码块: `uIcons`
+
+用于展示 icons 图标 。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 8 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/changelog.md

@@ -0,0 +1,8 @@
+## 1.0.3(2022-01-21)
+- 优化 组件示例
+## 1.0.2(2021-11-22)
+- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题
+## 1.0.1(2021-11-22)
+- 修复 vue3中scss语法兼容问题
+## 1.0.0(2021-11-18)
+- init

+ 1 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/index.scss

@@ -0,0 +1 @@
+@import './styles/index.scss';

+ 82 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/package.json

@@ -0,0 +1,82 @@
+{
+  "id": "uni-scss",
+  "displayName": "uni-scss 辅助样式",
+  "version": "1.0.3",
+  "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。",
+  "keywords": [
+    "uni-scss",
+    "uni-ui",
+    "辅助样式"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "category": [
+        "JS SDK",
+        "通用 SDK"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "n",
+          "联盟": "n"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 4 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/readme.md

@@ -0,0 +1,4 @@
+`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 7 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/styles/index.scss

@@ -0,0 +1,7 @@
+@import './setting/_variables.scss';
+@import './setting/_border.scss';
+@import './setting/_color.scss';
+@import './setting/_space.scss';
+@import './setting/_radius.scss';
+@import './setting/_text.scss';
+@import './setting/_styles.scss';

+ 3 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_border.scss

@@ -0,0 +1,3 @@
+.uni-border {
+	border: 1px $uni-border-1 solid;
+}

+ 66 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_color.scss

@@ -0,0 +1,66 @@
+
+// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐
+// @mixin get-styles($k,$c) {
+// 	@if $k == size or $k == weight{
+// 		font-#{$k}:#{$c}
+// 	}@else{
+// 		#{$k}:#{$c}
+// 	}
+// }
+$uni-ui-color:(
+	// 主色
+	primary: $uni-primary,
+	primary-disable: $uni-primary-disable,
+	primary-light: $uni-primary-light,
+	// 辅助色
+	success: $uni-success,
+	success-disable: $uni-success-disable,
+	success-light: $uni-success-light,
+	warning: $uni-warning,
+	warning-disable: $uni-warning-disable,
+	warning-light: $uni-warning-light,
+	error: $uni-error,
+	error-disable: $uni-error-disable,
+	error-light: $uni-error-light,
+	info: $uni-info,
+	info-disable: $uni-info-disable,
+	info-light: $uni-info-light,
+	// 中性色
+	main-color: $uni-main-color,
+	base-color: $uni-base-color,
+	secondary-color: $uni-secondary-color,
+	extra-color: $uni-extra-color,
+	// 背景色
+	bg-color: $uni-bg-color,
+	// 边框颜色
+	border-1: $uni-border-1,
+	border-2: $uni-border-2,
+	border-3: $uni-border-3,
+	border-4: $uni-border-4,
+	// 黑色
+	black:$uni-black,
+	// 白色
+	white:$uni-white,
+	// 透明
+	transparent:$uni-transparent
+) !default;
+@each $key, $child in $uni-ui-color {
+	.uni-#{"" + $key} {
+		color: $child;
+	}
+	.uni-#{"" + $key}-bg {
+		background-color: $child;
+	}
+}
+.uni-shadow-sm {
+	box-shadow: $uni-shadow-sm;
+}
+.uni-shadow-base {
+	box-shadow: $uni-shadow-base;
+}
+.uni-shadow-lg {
+	box-shadow: $uni-shadow-lg;
+}
+.uni-mask {
+	background-color:$uni-mask;
+}

+ 55 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_radius.scss

@@ -0,0 +1,55 @@
+@mixin radius($r,$d:null ,$important: false){
+  $radius-value:map-get($uni-radius, $r) if($important, !important, null);
+  // Key exists within the $uni-radius variable
+  @if (map-has-key($uni-radius, $r) and  $d){
+		@if $d == t {
+				border-top-left-radius:$radius-value;
+				border-top-right-radius:$radius-value;
+		}@else if $d == r {
+				border-top-right-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == b {
+				border-bottom-left-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == l {
+				border-top-left-radius:$radius-value;
+				border-bottom-left-radius:$radius-value;
+		}@else if $d == tl {
+				border-top-left-radius:$radius-value;
+		}@else if $d == tr {
+				border-top-right-radius:$radius-value;
+		}@else if $d == br {
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == bl {
+				border-bottom-left-radius:$radius-value;
+		}
+  }@else{
+		border-radius:$radius-value;
+  }
+}
+
+@each $key, $child in $uni-radius {
+	@if($key){
+		.uni-radius-#{"" + $key} {
+				@include radius($key)
+		}
+	}@else{
+		.uni-radius {
+				@include radius($key)
+		}
+	}
+}
+
+@each $direction in t, r, b, l,tl, tr, br, bl {
+	@each $key, $child in $uni-radius {
+		@if($key){
+			.uni-radius-#{"" + $direction}-#{"" + $key} {
+				@include radius($key,$direction,false)
+			}
+		}@else{
+			.uni-radius-#{$direction} {
+				@include radius($key,$direction,false)
+			}
+		}
+	}
+}

+ 56 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_space.scss

@@ -0,0 +1,56 @@
+
+@mixin fn($space,$direction,$size,$n) {
+	@if $n {
+		#{$space}-#{$direction}: #{$size*$uni-space-root}px
+	} @else {
+		 #{$space}-#{$direction}: #{-$size*$uni-space-root}px
+	}
+}
+@mixin get-styles($direction,$i,$space,$n){
+	@if $direction == t {
+		@include fn($space, top,$i,$n);
+	} 
+	@if $direction == r {
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == b {
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == l {
+	 @include fn($space, left,$i,$n);
+	} 
+	@if $direction == x {
+		@include fn($space, left,$i,$n);
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == y {
+		@include fn($space, top,$i,$n);
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == a {
+		@if $n {
+			#{$space}:#{$i*$uni-space-root}px;
+		} @else {
+			#{$space}:#{-$i*$uni-space-root}px;
+		}
+	} 
+}
+
+@each $orientation in m,p {
+	$space: margin;
+	@if $orientation == m {
+		$space: margin;
+	} @else {
+		$space: padding;
+	}
+	@for $i from 0 through 16 {
+		@each $direction in t, r, b, l, x, y, a {
+			.uni-#{$orientation}#{$direction}-#{$i} { 
+				@include  get-styles($direction,$i,$space,true);
+			} 
+			.uni-#{$orientation}#{$direction}-n#{$i} { 
+				@include  get-styles($direction,$i,$space,false);
+			}
+		}
+	}
+}

+ 167 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_styles.scss

@@ -0,0 +1,167 @@
+/* #ifndef APP-NVUE */
+
+$-color-white:#fff;
+$-color-black:#000;
+@mixin base-style($color) {
+	color: #fff;
+	background-color: $color;
+	border-color: mix($-color-black, $color, 8%);
+	&:not([hover-class]):active {
+		background: mix($-color-black, $color, 10%);
+		border-color: mix($-color-black, $color, 20%);
+		color: $-color-white;
+		outline: none;
+	}
+}
+@mixin is-color($color) {
+	@include base-style($color);
+	&[loading] {
+		@include base-style($color);
+		&::before {
+			margin-right:5px;
+		}
+	}
+	&[disabled] {
+	  &,
+		&[loading],
+	  &:not([hover-class]):active {
+	    color: $-color-white;
+			border-color: mix(darken($color,10%), $-color-white);
+	    background-color: mix($color, $-color-white);
+	  }
+	}
+
+}
+@mixin base-plain-style($color) {
+	color:$color;
+	background-color: mix($-color-white, $color, 90%);
+	border-color: mix($-color-white, $color, 70%);
+	&:not([hover-class]):active {
+	  background: mix($-color-white, $color, 80%);
+	  color: $color;
+	  outline: none;
+		border-color: mix($-color-white, $color, 50%);
+	}
+}
+@mixin is-plain($color){
+	&[plain] {
+		@include base-plain-style($color);
+		&[loading] {
+			@include base-plain-style($color);
+			&::before {
+				margin-right:5px;
+			}
+		}
+		&[disabled] {
+		  &,
+		  &:active {
+		    color: mix($-color-white, $color, 40%);
+		    background-color: mix($-color-white, $color, 90%);
+				border-color: mix($-color-white, $color, 80%);
+		  }
+		}
+	}
+}
+
+
+.uni-btn {
+	margin: 5px;
+	color: #393939;
+	border:1px solid #ccc;
+	font-size: 16px;
+	font-weight: 200;
+	background-color: #F9F9F9;
+	// TODO 暂时处理边框隐藏一边的问题
+	overflow: visible;
+	&::after{
+		border: none;
+	}
+
+	&:not([type]),&[type=default] {
+		color: #999;
+		&[loading] {
+			background: none;
+			&::before {
+				margin-right:5px;
+			}
+		}
+
+
+
+		&[disabled]{
+			color: mix($-color-white, #999, 60%);
+		  &,
+			&[loading],
+		  &:active {
+				color: mix($-color-white, #999, 60%);
+		    background-color: mix($-color-white,$-color-black , 98%);
+				border-color: mix($-color-white,  #999, 85%);
+		  }
+		}
+
+		&[plain] {
+			color: #999;
+			background: none;
+			border-color: $uni-border-1;
+			&:not([hover-class]):active {
+				background: none;
+			  color: mix($-color-white, $-color-black, 80%);
+				border-color: mix($-color-white, $-color-black, 90%);
+			  outline: none;
+			}
+			&[disabled]{
+			  &,
+				&[loading],
+			  &:active {
+			    background: none;
+					color: mix($-color-white, #999, 60%);
+					border-color: mix($-color-white,  #999, 85%);
+			  }
+			}
+		}
+	}
+
+	&:not([hover-class]):active {
+	  color: mix($-color-white, $-color-black, 50%);
+	}
+
+	&[size=mini] {
+		font-size: 16px;
+		font-weight: 200;
+		border-radius: 8px;
+	}
+
+
+
+	&.uni-btn-small {
+		font-size: 14px;
+	}
+	&.uni-btn-mini {
+		font-size: 12px;
+	}
+
+	&.uni-btn-radius {
+		border-radius: 999px;
+	}
+	&[type=primary] {
+		@include is-color($uni-primary);
+		@include is-plain($uni-primary)
+	}
+	&[type=success] {
+		@include is-color($uni-success);
+		@include is-plain($uni-success)
+	}
+	&[type=error] {
+		@include is-color($uni-error);
+		@include is-plain($uni-error)
+	}
+	&[type=warning] {
+		@include is-color($uni-warning);
+		@include is-plain($uni-warning)
+	}
+	&[type=info] {
+		@include is-color($uni-info);
+		@include is-plain($uni-info)
+	}
+}
+/* #endif */

+ 24 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_text.scss

@@ -0,0 +1,24 @@
+@mixin get-styles($k,$c) {
+	@if $k == size or $k == weight{
+		font-#{$k}:#{$c}
+	}@else{
+		#{$k}:#{$c}
+	}
+}
+
+@each $key, $child in $uni-headings {
+	/* #ifndef APP-NVUE */
+	.uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	.container .uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+}

+ 0 - 0
sources/client/vrv-moblie/uni_modules/uni-scss/styles/setting/_variables.scss


Some files were not shown because too many files changed in this diff