Compare commits

...

15 Commits
master ... znjj

  1. 4
      .env.development
  2. 10
      .env.production
  3. 2
      .env.staging
  4. 2
      package.json
  5. 2
      src/api/login.js
  6. 119
      src/api/school.js
  7. 4
      src/store/modules/permission.js
  8. 15
      src/store/modules/user.js
  9. 263
      src/views/index.vue
  10. 6
      src/views/login.vue
  11. 2
      src/views/register.vue
  12. 4
      vue.config.js

4
.env.development

@ -1,10 +1,10 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 智能化衣柜 VUE_APP_TITLE = 智能居家数据监护
# 开发环境配置 # 开发环境配置
ENV = 'development' ENV = 'development'
# 智能化衣柜/开发环境 # 智能居家数据监护/开发环境
VUE_APP_BASE_API = '/dev-api' VUE_APP_BASE_API = '/dev-api'
VUE_APP_IMG_URL = 'https://test.tall.wiki/commen/' VUE_APP_IMG_URL = 'https://test.tall.wiki/commen/'
VUE_APP_API_QZURL = 'https://test.tall.wiki/commen/' VUE_APP_API_QZURL = 'https://test.tall.wiki/commen/'

10
.env.production

@ -1,16 +1,16 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 智能化衣柜 VUE_APP_TITLE = 智能居家数据监护
# 生产环境配置 # 生产环境配置
NODE_ENV = 'production' NODE_ENV = 'production'
# 大唐 # 大唐
VUE_APP_BASE_API = '/commen_api/' VUE_APP_BASE_API = '/multimodal/'
VUE_APP_IMG_URL = '/commen_api/' VUE_APP_IMG_URL = '/multimodal/'
VUE_APP_API_QZURL = '/commen_api/' VUE_APP_API_QZURL = '/multimodal/'
# 访问路径 # 访问路径
VUE_APP_PUBLIC_PATH = '/commen/' VUE_APP_PUBLIC_PATH = '/multimodal_yf/safetySys/'

2
.env.staging

@ -1,5 +1,5 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 智能化衣柜 VUE_APP_TITLE = 智能居家数据监护
# 生产环境配置 # 生产环境配置
NODE_ENV = 'production' NODE_ENV = 'production'

2
package.json

@ -1,7 +1,7 @@
{ {
"name": "ruoyi", "name": "ruoyi",
"version": "3.8.9", "version": "3.8.9",
"description": "智能化衣柜", "description": "智能居家数据监护",
"author": "若依", "author": "若依",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {

2
src/api/login.js

@ -9,7 +9,7 @@ export function login(username, password, code, uuid) {
uuid, uuid,
}; };
return request({ return request({
url: "/login", url: "/app/user/login",
headers: { headers: {
isToken: false, isToken: false,
repeatSubmit: false, repeatSubmit: false,

119
src/api/school.js

@ -1,116 +1,41 @@
import request from "@/utils/request"; import request from "@/utils/request";
// ------ 教务处学校管理 ------ // 获取设备信息
export function attributes(data) {
// 学校列表
export function schoolList(data) {
return request({ return request({
url: "/school/list", url: "/app/device/attributes",
method: "post", method: "get",
data: data, params: data,
});
}
// 新增/修改学校
export function schoolAdd(data) {
return request({
url: "/school/add",
method: "post",
data: data,
});
}
// 新增/修改学校
export function schoolDel(data) {
return request({
url: "/school/del",
method: "post",
data: data,
}); });
} }
// 根据项目key查找项目id
// ------ 教务处评审管理 ------ export function queryProjectInfoByKey(data) {
// 评审列表
export function commentList(data) {
return request({ return request({
url: "/come/list", url: "/app/device/queryProjectInfoByKey",
method: "post", method: "get",
data: data, params: data,
});
}
// 评审详情
export function reviewDetails(data) {
return request({
url: "/come/detail",
method: "post",
data: data,
}); });
} }
// ------ 专家评审 ------ // 根据项目id查找设备列表
// 学校列表 export function deviceList(data) {
export function expertschoolist(data) {
return request({ return request({
url: "/expert/school/list", url: "/app/device/list",
method: "post", method: "get",
data: data, params: data,
}); });
} }
// 评审详情 // 下发属性
export function expertReviewDetails(data) { export function sendAttribute(data) {
return request({ return request({
url: "/expert/comment/list", url: "/app/device/sendAttribute",
method: "post", method: "post",
data: data, data: data,
}); });
} }
// 评审 // 下发命令
export function expertReviewAdd(data) { export function sendCommand(data) {
return request({ return request({
url: "/expert/comment/add", url: "/app/device/sendCommand",
method: "post", method: "post",
data: data, data: data,
}); });
} }
// ------ 分片相关接口 ------
// 校验文件是否已上传
export function register(data) {
return request({
url: "/mediaUpload/register",
method: "post",
data: data,
});
}
// 校验分片是否已上传
export function checkchunk(data) {
return request({
url: "/mediaUpload/checkchunk",
method: "post",
data: data,
});
}
// 循环上传分片
export function uploadchunk(data) {
return request({
url: "/mediaUpload/uploadchunk",
method: "post",
data: data,
headers: {
"Content-Type": "multipart/form-data",
},
});
}
// 合并分片
export function mergechunks(data) {
return request({
url: "/mediaUpload/mergechunks",
method: "post",
data: data,
});
}
// 合并后上传文件
export function addFile(data) {
return request({
url: "/netdisk/file/add",
method: "post",
data: data,
});
}

4
src/store/modules/permission.js

@ -34,8 +34,8 @@ const permission = {
return new Promise(resolve => { return new Promise(resolve => {
// 向后端请求路由数据 // 向后端请求路由数据
getRouters().then(res => { getRouters().then(res => {
const sdata = JSON.parse(JSON.stringify(res.data)) const sdata = JSON.parse(JSON.stringify([]))
const rdata = JSON.parse(JSON.stringify(res.data)) const rdata = JSON.parse(JSON.stringify([]))
const sidebarRoutes = filterAsyncRouter(sdata) const sidebarRoutes = filterAsyncRouter(sdata)
const rewriteRoutes = filterAsyncRouter(rdata, false, true) const rewriteRoutes = filterAsyncRouter(rdata, false, true)
const asyncRoutes = filterDynamicRoutes(dynamicRoutes); const asyncRoutes = filterDynamicRoutes(dynamicRoutes);

15
src/store/modules/user.js

@ -43,8 +43,10 @@ const user = {
const uuid = userInfo.uuid const uuid = userInfo.uuid
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
login(username, password, code, uuid).then(res => { login(username, password, code, uuid).then(res => {
setToken(res.token) console.log('res.data',res.data);
commit('SET_TOKEN', res.token)
setToken(res.data.token)
commit('SET_TOKEN', res.data.token)
resolve() resolve()
}).catch(error => { }).catch(error => {
reject(error) reject(error)
@ -56,14 +58,15 @@ const user = {
GetInfo({ commit, state }) { GetInfo({ commit, state }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getInfo().then(res => { getInfo().then(res => {
const user = res.user console.log('获取用户信息',res);
const user = res.data.user
let avatar = user.avatar || "" let avatar = user.avatar || ""
if (!isHttp(avatar)) { if (!isHttp(avatar)) {
avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar
} }
if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 if (res.data.roles && res.data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
commit('SET_ROLES', res.roles) commit('SET_ROLES', res.data.roles)
commit('SET_PERMISSIONS', res.permissions) commit('SET_PERMISSIONS', res.data.permissions)
} else { } else {
commit('SET_ROLES', ['ROLE_DEFAULT']) commit('SET_ROLES', ['ROLE_DEFAULT'])
} }

263
src/views/index.vue

@ -1,86 +1,243 @@
<template> <template>
<div style="padding: 16px"> <div style="padding: 16px;min-height: calc(100vh - 84px);display: flex; justify-content: center;align-items: center;">
<!-- <img src="./welcome.5e305008.png" style="" /> --> <div class="div-box">
<div class="div-box-title"> 智能居家数据监护 </div>
<div class="div-ul">
<div class="div-li">
<div>
<span>温度</span>{{ deviceInfo.temperature || '-' }}
</div>
<div> <span>湿度</span>{{ deviceInfo.humidity || '-' }}%
</div>
</div>
<!-- ON开启 OFF关闭 -->
<div class="div-li">
<div>
<span>CO</span>{{ deviceInfo.co || '-' }}PPM
</div>
<div>
<span>预警</span>
<el-switch disabled active-value="1" inactive-value="0" v-model="deviceInfo.warning" active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
</div>
</div>
</div>
<div class="div-tips"><span>阈值设定</span>{{ getThreshold() }} <i class="el-icon-edit"
style="color: rgb(64, 158, 255);margin-left: 4px;cursor: pointer;" @click="handleSettings"></i></div>
</div>
<!-- 添加或修改公告对话框 -->
<el-dialog title="阈值设定" :visible.sync="open" width="780px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="温度" prop="temperature">
<el-input v-model="form.temperature" placeholder="请输入温度" />
</el-form-item>
<el-form-item label="湿度" prop="humidity">
<el-input v-model="form.humidity" placeholder="请输入湿度" />
</el-form-item>
<el-form-item label="CO" prop="co">
<el-input v-model="form.co" placeholder="请输入CO" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="open = false"> </el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { queryProjectInfoByKey, deviceList, attributes, sendAttribute, sendCommand } from "@/api/school";
export default { export default {
name: "Index", name: "Index",
data() { data() {
return { return {
deviceId: "", // id
deviceInfo: {
temperature: 0, //
threshold: 0, //
},
open: false,
value2: false,
loading: false,
//
form: {},
//
rules: {
temperature: [
{ required: true, message: "温度不能为空", trigger: "blur" }
],
humidity: [
{ required: true, message: "湿度不能为空", trigger: "blur" }
],
co: [
{ required: true, message: "CO不能为空", trigger: "blur" }
],
},
// //
version: "3.8.9", version: "3.8.9",
}; };
}, },
created() {
this.getqueryProjectInfoByKey() // keyid
},
methods: { methods: {
goTarget(href) { //
window.open(href, "_blank"); handleSettings() {
this.open = true;
this.form = {
temperature: this.deviceInfo.temperature1, //
humidity: this.deviceInfo.humidity1, // 湿
co: this.deviceInfo.co1, // CO
};
// this.$message.success('');
},
// keyid
getqueryProjectInfoByKey() {
this.loading = true;
queryProjectInfoByKey({
projectKey: "qKStHKKt"
}).then(res => {
this.getDeviceList(res.data.id) // id
});
},
// id
getDeviceList(_id) {
deviceList({
projectId: _id
}).then(res => {
const w2Device = res.rows.find(device => device.deviceName === "S1");
this.deviceId = w2Device.id;
this.getAttributes(this.deviceId); // id
})
},
// id
getAttributes(_id) {
attributes({
deviceId: _id,
}).then(res => {
this.loading = false;
// deviceInfo
let deviceAttributesList = res.data.deviceAttributesList
//
let temperature = deviceAttributesList.find(row => row.id === 447247444691968)?.attributeValue;
let temperature1 = deviceAttributesList.find(row => row.id === 447247458859777)?.attributeValue;
// 湿湿
let humidity = deviceAttributesList.find(row => row.id === 447247449387520)?.attributeValue;
let humidity1 = deviceAttributesList.find(row => row.id === 447247458859778)?.attributeValue;
// COCO
let co = deviceAttributesList.find(row => row.id === 447247453780224)?.attributeValue;
let co1 = deviceAttributesList.find(row => row.id === 447247458859779)?.attributeValue;
//
let warning = deviceAttributesList.find(row => row.id === 447247458859776)?.attributeValue;
this.deviceInfo = {
temperature: temperature, //
temperature1: temperature1, //
humidity: humidity, // 湿
humidity1: humidity1, // 湿
co: co, // CO
co1: co1, // CO
warning: warning || 0, //
}
});
},
getThreshold() {
return `温度:${this.deviceInfo.temperature1 || '-'}℃ 湿度:${this.deviceInfo.humidity1 || '-'}% CO:${this.deviceInfo.co1 || '-'}PPM`;
},
/** 下发属性 */
submitForm: function () {
this.$refs["form"].validate(valid => {
if (valid) {
let attributeParams = {
temperature: this.form.temperature, //
humidity: this.form.humidity, // 湿
co: this.form.co, // CO
}
sendAttribute({
"attributeAndValues": [
{
"attributeIdentifier": "tempThreshold",
"attributeValue": this.form.temperature
},
{
"attributeIdentifier": "humiThreshold",
"attributeValue": this.form.humidity
},
{
"attributeIdentifier": "coThreshold",
"attributeValue": this.form.co
}
], // JSON
"deviceId": this.deviceId // id
}).then(response => {
this.getAttributes(this.deviceId); // id
this.$modal.msgSuccess("操作成功");
this.open = false;
});
}
});
}, },
}, },
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.home { .div-box {
blockquote { transform: scale(1.4);
padding: 10px 20px; width: 500px;
margin: 0 0 20px; box-sizing: border-box;
font-size: 17.5px; padding: 16px;
border-left: 5px solid #eee; border: 1px solid #ccc;
} border-radius: 10px;
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
}
.col-item {
margin-bottom: 20px;
}
ul { .div-box-title {
padding: 0; font-size: 20px;
margin: 0; font-weight: bold;
} margin-bottom: 20px;
text-align: center;
font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; border-bottom: 1px solid #ccc;
font-size: 13px; padding-bottom: 16px;
color: #676a6c;
overflow-x: hidden;
ul {
list-style-type: none;
} }
}
h4 { .div-ul {
margin-top: 0px; .div-li>div:nth-of-type(1) {
border-right: 1px solid #ccc;
margin-right: 16px;
} }
h2 { .div-li {
margin-top: 10px; font-size: 18px;
font-size: 26px; display: flex;
font-weight: 100; justify-content: space-between;
} margin-bottom: 12px;
p { div {
margin-top: 10px; flex: 1;
align-items: center;
}
b { span {
font-weight: 700; color: #666;
} }
} }
}
.update-log { .div-tips {
ol { font-size: 18px;
display: block; line-height: 22px;
list-style-type: decimal; display: flex;
margin-block-start: 1em; align-items: center;
margin-block-end: 1em;
margin-inline-start: 0; span {
margin-inline-end: 0; color: #666;
padding-inline-start: 40px;
}
} }
} }
</style> </style>

6
src/views/login.vue

@ -8,7 +8,7 @@
> >
<h3 class="title" style="margin-bottom: 0"> <h3 class="title" style="margin-bottom: 0">
</h3> </h3>
<h3 class="title">智能化衣柜</h3> <h3 class="title">智能居家数据监护</h3>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input
v-model="loginForm.username" v-model="loginForm.username"
@ -81,7 +81,7 @@
</el-form> </el-form>
<!-- 底部 --> <!-- 底部 -->
<div class="el-login-footer"> <div class="el-login-footer">
<div>山西经济管理干部学院教务部</div>
<div>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</div> <div>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</div>
</div> </div>
</div> </div>
@ -139,7 +139,7 @@ export default {
this.captchaEnabled = this.captchaEnabled =
res.captchaEnabled === undefined ? true : res.captchaEnabled; res.captchaEnabled === undefined ? true : res.captchaEnabled;
if (this.captchaEnabled) { if (this.captchaEnabled) {
this.codeUrl = "data:image/gif;base64," + res.img; this.codeUrl = "data:image/gif;base64," + res.data.img;
this.loginForm.uuid = res.uuid; this.loginForm.uuid = res.uuid;
} }
}); });

2
src/views/register.vue

@ -6,7 +6,7 @@
:rules="registerRules" :rules="registerRules"
class="register-form" class="register-form"
> >
<h3 class="title">智能化衣柜</h3> <h3 class="title">智能居家数据监护</h3>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input
v-model="registerForm.username" v-model="registerForm.username"

4
vue.config.js

@ -8,7 +8,7 @@ function resolve(dir) {
const CompressionPlugin = require("compression-webpack-plugin"); const CompressionPlugin = require("compression-webpack-plugin");
const name = const name =
process.env.VUE_APP_TITLE || "智能化衣柜"; // 网页标题 process.env.VUE_APP_TITLE || "智能居家数据监护"; // 网页标题
const port = process.env.port || process.env.npm_config_port || 80; // 端口 const port = process.env.port || process.env.npm_config_port || 80; // 端口
@ -40,7 +40,7 @@ module.exports = {
proxy: { proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
target: `https://test.tall.wiki/commen/`, target: `http://121.37.81.216/multimodal/`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
["^" + process.env.VUE_APP_BASE_API]: "", ["^" + process.env.VUE_APP_BASE_API]: "",

Loading…
Cancel
Save