Commit aa523ce2 by huangqy

通道改造

parent 8278ca65
......@@ -9,6 +9,7 @@
<script>
window._CONFIG = {};
window._CONFIG['publicURL'] = 'http://192.168.3.130:10030';
window._CONFIG['serverURL'] = 'http://192.168.3.130:10029';
window._CONFIG['wsURL'] = 'ws://192.168.3.130:10030/notice/'
</script>
<body>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -11,9 +11,10 @@
"dependencies": {
"@element-plus/icons": "^0.0.11",
"@element-plus/icons-vue": "^2.3.1",
"@kjgl77/datav-vue3": "^1.7.4",
"axios": "^1.2.1",
"consola": "^2.15.3",
"element-plus": "^2.2.32",
"element-plus": "^2.9.9",
"pinia": "^2.0.28",
"vite-plugin-style-import": "^2.0.0",
"vue": "^3.2.45",
......@@ -21,12 +22,12 @@
},
"devDependencies": {
"@vitejs/plugin-legacy": "^5.3.2",
"@vitejs/plugin-vue": "^4.0.0",
"@vitejs/plugin-vue": "^5.1.2",
"@vue/test-utils": "^2.2.6",
"jsdom": "^20.0.3",
"less": "^4.1.2",
"sass": "^1.58.3",
"vite": "^4.0.0",
"vite": "^5.4.0",
"vitest": "^0.25.6"
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
<script setup>
import WelcomeItem from './WelcomeItem.vue'
import DocumentationIcon from './icons/IconDocumentation.vue'
import ToolingIcon from './icons/IconTooling.vue'
import EcosystemIcon from './icons/IconEcosystem.vue'
import CommunityIcon from './icons/IconCommunity.vue'
import SupportIcon from './icons/IconSupport.vue'
</script>
<template>
<WelcomeItem>
<template #icon>
<DocumentationIcon />
</template>
<template #heading>Documentation</template>
Vue’s
<a href="https://vuejs.org/" target="_blank" rel="noopener">official documentation</a>
provides you with all information you need to get started.
</WelcomeItem>
<WelcomeItem>
<template #icon>
<ToolingIcon />
</template>
<template #heading>Tooling</template>
This project is served and bundled with
<a href="https://vitejs.dev/guide/features.html" target="_blank" rel="noopener">Vite</a>. The
recommended IDE setup is
<a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VSCode</a> +
<a href="https://github.com/johnsoncodehk/volar" target="_blank" rel="noopener">Volar</a>. If
you need to test your components and web pages, check out
<a href="https://www.cypress.io/" target="_blank" rel="noopener">Cypress</a> and
<a href="https://on.cypress.io/component" target="_blank">Cypress Component Testing</a>.
<br />
More instructions are available in <code>README.md</code>.
</WelcomeItem>
<WelcomeItem>
<template #icon>
<EcosystemIcon />
</template>
<template #heading>Ecosystem</template>
Get official tools and libraries for your project:
<a href="https://pinia.vuejs.org/" target="_blank" rel="noopener">Pinia</a>,
<a href="https://router.vuejs.org/" target="_blank" rel="noopener">Vue Router</a>,
<a href="https://test-utils.vuejs.org/" target="_blank" rel="noopener">Vue Test Utils</a>, and
<a href="https://github.com/vuejs/devtools" target="_blank" rel="noopener">Vue Dev Tools</a>. If
you need more resources, we suggest paying
<a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">Awesome Vue</a>
a visit.
</WelcomeItem>
<WelcomeItem>
<template #icon>
<CommunityIcon />
</template>
<template #heading>Community</template>
Got stuck? Ask your question on
<a href="https://chat.vuejs.org" target="_blank" rel="noopener">Vue Land</a>, our official
Discord server, or
<a href="https://stackoverflow.com/questions/tagged/vue.js" target="_blank" rel="noopener"
>StackOverflow</a
>. You should also subscribe to
<a href="https://news.vuejs.org" target="_blank" rel="noopener">our mailing list</a> and follow
the official
<a href="https://twitter.com/vuejs" target="_blank" rel="noopener">@vuejs</a>
twitter account for latest news in the Vue world.
</WelcomeItem>
<WelcomeItem>
<template #icon>
<SupportIcon />
</template>
<template #heading>Support Vue</template>
As an independent project, Vue relies on community backing for its sustainability. You can help
us by
<a href="https://vuejs.org/sponsor/" target="_blank" rel="noopener">becoming a sponsor</a>.
</WelcomeItem>
</template>
......@@ -5,7 +5,20 @@ const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '',
redirect: '/login',
},
{
path: '/',
redirect: '/login',
},
{
path: '/login',
name: 'login',
component: () => import('../views/Login.vue')
},
{
path: '/home',
name: 'home',
component: HomeView
},
......
......@@ -11,7 +11,17 @@ const request = axios.create({
})
axios.interceptors.request.use((request) => {
console.log(axios.interceptors.request)
axios.interceptors.request.use(request => {
// 给请求头添加一个名为Authorization的密匙
console.log('ssssssssssss',request, sessionStorage.getItem('token'))
if (sessionStorage.getItem('token')) {
request.headers['Authorization'] = sessionStorage.getItem('token')
} else {
if (request.url !== '/login') {
window.location.href = '/'
}
}
return request
})
......
......@@ -3,6 +3,38 @@
<el-tabs type="border-card">
<el-tab-pane>
<template #label>
<span class="card-title">数据同步</span>
</template>
<el-card style="height: calc(100vh - 227.75px)">
<el-row :gutter="20">
<el-col :span="6">
<el-card>
<template #header>数据导入</template>
<div style="display: flex;flex-direction: column;">
<el-upload
v-model:file-list="fileList"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
multiple
:limit="1"
:on-exceed="handleExceed">
<el-button type="primary" :icon="Upload" @click="handleExport('jcsj')" class="jp-button">基础信息</el-button>
</el-upload>
<el-button type="primary" :icon="Upload" @click="handleExport('djdr')" class="jp-button" style="margin-left: 0px;">单据导入</el-button>
<el-button type="primary" :icon="Delete" @click="handleDelete" class="jp-button" style="margin-left: 0px;">清除数据</el-button>
</div>
</el-card>
</el-col>
<el-col :span="18">
<el-card>
<template #header>数据导入历史信息</template>
</el-card>
</el-col>
</el-row>
</el-card>
</el-tab-pane>
<el-tab-pane>
<template #label>
<span class="card-title">系统配置</span>
</template>
<el-card style="height: calc(100vh - 227.75px)">
......@@ -22,11 +54,11 @@
</el-form-item>
</el-tooltip>
<el-form-item>
<el-button round type="primary" @click="resetConfig">读取</el-button>
<el-button round type="primary" @click="saveConfig" v-if="sysForm.id">保存</el-button>
<el-button round type="primary" @click="syncGoods">同步物资</el-button>
<el-button type="primary" @click="resetConfig">读取</el-button>
<el-button type="primary" @click="saveConfig" v-if="sysForm.id">保存</el-button>
<el-button type="primary" @click="syncGoods">同步物资</el-button>
<el-dropdown @command="handleCommand">
<span style="cursor: pointer; background: #67c23a;margin-left: 12px;">
<span :style="{ cursor: 'pointer', marginLeft: '12px', background: imgColor, borderRadius: '4px' }" >
<img src="../assets/icons/主题.png" style="width: 32px;">
</span>
<template #dropdown>
......@@ -123,7 +155,7 @@
</template>
<el-card style="height: calc(100vh - 227.75px)">
<div class="head-container">
<el-select v-model="form.stationId" @change="getLedConfigList">
<el-select v-model="form.stationId" @change="getLedConfigList" style="width: 200px">
<el-option :label="'通道' + item.stationId" :value="item.stationId" v-for="item in channelList" :key="item.stationId"></el-option>
</el-select>
<el-button class="filter-item" type="primary" style="float: right" @click="addLedConfig">新增</el-button>
......@@ -364,29 +396,29 @@
</el-form-item>
<el-form-item label="横向对齐方式" :rules="[{ required: true, message: '必填' }]">
<el-radio-group v-model="form.halign">
<el-radio :label="0">靠左</el-radio>
<el-radio :label="1">居中</el-radio>
<el-radio :label="2">靠右</el-radio>
<el-radio :value="0">靠左</el-radio>
<el-radio :value="1">居中</el-radio>
<el-radio :value="2">靠右</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="纵向对齐方式" :rules="[{ required: true, message: '必填' }]">
<el-radio-group v-model="form.valign">
<el-radio :label="0">靠上</el-radio>
<el-radio :label="1">居中</el-radio>
<el-radio :label="2">靠下</el-radio>
<el-radio :value="0">靠上</el-radio>
<el-radio :value="1">居中</el-radio>
<el-radio :value="2">靠下</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="自动换行" :rules="[{ required: true, message: '必填' }]">
<el-radio-group v-model="form.wordwrap">
<el-radio label="true">自动换行</el-radio>
<el-radio label="false">不自动换行</el-radio>
<el-radio value="true">自动换行</el-radio>
<el-radio value="false">不自动换行</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="发送方式" :rules="[{ required: true, message: '必填' }]">
<el-radio-group v-model="form.sendType">
<el-radio :label="0">标题</el-radio>
<el-radio :label="1">内容</el-radio>
<el-radio :label="2">报错</el-radio>
<el-radio :value="0">标题</el-radio>
<el-radio :value="1">内容</el-radio>
<el-radio :value="2">报错</el-radio>
</el-radio-group>
</el-form-item>
......@@ -427,9 +459,9 @@
</el-form-item>
<el-form-item label="引出方式" :rules="[{ required: true, message: '必填' }]">
<el-radio-group v-model="form.outmethod">
<el-radio :label="0">随机</el-radio>
<el-radio :label="1">始终显示</el-radio>
<el-radio :label="2">立即消失</el-radio>
<el-radio :value="0">随机</el-radio>
<el-radio :value="1">始终显示</el-radio>
<el-radio :value="2">立即消失</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="引出速度" :rules="[{ required: true, message: '必填' }]">
......@@ -437,8 +469,8 @@
</el-form-item>
<el-form-item label="停留方式" :rules="[{ required: true, message: '必填' }]">
<el-radio-group v-model="form.stopmethod">
<el-radio :label="0">静态显示</el-radio>
<el-radio :label="1">闪烁显示</el-radio>
<el-radio :value="0">静态显示</el-radio>
<el-radio :value="1">闪烁显示</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="停留速度" :rules="[{ required: true, message: '必填' }]">
......@@ -501,9 +533,10 @@
</template>
<script>
import { defineComponent, ref, getCurrentInstance, toRefs, reactive } from 'vue'
import { defineComponent, ref, getCurrentInstance, toRefs, reactive, onMounted } from 'vue'
import { postAction, getAction } from '@/api/manage'
import { ElMessage } from 'element-plus'
import { Upload, Delete } from '@element-plus/icons-vue'
export default defineComponent({
setup() {
const { proxy } = getCurrentInstance()
......@@ -521,6 +554,7 @@ export default defineComponent({
const form = ref({})
const ledConfigList = ref([])
const gpioConfigList = ref([])
const imgColor = ref('#1f8a36')
// ip正则表达式
function isIp(str) {
......@@ -538,6 +572,18 @@ export default defineComponent({
callback()
}
}
onMounted(() => {
if (sessionStorage.getItem('bgColor')) {
imgColor.value = sessionStorage.getItem('bgColor')
} else {
sessionStorage.setItem('bgColor', '#1f8a36')
}
});
// port校验
const validatePort = (rule, value, callback) => {
......@@ -612,6 +658,11 @@ export default defineComponent({
getGpioConfigList()
}
const handleExport = (type) => {
}
function getLedConfigList() {
postAction(state.url.getLedConfig, {stationId: form.value.stationId, storeCode: JSON.parse(sessionStorage.getItem('storeInfo')).storeCode}).then(res => {
if (res.code !== 99200) return ElMessage.error(res.message);
......@@ -894,6 +945,9 @@ export default defineComponent({
channelList,
ledConfigList,
gpioConfigList,
imgColor,
Upload,
Delete,
getLedConfigList,
editDevice,
......@@ -929,3 +983,13 @@ export default defineComponent({
},
})
</script>
<style scoped>
.jp-button {
height: 45px;
line-height: 45px;
font-size: 20px;
margin-bottom: 10px;
}
</style>
\ No newline at end of file
<template>
<div class="login_container" @keyup.enter="loginClick()" :style="{ background: 'url(' + loginBg + ') center/85%' }">
<BorderBox12
:color="['#fff', '#fff']"
style="
width: 450px;
height: 320px;
display: block;
float: right;
right: 38.2%;
top: 46%;
"
>
<span style="font-size: 26px;color: #fff;padding: 0px 172px;display: inline-block;margin-top: 20px;">用户登录</span>
<el-form
class="login_form"
:model="loginForm"
:rules="loginFormRules"
ref="loginFormRef"
size="large"
>
<el-form-item prop="account">
<el-input
v-model="loginForm.account"
style="width: 350px"
placeholder="请输入登录ID"
:prefix-icon="User"
>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
style="width: 350px"
type="password"
show-password
placeholder="请输入密码"
:prefix-icon="Unlock"
>
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" size="large" style="width: 350px;font-size: 14px;font-family: 'Microsoft YaHei';" @click="loginClick(loginFormRef)">登 录</el-button>
</el-form-item>
</el-form>
</BorderBox12>
<div class="footer">
<div class="copyright">
<center>v1.0.1</center>
</div>
</div>
</div>
</template>
<script setup>
import loginBg from "../assets/loginbg.png";
import { User, Unlock } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import { BorderBox12 } from '@kjgl77/datav-vue3';
import { ref } from 'vue'
import { postAction, getAction } from '@/api/manage'
import { useRouter } from "vue-router";
const router = useRouter();
const loginForm = ref({
account: "",
password: "",
})
const loginFormRef = ref();
const loginFormRules = ref({
// 用户名与密码的验证规则
account: [
{ required: true, message: "请输入登录名称", trigger: "blur" },
{
min: 1,
max: 12,
message: "长度在 1 到 12 个字符",
trigger: "blur",
},
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{
min: 1,
max: 22,
message: "长度在 1 到 22 个字符",
trigger: "blur",
},
],
})
// 登录
const loginClick = (formEl) => {
if (!formEl) return
formEl.validate(async (valid) => {
if (valid) {
const res = await postAction(window._CONFIG['serverURL'] + '/auth/login', loginForm.value)
if (res.code != 99200) return ElMessage.error(res.message);
sessionStorage.setItem("token", res.data.token);
goHome()
} else {
console.log('error submit!')
}
})
// this.$refs.loginFormRef.validate(async (flag) => {
// // 登录验证
// if (!flag) return;
// const { data: res } = await this.$axios.post(
// "/auth/login",
// this.loginForm
// );
// if (res.code != 99200) return this.$message.error(res.message);
// const token = res.data.token;
// sessionStorage.setItem("token", token);
// const userData = res.data.userInfo;
// sessionStorage.setItem("userData", JSON.stringify(userData));
// const storeList = res.data.storeList;
// sessionStorage.setItem("storeList", JSON.stringify(storeList));
// const storeCode = JSON.parse(sessionStorage.getItem("storeList"))[0];
// sessionStorage.setItem("storeCode", storeCode);
// const appList = res.data.appList;
// sessionStorage.setItem("appList", JSON.stringify(appList));
// if (appList.length < 1) return this.$message.warning("没有权限!");
// sessionStorage.setItem("appCode", appList[0]);
// const appCode = appList[0];
// const { data: menuRes } = await this.$axios.get(
// "/sysMenu/getLeftMenus",
// { params: { token, appCode } }
// );
// sessionStorage.setItem(
// "navList",
// JSON.stringify(menuRes.data[0].children)
// );
// this.goHome();
// });
}
// 跳转首页
const goHome = async() => {
router.push({path: '/home'})
}
</script>
<style scoped lang="less">
.login_container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
min-width: 1000px;
zoom: 1;
background-color: #fff;
background-size: cover;
-webkit-background-size: cover;
-o-background-size: cover;
background-position: center 0;
}
.login_font {
position: absolute;
z-index: 99999;
right: 30.875rem;
top: 25rem;
color: #fff;
}
.login_input {
position: absolute;
right: 0px;
width: 100%;
top: 16.94rem;
color: #fff;
}
.login_button {
position: absolute;
z-index: 9999;
right: 36.6875rem;
top: 31.5rem;
cursor: pointer;
font-size: 16px;
background-color: #fff;
}
.login_box {
width: 450px;
height: 400px;
background: #fff;
border-radius: 4px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
// border: 1px solid #000;
box-shadow: 0 0 6px #fff;
}
// 头像框
.avatar_box {
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
width: 130px;
height: 130px;
border: 1px solid #fff;
border-radius: 50%;
padding: 10px;
background: #fff;
box-shadow: 0 2px 6px #fff;
img {
width: 100%;
height: 100%;
border-radius: 50%;
background: #fff;
}
}
// 信息描述
.des_box {
position: absolute;
top: 200px;
left: 78%;
transform: translateX(-50%);
text-align: center;
user-select: none;
.title {
font-size: 24px;
font-weight: 700;
background: linear-gradient(to right, #fff, #fff);
transform: skewX(-15deg);
-webkit-background-clip: text;
color: transparent;
}
.banben {
padding: 7px;
color: #fff;
}
}
// 登录
.login_form {
width: 350px;
margin-left: 50px;
margin-top: 30px;
box-sizing: border-box;
}
.btns {
display: flex;
justify-content: flex-end;
}
i {
display: flex;
flex-flow: column nowrap;
justify-content: center;
height: 100%;
margin: 0 5px;
img {
width: 15px;
}
}
::v-deep .el-input__wrapper {
background: transparent;
color: #fff;
margin: 0;
}
::v-deep .el-input__prefix {
color: #fff;
}
::v-deep .el-input__inner {
color: #fff;
font-size: 18px;
}
.footer {
position: absolute;
width: 100%;
line-height: 20px;
bottom: 20px;
text-align: center;
color: #fff;
}
</style>
......@@ -9,9 +9,9 @@
<el-option :label="'单据号: ' + item" :value="item" v-for="item in temporaryList" :key="item"></el-option>
</el-select>
<el-radio-group v-model="type" size="large" @change="changeType" style="margin-left: auto;margin-right: 15px;">
<el-radio-button label="CANCEL">未激活</el-radio-button>
<el-radio-button label="IN">入库激活</el-radio-button>
<el-radio-button label="OUT">出库激活</el-radio-button>
<el-radio-button value="CANCEL" label="未激活"></el-radio-button>
<el-radio-button value="IN" label="入库激活"></el-radio-button>
<el-radio-button value="OUT" label="出库激活"></el-radio-button>
</el-radio-group>
<el-button round size="large" type="primary" @click="reportData">上报单据</el-button>
<el-button round size="large" type="warning" @click="clearData">清空数据</el-button>
......
......@@ -9,8 +9,8 @@
<el-col :span="6">
<el-card style="height: calc(100vh - 147px);">
<el-radio-group v-model="logType" label="日志类型" @change="changeType">
<el-radio-button label="normal">出入日志</el-radio-button>
<el-radio-button label="error">异常日志</el-radio-button>
<el-radio-button value="normal" label="出入日志"></el-radio-button>
<el-radio-button value="error" label="异常日志"></el-radio-button>
</el-radio-group>
<el-form label-position="left" size="large" label-width="80px" :model="formData" style="max-width: 460px;margin-top: 20px;">
<el-form-item label="开始时间">
......
......@@ -9,7 +9,7 @@ import legacy from '@vitejs/plugin-legacy'
// https://vitejs.dev/config/
export default defineConfig({
base: '', // 开发或生产环境服务的公共基础路径 配置引入相对路径
base: '/', // 开发或生产环境服务的公共基础路径 配置引入相对路径
server: {
// 是否自动打开浏览器
open: true,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论