仓储管理系统

一、创建数据库

创建用户表

use db_WH
go
create table wh_user
(
u_id  char(10) primary key, --用户账号
u_name varchar(10) not null, --用户姓名
u_pwd varchar(20) not null, --用户密码
u_age char(5) default NULL, --用户年龄
u_sex char(2) check(u_sex='男' or u_sex='女'), --用户性别,取值只能为“男”或者“女”
u_phone varchar(20) default NULL, --用户号码
u_role varchar(10) check(u_role='超级管理员' or u_role='管理员' or u_role='普通账号')
default '普通账号', --用户权限,默认“普通账号”
)

创建仓库表

use db_WH
go
create table storage
(
s_id varchar(20) primary key,  --仓库编号
s_name varchar(20) not null, --仓库名字
s_dress varchar(100) not null, --仓库地址
)

创建商品表

use db_WH
go
create table goods
(
g_id varchar(20) primary key,   --商品编号
g_name varchar(20) not null,        --商品名称
g_date datetime,           --商品生产日期
g_remark varchar(1000) default null,    --商品备注
p_id varchar(10) foreign key references provider(p_id)
)

创建库存表

use db_WH
go
create table stock
(
g_id varchar(20) references goods(g_id),   --外键,与商品表编号相连
s_id varchar(20) references storage(s_id),--外键,与仓库表仓库编号相连
s_num int not null check(s_num>0),  --库存数量
primary key(g_id,s_id)  --字段组合做主键
)

创建供应商表

use db_WH
go
create table provider
(
p_id char(5) primary key, --供应商编号
p_name varchar(30) not null, --供应商姓名
p_phone varchar(20) not null, --供应商电话
)

创建入库表

use db_WH
go
create table inbound
(
i_id varchar(20) primary key,   --入库编号,五位数自增
i_num int not null ,  --入库数量
i_time datetime,  --入库时间
s_id varchar(20) foreign key references storage(s_id), --仓库编号,外键
g_id varchar(20) foreign key references goods(g_id),  --商品编号,外键
u_id char(10) foreign key references wh_user(u_id), --操作员,外键
)

创建出库表

use db_WH
go
create table outbound
(
o_id varchar(20) primary key, --出库编号,六位数自增
o_count int default 0, --出库数量s
o_time datetime,  --入库时间
s_id varchar(20)  foreign key references storage(s_id), --仓库编号,外键
g_id varchar(20) foreign key references goods(g_id), --商品编号,外键
u_id char(10) foreign key references wh_user(u_id), --操作员,外键
)

ER图

在这里插入图片描述

数据库关系图

在这里插入图片描述

创建索引

create nonclustered index 出库_创建时间 on outbound(o_time desc);	

多表查询

select * from stock
join goods 
on stock.g_id = goods.g_id
select * from outbound
join goods 
on outbound.g_id = goods.g_id
join storage
on outbound.s_id = storage.s_id

分组查询

select u_sex 性别,count(*)人数
from wh_user
group by u_sex

select u_role 角色,count(*) 人数
from wh_user
group by u_role

排序

select * from stock
order by s_num asc

存储过程

分页存储过程

--分页
go
create procedure SelectPage_storage
	@pageIndex int,
	@pageSize int
as
begin
	select * from storage
	order by s_id
	offset ((@pageIndex-1)*@pageSize) rows
	fetch next @pageSize rows only;
	return 1
end

exec SelectPage_storage @pageIndex=4,@pageSize=3
drop proc SelectPage_storage

入库表新增存储过程

--新增
create procedure addInbound
	@i_num int,
	@i_time datetime,
	@s_id varchar(20),
	@g_id varchar(20),
	@u_id char(10)
as
begin
	if exists(select * from stock where s_id=@s_id and g_id=@g_id)
		begin
			update stock set s_num=s_num+@i_num where s_id=@s_id and g_id=@g_id
		end
	else
		begin
			insert into  inbound(i_id, i_num,i_time,s_id,g_id,u_id)
	        values ('I'+right('000000'+cast((select isnull(max(right(i_id, len(i_id)-1)), 0)+1 from  inbound) as varchar), 6), @i_num,@i_time,@s_id,@g_id,@u_id); -- 插入第一条记录
			insert into stock(s_id,g_id,s_num) values (@s_id,@g_id,@i_num);
		end
end

触发器

出库触发器

--出库触发器
create trigger outbound_stock
on outbound
instead of insert
as
begin
	declare   @count1 int
	declare   @count2 int
	declare   @g_id varchar(20)
	declare   @s_id varchar(20)
	select @g_id=g_id from inserted
	select @s_id=s_id from inserted
	select @count1=o_count from inserted
	select @count2=s_num from stock where g_id=@g_id and s_id=@s_id
	if @count1>@count2
		print '出库量大于库存量,不能出库'
	else
		begin
			begin transaction
			declare @error int = 0
            begin try
					insert into outbound select * from inserted
					update stock set s_num=s_num-@count1 where s_id=@s_id and g_id=@g_id
					print '已经成功插入记录'
			end try
			begin catch
					set @error = 1
					print '出现错误!事务已回滚!'
			end catch
			if @error = 1
				begin
					rollback transaction
				end
			else
				begin
				commit transaction
				end
		end
end

drop trigger outbound_stock

更新库存触发器

--更新库存触发器
create trigger Stock_update
on stock
after update
as
begin
	declare @num int
	declare @s_id varchar(20)
	declare @g_id varchar(20)
	set @s_id=(select s_id from inserted)
	set @g_id=(select g_id from inserted)
	set @num=(select s_num from stock where g_id=@g_id and s_id=@s_id)
	if(@num=0)
		delete stock where s_id=@s_id and g_id=@g_id
end

二、用node.js连接SQL server数据库

//示例代码

var sql = require('mssql');

// DB configuration
var dbConfig = {
    user: 'sa',
    password: '123456',
    server: 'localhost',
    database: 'db_WH',
    port: 1433,
    options: {
        "encrypt": false
    },
    pool: {
        max: 10,
        min: 0,
        idleTimeoutMillis: 30000
    }
};

// 查询所有的用户信息
function getAllUsers() {
    var conn = new sql.ConnectionPool(dbConfig);
    //console.log(conn);
    var req = new sql.Request(conn);
    conn.connect(function (err) {
        if (err) {
            console.log(err);
            return;
        }
        // 查询t_user表
        req.query("SELECT * FROM wh_user", function (err, recordset) {
            if (err) {
                console.log(err);
                return;
            }
            else {
                console.log(recordset);
            }
            conn.close();
        });
    });
}

// 查询所有的用户信息
getAllUsers();

解决数据库连接问题


在这里插入图片描述
结果如下:
在这里插入图片描述

二、用Vue-cli创建项目,并引入element-UI

npm install -g vue
npm install -g  @vue/cli 
vue -V

vue create ‘项目名’ 回车创建

npm i element-ui -S

在vue的main.js中引入element-UI

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';


Vue.use(ElementUI);
Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

配置路由

配置路由

在这里插入图片描述
引入很重要
在这里插入图片描述
在首页加入各个部件,并且在Main中加入路由
在这里插入图片描述

添加子路由

const routes = [
  {
    path: '/',
    name: 'index',
    component: Index,
    children:[
      {
        path:'/'
      },
      {
        path:'storage',
        component:() => import('@/views/storage.vue')
      },
      {
        path:'goods',
        component:() => import('@/views/goods.vue')
      },
      {
        path:'supplier',
        component:() => import('@/views/supplier.vue')
      },
      {
        path:'inbound',
        component:() => import('@/views/inbound.vue')
      },
      {
        path:'outbound',
        component:() => import('@/views/outbound.vue')
      },
      {
        path:'user',
        component:() => import('@/views/user.vue')
      },
    ]
  },
]

在main.js中注册axios


import axios from 'axios'
Vue.prototype.$http= axios

在main.js中注册VueCookies

1.安装
npm install vue-cookie --save 
2.引入
import VueCookies from 'vue-cookies'
Vue.use(VueCookies)

遇到的问题和解决方案

防止直接修改网址就能路由跳转

在 router.js 中添加全局前置守卫 router.beforeEach
在全局前置守卫中对路由进行判断:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from '@/views/Index.vue'
import Login from '@/views/Login.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/Login',
    name: 'Login',
    component: Login,
    meta: {
      allowAnonymous: true // 允许未登录用户访问
    }
  },
  {
    path: '/',
    name: 'Index',
    component: Index,
    children: [
      // ...
    ],
    meta: {
      requiresAuth: true // 需要用户登录才能访问
    }
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

// 全局前置守卫
router.beforeEach((to, from, next) => {
  const isLogin = localStorage.getItem('isLogin') === 'true'
  if (!to.meta.allowAnonymous && !isLogin) {
    next('/Login')
  } else if (to.meta.allowAnonymous && isLogin) {
    next('/')
  } else {
    next()
  }
})

export default router

前端

<script>
export default {
  // ...
  methods: {
    handleLogin() {
      // 登录成功后保存用户信息到本地
      localStorage.setItem('isLogin', 'true')
      // 跳转至首页
      this.$router.push('/')
    }
  }
}
</script>

解决element-Ui对话框遮罩层问题

加入下面的代码

:modal-append-to-body="false"

获取实时时间

        getCurrentTime() {
            //获取当前时间并打印
            var _this = this;
            let yy = new Date().getFullYear();
            let mm = new Date().getMonth() + 1;
            let dd = new Date().getDate();
            let hh = new Date().getHours();
            let mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() : new Date().getMinutes();
            let ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() : new Date().getSeconds();
            _this.gettime = yy + '-' + mm + '-' + dd + ' ' + hh + ':' + mf + ':' + ss;
            console.log(_this.gettime)
            this.form.date = _this.gettime

        },

让表单不可更改

                <el-form-item label="入库时间" prop="date">
                    <el-col :span="20">
                        <el-input v-model="form.date" :disabled="true"></el-input>
                    </el-col>
                </el-form-item>

使用属性  :disabled="true" 方式,输入框或文本域有灰色底

增加表格滑轮

        <el-table :data="tableData" :header-cell-style="{ background: '#f2f5fc', color: '#555555' }" border
            style="max-height: 750px; overflow-y: auto;">

  通过设置"max-height"和"overflow-y"属性来添加滚动条。根据需要调整"max-height"的大小

解决sql拼接问题

   const result = `('${req.body.no}','${req.body.name}','${req.body.password}','${req.body.age}','${req.body.sex}','${req.body.phone}')`

解决分页问题

select * from wh_user
order by u_no
offset 1 rows
fetch next 2 row only;

在这里插入图片描述
创建存储过程

go
create procedure SelectPage
	@pageIndex int,
	@pageSize int
as
begin
	select * from wh_user
	order by u_no
	offset ((@pageIndex-1)*@pageSize) rows
	fetch next @pageSize rows only;
end

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值