Browse Source

fix:温度上限300

master
guoapeng 2 months ago
parent
commit
8d83f24cdc
  1. 4
      src/app.vue
  2. 1
      src/assets/images/background.svg
  3. 6
      src/components/common/FTTable/index.vue
  4. 4
      src/components/home/SetTemperature/index.vue
  5. 4
      src/components/home/StartHeat/index.vue
  6. 174
      src/components/user/Edit/index.vue
  7. 15
      src/layouts/default.vue
  8. 280
      src/views/user/index.vue

4
src/app.vue

@ -9,13 +9,13 @@ onMounted(async () => {
const res = await getStatus() const res = await getStatus()
console.log(res) console.log(res)
console.log(systemStore.systemStatus) console.log(systemStore.systemStatus)
// systemStore.updateSystemStatus(res)
systemStore.updateSystemStatus(res)
startProgress() startProgress()
}) })
socket.init((data: System.SystemStatus) => { socket.init((data: System.SystemStatus) => {
console.log(data) console.log(data)
// systemStore.updateSystemStatus(data)
systemStore.updateSystemStatus(data)
}, 'status') }, 'status')
const progress = ref(0) const progress = ref(0)

1
src/assets/images/background.svg
File diff suppressed because it is too large
View File

6
src/components/common/FTTable/index.vue

@ -43,6 +43,7 @@ interface TableColumn {
width?: number // width?: number //
fixed?: 'left' | 'right' | undefined // fixed?: 'left' | 'right' | undefined //
render?: (row: any) => VNode // render?: (row: any) => VNode //
selectable?: (row: any) => boolean
} }
interface Btn { interface Btn {
@ -62,8 +63,8 @@ interface Search {
} }
interface TableProp { interface TableProp {
columns: TableColumn[]
getDataFn: (params: any) => Promise<any> //
columns?: TableColumn[]
getDataFn?: (params: any) => Promise<any> //
mustInit?: boolean // mountedgetDataFn mustInit?: boolean // mountedgetDataFn
hasHeader?: boolean hasHeader?: boolean
hasPage?: boolean hasPage?: boolean
@ -165,6 +166,7 @@ defineExpose({
:width="column.width" :width="column.width"
:type="column.type" :type="column.type"
:fixed="column.fixed" :fixed="column.fixed"
:selectable="column.selectable"
> >
<template v-if="column.render" #default="scope"> <template v-if="column.render" #default="scope">
<Expand :column="column" :row="scope.row" :render="column.render" :index="index" /> <Expand :column="column" :row="scope.row" :render="column.render" :index="index" />

4
src/components/home/SetTemperature/index.vue

@ -19,8 +19,8 @@ const validateHandle = (rule: any, value: any, callback: any) => {
if (!value) { if (!value) {
callback(new Error('请输入目标温度')) callback(new Error('请输入目标温度'))
} }
else if (value < 0 || value > 260) {
callback(new Error('目标温度范围0℃-260℃'))
else if (value < 0 || value > 300) {
callback(new Error('目标温度范围0℃-300℃'))
} }
else { else {
callback() callback()

4
src/components/home/StartHeat/index.vue

@ -22,8 +22,8 @@ const validateHandle = (rule: any, value: any, callback: any) => {
if (!value) { if (!value) {
callback(new Error('请输入目标温度')) callback(new Error('请输入目标温度'))
} }
else if (value < 0 || value > 260) {
callback(new Error('目标温度范围0℃-260℃'))
else if (value < 0 || value > 300) {
callback(new Error('目标温度范围0℃-300℃'))
} }
else { else {
callback() callback()

174
src/components/user/Edit/index.vue

@ -0,0 +1,174 @@
<script setup lang="ts">
import { addUser, updateUser } from 'apis/user'
import { FtMessage } from 'libs/message'
import { useSystemStore } from 'stores/systemStore'
import { onMounted, onUnmounted, ref } from 'vue'
const props = defineProps({
data: {
type: Object,
default: () => ({}),
},
})
const emits = defineEmits(['ok', 'cancel'])
onMounted(() => {
})
onUnmounted(() => {
})
const form = ref<User.User>(props.data.id ? props.data : {})
const formRef = ref()
const validateHandle = (rule: any, value: any, callback: any) => {
if (!value?.length) {
callback(new Error('请选择试管'))
}
else {
callback()
}
}
const passwordValidateHandle = (rule: any, value: any, callback: any) => {
if (!value) {
callback(new Error('请输入密码'))
}
else if (value.length > 6) {
callback(new Error('密码长度不能大于6个字符'))
}
else {
callback()
}
}
const passwordValidateHandle1 = (rule: any, value: any, callback: any) => {
console.log('passwordValidateHandle1', value)
if (!value) {
callback(new Error('请输入密码'))
}
else if (value !== form.value.password) {
callback(new Error('两次密码输入不一致'))
}
else {
callback()
}
}
const rules = {
username: [
{ required: true, message: '请输入账号', trigger: 'blur', validator: validateHandle },
],
nickname: [
{ required: false, message: '请输入用户名', trigger: 'blur' },
],
password: [
{ required: true, trigger: 'blur', validator: passwordValidateHandle },
],
passwordAgain: [
{ required: true, trigger: 'blur', validator: passwordValidateHandle1 },
],
}
const okHandle = async () => {
try {
const valid = await formRef.value.validate()
if (!valid) {
return
}
if (form.value.id) {
await updateUser(form.value)
}
else {
form.value.role = 'USER'
form.value.deleted = 'DISABLE'
await addUser(form.value)
}
FtMessage.success('保存成功')
emits('ok')
}
catch (e) {
console.log(e)
}
}
const cancel = () => {
emits('cancel')
}
</script>
<template>
<FtDialog visible :title="data.id ? '编辑用户' : '新增用户'" width="40%" :ok-handle="okHandle" @cancel="cancel">
<el-form ref="formRef" :model="form" :rules="rules" label-width="auto">
<el-form-item label="账号" prop="username">
<el-input v-model="form.username" maxlength="10" show-word-limit :disabled="data.id && form.fixedUser === 'ENABLE'" placeholder="请输入账号" />
</el-form-item>
<el-form-item label="用户名" prop="nickname">
<el-input v-model="form.nickname" maxlength="10" show-word-limit :disabled="data.id && form.fixedUser === 'ENABLE'" placeholder="请输入用户名" />
</el-form-item>
<el-form-item v-if="useSystemStore().systemStatus.currentUser?.fixedUser === 'ENABLE'" label="密码" prop="password">
<el-input v-model.number="form.password" maxlength="6" show-word-limit show-password type="password" placeholder="请输入密码" />
</el-form-item>
<el-form-item v-if="useSystemStore().systemStatus.currentUser?.fixedUser === 'ENABLE'" label="再次输入密码" prop="passwordAgain">
<el-input v-model.number="form.passwordAgain" maxlength="6" show-word-limit show-password type="password" placeholder="请输入密码" />
</el-form-item>
</el-form>
</FtDialog>
</template>
<style scoped lang="scss">
.el-tag {
margin-right: 5px;
}
.el-row {
height: 450px;
.el-col {
height: 100%;
overflow: auto;
:deep(.el-tag) {
width: 100%;
margin-bottom: 5px;
.el-tag__content {
display: flex;
width: 100%;
justify-content: space-between;
}
}
}
}
.tube-item {
padding: 5px;
background: #384D5D;
border-radius: 10px;
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(1, 1fr);
grid-gap: 5px;
position: relative;
.tube-line {
display: flex;
flex-direction: column;
.tube-line-inner {
display: inline-block;
width: 25px;
height: 25px;
border-radius: 50%;
background: #fff;
margin: 2px;
transition: background 0.5s;
}
}
.tube-line-disable {
.tube-line-inner {
background: #C6C6C6;
}
}
.tube-line-active {
.tube-line-inner {
background: #26D574;
}
}
}
</style>

15
src/layouts/default.vue

@ -22,10 +22,23 @@ watch(() => currentTime.value, () => {
systemStore.currentTime = currentTime.value systemStore.currentTime = currentTime.value
}) })
watch(() => systemStore.systemStatus, () => {
if (!systemStore.systemStatus.currentUser) {
router.push('/login')
}
if (!systemStore.systemStatus.selfTest && systemStore.systemStatus.currentUser && systemStore.systemStatus.currentUser?.username !== 'test') {
isCheck.value = true
}
})
onMounted(async () => { onMounted(async () => {
if (!systemStore.systemStatus.selfTest && systemStore.systemStatus.currentUser?.username !== 'test') {
if (!systemStore.systemStatus.selfTest && systemStore.systemStatus.currentUser && systemStore.systemStatus.currentUser?.username !== 'test') {
isCheck.value = true isCheck.value = true
} }
if (!systemStore.systemStatus.currentUser) {
console.log(11233)
await router.push('/login')
}
}) })
onUnmounted(() => { onUnmounted(() => {

280
src/views/user/index.vue

@ -1,223 +1,89 @@
<script lang="ts" setup>
import type { FormInstance } from 'element-plus'
import { addUser, delUser, updateUser, userList } from '@/apis/user'
import { ElMessage, ElMessageBox } from 'element-plus'
import { onMounted, ref } from 'vue'
<script setup lang="ts">
import { delUser, userList } from 'apis/user'
import Edit from 'components/user/Edit/index.vue'
import { ElMessageBox } from 'element-plus'
import { FtMessage } from 'libs/message'
import { cloneDeep } from 'lodash'
import { useSystemStore } from 'stores/systemStore'
import { useTemplateRef } from 'vue'
onMounted(() => {
queryUserList()
})
const userDataList = ref<User.User[]>([])
const visible = ref(false)
const userForm = ref<Record<string, string | number | boolean>>({})
const userFormRef = ref()
const queryUserList = () => {
const params = {
pageSize: 10,
pageNum: 1,
}
userList(params).then((res) => {
userDataList.value = res.list
})
}
const createUser = () => {
userForm.value = {}
visible.value = true
}
const editUser = () => {
if (!selectedList.value || !selectedList.value.length) {
ElMessage.warning('请选择一条数据进行编辑')
return
}
const userItem = selectedList.value[0]
userForm.value = {
username: userItem.username,
nickname: userItem.nickname,
deleted: userItem.deleted,
id: userItem.id,
isAdmin: userItem.role === 'ADMIN',
role: userItem.role,
}
visible.value = true
// updateUser()
}
const onDelUser = () => {
if (!selectedList.value.length) {
ElMessage.warning('请选择要删除的数据')
return
}
ElMessageBox.confirm(
'确认删除选中的数据吗?',
'确认提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
const systemStore = useSystemStore()
const btnList = systemStore.systemStatus.currentUser?.fixedUser === 'ENABLE'
? [
{
name: '新增',
type: 'primary',
serverUrl: 'add',
serverCondition: 0,
},
{
name: '编辑',
type: 'primary',
serverUrl: 'edit',
serverCondition: 1,
},
{
name: '删除',
type: 'danger',
serverUrl: 'del',
serverCondition: 2,
},
]
: []
const columns = [
{
type: 'selection',
selectable: (row: any) => {
return row.fixedUser !== 'ENABLE'
}, },
).then(() => {
const ids = selectedList.value.map(item => item.id)
delUser(ids.join(',')).then(() => {
ElMessage.success('删除成功')
queryUserList()
})
})
}
},
{
title: '账号',
key: 'username',
},
{
title: '用户名',
key: 'nickname',
},
]
const selectedList = ref<User.User[]>([])
const onSelectionChange = (rows: User.User[]) => {
selectedList.value = rows
}
const closeDialog = () => {
visible.value = false
}
const onConfirm = (formRef: FormInstance | undefined) => {
if (!formRef) {
return
}
formRef.validate((valid) => {
if (valid) {
if (userForm.value.id) {
doEdit()
}
else {
doSave()
}
}
else {
console.log('error submit!')
}
const tableRef = useTemplateRef('tableRef')
const del = async (selectedRows: any) => {
const ids = selectedRows.map((item: any) => item.id)
await ElMessageBox.confirm('确定删除当前选中的行?', '消息', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}) })
await delUser(ids)
FtMessage.success('删除成功')
tableRef.value?.initData()
} }
const doEdit = () => {
const { username, nickname, isAdmin, id } = userForm.value
const params = {
username: username as string,
nickname: nickname as string,
role: isAdmin ? 'ADMIN' : 'USER',
deleted: 'ENABLE',
id: id as number,
}
updateUser(params).then(() => {
ElMessage.success('保存成功')
queryUserList()
closeDialog()
})
const addVisible = ref(false)
const currentData = ref({})
const addHandle = () => {
currentData.value = {}
addVisible.value = true
} }
const doSave = () => {
const { username, nickname, password, confirmPassword, isAdmin } = userForm.value
if (password !== confirmPassword) {
ElMessage.error('两次输入的密码不一致')
return
}
const params: User.AddUser = {
username: username as string,
nickname: nickname as string,
password: password as string,
role: isAdmin ? 'ADMIN' : 'USER',
deleted: 'ENABLE',
}
addUser(params).then(() => {
ElMessage.success('保存成功')
queryUserList()
closeDialog()
})
const editHandle = (data: any) => {
currentData.value = cloneDeep(data[0])
console.log(currentData.value)
addVisible.value = true
} }
</script> </script>
<template> <template>
<div> <div>
<div>
<FtButton type="primary" @click="createUser">
添加用户
</FtButton>
<FtButton type="primary" @click="editUser">
编辑用户
</FtButton>
<FtButton @click="onDelUser">
删除用户
</FtButton>
</div>
<div>
<el-table :data="userDataList" stripe style="width: 100%" @selection-change="onSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column type="index" width="50" />
<el-table-column prop="username" label="登录名" />
<el-table-column prop="nickname" label="用户名" />
<!-- <el-table-column prop="fixedUser" label="状态"> -->
<!-- <template #default="scoped"> -->
<!-- <span v-if="scoped.row.deleted === 'ENABLE'">正常</span> -->
<!-- <span v-else>停用</span> -->
<!-- </template> -->
<!-- </el-table-column> -->
<el-table-column prop="createTime" label="创建时间" />
<el-table-column prop="updateTime" label="更新时间" />
</el-table>
</div>
<FtDialog v-model="visible" title="添加用户" width="30%" :ok-handle="() => { onConfirm(userFormRef) }" @cancel="closeDialog">
<div>
<el-form ref="userFormRef" :model="userForm" label-width="auto" style="max-width: 600px">
<el-form-item
label="登录名:"
prop="username"
:rules="[{
required: true,
message: '输入登录名',
trigger: ['blur', 'change'],
}]"
>
<el-input v-model="userForm.username" placeholder="登录名" />
</el-form-item>
<el-form-item
label="用户名:"
prop="nickname"
:rules="{
required: true,
message: '输入用户名',
trigger: 'blur',
}"
>
<el-input v-model="userForm.nickname" placeholder="用户名" />
</el-form-item>
<div v-if="!userForm.id">
<el-form-item
label="密码:"
prop="password"
:rules="{
required: true,
message: '输入密码',
trigger: 'blur',
}"
>
<el-input v-model="userForm.password" type="password" placeholder="密码" />
</el-form-item>
<el-form-item
label="确认密码:"
prop="confirmPassword"
:rules="{
required: true,
message: '输入密码',
trigger: 'blur',
}"
>
<el-input v-model="userForm.confirmPassword" type="password" placeholder="确认密码" />
</el-form-item>
</div>
<el-form-item
label="是否管理员:"
>
<el-checkbox v-model="userForm.isAdmin" size="small" />
</el-form-item>
</el-form>
</div>
</FtDialog>
<FtTable ref="tableRef" has-header has-page :columns="columns" :btn-list="btnList" :get-data-fn="userList" @add="addHandle" @edit="editHandle" @del="del" />
<Edit v-if="addVisible" :data="currentData" @ok="addVisible = false;tableRef?.initData()" @cancel="addVisible = false" />
</div> </div>
</template> </template>
<style lang="css" scoped>
.footer{
display: flex;
justify-content: center;
width: 35vw;
}
<style scoped lang="scss">
</style> </style>
Loading…
Cancel
Save