From ea28e0dee788aa7faae87c79597a576790d8007f Mon Sep 17 00:00:00 2001 From: duan Date: Fri, 29 Jul 2022 21:59:45 +0800 Subject: [PATCH] =?UTF-8?q?feat(reagent/*):=20=E5=AE=8C=E6=88=90=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E3=80=81=E8=AF=95=E5=89=82=E5=85=A5=E5=BA=93=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- package.json | 4 +- src/App.vue | 1 + src/api/table.js | 9 - src/api/user.js | 4 +- src/api/warehousing.js | 45 ++ src/components/Detail/index.vue | 2 +- src/components/ReagentForm/index.vue | 215 +++++++++ src/components/Scannner/index.vue | 69 +++ src/layout/components/Navbar.vue | 2 +- src/layout/index.vue | 12 +- src/main.js | 10 +- src/permission.js | 3 +- src/store/index.js | 5 +- src/store/modules/user.js | 86 ++-- src/utils/request.js | 9 +- src/utils/stringify.js | 35 ++ src/views/home/index.vue | 8 +- src/views/login/index.vue | 71 +-- src/views/reagent/mainoverview/index.vue | 2 +- src/views/reagent/receiving/index.vue | 111 ++++- src/views/reagent/report/index.vue | 132 +++++- src/views/reagent/sendback/index.vue | 111 ++++- src/views/reagent/warehousing/index.vue | 552 ++++++++++++++++++++++- 24 files changed, 1369 insertions(+), 131 deletions(-) delete mode 100644 src/api/table.js create mode 100644 src/api/warehousing.js create mode 100644 src/components/ReagentForm/index.vue create mode 100644 src/components/Scannner/index.vue create mode 100644 src/utils/stringify.js diff --git a/.env.development b/.env.development index de583d0..594e95f 100644 --- a/.env.development +++ b/.env.development @@ -2,4 +2,4 @@ ENV = 'development' # base api -VUE_APP_BASE_API = '/dev-api' +VUE_APP_BASE_API = 'http://111.231.67.55:9001' diff --git a/package.json b/package.json index b79c2b7..1aa48a3 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,10 @@ "postcss-px2rem": "^0.3.0", "px2rem-loader": "^0.1.9", "vue": "2.6.10", + "vue-barcode-scanner": "^0.8.1", "vue-router": "3.0.6", - "vuex": "3.1.0" + "vuex": "3.1.0", + "vuex-persistedstate": "^4.1.0" }, "devDependencies": { "@vue/cli-plugin-babel": "4.4.4", diff --git a/src/App.vue b/src/App.vue index ec9032c..cb237d2 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,3 +9,4 @@ export default { name: 'App' } + diff --git a/src/api/table.js b/src/api/table.js deleted file mode 100644 index 2752f52..0000000 --- a/src/api/table.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -export function getList(params) { - return request({ - url: '/vue-admin-template/table/list', - method: 'get', - params - }) -} diff --git a/src/api/user.js b/src/api/user.js index 8ff4389..23c5254 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -2,7 +2,7 @@ import request from '@/utils/request' export function login(data) { return request({ - url: '/vue-admin-template/user/login', + url: '/api/user/login', method: 'post', data }) @@ -18,7 +18,7 @@ export function getInfo(token) { export function logout() { return request({ - url: '/vue-admin-template/user/logout', + url: '/api/user/logout', method: 'post' }) } diff --git a/src/api/warehousing.js b/src/api/warehousing.js new file mode 100644 index 0000000..a6b28cb --- /dev/null +++ b/src/api/warehousing.js @@ -0,0 +1,45 @@ +import request from '@/utils/request' + +export function show_tmp(data) { + return request({ + url: '/api/drug_tmplate/show_tmp', + method: 'post', + data + }) +} + +export function select_drug(data) { + return request({ + url: '/api/drug_tmplate/select_drug', + method: 'post', + data + }) +} + +// /api/drug_tmplate/bind_tmp_enter_warehouse +export function bind_tmp_enter_warehouse(data) { + return request({ + url: '/api/drug_tmplate/bind_tmp_enter_warehouse', + method: 'post', + data + }) +} + +// /api/drug_tmplate/add_tmp +export function add_tmp(data) { + return request({ + url: '/api/drug_tmplate/add_tmp', + method: 'post', + data + }) +} + +// /api/drug_tmplate/del_tmp +export function del_tmp(data) { + return request({ + url: '/api/drug_tmplate/del_tmp', + method: 'post', + data + }) +} + diff --git a/src/components/Detail/index.vue b/src/components/Detail/index.vue index d5c143c..4e1fd2b 100644 --- a/src/components/Detail/index.vue +++ b/src/components/Detail/index.vue @@ -42,7 +42,7 @@ export default { background-color: white; align-items: center; width: 15.75rem; - height: 5rem; + height: 6rem; display: flex; justify-content: space-between; .detail-img{ diff --git a/src/components/ReagentForm/index.vue b/src/components/ReagentForm/index.vue new file mode 100644 index 0000000..8ccc649 --- /dev/null +++ b/src/components/ReagentForm/index.vue @@ -0,0 +1,215 @@ + + + diff --git a/src/components/Scannner/index.vue b/src/components/Scannner/index.vue new file mode 100644 index 0000000..7da951d --- /dev/null +++ b/src/components/Scannner/index.vue @@ -0,0 +1,69 @@ + diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index bb062c7..3c510ca 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -4,7 +4,7 @@
- + import { Navbar, Sidebar, AppMain } from './components' -import ResizeMixin from './mixin/ResizeHandler' +// import ResizeMixin from './mixin/ResizeHandler' export default { name: 'Layout', @@ -22,7 +22,7 @@ export default { Sidebar, AppMain }, - mixins: [ResizeMixin], + // mixins: [ResizeMixin], computed: { sidebar() { return this.$store.state.app.sidebar @@ -35,10 +35,10 @@ export default { }, classObj() { return { - hideSidebar: !this.sidebar.opened, - openSidebar: this.sidebar.opened, - withoutAnimation: this.sidebar.withoutAnimation, - mobile: this.device === 'mobile' + // hideSidebar: !this.sidebar.opened, + // openSidebar: this.sidebar.opened, + withoutAnimation: this.sidebar.withoutAnimation + // mobile: this.device === 'mobile' } } }, diff --git a/src/main.js b/src/main.js index 2e616dc..c17d5c1 100644 --- a/src/main.js +++ b/src/main.js @@ -4,7 +4,8 @@ import 'normalize.css/normalize.css' // A modern alternative to CSS resets import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' -import locale from 'element-ui/lib/locale/lang/en' // lang i18n +// import locale from 'element-ui/lib/locale/lang/en' // lang i18n +import zhCN from 'element-ui/src/locale/lang/zh-CN' import '@/styles/index.scss' // global css @@ -13,7 +14,7 @@ import store from './store' import router from './router' import '@/icons' // icon -// import '@/permission' // permission contro +import '@/permission' // permission contro /** * If you don't want to use mock-server @@ -24,11 +25,14 @@ import '@/icons' // icon * please remove it before going online ! ! ! */ import * as echarts from 'echarts' +// 扫描 +import VueBarcodeScanner from 'vue-barcode-scanner' +Vue.use(VueBarcodeScanner) Vue.prototype.$echarts = echarts // 挂载到Vue实例上面 // set ElementUI lang to EN -Vue.use(ElementUI, { locale }) +Vue.use(ElementUI, { zhCN }) // 如果想要中文版 element-ui,按如下方式声明 // Vue.use(ElementUI) diff --git a/src/permission.js b/src/permission.js index fa1ea19..4aa7d47 100644 --- a/src/permission.js +++ b/src/permission.js @@ -3,7 +3,6 @@ import store from './store' import { Message } from 'element-ui' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style -import { getToken } from '@/utils/auth' // get token from cookie import getPageTitle from '@/utils/get-page-title' NProgress.configure({ showSpinner: false }) // NProgress Configuration @@ -18,7 +17,7 @@ router.beforeEach(async(to, from, next) => { document.title = getPageTitle(to.meta.title) // determine whether the user has logged in - const hasToken = getToken() + const hasToken = store.getters.token if (hasToken) { if (to.path === '/login') { diff --git a/src/store/index.js b/src/store/index.js index 6be466a..03db22e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -4,7 +4,7 @@ import getters from './getters' import app from './modules/app' import settings from './modules/settings' import user from './modules/user' - +import createPersistedState from 'vuex-persistedstate' Vue.use(Vuex) const store = new Vuex.Store({ @@ -13,7 +13,8 @@ const store = new Vuex.Store({ settings, user }, - getters + getters, + plugins: [createPersistedState()] }) export default store diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 2f6423f..8aacc6d 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,5 +1,5 @@ -import { login, logout, getInfo } from '@/api/user' -import { getToken, setToken, removeToken } from '@/utils/auth' +import { logout } from '@/api/user' +import { getToken, removeToken } from '@/utils/auth' import { resetRouter } from '@/router' const getDefaultState = () => { @@ -18,51 +18,51 @@ const mutations = { }, SET_TOKEN: (state, token) => { state.token = token - }, - SET_NAME: (state, name) => { - state.name = name - }, - SET_AVATAR: (state, avatar) => { - state.avatar = avatar } + // SET_NAME: (state, name) => { + // state.name = name + // }, + // SET_AVATAR: (state, avatar) => { + // state.avatar = avatar + // } } const actions = { - // user login - login({ commit }, userInfo) { - const { username, password } = userInfo - return new Promise((resolve, reject) => { - login({ username: username.trim(), password: password }).then(response => { - const { data } = response - commit('SET_TOKEN', data.token) - setToken(data.token) - resolve() - }).catch(error => { - reject(error) - }) - }) - }, - - // get user info - getInfo({ commit, state }) { - return new Promise((resolve, reject) => { - getInfo(state.token).then(response => { - const { data } = response - - if (!data) { - return reject('Verification failed, please Login again.') - } - - const { name, avatar } = data - - commit('SET_NAME', name) - commit('SET_AVATAR', avatar) - resolve(data) - }).catch(error => { - reject(error) - }) - }) - }, + // // user login + // login({ commit }, userInfo) { + // const { user_name, password } = userInfo + // return new Promise((resolve, reject) => { + // login({ user_name: user_name.trim(), password: password }).then(response => { + // const { data } = response + // commit('SET_TOKEN', data.token) + // setToken(data.token) + // resolve() + // }).catch(error => { + // reject(error) + // }) + // }) + // }, + // + // // get user info + // getInfo({ commit, state }) { + // return new Promise((resolve, reject) => { + // getInfo(state.token).then(response => { + // const { data } = response + // + // if (!data) { + // return reject('Verification failed, please Login again.') + // } + // + // const { name, avatar } = data + // + // commit('SET_NAME', name) + // commit('SET_AVATAR', avatar) + // resolve(data) + // }).catch(error => { + // reject(error) + // }) + // }) + // }, // user logout logout({ commit, state }) { diff --git a/src/utils/request.js b/src/utils/request.js index 2fb95ac..2b3f515 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,7 +1,6 @@ import axios from 'axios' import { MessageBox, Message } from 'element-ui' import store from '@/store' -import { getToken } from '@/utils/auth' // create an axios instance const service = axios.create({ @@ -19,7 +18,7 @@ service.interceptors.request.use( // let each request carry token // ['X-Token'] is a custom headers key // please modify it according to the actual situation - config.headers['X-Token'] = getToken() + config.headers['Authorization'] = store.getters.token } return config }, @@ -46,9 +45,9 @@ service.interceptors.response.use( const res = response.data // if the custom code is not 20000, it is judged as an error. - if (res.code !== 20000) { + if (res.status !== 0) { Message({ - message: res.message || 'Error', + message: res.msg || 'Error', type: 'error', duration: 5 * 1000 }) @@ -66,7 +65,7 @@ service.interceptors.response.use( }) }) } - return Promise.reject(new Error(res.message || 'Error')) + return Promise.reject(new Error(res.msg || 'Error')) } else { return res } diff --git a/src/utils/stringify.js b/src/utils/stringify.js new file mode 100644 index 0000000..3939005 --- /dev/null +++ b/src/utils/stringify.js @@ -0,0 +1,35 @@ +// 将参数转换成功 formdata 接收格式 +export default function stringify(data) { + const formData = new FormData() + for (const key in data) { + // eslint-disable-next-line no-prototype-builtins + if (data.hasOwnProperty(key)) { + if (data[key]) { + if (data[key].constructor === Array) { + if (data[key][0]) { + if (data[key][0].constructor === Object) { + formData.append(key, JSON.stringify(data[key])) + } else { + data[key].forEach((item, index) => { + formData.append(key + `[${index}]`, item) + }) + } + } else { + formData.append(key + '[]', '') + } + } else if (data[key].constructor === Object) { + formData.append(key, JSON.stringify(data[key])) + } else { + formData.append(key, data[key]) + } + } else { + if (data[key] === 0) { + formData.append(key, 0) + } else { + formData.append(key, '') + } + } + } + } + return formData +} diff --git a/src/views/home/index.vue b/src/views/home/index.vue index 28f0ed5..74fb43d 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -8,10 +8,10 @@
-
-
-
-
+
+
+
+
diff --git a/src/views/login/index.vue b/src/views/login/index.vue index d75e1bd..ceda04e 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -18,16 +18,16 @@

欢迎登录

- +
- diff --git a/src/views/reagent/report/index.vue b/src/views/reagent/report/index.vue index e79f0ab..e5e0d13 100644 --- a/src/views/reagent/report/index.vue +++ b/src/views/reagent/report/index.vue @@ -11,11 +11,39 @@
试剂使用统计
-
-
1
-
1
-
1
-
1
+
+ + + +
@@ -24,11 +52,29 @@
- 试剂消耗用量 + 试剂库存消耗
-
- {{ '列表内容 ' + o }} +
5140
+
截至目前试剂入库总量
+
+
20%
+
20%
+
60%
+
+
+
+ 在库量 + {{ instock.count }} +
+
+ 借出量 + {{ lending.count }} +
+
+ 消耗量 + {{ consume.count }} +
@@ -39,7 +85,7 @@
- +
@@ -63,6 +109,21 @@ export default { name: 'Report', data() { return { + instock: { + 'background': '#409EFF', + 'width': '20%', + 'count': 12485 + }, + lending: { + 'background': '#5DDC1D', + 'width': '20%', + 'count': 12485 + }, + consume: { + 'background': '#FF9B02', + 'width': '60%', + 'count': 12485 + }, percentage: 10, colors: [ { color: '#f56c6c', percentage: 20 }, @@ -113,9 +174,58 @@ export default { margin-bottom: 1rem; } .text{ - font-size: 1.25rem; + font-size: 1rem; font-weight: bold; color: #303133 } - +.count{ + font-size: 2rem; + font-weight: bold; + color: #303133; +} +.desc{ + font-size: 1rem; + font-weight: 400; + color: #909399; + margin-bottom: 1rem; +} +.data-count{ + width: 100%; + margin-top: 1rem; + display: flex; + justify-content: space-between; + div{ + width: 30%; + } +} +.user-info-img{ + img{ + width: 3rem; + } +} +.user-info-text{ + width: 32.5rem; + background: white; + padding: 2rem; + margin-bottom: 2rem; + div{ + margin-bottom: 0.5rem; + } +} +.use-info-content{ + display: flex; + flex-wrap:wrap; + justify-content: space-between; +} +.use-info-total{ + font-size: 0.7rem; + font-weight: bold; + color: #303133; + padding-bottom: 1rem; +} +.use-count{ + font-size: 2rem; + font-weight: bold; + color: #303133; +} diff --git a/src/views/reagent/sendback/index.vue b/src/views/reagent/sendback/index.vue index 6caf7a0..dcecb93 100644 --- a/src/views/reagent/sendback/index.vue +++ b/src/views/reagent/sendback/index.vue @@ -1,13 +1,118 @@ - diff --git a/src/views/reagent/warehousing/index.vue b/src/views/reagent/warehousing/index.vue index c3d64b2..3947507 100644 --- a/src/views/reagent/warehousing/index.vue +++ b/src/views/reagent/warehousing/index.vue @@ -1,13 +1,559 @@ -