Commit eddff974 authored by wanli's avatar wanli

update

parents 9ed09a30 68ec88f3
backend/config.ini merge=ours backend/config.ini merge=ours
frontend/vue.config.js merge=ours
frontend/src/views/system/monitor.vue merge=ours frontend/src/views/system/monitor.vue merge=ours
\ No newline at end of file
...@@ -54,6 +54,7 @@ backend/backupData.json ...@@ -54,6 +54,7 @@ backend/backupData.json
config.ini config.ini
*.epk *.epk
tools/build_out/
tools/build_out/logs tools/build_out/logs
tools/build_out/logs/* tools/build_out/logs/*
......
'''
Author: your name
Date: 2021-04-14 14:12:18
LastEditTime: 2021-06-30 22:50:10
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\app\setting.py
'''
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
...@@ -9,7 +17,7 @@ conf.read(os.path.join(os.getcwd(), "config.ini")) ...@@ -9,7 +17,7 @@ conf.read(os.path.join(os.getcwd(), "config.ini"))
config = dict( config = dict(
NAME='evm_store', NAME='evm_store',
DEBUG=False, DEBUG=True,
HOST=conf.get('application', 'host'), HOST=conf.get('application', 'host'),
PORT=int(conf.get('application', 'port')), PORT=int(conf.get('application', 'port')),
LOGIN_DISABLED=False, LOGIN_DISABLED=False,
......
...@@ -20,5 +20,5 @@ name = evm_store ...@@ -20,5 +20,5 @@ name = evm_store
backup_dir = backup backup_dir = backup
evueapps_dir = evueapps evueapps_dir = evueapps
launcher_dir = launcher launcher_dir = launcher
host = 0.0.0.0 host = 127.0.0.1
port = 3000 port = 5001
''' '''
Author: your name Author: your name
Date: 2021-06-29 19:24:32 Date: 2021-06-29 19:24:32
LastEditTime: 2021-07-05 20:41:32 LastEditTime: 2021-07-14 21:25:39
LastEditors: Please set LastEditors LastEditors: Please set LastEditors
Description: In User Settings Edit Description: In User Settings Edit
FilePath: \evm-store\backend\controller\monitor.py FilePath: \evm-store\backend\controller\monitor.py
......
{
"count": 84
}
\ No newline at end of file
''' '''
Author: your name Author: your name
Date: 2021-04-14 14:12:18 Date: 2021-04-14 14:12:18
LastEditTime: 2021-07-03 17:26:02 LastEditTime: 2021-07-14 21:37:53
LastEditors: Please set LastEditors LastEditors: Please set LastEditors
Description: In User Settings Edit Description: In User Settings Edit
FilePath: \evm-store\backend\start.py FilePath: \evm-store\backend\start.py
...@@ -11,8 +11,6 @@ FilePath: \evm-store\backend\start.py ...@@ -11,8 +11,6 @@ FilePath: \evm-store\backend\start.py
import sys import sys
import os import os
import signal import signal
import json
from typing import ( Any,)
# import tornado.autoreload # import tornado.autoreload
from tornado.wsgi import WSGIContainer from tornado.wsgi import WSGIContainer
from tornado.web import Application, RequestHandler, FallbackHandler from tornado.web import Application, RequestHandler, FallbackHandler
......
...@@ -13,7 +13,6 @@ import string ...@@ -13,7 +13,6 @@ import string
import datetime import datetime
import threading import threading
import decimal import decimal
import uuid
class DecimalEncoder(json.JSONEncoder): class DecimalEncoder(json.JSONEncoder):
def default(self, o): def default(self, o):
...@@ -110,11 +109,6 @@ def secondsToTime(seconds, sep=":"): ...@@ -110,11 +109,6 @@ def secondsToTime(seconds, sep=":"):
return sep.join([str(i) for i in [h, m, s]]) return sep.join([str(i) for i in [h, m, s]])
def writeFile(fpath, result):
with open(fpath, 'w') as f:
f.write(result)
def md5_salt(s): def md5_salt(s):
md5 = hashlib.md5("EhuqUkwV".encode("utf-8")) md5 = hashlib.md5("EhuqUkwV".encode("utf-8"))
md5.update(s.encode('utf-8')) md5.update(s.encode('utf-8'))
......
'''
Author: your name
Date: 2021-04-29 12:12:01
LastEditTime: 2021-07-14 21:26:39
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\backend\utils\ccode.py
'''
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import sys import sys
......
''' '''
Author: your name Author: your name
Date: 2021-06-29 19:33:41 Date: 2021-06-29 19:33:41
LastEditTime: 2021-07-05 18:56:38 LastEditTime: 2021-07-14 21:26:12
LastEditors: Please set LastEditors LastEditors: Please set LastEditors
Description: In User Settings Edit Description: In User Settings Edit
FilePath: \evm-store\backend\view\monitor.py FilePath: \evm-store\backend\view\monitor.py
...@@ -133,7 +133,7 @@ class BaseWebsocket(WebSocketHandler): ...@@ -133,7 +133,7 @@ class BaseWebsocket(WebSocketHandler):
@classmethod @classmethod
def broadcastMessage(cls, message): def broadcastMessage(cls, message):
# pprint.pprint(cls.handlers) # pprint.pprint(cls.handlers)
# pprint.pprint(message) pprint.pprint(message)
print("=======>", cls._clients) print("=======>", cls._clients)
if not message.get("imei"): if not message.get("imei"):
......
<!--
* @Author: your name
* @Date: 2021-04-14 14:12:18
* @LastEditTime: 2021-07-01 00:18:54
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\App.vue
-->
<template> <template>
<div id="app"> <div id="app">
<router-view /> <router-view />
......
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-04-14 14:12:19 * @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-01 15:04:40 * @LastEditTime: 2021-07-14 21:29:01
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\main.js * @FilePath: \evm-store\frontend\src\main.js
...@@ -25,6 +25,9 @@ import "@/icons/icon.js"; ...@@ -25,6 +25,9 @@ import "@/icons/icon.js";
import "@/icons/icon-color.js"; import "@/icons/icon-color.js";
import IconFont from "@/components/IconFont"; import IconFont from "@/components/IconFont";
import myCharts from '@/utils/myCharts.js';
Vue.use(myCharts)
/** /**
* If you don't want to use mock-server * If you don't want to use mock-server
* you want to use MockJs for mock api * you want to use MockJs for mock api
......
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-04-14 14:12:19 * @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-05 18:58:33 * @LastEditTime: 2021-07-14 21:28:48
* @LastEditors: Please set LastEditors * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\settings.js * @FilePath: \evm-store\frontend\src\settings.js
...@@ -57,6 +57,13 @@ export default { ...@@ -57,6 +57,13 @@ export default {
icon: "gongzuotai", icon: "gongzuotai",
path: "device/index", path: "device/index",
}, },
{
vue: "profile/docs.vue",
title: "个人中心",
name: "Profile",
icon: "gongzuotai",
path: "profile/index",
},
{ {
vue: "system/monitor.vue", vue: "system/monitor.vue",
title: "资源监视", title: "资源监视",
...@@ -78,6 +85,20 @@ export default { ...@@ -78,6 +85,20 @@ export default {
// icon: "gongzuotai", // icon: "gongzuotai",
// path: "history/index", // path: "history/index",
// }, // },
{
vue: "system/chart.vue",
title: "实时曲线",
name: "AppChart",
icon: "gongzuotai",
path: "chart/index",
},
{
vue: "system/history.vue",
title: "历史曲线",
name: "AppHistoryChart",
icon: "gongzuotai",
path: "history/index",
},
{ {
vue: "system/tool.vue", vue: "system/tool.vue",
title: "工具", title: "工具",
......
/* /*
* @Author: your name * @Author: your name
* @Date: 2021-07-01 15:02:16 * @Date: 2021-04-14 14:12:19
* @LastEditTime: 2021-07-05 15:22:36 * @LastEditTime: 2021-07-14 21:27:18
* @LastEditors: your name * @LastEditors: Please set LastEditors
* @Description: In User Settings Edit * @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\eventBus.js * @FilePath: \evm-store\frontend\src\utils\wsNotify.js
*/ */
import Vue from "vue"; import Vue from "vue";
import store from "@/store";
export const wsNotify = new WebSocket( export const wsNotify = new WebSocket(
`ws://${window.location.hostname}:3000/ws/v1/notify` `ws://${window.location.hostname}:5001/ws/v1/notify`
); );
window.wsNotify = wsNotify; window.wsNotify = wsNotify;
wsNotify.eventBus = new Vue(); wsNotify.eventBus = new Vue();
let timer = null;
wsNotify.onopen = function (event) { wsNotify.onopen = function (event) {
console.log("websocket is conneted!", event); console.log("websocket is conneted!", event);
wsNotify.eventBus.$emit("open", event); wsNotify.eventBus.$emit("open", event);
timer = setInterval(function() {
wsNotify.send(JSON.stringify({ type: 'heartbeat', ts: Date.now(), token: store.getters.token }))
}, 1000)
}; };
wsNotify.onmessage = function (event) { wsNotify.onmessage = function (event) {
...@@ -35,11 +29,9 @@ wsNotify.onmessage = function (event) { ...@@ -35,11 +29,9 @@ wsNotify.onmessage = function (event) {
wsNotify.onerror = function (error) { wsNotify.onerror = function (error) {
console.log(error); console.log(error);
wsNotify.eventBus.$emit("error", error); wsNotify.eventBus.$emit("error", error);
if (timer) clearInterval(timer);
}; };
wsNotify.onclose = function (event) { wsNotify.onclose = function (event) {
console.log("websocket is colosed!", event); console.log("websocket is colosed!", event);
wsNotify.eventBus.$emit("close", event); wsNotify.eventBus.$emit("close", event);
if (timer) clearInterval(timer);
}; };
/*
* @Author: your name
* @Date: 2021-07-01 00:39:07
* @LastEditTime: 2021-07-01 00:39:56
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\frontend\src\utils\myCharts.js
*/
import * as echarts from "echarts";
const install = function (Vue) {
Object.defineProperties(Vue.prototype, {
$chart: {
get() {
return {
line: function (id) {
this.chart = echarts.init(document.getElementById(id));
this.chart.clear();
const optionData = {
xAxis: {
type: "category",
data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
},
yAxis: {
type: "value",
},
series: [
{
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: "line",
smooth: true,
},
],
};
this.chart.setOption(optionData);
},
};
},
},
});
};
export default {
install,
};
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :inline="true" ref="query" size="mini"> <el-form :inline="true" :model="form" size="mini">
<el-form-item label="设备"> <el-form-item label="设备">
<el-select <el-select
v-model="device" v-model="watch_id"
filterable filterable
placeholder="请输入设备名称" placeholder="请输入设备名称"
@change="onChange" @change="onChange"
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
v-for="(item, index) in watchs" v-for="(item, index) in watchs"
:key="index" :key="index"
:label="item.imei" :label="item.imei"
:value="item.imei" :value="item.id"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
...@@ -21,9 +21,9 @@ ...@@ -21,9 +21,9 @@
>查询</el-button >查询</el-button
></el-form-item ></el-form-item
> >
<el-form-item><el-button @click="onReset('query')">重置</el-button></el-form-item> <el-form-item><el-button @click="onReset">重置</el-button></el-form-item>
</el-form> </el-form>
<LineChart :chartData="evm"></LineChart> <LineChart :chartData="evm" :dataList="evmList"></LineChart>
<LvglChart :chartData="lvgl"></LvglChart> <LvglChart :chartData="lvgl"></LvglChart>
</div> </div>
</template> </template>
...@@ -46,8 +46,12 @@ export default { ...@@ -46,8 +46,12 @@ export default {
evmList: [], evmList: [],
lvgl: {}, lvgl: {},
lvglList: [], lvglList: [],
image: {}, image: [],
imageList: [], imageList: [],
form: {
start: null,
end: null,
},
}; };
}, },
components: { components: {
...@@ -55,6 +59,9 @@ export default { ...@@ -55,6 +59,9 @@ export default {
LvglChart, LvglChart,
}, },
methods: { methods: {
sendMsg() {
this.socket.send("hello,world");
},
fetchData() { fetchData() {
this.isLoading = true; this.isLoading = true;
getWatchList() getWatchList()
...@@ -62,58 +69,70 @@ export default { ...@@ -62,58 +69,70 @@ export default {
if (res.code == 200) this.watchs = res.data; if (res.code == 200) this.watchs = res.data;
}) })
.catch((err) => { .catch((err) => {
this.$message.warning(err.msg) this.$message.warning(err.msg);
}) })
.finally(() => { .finally(() => {
this.isLoading = false; this.isLoading = false;
}); });
}, },
queryData() { queryData() {
getMonitorData({ let params = {
watch: this.watch_id, watch: this.watch_id,
}) };
if (this.value2 && this.value2.length) {
if (this.value2.length > 1) {
params.start = Math.ceil(this.value2[0] / 1000);
params.end = Math.ceil(this.value2[1] / 1000);
} else {
params.start = Math.ceil(this.value2[0] / 1000);
}
}
getMonitorData(params)
.then((res) => { .then((res) => {
if (res.type == "object") { if (res.type == "object") {
this.evmList = res.data.evm this.evmList = res.data.evm
this.lvglList = res.data.lvgl this.lvglList = res.data.lvgl
this.imageList = res.data.image this.imageList = res.data.image
} else {
if (params.category == "evm") this.evmList = res.data
else if (params.category == "lvgl") this.lvglList = res.data
else if (params.category == "image") this.imageList = res.data
} }
}) })
.catch((err) => { .catch((err) => {
this.$message.warning(err.msg) this.$message.warning(err.msg);
}); });
}, },
onChange() { onChange(res) {
this.processData() var t = this.watchs.find((item) => {
return item.id == res;
});
if (t) this.device = t.imei;
this.processData();
}, },
onSubmit() { onSubmit() {
this.queryData() this.queryData();
}, },
onReset(formName) { onReset(formName) {
this.$refs[formName].resetFields() this.$refs[formName].resetFields();
this.fetchData() this.fetchData();
}, },
handleMessage(message) { handleMessage(message) {
if (!this.device) this.device = message.imei; if (!this.device) this.device = message.imei;
this.devices[message.imei] = message; this.devices[message.imei] = message;
this.watchs.push({
imei: message.imei,
id: this.watchs.length
})
this.processData() this.processData()
}, },
processData() { processData() {
if (this.devices[this.device]) { this.evm = this.devices[this.device].evm;
if (this.devices[this.device].evm) this.evm = this.devices[this.device].evm; this.lvgl = this.devices[this.device].lvgl;
if (this.devices[this.device].lvgl) this.lvgl = this.devices[this.device].lvgl; this.image = this.devices[this.device].image;
if (this.devices[this.device].image) this.image = this.devices[this.device].image;
}
} }
}, },
mounted() {}, mounted() {},
created() { created() {
this.socket = wsNotify; this.socket = wsNotify;
wsNotify.eventBus.$on("open", (message) => { wsNotify.eventBus.$on("open", (message) => {
this.sendMsg();
this.$nextTick(() => { this.$nextTick(() => {
console.log(message); console.log(message);
}); });
...@@ -129,6 +148,8 @@ export default { ...@@ -129,6 +148,8 @@ export default {
this.handleMessage(message); this.handleMessage(message);
}); });
}); });
this.fetchData();
}, },
}; };
</script> </script>
......
...@@ -7,7 +7,6 @@ import * as echarts from "echarts"; ...@@ -7,7 +7,6 @@ import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme require("echarts/theme/macarons"); // echarts theme
import resize from "./mixins/resize"; import resize from "./mixins/resize";
import { getDateTimeString } from "@/utils/utils"; import { getDateTimeString } from "@/utils/utils";
import { wsNotify } from "@/utils/eventBus.js";
// function randomData() { // function randomData() {
// now = new Date(+now + oneDay); // now = new Date(+now + oneDay);
...@@ -51,7 +50,7 @@ export default { ...@@ -51,7 +50,7 @@ export default {
}, },
height: { height: {
type: String, type: String,
default: "270px", default: "350px",
}, },
autoResize: { autoResize: {
type: Boolean, type: Boolean,
...@@ -126,13 +125,40 @@ export default { ...@@ -126,13 +125,40 @@ export default {
}, },
}, },
mounted() { mounted() {
// this.timer = setInterval(() => {
// for (var i = 0; i < 5; i++) {
// dataList.shift();
// dataList.push(randomData());
// }
// if (!this.chart) {
// clearInterval(this.timer);
// }
// this.chart &&
// this.chart.setOption({
// series: [
// {
// data: dataList,
// },
// ],
// });
// }, 1000);
// this.loading = this.$loading({
// lock: true,
// text: "Loading",
// spinner: "el-icon-loading",
// background: "rgba(0, 0, 0, 0.7)",
// });
// setTimeout(() => {
// this.loading.close()
// }, 2000)
this.$nextTick(() => { this.$nextTick(() => {
this.initChart(); this.initChart();
}); });
wsNotify.eventBus.$on("resize", () => {
if (this.chart) this.chart.resize()
});
}, },
beforeDestroy() { beforeDestroy() {
if (!this.chart) { if (!this.chart) {
...@@ -142,19 +168,22 @@ export default { ...@@ -142,19 +168,22 @@ export default {
this.chart = null; this.chart = null;
}, },
methods: { methods: {
cleanData() { handleData(data) {
// 关闭从WebSocket接收数据 // 关闭从WebSocket接收数据
// 重置所有数据 // 重置所有数据
Object.keys(seriesData).forEach((key) => { Object.keys(seriesData).forEach((key) => {
seriesData[key] = []; seriesData[key] = [];
}); });
this.series.forEach((item) => { // this.series.forEach((item) => {
item.data = []; // item.data = [];
// });
// this.chart.setOption({ series: this.series });
data.forEach((item) => {
this.handleMessage(item);
}); });
this.chart.setOption({ series: this.series });
}, },
handleMessage(data) { handleMessage(data) {
if (!data || data.length == 0) this.cleanData()
// 这里面应该增加一个数组长度判断,当超过了多少个之后,弹出数组第一项,防止数组内存溢出 // 这里面应该增加一个数组长度判断,当超过了多少个之后,弹出数组第一项,防止数组内存溢出
// seriesData[k].shift() // seriesData[k].shift()
Object.keys(data).forEach((k) => { Object.keys(data).forEach((k) => {
...@@ -207,13 +236,13 @@ export default { ...@@ -207,13 +236,13 @@ export default {
show: false, show: false,
}, },
}, },
grid: { // grid: {
left: 10, // left: 10,
right: 10, // right: 10,
bottom: 10, // bottom: 20,
top: 50, // top: 30,
containLabel: true, // containLabel: true,
}, // },
tooltip: { tooltip: {
trigger: "axis", trigger: "axis",
axisPointer: { axisPointer: {
...@@ -238,11 +267,6 @@ export default { ...@@ -238,11 +267,6 @@ export default {
}, },
legend: { legend: {
data: this.legendData, data: this.legendData,
selected: {
heap_total_size: false,
stack_total_size: false,
stack_used_size: false,
},
}, },
series: this.series, series: this.series,
}); });
......
...@@ -7,7 +7,6 @@ import * as echarts from "echarts"; ...@@ -7,7 +7,6 @@ import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme require("echarts/theme/macarons"); // echarts theme
import resize from "./mixins/resize"; import resize from "./mixins/resize";
import { getDateTimeString } from "@/utils/utils"; import { getDateTimeString } from "@/utils/utils";
import { wsNotify } from "@/utils/eventBus.js";
const seriesData = { const seriesData = {
frag_pct: [], frag_pct: [],
...@@ -32,7 +31,7 @@ export default { ...@@ -32,7 +31,7 @@ export default {
}, },
height: { height: {
type: String, type: String,
default: "270px", default: "350px",
}, },
autoResize: { autoResize: {
type: Boolean, type: Boolean,
...@@ -114,14 +113,14 @@ export default { ...@@ -114,14 +113,14 @@ export default {
data: seriesData.used_cnt, data: seriesData.used_cnt,
}, },
{ {
name: "used_pct", name: "used_pctused_pct",
type: "line", type: "line",
showSymbol: false, showSymbol: false,
emphasis: { emphasis: {
focus: "series", focus: "series",
blurScope: "coordinateSystem", blurScope: "coordinateSystem",
}, },
data: seriesData.used_pct, data: seriesData.used_pctused_pct,
}, },
], ],
legendData: [ legendData: [
...@@ -131,7 +130,7 @@ export default { ...@@ -131,7 +130,7 @@ export default {
"free_size", "free_size",
"total_size", "total_size",
"used_cnt", "used_cnt",
"used_pct", "used_pctused_pct",
], ],
}; };
}, },
...@@ -153,10 +152,6 @@ export default { ...@@ -153,10 +152,6 @@ export default {
this.$nextTick(() => { this.$nextTick(() => {
this.initChart(); this.initChart();
}); });
wsNotify.eventBus.$on("resize", () => {
if (this.chart) this.chart.resize()
});
}, },
beforeDestroy() { beforeDestroy() {
if (!this.chart) { if (!this.chart) {
...@@ -206,17 +201,10 @@ export default { ...@@ -206,17 +201,10 @@ export default {
title: { title: {
text: "LVGL", text: "LVGL",
}, },
grid: {
left: 10,
right: 10,
bottom: 10,
top: 50,
containLabel: true,
},
xAxis: { xAxis: {
type: "time", type: "time",
splitLine: { splitLine: {
show: false,
}, },
axisLabel: { axisLabel: {
formatter: "{HH}:{mm}:{ss}", formatter: "{HH}:{mm}:{ss}",
...@@ -226,7 +214,7 @@ export default { ...@@ -226,7 +214,7 @@ export default {
type: "value", type: "value",
// boundaryGap: [0, "100%"], // boundaryGap: [0, "100%"],
splitLine: { splitLine: {
show: false,
}, },
}, },
tooltip: { tooltip: {
...@@ -239,13 +227,6 @@ export default { ...@@ -239,13 +227,6 @@ export default {
}, },
legend: { legend: {
data: this.legendData, data: this.legendData,
selected: {
frag_pct: false,
free_biggest_size: false,
free_cnt: false,
free_size: false,
total_size: false,
},
}, },
series: this.series, series: this.series,
}); });
......
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :inline="true" :model="form" ref="query" size="mini"> <el-form :inline="true" :model="form" size="mini">
<el-form-item label="设备"> <el-form-item label="设备">
<el-select <el-select
v-model="watch_id" v-model="watch_id"
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
>查询</el-button >查询</el-button
></el-form-item ></el-form-item
> >
<el-form-item><el-button @click="onReset('query')">重置</el-button></el-form-item> <el-form-item><el-button @click="onReset">重置</el-button></el-form-item>
</el-form> </el-form>
<EvmHistoryChart :dataList="evmList"></EvmHistoryChart> <EvmHistoryChart :dataList="evmList"></EvmHistoryChart>
<LvglHistoryChart :dataList="lvglList"></LvglHistoryChart> <LvglHistoryChart :dataList="lvglList"></LvglHistoryChart>
......
<!--
* @Author: your name
* @Date: 2021-06-30 17:43:46
* @LastEditTime: 2021-07-11 13:48:10
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \evm-store\tools\build_out\README.md
-->
# Flask-Migrate # Flask-Migrate
数据库迁移工具:使用Flask-Migrate数据库迁移框架可以保证数据库结构在发生变化时,改变数据库结构不至于丢失数据库的数据。 数据库迁移工具:使用Flask-Migrate数据库迁移框架可以保证数据库结构在发生变化时,改变数据库结构不至于丢失数据库的数据。
...@@ -68,4 +76,6 @@ python manager.py db migrate ...@@ -68,4 +76,6 @@ python manager.py db migrate
python manager.py db upgrade python manager.py db upgrade
``` ```
详情参考:https://zhuanlan.zhihu.com/p/307612189 详情参考:
\ No newline at end of file + https://zhuanlan.zhihu.com/p/307612189
+ https://file-manager.webmai.ru/
\ No newline at end of file
...@@ -32,7 +32,7 @@ handle_user_exception = app.handle_user_exception ...@@ -32,7 +32,7 @@ handle_user_exception = app.handle_user_exception
def expired_token_callback(jwt_header, jwt_payload): def expired_token_callback(jwt_header, jwt_payload):
logger.info(jwt_payload) logger.info(jwt_payload)
return jsonify({ return jsonify({
'code': 4011, 'code': 401,
'msg': 'token expired', 'msg': 'token expired',
'data': jwt_header 'data': jwt_header
}) })
...@@ -41,7 +41,7 @@ def expired_token_callback(jwt_header, jwt_payload): ...@@ -41,7 +41,7 @@ def expired_token_callback(jwt_header, jwt_payload):
@jwt.invalid_token_loader @jwt.invalid_token_loader
def invalid_token_callback(error): # we have to keep the argument here, since it's passed in by the caller internally def invalid_token_callback(error): # we have to keep the argument here, since it's passed in by the caller internally
return jsonify({ return jsonify({
'code': 4012, 'code': 401,
'msg': 'invalid token', 'msg': 'invalid token',
'data': error 'data': error
}) })
...@@ -50,7 +50,7 @@ def invalid_token_callback(error): # we have to keep the argument here, since i ...@@ -50,7 +50,7 @@ def invalid_token_callback(error): # we have to keep the argument here, since i
@jwt.unauthorized_loader @jwt.unauthorized_loader
def unauthorized_callback(error): def unauthorized_callback(error):
return jsonify({ return jsonify({
'code': 4013, 'code': 401,
'msg': 'unauthorized', 'msg': 'unauthorized',
'data': error 'data': error
}) })
...@@ -60,13 +60,13 @@ def _custom_abort(http_status_code, **kwargs): ...@@ -60,13 +60,13 @@ def _custom_abort(http_status_code, **kwargs):
自定义abort 400响应数据格式 自定义abort 400响应数据格式
""" """
if http_status_code == 400: if http_status_code == 400:
message = kwargs.get('message') message = kwargs.get('msg')
if isinstance(message, dict): if isinstance(message, dict):
param, info = list(message.items())[0] param, info = list(message.items())[0]
data = '{}:{}!'.format(param, info) data = '{}:{}!'.format(param, info)
return abort(jsonify(response_result(ResponseCode.PARAMETER_ERROR, data=data))) return abort(jsonify(response_result(ResponseCode.HTTP_INVAILD_REQUEST, data=data)))
else: else:
return abort(jsonify(response_result(ResponseCode.PARAMETER_ERROR, data=message))) return abort(jsonify(response_result(ResponseCode.HTTP_INVAILD_REQUEST, data=message)))
# return { 'code': http_status_code, 'msg': kwargs.get('message') } # return { 'code': http_status_code, 'msg': kwargs.get('message') }
return abort(http_status_code) return abort(http_status_code)
......
'''
Author: your name
Date: 2021-06-30 17:43:46
LastEditTime: 2021-07-12 10:45:38
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\application\config.py
'''
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
import multiprocessing import multiprocessing
MODE = 'develop' # develop: 开发模式; production: 生产模式 MODE = 'develop' # develop: 开发模式; production: 生产模式
UPLOAD_ROOT_DIR = os.path.join(os.path.dirname(__file__), 'assets', 'upload')
EXPORT_ROOT_DIR = os.path.join(os.path.dirname(__file__), 'assets', 'export')
UPLOAD_ALLOWED = set(['doc', 'docs', 'csv', 'xls', 'xlsx'])
class ProductionConfig(object): class ProductionConfig(object):
EPK_DIR = "D:\\projects\\scriptiot\\evm_app_store_files\\epks"
UPLOAD_ROOT_DIR = "D:\\projects\\scriptiot\\evm_app_store_files"
UPLOAD_ALLOWED = set(['doc', 'docs', 'csv', 'xls', 'xlsx'])
BIND = '127.0.0.1:3000' BIND = '127.0.0.1:3000'
WORKERS = multiprocessing.cpu_count() * 2 + 1 WORKERS = multiprocessing.cpu_count() * 2 + 1
WORKER_CONNECTIONS = 10000 WORKER_CONNECTIONS = 10000
...@@ -22,7 +30,7 @@ class ProductionConfig(object): ...@@ -22,7 +30,7 @@ class ProductionConfig(object):
REDIS_PORT = 6379 REDIS_PORT = 6379
REDIS_PASSWORD = '' REDIS_PASSWORD = ''
REDIS_MAX_CONNECTIONS = 100 REDIS_MAX_CONNECTIONS = 100
JWT_HEADER_NAME = 'Auth' JWT_HEADER_NAME = 'Authorization'
JWT_HEADER_TYPE = 'Bearer' JWT_HEADER_TYPE = 'Bearer'
JWT_SECRET_KEY = '6UdxRgs2hvWpTLmj027d5vt7dXXQX' JWT_SECRET_KEY = '6UdxRgs2hvWpTLmj027d5vt7dXXQX'
JWT_ACCESS_TOKEN_EXPIRES = 7200 JWT_ACCESS_TOKEN_EXPIRES = 7200
...@@ -44,6 +52,9 @@ class ProductionConfig(object): ...@@ -44,6 +52,9 @@ class ProductionConfig(object):
class DevelopConfig(object): class DevelopConfig(object):
EPK_DIR = "D:\\projects\\scriptiot\\evm_app_store_files\\epks"
UPLOAD_ROOT_DIR = "D:\\projects\\scriptiot\\evm_app_store_files"
UPLOAD_ALLOWED = set(['doc', 'docs', 'csv', 'xls', 'xlsx'])
BIND = '127.0.0.1:3000' BIND = '127.0.0.1:3000'
WORKERS = 2 WORKERS = 2
WORKER_CONNECTIONS = 1000 WORKER_CONNECTIONS = 1000
...@@ -58,7 +69,7 @@ class DevelopConfig(object): ...@@ -58,7 +69,7 @@ class DevelopConfig(object):
REDIS_PORT = 6379 REDIS_PORT = 6379
REDIS_PASSWORD = '' REDIS_PASSWORD = ''
REDIS_MAX_CONNECTIONS = 100 REDIS_MAX_CONNECTIONS = 100
JWT_HEADER_NAME = 'Auth' JWT_HEADER_NAME = 'Authorization'
JWT_HEADER_TYPE = 'Bearer' JWT_HEADER_TYPE = 'Bearer'
JWT_SECRET_KEY = '6UdxRgs2hvWpTLmj027d5vt7dXXQX' JWT_SECRET_KEY = '6UdxRgs2hvWpTLmj027d5vt7dXXQX'
JWT_ACCESS_TOKEN_EXPIRES = 7200 JWT_ACCESS_TOKEN_EXPIRES = 7200
......
...@@ -24,6 +24,24 @@ class SignalManager(object): ...@@ -24,6 +24,24 @@ class SignalManager(object):
actionPostLogin = PySignal() actionPostLogin = PySignal()
actionGetListLogin = PySignal() actionGetListLogin = PySignal()
actionGetLogin = PySignal() actionGetLogin = PySignal()
actionPostDevice = PySignal()
actionDeleteDevice = PySignal()
actionGetListDevice = PySignal()
actionGetDevice = PySignal()
actionPutDevice = PySignal()
actionDeleteAnnex = PySignal()
actionGetListAnnex = PySignal()
actionGetAnnex = PySignal()
actionGetListMonitorWatch = PySignal()
actionGetMonitorWatch = PySignal()
actionGetListMonitorSystem = PySignal()
actionGetMonitorSystem = PySignal()
actionGetListMonitorLvgl = PySignal()
actionGetMonitorLvgl = PySignal()
actionGetListMonitorImage = PySignal()
actionGetMonitorImage = PySignal()
actionGetListMonitorEvm = PySignal()
actionGetMonitorEvm = PySignal()
# file manager api # file manager api
actionGetFileInit = PySignal() actionGetFileInit = PySignal()
actionGetFileContent = PySignal() actionGetFileContent = PySignal()
......
''' '''
Author: your name Author: your name
Date: 2021-06-30 17:43:46 Date: 2021-06-30 17:43:46
LastEditTime: 2021-07-09 13:10:51 LastEditTime: 2021-07-14 19:05:56
LastEditors: Please set LastEditors LastEditors: Please set LastEditors
Description: In User Settings Edit Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\__init__.py FilePath: \evm-store\tools\build_out\controllers\__init__.py
...@@ -15,7 +15,14 @@ from .app import appManager ...@@ -15,7 +15,14 @@ from .app import appManager
from .package import packageManager from .package import packageManager
from .user import userManager from .user import userManager
from .login import loginManager from .login import loginManager
from .file_manager import fileManager from .device import deviceManager
from .annex import annexManager
from .monitorWatch import monitorWatchManager
from .monitorSystem import monitorSystemManager
from .monitorLvgl import monitorLvglManager
from .monitorImage import monitorImageManager
from .monitorEvm import monitorEvmManager
from .file import fileManager
def initConnect(): def initConnect():
signalManager.actionPostArea.connect(areaManager.post) signalManager.actionPostArea.connect(areaManager.post)
...@@ -38,5 +45,28 @@ def initConnect(): ...@@ -38,5 +45,28 @@ def initConnect():
signalManager.actionPostLogin.connect(loginManager.post) signalManager.actionPostLogin.connect(loginManager.post)
signalManager.actionGetListLogin.connect(loginManager.getList) signalManager.actionGetListLogin.connect(loginManager.getList)
signalManager.actionGetLogin.connect(loginManager.get) signalManager.actionGetLogin.connect(loginManager.get)
signalManager.actionPostDevice.connect(deviceManager.post)
signalManager.actionDeleteDevice.connect(deviceManager.delete)
signalManager.actionGetListDevice.connect(deviceManager.getList)
signalManager.actionGetDevice.connect(deviceManager.get)
signalManager.actionPutDevice.connect(deviceManager.put)
signalManager.actionDeleteAnnex.connect(annexManager.delete)
signalManager.actionGetListAnnex.connect(annexManager.getList)
signalManager.actionGetAnnex.connect(annexManager.get)
signalManager.actionGetListMonitorWatch.connect(monitorWatchManager.getList)
signalManager.actionGetMonitorWatch.connect(monitorWatchManager.get)
signalManager.actionGetListMonitorSystem.connect(monitorSystemManager.getList)
signalManager.actionGetMonitorSystem.connect(monitorSystemManager.get)
signalManager.actionGetListMonitorLvgl.connect(monitorLvglManager.getList)
signalManager.actionGetMonitorLvgl.connect(monitorLvglManager.get)
signalManager.actionGetListMonitorImage.connect(monitorImageManager.getList)
signalManager.actionGetMonitorImage.connect(monitorImageManager.get)
signalManager.actionGetListMonitorEvm.connect(monitorEvmManager.getList)
signalManager.actionGetMonitorEvm.connect(monitorEvmManager.get)
# file manager api
signalManager.actionGetFileContent.connect(fileManager.content) signalManager.actionGetFileContent.connect(fileManager.content)
# signalManager.actionGEt signalManager.actionGetFileDisk.connect(fileManager.disk)
\ No newline at end of file signalManager.actionGetFileDown.connect(fileManager.download)
signalManager.actionGetFileInit.connect(fileManager.initialize)
signalManager.actionGetFilePreview.connect(fileManager.preview)
signalManager.actionGetFileTree.connect(fileManager.tree)
This diff is collapsed.
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:06:40
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\area.py
'''
from datetime import datetime from datetime import datetime
from application.app import db from application.app import db
from models.area import AreaModel from models.area import AreaModel
from webcreator.log import logger from webcreator.log import logger
# from webcreator.response import ResponseCode, response_result from webcreator.response import ResponseCode
class AreaResource(object): class AreaResource(object):
def __init__(self): def __init__(self):
...@@ -13,8 +21,8 @@ class AreaResource(object): ...@@ -13,8 +21,8 @@ class AreaResource(object):
filters = [AreaModel.is_delete==False, AreaModel.uuid==uuid] filters = [AreaModel.is_delete==False, AreaModel.uuid==uuid]
result = AreaModel.query.filter(*filters).first() result = AreaModel.query.filter(*filters).first()
if result: if result:
return (True, result) return result, ResponseCode.HTTP_SUCCESS
return (False, result) return result, ResponseCode.HTTP_NOT_FOUND
def getList(self, params): def getList(self, params):
# handle business # handle business
...@@ -22,7 +30,9 @@ class AreaResource(object): ...@@ -22,7 +30,9 @@ class AreaResource(object):
filters = [AreaModel.is_delete==False] filters = [AreaModel.is_delete==False]
result = AreaModel.query.filter(*filters).order_by(AreaModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = AreaModel.query.filter(*filters).order_by(AreaModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total) if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}): def post(self, params, jwt={}):
# handle business # handle business
...@@ -32,9 +42,9 @@ class AreaResource(object): ...@@ -32,9 +42,9 @@ class AreaResource(object):
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False: elif result and result.is_delete == False:
return (False, "record code exists") return False, ResponseCode.HTTP_INVAILD_REQUEST
result = AreaModel(**params) result = AreaModel(**params)
db.session.add(result) db.session.add(result)
...@@ -45,7 +55,7 @@ class AreaResource(object): ...@@ -45,7 +55,7 @@ class AreaResource(object):
# handle business # handle business
result = AreaModel.query.filter(AreaModel.uuid==uuid).first() result = AreaModel.query.filter(AreaModel.uuid==uuid).first()
if not result: if not result:
return (False, "record not exists") return False, ResponseCode.HTTP_NOT_FOUND
if params: if params:
for key, value in params.items(): for key, value in params.items():
...@@ -53,21 +63,21 @@ class AreaResource(object): ...@@ -53,21 +63,21 @@ class AreaResource(object):
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
else: else:
return (False, "params is null") return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}): def delete(self, uuid, jwt={}):
# handle business # handle business
result = AreaModel.query.filter(AreaModel.uuid==uuid).first() result = AreaModel.query.filter(AreaModel.uuid==uuid).first()
if not result: if not result:
return (False, "record not exists") return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
result.is_delete = True result.is_delete = True
db.session.delete(result) db.session.delete(result)
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
areaManager = AreaResource() areaManager = AreaResource()
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import json
from datetime import datetime from datetime import datetime
from flask_jwt_extended import (create_access_token,)
from application.app import db from application.app import db
from models.login import LoginModel from models.login import LoginModel
from models.user import UserModel
from webcreator.log import logger from webcreator.log import logger
# from webcreator.response import ResponseCode, response_result from webcreator import utils
from webcreator.response import ResponseCode
@utils.ThreadMaker
def update_login_information(ip, log_id):
try:
jsonData = utils.get_location_by_ip(ip)
logger.info(jsonData)
if (0 != jsonData['status']):
return None
record = LoginModel.query.filter(LoginModel.id==log_id).first()
record.geo_location = json.dumps(jsonData, ensure_ascii=False)
db.session.commit()
except Exception as e:
logger.error(e)
class LoginResource(object): class LoginResource(object):
def __init__(self): def __init__(self):
...@@ -13,8 +35,8 @@ class LoginResource(object): ...@@ -13,8 +35,8 @@ class LoginResource(object):
filters = [LoginModel.is_delete==False, LoginModel.uuid==uuid] filters = [LoginModel.is_delete==False, LoginModel.uuid==uuid]
result = LoginModel.query.filter(*filters).first() result = LoginModel.query.filter(*filters).first()
if result: if result:
return (True, result) return result, ResponseCode.HTTP_SUCCESS
return (False, result) return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params): def getList(self, params):
# handle business # handle business
...@@ -22,30 +44,43 @@ class LoginResource(object): ...@@ -22,30 +44,43 @@ class LoginResource(object):
filters = [LoginModel.is_delete==False] filters = [LoginModel.is_delete==False]
result = LoginModel.query.filter(*filters).order_by(LoginModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = LoginModel.query.filter(*filters).order_by(LoginModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total) if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}): def post(self, params, jwt={}):
# handle business # handle business
result = LoginModel.query.filter(LoginModel.user == params.get('user')).first() user = UserModel.query.filter(UserModel.account==params.get("account")).first()
if result and result.is_delete: if not user:
result.is_delete = False return False, ResponseCode.USER_NOT_EXISTS
result.update_by = jwt.get("id", "")
result.update_date = datetime.now()
db.session.commit()
return (True, None)
elif result and result.is_delete == False:
return (False, "record code exists")
result = LoginModel(**params) logger.info(params)
if user.password != utils.md5_encryption(params.get("password")):
return False, ResponseCode.USER_PASSWORD_ERROR
# 插入一条登录记录
obj = { 'user': user.id, 'user_agent': params.get("user_agent"), 'ip': params.get("ip"), 'geo_location': '', 'operator': '', 'login_at': datetime.now().strftime("%Y-%m-%d %H:%M:%S") }
result = LoginModel(**obj)
result.operator = ""
db.session.add(result) db.session.add(result)
db.session.commit() db.session.commit()
return (True, None)
# 获取当前登录IP地理位置信息
update_login_information(params.get("ip"), result.id)
# 生成一个token,返回给前端
result = {
'uuid': user.uuid,
'name': user.username,
'token': create_access_token(identity={'uuid': user.uuid, 'name': user.username}),
}
return result, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}): def put(self, uuid, params, jwt={}):
# handle business # handle business
result = LoginModel.query.filter(LoginModel.uuid==uuid).first() result = LoginModel.query.filter(LoginModel.uuid==uuid).first()
if not result: if not result:
return (False, "record not exists") return None, ResponseCode.HTTP_NOT_FOUND
if params: if params:
for key, value in params.items(): for key, value in params.items():
...@@ -53,21 +88,21 @@ class LoginResource(object): ...@@ -53,21 +88,21 @@ class LoginResource(object):
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
else: else:
return (False, "params is null") return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}): def delete(self, uuid, jwt={}):
# handle business # handle business
result = LoginModel.query.filter(LoginModel.uuid==uuid).first() result = LoginModel.query.filter(LoginModel.uuid==uuid).first()
if not result: if not result:
return (False, "record not exists") return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
result.is_delete = True result.is_delete = True
db.session.delete(result) db.session.delete(result)
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
loginManager = LoginResource() loginManager = LoginResource()
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:08:22
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\package.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import os
import re
import shutil
from datetime import datetime from datetime import datetime
from application.app import db from application.app import db, config
from models.annex import AnnexModel
from models.app import AppModel
from models.user import UserModel
from models.package import PackageModel from models.package import PackageModel
from webcreator.utils.epk import EpkApp
from webcreator.log import logger from webcreator.log import logger
# from webcreator.response import ResponseCode, response_result from webcreator.response import ResponseCode
class PackageResource(object): class PackageResource(object):
def __init__(self): def __init__(self):
...@@ -13,8 +31,8 @@ class PackageResource(object): ...@@ -13,8 +31,8 @@ class PackageResource(object):
filters = [PackageModel.is_delete==False, PackageModel.uuid==uuid] filters = [PackageModel.is_delete==False, PackageModel.uuid==uuid]
result = PackageModel.query.filter(*filters).first() result = PackageModel.query.filter(*filters).first()
if result: if result:
return (True, result) return result, ResponseCode.HTTP_SUCCESS
return (False, result) return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params): def getList(self, params):
# handle business # handle business
...@@ -22,30 +40,113 @@ class PackageResource(object): ...@@ -22,30 +40,113 @@ class PackageResource(object):
filters = [PackageModel.is_delete==False] filters = [PackageModel.is_delete==False]
result = PackageModel.query.filter(*filters).order_by(PackageModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = PackageModel.query.filter(*filters).order_by(PackageModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total) if result:
return result, ResponseCode.HTTP_SUCCESS
user = UserModel.query.filter(id=params.get('user')).onr_or_none()
if not user:
return False, ResponseCode.USER_NOT_EXISTS
temp = {}
if user.role == "administrator":
temp.update({"is_delete": False})
else:
temp.update({ "create_by": user.id, "is_delete": False })
if "scope_type" in params and params.get("scope_type") == "list":
result = PackageModel.query.filter_by(**temp).order_by(PackageModel.create_at.desc())
temp = []
for item in result:
temp.append({ "name": item.app.app_name, "uuid": str(item.uuid) })
return temp, len(temp), "get build_logs {}.".format("success" if temp else "fail")
result = PackageModel.query.filter_by(**temp).order_by(PackageModel.create_at.desc()).paginate(params.get("pagenum", 1), params.get("pagesize", 10), error_out=False)
if result.total and len(result.items):
temp = []
for item in result.items:
t = item.to_dict()
t.update({
"create_at": item.create_at.strftime("%Y-%m-%d %H:%M:%S") if item.create_at else None,
"update_at": item.update_at.strftime("%Y-%m-%d %H:%M:%S") if item.update_at else None,
})
temp.append(t)
return (temp, result.total), ResponseCode.HTTP_SUCCESS
return result, ResponseCode.HTTP_NO_DATA
def post(self, params, jwt={}): def post(self, params, jwt={}):
# 判断用户是否存在
user = UserModel.query.filter(UserModel.id==params.get('user'))
if not user:
return False, ResponseCode.USER_NOT_EXISTS
# 判断app是否存在
app = AppModel.query.filter(AppModel.id==params.get("app"))
if not app:
return False, ResponseCode.HTTP_NOT_FOUND
# 根据应用查找有哪些源文件
source_files = AnnexModel.query.filter(AnnexModel.app==app.id).all()
if not source_files:
return None, ResponseCode.HTTP_NO_DATA
dir_format = "{}-{}-{}".format(app.app_name, app.app_version, datetime.now().strftime("%Y%m%d%H%M%S"))
upload_dir = os.sep.join([config.UPLOAD_ROOT_DIR, "uploads", "evueapps"])
target_dir = os.sep.join([upload_dir, user.account, dir_format])
dest_dir = os.sep.join([target_dir, "src"])
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
app_files = []
for sf in source_files:
target_file = os.sep.join([config.UPLOAD_ROOT_DIR, sf.path])
filename = os.path.basename(target_file)
name, suffix = os.path.splitext(filename)
name = re.sub(r"_\d{14}$", "", name)
dst_file = os.path.normpath(os.sep.join([dest_dir, name + suffix]))
shutil.move(os.path.normpath(target_file), dst_file)
app_files.append([sf.id, dst_file])
# 打包成EPK文件
app_info = {}
params = { 'appName': app.app_name, 'appDir': dest_dir, 'appVersion': app.app_version, 'output': target_dir }
if user.role == "administrator" or user.role == "community":
params['algorithm'] = "h"
epk = EpkApp(**params)
app_info = epk.pack()
if app_info:
app_info['md5'] = str(app_info['md5'])
# 更新数据库对应文件路径
# for sf in source_files:
# for af in app_files:
# if sf.id == af[0]:
# t = os.path.normpath(af[1].replace(config.UPLOAD_ROOT_DIR, "")).replace('\\', '/')
# sf.set(path=t)
# db.session.flush()
# db.session.commit()
epk_path = os.sep.join([target_dir.replace(config.UPLOAD_ROOT_DIR, ""), "{}.epk".format(app.app_name)]).replace('\\', '/')
# handle business # handle business
result = PackageModel.query.filter(PackageModel.app == params.get('app')).first() # result = PackageModel.query.filter(PackageModel.app == params.get('app')).first()
if result and result.is_delete: # if result and result.is_delete:
result.is_delete = False # result.is_delete = False
result.update_by = jwt.get("id", "") # result.update_by = jwt.get("id", "")
result.update_date = datetime.now() # result.update_date = datetime.now()
db.session.commit() # db.session.commit()
return (True, None) # return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False: # elif result and result.is_delete == False:
return (False, "record code exists") # return False, ResponseCode.HTTP_INVAILD_REQUEST
result = PackageModel(**params) result = PackageModel(app=app.id, file_path=epk_path, package_info=app_info, app_version=params.get("app_version"), create_by=user.id, create_at=datetime.now(), update_by=user.id, update_at=datetime.now())
db.session.add(result) db.session.add(result)
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}): def put(self, uuid, params, jwt={}):
# handle business # handle business
result = PackageModel.query.filter(PackageModel.uuid==uuid).first() result = PackageModel.query.filter(PackageModel.uuid==uuid).first()
if not result: if not result:
return (False, "record not exists") return None, ResponseCode.HTTP_NOT_FOUND
if params: if params:
for key, value in params.items(): for key, value in params.items():
...@@ -53,21 +154,21 @@ class PackageResource(object): ...@@ -53,21 +154,21 @@ class PackageResource(object):
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
else: else:
return (False, "params is null") return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}): def delete(self, uuid, jwt={}):
# handle business # handle business
result = PackageModel.query.filter(PackageModel.uuid==uuid).first() result = PackageModel.query.filter(PackageModel.uuid==uuid).first()
if not result: if not result:
return (False, "record not exists") return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
result.is_delete = True result.is_delete = True
db.session.delete(result) db.session.delete(result)
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
packageManager = PackageResource() packageManager = PackageResource()
\ No newline at end of file
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:08:34
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\controllers\user.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from datetime import datetime from datetime import datetime
from application.app import db from application.app import db
from models.user import UserModel from models.user import UserModel
from webcreator.log import logger from webcreator.log import logger
# from webcreator.response import ResponseCode, response_result from webcreator.response import ResponseCode
class UserResource(object): class UserResource(object):
def __init__(self): def __init__(self):
...@@ -13,8 +24,8 @@ class UserResource(object): ...@@ -13,8 +24,8 @@ class UserResource(object):
filters = [UserModel.is_delete==False, UserModel.uuid==uuid] filters = [UserModel.is_delete==False, UserModel.uuid==uuid]
result = UserModel.query.filter(*filters).first() result = UserModel.query.filter(*filters).first()
if result: if result:
return (True, result) return result, ResponseCode.HTTP_SUCCESS
return (False, result) return None, ResponseCode.HTTP_NOT_FOUND
def getList(self, params): def getList(self, params):
# handle business # handle business
...@@ -22,30 +33,37 @@ class UserResource(object): ...@@ -22,30 +33,37 @@ class UserResource(object):
filters = [UserModel.is_delete==False] filters = [UserModel.is_delete==False]
result = UserModel.query.filter(*filters).order_by(UserModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False) result = UserModel.query.filter(*filters).order_by(UserModel.create_at).paginate(params.get('page', 1), params.get('pageSize', 10), error_out=False)
return (True, result.items, result.total) if result:
return result, ResponseCode.HTTP_SUCCESS
return None, ResponseCode.HTTP_NOT_FOUND
def post(self, params, jwt={}): def post(self, params, jwt={}):
# handle business # handle business
result = UserModel.query.filter(UserModel.app_name == params.get('app_name')).first() result = UserModel.query.filter(UserModel.account == params.get('account')).first()
if result and result.is_delete: if result and result.is_delete:
result.is_delete = False result.is_delete = False
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
elif result and result.is_delete == False: elif result and result.is_delete == False:
return (False, "record code exists") return False, ResponseCode.USER_EXISTS
# 密码使用md5加密,可以使用元编程模式劫持,不用手动一个个修改了
# params.update({ "password": utils.md5_encryption(params.get("password")) })
result = UserModel(**params) result = UserModel(**params)
db.session.add(result) db.session.add(result)
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
def put(self, uuid, params, jwt={}): def put(self, uuid, params, jwt={}):
logger.info(uuid)
logger.info(params)
# handle business # handle business
result = UserModel.query.filter(UserModel.uuid==uuid).first() result = UserModel.query.filter(UserModel.uuid==uuid).first()
if not result: if not result:
return (False, "record not exists") return None, ResponseCode.HTTP_NOT_FOUND
if params: if params:
for key, value in params.items(): for key, value in params.items():
...@@ -53,21 +71,21 @@ class UserResource(object): ...@@ -53,21 +71,21 @@ class UserResource(object):
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
else: else:
return (False, "params is null") return False, ResponseCode.HTTP_INVAILD_REQUEST
def delete(self, uuid, jwt={}): def delete(self, uuid, jwt={}):
# handle business # handle business
result = UserModel.query.filter(UserModel.uuid==uuid).first() result = UserModel.query.filter(UserModel.uuid==uuid).first()
if not result: if not result:
return (False, "record not exists") return False, ResponseCode.HTTP_NOT_FOUND
result.update_by = jwt.get("id", "") result.update_by = jwt.get("id", "")
result.update_date = datetime.now() result.update_date = datetime.now()
result.is_delete = True result.is_delete = True
db.session.delete(result) db.session.delete(result)
db.session.commit() db.session.commit()
return (True, None) return True, ResponseCode.HTTP_SUCCESS
userManager = UserResource() userManager = UserResource()
This diff is collapsed.
# -*- coding: utf-8 -*- #!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma from application.app import db, ma
from .base import PrimaryModel from .base import PrimaryModel
...@@ -10,20 +11,20 @@ class AppModel(PrimaryModel): ...@@ -10,20 +11,20 @@ class AppModel(PrimaryModel):
app_name = db.Column(db.String(70), index = True, nullable = False) app_name = db.Column(db.String(70), index = True, nullable = False)
app_icon = db.Column(db.String(200), nullable = False) app_icon = db.Column(db.String(200), nullable = False)
app_version = db.Column(db.String(20), nullable = False) app_version = db.Column(db.String(20), nullable = False)
category = db.Column(db.Integer, nullable = False) category = db.Column(db.Integer, nullable = False, default = 0)
category_2th = db.Column(db.Integer, nullable = False) category_2th = db.Column(db.Integer, nullable = False, default = 0)
developer = db.Column(db.Integer, nullable = False) developer = db.Column(db.Integer, nullable = False, default = 0)
download_url = db.Column(db.String(20), nullable = False) download_url = db.Column(db.String(20), nullable = False, default = '')
app_file_size = db.Column(db.Integer, nullable = False) app_file_size = db.Column(db.Integer, nullable = False, default = 0)
app_screen_size = db.Column(db.Integer, nullable = False) app_screen_size = db.Column(db.Integer, nullable = False, default = 0)
app_arch = db.Column(db.String(20), nullable = False) app_arch = db.Column(db.String(20), nullable = False, default = '')
app_review = db.Column(db.String(100), nullable = False) app_review = db.Column(db.String(100), nullable = False, default = '')
# __table_args__ = ( # __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'), # db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# ) # )
def __init__(self, app_name, app_icon, app_version, category, category_2th, developer, download_url, app_file_size, app_screen_size, app_arch, app_review): def __init__(self, app_name, app_icon, app_version, category=0, category_2th=0, developer=0, download_url='', app_file_size=0, app_screen_size=0, app_arch='', app_review=''):
self.app_name = app_name self.app_name = app_name
self.app_icon = app_icon self.app_icon = app_icon
self.app_version = app_version self.app_version = app_version
...@@ -39,7 +40,7 @@ class AppModel(PrimaryModel): ...@@ -39,7 +40,7 @@ class AppModel(PrimaryModel):
def __repr__(self): def __repr__(self):
return '<AppModel %r>' % (self.app_name) return '<AppModel %r>' % (self.app_name)
def to_json(self): def to_dict(self):
return { return {
'app_name': self.app_name, 'app_name': self.app_name,
'app_icon': self.app_icon, 'app_icon': self.app_icon,
......
...@@ -31,7 +31,7 @@ class AreaModel(PrimaryModel): ...@@ -31,7 +31,7 @@ class AreaModel(PrimaryModel):
def __repr__(self): def __repr__(self):
return '<AreaModel %r>' % (self.areaCode) return '<AreaModel %r>' % (self.areaCode)
def to_json(self): def to_dict(self):
return { return {
'areaCode': self.areaCode, 'areaCode': self.areaCode,
'areaName': self.areaName, 'areaName': self.areaName,
......
# -*- coding: utf-8 -*- #!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid import uuid
from datetime import datetime from datetime import datetime
......
# -*- coding: utf-8 -*- #!/usr/bin/env python
# -*- coding: utf_8 -*-
import json
from application.app import db, ma from application.app import db, ma
from .base import PrimaryModel from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE from marshmallow import Schema, fields, INCLUDE, EXCLUDE
from webcreator.log import logger
class LoginModel(PrimaryModel): class LoginModel(PrimaryModel):
__tablename__ = 'evm_login' __tablename__ = 'evm_login'
...@@ -26,10 +29,19 @@ class LoginModel(PrimaryModel): ...@@ -26,10 +29,19 @@ class LoginModel(PrimaryModel):
self.geo_location = geo_location self.geo_location = geo_location
self.operator = operator self.operator = operator
# def __getattr__(self, key):
# return self.__dict__[key]
# def __getitem__(self, key):
# return self.get(key)
# def __getattribute__(self, value):
# return value
def __repr__(self): def __repr__(self):
return '<LoginModel %r>' % (self.user) return '<LoginModel %r>' % (self.user)
def to_json(self): def to_dict(self):
return { return {
'login_at': self.login_at, 'login_at': self.login_at,
'user_agent': self.user_agent, 'user_agent': self.user_agent,
...@@ -58,12 +70,12 @@ class GetListLoginSchema(ma.SQLAlchemySchema): ...@@ -58,12 +70,12 @@ class GetListLoginSchema(ma.SQLAlchemySchema):
page = fields.Integer(required=False) page = fields.Integer(required=False)
pageSize = fields.Integer(required=False) pageSize = fields.Integer(required=False)
user = ma.auto_field() user = fields.Integer(required=False)
login_at = ma.auto_field() login_at = fields.String(required=False)
user_agent = ma.auto_field() user_agent = fields.String(required=False)
ip = ma.auto_field() ip = fields.String(required=False)
geo_location = ma.auto_field() geo_location = fields.String(required=False)
operator = ma.auto_field() operator = fields.String(required=False)
getListLoginSchema = GetListLoginSchema() getListLoginSchema = GetListLoginSchema()
getListLoginsSchema = GetListLoginSchema(many=True) getListLoginsSchema = GetListLoginSchema(many=True)
...@@ -74,11 +86,11 @@ class GetLoginSchema(ma.SQLAlchemySchema): ...@@ -74,11 +86,11 @@ class GetLoginSchema(ma.SQLAlchemySchema):
unknown = EXCLUDE # 未知字段默认排除 unknown = EXCLUDE # 未知字段默认排除
model = LoginModel model = LoginModel
user = ma.auto_field() user = fields.Integer(required=False)
login_at = ma.auto_field() login_at = fields.String(required=False)
user_agent = ma.auto_field() user_agent = fields.String(required=False)
ip = ma.auto_field() ip = fields.String(required=False)
geo_location = ma.auto_field() geo_location = fields.String(required=False)
operator = ma.auto_field() operator = fields.String(required=False)
getLoginSchema = GetLoginSchema() getLoginSchema = GetLoginSchema()
# -*- coding: utf-8 -*- '''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-12 01:59:31
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\models\package.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma from application.app import db, ma
from .base import PrimaryModel from .base import PrimaryModel
...@@ -22,7 +31,7 @@ class PackageModel(PrimaryModel): ...@@ -22,7 +31,7 @@ class PackageModel(PrimaryModel):
# db.Index('idx_xxx', 'xxx', mysql_using='btree'), # db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# ) # )
def __init__(self, app, app_version, package_info, file_path, source, user_agent, download_url, ip, geo_location, operator): def __init__(self, app, app_version, package_info, file_path, source="", user_agent="", download_url="", ip="", geo_location="", operator="", create_by=None, create_at=None, update_by=None, update_at=None):
self.app = app self.app = app
self.app_version = app_version self.app_version = app_version
self.package_info = package_info self.package_info = package_info
...@@ -33,11 +42,15 @@ class PackageModel(PrimaryModel): ...@@ -33,11 +42,15 @@ class PackageModel(PrimaryModel):
self.ip = ip self.ip = ip
self.geo_location = geo_location self.geo_location = geo_location
self.operator = operator self.operator = operator
self.create_by = create_by
self.create_at = create_at
self.update_by = update_by
self.update_at = update_at
def __repr__(self): def __repr__(self):
return '<PackageModel %r>' % (self.app) return '<PackageModel %r>' % (self.app)
def to_json(self): def to_dict(self):
return { return {
'app_version': self.app_version, 'app_version': self.app_version,
'package_info': self.package_info, 'package_info': self.package_info,
......
# -*- coding: utf-8 -*- #!/usr/bin/env python
# -*- coding: utf_8 -*-
from application.app import db, ma from application.app import db, ma
from .base import PrimaryModel from .base import PrimaryModel
from marshmallow import Schema, fields, INCLUDE, EXCLUDE from marshmallow import Schema, fields, INCLUDE, EXCLUDE
from webcreator import utils
from webcreator.log import logger
class UserModel(PrimaryModel): class UserModel(PrimaryModel):
__tablename__ = 'evm_user' __tablename__ = 'evm_user'
app_name = db.Column(db.String(70), index = True, nullable = False) username = db.Column(db.String(70), index = True, nullable = False)
app_icon = db.Column(db.String(200), nullable = False) account = db.Column(db.String(200), nullable = False)
app_version = db.Column(db.String(20), nullable = False) password = db.Column(db.String(20), nullable = False)
category = db.Column(db.Integer, nullable = False) role = db.Column(db.Integer, nullable = False, default = 0)
category_2th = db.Column(db.Integer, nullable = False) email = db.Column(db.String, nullable = False, default = '')
developer = db.Column(db.Integer, nullable = False) phone = db.Column(db.String, nullable = False, default = '')
download_url = db.Column(db.String(20), nullable = False)
app_file_size = db.Column(db.Integer, nullable = False)
app_screen_size = db.Column(db.Integer, nullable = False)
app_arch = db.Column(db.String(20), nullable = False)
app_review = db.Column(db.String(100), nullable = False)
# __table_args__ = ( # __table_args__ = (
# db.Index('idx_xxx', 'xxx', mysql_using='btree'), # db.Index('idx_xxx', 'xxx', mysql_using='btree'),
# ) # )
def __init__(self, app_name, app_icon, app_version, category, category_2th, developer, download_url, app_file_size, app_screen_size, app_arch, app_review): def __init__(self, username, account, password, role=0, email='', phone=''):
self.app_name = app_name self.username = username
self.app_icon = app_icon self.account = account
self.app_version = app_version self.password = password
self.category = category self.role = role
self.category_2th = category_2th self.email = email
self.developer = developer self.phone = phone
self.download_url = download_url
self.app_file_size = app_file_size def __setattr__(self, key, value):
self.app_screen_size = app_screen_size # logger.info(f"execute __setattr__:key={key}, value={value}")
self.app_arch = app_arch if key == 'password':
self.app_review = app_review self.__dict__[key] = utils.md5_encryption(value)
else:
self.__dict__[key] = value
def __repr__(self): def __repr__(self):
return '<UserModel %r>' % (self.app_name) return '<UserModel %r>' % (self.username)
def to_json(self): def to_dict(self):
return { return {
'app_name': self.app_name, 'username': self.username,
'app_icon': self.app_icon, 'account': self.account,
'app_version': self.app_version, 'password': self.password,
'category': self.category, 'role': self.role,
'category_2th': self.category_2th, 'email': self.email,
'developer': self.developer, 'phone': self.phone,
'download_url': self.download_url,
'app_file_size': self.app_file_size,
'app_screen_size': self.app_screen_size,
'app_arch': self.app_arch,
'app_review': self.app_review,
} }
...@@ -61,15 +56,9 @@ class PostUserSchema(ma.SQLAlchemySchema): ...@@ -61,15 +56,9 @@ class PostUserSchema(ma.SQLAlchemySchema):
unknown = EXCLUDE # 未知字段默认排除 unknown = EXCLUDE # 未知字段默认排除
model = UserModel model = UserModel
app_name = ma.auto_field() username = ma.auto_field()
app_icon = ma.auto_field() account = ma.auto_field()
app_version = ma.auto_field() password = ma.auto_field()
category = ma.auto_field()
category_2th = ma.auto_field()
developer = ma.auto_field()
app_screen_size = ma.auto_field()
app_arch = ma.auto_field()
app_review = ma.auto_field()
postUserSchema = PostUserSchema() postUserSchema = PostUserSchema()
...@@ -88,13 +77,9 @@ class GetListUserSchema(ma.SQLAlchemySchema): ...@@ -88,13 +77,9 @@ class GetListUserSchema(ma.SQLAlchemySchema):
unknown = EXCLUDE # 未知字段默认排除 unknown = EXCLUDE # 未知字段默认排除
model = UserModel model = UserModel
page = fields.Integer(required=False) uuid = ma.auto_field()
pageSize = fields.Integer(required=False) username = ma.auto_field()
app_name = ma.auto_field() account = ma.auto_field()
app_version = ma.auto_field()
category = ma.auto_field()
category_2th = ma.auto_field()
app_arch = ma.auto_field()
getListUserSchema = GetListUserSchema() getListUserSchema = GetListUserSchema()
getListUsersSchema = GetListUserSchema(many=True) getListUsersSchema = GetListUserSchema(many=True)
...@@ -105,11 +90,8 @@ class GetUserSchema(ma.SQLAlchemySchema): ...@@ -105,11 +90,8 @@ class GetUserSchema(ma.SQLAlchemySchema):
unknown = EXCLUDE # 未知字段默认排除 unknown = EXCLUDE # 未知字段默认排除
model = UserModel model = UserModel
app_name = ma.auto_field() username = ma.auto_field()
app_version = ma.auto_field() account = ma.auto_field()
category = ma.auto_field()
category_2th = ma.auto_field()
app_arch = ma.auto_field()
getUserSchema = GetUserSchema() getUserSchema = GetUserSchema()
...@@ -119,13 +101,8 @@ class PutUserSchema(ma.SQLAlchemySchema): ...@@ -119,13 +101,8 @@ class PutUserSchema(ma.SQLAlchemySchema):
unknown = EXCLUDE # 未知字段默认排除 unknown = EXCLUDE # 未知字段默认排除
model = UserModel model = UserModel
app_name = ma.auto_field() account = fields.String(required=False, allow_none=True)
app_icon = ma.auto_field() username = fields.String(required=False, allow_none=True)
app_version = ma.auto_field() password = fields.String(required=False, allow_none=True)
app_screen_size = ma.auto_field()
app_arch = ma.auto_field()
app_review = ma.auto_field()
category = ma.auto_field()
category_2th = ma.auto_field()
putUserSchema = PutUserSchema() putUserSchema = PutUserSchema()
# -*- coding: utf-8 -*- #!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import Blueprint from flask import Blueprint
from flask_restful import Api from flask_restful import Api
...@@ -7,6 +8,14 @@ from . import app ...@@ -7,6 +8,14 @@ from . import app
from . import package from . import package
from . import user from . import user
from . import login from . import login
from . import device
from . import annex
from . import file
from . import monitorWatch
from . import monitorSystem
from . import monitorLvgl
from . import monitorImage
from . import monitorEvm
api_v1 = Blueprint('api_v1', __name__) api_v1 = Blueprint('api_v1', __name__)
...@@ -27,3 +36,31 @@ api.add_resource(user.UserResourceList, '/user') ...@@ -27,3 +36,31 @@ api.add_resource(user.UserResourceList, '/user')
api.add_resource(login.LoginResource, '/login/<string:uuid>') api.add_resource(login.LoginResource, '/login/<string:uuid>')
api.add_resource(login.LoginResourceList, '/login') api.add_resource(login.LoginResourceList, '/login')
api.add_resource(device.DeviceResource, '/device/<string:uuid>')
api.add_resource(device.DeviceResourceList, '/device')
api.add_resource(annex.AnnexResource, '/annex/<string:uuid>')
api.add_resource(annex.AnnexResourceList, '/annex')
api.add_resource(file.FileInit, "/file-manager/initialize")
api.add_resource(file.FileContent, "/file-manager/content")
api.add_resource(file.FileDisk, "/file-manager/disk")
api.add_resource(file.FileTree, "/file-manager/tree")
api.add_resource(file.FileDownload, "/file-manager/download")
api.add_resource(file.FilePrview, "/file-manager/preview")
api.add_resource(monitorWatch.MonitorWatchResource, '/monitorWatch/<string:uuid>')
api.add_resource(monitorWatch.MonitorWatchResourceList, '/monitorWatch')
api.add_resource(monitorSystem.MonitorSystemResource, '/monitorSystem/<string:uuid>')
api.add_resource(monitorSystem.MonitorSystemResourceList, '/monitorSystem')
api.add_resource(monitorLvgl.MonitorLvglResource, '/monitorLvgl/<string:uuid>')
api.add_resource(monitorLvgl.MonitorLvglResourceList, '/monitorLvgl')
api.add_resource(monitorImage.MonitorImageResource, '/monitorImage/<string:uuid>')
api.add_resource(monitorImage.MonitorImageResourceList, '/monitorImage')
api.add_resource(monitorEvm.MonitorEvmResource, '/monitorEvm/<string:uuid>')
api.add_resource(monitorEvm.MonitorEvmResourceList, '/monitorEvm')
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request from flask import current_app, jsonify, request
from flask_restful import Resource from flask_restful import Resource
from flask_restful.reqparse import RequestParser from flask_restful.reqparse import RequestParser
...@@ -23,31 +26,29 @@ class AppResourceList(Resource): ...@@ -23,31 +26,29 @@ class AppResourceList(Resource):
json_payload = request.json json_payload = request.json
logger.warn(json_payload) logger.warn(json_payload)
data = getListAppSchema.load(json_payload) data = getListAppSchema.load(json_payload)
result = signalManager.actionGetListApp.emit(data) result, message = signalManager.actionGetListApp.emit(data)
json_dumps = getListAppSchema.dump(result) json_dumps = getListAppSchema.dump(result)
if result[0]: if result:
json_dumps = getListAppsSchema.dump(result[1]) json_dumps = getListAppsSchema.dump(result.items)
logger.warn(json_dumps) logger.warn(json_dumps)
return response_result(ResponseCode.OK, data=json_dumps, count=result[2]) return response_result(message, data=json_dumps, count=result.total)
return response_result(ResponseCode.REQUEST_ERROR) return response_result(message)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
def post(self): def post(self):
try: try:
json_payload = request.json json_payload = request.json
data = postAppSchema.load(json_payload) data = postAppSchema.load(json_payload)
result = signalManager.actionPostApp.emit(data) result, message = signalManager.actionPostApp.emit(data)
if result[0] == False: logger.info(result)
# json_dumps = postAppSchema.dump(result) logger.warn(message)
return response_result(ResponseCode.REQUEST_ERROR, msg=result[1]) return response_result(message)
logger.warn(result)
return response_result(ResponseCode.OK)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
class AppResource(Resource): class AppResource(Resource):
...@@ -67,14 +68,14 @@ class AppResource(Resource): ...@@ -67,14 +68,14 @@ class AppResource(Resource):
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload) print("========>", uuid, json_payload)
data = getAppSchema.load(json_payload) data = getAppSchema.load(json_payload)
result = signalManager.actionGetApp.emit(uuid, data) result, message = signalManager.actionGetApp.emit(uuid, data)
if result[0]: if result:
json_dumps = getAppSchema.dump(result[1]) json_dumps = getAppSchema.dump(result)
return response_result(ResponseCode.OK, data=json_dumps) return response_result(message, data=json_dumps)
return response_result(ResponseCode.NO_DATA) return response_result(message)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
...@@ -83,14 +84,13 @@ class AppResource(Resource): ...@@ -83,14 +84,13 @@ class AppResource(Resource):
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload) print("========>", uuid, json_payload)
data = putAppSchema.load(json_payload) data = putAppSchema.load(json_payload)
result = signalManager.actionPutApp.emit(uuid, data) result, message = signalManager.actionPutApp.emit(uuid, data)
if result[0] == True: logger.info(result)
# json_dumps = putAppSchema.dump(result) logger.info(message)
return response_result(ResponseCode.OK) return response_result(message, data=result)
return response_result(ResponseCode.NOTHING_CHANGE, msg=result[1])
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
...@@ -99,10 +99,8 @@ class AppResource(Resource): ...@@ -99,10 +99,8 @@ class AppResource(Resource):
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload) print("========>", uuid, json_payload)
# data = deleteAppSchema.load(json_payload) # data = deleteAppSchema.load(json_payload)
result = signalManager.actionDeleteApp.emit(uuid) result, message = signalManager.actionDeleteApp.emit(uuid)
if result[0] == True: return response_result(message, data=result)
return response_result(ResponseCode.OK)
return response_result(ResponseCode.REQUEST_ERROR, msg=result[1])
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
...@@ -28,11 +28,11 @@ class AreaResourceList(Resource): ...@@ -28,11 +28,11 @@ class AreaResourceList(Resource):
if result[0]: if result[0]:
json_dumps = getListAreasSchema.dump(result[1]) json_dumps = getListAreasSchema.dump(result[1])
logger.warn(json_dumps) logger.warn(json_dumps)
return response_result(ResponseCode.OK, data=json_dumps, count=result[2]) return response_result(ResponseCode.HTTP_SUCCESS, data=json_dumps, count=result[2])
return response_result(ResponseCode.REQUEST_ERROR) return response_result(ResponseCode.HTTP_INVAILD_REQUEST)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
def post(self): def post(self):
...@@ -42,12 +42,12 @@ class AreaResourceList(Resource): ...@@ -42,12 +42,12 @@ class AreaResourceList(Resource):
result = signalManager.actionPostArea.emit(data) result = signalManager.actionPostArea.emit(data)
if result[0] == False: if result[0] == False:
# json_dumps = postAreaSchema.dump(result) # json_dumps = postAreaSchema.dump(result)
return response_result(ResponseCode.REQUEST_ERROR, msg=result[1]) return response_result(ResponseCode.HTTP_INVAILD_REQUEST, msg=result[1])
logger.warn(result) logger.warn(result)
return response_result(ResponseCode.OK) return response_result(ResponseCode.HTTP_SUCCESS)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
class AreaResource(Resource): class AreaResource(Resource):
...@@ -70,11 +70,11 @@ class AreaResource(Resource): ...@@ -70,11 +70,11 @@ class AreaResource(Resource):
result = signalManager.actionGetArea.emit(uuid, data) result = signalManager.actionGetArea.emit(uuid, data)
if result[0]: if result[0]:
json_dumps = getAreaSchema.dump(result[1]) json_dumps = getAreaSchema.dump(result[1])
return response_result(ResponseCode.OK, data=json_dumps) return response_result(ResponseCode.HTTP_SUCCESS, data=json_dumps)
return response_result(ResponseCode.NO_DATA) return response_result(ResponseCode.HTTP_NOT_FOUND)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
...@@ -86,11 +86,11 @@ class AreaResource(Resource): ...@@ -86,11 +86,11 @@ class AreaResource(Resource):
result = signalManager.actionPutArea.emit(uuid, data) result = signalManager.actionPutArea.emit(uuid, data)
if result[0] == True: if result[0] == True:
# json_dumps = putAreaSchema.dump(result) # json_dumps = putAreaSchema.dump(result)
return response_result(ResponseCode.OK) return response_result(ResponseCode.HTTP_SUCCESS)
return response_result(ResponseCode.NOTHING_CHANGE, msg=result[1]) return response_result(ResponseCode.NOTHING_CHANGE, msg=result[1])
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
...@@ -101,8 +101,8 @@ class AreaResource(Resource): ...@@ -101,8 +101,8 @@ class AreaResource(Resource):
# data = deleteAreaSchema.load(json_payload) # data = deleteAreaSchema.load(json_payload)
result = signalManager.actionDeleteArea.emit(uuid) result = signalManager.actionDeleteArea.emit(uuid)
if result[0] == True: if result[0] == True:
return response_result(ResponseCode.OK) return response_result(ResponseCode.HTTP_SUCCESS)
return response_result(ResponseCode.REQUEST_ERROR, msg=result[1]) return response_result(ResponseCode.HTTP_INVAILD_REQUEST, msg=result[1])
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:10:44
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\login.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request from flask import current_app, jsonify, request
from flask_restful import Resource from flask_restful import Resource
from flask_restful.reqparse import RequestParser from flask_restful.reqparse import RequestParser
from flask_jwt_extended import ( jwt_required, get_jwt_identity ) from flask_jwt_extended import ( jwt_required, get_jwt_identity )
from marshmallow.exceptions import ValidationError
from application.signal_manager import signalManager from application.signal_manager import signalManager
from models.login import postLoginSchema, getListLoginSchema, getListLoginsSchema, getLoginSchema from models.login import postLoginSchema, getListLoginSchema, getListLoginsSchema, getLoginSchema
from webcreator.log import logger from webcreator.log import logger
...@@ -23,30 +35,37 @@ class LoginResourceList(Resource): ...@@ -23,30 +35,37 @@ class LoginResourceList(Resource):
json_payload = request.json json_payload = request.json
logger.warn(json_payload) logger.warn(json_payload)
data = getListLoginSchema.load(json_payload) data = getListLoginSchema.load(json_payload)
result = signalManager.actionGetListLogin.emit(data) result, message = signalManager.actionGetListLogin.emit(data)
json_dumps = getListLoginSchema.dump(result) json_dumps = getListLoginSchema.dump(result)
if result[0]: if result:
json_dumps = getListLoginsSchema.dump(result[1]) json_dumps = getListLoginsSchema.dump(result.items)
logger.warn(json_dumps) return response_result(message, data=json_dumps, count=result.total)
return response_result(ResponseCode.OK, data=json_dumps, count=result[2]) return response_result(message)
return response_result(ResponseCode.REQUEST_ERROR) except ValidationError as e:
return response_result(ResponseCode.HTTP_INVAILD_REQUEST, data=e.messages)
except Exception as e: except Exception as e:
data = None
if hasattr(e, 'args'):
data = e.args
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR, data=data)
def post(self): def post(self):
try: try:
json_payload = request.json json_payload = request.json
data = postLoginSchema.load(json_payload) data = postLoginSchema.load(json_payload)
result = signalManager.actionPostLogin.emit(data) # 更新data,插入ip信息,如果没有转发ip,那么则获取请求ip
if result[0] == False: data.update({ "ip": request.headers.get('X-Forwarded-For', request.remote_addr), "user_agent": request.headers.get('User-Agent', "") })
# json_dumps = postLoginSchema.dump(result) result, message = signalManager.actionPostLogin.emit(data)
return response_result(ResponseCode.REQUEST_ERROR, msg=result[1]) return response_result(message, data=result)
logger.warn(result) except ValidationError as e:
return response_result(ResponseCode.OK) return response_result(ResponseCode.HTTP_INVAILD_REQUEST, data=e.messages)
except Exception as e: except Exception as e:
data = None
if hasattr(e, 'args'):
data = e.args
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR, data=data)
class LoginResource(Resource): class LoginResource(Resource):
...@@ -66,11 +85,11 @@ class LoginResource(Resource): ...@@ -66,11 +85,11 @@ class LoginResource(Resource):
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload) print("========>", uuid, json_payload)
data = getLoginSchema.load(json_payload) data = getLoginSchema.load(json_payload)
result = signalManager.actionGetLogin.emit(uuid, data) result, message = signalManager.actionGetLogin.emit(uuid, data)
if result[0]: if result:
json_dumps = getLoginSchema.dump(result[1]) json_dumps = getLoginSchema.dump(result)
return response_result(ResponseCode.OK, data=json_dumps) return response_result(message, data=json_dumps)
return response_result(ResponseCode.NO_DATA) return response_result(message)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
'''
Author: your name
Date: 2021-06-30 18:03:41
LastEditTime: 2021-07-14 19:11:10
LastEditors: your name
Description: In User Settings Edit
FilePath: \evm-store\tools\build_out\views\package.py
'''
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request from flask import current_app, jsonify, request
from flask_restful import Resource from flask_restful import Resource
from flask_restful.reqparse import RequestParser from flask_restful.reqparse import RequestParser
...@@ -23,16 +34,16 @@ class PackageResourceList(Resource): ...@@ -23,16 +34,16 @@ class PackageResourceList(Resource):
json_payload = request.json json_payload = request.json
logger.warn(json_payload) logger.warn(json_payload)
data = getListPackageSchema.load(json_payload) data = getListPackageSchema.load(json_payload)
result = signalManager.actionGetListPackage.emit(data) result, message = signalManager.actionGetListPackage.emit(data)
json_dumps = getListPackageSchema.dump(result) json_dumps = getListPackageSchema.dump(result)
if result[0]: if result:
json_dumps = getListPackagesSchema.dump(result[1]) json_dumps = getListPackagesSchema.dump(result.items)
logger.warn(json_dumps) logger.warn(json_dumps)
return response_result(ResponseCode.OK, data=json_dumps, count=result[2]) return response_result(message, data=json_dumps, count=result.total)
return response_result(ResponseCode.REQUEST_ERROR) return response_result(message)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
class PackageResource(Resource): class PackageResource(Resource):
def __init__(self): def __init__(self):
...@@ -51,11 +62,11 @@ class PackageResource(Resource): ...@@ -51,11 +62,11 @@ class PackageResource(Resource):
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload) print("========>", uuid, json_payload)
data = getPackageSchema.load(json_payload) data = getPackageSchema.load(json_payload)
result = signalManager.actionGetPackage.emit(uuid, data) result, message = signalManager.actionGetPackage.emit(uuid, data)
if result[0]: if result:
json_dumps = getPackageSchema.dump(result[1]) json_dumps = getPackageSchema.dump(result)
return response_result(ResponseCode.OK, data=json_dumps) return response_result(message, data=json_dumps)
return response_result(ResponseCode.NO_DATA) return response_result(message)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
#!/usr/bin/env python
# -*- coding: utf_8 -*-
from flask import current_app, jsonify, request from flask import current_app, jsonify, request
from flask_restful import Resource from flask_restful import Resource
from flask_restful.reqparse import RequestParser from flask_restful.reqparse import RequestParser
...@@ -23,31 +26,28 @@ class UserResourceList(Resource): ...@@ -23,31 +26,28 @@ class UserResourceList(Resource):
json_payload = request.json json_payload = request.json
logger.warn(json_payload) logger.warn(json_payload)
data = getListUserSchema.load(json_payload) data = getListUserSchema.load(json_payload)
result = signalManager.actionGetListUser.emit(data) result, message = signalManager.actionGetListUser.emit(data)
json_dumps = getListUserSchema.dump(result) json_dumps = getListUserSchema.dump(result)
if result[0]: if result:
json_dumps = getListUsersSchema.dump(result[1]) json_dumps = getListUsersSchema.dump(result.items)
logger.warn(json_dumps) logger.warn(json_dumps)
return response_result(ResponseCode.OK, data=json_dumps, count=result[2]) return response_result(message, data=json_dumps, count=result.total)
return response_result(ResponseCode.REQUEST_ERROR) return response_result(message)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"])
def post(self): def post(self):
try: try:
json_payload = request.json json_payload = request.json
data = postUserSchema.load(json_payload) data = postUserSchema.load(json_payload)
result = signalManager.actionPostUser.emit(data) result, message = signalManager.actionPostUser.emit(data)
if result[0] == False: logger.info(result)
# json_dumps = postUserSchema.dump(result) logger.warn(message)
return response_result(ResponseCode.REQUEST_ERROR, msg=result[1]) return response_result(message)
logger.warn(result)
return response_result(ResponseCode.OK)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
class UserResource(Resource): class UserResource(Resource):
...@@ -67,30 +67,26 @@ class UserResource(Resource): ...@@ -67,30 +67,26 @@ class UserResource(Resource):
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload) print("========>", uuid, json_payload)
data = getUserSchema.load(json_payload) data = getUserSchema.load(json_payload)
result = signalManager.actionGetUser.emit(uuid, data) result, message = signalManager.actionGetUser.emit(uuid, data)
if result[0]: if result:
json_dumps = getUserSchema.dump(result[1]) json_dumps = getUserSchema.dump(result)
return response_result(ResponseCode.OK, data=json_dumps) return response_result(message, data=json_dumps)
return response_result(ResponseCode.NO_DATA) return response_result(message)
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
def put(self, uuid): def put(self, uuid):
try: try:
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload)
data = putUserSchema.load(json_payload) data = putUserSchema.load(json_payload)
result = signalManager.actionPutUser.emit(uuid, data) result, message = signalManager.actionPutUser.emit(uuid, data)
if result[0] == True: return response_result(message, data=result)
# json_dumps = putUserSchema.dump(result)
return response_result(ResponseCode.OK)
return response_result(ResponseCode.NOTHING_CHANGE, msg=result[1])
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
@jwt_required(locations=["headers"]) @jwt_required(locations=["headers"])
...@@ -99,10 +95,8 @@ class UserResource(Resource): ...@@ -99,10 +95,8 @@ class UserResource(Resource):
json_payload = request.json json_payload = request.json
print("========>", uuid, json_payload) print("========>", uuid, json_payload)
# data = deleteUserSchema.load(json_payload) # data = deleteUserSchema.load(json_payload)
result = signalManager.actionDeleteUser.emit(uuid) result, message = signalManager.actionDeleteUser.emit(uuid)
if result[0] == True: return response_result(message, data=result)
return response_result(ResponseCode.OK)
return response_result(ResponseCode.REQUEST_ERROR, msg=result[1])
except Exception as e: except Exception as e:
current_app.logger.error(e) current_app.logger.error(e)
return response_result(ResponseCode.DB_ERROR) return response_result(ResponseCode.HTTP_SERVER_ERROR)
...@@ -8,10 +8,6 @@ FilePath: \evm-store\tools\resources\webcreator\event.py ...@@ -8,10 +8,6 @@ FilePath: \evm-store\tools\resources\webcreator\event.py
''' '''
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
############################
# 信号槽
############################
class PySignal(object): class PySignal(object):
""" """
Simple event class used to provide hooks for different types of events in Locust. Simple event class used to provide hooks for different types of events in Locust.
......
...@@ -8,11 +8,6 @@ FilePath: \evm-store\tools\resources\webcreator\log.py ...@@ -8,11 +8,6 @@ FilePath: \evm-store\tools\resources\webcreator\log.py
''' '''
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
############################
# Log
# 日志
############################
import os import os
import logging import logging
from logging.handlers import RotatingFileHandler from logging.handlers import RotatingFileHandler
......
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
############################ '''
# Response 请求方法:
# 响应 OPTION : 用于获取资源支持的所有 HTTP 方法
############################
HEAD : 用于只获取请求某个资源返回的头信息
GET : 用于从服务器获取资源信息
完成请求后返回状态码 200 OK
POST : 用于创建新资源
创建完成后返回状态码 201 Created
PUT : 用于完整的替换资源或者创建指定身份的资源
如果是创建了资源,则返回 201 Created
如果是替换了资源,则返回 200 OK
DELETE : 用于删除某个资源
完成请求后返回状态码 204 No Content
PATCH : 用于局部更新资源
完成请求后返回状态码 200 OK
================================================================================
状态码:
请求成功
200:请求执行成功并返回相应数据
201:创建成功并返回相应资源数据
202:接受请求,但无法立即完成创建行为
204:请求执行成功,不返回相应资源数据
重定向
301:被请求的资源已永久移动到新位置
302:请求的资源现在临时从不通的URI响应请求
303:对应当前请求的响应可以在另一个 URI 上被找到,客户端应该使用 GET 方法进行请求
307:对应当前请求的响应可以在另一个 URI 上被找到,客户端应该保持原有的请求方法进行请求
条件请求
304:资源自从上次请求后没有再次发生变化,主要使用场景在于实现数据缓存
409:请求操作和资源的当前状态存在冲突。主要使用场景在于实现并发控制
412:服务器在验证请求的头字段中给出先决条件时,没能满足其中的一个或多个。主要使用场景在于实现并发控制
客户端错误
400 : 请求体包含语法错误
401 : 需要验证用户身份
403 : 服务器拒绝执行
404 : 找不到目标资源
405 : 不允许执行目标方法,响应中应该带有 Allow 头,内容为对该资源有效的 HTTP 方法
406 : 服务器不支持客户端请求的内容格式
410 : 被请求的资源已被删除
413 : POST 或者 PUT 请求的消息实体过大
415 : 服务器不支持请求中提交的数据的格式
422 : 请求格式正确,但是由于含有语义错误,无法响应
428 : 要求先决条件,如果想要请求能成功必须满足一些预设的条件要求先决条件
服务端错误
500 : 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理
502 : 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应
501 : 服务器不支持当前请求所需要的某个功能
503 : 由于临时的服务器维护或者过载,服务器当前无法处理请求
'''
class ResponseCode(object): class ResponseCode(object):
OK = (200, 'ok') # 通用状态码
NO_DATA = (204, 'no data') HTTP_SUCCESS = (200, "success")
NOT_FOUND = (404, 'not found') HTTP_NO_DATA = (204, "no data")
NOTHING_CHANGE = (304, 'nothing change') HTTP_NO_CHANGE = (304, 'nothing change')
REQUEST_ERROR = (400, 'request error') HTTP_AUTH_FAIL = (401, 'authentication failed')
AUTHORIZATION_ERROR = (401, 'authentication error') HTTP_INVAILD_REQUEST = (403, 'invaild request')
INVAILD_REQUEST = (403, 'invaild request') HTTP_NOT_FOUND = (404, "not found")
PARAMETER_ERROR = (4001, 'parameter error') HTTP_SERVER_ERROR = (500, "server error")
PARAMETER_NULL = (4002, 'parameter is null')
PASSWORD_ERROR = (4003, 'password error')
EXISTS_ERROR = (4004, 'record exists') # 用户模块
INVAILD_ROLE_ERROR = (4005, 'invaild role error') USER_NOT_EXISTS = (1010001, 'user not exists')
ACCOUNT_DISABLED = (4006, 'account is disabled') USER_EXISTS = (1010002, 'user already exists')
SERVER_ERROR = (500, 'server error') USER_PASSWORD_ERROR = (1010003, 'password error')
DB_ERROR = (5001, 'database error')
UNKNOWN_ERROR = (5003, 'unknown error')
def response_result(response, msg=None, data=None, **kwargs):
def response_result(code, msg=None, data=None, **kwargs): c, m = response
if msg is None: if msg == None:
msg = code[1] msg = m
result = { 'code': code[0], 'msg': msg, 'data': data }
result = { 'code': c, 'msg': msg, 'data': data }
result.update(kwargs) result.update(kwargs)
return result return result
...@@ -13,6 +13,154 @@ from typing import ( ...@@ -13,6 +13,154 @@ from typing import (
Sequence, Sequence,
) )
#!/usr/bin/env python
# -*- coding: utf_8 -*-
import shutil
import time
import re
import os
import json
import functools
import hashlib
import random
import string
import datetime
import threading
import decimal
import urllib
from urllib import parse, request
from urllib.parse import urlparse, urljoin, urlencode
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return float(o)
super(DecimalEncoder, self).default(o)
def ThreadMaker(f):
def runner(*args, **argv):
t = threading.Thread(target=f, args=args, kwargs=argv)
t.start()
return t
return runner
def copytree(src, dst, symlinks=False, ignore=None):
names = os.listdir(src)
if ignore is not None:
ignored_names = ignore
else:
ignored_names = set()
if not os.path.exists(dst):
os.makedirs(dst)
errors = []
for name in names:
if name in ignored_names:
continue
if re.match(r'.*?.pyc$', name):
continue
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks, ignore)
else:
shutil.copy2(srcname, dstname)
# XXX What about devices, sockets etc.?
except (IOError, os.error) as why:
errors.append((srcname, dstname, str(why)))
# catch the Error from the recursive copytree so that we can
# continue with other files
except Exception as e:
errors.extend(e.args[0])
try:
shutil.copystat(src, dst)
except WindowsError:
# can't copy file access times on Windows
pass
except OSError as why:
errors.extend((src, dst, str(why)))
if errors:
raise Exception(errors)
def timing(f):
@functools.wraps(f)
def inner(*args, **kwargs):
startTime = time.time()
f(*args, **kwargs)
print("[function]: %s [finished in]: %fs" %
(f.__name__, time.time()-startTime))
return inner
def timeToSeconds(t, sep=":"):
if t == "":
t = "0:0:0"
ts = [int(i) for i in t.split(sep)]
return ts[0] * 60 * 60 + ts[1] * 60 + ts[2]
def secondsToTime(seconds, sep=":"):
h = seconds / 3600
m = seconds % 3600 / 60
s = (seconds - h * 3600 - m * 60) % 60
return sep.join([str(i) for i in [h, m, s]])
def md5_encryption(s):
md5 = hashlib.md5("EhuqUkwV".encode("utf-8"))
md5.update(s.encode('utf-8'))
return md5.hexdigest()
def filter_dict(source: dict, rules_list: list):
# 如果source中的词典数量过多,请使用itertools模块的ifilter。 它会返回一个迭代器,而不是立即用整个列表填充系统的内存
result = dict()
# res = [d for d in source.keys() if d in rules_list]
# res = list(filter(lambda d: d in rules_list, source.keys()))
for k in source.keys():
if k in rules_list:
result.update(k, source[k])
return result
def get_location_by_ip(ip):
params = { 'ak': 'aZEAgYG8wKuLd6DS9BmCloGtfnGGkRMn', 'coor': 'bd09ll' }
parameters = urllib.parse.urlencode(params)
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko' }
if ip != '127.0.0.1':
params.update({ 'ip': ip })
parameters = urllib.parse.urlencode(params)
url = 'http://api.map.baidu.com/location/ip'
req = request.Request(url='%s%s%s' % (url, '?', parameters), headers=headers)
ret = request.urlopen(req).read()
jsonData = json.loads(ret)
print("=====>", jsonData)
return jsonData
def sql_filter(sql):
return re.sub(r"[\"\\/*\'=\-#;<>+%$()!@]", "", sql)
def random_string(length=32):
return ''.join(random.sample(string.ascii_letters + string.digits, length))
def get_days_before_datetime(dt, dayAgo):
if not isinstance(dt, datetime.datetime):
dt = datetime.datetime.strptime(dt, "%Y-%m-%d %H:%M:%S")
# 先获得时间数组格式的日期
dayAgo = (dt - datetime.timedelta(days = dayAgo))
# 转换为其他字符串格式
return dayAgo.strftime("%Y-%m-%d %H:%M:%S")
class Klass: class Klass:
def __init__(self): def __init__(self):
pass pass
...@@ -38,3 +186,6 @@ class ObjectDict(Dict[str, Any]): ...@@ -38,3 +186,6 @@ class ObjectDict(Dict[str, Any]):
if __name__ == "__main__": if __name__ == "__main__":
d = { 'a': 1, 'b': 2 } d = { 'a': 1, 'b': 2 }
print(dict2obj(d)) print(dict2obj(d))
print(os.path.abspath(__file__))
print(random_string(7))
This diff is collapsed.
This diff is collapsed.
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
"codemirror": "^5.59.2", "codemirror": "^5.59.2",
"core-js": "^3.9.0", "core-js": "^3.9.0",
"cropperjs": "^1.5.11", "cropperjs": "^1.5.11",
"eslint": "^7.30.0",
"npm-check-updates": "^11.7.1", "npm-check-updates": "^11.7.1",
"numeral": "^2.0.6", "numeral": "^2.0.6",
"plyr": "^3.6.4", "plyr": "^3.6.4",
...@@ -30,6 +31,7 @@ ...@@ -30,6 +31,7 @@
"@vue/cli-plugin-eslint": "^3.0.3", "@vue/cli-plugin-eslint": "^3.0.3",
"@vue/cli-service": "^3.0.3", "@vue/cli-service": "^3.0.3",
"babel-plugin-import": "^1.9.1", "babel-plugin-import": "^1.9.1",
"eslint-plugin-vue": "^7.13.0",
"less": "^3.8.1", "less": "^3.8.1",
"less-loader": "^4.1.0", "less-loader": "^4.1.0",
"node-sass": "^4.14.1", "node-sass": "^4.14.1",
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
</template> </template>
<script> <script>
import { LocaleProvider, ConfigProvider } from "ant-design-vue"; import { LocaleProvider, ConfigProvider, Input } from "ant-design-vue";
export default { export default {
components: { components: {
LocaleProvider, LocaleProvider,
......
...@@ -39,6 +39,7 @@ export default { ...@@ -39,6 +39,7 @@ export default {
'menu.account.trigger': 'Trigger Error', 'menu.account.trigger': 'Trigger Error',
//--- //---
'menu.system': '系统管理', 'menu.system': '系统管理',
'menu.system.index': '系统管理',
'menu.system.setting': '系统设置', 'menu.system.setting': '系统设置',
'menu.system.setting.menu': '菜单管理', 'menu.system.setting.menu': '菜单管理',
'menu.system.setting.module': '模块管理', 'menu.system.setting.module': '模块管理',
...@@ -47,6 +48,9 @@ export default { ...@@ -47,6 +48,9 @@ export default {
'menu.system.setting.area': '行政区划', 'menu.system.setting.area': '行政区划',
'menu.system.role': '权限管理', 'menu.system.role': '权限管理',
'menu.system.admin': '系统管理员', 'menu.system.admin': '系统管理员',
'menu.application': '应用管理',
'menu.application.index': '应用列表',
'menu.application.manager': '应用打包',
//--- //---
'app.home.introduce': 'introduce', 'app.home.introduce': 'introduce',
'app.analysis.test': 'Gongzhuan No.{no} shop', 'app.analysis.test': 'Gongzhuan No.{no} shop',
......
...@@ -40,6 +40,7 @@ export default { ...@@ -40,6 +40,7 @@ export default {
'menu.account.trigger': '触发报错', 'menu.account.trigger': '触发报错',
//--- //---
'menu.system': '系统管理', 'menu.system': '系统管理',
'menu.system.index': '系统管理',
'menu.system.setting': '系统设置', 'menu.system.setting': '系统设置',
'menu.system.setting.menu': '菜单管理', 'menu.system.setting.menu': '菜单管理',
'menu.system.setting.module': '模块管理', 'menu.system.setting.module': '模块管理',
...@@ -49,6 +50,9 @@ export default { ...@@ -49,6 +50,9 @@ export default {
'menu.system.setting.file-manager': '文件管理', 'menu.system.setting.file-manager': '文件管理',
'menu.system.role': '权限管理', 'menu.system.role': '权限管理',
'menu.system.admin': '系统管理员', 'menu.system.admin': '系统管理员',
'menu.application': '应用管理',
'menu.application.index': '应用列表',
'menu.application.manager': '应用打包',
//--- //---
'app.home.introduce': '介绍', 'app.home.introduce': '介绍',
'app.analysis.test': '工专路 {no} 号店', 'app.analysis.test': '工专路 {no} 号店',
......
...@@ -37,61 +37,61 @@ const router = new Router({ ...@@ -37,61 +37,61 @@ const router = new Router({
{ path: '/dashboard/workplace', name: 'workplace', component: () => import('@/views/Dashboard/Workplace') }, { path: '/dashboard/workplace', name: 'workplace', component: () => import('@/views/Dashboard/Workplace') },
] ]
}, },
// { {
// path: '/form', path: '/form',
// name: 'form', name: 'form',
// icon: 'form', icon: 'form',
// component: BlankLayout, component: BlankLayout,
// children: [ children: [
// { path: '/form/basic-form', name: 'basicform', component: () => import('@/views/Dashboard/Analysis') }, { path: '/form/basic-form', name: 'basicform', component: () => import('@/views/Dashboard/Analysis') },
// { {
// path: '/form/step-form', path: '/form/step-form',
// name: 'stepform', name: 'stepform',
// component: BlankLayout, component: BlankLayout,
// hideChildrenInMenu: true, hideChildrenInMenu: true,
// children: [ children: [
// { {
// path: '/form/step-form/info', path: '/form/step-form/info',
// name: 'info', name: 'info',
// component: () => import('@/views/Dashboard/Analysis'), component: () => import('@/views/Dashboard/Analysis'),
// }, },
// ] ]
// }, },
// { path: '/form/advanced-form', name: 'advancedform', component: () => import('@/views/Dashboard/Analysis') }, { path: '/form/advanced-form', name: 'advancedform', component: () => import('@/views/Dashboard/Analysis') },
// ] ]
// }, },
// { {
// path: '/list', path: '/list',
// icon: 'table', icon: 'table',
// name: 'list', name: 'list',
// component: BlankLayout, component: BlankLayout,
// children: [ children: [
// { {
// path: '/list/search', path: '/list/search',
// name: 'searchlist', name: 'searchlist',
// component: BlankLayout, component: BlankLayout,
// children: [ children: [
// { {
// path: '/list/search/articles', path: '/list/search/articles',
// name: 'articles', name: 'articles',
// }, },
// { {
// path: '/list/search/projects', path: '/list/search/projects',
// name: 'projects', name: 'projects',
// }, },
// { {
// path: '/list/search/applications', path: '/list/search/applications',
// name: 'applications', name: 'applications',
// }, },
// ] ]
// } }
// ] ]
// }, },
// { {
// path: '/profile', path: '/profile',
// icon: 'profile', icon: 'profile',
// name: 'profile', name: 'profile',
// }, },
{ {
path: '/system', path: '/system',
name: 'system', name: 'system',
...@@ -148,7 +148,19 @@ const router = new Router({ ...@@ -148,7 +148,19 @@ const router = new Router({
}, },
] ]
}, },
{
path: '/application',
icon: 'table',
name: 'application',
// redirect: '/application/index',
component: BasicLayout,
children: [
{ path: '/application', redirect: '/application/index' },
{ path: '/application/index', component: () => import('@/views/Application/Index') },
{ path: '/application/manager', component: () => import('@/views/Application/Manager') },
{ path: '/application/form', component: () => import('@/views/Application/Form') },
],
}
] ]
}) })
......
import { menuNav } from '@/api/menu' import { menuNav } from "@/api/menu";
//从服务端获取 //从服务端获取
const mock = [ const mock = [
{ {
"id": "1044886626813353984", id: "1044886626813353984",
"parentId": "0", parentId: "0",
"name": "dashboard", name: "dashboard",
"path": '/dashboard', path: "/dashboard",
"icon": 'dashboard', icon: "dashboard",
"leaf": false, leaf: false,
"children": [{ children: [
"id": "1044886629921333248", {
"parentId": "1044886626813353984", id: "1044886629921333248",
"name": "analysis", parentId: "1044886626813353984",
"path": '/dashboard/analysis', name: "analysis",
"leaf": true, path: "/dashboard/analysis",
"children": [] leaf: true,
},{ children: [],
"id": "1044886629921333248", },
"parentId": "1044886626813353984", {
"name": "workplace", id: "1044886629921333248",
"path": '/dashboard/workplace', parentId: "1044886626813353984",
"leaf": true, name: "workplace",
"children": [] path: "/dashboard/workplace",
}] leaf: true,
children: [],
},
],
},
{
id: "1044886626813353984",
parentId: "0",
name: "system",
path: "/system",
icon: "setting",
leaf: false,
children: [
{
id: "1044886629921333248",
parentId: "1044886626813353984",
name: "setting",
path: "/system/setting",
leaf: false,
children: [
{
id: "1044886630026190848",
parentId: "1044886629921333248",
name: "menu",
path: "/system/setting/menu",
leaf: true,
children: [],
},
{
id: "1044886630122659840",
parentId: "1044886629921333248",
name: "module",
path: "/system/setting/module",
leaf: true,
children: [],
},
{
id: "1044886630122659841",
parentId: "1044886629921333248",
name: "file-manager",
path: "/system/setting/file-manager",
leaf: true,
children: [],
},
],
}, },
{ {
"id": "1044886626813353984", id: "1044886629921333248",
"parentId": "0", parentId: "1044886626813353984",
"name": "system", name: "role",
"path": '/system', path: "/system/role",
"icon": 'setting', leaf: true,
"leaf": false, },
"children": [{ {
"id": "1044886629921333248", id: "1044886629921333248",
"parentId": "1044886626813353984", parentId: "1044886626813353984",
"name": "setting", name: "admin",
"path": "/system/setting", path: "/system/admin",
"leaf": false, leaf: true,
"children": [{ },
"id": "1044886630026190848", ],
"parentId": "1044886629921333248", },
"name": "menu", {
"path": "/system/setting/menu", id: "1044886626813353984",
"leaf": true, icon: 'table',
"children": [] parentId: "0",
}, { name: "application",
"id": "1044886630122659840", path: "/application",
"parentId": "1044886629921333248", leaf: false,
"name": "module", children: [
"path": "/system/setting/module", {
"leaf": true, id: "1044886629921333248",
"children": [] parentId: "1044886626813353984",
}, { name: "index",
"id": "1044886630122659841", path: "/application/index",
"parentId": "1044886629921333248", leaf: true,
"name": "file-manager", children: [],
"path": "/system/setting/file-manager", },
"leaf": true, {
"children": [] id: "1044886629921333248",
}] parentId: "1044886626813353984",
},{ name: "manager",
"id": "1044886629921333248", path: "/application/manager",
"parentId": "1044886626813353984", leaf: true,
"name": "role", children: [],
"path": "/system/role", },
"leaf": true, ],
},{ },
"id": "1044886629921333248", ];
"parentId": "1044886626813353984",
"name": "admin",
"path": "/system/admin",
"leaf": true,
}]
}]
const state = { const state = {
loading: false, loading: false,
menuNav: { menuNav: {
data: [] data: [],
} },
} };
const actions = { const actions = {
['getMenuNav']({ commit, state }, config) { ["getMenuNav"]({ commit, state }, config) {
state.loading = true state.loading = true;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
menuNav().then(response => { menuNav()
.then((response) => {
// console.log(mock); // console.log(mock);
commit('setMenuNav', mock) commit("setMenuNav", mock);
state.loading = false state.loading = false;
resolve() resolve();
}).catch(error => {
state.loading = false
reject(error)
})
}) })
.catch((error) => {
state.loading = false;
reject(error);
});
});
}, },
} };
const mutations = { const mutations = {
['setMenuNav'](state, payload) { ["setMenuNav"](state, payload) {
state.menuNav = { state.menuNav = {
data: payload data: payload,
} };
} },
} };
const getters = { const getters = {
['getMenuNav'](state) { ["getMenuNav"](state) {
return state.menuNav; return state.menuNav;
}, },
['loading'](state) { ["loading"](state) {
return state.loading; return state.loading;
}, },
} };
export default { export default {
namespaced: true, namespaced: true,
state, state,
actions, actions,
mutations, mutations,
getters getters,
} };
\ No newline at end of file
<template>
<a-card :body-style="{padding: '24px 32px'}" :bordered="false">
<a-form>
<a-form-item
label="标题"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
>
<a-input placeholder="给目标起个名字" />
</a-form-item>
<a-form-item
label="起止日期"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
>
<a-range-picker style="width: 100%" />
</a-form-item>
<a-form-item
label="目标描述"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
>
<a-textarea rows="4" placeholder="请输入你阶段性工作目标"/>
</a-form-item>
<a-form-item
label="衡量标准"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
>
<a-textarea rows="4" placeholder="请输入衡量标准"/>
</a-form-item>
<a-form-item
label="客户"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
:required="false"
>
<a-input placeholder="请描述你服务的客户,内部客户直接 @姓名/工号"/>
</a-form-item>
<a-form-item
label="邀评人"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
:required="false"
>
<a-input placeholder="请直接 @姓名/工号,最多可邀请 5 人"/>
</a-form-item>
<a-form-item
label="权重"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
:required="false"
>
<a-input-number :min="0" :max="100"/>
<span>%</span>
</a-form-item>
<a-form-item
label="目标公开"
:labelCol="{span: 7}"
:wrapperCol="{span: 10}"
:required="false"
help="客户、邀评人默认被分享"
>
<a-radio-group v-model="value">
<a-radio :value="1">公开</a-radio>
<a-radio :value="2">部分公开</a-radio>
<a-radio :value="3">不公开</a-radio>
</a-radio-group>
<a-select mode="multiple" v-if="value === 2">
<a-select-option value="4">同事甲</a-select-option>
<a-select-option value="5">同事乙</a-select-option>
<a-select-option value="6">同事丙</a-select-option>
</a-select>
</a-form-item>
<a-form-item style="margin-top: 24px" :wrapperCol="{span: 10, offset: 7}">
<a-button type="primary">提交</a-button>
<a-button style="margin-left: 8px">保存</a-button>
</a-form-item>
</a-form>
</a-card>
</template>
<script>
import {
Avatar,
Row,
Col,
Card,
List,
Button,
Form,
Icon,
Table,
Divider,
Dropdown,
Input,
Select,
Radio,
DatePicker,
InputNumber
} from "ant-design-vue";
import PageHeaderWrapper from "@/components/PageHeaderWrapper";
import DescriptionItem from "@/components/DescriptionItem";
export default {
name: 'BasicForm',
data () {
return {
value: 1
}
},
components: {
Icon,
ATextarea: Input.TextArea,
ARadio: Radio,
ARadioGroup: Radio.Group,
AInputNumber: InputNumber,
AAvatar: Avatar,
ARow: Row,
ACol: Col,
ACard: Card,
ACardGrid: Card.Grid,
ACardMeta: Card.Meta,
AList: List,
AButton: Button,
AForm: Form,
AFormItem: Form.Item,
AIcon: Icon,
ATable: Table,
ADivider: Divider,
ADropdown: Dropdown,
AInput: Input,
ASelect: Select,
AOption: Select.Option,
ADescriptionItem: DescriptionItem,
APageHeaderWrapper: PageHeaderWrapper,
ARangePicker: DatePicker.RangePicker,
},
computed: {
desc() {
return this.$t('pageDesc')
}
},
}
</script>
<style scoped>
</style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
module.exports = {
messages: {
CN: {
pageDesc:
"表单页用于向用户收集或验证信息,基础表单常见于数据项较少的表单场景。",
title: "标题",
titleInput: "给目标起个名字",
date: "起止日期",
describe: "目标描述",
describeInput: "请输入你阶段性工作目标",
metrics: "衡量标准",
metricsInput: "请输入衡量标准",
customer: "客户",
customerInput: "请描述你服务的客户,内部客户直接 @姓名/工号",
critics: "邀评人",
criticsInput: "请直接 @姓名/工号,最多可邀请 5 人",
weight: "权重",
disclosure: "目标公开",
disclosureDesc: "客户、邀评人默认被分享",
public: "公开",
partially: "部分公开",
private: "不公开",
submit: "提交",
save: "保存",
colleague1: "同事甲",
colleague2: "同事乙",
colleague3: "同事丙",
},
HK: {
pageDesc:
"表單頁用於向用戶收集或驗證信息,基礎表單常見於數據項較少的表單場景。",
title: "標題",
titleInput: "給目標起個名字",
date: "起止日期",
describe: "目標描述",
describeInput: "請輸入你階段性的工作目標",
metrics: "衡量標準",
metricsInput: "請輸入衡量標準",
customer: "客戶",
customerInput: "請描述你服務的客戶,內部客戶直接 @姓名/工號",
critics: "邀評人",
criticsInput: "請直接 @姓名/工號,最多可邀請 5 人",
weight: "圈中人",
disclosure: "目標公開",
disclosureDesc: "客戶、邀評人默認被分享",
public: "公開",
partially: "部分公開",
private: "不公開",
submit: "提交",
save: "保存",
colleague1: "同事甲",
colleague2: "同事乙",
colleague3: "同事丙",
},
US: {
pageDesc:
"Form pages are used to collect or verify information to users, and basic forms are common in scenarios where there are fewer data items.",
title: "Title",
titleInput: "Give the target a name",
date: "Start and end date",
describe: "Goal description",
describeInput: "Please enter your work goals",
metrics: "Metrics",
metricsInput: "Please enter a metric",
customer: "Customer",
customerInput:
"Please describe your customer service, internal customers directly @ Name / job number",
critics: "Inviting critics",
criticsInput:
"Please direct @ Name / job number, you can invite up to 5 people",
weight: "Weight",
disclosure: "Target disclosure",
disclosureDesc: "Customers and invitees are shared by default",
public: "Public",
partially: "Partially public",
private: "Private",
submit: "Submit",
save: "Save",
colleague1: "Colleague A",
colleague2: "Colleague B",
colleague3: "Colleague C",
},
},
};
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -8,10 +8,13 @@ FilePath: \evm-store\tools\resources\webcreator\event.py ...@@ -8,10 +8,13 @@ FilePath: \evm-store\tools\resources\webcreator\event.py
''' '''
# -*- coding: utf_8 -*- # -*- coding: utf_8 -*-
<<<<<<< HEAD
############################ ############################
# 信号槽 # 信号槽
############################ ############################
=======
>>>>>>> 68ec88f3f356b5c61817a0f9df8d40a3e46b4fd0
class PySignal(object): class PySignal(object):
""" """
Simple event class used to provide hooks for different types of events in Locust. Simple event class used to provide hooks for different types of events in Locust.
......
This diff is collapsed.
This diff is collapsed.
# -*- coding: utf-8 -*- #!/usr/bin/env python
# -*- coding: utf_8 -*-
import uuid import uuid
from datetime import datetime from datetime import datetime
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment