当前位置: 首页 > news >正文

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:药品进销存信息管理系统(前后端源码 + 数据库 sql 脚本)

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 项目介绍

        1.1 项目功能

        2.0 用户登录功能

        3.0 首页界面

        4.0 供应商管理功能

        5.0 药品管理功能

        6.0 采购记录管理功能

        7.0 销售记录管理功能

        8.0 退货记录管理功能

        9.0 库存变动管理功能

        10.0 SQL 数据库设计


        1.0 项目介绍

        开发工具:IDEA、VScode

        服务器:Tomcat, JDK 17

        项目构建:maven

        数据库:mysql 8.0

系统用户前台和管理后台两部分,项目采用前后端分离

        前端技术:vue3 + elementUI

        服务端技术:springboot + mybatis + redis + mysql

        1.1 项目功能


后台功能:

        1)登录、退出系统、首页

        2)供应商信息管理

                (1) 供应商信息管理:添加、修改、删除、查询等功能。

        3)药品管理

                (1) 药品管理:添加、修改、删除、查询等功能。

        4)采购登记管理

                (1) 采购登记管理:添加、修改、删除、查询等功能。

        5)销售记录管理

                (1) 销售记录管理:添加、修改、删除、查询等功能。

        6)退货记录管理

                (1) 退货记录管理:添加、修改、删除、查询等功能。

        7)库存变动管理

                (1) 库存变动管理:添加、修改、删除、查询等功能。

        8)系统管理

                用户信息管理

                        (1)用户信息管理:添加、修改、删除、查询等功能。

                角色管理

                        (2)角色信息管理:添加、修改、删除、查询等功能。

                菜单管理

                        (3)菜单信息管理:添加、修改、删除、查询等功能。

                日志管理

                        (4)日志信息管理:添加、修改、删除、查询等功能。

        9)系统监控

                        查看在先用户、设置定时任务、数据监控、缓存监控、查看缓存列表等。

        10)权限管理

                (1) 角色信息管理:添加、修改、删除、分配权限等功能。

                (2) 资源信息管理:添加、修改、删除等功能。

注意:不一定非要完全符合开发环境,有稍微的差别也是可以开发的。

         若需要项目完整源码,可以在 CSDN 私信给我,我每天都有查看消息的,感谢大家支持,希望可以帮助到大家!

        2.0 用户登录功能

        用户根据正确的用户名、密码且通过正确的校验码进行登录。

        实现了登录校验,还有用户注册功能:

        用到了 Spring Security 框架来实现登录、校验、验证等功能。 

相关的部分源码:

@RestController
public class SysLoginController
{@Autowiredprivate SysLoginService loginService;@Autowiredprivate ISysMenuService menuService;@Autowiredprivate SysPermissionService permissionService;/*** 登录方法* * @param loginBody 登录信息* @return 结果*/@PostMapping("/login")public AjaxResult login(@RequestBody LoginBody loginBody){AjaxResult ajax = AjaxResult.success();// 生成令牌String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),loginBody.getUuid());ajax.put(Constants.TOKEN, token);return ajax;}/*** 获取用户信息* * @return 用户信息*/@GetMapping("getInfo")public AjaxResult getInfo(){SysUser user = SecurityUtils.getLoginUser().getUser();// 角色集合Set<String> roles = permissionService.getRolePermission(user);// 权限集合Set<String> permissions = permissionService.getMenuPermission(user);AjaxResult ajax = AjaxResult.success();ajax.put("user", user);ajax.put("roles", roles);ajax.put("permissions", permissions);return ajax;}/*** 获取路由信息* * @return 路由信息*/@GetMapping("getRouters")public AjaxResult getRouters(){Long userId = SecurityUtils.getUserId();List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);return AjaxResult.success(menuService.buildMenus(menus));}
}
    public String login(String username, String password, String code, String uuid){// 验证码校验validateCaptcha(username, code, uuid);// 登录前置校验loginPreCheck(username, password);// 用户验证Authentication authentication = null;try{UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);AuthenticationContextHolder.setContext(authenticationToken);// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(authenticationToken);}catch (Exception e){if (e instanceof BadCredentialsException){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();}else{AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));throw new ServiceException(e.getMessage());}}finally{AuthenticationContextHolder.clearContext();}AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();recordLoginInfo(loginUser.getUserId());// 生成tokenreturn tokenService.createToken(loginUser);}

        3.0 首页界面

        统计相关药品的信息,使用柱状图和圆饼图等展示出来,会更加直观。

相关的前端源码:

<template><div class="statistics"><!-- <h2 class="title">药品进销存统计信息</h2> --><div class="chart-container"><div ref="barChart" class="chart"></div><div ref="pieChart" class="chart"></div><div ref="lineChart" class="chart"></div><div ref="radarChart" class="chart"></div></div></div>
</template><script setup>
import * as echarts from 'echarts';
import { onMounted, ref } from 'vue';const barChart = ref(null);
const pieChart = ref(null);
const lineChart = ref(null);
const radarChart = ref(null);onMounted(() => {fetchAndInitCharts();
});async function fetchAndInitCharts() {const salesData = {categories: ['阿司匹林', '布洛芬', '对乙酰氨基酚', '盐酸昂丹司琼注射液', '盐酸昂丹司琼注射液'],values: [120, 200, 150, 80, 70]};const inventoryData = [{ value: 335, name: '阿司匹林' },{ value: 310, name: '布洛芬' },{ value: 234, name: '对乙酰氨基酚' },{ value: 135, name: '盐酸昂丹司琼注射液' },{ value: 1548, name: '盐酸昂丹司琼注射液' }];const trendData = {categories: ['1月', '2月', '3月', '4月', '5月', '6月'],values: [120, 200, 150, 80, 70, 100]};const radarData = {indicators: [{ name: '质量', max: 100 },{ name: '价格', max: 100 },{ name: '销量', max: 100 },{ name: '库存', max: 100 },{ name: '满意度', max: 100 }],series: [{value: [80, 60, 70, 50, 90],name: '阿司匹林'}]};initBarChart(salesData);initPieChart(inventoryData);initLineChart(trendData);initRadarChart(radarData);
}function initBarChart(data) {const chart = echarts.init(barChart.value);const option = {title: {text: '药品销售量统计',left: 'center',textStyle: {color: '#111711', // 修改字体颜色fontSize: 24}},tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},xAxis: {type: 'category',data: data.categories,axisLabel: {interval: 0,rotate: 30,color: '#111711' // 修改字体颜色},axisLine: {lineStyle: {color: '#fff'}}},yAxis: {type: 'value',axisLabel: {color: '#111711' // 修改字体颜色},axisLine: {lineStyle: {color: '#fff'}}},series: [{data: data.values,type: 'bar',itemStyle: {color: '#6A5ACD' // 更改颜色为更深的紫色}}],backgroundColor: 'transparent' // 设置背景色为透明};chart.setOption(option);
}function initPieChart(data) {const chart = echarts.init(pieChart.value);const option = {title: {text: '药品库存比例',left: 'center',textStyle: {color: '#111711', // 修改字体颜色fontSize: 24}},tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left',textStyle: {color: '#111711' // 修改字体颜色}},series: [{name: '药品库存',type: 'pie',radius: '50%',data: data,emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}},itemStyle: {color: (params) => {const colorList = ['#FF69B4', '#FFD700', '#32CD32', '#1E90FF', '#FF6347']; // 更改颜色为更青春的色调return colorList[params.dataIndex];}}}],backgroundColor: 'transparent' // 设置背景色为透明};chart.setOption(option);
}function initLineChart(data) {const chart = echarts.init(lineChart.value);const option = {title: {text: '药品销售趋势',left: 'center',textStyle: {color: '#111711', // 修改字体颜色fontSize: 24}},tooltip: {trigger: 'axis'},xAxis: {type: 'category',data: data.categories,axisLabel: {color: '#111711' // 修改字体颜色},axisLine: {lineStyle: {color: '#fff'}}},yAxis: {type: 'value',axisLabel: {color: '#111711' // 修改字体颜色},axisLine: {lineStyle: {color: '#fff'}}},series: [{data: data.values,type: 'line',smooth: true,itemStyle: {color: '#FF69B4' // 更改颜色为粉红}}],backgroundColor: 'transparent' // 设置背景色为透明};chart.setOption(option);
}function initRadarChart(data) {const chart = echarts.init(radarChart.value);const option = {title: {text: '药品综合评价',left: 'center',textStyle: {color: '#111711', // 修改字体颜色fontSize: 24}},tooltip: {trigger: 'item'},radar: {indicator: data.indicators,axisName: {color: '#111711' // 修改字体颜色},splitArea: {areaStyle: {color: ['#17273B', '#233B56']}}},series: [{name: '药品综合评价',type: 'radar',data: data.series,itemStyle: {color: '#FF69B4' // 更改颜色为粉红}}],backgroundColor: 'transparent' // 设置背景色为透明};chart.setOption(option);
}
</script><style scoped>
.statistics {padding: 40px;display: flex;flex-direction: column;align-items: center;background-color: #4DA3D4;background-image: url('../../assets/images/4.jpg'); /* 设置背景图 */background-size: cover; /* 使背景图覆盖整个容器 */background-position: center; /* 背景图居中 */color: #111711; /* 修改字体颜色 */min-height: 100vh;
}.title {font-size: 36px;margin-bottom: 40px;color: #111711; /* 修改字体颜色 */
}.chart-container {display: grid;grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));gap: 40px;width: 100%;max-width: 1400px;
}.chart {width: 100%;height: 500px;border: 1px solid #ddd;box-shadow: 0 4px 8px rgba(0, 0, 0, 1);border-radius: 12px;overflow: hidden;background-color: transparent; /* 设置背景色为透明 */
}
</style>

        4.0 供应商管理功能

        上传图片使用了第三方接口:x-File-Storage 框架。

相关源码:

@RestController
@RequestMapping("/manage/suppliers")
public class SuppliersController extends BaseController
{@Autowiredprivate ISuppliersService suppliersService;/*** 查询供应商信息列表*/@PreAuthorize("@ss.hasPermi('manage:suppliers:list')")@GetMapping("/list")public TableDataInfo list(Suppliers suppliers){startPage();List<Suppliers> list = suppliersService.selectSuppliersList(suppliers);return getDataTable(list);}/*** 导出供应商信息列表*/@PreAuthorize("@ss.hasPermi('manage:suppliers:export')")@Log(title = "供应商信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Suppliers suppliers){List<Suppliers> list = suppliersService.selectSuppliersList(suppliers);ExcelUtil<Suppliers> util = new ExcelUtil<Suppliers>(Suppliers.class);util.exportExcel(response, list, "供应商信息数据");}/*** 获取供应商信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:suppliers:query')")@GetMapping(value = "/{supplierId}")public AjaxResult getInfo(@PathVariable("supplierId") Long supplierId){return success(suppliersService.selectSuppliersBySupplierId(supplierId));}/*** 新增供应商信息*/@PreAuthorize("@ss.hasPermi('manage:suppliers:add')")@Log(title = "供应商信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Suppliers suppliers){return toAjax(suppliersService.insertSuppliers(suppliers));}/*** 修改供应商信息*/@PreAuthorize("@ss.hasPermi('manage:suppliers:edit')")@Log(title = "供应商信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Suppliers suppliers){return toAjax(suppliersService.updateSuppliers(suppliers));}/*** 删除供应商信息*/@PreAuthorize("@ss.hasPermi('manage:suppliers:remove')")@Log(title = "供应商信息", businessType = BusinessType.DELETE)@DeleteMapping("/{supplierIds}")public AjaxResult remove(@PathVariable Long[] supplierIds){return toAjax(suppliersService.deleteSuppliersBySupplierIds(supplierIds));}
}

        5.0 药品管理功能

相关源码:

@RestController
@RequestMapping("/manage/medicines")
public class MedicinesController extends BaseController
{@Autowiredprivate IMedicinesService medicinesService;/*** 查询药品信息列表*/@PreAuthorize("@ss.hasPermi('manage:medicines:list')")@GetMapping("/list")public TableDataInfo list(Medicines medicines){startPage();List<Medicines> list = medicinesService.selectMedicinesList(medicines);return getDataTable(list);}/*** 导出药品信息列表*/@PreAuthorize("@ss.hasPermi('manage:medicines:export')")@Log(title = "药品信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Medicines medicines){List<Medicines> list = medicinesService.selectMedicinesList(medicines);ExcelUtil<Medicines> util = new ExcelUtil<Medicines>(Medicines.class);util.exportExcel(response, list, "药品信息数据");}/*** 获取药品信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:medicines:query')")@GetMapping(value = "/{medicineId}")public AjaxResult getInfo(@PathVariable("medicineId") Long medicineId){return success(medicinesService.selectMedicinesByMedicineId(medicineId));}/*** 新增药品信息*/@PreAuthorize("@ss.hasPermi('manage:medicines:add')")@Log(title = "药品信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Medicines medicines){return toAjax(medicinesService.insertMedicines(medicines));}/*** 修改药品信息*/@PreAuthorize("@ss.hasPermi('manage:medicines:edit')")@Log(title = "药品信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Medicines medicines){return toAjax(medicinesService.updateMedicines(medicines));}/*** 删除药品信息*/@PreAuthorize("@ss.hasPermi('manage:medicines:remove')")@Log(title = "药品信息", businessType = BusinessType.DELETE)@DeleteMapping("/{medicineIds}")public AjaxResult remove(@PathVariable Long[] medicineIds){return toAjax(medicinesService.deleteMedicinesByMedicineIds(medicineIds));}
}

        6.0 采购记录管理功能

        对药品进行采购。

相关源码:

@RestController
@RequestMapping("/manage/purchases")
public class PurchasesController extends BaseController
{@Autowiredprivate IPurchasesService purchasesService;/*** 查询采购记录列表*/@PreAuthorize("@ss.hasPermi('manage:purchases:list')")@GetMapping("/list")public TableDataInfo list(Purchases purchases){startPage();List<Purchases> list = purchasesService.selectPurchasesList(purchases);return getDataTable(list);}/*** 导出采购记录列表*/@PreAuthorize("@ss.hasPermi('manage:purchases:export')")@Log(title = "采购记录", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Purchases purchases){List<Purchases> list = purchasesService.selectPurchasesList(purchases);ExcelUtil<Purchases> util = new ExcelUtil<Purchases>(Purchases.class);util.exportExcel(response, list, "采购记录数据");}/*** 获取采购记录详细信息*/@PreAuthorize("@ss.hasPermi('manage:purchases:query')")@GetMapping(value = "/{purchaseId}")public AjaxResult getInfo(@PathVariable("purchaseId") Long purchaseId){return success(purchasesService.selectPurchasesByPurchaseId(purchaseId));}/*** 新增采购记录*/@PreAuthorize("@ss.hasPermi('manage:purchases:add')")@Log(title = "采购记录", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Purchases purchases){return toAjax(purchasesService.insertPurchases(purchases));}/*** 修改采购记录*/@PreAuthorize("@ss.hasPermi('manage:purchases:edit')")@Log(title = "采购记录", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Purchases purchases){return toAjax(purchasesService.updatePurchases(purchases));}/*** 删除采购记录*/@PreAuthorize("@ss.hasPermi('manage:purchases:remove')")@Log(title = "采购记录", businessType = BusinessType.DELETE)@DeleteMapping("/{purchaseIds}")public AjaxResult remove(@PathVariable Long[] purchaseIds){return toAjax(purchasesService.deletePurchasesByPurchaseIds(purchaseIds));}
}

        7.0 销售记录管理功能

        对药品进行销售、销毁处理等操作。

相关源码:

@RestController
@RequestMapping("/manage/sales")
public class SalesController extends BaseController
{@Autowiredprivate ISalesService salesService;/*** 查询销售记录列表*/@PreAuthorize("@ss.hasPermi('manage:sales:list')")@GetMapping("/list")public TableDataInfo list(Sales sales){startPage();List<Sales> list = salesService.selectSalesList(sales);return getDataTable(list);}/*** 导出销售记录列表*/@PreAuthorize("@ss.hasPermi('manage:sales:export')")@Log(title = "销售记录", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Sales sales){List<Sales> list = salesService.selectSalesList(sales);ExcelUtil<Sales> util = new ExcelUtil<Sales>(Sales.class);util.exportExcel(response, list, "销售记录数据");}/*** 获取销售记录详细信息*/@PreAuthorize("@ss.hasPermi('manage:sales:query')")@GetMapping(value = "/{saleId}")public AjaxResult getInfo(@PathVariable("saleId") Long saleId){return success(salesService.selectSalesBySaleId(saleId));}/*** 新增销售记录*/@PreAuthorize("@ss.hasPermi('manage:sales:add')")@Log(title = "销售记录", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Sales sales){return toAjax(salesService.insertSales(sales));}/*** 修改销售记录*/@PreAuthorize("@ss.hasPermi('manage:sales:edit')")@Log(title = "销售记录", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Sales sales){return toAjax(salesService.updateSales(sales));}/*** 删除销售记录*/@PreAuthorize("@ss.hasPermi('manage:sales:remove')")@Log(title = "销售记录", businessType = BusinessType.DELETE)@DeleteMapping("/{saleIds}")public AjaxResult remove(@PathVariable Long[] saleIds){return toAjax(salesService.deleteSalesBySaleIds(saleIds));}
}

        8.0 退货记录管理功能

        药品进行合理的退货,需要对库存进行同步的调整。

相关源码:

@RestController
@RequestMapping("/manage/returns")
public class ReturnsController extends BaseController
{@Autowiredprivate IReturnsService returnsService;/*** 查询退货记录列表*/@PreAuthorize("@ss.hasPermi('manage:returns:list')")@GetMapping("/list")public TableDataInfo list(Returns returns){startPage();List<Returns> list = returnsService.selectReturnsList(returns);return getDataTable(list);}/*** 导出退货记录列表*/@PreAuthorize("@ss.hasPermi('manage:returns:export')")@Log(title = "退货记录", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Returns returns){List<Returns> list = returnsService.selectReturnsList(returns);ExcelUtil<Returns> util = new ExcelUtil<Returns>(Returns.class);util.exportExcel(response, list, "退货记录数据");}/*** 获取退货记录详细信息*/@PreAuthorize("@ss.hasPermi('manage:returns:query')")@GetMapping(value = "/{returnId}")public AjaxResult getInfo(@PathVariable("returnId") Long returnId){return success(returnsService.selectReturnsByReturnId(returnId));}/*** 新增退货记录*/@PreAuthorize("@ss.hasPermi('manage:returns:add')")@Log(title = "退货记录", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Returns returns){return toAjax(returnsService.insertReturns(returns));}/*** 修改退货记录*/@PreAuthorize("@ss.hasPermi('manage:returns:edit')")@Log(title = "退货记录", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Returns returns){return toAjax(returnsService.updateReturns(returns));}/*** 删除退货记录*/@PreAuthorize("@ss.hasPermi('manage:returns:remove')")@Log(title = "退货记录", businessType = BusinessType.DELETE)@DeleteMapping("/{returnIds}")public AjaxResult remove(@PathVariable Long[] returnIds){return toAjax(returnsService.deleteReturnsByReturnIds(returnIds));}
}

        9.0 库存变动管理功能

        对药品进行采购、销售、调整都会进行记录。

相关源码:

@RestController
@RequestMapping("/manage/movements")
public class InventoryMovementsController extends BaseController
{@Autowiredprivate IInventoryMovementsService inventoryMovementsService;/*** 查询库存变动记录列表*/@PreAuthorize("@ss.hasPermi('manage:movements:list')")@GetMapping("/list")public TableDataInfo list(InventoryMovements inventoryMovements){startPage();List<InventoryMovements> list = inventoryMovementsService.selectInventoryMovementsList(inventoryMovements);return getDataTable(list);}/*** 导出库存变动记录列表*/@PreAuthorize("@ss.hasPermi('manage:movements:export')")@Log(title = "库存变动记录", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, InventoryMovements inventoryMovements){List<InventoryMovements> list = inventoryMovementsService.selectInventoryMovementsList(inventoryMovements);ExcelUtil<InventoryMovements> util = new ExcelUtil<InventoryMovements>(InventoryMovements.class);util.exportExcel(response, list, "库存变动记录数据");}/*** 获取库存变动记录详细信息*/@PreAuthorize("@ss.hasPermi('manage:movements:query')")@GetMapping(value = "/{movementId}")public AjaxResult getInfo(@PathVariable("movementId") Long movementId){return success(inventoryMovementsService.selectInventoryMovementsByMovementId(movementId));}/*** 新增库存变动记录*/@PreAuthorize("@ss.hasPermi('manage:movements:add')")@Log(title = "库存变动记录", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody InventoryMovements inventoryMovements){return toAjax(inventoryMovementsService.insertInventoryMovements(inventoryMovements));}/*** 修改库存变动记录*/@PreAuthorize("@ss.hasPermi('manage:movements:edit')")@Log(title = "库存变动记录", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody InventoryMovements inventoryMovements){return toAjax(inventoryMovementsService.updateInventoryMovements(inventoryMovements));}/*** 删除库存变动记录*/@PreAuthorize("@ss.hasPermi('manage:movements:remove')")@Log(title = "库存变动记录", businessType = BusinessType.DELETE)@DeleteMapping("/{movementIds}")public AjaxResult remove(@PathVariable Long[] movementIds){return toAjax(inventoryMovementsService.deleteInventoryMovementsByMovementIds(movementIds));}
}

        10.0 SQL 数据库设计

create database pharmaceuticals;-- 创建供应商表
CREATE TABLE suppliers (supplier_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '供应商ID',img varchar(100) comment '照片',name VARCHAR(100) NOT NULL COMMENT '供应商名称',contact_person VARCHAR(100) COMMENT '联系人',phone VARCHAR(20) COMMENT '联系电话',email VARCHAR(100) COMMENT '电子邮箱',address TEXT COMMENT '地址',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='供应商信息表';-- 创建药品表
CREATE TABLE medicines (medicine_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '药品ID',name VARCHAR(100) NOT NULL COMMENT '药品名称',img varchar(100) comment '照片',generic_name VARCHAR(100) COMMENT '通用名',form tinyint COMMENT '剂型(如固体等)',expiration_date DATE COMMENT '有效期至',purchase_price DECIMAL(10, 2) COMMENT '进货价',sale_price DECIMAL(10, 2) COMMENT '售价',stock_quantity INT DEFAULT 0 COMMENT '库存数量',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='药品信息表';-- 创建采购记录表
CREATE TABLE purchases (purchase_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '采购ID',supplier_id INT NOT NULL COMMENT '供应商ID(逻辑外键关联suppliers表的supplier_id)',medicine_id INT NOT NULL COMMENT '药品ID(逻辑外键关联medicines表的medicine_id)',quantity INT NOT NULL COMMENT '数量',unit_price DECIMAL(10, 2) NOT NULL COMMENT '单价',purchase_date DATE NOT NULL COMMENT '采购日期',total_amount DECIMAL(10, 2) NOT NULL COMMENT '总金额',user_id INT NOT NULL COMMENT '创建人(逻辑外键关联users表的user_id)',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='采购记录表';insert into purchases(supplier_id, medicine_id, quantity, unit_price, purchase_date, total_amount, user_id) values (1,1,10,30,now(),300,1);-- 创建销售记录表
CREATE TABLE sales (sale_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '销售ID',sale_date DATE NOT NULL COMMENT '销售日期',customer_name VARCHAR(100) COMMENT '客户姓名',customer_phone VARCHAR(20) COMMENT '客户电话',supplier_id INT NOT NULL COMMENT '供应商ID(逻辑外键关联suppliers表的supplier_id)',medicine_id INT NOT NULL COMMENT '药品ID(逻辑外键关联medicines表的medicine_id)',quantity INT NOT NULL COMMENT '数量',unit_price DECIMAL(10, 2) NOT NULL COMMENT '单价',total_amount DECIMAL(10, 2) NOT NULL COMMENT '总金额',user_id INT NOT NULL COMMENT '负责人(逻辑外键关联users表的user_id)',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='销售记录表';insert into sales(sale_date, customer_name, customer_phone, supplier_id, medicine_id, quantity, unit_price, total_amount, user_id) VALUES(now(),'小扳手','11789332791',1,1,1,40,40,1);use pharmaceuticals;-- 创建退货记录表
CREATE TABLE returns (return_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '退货ID',customer_name VARCHAR(100) COMMENT '客户姓名',customer_phone VARCHAR(20) COMMENT '客户电话',medicine_id INT NOT NULL COMMENT '药品ID(逻辑外键关联medicines表的medicine_id)',supplier_id INT NOT NULL COMMENT '供应商ID(逻辑外键关联suppliers表的supplier_id)',sale_date DATE NOT NULL COMMENT '销售日期',sale_id INT NOT NULL COMMENT '销售ID(逻辑外键关联sales表的sale_id)',return_date DATE NOT NULL COMMENT '退货日期',total_amount DECIMAL(10, 2) NOT NULL COMMENT '退货总金额',reason TEXT COMMENT '退货原因',user_id INT NOT NULL COMMENT '处理人(逻辑外键关联users表的user_id)',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='退货记录表';-- 创建库存变动记录表
CREATE TABLE inventory_movements (movement_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '变动ID',supplier_id INT NOT NULL COMMENT '供应商ID(逻辑外键关联suppliers表的supplier_id)',medicine_id INT NOT NULL COMMENT '药品ID(逻辑外键关联medicines表的medicine_id)',movement_type INT NOT NULL COMMENT '变动类型:1.进货、2.销售、3.调整',quantity INT NOT NULL COMMENT '变动数量',movement_date DATE NOT NULL COMMENT '变动日期',reference_id INT COMMENT '参考ID(例如采购单ID或销售单ID)',note TEXT COMMENT '备注',user_id INT NOT NULL COMMENT '负责人(逻辑外键关联users表的user_id)',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='库存变动记录表';

        若需要项目完整源码,可以在 CSDN 私信给我,我每天都有查看消息的,感谢大家支持,希望可以帮助到大家!

相关文章:

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:药品进销存信息管理系统(前后端源码 + 数据库 sql 脚本)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 供应商管理功能 5.0 药品管理功能 6.0 采购记录管理功能 7.0 销售记录管理功能 8.0 退货记录管理功能…...

主流webgl 引擎 glsl 如何升级webgpu为 wgsl?

0、背景 SPIR-V、GLSL 和 WGSL 是三种不同的着色语言或中间表示形式&#xff0c;它们在现代图形编程中的关系如下&#xff1a; 1、playcanvas 方案: glsl 转 SPIR-V 转 wgsl 调研版本: "version": "2.4.0-dev"webgpu-shader.js transpile(src, shader…...

SSL证书部署(linux-nginx)

一、SSL证书的作用 HTTP协议无法加密数据,数据传输可能产生泄露、篡改或钓鱼攻击等问题。 SSL证书部署到Web服务器后,可帮助Web服务器和网站间建立可信的HTTPS协议加密链接,为网站安全加锁,保证数据安全传输。 二、前提条件 1.已通过数字证书管理服务控制台签发证书。 …...

SpringBoot3.3.0集成Knife4j4.5.0实战

原SpringBoot2.7.18升级至3.3.0之后&#xff0c;Knife4j进行同步升级(Spring Boot 3 只支持OpenAPI3规范)&#xff0c;从原3.0.3(knife4j-spring-boot-starter)版本升级至4.5.0(knife4j-openapi3-jakarta-spring-boot-starter)&#xff0c;以下是升级过程与注意事项等 版本信息…...

C# 的反射窗体的使用

C# 的反射窗体的使用 using System; using System.Reflection; using System.Windows.Forms;public class ReflectedFormFactory {public static Form CreateForm(string formName, string assemblyName){// 加载程序集Assembly assembly Assembly.Load(assemblyName);// 获取…...

大模型呼出机器人能够解决哪些问题?

大模型呼出机器人能够解决哪些问题&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼出机器人作为现代科技在客户服务领域的创新应用&#xff0c;能够解决多个方面的问题&#xff0c;以下是…...

密码学——密码学概述、分类、加密技术(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 密码学 大数据…...

Linux 入门教程:从命令行开始

Linux 是一个强大且灵活的操作系统&#xff0c;广泛应用于服务器、嵌入式设备、开发环境等领域。如果你是刚接触 Linux 的新手&#xff0c;最重要的一步就是掌握命令行操作。虽然 Linux 提供了图形界面&#xff0c;但很多强大功能只能通过命令行来实现。今天&#xff0c;我们就…...

Python中的异步编程:从基础到实践

在现代编程中,异步编程已经成为提高程序性能和响应能力的重要手段。Python,作为一种动态、解释型的高级编程语言,提供了多种异步编程的解决方案。本文将从Python异步编程的基础知识出发,逐步深入到实际应用中,帮助读者理解和掌握这一技术。 1. 异步编程简介 异步编程是一…...

如何使用 Python 实现简单的 Web 服务器?

为了实现一个简单的Web服务器&#xff0c;Python提供了多种方法。对于快速原型设计和学习目的来说&#xff0c;最简单的方法之一是使用内置的http.server模块。 然而&#xff0c;在实际开发中&#xff0c;更常见的做法是使用像Flask或Django这样的框架来构建更为复杂的应用程序…...

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用(2024/12/12补充)

最终效果 文章目录 最终效果更好的方式&#xff08;2024/12/12补充&#xff09;前言为什么使用CharacterControllerSimpleMove和Move如何选择&#xff1f;1. SimpleMove2. Move 配置CharacterController参数控制相机移动跳跃方式一方式二 下蹲处理下坡抖动问题实现奔跑和不同移…...

6_Sass 选择器函数 --[CSS预处理]

Sass 提供了一系列的选择器函数&#xff0c;用于操作和组合CSS选择器。这些函数可以帮助你更灵活地创建样式规则&#xff0c;并且可以减少重复代码。以下是几个常用的选择器函数及其用法&#xff1a; 1. selector-append($selector1, $selector2...) selector-append($select…...

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省&#xff0c;就是自我反省、自我检查&#xff0c;自知己短&#xff0c;从而弥补短处、纠正过失。佛陀强调自觉觉他&#xff0c;强调以达到觉行圆满为修行的最高境界。要改正错误&#xff0c;除了虚心接受他人意见之外&#xff0c;还要不忘时时观照己身。自省自悟之…...

C# 探险之旅:第三十五节 - 类型class之抽象类 (Abstract Class) 和 抽象方法 (Abstract Method)

&#x1f44b; 嗨&#xff0c;勇敢的探险家们&#xff01;欢迎再次踏上C#的神秘之旅。今天&#xff0c;我们要进入一片既神秘又充满无限可能的领域——抽象类与抽象函数的奇幻森林。想象一下&#xff0c;你是一名勇敢的骑士&#xff0c;要在这片森林里寻找传说中的“编程之宝”…...

npm内存溢出

项目过大运行项目内存溢出 报错代码 运行内存溢出 increase-memory-limit ‘“node --max-old-space-size8192”’ 不是内部或外部命令&#xff0c;也不是可运行的程序 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of m…...

CSS|08 浮动清除浮动

浮动 需求: 能够实现让多个元素排在同一行&#xff0c;并且给这些元素设置宽度与高度! 让多个元素排在同一行:行内元素的特性 给这些元素设置宽高:块级元素的特性 在标准文档流中的元素只有两种:块级元素和行内元素。如果想让一些元素既要有块级元素的特点也要有行内元素的特…...

【学习笔记】反向传播到底是如何进行的?

文章目录 一、写在前面二、举个例子三、混合损失函数如何进行呢&#xff1f; 一、写在前面 不知道小伙伴们有没有考虑过这种感觉&#xff0c;在最开始学习深度学习的时候&#xff0c;一定都了解过前向传播&#xff0c;反向传播等等&#xff0c;但是在实际的操作过程中却“几乎…...

利用cnocr库完成中文扫描pdf文件的文字识别

很多pdf文件文字识别软件都会收费&#xff0c;免费的网页版可能会带来信息泄露&#xff0c;还有一些类似于腾讯AI和百度AI的接口都有调用次数限制&#xff0c;因此&#xff0c;利用识别正确率极高且免费的cnocr库来自己动手做个pdf文件文字识别程序就是一个很不错的选择。以下程…...

el-table ToggleRowSelection实现取消选中没效果(virtual-scroll)

场景&#xff1a; 就是在虚拟列表el-table选中之后 点击查询 默认之前选中的 现象&#xff1a; 就是实现选中&#xff0c; 但是无法去除勾选等等 问题发现&#xff1a; 看定位的数据 有多个一样的&#xff0c;我想着勾选之前 先去掉勾选 &#xff0c;但是没效果或者说“相同的…...

Vue入门到精通:运行环境

Vue入门到精通&#xff1a;运行环境 Vue3的运行环境搭建主要有两种方法&#xff1a;一种是直接在页面中引入Vue库&#xff0c;另一种是通过脚手架工具创建Vue项目。 &#xff08;一&#xff09;页面直接引入Vue库 页面直接引入Vue库的方法&#xff0c;是指在HTML网页中通过s…...

LNK2001: virtual struct QMetaObject const 错误的解决方法和原因

目录 1.现象 2.原因分析 3.解决方法 3.1.方法1 3.2.方法2 1.现象 今天调整了下工程目录结构(环境是VS2019Qt5.12.12)&#xff0c;重新编译突然出现以下错误&#xff1a; 没有修改代码&#xff0c;怎么就出现这个错误了呢&#xff1f;从上面的错误来看&#xff0c;其实就是…...

电脑win11家庭版升级专业版和企业版相关事项

我的是零刻ser9&#xff0c;自带win11家庭版&#xff0c;但是我有远程操控需求&#xff0c;想用windows系统自带的远程连接功能&#xff0c;所以需要升级为专业版。然后在系统激活页面通过更改序列号方式&#xff0c;淘宝几块钱买了个序列号升级成功专业版了。但是&#xff0c;…...

用户认证系统登录界面

下面是使用HTML和JavaScript实现的一个中文版登录界面&#xff0c;包含登录、注册和修改密码功能。注册成功后会显示提示信息&#xff0c;在登录成功后进入一个大大的欢迎页面。 1.代码展示 <!DOCTYPE html> <html lang"zh-CN"> <head><meta …...

深圳国威HB1910数字IP程控交换机 generate.php 远程命令执行漏洞复现

0x01 产品描述: 深圳国威主营国威模拟、数字、IP 交换机、语音网关、IP 电话机及各种电话机。深圳国威电子有限公司HB1910是一款功能强大的网络通信设备,适用于各种企业通信需求。 0x02 漏洞描述: 深圳国威电子有限公司HB1910数字IP程控交换机generate.php存在远程命令执行…...

客户端(浏览器)vue3本地预览txt,doc,docx,pptx,pdf,xlsx,csv,

预览文件 1、入口文件preview/index.vue2、预览txt3、预览doc4、预览pdf5、预览pptx6、预览xlsx7、预览csv 1、入口文件preview/index.vue 预览样式&#xff0c;如pdf 文件目录如图所示&#xff1a; 代码如下 <template><div class"preview-wrap" ref&…...

(八)机器学习 - 线性回归

线性回归&#xff08;Linear Regression&#xff09;是一种统计学方法&#xff0c;用于建立一个或多个自变量&#xff08;解释变量&#xff09;与因变量&#xff08;响应变量&#xff09;之间的线性关系。线性回归的目的是通过最小化预测误差来找到最佳的线性拟合模型&#xff…...

Springboot 整合 Java DL4J 打造金融风险评估系统

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s…...

CSDN博客:如何使用Python的`datasets`库转换音频采样率

CSDN博客&#xff1a;如何使用Python的datasets库转换音频采样率 什么是采样率&#xff1f;代码用途&#xff1a;调整音频数据的采样率完整代码示例代码详解运行结果&#xff08;示例&#xff09;总结 在这篇文章中&#xff0c;我们将学习如何使用Python的datasets库对音频数据…...

geoserver(1) 发布sql 图层 支持自定义参数

前提使用postgis 数据库支持关联 join 支持 in,not in,like,及其他sql原生函数 新增sql图层 编写自定义sql 编辑sql语句必须输出带有geom数据 正则表达式去除 设置id以及坐标参考系 预览sql图层效果 拼接sql参数 http://xxx.com/geoserver/weather/wms?SERVICEWMS&VERSI…...

从 Router 到 Navigation:HarmonyOS 路由框架的全面升级与迁移指南

在本教程中&#xff0c;我们深入探讨了 Router 和 Navigation 在 HarmonyOS 中的用法差异及如何从 Router 切换到 Navigation 的方法。重点涵盖了页面跳转、转场动画、生命周期管理以及跨包路由的实现。 页面结构对比 Router 页面结构 每个页面需要使用 Entry 注解。 页面需要…...

http1.1 vs http2.0 速度对比实测

首先对比一下http1.1 vs http2.0 区别&#xff1a; 1. 连接管理&#xff1a; HTTP/1.1: 每个请求/响应都需要一个独立的 TCP 连接&#xff0c;虽然可以使用持久连接&#xff08;keep-alive&#xff09;来复用连接&#xff0c;但仍然存在请求队头阻塞&#xff08;Head-of-Line…...

uniappp配置导航栏自定义按钮(解决首次加载图标失败问题)

1.引入iconfont的图标&#xff0c;只保留这两个文件 2.App.vue引入到全局中 import "./static/fonts/iconfont.css"3.pages.json中配置text为图标对应的unicode {"path": "pages/invite/invite","style": {"h5": {"…...

vue运行项目时local有显示 但是network却显示unavailable

问题描述 日常开发中 和后端本地调试时 后端需要使用你的本地去访问页面 可运行项目时会出现network显示unavailable的情况 解决方式 1.其实这只是vue脚手架对于ip地址获取的方式兼容上有一些问题 但其实是不影响ip访问本地的 你可以直接cmd内ipconfig去查看自己的ip然后…...

【Java学习笔记】JUnit

一、为什么需要 JUnit 二、基本介绍 三、实现方法 第一次添加&#xff1a; 在需要测试的方法处输入 Test注解&#xff0c;快捷键AltInsert选择添加版本&#xff08;常用JUnit5.4&#xff09; 出现绿色箭头可进行测试和编译...

Next.js配置教程:构建自定义服务器

更多有关Next.js教程&#xff0c;请查阅&#xff1a; 【目录】Next.js 独立开发系列教程-CSDN博客 目录 前言 1. 什么是自定义服务器&#xff1f; 2. 配置自定义服务器 2.1 基础配置 2.2 集成不同的服务器框架 使用Fastify 使用Koa 3. 自定义服务器的高级功能 3.1 路…...

el-table 动态计算合并行

原始表格及代码 <el-table:data"tableData"class"myTable"header-row-class-name"tableHead" ><el-table-column prop"date" label"日期"> </el-table-column><el-table-column prop"name" …...

【杭州电商商城系统开发建设】

杭州电商商城系统开发建设是一项综合性的工程&#xff0c;它涉及到多个方面的内容。以下是对杭州电商商城系统开发建设的详细分析&#xff1a; 需求分析&#xff1a;深入了解用户需求&#xff0c;包括用户群体特征、购物习惯、支付偏好等&#xff0c;为系统设计提供基础。明确…...

架构实践05-互联网架构模板

零、文章目录 架构实践05-互联网架构模板 1、技术演进的方向 &#xff08;1&#xff09;技术演进的方向判断 潮流派&#xff1a;热衷于新技术&#xff0c;紧跟技术潮流&#xff0c;但可能面临技术不成熟的风险和学习成本。保守派&#xff1a;强调稳定&#xff0c;对新技术持…...

家校通小程序实战教程10部门管理前后端连接

目录 1 加载后端的数据2 为什么不直接给变量赋值3 保存部门信息4 最终的效果5 总结 现在部门管理已经完成了后端功能和前端开发&#xff0c;就需要在前端调用后端的数据完成界面的展示&#xff0c;而且在录入部门信息后需要提交到数据库里&#xff0c;本篇我们介绍一下前后端如…...

【前端面试题】书、定位问题、困难

看过什么书 《JavaScript 高级程序设计&#xff08;第 4 版&#xff09;》&#xff08;作者&#xff1a;Matt Frisbie&#xff09; 这是一本深入学习 JavaScript 语言的经典书籍。它详细地涵盖了 JavaScript 的高级特性&#xff0c;包括原型链、闭包、异步编程等复杂概念。以闭…...

VSCode设置字体

参考文章&#xff1a;【面向小白】vscode最佳实践&#xff08;2&#xff09;—— 字体设置&#xff08;fira code更纱黑体&#xff09;&#xff0c;这篇文章末尾给了安装字体的链接。 配置的字体还是很好看的。 ‘Fira Code Retina’, ‘Sarasa Mono Sc’ 需要注意的一个点&am…...

《机器学习》2.4假设检验 t分布 F分布

目录 t发布 注意是这个东西服从t分布 数据服从t分布通常是在以下情况下&#xff1a; 以下是一些具体的例子&#xff0c;说明在何种情况下数据会服从t分布&#xff1a; t检验 交叉验证t检验 样本方差​编辑 F分布&#xff08;fisher Friedman检验是一种非参数统计方法&a…...

Mysql之视图

MySQL 视图&#xff08;View&#xff09; 1. 概念 视图是一个虚拟的表&#xff0c;它是基于 SELECT 查询的结果集。视图不存储实际数据&#xff0c;而是动态地从基表中提取数据。视图可以简化复杂查询、提高数据安全性&#xff08;限制访问特定列或行&#xff09;以及提供数据…...

kafka学习笔记

kafka消息中间件精讲 - B站动力节点 JDK17在Windows安装及环境变量配置超详细的教程 Windows 多版本java 装多个版本jdk Windows同时安装多个JDK jdk17下载与安装教程&#xff08;win10&#xff09;&#xff0c;超详细 jdk17-archive-downloads 如何在IDEA中配置指定JDK版…...

【保姆级教程】基于OpenCV+Python的人脸识别上课签到系统

【保姆级教程】基于OpenCVPython的人脸识别上课签到系统 一、软件安装及环境配置1. 安装IDE&#xff1a;PyCharm2. 搭建Python的环境3. 新建项目、安装插件、库 二、源文件编写1. 采集人脸.py2. 训练模型.py3. 生成表格.py4. 识别签到.py5. 创建图形界面.py 三、相关函数分析1.…...

LVS能否实现两台服务器的负载均衡

LVS能否实现两台服务器的负载均衡 是的&#xff0c;LVS&#xff08;Linux Virtual Server&#xff09;可以实现两台服务器的负载均衡&#xff0c;并且它非常适合这种场景。 LVS&#xff08;Linux Virtual Server&#xff09;简介&#xff1a; LVS 是一种基于 Linux 的负载均…...

智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析

随着工业化程度的提高&#xff0c;生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间&#xff0c;人员误入或违规进入将带来严重的安全隐患。为了解决这一问题&#xff0c;迈尔微视推出了智能人体安全检测解决方案&#xff0c;为企业提供全方位的人员安全监…...

JAVA后端实现全国区县下拉选择--树形结构

设计图如图&#xff1a; 直接上代码 数据库中的格式&#xff1a; JAVA实体类&#xff1a; Data public class SysAreaZoningDO {private Long districtId;private Long parentId;private String districtName;private List<SysAreaZoningDO> children; } MapperSQL语句…...

DVWA及其他常见网络靶场

常见网络靶场 Metasploitable2 介绍&#xff1a; Metasploitable2 是一个用于安全培训和测试渗透测试工具的虚拟靶机。它故意配置了许多已知的安全漏洞&#xff0c;涵盖了操作系统、网络服务等多个方面。基于 Ubuntu Linux 操作系统构建&#xff0c;包含了如 Apache、MySQL、FT…...

API接口安全:电商数据保护的坚固防线

随着电子商务的蓬勃发展&#xff0c;电商平台的数据安全和隐私保护成为了至关重要的议题。API&#xff08;应用程序编程接口&#xff09;作为电商平台与外部系统交互的桥梁&#xff0c;其安全性直接关系到整个平台的数据保护能力。本文将从API接口安全的重要性、面临的安全威胁…...