| | |
| | | window.apiRoot = 'http://115.29.185.26:5101' |
| | | window.skinRoot = '/skin' |
| | | window.skinRoot = '/vue/skin' |
| | |
| | | </template> |
| | | </Menu> |
| | | </div> |
| | | <div class="view-wrap"> |
| | | <div class="navigator"> |
| | | <Tag |
| | | v-for="(view, index) in openedViewList" |
| | | :key="index" |
| | | type="dot" |
| | | :closable="openedViewList.length > 1" |
| | | :color="view.query.menuId == activeName ? 'primary' : ''" |
| | | @click="onMenuClick(view.query.menuId)" |
| | | @on-close="onMenuClose(index)" |
| | | >{{ view.title }}</Tag |
| | | > |
| | | </div> |
| | | <div class="view"> |
| | | <RouterView v-slot="{ Component }"> |
| | | <template v-if="Component"> |
| | |
| | | </KeepAlive> |
| | | </template> |
| | | </RouterView> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | logo: "data:image/png;base64,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", |
| | | avatar: "http://115.29.185.26:5101/userphoto?login=sa", |
| | | userName: "用户名", |
| | | openedViewList: [], |
| | | }; |
| | | }, |
| | | computed: { |
| | |
| | | this.refMenu.updateOpened(); |
| | | }); |
| | | |
| | | let menuTitle = this.viewList.find((v) => v.id == id)?.title; |
| | | |
| | | this.$router.push({ |
| | | name: route.name, |
| | | query: { |
| | | menuId: id, |
| | | }, |
| | | }); |
| | | if (!this.openedViewList.find((view) => view.query.menuId == id)) |
| | | this.openedViewList.push({ |
| | | name: route.name, |
| | | query: { |
| | | menuId: id, |
| | | }, |
| | | title: menuTitle, |
| | | }); |
| | | }, |
| | | onMenuClose(index) { |
| | | let nextId; |
| | | if (index > 0) nextId = this.openedViewList[index - 1].query.menuId; |
| | | else nextId = this.openedViewList[index + 1].query.menuId; |
| | | this.openedViewList.splice(index, 1); |
| | | this.onMenuClick(nextId); |
| | | }, |
| | | showError(ex) { |
| | | showError(this, ex); |
| | |
| | | display: none; |
| | | } |
| | | } |
| | | .view { |
| | | .view-wrap { |
| | | width: calc(100% - 240px); |
| | | height: 100%; |
| | | .navigator { |
| | | height: 40px; |
| | | padding: 0 9px; |
| | | background-color: #f1f1f1; |
| | | .ivu-tag { |
| | | margin-top: 4px; |
| | | margin-right: 9px; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | .view { |
| | | height: calc(100% - 40px); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | <div class="account-logo"> |
| | | <img src="http://115.29.185.26:5101/userphoto?login=sa" /> |
| | | </div> |
| | | <article class="ivu-typography ivu-text-center ivu-mt"> |
| | | <h1 class="ivu-typography">Vue Template<!----></h1> |
| | | <div class="ivu-typography"> |
| | | 基于 Vue3.0、VueRouter 和ViewUIPlus的管理系统模板演示 |
| | | <!----> |
| | | </div> |
| | | </article> |
| | | <Form |
| | | class="account-form" |
| | | :model="form" |
| | |
| | | label-position="top" |
| | | ref="refFormInline" |
| | | > |
| | | <div class="title">Vue仓库管理系统</div> |
| | | <div class="ivu-login"> |
| | | <FormItem prop="user"> |
| | | <Input |
| | | type="text" |
| | | v-model="form.user" |
| | | size="large" |
| | | prefix="ios-person-outline" |
| | | > |
| | | </Input> |
| | |
| | | <Input |
| | | type="password" |
| | | v-model="form.password" |
| | | size="large" |
| | | prefix="ios-lock-outline" |
| | | > |
| | | </Input> |
| | | </FormItem> |
| | | <FormItem> |
| | | <Button type="primary" @click="onSignIn" size="large" long |
| | | >登录</Button |
| | | > |
| | | <Button type="primary" @click="onSignIn" long>登录</Button> |
| | | </FormItem> |
| | | </div> |
| | | </Form> |
| | |
| | | background-image: url("../../assets/login_bg.png"); |
| | | background-attachment: fixed; |
| | | .login-wrap { |
| | | display: -webkit-box; |
| | | display: -ms-flexbox; |
| | | display: flex; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-box-direction: normal; |
| | | -ms-flex-direction: column; |
| | | flex-direction: column; |
| | | height: 100vh; |
| | | overflow: auto; |
| | | } |
| | | .login-account { |
| | | -webkit-box-flex: 1; |
| | | -ms-flex: 1; |
| | | flex: 1; |
| | | width: 280px; |
| | | padding: 16px 0 0; |
| | | max-width: 420px; |
| | | margin: 0 auto; |
| | | margin: 0 300px 0 auto; |
| | | margin-top: 100px; |
| | | } |
| | | .account-logo { |
| | |
| | | .account-form { |
| | | margin-top: 32px; |
| | | } |
| | | .title { |
| | | font-size: 30px; |
| | | text-align: center; |
| | | margin-bottom: 18px; |
| | | letter-spacing: 3px; |
| | | |
| | | font-weight: bold; |
| | | background: -webkit-linear-gradient(#009df4, #00e9cf); |
| | | -webkit-background-clip: text; |
| | | -webkit-text-fill-color: transparent; |
| | | background-clip: text; |
| | | color: transparent; |
| | | } |
| | | .ivu-login { |
| | | padding: 60px 30px 3px; |
| | | background-image: url("../../assets/account_bg.png"); |
| | | background-repeat: no-repeat; |
| | | background-size: 100% 100%; |
| | | background-position: right bottom; |
| | | } |
| | | .ivu-form-item { |
| | | margin-bottom: 24px; |
| | | vertical-align: top; |
| | | zoom: 1; |
| | | .ivu-icon { |
| | | color: #0ba1f8; |
| | | } |
| | | .ivu-input { |
| | | border: 2px solid #0ba1f8; |
| | | background-color: transparent; |
| | | color: #fff; |
| | | } |
| | | } |
| | | .ivu-form-item-content { |
| | | position: relative; |
| | |
| | | mounted() { |
| | | setTimeout(() => { |
| | | this.$router.replace("/login"); |
| | | }, 3 * 1000); |
| | | }, 0 * 1000); |
| | | }, |
| | | }; |
| | | </script> |
| | |
| | | Object.assign(this.form, data); |
| | | }, |
| | | clear() { |
| | | this.code = ""; |
| | | this.name = ""; |
| | | this.leader = ""; |
| | | this.tel = ""; |
| | | this.topCode = ""; |
| | | this.address = ""; |
| | | this.isThisLevel = false; |
| | | this.isEscrow = false; |
| | | this.isEnable = false; |
| | | this.form.code = ""; |
| | | this.form.name = ""; |
| | | this.form.leader = ""; |
| | | this.form.tel = ""; |
| | | this.form.topCode = ""; |
| | | this.form.address = ""; |
| | | this.form.isThisLevel = false; |
| | | this.form.isEscrow = false; |
| | | this.form.isEnable = false; |
| | | }, |
| | | }, |
| | | watch: { |
| | |
| | | <Row> |
| | | <Col span="6"> |
| | | <FormItem label="仓库编码:"> |
| | | <Input v-model="topForm.WH_Code" size="small"></Input> |
| | | <Input v-model="topForm.code" size="small"></Input> |
| | | </FormItem> |
| | | </Col> |
| | | <Col span="6"> |
| | | <FormItem label="仓库名称:"> |
| | | <Input v-model="topForm.WH_Code" size="small"></Input> |
| | | <Input v-model="topForm.name" size="small"></Input> |
| | | </FormItem> |
| | | </Col> |
| | | <Col span="6"> |
| | | <FormItem label="仓库负责人:"> |
| | | <Input v-model="topForm.WH_Code" size="small"></Input> |
| | | <Input v-model="topForm.leader" size="small"></Input> |
| | | </FormItem> |
| | | </Col> |
| | | <Col span="6"> |
| | | <FormItem label="仓库电话:"> |
| | | <Input v-model="topForm.WH_Code" size="small"></Input> |
| | | <Input v-model="topForm.tel" size="small"></Input> |
| | | </FormItem> |
| | | </Col> |
| | | </Row> |
| | | <Row> |
| | | <Col span="6"> |
| | | <FormItem label="上级仓库编码:"> |
| | | <Input v-model="topForm.WH_Code" size="small"></Input> |
| | | <Input v-model="topForm.topCode" size="small"></Input> |
| | | </FormItem> |
| | | </Col> |
| | | <Col span="6"> |
| | | <FormItem label="地址:"> |
| | | <Input v-model="topForm.WH_Code" size="small"></Input> |
| | | <Input v-model="topForm.address" size="small"></Input> |
| | | </FormItem> |
| | | </Col> |
| | | <Col span="4"> |
| | | <FormItem :label-width="34"> |
| | | <Checkbox v-model="topForm.WH_Code" size="small" |
| | | <Checkbox v-model="topForm.isThisLevel" size="small" |
| | | >是否本级</Checkbox |
| | | > |
| | | </FormItem> |
| | | </Col> |
| | | <Col span="4"> |
| | | <FormItem :label-width="34"> |
| | | <Checkbox v-model="topForm.WH_Code" size="small" |
| | | <Checkbox v-model="topForm.isEscorw" size="small" |
| | | >是否代管</Checkbox |
| | | > |
| | | </FormItem> |
| | | </Col> |
| | | <Col span="4"> |
| | | <FormItem :label-width="34"> |
| | | <Checkbox v-model="topForm.WH_Code" size="small" |
| | | <Checkbox v-model="topForm.isEnable" size="small" |
| | | >是否启用</Checkbox |
| | | > |
| | | </FormItem> |
| | |
| | | </Form> |
| | | </div> |
| | | <div class="buttons"> |
| | | <Button type="warning" size="small">清空查询</Button> |
| | | <Button type="warning" size="small" @click="onClearClick" |
| | | >清空查询</Button |
| | | > |
| | | </div> |
| | | <DataTable |
| | | :tableHeight="tableTopHeight" |
| | |
| | | data() { |
| | | return { |
| | | // 分隔比例 |
| | | split: 0.6, |
| | | split: 0.8, |
| | | // 主表参数定义 |
| | | topColumns: [], |
| | | topData: [], |
| | | tableTopHeight: 0, |
| | | tableBottomHeight: 0, |
| | | topForm: { |
| | | WH_Code: "", |
| | | code: "", |
| | | name: "", |
| | | leader: "", |
| | | tel: "", |
| | | topCode: "", |
| | | address: "", |
| | | isThisLevel: false, |
| | | isEscorw: false, |
| | | isEnable: false, |
| | | }, |
| | | topPage: 1, |
| | | topLimit: 30, |
| | |
| | | // 从表测试数据列表 |
| | | fakeBottomDataList(topDataId) { |
| | | return new Promise((resolve) => { |
| | | let total = Math.floor(Math.random() * 10); |
| | | let total = Math.floor(Math.random() * 10 + 1); |
| | | let fakeList = []; |
| | | for (let i = 0; i < total; i++) { |
| | | let row = { |
| | |
| | | this.topPage = page; |
| | | this.loadTopData(); |
| | | }, |
| | | onClearClick() { |
| | | this.reset(); |
| | | }, |
| | | reset() { |
| | | this.topForm.code = ""; |
| | | this.topForm.name = ""; |
| | | this.topForm.leader = ""; |
| | | this.topForm.tel = ""; |
| | | this.topForm.topCode = ""; |
| | | this.topForm.address = ""; |
| | | this.topForm.isThisLevel = false; |
| | | this.topForm.isEscorw = false; |
| | | this.topForm.isEnable = false; |
| | | }, |
| | | }, |
| | | async mounted() { |
| | | await this.loadTopColumns(); |
| | |
| | | '@': fileURLToPath(new URL('./src', import.meta.url)) |
| | | }, |
| | | }, |
| | | base: '/vue/' |
| | | }) |