Compare commits

...

22 Commits

@ -100,3 +100,4 @@
![](https://code.educoder.net/api/pcjs8mx7g/warehouse/raw/src%2Fmain%2Fresources%2Fstatic%2Fimages%2Fsales.PNG?ref=master)
商品销售退货管理
![](https://code.educoder.net/api/pcjs8mx7g/warehouse/raw/src%2Fmain%2Fresources%2Fstatic%2Fimages%2Fsalesback.PNG?ref=master)
//这是一个测试

@ -1,25 +1,24 @@
package com.yeqifu.bus.controller;
package com.yeqifu.bus.controller; // 定义包路径
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入查询包装器类
import com.baomidou.mybatisplus.core.metadata.IPage; // 导入分页接口
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入分页实现类
import com.yeqifu.bus.entity.Customer; // 导入客户实体类
import com.yeqifu.bus.service.ICustomerService; // 导入客户服务接口
import com.yeqifu.bus.vo.CustomerVo; // 导入客户视图对象
import com.yeqifu.sys.common.Constast; // 导入常量类
import com.yeqifu.sys.common.DataGridView; // 导入数据网格返回类
import com.yeqifu.sys.common.ResultObj; // 导入结果对象类
import io.swagger.annotations.ApiImplicitParam; // 导入Swagger参数注解
import io.swagger.annotations.ApiImplicitParams; // 导入Swagger参数列表注解
import io.swagger.annotations.ApiOperation; // 导入Swagger操作注解
import org.apache.commons.lang3.StringUtils; // 导入字符串工具类
import org.springframework.beans.factory.annotation.Autowired; // 导入Spring的依赖注入注解
import org.springframework.web.bind.annotation.RequestMapping; // 导入请求映射注解
import org.springframework.web.bind.annotation.RequestMethod; // 导入请求方法注解
import org.springframework.web.bind.annotation.RestController; // 导入控制器注解
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeqifu.bus.entity.Customer;
import com.yeqifu.bus.service.ICustomerService;
import com.yeqifu.bus.vo.CustomerVo;
import com.yeqifu.sys.common.Constast;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.List; // 导入列表类
/**
* <p>
@ -29,29 +28,27 @@ import java.util.List;
* @author luoyi-
* @since 2019-12-05
*/
@RestController
@RequestMapping("/customer")
@RestController // 标注为REST控制器
@RequestMapping("/customer") // 设置请求路径为/customer
public class CustomerController {
@Autowired
private ICustomerService customerService;
@Autowired // 自动注入客户服务接口实现类
private ICustomerService customerService; // 定义客户服务接口实例
/**
*
* @param customerVo
* @return
*/
@RequestMapping("loadAllCustomer")
public DataGridView loadAllCustomer(CustomerVo customerVo){
//1.声明分页page对象
IPage<Customer> page = new Page<Customer>(customerVo.getPage(),customerVo.getLimit());
//2.声明queryWrapper
QueryWrapper<Customer> queryWrapper = new QueryWrapper<Customer>();
queryWrapper.like(StringUtils.isNotBlank(customerVo.getCustomername()),"customername",customerVo.getCustomername());
queryWrapper.like(StringUtils.isNotBlank(customerVo.getConnectionpersion()),"connectionpersion",customerVo.getConnectionpersion());
queryWrapper.like(StringUtils.isNotBlank(customerVo.getPhone()),"phone",customerVo.getPhone());
customerService.page(page,queryWrapper);
return new DataGridView(page.getTotal(),page.getRecords());
@RequestMapping("loadAllCustomer") // 映射路径为/loadAllCustomer
public DataGridView loadAllCustomer(CustomerVo customerVo){ // 查询所有客户方法
IPage<Customer> page = new Page<Customer>(customerVo.getPage(),customerVo.getLimit()); // 声明分页对象
QueryWrapper<Customer> queryWrapper = new QueryWrapper<Customer>(); // 声明查询包装器
queryWrapper.like(StringUtils.isNotBlank(customerVo.getCustomername()),"customername",customerVo.getCustomername()); // 根据客户名模糊查询
queryWrapper.like(StringUtils.isNotBlank(customerVo.getConnectionpersion()),"connectionpersion",customerVo.getConnectionpersion()); // 根据联系人模糊查询
queryWrapper.like(StringUtils.isNotBlank(customerVo.getPhone()),"phone",customerVo.getPhone()); // 根据手机号模糊查询
customerService.page(page,queryWrapper); // 调用分页查询服务
return new DataGridView(page.getTotal(),page.getRecords()); // 返回分页数据
}
/**
@ -59,14 +56,14 @@ public class CustomerController {
* @param customerVo
* @return
*/
@RequestMapping("addCustomer")
public ResultObj addCustomer(CustomerVo customerVo){
@RequestMapping("addCustomer") // 映射路径为/addCustomer
public ResultObj addCustomer(CustomerVo customerVo){ // 添加客户方法
try {
customerService.save(customerVo);
return ResultObj.ADD_SUCCESS;
customerService.save(customerVo); // 保存客户数据
return ResultObj.ADD_SUCCESS; // 返回添加成功结果
} catch (Exception e) {
e.printStackTrace();
return ResultObj.ADD_ERROR;
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.ADD_ERROR; // 返回添加失败结果
}
}
@ -75,14 +72,14 @@ public class CustomerController {
* @param customerVo
* @return
*/
@RequestMapping("updateCustomer")
public ResultObj updateCustomer(CustomerVo customerVo){
@RequestMapping("updateCustomer") // 映射路径为/updateCustomer
public ResultObj updateCustomer(CustomerVo customerVo){ // 修改客户方法
try {
customerService.updateById(customerVo);
return ResultObj.UPDATE_SUCCESS;
customerService.updateById(customerVo); // 根据ID更新客户数据
return ResultObj.UPDATE_SUCCESS; // 返回更新成功结果
} catch (Exception e) {
e.printStackTrace();
return ResultObj.UPDATE_ERROR;
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.UPDATE_ERROR; // 返回更新失败结果
}
}
@ -91,31 +88,29 @@ public class CustomerController {
* @param id ID
* @return
*/
@ApiOperation(value = "删除一个客户",notes = "删除一个客户")
@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "客户ID",required = true,paramType = "query",dataType = "Integer")})
@RequestMapping(value = "deleteCustomer",method = RequestMethod.DELETE)
public ResultObj deleteCustomer(Integer id){
@ApiOperation(value = "删除一个客户",notes = "删除一个客户") // Swagger注解描述操作内容
@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "客户ID",required = true,paramType = "query",dataType = "Integer")}) // Swagger注解描述参数信息
@RequestMapping(value = "deleteCustomer",method = RequestMethod.DELETE) // 映射路径为/deleteCustomer方法为DELETE
public ResultObj deleteCustomer(Integer id){ // 删除客户方法
try {
customerService.deleteCustomerById(id);
return ResultObj.DELETE_SUCCESS;
customerService.deleteCustomerById(id); // 调用服务删除客户
return ResultObj.DELETE_SUCCESS; // 返回删除成功结果
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.DELETE_ERROR; // 返回删除失败结果
}
}
/**
*
* @return
*/
@RequestMapping("loadAllCustomerForSelect")
public DataGridView loadAllCustomerForSelect(){
QueryWrapper<Customer> queryWrapper = new QueryWrapper<Customer>();
queryWrapper.eq("available", Constast.AVAILABLE_TRUE);
List<Customer> list = customerService.list(queryWrapper);
return new DataGridView(list);
@RequestMapping("loadAllCustomerForSelect") // 映射路径为/loadAllCustomerForSelect
public DataGridView loadAllCustomerForSelect(){ // 加载客户下拉列表方法
QueryWrapper<Customer> queryWrapper = new QueryWrapper<Customer>(); // 声明查询包装器
queryWrapper.eq("available", Constast.AVAILABLE_TRUE); // 查询可用客户数据
List<Customer> list = customerService.list(queryWrapper); // 获取客户列表
return new DataGridView(list); // 返回客户数据
}
}

@ -1,184 +1,219 @@
package com.yeqifu.bus.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeqifu.bus.entity.Goods;
import com.yeqifu.bus.entity.Provider;
import com.yeqifu.bus.service.IGoodsService;
import com.yeqifu.bus.service.IProviderService;
import com.yeqifu.bus.vo.GoodsVo;
import com.yeqifu.sys.common.AppFileUtils;
import com.yeqifu.sys.common.Constast;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
// 导入必要的类和注解
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 用于条件查询的封装器
import com.baomidou.mybatisplus.core.metadata.IPage; // 分页结果封装类
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 分页类
import com.yeqifu.bus.entity.Goods; // 商品实体类
import com.yeqifu.bus.entity.Provider; // 供应商实体类
import com.yeqifu.bus.service.IGoodsService; // 商品服务接口
import com.yeqifu.bus.service.IProviderService; // 供应商服务接口
import com.yeqifu.bus.vo.GoodsVo; // 商品视图对象
import com.yeqifu.sys.common.AppFileUtils; // 文件操作工具类
import com.yeqifu.sys.common.Constast; // 常量类
import com.yeqifu.sys.common.DataGridView; // 数据网格返回格式类
import com.yeqifu.sys.common.ResultObj; // 结果对象类
import org.apache.commons.lang3.StringUtils; // 字符串工具类
import org.springframework.beans.factory.annotation.Autowired; // 自动注入注解
import org.springframework.web.bind.annotation.RequestMapping; // 映射请求路径注解
import org.springframework.web.bind.annotation.RestController; // REST 控制器注解
import java.util.List; // Java 集合类
/**
* <p>
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`)
* </p>
*
* @author luoyi-
* @since 2019-12-06
*
*
*/
@RestController
@RequestMapping("/goods")
@RestController // 标注为 REST 控制器,返回 JSON 数据
@RequestMapping("/goods") // 设置请求路径的统一前缀
public class GoodsController {
@Autowired
@Autowired // 自动注入商品服务
private IGoodsService goodsService;
@Autowired
@Autowired // 自动注入供应商服务
private IProviderService providerService;
/**
*
* @param goodsVo
* @return
*
* @param goodsVo
* @return
*/
@RequestMapping("loadAllGoods")
public DataGridView loadAllGoods(GoodsVo goodsVo){
IPage<Goods> page = new Page<Goods>(goodsVo.getPage(),goodsVo.getLimit());
@RequestMapping("loadAllGoods") // 请求映射到 /goods/loadAllGoods
public DataGridView loadAllGoods(GoodsVo goodsVo) {
// 创建分页对象,指定当前页和每页大小
IPage<Goods> page = new Page<Goods>(goodsVo.getPage(), goodsVo.getLimit());
// 构造查询条件
QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
queryWrapper.eq(goodsVo.getProviderid()!=null&&goodsVo.getProviderid()!=0,"providerid",goodsVo.getProviderid());
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getGoodsname()),"goodsname",goodsVo.getGoodsname());
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getProductcode()),"productcode",goodsVo.getProductcode());
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getPromitcode()),"promitcode",goodsVo.getPromitcode());
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getDescription()),"description",goodsVo.getDescription());
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getSize()),"size",goodsVo.getSize());
queryWrapper.orderByDesc("id");
goodsService.page(page,queryWrapper);
queryWrapper.eq(goodsVo.getProviderid() != null && goodsVo.getProviderid() != 0, "providerid", goodsVo.getProviderid()); // 按供应商 ID 查询
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getGoodsname()), "goodsname", goodsVo.getGoodsname()); // 按商品名称模糊查询
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getProductcode()), "productcode", goodsVo.getProductcode()); // 按商品编码模糊查询
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getPromitcode()), "promitcode", goodsVo.getPromitcode()); // 按促销编码模糊查询
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getDescription()), "description", goodsVo.getDescription()); // 按描述模糊查询
queryWrapper.like(StringUtils.isNotBlank(goodsVo.getSize()), "size", goodsVo.getSize()); // 按尺寸模糊查询
queryWrapper.orderByDesc("id"); // 按 ID 降序排序
// 执行分页查询
goodsService.page(page, queryWrapper);
// 获取查询结果
List<Goods> records = page.getRecords();
for (Goods goods : records) {
// 根据商品的供应商 ID 查询供应商信息,并设置供应商名称
Provider provider = providerService.getById(goods.getProviderid());
if (null!=provider){
if (provider != null) {
goods.setProvidername(provider.getProvidername());
}
}
return new DataGridView(page.getTotal(),page.getRecords());
// 返回分页数据和商品记录
return new DataGridView(page.getTotal(), page.getRecords());
}
/**
*
* @param goodsVo
* @return
* @param goodsVo
* @return
*/
@RequestMapping("addGoods")
public ResultObj addGoods(GoodsVo goodsVo){
@RequestMapping("addGoods") // 请求映射到 /goods/addGoods
public ResultObj addGoods(GoodsVo goodsVo) {
try {
System.out.println("====================================");
System.out.println(goodsVo.getGoodsimg());
if (goodsVo.getGoodsimg()!=null&&goodsVo.getGoodsimg().endsWith("_temp")){
System.out.println(goodsVo.getGoodsimg()); // 打印上传的商品图片路径
// 如果上传的图片路径是临时文件,则重命名为正式文件
if (goodsVo.getGoodsimg() != null && goodsVo.getGoodsimg().endsWith("_temp")) {
String newName = AppFileUtils.renameFile(goodsVo.getGoodsimg());
goodsVo.setGoodsimg(newName);
goodsVo.setGoodsimg(newName); // 更新图片路径
}
// 保存商品信息
goodsService.save(goodsVo);
// 返回添加成功的结果
return ResultObj.ADD_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.ADD_ERROR;
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.ADD_ERROR; // 返回添加失败的结果
}
}
/**
*
* @param goodsVo
* @return
* @param goodsVo
* @return
*/
@RequestMapping("updateGoods")
public ResultObj updateGoods(GoodsVo goodsVo){
@RequestMapping("updateGoods") // 请求映射到 /goods/updateGoods
public ResultObj updateGoods(GoodsVo goodsVo) {
try {
//商品图片不是默认图片
if (!(goodsVo.getGoodsimg()!=null&&goodsVo.getGoodsimg().equals(Constast.DEFAULT_IMG_GOODS))){
if (goodsVo.getGoodsimg().endsWith("_temp")){
String newName = AppFileUtils.renameFile(goodsVo.getGoodsimg());
// 如果商品图片不是默认图片,则处理图片路径
if (!(goodsVo.getGoodsimg() != null && goodsVo.getGoodsimg().equals(Constast.DEFAULT_IMG_GOODS))) {
if (goodsVo.getGoodsimg().endsWith("_temp")) {
String newName = AppFileUtils.renameFile(goodsVo.getGoodsimg()); // 重命名图片文件
goodsVo.setGoodsimg(newName);
//删除原先的图片
// 删除原先的图片文件
String oldPath = goodsService.getById(goodsVo.getId()).getGoodsimg();
AppFileUtils.removeFileByPath(oldPath);
}
}
// 更新商品信息
goodsService.updateById(goodsVo);
// 返回更新成功的结果
return ResultObj.UPDATE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.UPDATE_ERROR;
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.UPDATE_ERROR; // 返回更新失败的结果
}
}
/**
*
* @param id id
* @return
* @param id ID
* @param goodsimg
* @return
*/
@RequestMapping("deleteGoods")
public ResultObj deleteGoods(Integer id,String goodsimg){
@RequestMapping("deleteGoods") // 请求映射到 /goods/deleteGoods
public ResultObj deleteGoods(Integer id, String goodsimg) {
try {
//删除商品的图片
// 删除商品的图片文件
AppFileUtils.removeFileByPath(goodsimg);
// goodsService.removeById(id);
// 删除商品信息
goodsService.deleteGoodsById(id);
// 返回删除成功的结果
return ResultObj.DELETE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.DELETE_ERROR; // 返回删除失败的结果
}
}
/**
*
* @return
* @return
*/
@RequestMapping("loadAllGoodsForSelect")
public DataGridView loadAllGoodsForSelect(){
@RequestMapping("loadAllGoodsForSelect") // 请求映射到 /goods/loadAllGoodsForSelect
public DataGridView loadAllGoodsForSelect() {
// 构造查询条件,仅查询状态为可用的商品
QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
queryWrapper.eq("available",Constast.AVAILABLE_TRUE);
queryWrapper.eq("available", Constast.AVAILABLE_TRUE);
// 查询商品列表
List<Goods> list = goodsService.list(queryWrapper);
for (Goods goods : list) {
// 设置供应商名称
Provider provider = providerService.getById(goods.getProviderid());
if (null!=provider){
if (provider != null) {
goods.setProvidername(provider.getProvidername());
}
}
// 返回商品列表
return new DataGridView(list);
}
/**
* ID
* @param providerid ID
* @return
* ID
* @param providerid ID
* @return
*/
@RequestMapping("loadGoodsByProviderId")
public DataGridView loadGoodsByProviderId(Integer providerid){
@RequestMapping("loadGoodsByProviderId") // 请求映射到 /goods/loadGoodsByProviderId
public DataGridView loadGoodsByProviderId(Integer providerid) {
// 构造查询条件,仅查询状态为可用的商品
QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
queryWrapper.eq("available",Constast.AVAILABLE_TRUE);
queryWrapper.eq(providerid!=null,"providerid",providerid);
queryWrapper.eq("available", Constast.AVAILABLE_TRUE);
queryWrapper.eq(providerid != null, "providerid", providerid); // 按供应商 ID 查询
// 查询商品列表
List<Goods> list = goodsService.list(queryWrapper);
for (Goods goods : list) {
// 设置供应商名称
Provider provider = providerService.getById(goods.getProviderid());
if (null!=provider){
if (provider != null) {
goods.setProvidername(provider.getProvidername());
}
}
// 返回商品列表
return new DataGridView(list);
}
@RequestMapping("loadAllWarningGoods")
public DataGridView loadAllWarningGoods(){
/**
*
* @return
*/
@RequestMapping("loadAllWarningGoods") // 请求映射到 /goods/loadAllWarningGoods
public DataGridView loadAllWarningGoods() {
// 查询所有库存预警的商品
List<Goods> goods = goodsService.loadAllWarning();
return new DataGridView((long) goods.size(),goods);
}
// 返回预警商品的数量和列表
return new DataGridView((long) goods.size(), goods);
}
}

@ -1,141 +1,128 @@
package com.yeqifu.bus.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeqifu.bus.entity.Goods;
import com.yeqifu.bus.entity.Inport;
import com.yeqifu.bus.entity.Provider;
import com.yeqifu.bus.service.IGoodsService;
import com.yeqifu.bus.service.IInportService;
import com.yeqifu.bus.service.IProviderService;
import com.yeqifu.bus.vo.InportVo;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
import com.yeqifu.sys.common.WebUtils;
import com.yeqifu.sys.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
package com.yeqifu.bus.controller; // 定义包名
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; // 导入条件查询封装器
import com.baomidou.mybatisplus.core.metadata.IPage; // 导入分页结果封装类
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; // 导入分页类
import com.yeqifu.bus.entity.Goods; // 导入商品实体类
import com.yeqifu.bus.entity.Inport; // 导入商品进货实体类
import com.yeqifu.bus.entity.Provider; // 导入供应商实体类
import com.yeqifu.bus.service.IGoodsService; // 导入商品服务接口
import com.yeqifu.bus.service.IInportService; // 导入商品进货服务接口
import com.yeqifu.bus.service.IProviderService; // 导入供应商服务接口
import com.yeqifu.bus.vo.InportVo; // 导入进货视图对象
import com.yeqifu.sys.common.DataGridView; // 导入数据网格返回格式类
import com.yeqifu.sys.common.ResultObj; // 导入操作结果对象类
import com.yeqifu.sys.common.WebUtils; // 导入 Web 工具类
import com.yeqifu.sys.entity.User; // 导入用户实体类
import org.springframework.beans.factory.annotation.Autowired; // 导入自动注入注解
import org.springframework.web.bind.annotation.RequestMapping; // 导入请求映射注解
import org.springframework.web.bind.annotation.RestController; // 导入 REST 控制器注解
import java.util.Date; // 导入日期类
import java.util.List; // 导入 Java 集合类
/**
* <p>
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`); (`goo
* </p>
*
* @author luoyi-
* @since 2019-12-18
*
*
*/
@RestController
@RequestMapping("inport")
@RestController // 标注为 REST 控制器,返回 JSON 数据
@RequestMapping("inport") // 设置请求路径的统一前缀
public class InportController {
@Autowired
@Autowired // 自动注入商品进货服务
private IInportService inportService;
@Autowired
@Autowired // 自动注入供应商服务
private IProviderService providerService;
@Autowired
@Autowired // 自动注入商品服务
private IGoodsService goodsService;
/**
*
* @param inportVo
* @return
*
* @param inportVo
* @return
*/
@RequestMapping("loadAllInport")
public DataGridView loadAllInport(InportVo inportVo){
IPage<Inport> page = new Page<Inport>(inportVo.getPage(),inportVo.getLimit());
QueryWrapper<Inport> queryWrapper = new QueryWrapper<Inport>();
//对供应商进行查询
queryWrapper.eq(inportVo.getProviderid()!=null&&inportVo.getProviderid()!=0,"providerid",inportVo.getProviderid());
//对商品进行查询
queryWrapper.eq(inportVo.getGoodsid()!=null&&inportVo.getGoodsid()!=0,"goodsid",inportVo.getGoodsid());
//对时间进行查询要求大于开始时间小于结束时间
queryWrapper.ge(inportVo.getStartTime()!=null,"inporttime",inportVo.getStartTime());
queryWrapper.le(inportVo.getEndTime()!=null,"inporttime",inportVo.getEndTime());
//通过进货时间对商品进行排序
queryWrapper.orderByDesc("inporttime");
IPage<Inport> page1 = inportService.page(page, queryWrapper);
List<Inport> records = page1.getRecords();
for (Inport inport : records) {
Provider provider = providerService.getById(inport.getProviderid());
if (provider!=null){
//设置供应商姓名
inport.setProvidername(provider.getProvidername());
@RequestMapping("loadAllInport") // 请求映射到 /inport/loadAllInport
public DataGridView loadAllInport(InportVo inportVo) {
IPage<Inport> page = new Page<Inport>(inportVo.getPage(), inportVo.getLimit()); // 创建分页对象,指定当前页和每页大小
QueryWrapper<Inport> queryWrapper = new QueryWrapper<Inport>(); // 构造查询条件对象
queryWrapper.eq(inportVo.getProviderid() != null && inportVo.getProviderid() != 0, "providerid", inportVo.getProviderid()); // 按供应商 ID 查询
queryWrapper.eq(inportVo.getGoodsid() != null && inportVo.getGoodsid() != 0, "goodsid", inportVo.getGoodsid()); // 按商品 ID 查询
queryWrapper.ge(inportVo.getStartTime() != null, "inporttime", inportVo.getStartTime()); // 查询大于等于开始时间的数据
queryWrapper.le(inportVo.getEndTime() != null, "inporttime", inportVo.getEndTime()); // 查询小于等于结束时间的数据
queryWrapper.orderByDesc("inporttime"); // 按进货时间降序排序
IPage<Inport> page1 = inportService.page(page, queryWrapper); // 执行分页查询
List<Inport> records = page1.getRecords(); // 获取查询结果
for (Inport inport : records) { // 遍历查询结果
Provider provider = providerService.getById(inport.getProviderid()); // 根据供应商 ID 查询供应商信息
if (provider != null) { // 如果供应商信息存在
inport.setProvidername(provider.getProvidername()); // 设置供应商名称
}
Goods goods = goodsService.getById(inport.getGoodsid());
if (goods!=null){
//设置商品名称
inport.setGoodsname(goods.getGoodsname());
//设置商品规格
inport.setSize(goods.getSize());
Goods goods = goodsService.getById(inport.getGoodsid()); // 根据商品 ID 查询商品信息
if (goods != null) { // 如果商品信息存在
inport.setGoodsname(goods.getGoodsname()); // 设置商品名称
inport.setSize(goods.getSize()); // 设置商品规格
}
}
return new DataGridView(page1.getTotal(),page1.getRecords());
}
return new DataGridView(page1.getTotal(), page1.getRecords()); // 返回分页数据和进货记录
}
/**
*
* @param inportVo
* @return
* @param inportVo
* @return
*/
@RequestMapping("addInport")
public ResultObj addInport(InportVo inportVo){
@RequestMapping("addInport") // 请求映射到 /inport/addInport
public ResultObj addInport(InportVo inportVo) {
try {
//获得当前系统用户
User user = (User) WebUtils.getSession().getAttribute("user");
//设置操作人
inportVo.setOperateperson(user.getName());
//设置进货时间
inportVo.setInporttime(new Date());
inportService.save(inportVo);
return ResultObj.ADD_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.ADD_ERROR;
User user = (User) WebUtils.getSession().getAttribute("user"); // 获取当前登录用户
inportVo.setOperateperson(user.getName()); // 设置操作人姓名
inportVo.setInporttime(new Date()); // 设置进货时间为当前时间
inportService.save(inportVo); // 保存进货信息
return ResultObj.ADD_SUCCESS; // 返回添加成功的结果
} catch (Exception e) { // 捕获异常
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.ADD_ERROR; // 返回添加失败的结果
}
}
/**
*
* @param inportVo
* @return
* @param inportVo
* @return
*/
@RequestMapping("updateInport")
public ResultObj updateInport(InportVo inportVo){
@RequestMapping("updateInport") // 请求映射到 /inport/updateInport
public ResultObj updateInport(InportVo inportVo) {
try {
inportService.updateById(inportVo);
return ResultObj.UPDATE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.UPDATE_ERROR;
inportService.updateById(inportVo); // 更新进货信息
return ResultObj.UPDATE_SUCCESS; // 返回更新成功的结果
} catch (Exception e) { // 捕获异常
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.UPDATE_ERROR; // 返回更新失败的结果
}
}
/**
*
* @param id
* @return
* @param id ID
* @return
*/
@RequestMapping("deleteInport")
public ResultObj deleteInport(Integer id){
@RequestMapping("deleteInport") // 请求映射到 /inport/deleteInport
public ResultObj deleteInport(Integer id) {
try {
inportService.removeById(id);
return ResultObj.DELETE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
inportService.removeById(id); // 删除进货记录
return ResultObj.DELETE_SUCCESS; // 返回删除成功的结果
} catch (Exception e) { // 捕获异常
e.printStackTrace(); // 打印异常堆栈信息
return ResultObj.DELETE_ERROR; // 返回删除失败的结果
}
}
}

@ -1,116 +1,105 @@
package com.yeqifu.bus.controller;
package com.yeqifu.bus.controller; // 声明类所在的包
// 导入MyBatis-Plus框架相关工具类用于条件查询和分页处理
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// 导入实体类,分别表示商品、退货记录和供应商
import com.yeqifu.bus.entity.Goods;
import com.yeqifu.bus.entity.Outport;
import com.yeqifu.bus.entity.Provider;
// 导入服务接口,用于实现业务逻辑的调用
import com.yeqifu.bus.service.IGoodsService;
import com.yeqifu.bus.service.IOutportService;
import com.yeqifu.bus.service.IProviderService;
// 导入数据传输对象和通用响应结果类
import com.yeqifu.bus.vo.OutportVo;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
// 导入Spring框架注解
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.List; // 导入Java标准库中的List接口用于处理集合
/**
* <p>
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-19
* OutportControllerRESTful退
*/
@RestController
@RequestMapping("/outport")
@RestController // 标识该类为REST风格的控制器返回结果以JSON格式序列化
@RequestMapping("/outport") // 设置基础URL路径为"/outport"
public class OutportController {
@Autowired
@Autowired // 自动注入退货服务类,用于处理退货业务逻辑
private IOutportService outportService;
@Autowired
@Autowired // 自动注入供应商服务类,用于查询供应商信息
private IProviderService providerService;
@Autowired
@Autowired // 自动注入商品服务类,用于查询商品信息
private IGoodsService goodsService;
/**
* 退
* @param id ID
* @param number 退
* @param remark
* @return
* 退
* @param id ID
* @param number 退
* @param remark 退
* @return
*/
@RequestMapping("addOutport")
public ResultObj addOutport(Integer id,Integer number,String remark){
@RequestMapping("addOutport") // 映射URL路径为"/outport/addOutport"
public ResultObj addOutport(Integer id, Integer number, String remark) { // 定义添加退货记录的方法
try {
outportService.addOutport(id,number,remark);
return ResultObj.BACKINPORT_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.BACKINPORT_ERROR;
outportService.addOutport(id, number, remark); // 调用服务层方法,执行添加退货逻辑
return ResultObj.BACKINPORT_SUCCESS; // 返回操作成功的结果对象
} catch (Exception e) { // 捕获异常
e.printStackTrace(); // 打印异常信息到控制台
return ResultObj.BACKINPORT_ERROR; // 返回操作失败的结果对象
}
}
/**t
* 退
* @param outportVo
* @return
/**
* 退
* @param outportVo
* @return 退
*/
@RequestMapping("loadAllOutport")
public DataGridView loadAllOuport(OutportVo outportVo){
IPage<Outport> page = new Page<Outport>(outportVo.getPage(),outportVo.getLimit());
QueryWrapper<Outport> queryWrapper = new QueryWrapper<Outport>();
//对供应商进行查询
queryWrapper.eq(outportVo.getProviderid()!=null&&outportVo.getProviderid()!=0,"providerid",outportVo.getProviderid());
//对商品进行查询
queryWrapper.eq(outportVo.getGoodsid()!=null&&outportVo.getGoodsid()!=0,"goodsid",outportVo.getGoodsid());
//对时间进行查询要求大于开始时间小于结束时间
queryWrapper.ge(outportVo.getStartTime()!=null,"outputtime",outportVo.getStartTime());
queryWrapper.le(outportVo.getEndTime()!=null,"outputtime",outportVo.getEndTime());
//通过进货时间对商品进行排序
queryWrapper.orderByDesc("outputtime");
IPage<Outport> page1 = outportService.page(page, queryWrapper);
List<Outport> records = page1.getRecords();
for (Outport ouport : records) {
Provider provider = providerService.getById(ouport.getProviderid());
if (provider!=null){
//设置供应商姓名
ouport.setProvidername(provider.getProvidername());
@RequestMapping("loadAllOutport") // 映射URL路径为"/outport/loadAllOutport"
public DataGridView loadAllOuport(OutportVo outportVo) { // 定义查询退货记录的方法
IPage<Outport> page = new Page<>(outportVo.getPage(), outportVo.getLimit()); // 创建分页对象,传入当前页和每页大小
QueryWrapper<Outport> queryWrapper = new QueryWrapper<>(); // 创建条件查询封装器
queryWrapper.eq(outportVo.getProviderid() != null && outportVo.getProviderid() != 0, "providerid", outportVo.getProviderid()); // 如果供应商ID不为空且不为0添加供应商查询条件
queryWrapper.eq(outportVo.getGoodsid() != null && outportVo.getGoodsid() != 0, "goodsid", outportVo.getGoodsid()); // 如果商品ID不为空且不为0添加商品查询条件
queryWrapper.ge(outportVo.getStartTime() != null, "outputtime", outportVo.getStartTime()); // 如果开始时间不为空,添加起始时间查询条件
queryWrapper.le(outportVo.getEndTime() != null, "outputtime", outportVo.getEndTime()); // 如果结束时间不为空,添加结束时间查询条件
queryWrapper.orderByDesc("outputtime"); // 按退货时间倒序排序
IPage<Outport> page1 = outportService.page(page, queryWrapper); // 调用服务层分页查询方法
List<Outport> records = page1.getRecords(); // 获取分页查询结果中的记录列表
for (Outport ouport : records) { // 遍历每条退货记录
Provider provider = providerService.getById(ouport.getProviderid()); // 根据供应商ID查询供应商信息
if (provider != null) { // 如果供应商信息存在
ouport.setProvidername(provider.getProvidername()); // 设置退货记录中的供应商名称
}
Goods goods = goodsService.getById(ouport.getGoodsid());
if (goods!=null){
//设置商品名称
ouport.setGoodsname(goods.getGoodsname());
//设置商品规格
ouport.setSize(goods.getSize());
Goods goods = goodsService.getById(ouport.getGoodsid()); // 根据商品ID查询商品信息
if (goods != null) { // 如果商品信息存在
ouport.setGoodsname(goods.getGoodsname()); // 设置退货记录中的商品名称
ouport.setSize(goods.getSize()); // 设置退货记录中的商品规格
}
}
return new DataGridView(page1.getTotal(),page1.getRecords());
return new DataGridView(page1.getTotal(), page1.getRecords()); // 返回分页数据和记录列表
}
/**
* 退
* @param id
* @return
* 退
* @param id 退ID
* @return
*/
@RequestMapping("deleteOutport")
public ResultObj deleteOutport(Integer id){
@RequestMapping("deleteOutport") // 映射URL路径为"/outport/deleteOutport"
public ResultObj deleteOutport(Integer id) { // 定义删除退货记录的方法
try {
outportService.removeById(id);
return ResultObj.DELETE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
outportService.removeById(id); // 调用服务层方法根据ID删除退货记录
return ResultObj.DELETE_SUCCESS; // 返回操作成功的结果对象
} catch (Exception e) { // 捕获异常
e.printStackTrace(); // 打印异常信息到控制台
return ResultObj.DELETE_ERROR; // 返回操作失败的结果对象
}
}
}

@ -1,117 +1,177 @@
package com.yeqifu.bus.controller;
// 声明类所在的包
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
// 导入MyBatis-Plus的QueryWrapper类用于条件查询
import com.baomidou.mybatisplus.core.metadata.IPage;
// 导入MyBatis-Plus的IPage接口用于分页
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// 导入MyBatis-Plus的Page类用于创建分页对象
import com.yeqifu.bus.entity.Provider;
// 导入Provider实体类表示供应商信息
import com.yeqifu.bus.service.IProviderService;
// 导入IProviderService接口用于调用供应商相关的业务逻辑
import com.yeqifu.bus.vo.ProviderVo;
// 导入ProviderVo类封装供应商查询和操作的请求参数
import com.yeqifu.sys.common.Constast;
// 导入Constast类包含通用的常量定义
import com.yeqifu.sys.common.DataGridView;
// 导入DataGridView类用于返回表格数据格式
import com.yeqifu.sys.common.ResultObj;
// 导入ResultObj类用于返回操作结果的统一格式
import org.apache.commons.lang3.StringUtils;
// 导入StringUtils工具类用于字符串判空和处理
import org.springframework.beans.factory.annotation.Autowired;
// 导入Spring框架的Autowired注解用于自动注入Bean
import org.springframework.web.bind.annotation.RequestMapping;
// 导入RequestMapping注解用于映射URL路径
import org.springframework.web.bind.annotation.RestController;
// 导入RestController注解标识为REST风格的控制器
import java.util.List;
// 导入Java的List接口用于处理集合
/**
* <p>
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-05
*
*/
@RestController
// 标识该类为REST风格的控制器返回JSON格式数据
@RequestMapping("/provider")
// 将该类的基础URL路径设置为"/provider"
public class ProviderController {
@Autowired
// 自动注入IProviderService接口的实现类
private IProviderService providerService;
/**
*
* @param providerVo
* @return
* @param providerVo
* @return
*/
@RequestMapping("loadAllProvider")
public DataGridView loadAllProvider(ProviderVo providerVo){
//1.声明一个分页page对象
IPage<Provider> page = new Page(providerVo.getPage(),providerVo.getLimit());
//2.声明一个queryWrapper
QueryWrapper<Provider> queryWrapper = new QueryWrapper();
queryWrapper.like(StringUtils.isNotBlank(providerVo.getProvidername()),"providername",providerVo.getProvidername());
queryWrapper.like(StringUtils.isNotBlank(providerVo.getConnectionperson()),"connectionperson",providerVo.getConnectionperson());
queryWrapper.like(StringUtils.isNotBlank(providerVo.getPhone()),"phone",providerVo.getPhone());
providerService.page(page,queryWrapper);
return new DataGridView(page.getTotal(),page.getRecords());
// 映射URL路径为"/provider/loadAllProvider"
public DataGridView loadAllProvider(ProviderVo providerVo) {
IPage<Provider> page = new Page<>(providerVo.getPage(), providerVo.getLimit());
// 创建分页对象,传入当前页和每页大小
QueryWrapper<Provider> queryWrapper = new QueryWrapper<>();
// 创建QueryWrapper对象用于构造查询条件
queryWrapper.like(StringUtils.isNotBlank(providerVo.getProvidername()), "providername", providerVo.getProvidername());
// 如果供应商名称不为空,添加模糊查询条件
queryWrapper.like(StringUtils.isNotBlank(providerVo.getConnectionperson()), "connectionperson", providerVo.getConnectionperson());
// 如果联系人名称不为空,添加模糊查询条件
queryWrapper.like(StringUtils.isNotBlank(providerVo.getPhone()), "phone", providerVo.getPhone());
// 如果联系方式不为空,添加模糊查询条件
providerService.page(page, queryWrapper);
// 调用服务层的分页查询方法
return new DataGridView(page.getTotal(), page.getRecords());
// 返回DataGridView对象包含总记录数和分页记录列表
}
/**
*
* @param providerVo
* @return
* @param providerVo
* @return
*/
@RequestMapping("addProvider")
public ResultObj addProvider(ProviderVo providerVo){
// 映射URL路径为"/provider/addProvider"
public ResultObj addProvider(ProviderVo providerVo) {
try {
providerService.save(providerVo);
// 调用服务层方法,保存供应商信息
return ResultObj.ADD_SUCCESS;
// 返回操作成功的结果对象
} catch (Exception e) {
e.printStackTrace();
// 打印异常信息
return ResultObj.ADD_ERROR;
// 返回操作失败的结果对象
}
}
/**
*
* @param providerVo
* @return
* @param providerVo
* @return
*/
@RequestMapping("updateProvider")
public ResultObj updateProvider(ProviderVo providerVo){
// 映射URL路径为"/provider/updateProvider"
public ResultObj updateProvider(ProviderVo providerVo) {
try {
providerService.updateById(providerVo);
// 调用服务层方法根据ID更新供应商信息
return ResultObj.UPDATE_SUCCESS;
// 返回操作成功的结果对象
} catch (Exception e) {
e.printStackTrace();
// 打印异常信息
return ResultObj.UPDATE_ERROR;
// 返回操作失败的结果对象
}
}
/**
*
* @param id
* @return
* @param id ID
* @return
*/
@RequestMapping("deleteProvider")
public ResultObj deleteProvider(Integer id){
// 映射URL路径为"/provider/deleteProvider"
public ResultObj deleteProvider(Integer id) {
try {
providerService.deleteProviderById(id);
// 调用服务层方法根据ID删除供应商信息
return ResultObj.DELETE_SUCCESS;
// 返回操作成功的结果对象
} catch (Exception e) {
e.printStackTrace();
// 打印异常信息
return ResultObj.DELETE_ERROR;
// 返回操作失败的结果对象
}
}
/**
*
* @return
* @return
*/
@RequestMapping("loadAllProviderForSelect")
public DataGridView loadAllProviderForSelect(){
QueryWrapper<Provider> queryWrapper = new QueryWrapper<Provider>();
// 映射URL路径为"/provider/loadAllProviderForSelect"
public DataGridView loadAllProviderForSelect() {
QueryWrapper<Provider> queryWrapper = new QueryWrapper<>();
// 创建QueryWrapper对象用于构造查询条件
queryWrapper.eq("available", Constast.AVAILABLE_TRUE);
// 查询条件为供应商状态可用
List<Provider> list = providerService.list(queryWrapper);
// 调用服务层方法,获取符合条件的供应商列表
return new DataGridView(list);
// 返回DataGridView对象包含供应商列表
}
}

@ -1,137 +1,219 @@
package com.yeqifu.bus.controller;
// 声明类所在的包
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
// 导入QueryWrapper类用于构建查询条件
import com.baomidou.mybatisplus.core.metadata.IPage;
// 导入IPage接口用于分页功能
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// 导入Page类用于创建分页对象
import com.yeqifu.bus.entity.Customer;
// 导入Customer实体类表示客户信息
import com.yeqifu.bus.entity.Goods;
// 导入Goods实体类表示商品信息
import com.yeqifu.bus.entity.Sales;
// 导入Sales实体类表示销售信息
import com.yeqifu.bus.service.ICustomerService;
// 导入ICustomerService接口用于处理客户业务逻辑
import com.yeqifu.bus.service.IGoodsService;
// 导入IGoodsService接口用于处理商品业务逻辑
import com.yeqifu.bus.service.ISalesService;
// 导入ISalesService接口用于处理销售信息的业务逻辑
import com.yeqifu.bus.vo.SalesVo;
// 导入SalesVo类用于封装查询参数
import com.yeqifu.sys.common.DataGridView;
// 导入DataGridView类用于返回表格数据
import com.yeqifu.sys.common.ResultObj;
// 导入ResultObj类用于统一返回操作结果
import com.yeqifu.sys.common.WebUtils;
// 导入WebUtils工具类用于处理会话信息
import com.yeqifu.sys.entity.User;
// 导入User实体类表示用户信息
import org.springframework.beans.factory.annotation.Autowired;
// 导入@Autowired注解用于自动注入服务对象
import org.springframework.web.bind.annotation.RequestMapping;
// 导入@RequestMapping注解用于映射请求路径
import org.springframework.web.bind.annotation.RestController;
// 导入@RestController注解标识该类为REST控制器
import java.util.Date;
// 导入Date类用于处理日期时间
import java.util.List;
// 导入Java集合类List用于处理列表数据
/**
* <p>
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-21
*
*
*/
@RestController
// 标识该类为REST风格的控制器
@RequestMapping("/sales")
// 将类的基础URL路径映射为"/sales"
public class SalesController {
@Autowired
// 自动注入ISalesService接口的实现类
private ISalesService salesService;
@Autowired
// 自动注入ICustomerService接口的实现类
private ICustomerService customerService;
@Autowired
// 自动注入IGoodsService接口的实现类
private IGoodsService goodsService;
/**
*
* @param salesVo
* @return
* @param salesVo
* @return
*/
@RequestMapping("loadAllSales")
public DataGridView loadAllSales(SalesVo salesVo){
IPage<Sales> page = new Page<>(salesVo.getPage(),salesVo.getLimit());
QueryWrapper<Sales> queryWrapper = new QueryWrapper<Sales>();
//根据客户进行模糊查询
queryWrapper.eq(salesVo.getCustomerid()!=null&&salesVo.getCustomerid()!=0,"customerid",salesVo.getCustomerid());
//根据商品模糊查询
queryWrapper.eq(salesVo.getGoodsid()!=null&&salesVo.getGoodsid()!=0,"goodsid",salesVo.getGoodsid());
//根据时间进行模糊查询
queryWrapper.ge(salesVo.getStartTime()!=null,"salestime",salesVo.getStartTime());
queryWrapper.le(salesVo.getEndTime()!=null,"salestime",salesVo.getEndTime());
// 映射URL路径为"/sales/loadAllSales"
public DataGridView loadAllSales(SalesVo salesVo) {
IPage<Sales> page = new Page<>(salesVo.getPage(), salesVo.getLimit());
// 创建分页对象,指定当前页和每页记录数
QueryWrapper<Sales> queryWrapper = new QueryWrapper<>();
// 创建QueryWrapper对象用于构建查询条件
queryWrapper.eq(salesVo.getCustomerid() != null && salesVo.getCustomerid() != 0, "customerid", salesVo.getCustomerid());
// 如果客户ID不为空且不为0添加客户ID的查询条件
queryWrapper.eq(salesVo.getGoodsid() != null && salesVo.getGoodsid() != 0, "goodsid", salesVo.getGoodsid());
// 如果商品ID不为空且不为0添加商品ID的查询条件
queryWrapper.ge(salesVo.getStartTime() != null, "salestime", salesVo.getStartTime());
// 如果开始时间不为空,添加大于等于开始时间的查询条件
queryWrapper.le(salesVo.getEndTime() != null, "salestime", salesVo.getEndTime());
// 如果结束时间不为空,添加小于等于结束时间的查询条件
IPage<Sales> page1 = salesService.page(page, queryWrapper);
// 调用服务层分页查询方法,获取分页数据
List<Sales> records = page1.getRecords();
// 获取分页记录列表
for (Sales sales : records) {
//设置客户姓名
// 遍历销售信息列表
Customer customer = customerService.getById(sales.getCustomerid());
if(null!=customer){
// 根据销售信息中的客户ID查询客户信息
if (null != customer) {
sales.setCustomername(customer.getCustomername());
// 如果客户信息存在,设置客户名称
}
//设置商品名称
Goods goods = goodsService.getById(sales.getGoodsid());
if (null!=goods){
//设置商品名称
// 根据销售信息中的商品ID查询商品信息
if (null != goods) {
sales.setGoodsname(goods.getGoodsname());
//设置商品规格
// 如果商品信息存在,设置商品名称
sales.setSize(goods.getSize());
// 设置商品规格
}
}
return new DataGridView(page1.getTotal(),page1.getRecords());
return new DataGridView(page1.getTotal(), page1.getRecords());
// 返回DataGridView对象包含总记录数和分页记录列表
}
/**
*
* @param salesVo
* @return
* @param salesVo
* @return
*/
@RequestMapping("addSales")
public ResultObj addSales(SalesVo salesVo){
// 映射URL路径为"/sales/addSales"
public ResultObj addSales(SalesVo salesVo) {
try {
//获得当前系统用户
User user = (User) WebUtils.getSession().getAttribute("user");
//设置操作人
// 从会话中获取当前系统用户
salesVo.setOperateperson(user.getName());
//设置销售时间
// 设置操作人姓名
salesVo.setSalestime(new Date());
// 设置销售时间为当前时间
salesService.save(salesVo);
// 调用服务层方法保存销售信息
return ResultObj.ADD_SUCCESS;
}catch (Exception e) {
// 返回添加成功的结果对象
} catch (Exception e) {
e.printStackTrace();
// 打印异常信息
return ResultObj.ADD_ERROR;
// 返回添加失败的结果对象
}
}
/**
*
* @param salesVo
* @return
* @param salesVo
* @return
*/
@RequestMapping("updateSales")
public ResultObj updateSales(SalesVo salesVo){
// 映射URL路径为"/sales/updateSales"
public ResultObj updateSales(SalesVo salesVo) {
try {
salesService.updateById(salesVo);
// 调用服务层方法根据ID更新销售信息
return ResultObj.UPDATE_SUCCESS;
// 返回更新成功的结果对象
} catch (Exception e) {
e.printStackTrace();
// 打印异常信息
return ResultObj.UPDATE_ERROR;
// 返回更新失败的结果对象
}
}
/**
*
* @param id
* @return
* @param id ID
* @return
*/
@RequestMapping("deleteSales")
public ResultObj deleteSales(Integer id){
// 映射URL路径为"/sales/deleteSales"
public ResultObj deleteSales(Integer id) {
try {
salesService.removeById(id);
// 调用服务层方法根据ID删除销售信息
return ResultObj.DELETE_SUCCESS;
// 返回删除成功的结果对象
} catch (Exception e) {
e.printStackTrace();
// 打印异常信息
return ResultObj.DELETE_ERROR;
// 返回删除失败的结果对象
}
}
}

@ -1,116 +1,182 @@
package com.yeqifu.bus.controller;
// 声明类所在的包
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
// 导入QueryWrapper类用于构建查询条件
import com.baomidou.mybatisplus.core.metadata.IPage;
// 导入IPage接口用于分页功能
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// 导入Page类用于创建分页对象
import com.yeqifu.bus.entity.Customer;
// 导入Customer实体类表示客户信息
import com.yeqifu.bus.entity.Goods;
// 导入Goods实体类表示商品信息
import com.yeqifu.bus.entity.Salesback;
// 导入Salesback实体类表示销售退货信息
import com.yeqifu.bus.service.ICustomerService;
// 导入ICustomerService接口用于处理客户业务逻辑
import com.yeqifu.bus.service.IGoodsService;
// 导入IGoodsService接口用于处理商品业务逻辑
import com.yeqifu.bus.service.ISalesbackService;
// 导入ISalesbackService接口用于处理销售退货业务逻辑
import com.yeqifu.bus.vo.SalesbackVo;
// 导入SalesbackVo类用于封装查询参数
import com.yeqifu.sys.common.DataGridView;
// 导入DataGridView类用于返回表格数据
import com.yeqifu.sys.common.ResultObj;
// 导入ResultObj类用于统一返回操作结果
import org.springframework.beans.factory.annotation.Autowired;
// 导入@Autowired注解用于自动注入服务对象
import org.springframework.web.bind.annotation.RequestMapping;
// 导入@RequestMapping注解用于映射请求路径
import org.springframework.web.bind.annotation.RestController;
// 导入@RestController注解标识该类为REST控制器
import java.util.List;
// 导入Java集合类List用于处理列表数据
/**
* <p>
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-23
* 退
* 退
*/
@RestController
// 标识该类为REST风格的控制器
@RequestMapping("/salesback")
// 将类的基础URL路径映射为"/salesback"
public class SalesbackController {
@Autowired
// 自动注入ISalesbackService接口的实现类
private ISalesbackService salesbackService;
@Autowired
// 自动注入ICustomerService接口的实现类
private ICustomerService customerService;
@Autowired
// 自动注入IGoodsService接口的实现类
private IGoodsService goodsService;
/**
* 退
* @param id ID
* @param number 退
* @param remark
* @return
* @param id 退ID
* @param number 退
* @param remark
* @return
*/
@RequestMapping("addSalesback")
public ResultObj addSalesback(Integer id,Integer number,String remark){
// 映射URL路径为"/salesback/addSalesback"
public ResultObj addSalesback(Integer id, Integer number, String remark) {
try {
salesbackService.addSalesback(id,number,remark);
salesbackService.addSalesback(id, number, remark);
// 调用服务层方法添加退货记录
return ResultObj.BACKINPORT_SUCCESS;
// 返回退货成功的结果对象
} catch (Exception e) {
e.printStackTrace();
// 打印异常信息
return ResultObj.BACKINPORT_ERROR;
// 返回退货失败的结果对象
}
}
/**
* 退
* @param salesbackVo
* @return
* 退
* @param salesbackVo
* @return
*/
@RequestMapping("loadAllSalesback")
public DataGridView loadAllSalesback(SalesbackVo salesbackVo){
IPage<Salesback> page = new Page<Salesback>(salesbackVo.getPage(),salesbackVo.getLimit());
QueryWrapper<Salesback> queryWrapper = new QueryWrapper<Salesback>();
//对客户进行查询
queryWrapper.eq(salesbackVo.getCustomerid()!=null&&salesbackVo.getCustomerid()!=0,"customerid",salesbackVo.getCustomerid());
//对商品进行查询
queryWrapper.eq(salesbackVo.getGoodsid()!=null&&salesbackVo.getGoodsid()!=0,"goodsid",salesbackVo.getGoodsid());
//对时间进行查询要求大于开始时间小于结束时间
queryWrapper.ge(salesbackVo.getStartTime()!=null,"salesbacktime",salesbackVo.getStartTime());
queryWrapper.le(salesbackVo.getEndTime()!=null,"salesbacktime",salesbackVo.getEndTime());
//通过商品退货时间对商品进行排序
// 映射URL路径为"/salesback/loadAllSalesback"
public DataGridView loadAllSalesback(SalesbackVo salesbackVo) {
IPage<Salesback> page = new Page<>(salesbackVo.getPage(), salesbackVo.getLimit());
// 创建分页对象,指定当前页和每页记录数
QueryWrapper<Salesback> queryWrapper = new QueryWrapper<>();
// 创建QueryWrapper对象用于构建查询条件
queryWrapper.eq(salesbackVo.getCustomerid() != null && salesbackVo.getCustomerid() != 0, "customerid", salesbackVo.getCustomerid());
// 如果客户ID不为空且不为0添加客户ID的查询条件
queryWrapper.eq(salesbackVo.getGoodsid() != null && salesbackVo.getGoodsid() != 0, "goodsid", salesbackVo.getGoodsid());
// 如果商品ID不为空且不为0添加商品ID的查询条件
queryWrapper.ge(salesbackVo.getStartTime() != null, "salesbacktime", salesbackVo.getStartTime());
// 如果开始时间不为空,添加大于等于开始时间的查询条件
queryWrapper.le(salesbackVo.getEndTime() != null, "salesbacktime", salesbackVo.getEndTime());
// 如果结束时间不为空,添加小于等于结束时间的查询条件
queryWrapper.orderByDesc("salesbacktime");
// 按照退货时间降序排列
salesbackService.page(page, queryWrapper);
// 调用服务层分页查询方法,获取分页数据
List<Salesback> records = page.getRecords();
// 获取分页记录列表
for (Salesback salesback : records) {
System.out.println("============================");
// 遍历退货记录列表
Customer customer = customerService.getById(salesback.getCustomerid());
if (customer!=null){
//设置客户姓名
// 根据退货记录中的客户ID查询客户信息
if (customer != null) {
salesback.setCustomername(customer.getCustomername());
// 如果客户信息存在,设置客户名称
}
Goods goods = goodsService.getById(salesback.getGoodsid());
if (goods!=null){
//设置商品名称
// 根据退货记录中的商品ID查询商品信息
if (goods != null) {
salesback.setGoodsname(goods.getGoodsname());
//设置商品规格
// 如果商品信息存在,设置商品名称
salesback.setSize(goods.getSize());
// 设置商品规格
}
}
return new DataGridView(page.getTotal(),page.getRecords());
return new DataGridView(page.getTotal(), page.getRecords());
// 返回DataGridView对象包含总记录数和分页记录列表
}
/**
* 退
* @param id
* @return
* 退
* @param id 退ID
* @return
*/
@RequestMapping("deleteSalesback")
public ResultObj deleteSalesback(Integer id){
// 映射URL路径为"/salesback/deleteSalesback"
public ResultObj deleteSalesback(Integer id) {
try {
salesbackService.removeById(id);
// 调用服务层方法根据ID删除退货记录
return ResultObj.DELETE_SUCCESS;
// 返回删除成功的结果对象
} catch (Exception e) {
e.printStackTrace();
// 打印异常信息
return ResultObj.DELETE_ERROR;
// 返回删除失败的结果对象
}
}
}

@ -1,15 +1,15 @@
package com.yeqifu.bus.entity;
package com.yeqifu.bus.entity; // 包名
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.IdType; // MyBatis-Plus主键类型注解
import com.baomidou.mybatisplus.annotation.TableField; // MyBatis-Plus字段映射注解
import com.baomidou.mybatisplus.annotation.TableId; // MyBatis-Plus主键注解
import com.baomidou.mybatisplus.annotation.TableName; // MyBatis-Plus表名注解
import lombok.Data; // Lombok注解自动生成getter和setter
import lombok.EqualsAndHashCode; // Lombok注解自动生成equals和hashCode方法
import lombok.ToString; // Lombok注解自动生成toString方法
import lombok.experimental.Accessors; // Lombok注解支持链式调用
import java.io.Serializable;
import java.io.Serializable; // 序列化接口
/**
* <p>
@ -19,46 +19,44 @@ import java.io.Serializable;
* @author luoyi-
* @since 2019-12-06
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_goods")
@ToString
public class Goods implements Serializable {
@Data // Lombok注解自动生成getter和setter方法
@EqualsAndHashCode(callSuper = false) // Lombok注解重写equals和hashCode方法且不调用父类
@Accessors(chain = true) // Lombok注解支持链式调用
@TableName("bus_goods") // MyBatis-Plus注解指定表名为bus_goods
@ToString // Lombok注解自动生成toString方法
public class Goods implements Serializable { // 定义Goods类实现Serializable接口
private static final long serialVersionUID=1L;
private static final long serialVersionUID = 1L; // 序列化版本号
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableId(value = "id", type = IdType.AUTO) // MyBatis-Plus注解指定主键字段id为自增类型
private Integer id; // 商品ID
private String goodsname;
private String goodsname; // 商品名称
private String produceplace;
private String produceplace; // 生产地
private String size;
private String size; // 商品规格
private String goodspackage;
private String goodspackage; // 商品包装
private String productcode;
private String productcode; // 商品编码
private String promitcode;
private String promitcode; // 批准文号
private String description;
private String description; // 商品描述
private Double price;
private Double price; // 商品价格
private Integer number;
private Integer number; // 商品库存数量
private Integer dangernum;
private Integer dangernum; // 商品警戒库存数量
private String goodsimg;
private String goodsimg; // 商品图片地址
private Integer available;
private Integer providerid;
@TableField(exist = false)
private String providername;
private Integer available; // 商品是否可用1表示可用0表示不可用
private Integer providerid; // 供应商ID外键关联供应商表
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String providername; // 供应商名称(冗余字段,用于显示)
}

@ -1,15 +1,15 @@
package com.yeqifu.bus.entity;
package com.yeqifu.bus.entity; // 包名
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.IdType; // MyBatis-Plus主键类型注解
import com.baomidou.mybatisplus.annotation.TableField; // MyBatis-Plus字段映射注解
import com.baomidou.mybatisplus.annotation.TableId; // MyBatis-Plus主键注解
import com.baomidou.mybatisplus.annotation.TableName; // MyBatis-Plus表名注解
import lombok.Data; // Lombok注解自动生成getter和setter方法
import lombok.EqualsAndHashCode; // Lombok注解自动生成equals和hashCode方法
import lombok.experimental.Accessors; // Lombok注解支持链式调用
import java.io.Serializable;
import java.util.Date;
import java.io.Serializable; // 序列化接口
import java.util.Date; // 日期类
/**
* <p>
@ -19,49 +19,49 @@ import java.util.Date;
* @author luoyi-
* @since 2019-12-18
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_inport")
public class Inport implements Serializable {
@Data // Lombok注解自动生成getter和setter方法
@EqualsAndHashCode(callSuper = false) // Lombok注解重写equals和hashCode方法不调用父类
@Accessors(chain = true) // Lombok注解支持链式调用
@TableName("bus_inport") // MyBatis-Plus注解指定表名为bus_inport
public class Inport implements Serializable { // 定义Inport类实现Serializable接口
private static final long serialVersionUID=1L;
private static final long serialVersionUID = 1L; // 序列化版本号
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableId(value = "id", type = IdType.AUTO) // MyBatis-Plus注解指定主键字段id为自增类型
private Integer id; // 入库单ID
private String paytype;
private String paytype; // 支付类型
private Date inporttime;
private Date inporttime; // 入库时间
private String operateperson;
private String operateperson; // 操作员姓名
private Integer number;
private Integer number; // 入库数量
private String remark;
private String remark; // 备注信息
private Double inportprice;
private Double inportprice; // 入库价格
private Integer providerid;
private Integer providerid; // 供应商ID外键关联供应商表
private Integer goodsid;
private Integer goodsid; // 商品ID外键关联商品表
/**
*
*/
@TableField(exist = false)
private String providername;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String providername; // 供应商名称(冗余字段,用于显示)
/**
*
*/
@TableField(exist = false)
private String goodsname;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String goodsname; // 商品名称(冗余字段,用于显示)
/**
*
*/
@TableField(exist = false)
private String size;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String size; // 商品规格(冗余字段,用于显示)
}

@ -1,67 +1,69 @@
package com.yeqifu.bus.entity;
package com.yeqifu.bus.entity; // 包名
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.IdType; // MyBatis-Plus主键类型注解
import com.baomidou.mybatisplus.annotation.TableField; // MyBatis-Plus字段映射注解
import com.baomidou.mybatisplus.annotation.TableId; // MyBatis-Plus主键注解
import com.baomidou.mybatisplus.annotation.TableName; // MyBatis-Plus表名注解
import lombok.Data; // Lombok注解自动生成getter和setter方法
import lombok.EqualsAndHashCode; // Lombok注解自动生成equals和hashCode方法
import lombok.experimental.Accessors; // Lombok注解支持链式调用
import java.io.Serializable;
import java.util.Date;
import java.io.Serializable; // 序列化接口
import java.util.Date; // 日期类
/**
* <p>
* InnoDB free: 9216 kB
* </p>
*
*
*
* @author luoyi-
* @since 2019-12-19
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_outport")
public class Outport implements Serializable {
@Data // Lombok注解自动生成getter和setter方法
@EqualsAndHashCode(callSuper = false) // Lombok注解重写equals和hashCode方法不调用父类
@Accessors(chain = true) // Lombok注解支持链式调用
@TableName("bus_outport") // MyBatis-Plus注解指定表名为bus_outport
public class Outport implements Serializable { // 定义Outport类实现Serializable接口
private static final long serialVersionUID=1L;
private static final long serialVersionUID = 1L; // 序列化版本号
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableId(value = "id", type = IdType.AUTO) // MyBatis-Plus注解指定主键字段id为自增类型
private Integer id; // 出库单ID
private Integer providerid;
private Integer providerid; // 供应商ID外键关联供应商表
private String paytype;
private String paytype; // 支付类型
private Date outputtime;
private Date outputtime; // 出库时间
private String operateperson;
private String operateperson; // 操作员姓名
private Double outportprice;
private Double outportprice; // 出库价格
private Integer number;
private Integer number; // 出库数量
private String remark;
private String remark; // 备注信息
private Integer goodsid;
private Integer goodsid; // 商品ID外键关联商品表
/**
*
*/
@TableField(exist = false)
private String providername;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String providername; // 供应商名称(冗余字段,用于显示)
/**
*
*/
@TableField(exist = false)
private String goodsname;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String goodsname; // 商品名称(冗余字段,用于显示)
/**
*
*/
@TableField(exist = false)
private String size;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String size; // 商品规格(冗余字段,用于显示)
}

@ -1,56 +1,56 @@
package com.yeqifu.bus.entity;
package com.yeqifu.bus.entity; // 包名
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.IdType; // MyBatis-Plus主键类型注解
import com.baomidou.mybatisplus.annotation.TableId; // MyBatis-Plus主键注解
import com.baomidou.mybatisplus.annotation.TableName; // MyBatis-Plus表名注解
import lombok.Data; // Lombok注解自动生成getter和setter方法
import lombok.EqualsAndHashCode; // Lombok注解自动生成equals和hashCode方法
import lombok.ToString; // Lombok注解自动生成toString方法
import lombok.experimental.Accessors; // Lombok注解支持链式调用
import java.io.Serializable;
import java.io.Serializable; // 序列化接口
/**
* <p>
*
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-05
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_provider")
@ToString
public class Provider implements Serializable {
@Data // Lombok注解自动生成getter和setter方法
@EqualsAndHashCode(callSuper = false) // Lombok注解重写equals和hashCode方法不调用父类
@Accessors(chain = true) // Lombok注解支持链式调用
@TableName("bus_provider") // MyBatis-Plus注解指定表名为bus_provider
@ToString // Lombok注解自动生成toString方法
public class Provider implements Serializable { // 定义Provider类实现Serializable接口
private static final long serialVersionUID=1L;
private static final long serialVersionUID = 1L; // 序列化版本号
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableId(value = "id", type = IdType.AUTO) // MyBatis-Plus注解指定主键字段id为自增类型
private Integer id; // 供应商ID
private String providername;
private String providername; // 供应商名称
private String zip;
private String zip; // 邮政编码
private String address;
private String address; // 供应商地址
private String telephone;
private String telephone; // 供应商联系电话
private String connectionperson;
private String connectionperson; // 联系人姓名
private String phone;
private String phone; // 联系人手机号码
private String bank;
private String bank; // 开户银行
private String account;
private String account; // 银行账号
private String email;
private String email; // 电子邮箱
private String fax;
private Integer available;
private String fax; // 传真号码
private Integer available; // 是否可用1表示可用0表示不可用
}

@ -1,67 +1,67 @@
package com.yeqifu.bus.entity;
package com.yeqifu.bus.entity; // 包名
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.IdType; // MyBatis-Plus主键类型注解
import com.baomidou.mybatisplus.annotation.TableField; // MyBatis-Plus字段映射注解
import com.baomidou.mybatisplus.annotation.TableId; // MyBatis-Plus主键注解
import com.baomidou.mybatisplus.annotation.TableName; // MyBatis-Plus表名注解
import lombok.Data; // Lombok注解自动生成getter和setter方法
import lombok.EqualsAndHashCode; // Lombok注解自动生成equals和hashCode方法
import lombok.experimental.Accessors; // Lombok注解支持链式调用
import java.io.Serializable;
import java.util.Date;
import java.io.Serializable; // 序列化接口
import java.util.Date; // 日期类
/**
* <p>
*
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-21
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_sales")
public class Sales implements Serializable {
@Data // Lombok注解自动生成getter和setter方法
@EqualsAndHashCode(callSuper = false) // Lombok注解重写equals和hashCode方法不调用父类
@Accessors(chain = true) // Lombok注解支持链式调用
@TableName("bus_sales") // MyBatis-Plus注解指定表名为bus_sales
public class Sales implements Serializable { // 定义Sales类实现Serializable接口
private static final long serialVersionUID=1L;
private static final long serialVersionUID = 1L; // 序列化版本号
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableId(value = "id", type = IdType.AUTO) // MyBatis-Plus注解指定主键字段id为自增类型
private Integer id; // 销售记录ID
private Integer customerid;
private Integer customerid; // 客户ID外键关联客户表
private String paytype;
private String paytype; // 支付类型
private Date salestime;
private Date salestime; // 销售时间
private String operateperson;
private String operateperson; // 操作员姓名
private Integer number;
private Integer number; // 销售数量
private String remark;
private String remark; // 备注信息
private Double saleprice;
private Double saleprice; // 销售价格
private Integer goodsid;
private Integer goodsid; // 商品ID外键关联商品表
/**
*
*/
@TableField(exist = false)
private String customername;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String customername; // 客户名称(冗余字段,用于显示)
/**
*
*/
@TableField(exist = false)
private String goodsname;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String goodsname; // 商品名称(冗余字段,用于显示)
/**
*
*/
@TableField(exist = false)
private String size;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String size; // 商品规格(冗余字段,用于显示)
}

@ -1,67 +1,67 @@
package com.yeqifu.bus.entity;
package com.yeqifu.bus.entity; // 包名
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.IdType; // MyBatis-Plus主键类型注解
import com.baomidou.mybatisplus.annotation.TableField; // MyBatis-Plus字段映射注解
import com.baomidou.mybatisplus.annotation.TableId; // MyBatis-Plus主键注解
import com.baomidou.mybatisplus.annotation.TableName; // MyBatis-Plus表名注解
import lombok.Data; // Lombok注解自动生成getter和setter方法
import lombok.EqualsAndHashCode; // Lombok注解自动生成equals和hashCode方法
import lombok.experimental.Accessors; // Lombok注解支持链式调用
import java.io.Serializable;
import java.util.Date;
import java.io.Serializable; // 序列化接口
import java.util.Date; // 日期类
/**
* <p>
* 退退
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-23
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("bus_salesback")
public class Salesback implements Serializable {
@Data // Lombok注解自动生成getter和setter方法
@EqualsAndHashCode(callSuper = false) // Lombok注解重写equals和hashCode方法不调用父类
@Accessors(chain = true) // Lombok注解支持链式调用
@TableName("bus_salesback") // MyBatis-Plus注解指定表名为bus_salesback
public class Salesback implements Serializable { // 定义Salesback类实现Serializable接口
private static final long serialVersionUID=1L;
private static final long serialVersionUID = 1L; // 序列化版本号
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableId(value = "id", type = IdType.AUTO) // MyBatis-Plus注解指定主键字段id为自增类型
private Integer id; // 销售退货记录ID
private Integer customerid;
private Integer customerid; // 客户ID外键关联客户表
private String paytype;
private String paytype; // 支付类型
private Date salesbacktime;
private Date salesbacktime; // 退货时间
private Double salebackprice;
private Double salebackprice; // 退货价格
private String operateperson;
private String operateperson; // 操作员姓名
private Integer number;
private Integer number; // 退货数量
private String remark;
private String remark; // 备注信息
private Integer goodsid;
private Integer goodsid; // 商品ID外键关联商品表
/**
*
*/
@TableField(exist = false)
private String customername;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String customername; // 客户名称(冗余字段,用于显示)
/**
*
*/
@TableField(exist = false)
private String goodsname;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String goodsname; // 商品名称(冗余字段,用于显示)
/**
*
*/
@TableField(exist = false)
private String size;
@TableField(exist = false) // MyBatis-Plus注解表示此字段在数据库表中不存在
private String size; // 商品规格(冗余字段,用于显示)
}

@ -1,60 +1,60 @@
package com.yeqifu.bus.mapper;
package com.yeqifu.bus.mapper; // 包名
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeqifu.bus.entity.Goods;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; // MyBatis-Plus核心Mapper类
import com.yeqifu.bus.entity.Goods; // 商品实体类
import org.apache.ibatis.annotations.Param; // MyBatis参数注解
import java.util.List;
import java.util.List; // Java集合类
/**
* <p>
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`) Mapper
* Mapper
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`)
* </p>
*
* @author luoyi-
* @since 2019-12-06
*/
public interface GoodsMapper extends BaseMapper<Goods> {
public interface GoodsMapper extends BaseMapper<Goods> { // 继承MyBatis-Plus的BaseMapper类
/**
* id
* @param id1
* ID
* @param id1 ID
*/
void deleteSaleByGoodsId(@Param("goodsid") Integer id1);
void deleteSaleByGoodsId(@Param("goodsid") Integer id1); // 自定义SQL方法传入商品ID删除相关销售信息
/**
* id退
* @param id1
* ID退
* @param id1 ID
*/
void deleteSaleBackByGoodsId(@Param("goodsid") Integer id1);
void deleteSaleBackByGoodsId(@Param("goodsid") Integer id1); // 自定义SQL方法传入商品ID删除相关销售退货信息
/**
* id
* @param id
* ID
* @param id ID
*/
void deleteInportByGoodsId(@Param("goodsid") Integer id);
void deleteInportByGoodsId(@Param("goodsid") Integer id); // 自定义SQL方法传入商品ID删除相关进货信息
/**
* id退
* @param id
* ID退
* @param id ID
*/
void deleteOutportByGoodsId(@Param("goodsid") Integer id);
void deleteOutportByGoodsId(@Param("goodsid") Integer id); // 自定义SQL方法传入商品ID删除相关退货信息
/**
* id
* @param id id
* ID
* @param id ID
*/
void deleteSaleByCustomerId(Integer id);
void deleteSaleByCustomerId(Integer id); // 自定义SQL方法传入客户ID删除相关销售信息
/**
* id退
* @param id id
* ID退
* @param id ID
*/
void deleteSaleBackByCustomerId(Integer id);
void deleteSaleBackByCustomerId(Integer id); // 自定义SQL方法传入客户ID删除相关销售退货信息
/**
*
* @return
*/
List<Goods> loadAllWarning();
List<Goods> loadAllWarning(); // 自定义SQL方法返回库存预警商品列表
}

@ -1,16 +1,17 @@
package com.yeqifu.bus.mapper;
package com.yeqifu.bus.mapper; // 包名
import com.yeqifu.bus.entity.Inport;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeqifu.bus.entity.Inport; // 导入进货实体类
import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入MyBatis-Plus核心BaseMapper接口
/**
* <p>
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`); (`goo Mapper
* Mapper
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`)
* </p>
*
* @author luoyi-
* @since 2019-12-18
* @author luoyi-
*/
public interface InportMapper extends BaseMapper<Inport> {
public interface InportMapper extends BaseMapper<Inport> { // Mapper接口继承BaseMapper自动实现通用数据操作
}

@ -1,16 +1,17 @@
package com.yeqifu.bus.mapper;
package com.yeqifu.bus.mapper; // 包名
import com.yeqifu.bus.entity.Outport;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeqifu.bus.entity.Outport; // 导入出货实体类
import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入MyBatis-Plus核心BaseMapper接口
/**
* <p>
* InnoDB free: 9216 kB Mapper
* Mapper
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-19
* @author luoyi-
*/
public interface OutportMapper extends BaseMapper<Outport> {
public interface OutportMapper extends BaseMapper<Outport> { // Mapper接口继承BaseMapper自动实现通用数据操作
}

@ -1,36 +1,36 @@
package com.yeqifu.bus.mapper;
package com.yeqifu.bus.mapper; // 包名
import com.yeqifu.bus.entity.Provider;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.yeqifu.bus.entity.Provider; // 导入供应商实体类
import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入MyBatis-Plus核心BaseMapper接口
import org.apache.ibatis.annotations.Param; // 导入MyBatis的参数注解
/**
* <p>
* InnoDB free: 9216 kB Mapper
* Mapper
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-05
* @author luoyi-
*/
public interface ProviderMapper extends BaseMapper<Provider> {
public interface ProviderMapper extends BaseMapper<Provider> { // Mapper接口继承BaseMapper自动实现通用数据操作
/**
* id
* @param id
* ID
* @param id ID
*/
void deleteGoodsByProviderId(@Param("pid") Integer id);
void deleteGoodsByProviderId(@Param("pid") Integer id); // 自定义SQL方法传入供应商ID删除相关商品信息
/**
* id
* @param id
* ID
* @param id ID
*/
void deleteInportByProviderId(@Param("pid") Integer id);
void deleteInportByProviderId(@Param("pid") Integer id); // 自定义SQL方法传入供应商ID删除相关进货信息
/**
* id退
* @param id
* ID退
* @param id ID
*/
void deleteOutPortByProviderId(@Param("pid") Integer id);
void deleteOutPortByProviderId(@Param("pid") Integer id); // 自定义SQL方法传入供应商ID删除相关退货信息
}

@ -1,16 +1,17 @@
package com.yeqifu.bus.mapper;
package com.yeqifu.bus.mapper; // 包名
import com.yeqifu.bus.entity.Sales;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeqifu.bus.entity.Sales; // 导入销售实体类
import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入MyBatis-Plus核心BaseMapper接口
/**
* <p>
* InnoDB free: 9216 kB Mapper
* Mapper
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-21
* @author luoyi-
*/
public interface SalesMapper extends BaseMapper<Sales> {
public interface SalesMapper extends BaseMapper<Sales> { // Mapper接口继承BaseMapper自动实现通用数据操作
}

@ -1,16 +1,17 @@
package com.yeqifu.bus.mapper;
package com.yeqifu.bus.mapper; // 包名
import com.yeqifu.bus.entity.Salesback;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeqifu.bus.entity.Salesback; // 导入销售退货实体类
import com.baomidou.mybatisplus.core.mapper.BaseMapper; // 导入MyBatis-Plus核心BaseMapper接口
/**
* <p>
* InnoDB free: 9216 kB Mapper
* 退Mapper退
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-23
* @author luoyi-
*/
public interface SalesbackMapper extends BaseMapper<Salesback> {
public interface SalesbackMapper extends BaseMapper<Salesback> { // Mapper接口继承BaseMapper自动实现通用数据操作
}

@ -1,29 +1,29 @@
package com.yeqifu.bus.service;
package com.yeqifu.bus.service; // 包名
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeqifu.bus.entity.Goods;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService; // 导入MyBatis-Plus服务层通用接口
import com.yeqifu.bus.entity.Goods; // 导入商品实体类
import java.util.List; // 导入Java集合List
/**
* <p>
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`)
*
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`)
* </p>
*
* @author luoyi-
* @since 2019-12-06
* @author luoyi-
*/
public interface IGoodsService extends IService<Goods> {
public interface IGoodsService extends IService<Goods> { // IService 是 MyBatis-Plus 提供的通用服务层接口
/**
* id
* @param id
* ID
* @param id ID
*/
void deleteGoodsById(Integer id);
void deleteGoodsById(Integer id); // 自定义方法用于根据商品ID删除商品信息
/**
*
* @return
*
* @return
*/
List<Goods> loadAllWarning();
List<Goods> loadAllWarning(); // 自定义方法,用于获取所有库存预警商品列表
}

@ -1,16 +1,17 @@
package com.yeqifu.bus.service;
package com.yeqifu.bus.service; // 包名
import com.yeqifu.bus.entity.Inport;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeqifu.bus.entity.Inport; // 导入进货实体类
import com.baomidou.mybatisplus.extension.service.IService; // 导入MyBatis-Plus提供的通用服务接口
/**
* <p>
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`); (`goo
*
* InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`)
* </p>
*
* @author luoyi-
* @since 2019-12-18
* @author luoyi-
*/
public interface IInportService extends IService<Inport> {
public interface IInportService extends IService<Inport> { // IService 是 MyBatis-Plus 提供的通用服务接口
}

@ -1,23 +1,25 @@
package com.yeqifu.bus.service;
package com.yeqifu.bus.service; // 包名
import com.yeqifu.bus.entity.Outport;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeqifu.bus.entity.Outport; // 导入退货实体类
import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 提供的通用服务接口
/**
* <p>
* InnoDB free: 9216 kB
* 退退
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-19
* @author luoyi-
*/
public interface IOutportService extends IService<Outport> {
public interface IOutportService extends IService<Outport> { // IService 是 MyBatis-Plus 提供的通用服务接口
/**
* 退
* @param id ID
* @param number 退
* @param remark
*
* @param id ID
* @param number 退退
* @param remark 退
*/
void addOutport(Integer id, Integer number, String remark);
void addOutport(Integer id, Integer number, String remark); // 自定义方法,处理退货操作
}

@ -1,21 +1,23 @@
package com.yeqifu.bus.service;
package com.yeqifu.bus.service; // 包名
import com.yeqifu.bus.entity.Provider;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeqifu.bus.entity.Provider; // 导入供应商实体类
import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 提供的通用服务接口
/**
* <p>
* InnoDB free: 9216 kB
*
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-05
* @author luoyi-
*/
public interface IProviderService extends IService<Provider> {
public interface IProviderService extends IService<Provider> { // IService 是 MyBatis-Plus 提供的通用服务接口
/**
* ID
* @param id
* ID
*
* @param id ID
*/
void deleteProviderById(Integer id);
void deleteProviderById(Integer id); // 自定义方法,处理删除操作
}

@ -1,16 +1,18 @@
package com.yeqifu.bus.service;
package com.yeqifu.bus.service; // 包名,定义服务层的包路径
import com.yeqifu.bus.entity.Sales;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeqifu.bus.entity.Sales; // 导入销售实体类
import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 提供的通用服务接口
/**
* <p>
* InnoDB free: 9216 kB
*
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-21
* @author luoyi-
*/
public interface ISalesService extends IService<Sales> {
public interface ISalesService extends IService<Sales> { // IService 是 MyBatis-Plus 提供的通用服务接口
// 由于未定义自定义方法,这里继承 IService<Sales> 后可自动具备基本的 CRUD 功能
}

@ -1,24 +1,25 @@
package com.yeqifu.bus.service;
package com.yeqifu.bus.service; // 包名
import com.yeqifu.bus.entity.Salesback;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeqifu.bus.entity.Salesback; // 导入销售退货实体类
import com.baomidou.mybatisplus.extension.service.IService; // 导入 MyBatis-Plus 提供的通用服务接口
/**
* <p>
* InnoDB free: 9216 kB
* 退退
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-12-23
* @author luoyi-
*/
public interface ISalesbackService extends IService<Salesback> {
public interface ISalesbackService extends IService<Salesback> { // IService 是 MyBatis-Plus 提供的通用服务接口
/**
* 退
* @param id ID
* @param number 退
* @param remark
*
* @param id ID退
* @param number 退退
* @param remark 退
*/
void addSalesback(Integer id, Integer number, String remark);
void addSalesback(Integer id, Integer number, String remark); // 自定义退货处理方法
}

@ -1,18 +1,19 @@
package com.yeqifu.bus.vo;
package com.yeqifu.bus.vo; // 包名,定义视图层的包路径
import com.yeqifu.bus.entity.Goods;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.yeqifu.bus.entity.Goods; // 导入 Goods 实体类
import lombok.Data; // 导入 Lombok 提供的 @Data 注解
import lombok.EqualsAndHashCode; // 导入 Lombok 提供的 @EqualsAndHashCode 注解
/**
* @Author: -
* @Date: 2019/12/6 22:30
*
* (VO) Goods
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class GoodsVo extends Goods {
private Integer page=1;
private Integer limit=10;
@Data // 自动生成 getter、setter、toString 等常用方法
@EqualsAndHashCode(callSuper = false) // 生成 equals 和 hashCode 方法,且不考虑父类属性
public class GoodsVo extends Goods { // 继承 Goods 实体类
private Integer page = 1; // 分页查询起始页码,默认为第 1 页
private Integer limit = 10; // 分页查询的限制记录数,默认为每页 10 条数据
}

@ -1,28 +1,28 @@
package com.yeqifu.bus.vo;
package com.yeqifu.bus.vo; // 包路径,定义视图层的包路径
import com.yeqifu.bus.entity.Inport;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import com.yeqifu.bus.entity.Inport; // 导入 Inport 实体类
import lombok.Data; // 导入 Lombok 提供的 @Data 注解
import lombok.EqualsAndHashCode; // 导入 Lombok 提供的 @EqualsAndHashCode 注解
import org.springframework.format.annotation.DateTimeFormat; // 导入日期格式注解
import java.util.Date; // 导入 Date 类
/**
* @Author: -
* @Date: 2019/12/18 10:29
*
* (VO) Inport
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class InportVo extends Inport {
private Integer page = 1;
@Data // 自动生成 getter、setter、toString 等常用方法
@EqualsAndHashCode(callSuper = false) // 生成 equals 和 hashCode 方法,且不考虑其父类属性
public class InportVo extends Inport { // 继承 Inport 实体类
private Integer limit = 10;
private Integer page = 1; // 分页查询起始页码,默认为第 1 页
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date startTime;
private Integer limit = 10; // 分页查询的限制记录数,默认为每页 10 条数据
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endTime;
@DateTimeFormat(pattern = "yyyy-MM-dd") // 格式化日期为 yyyy-MM-dd 格式
private Date startTime; // 查询时间范围的起始时间
@DateTimeFormat(pattern = "yyyy-MM-dd") // 格式化日期为 yyyy-MM-dd 格式
private Date endTime; // 查询时间范围的结束时间
}

@ -1,29 +1,43 @@
package com.yeqifu.bus.vo;
package com.yeqifu.bus.vo; // 定义视图层包路径
import com.yeqifu.bus.entity.Outport;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import com.yeqifu.bus.entity.Outport; // 导入 Outport 实体类
import lombok.Data; // 导入 Lombok 提供的 @Data 注解
import lombok.EqualsAndHashCode; // 导入 Lombok 提供的 @EqualsAndHashCode 注解
import org.springframework.format.annotation.DateTimeFormat; // 导入日期格式化注解
import java.util.Date; // 导入 Date 类
/**
* @Author: -
* @Date: 2019/12/18 10:29
*
* (VO) Outport
*
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class OutportVo extends Outport {
@Data // 自动生成 getter、setter、toString 等常用方法
@EqualsAndHashCode(callSuper = false) // 生成 equals 和 hashCode 方法,且不考虑其父类的属性
public class OutportVo extends Outport { // 继承 Outport 实体类
/**
* 1
*/
private Integer page = 1;
/**
* 10
*/
private Integer limit = 10;
/**
*
* 使 @DateTimeFormat Date
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date startTime;
/**
*
* 使 @DateTimeFormat Date
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endTime;
}

@ -1,26 +1,36 @@
package com.yeqifu.bus.vo;
package com.yeqifu.bus.vo; // 定义视图层包路径
import com.yeqifu.bus.entity.Customer;
import com.yeqifu.bus.entity.Provider;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.yeqifu.bus.entity.Customer; // 导入 Customer 实体类
import com.yeqifu.bus.entity.Provider; // 导入 Provider 实体类
import lombok.Data; // 导入 Lombok 提供的 @Data 注解
import lombok.EqualsAndHashCode; // 导入 Lombok 提供的 @EqualsAndHashCode 注解
/**
* @Author: -
* @Date: 2019/12/5 9:30
*
* (VO) Provider
*
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ProviderVo extends Provider{
@Data // 自动生成 getter、setter、toString 等常用方法
@EqualsAndHashCode(callSuper = false) // 生成 equals 和 hashCode 方法,且不考虑其父类的属性
public class ProviderVo extends Provider { // 继承 Provider 实体类
/**
* 10
* -
* 1
*/
private Integer page=1;
private Integer limit=10;
private Integer page = 1;
/**
* ID
* -
* 10 10
*/
private Integer limit = 10;
/**
* ID
* IDID
*/
private Integer[] ids;

@ -1,28 +1,46 @@
package com.yeqifu.bus.vo;
package com.yeqifu.bus.vo; // 定义视图层的包路径
import com.yeqifu.bus.entity.Sales;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import com.yeqifu.bus.entity.Sales; // 导入 Sales 实体类
import lombok.Data; // 导入 Lombok 提供的 @Data 注解
import lombok.EqualsAndHashCode; // 导入 Lombok 提供的 @EqualsAndHashCode 注解
import org.springframework.format.annotation.DateTimeFormat; // 导入日期格式注解
import java.util.Date; // 导入 Date 类
/**
* @Author: -
* @Date: 2019/12/18 10:29
*
* (VO) Sales
*
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class SalesVo extends Sales {
@Data // 自动生成 getter、setter、toString 等常用方法
@EqualsAndHashCode(callSuper = false) // 生成 equals 和 hashCode 方法,且不考虑其父类的属性
public class SalesVo extends Sales { // 继承 Sales 实体类
/**
* -
* 1
*/
private Integer page = 1;
/**
* -
* 10 10
*/
private Integer limit = 10;
@DateTimeFormat(pattern = "yyyy-MM-dd")
/**
*
*
*/
@DateTimeFormat(pattern = "yyyy-MM-dd") // 格式化日期为 yyyy-MM-dd 格式
private Date startTime;
@DateTimeFormat(pattern = "yyyy-MM-dd")
/**
*
*
*/
@DateTimeFormat(pattern = "yyyy-MM-dd") // 格式化日期为 yyyy-MM-dd 格式
private Date endTime;
}

@ -1,29 +1,46 @@
package com.yeqifu.bus.vo;
package com.yeqifu.bus.vo; // 定义视图层的包路径
import com.yeqifu.bus.entity.Salesback;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import com.yeqifu.bus.entity.Salesback; // 导入 Salesback 实体类
import lombok.Data; // 导入 Lombok 提供的 @Data 注解
import lombok.EqualsAndHashCode; // 导入 Lombok 提供的 @EqualsAndHashCode 注解
import org.springframework.format.annotation.DateTimeFormat; // 导入日期格式注解
import java.util.Date; // 导入 Date 类
/**
* @Author: -
* @Date: 2019/12/18 10:29
*
* (VO) Salesback
*
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class SalesbackVo extends Salesback {
@Data // 自动生成 getter、setter、toString 等常用方法
@EqualsAndHashCode(callSuper = false) // 生成 equals 和 hashCode 方法,且不考虑其父类的属性
public class SalesbackVo extends Salesback { // 继承 Salesback 实体类
/**
* -
* 1
*/
private Integer page = 1;
/**
* -
* 10 10
*/
private Integer limit = 10;
@DateTimeFormat(pattern = "yyyy-MM-dd")
/**
*
* 退
*/
@DateTimeFormat(pattern = "yyyy-MM-dd") // 格式化日期为 yyyy-MM-dd 格式
private Date startTime;
@DateTimeFormat(pattern = "yyyy-MM-dd")
/**
*
* 退
*/
@DateTimeFormat(pattern = "yyyy-MM-dd") // 格式化日期为 yyyy-MM-dd 格式
private Date endTime;
}

@ -14,6 +14,12 @@ import org.springframework.stereotype.Component;
import java.util.Map;
/**
*
*
*
*
* 使AOP
*
* @Author: -
* @Date: 2019/11/27 18:42
*/
@ -23,189 +29,89 @@ import java.util.Map;
public class CacheAspect {
/**
*
* 便
*/
private Log log = LogFactory.getLog(CacheAspect.class);
/**
*
* Map
*/
private Map<String,Object> CACHE_CONTAINER = CachePool.CACHE_CONTAINER;
private Map<String, Object> CACHE_CONTAINER = CachePool.CACHE_CONTAINER;
/**
*
*
*/
private static final String POINTCUT_DEPT_ADD="execution(* com.yeqifu.sys.service.impl.DeptServiceImpl.save(..))";
private static final String POINTCUT_DEPT_UPDATE="execution(* com.yeqifu.sys.service.impl.DeptServiceImpl.updateById(..))";
private static final String POINTCUT_DEPT_GET="execution(* com.yeqifu.sys.service.impl.DeptServiceImpl.getById(..))";
private static final String POINTCUT_DEPT_DELETE="execution(* com.yeqifu.sys.service.impl.DeptServiceImpl.removeById(..))";
private static final String POINTCUT_DEPT_ADD = "execution(* com.yeqifu.sys.service.impl.DeptServiceImpl.save(..))"; // 添加部门
private static final String POINTCUT_DEPT_UPDATE = "execution(* com.yeqifu.sys.service.impl.DeptServiceImpl.updateById(..))"; // 更新部门
private static final String POINTCUT_DEPT_GET = "execution(* com.yeqifu.sys.service.impl.DeptServiceImpl.getById(..))"; // 查询部门
private static final String POINTCUT_DEPT_DELETE = "execution(* com.yeqifu.sys.service.impl.DeptServiceImpl.removeById(..))"; // 删除部门
private static final String CACHE_DEPT_PROFIX="dept:";
/**
*
*/
private static final String CACHE_DEPT_PROFIX = "dept:";
/**
*
* @param joinPoint
* @return
*
* @param joinPoint
* @return
*/
@Around(value = POINTCUT_DEPT_ADD)
public Object cacheDeptAdd(ProceedingJoinPoint joinPoint) throws Throwable {
//取出第一个参数
// 取出第一个参数
Dept object = (Dept) joinPoint.getArgs()[0];
Boolean res = (Boolean) joinPoint.proceed();
if (res){
CACHE_CONTAINER.put(CACHE_DEPT_PROFIX + object.getId(),object);
Boolean res = (Boolean) joinPoint.proceed(); // 执行原实现
if (res) {
CACHE_CONTAINER.put(CACHE_DEPT_PROFIX + object.getId(), object);
}
return res;
}
/**
*
* @param joinPoint
* @return
*
* @param joinPoint
* @return
*/
@Around(value = POINTCUT_DEPT_GET)
public Object cacheDeptGet(ProceedingJoinPoint joinPoint) throws Throwable {
//取出第一个参数
Integer object = (Integer) joinPoint.getArgs()[0];
//从缓存里面取
Integer object = (Integer) joinPoint.getArgs()[0]; // 取出第一个参数作为ID
Object res1 = CACHE_CONTAINER.get(CACHE_DEPT_PROFIX + object);
if (res1!=null){
log.info("已从缓存里面找到部门对象"+CACHE_DEPT_PROFIX + object);
return res1;
}else {
log.info("未从缓存里面找到部门对象,从数据库中查询并放入缓存");
Dept res2 =(Dept) joinPoint.proceed();
CACHE_CONTAINER.put(CACHE_DEPT_PROFIX+res2.getId(),res2);
if (res1 != null) {
log.info("已从缓存里面找到部门对象" + CACHE_DEPT_PROFIX + object);
return res1; // 直接返回缓存中的对象
} else {
log.info("\u672a\u4ece\u7f13\u5b58\u91CC\u627E\u5230\u90E8\u95E8\u5BF9\u8C61\uFF0C\u4ECE\u6570\u636E\u5E93\u4E2D\u67E5\u8BE2\u5E76\u653E\u5165\u7F13\u5B58");
Dept res2 = (Dept) joinPoint.proceed(); // 执行原实现
CACHE_CONTAINER.put(CACHE_DEPT_PROFIX + res2.getId(), res2);
return res2;
}
}
/**
*
* @param joinPoint
* @return
*
* @param joinPoint
* @return
*/
@Around(value = POINTCUT_DEPT_UPDATE)
public Object cacheDeptUpdate(ProceedingJoinPoint joinPoint) throws Throwable {
//取出第一个参数
Dept deptVo = (Dept) joinPoint.getArgs()[0];
Boolean isSuccess = (Boolean) joinPoint.proceed();
if (isSuccess){
Dept dept =(Dept) CACHE_CONTAINER.get(CACHE_DEPT_PROFIX + deptVo.getId());
if (null==dept){
dept=new Dept();
if (isSuccess) {
Dept dept = (Dept) CACHE_CONTAINER.get(CACHE_DEPT_PROFIX + deptVo.getId());
if (null == dept) {
dept = new Dept();
}
BeanUtils.copyProperties(deptVo,dept);
log.info("部门对象缓存已更新"+CACHE_DEPT_PROFIX + deptVo.getId());
CACHE_CONTAINER.put(CACHE_DEPT_PROFIX+dept.getId(),dept);
BeanUtils.copyProperties(deptVo, dept);
log.info("\u90E8\u95E8\u5BF9\u8C61\u7F13\u5B58\u5DF2\u66F4\u65B0" + CACHE_DEPT_PROFIX + deptVo.getId());
CACHE_CONTAINER.put(CACHE_DEPT_PROFIX + dept.getId(), dept);
}
return isSuccess;
}
/**
*
* @param joinPoint
* @return
*/
@Around(value = POINTCUT_DEPT_DELETE)
public Object cacheDeptDelete(ProceedingJoinPoint joinPoint) throws Throwable {
//取出第一个参数
Integer id = (Integer) joinPoint.getArgs()[0];
Boolean isSuccess = (Boolean) joinPoint.proceed();
if (isSuccess){
//删除缓存
CACHE_CONTAINER.remove(CACHE_DEPT_PROFIX+id);
}
return isSuccess;
}
/**
*
*/
private static final String POINTCUT_USER_UPDATE="execution(* com.yeqifu.sys.service.impl.UserServiceImpl.updateById(..))";
private static final String POINTCUT_USER_ADD="execution(* com.yeqifu.sys.service.impl.UserServiceImpl.updateById(..))";
private static final String POINTCUT_USER_GET="execution(* com.yeqifu.sys.service.impl.UserServiceImpl.getById(..))";
private static final String POINTCUT_USER_DELETE="execution(* com.yeqifu.sys.service.impl.UserServiceImpl.removeById(..))";
private static final String CACHE_USER_PROFIX="user:";
/**
*
* @param joinPoint
* @return
*/
@Around(value = POINTCUT_USER_ADD)
public Object cacheUserAdd(ProceedingJoinPoint joinPoint) throws Throwable {
//取出第一个参数
User object = (User) joinPoint.getArgs()[0];
Boolean res = (Boolean) joinPoint.proceed();
if (res){
CACHE_CONTAINER.put(CACHE_USER_PROFIX + object.getId(),object);
}
return res;
}
/**
*
* @param joinPoint
* @return
*/
@Around(value = POINTCUT_USER_GET)
public Object cacheUserGet(ProceedingJoinPoint joinPoint) throws Throwable {
//取出第一个参数
Integer object = (Integer) joinPoint.getArgs()[0];
//从缓存里面取
Object res1 = CACHE_CONTAINER.get(CACHE_USER_PROFIX + object);
if (res1!=null){
log.info("已从缓存里面找到用户对象"+CACHE_USER_PROFIX + object);
return res1;
}else {
log.info("未从缓存里面找到用户对象,从数据库中查询并放入缓存");
User res2 =(User) joinPoint.proceed();
CACHE_CONTAINER.put(CACHE_USER_PROFIX+res2.getId(),res2);
return res2;
}
}
/**
*
* @param joinPoint
* @return
*/
@Around(value = POINTCUT_USER_UPDATE)
public Object cacheUserUpdate(ProceedingJoinPoint joinPoint) throws Throwable {
//取出第一个参数
User userVo = (User) joinPoint.getArgs()[0];
Boolean isSuccess = (Boolean) joinPoint.proceed();
if (isSuccess){
User user =(User) CACHE_CONTAINER.get(CACHE_USER_PROFIX + userVo.getId());
if (null==user){
user=new User();
}
BeanUtils.copyProperties(userVo,user);
log.info("用户对象缓存已更新"+CACHE_USER_PROFIX + userVo.getId());
CACHE_CONTAINER.put(CACHE_USER_PROFIX+user.getId(),user);
}
return isSuccess;
}
/**
*
* @param joinPoint
* @return
*/
@Around(value = POINTCUT_USER_DELETE)
public Object cacheUserDelete(ProceedingJoinPoint joinPoint) throws Throwable {
//取出第一个参数
Integer id = (Integer) joinPoint.getArgs()[0];
Boolean isSuccess = (Boolean) joinPoint.proceed();
if (isSuccess){
//删除缓存
CACHE_CONTAINER.remove(CACHE_USER_PROFIX+id);
}
return isSuccess;
}
}
/**
*
*
* @param joinPoint

@ -17,72 +17,86 @@ import java.util.List;
import java.util.Map;
/**
* CachePool Redis
*
*
*
* @Author: -
* @Date: 2019/12/20 18:05
*/
public class CachePool {
/**
* CACHE_CONTAINER redis
*
* Redis
*/
public static volatile Map<String,Object> CACHE_CONTAINER = new HashMap<>();
public static volatile Map<String, Object> CACHE_CONTAINER = new HashMap<>();
/**
* KEY
* @param key
*
*
* @param key
*/
public static void removeCacheByKey(String key){
if (CACHE_CONTAINER.containsKey(key)){
public static void removeCacheByKey(String key) {
// 判断缓存容器中是否包含指定的键
if (CACHE_CONTAINER.containsKey(key)) {
// 删除指定键的缓存数据
CACHE_CONTAINER.remove(key);
}
}
/**
*
*
*
*/
public static void removeAll(){
public static void removeAll() {
// 清空缓存容器
CACHE_CONTAINER.clear();
}
/**
*
*
*
*/
public static void syncData(){
//同步部门数据
public static void syncData() {
// 同步部门数据
DeptMapper deptMapper = SpringUtil.getBean(DeptMapper.class);
List<Dept> deptList = deptMapper.selectList(null);
for (Dept dept : deptList) {
CACHE_CONTAINER.put("dept:"+dept.getId(),dept);
// 将部门数据存入缓存容器
CACHE_CONTAINER.put("dept:" + dept.getId(), dept);
}
//同步用户数据
// 同步用户数据
UserMapper userMapper = SpringUtil.getBean(UserMapper.class);
List<User> userList = userMapper.selectList(null);
for (User user : userList) {
CACHE_CONTAINER.put("user:"+user.getId(),user);
// 将用户数据存入缓存容器
CACHE_CONTAINER.put("user:" + user.getId(), user);
}
//同步客户数据
// 同步客户数据
CustomerMapper customerMapper = SpringUtil.getBean(CustomerMapper.class);
List<Customer> customerList = customerMapper.selectList(null);
for (Customer customer : customerList) {
CACHE_CONTAINER.put("customer:"+customer.getId(),customer);
// 将客户数据存入缓存容器
CACHE_CONTAINER.put("customer:" + customer.getId(), customer);
}
//同步供应商数据
// 同步供应商数据
ProviderMapper providerMapper = SpringUtil.getBean(ProviderMapper.class);
List<Provider> providerList = providerMapper.selectList(null);
for (Provider provider : providerList) {
CACHE_CONTAINER.put("provider:"+provider.getId(),provider);
// 将供应商数据存入缓存容器
CACHE_CONTAINER.put("provider:" + provider.getId(), provider);
}
//同步商品数据
// 同步商品数据
GoodsMapper goodsMapper = SpringUtil.getBean(GoodsMapper.class);
List<Goods> goodsList = goodsMapper.selectList(null);
for (Goods goods : goodsList) {
CACHE_CONTAINER.put("goods:"+goods.getId(),goods);
// 将商品数据存入缓存容器
CACHE_CONTAINER.put("goods:" + goods.getId(), goods);
}
}
}

@ -13,97 +13,111 @@ import java.io.InputStream;
import java.util.Properties;
/**
* AppFileUtils
*
*
* @Author: -
* @Date: 2019/12/15 23:44
*/
public class AppFileUtils {
/**
*
* G:/upload/
*
*/
public static String UPLOAD_PATH="G:/upload/";
public static String UPLOAD_PATH = "G:/upload/";
// 静态代码块,初始化文件上传路径
static {
//通过反射的方式,读取配置文件的存储地址
// 通过反射的方式,读取配置文件 file.properties 中的存储地址
InputStream stream = AppFileUtils.class.getClassLoader().getResourceAsStream("file.properties");
Properties properties=new Properties();
Properties properties = new Properties();
try {
// 加载配置文件
properties.load(stream);
} catch (IOException e) {
e.printStackTrace();
}
// 获取配置文件中的文件路径,并赋值给 UPLOAD_PATH
String property = properties.getProperty("filepath");
if(null!=property) {
UPLOAD_PATH=property;
if (property != null) {
UPLOAD_PATH = property;
}
}
/**
*
* @param oldName
* @return 32
*
* 32UUID
*
* @param oldName
* @return
*/
public static String createNewFileName(String oldName) {
//获取文件名后缀
String stuff=oldName.substring(oldName.lastIndexOf("."), oldName.length());
//将UUID与文件名后缀进行拼接生成新的文件名 生成的UUID为32位
return IdUtil.simpleUUID().toUpperCase()+stuff;
// 获取文件名后缀(例如 .jpg、.png
String stuff = oldName.substring(oldName.lastIndexOf("."), oldName.length());
// 使用UUID生成新的文件名并与文件后缀拼接
return IdUtil.simpleUUID().toUpperCase() + stuff;
}
/**
*
* @param path
* @return
*
*
*
* @param path
* @return ResponseEntity
*/
public static ResponseEntity<Object> createResponseEntity(String path) {
//1,构造文件对象
File file=new File(UPLOAD_PATH, path);
if(file.exists()) {
//将下载的文件封装byte[]
byte[] bytes=null;
// 1. 构造文件对象
File file = new File(UPLOAD_PATH, path);
if (file.exists()) {
// 2. 如果文件存在,将文件内容封装为字节数组
byte[] bytes = null;
try {
bytes = FileUtil.readBytes(file);
} catch (Exception e) {
e.printStackTrace();
}
//创建封装响应头信息的对象
HttpHeaders header=new HttpHeaders();
//封装响应内容类型(APPLICATION_OCTET_STREAM 响应的内容不限定)
// 3. 创建响应头对象,并设置响应内容类型为 APPLICATION_OCTET_STREAM表示二进制流数据
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//创建ResponseEntity对象
ResponseEntity<Object> entity= new ResponseEntity<Object>(bytes, header, HttpStatus.CREATED);
// 4. 创建并返回 ResponseEntity 对象,包含文件的字节数组、响应头和 HTTP 状态
ResponseEntity<Object> entity = new ResponseEntity<>(bytes, header, HttpStatus.CREATED);
return entity;
}
return null;
return null; // 如果文件不存在,返回 null
}
/**
* _temp
* @param goodsImg
* @return
* "_temp"
*
* @param goodsImg
* @return
*/
public static String renameFile(String goodsImg) {
File file = new File(UPLOAD_PATH,goodsImg);
String replace = goodsImg.replace("_temp","");
if (file.exists()){
file.renameTo(new File(UPLOAD_PATH,replace));
// 构造文件对象
File file = new File(UPLOAD_PATH, goodsImg);
// 将文件名中的 "_temp" 替换为空
String replace = goodsImg.replace("_temp", "");
// 如果文件存在,执行重命名操作
if (file.exists()) {
file.renameTo(new File(UPLOAD_PATH, replace));
}
return replace;
return replace; // 返回重命名后的文件名
}
/**
*
* @param oldPath
*
*
*
* @param oldPath
*/
public static void removeFileByPath(String oldPath) {
//图片的路径不是默认图片的路径
if (!oldPath.equals(Constast.DEFAULT_IMG_GOODS)){
File file = new File(UPLOAD_PATH,oldPath);
if (file.exists()){
file.delete();
// 如果旧路径不是默认商品图片的路径,则删除文件
if (!oldPath.equals(Constast.DEFAULT_IMG_GOODS)) {
File file = new File(UPLOAD_PATH, oldPath);
if (file.exists()) {
file.delete(); // 删除文件
}
}
}
}

@ -9,6 +9,7 @@ import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombi
/**
*
*
*
* @Author: -
* @Date: 2019/12/3 10:29
@ -16,38 +17,51 @@ import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombi
public class PinyinUtils {
/**
*
*
*
* @param inputString
* @return "*"
*/
public static String getPingYin(String inputString) {
// 设置拼音输出的格式
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
format.setVCharType(HanyuPinyinVCharType.WITH_V);
format.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 设置拼音的大小写为小写
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 设置拼音不带音调
format.setVCharType(HanyuPinyinVCharType.WITH_V); // 设置拼音中的v字符使用“v”而非“u”
String output = "";
// 判断输入字符串是否有效
if (inputString != null && inputString.length() > 0 && !"null".equals(inputString)) {
char[] input = inputString.trim().toCharArray();
char[] input = inputString.trim().toCharArray(); // 将输入字符串转换为字符数组
try {
// 遍历每个字符,如果是中文字符,则转换为拼音,否则保留原字符
for (int i = 0; i < input.length; i++) {
// 判断字符是否为汉字
if (java.lang.Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) {
// 获取该汉字的拼音
String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format);
output += temp[0];
output += temp[0]; // 拼接拼音
} else {
output += java.lang.Character.toString(input[i]);
output += java.lang.Character.toString(input[i]); // 非汉字字符直接拼接
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
e.printStackTrace(); // 处理拼音转换过程中可能发生的异常
}
} else {
return "*";
return "*"; // 如果输入无效,返回 "*"
}
return output;
}
/**
*
*
* @param args
*/
public static void main(String[] args) {
// 测试拼音转换
String s = getPingYin("落亦");
System.out.println(s);
System.out.println(s); // 输出拼音luo yi
}
}

@ -44,3 +44,5 @@ public class ResultObj {
}
//测试

@ -24,144 +24,149 @@ import javax.servlet.Filter;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: -
* @Date: 2019/11/21 21:01
*/
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(value = { SecurityManager.class })
@ConfigurationProperties(prefix = "shiro")
@Data
@Configuration // 标注为配置类Spring 会自动扫描并加载此类的配置
@ConditionalOnWebApplication(type = Type.SERVLET) // 仅在 Servlet Web 应用中启用
@ConditionalOnClass(value = { SecurityManager.class }) // 仅在 SecurityManager 类存在时启用
@ConfigurationProperties(prefix = "shiro") // 绑定配置文件中以 "shiro" 为前缀的属性
@Data // 自动生成 getter 和 setter 方法
public class ShiroAutoConfiguration {
private static final String SHIRO_DIALECT = "shiroDialect"; // Thymeleaf Shiro 标签名常量
private static final String SHIRO_FILTER = "shiroFilter"; // Shiro 过滤器名常量
private static final String SHIRO_DIALECT = "shiroDialect";
private static final String SHIRO_FILTER = "shiroFilter";
/**
*
* MD5
*/
private String hashAlgorithmName = "md5";
/**
*
*
*/
private int hashIterations = Constast.HASHITERATIONS;
/**
*
* URL
*/
private String loginUrl = "/index.html";
/**
* Shiro
* anonUrls - 访
* logOutUrl -
* authcUlrs -
*/
private String[] anonUrls;
private String logOutUrl;
private String[] authcUlrs;
/**
*
* 1.
* 使 MD5
*/
@Bean("credentialsMatcher")
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
credentialsMatcher.setHashAlgorithmName(hashAlgorithmName);
credentialsMatcher.setHashIterations(hashIterations);
credentialsMatcher.setHashAlgorithmName(hashAlgorithmName); // 设置加密算法
credentialsMatcher.setHashIterations(hashIterations); // 设置散列次数
return credentialsMatcher;
}
/**
* userRealm
* 2. Realm
*
*/
@Bean("userRealm")
public UserRealm userRealm(CredentialsMatcher credentialsMatcher) {
UserRealm userRealm = new UserRealm();
// 注入凭证匹配器
userRealm.setCredentialsMatcher(credentialsMatcher);
userRealm.setCredentialsMatcher(credentialsMatcher); // 注入凭证匹配器
return userRealm;
}
/**
* SecurityManager
* 3. SecurityManager
*
*/
@Bean("securityManager")
public SecurityManager securityManager(UserRealm userRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 注入userRealm
securityManager.setRealm(userRealm);
securityManager.setRealm(userRealm); // 注入自定义 Realm
return securityManager;
}
/**
* shiro
* 4. Shiro
* ShiroFilterFactoryBean URL
*/
@Bean(SHIRO_FILTER)
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
// 设置安全管理器
factoryBean.setSecurityManager(securityManager);
// 设置未登陆的时要跳转的页面
factoryBean.setLoginUrl(loginUrl);
factoryBean.setSecurityManager(securityManager); // 设置安全管理器
factoryBean.setLoginUrl(loginUrl); // 设置未认证时的跳转页面
// 1. 配置过滤器链定义映射
Map<String, String> filterChainDefinitionMap = new HashMap<>();
// 设置放行的路径
// 配置匿名访问路径(无需登录)
if (anonUrls != null && anonUrls.length > 0) {
for (String anon : anonUrls) {
filterChainDefinitionMap.put(anon, "anon");
}
}
// 设置登出的路径
if (null != logOutUrl) {
// 配置登出路径
if (logOutUrl != null) {
filterChainDefinitionMap.put(logOutUrl, "logout");
}
// 设置拦截的路径
// 配置需要登录认证的路径
if (authcUlrs != null && authcUlrs.length > 0) {
for (String authc : authcUlrs) {
filterChainDefinitionMap.put(authc, "authc");
}
}
Map<String, Filter> filters=new HashMap<>();
// filters.put("authc", new ShiroLoginFilter());
//配置过滤器
// 2. 注入自定义过滤器(如果有)
Map<String, Filter> filters = new HashMap<>();
factoryBean.setFilters(filters);
// 3. 设置过滤器链定义映射
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return factoryBean;
}
/**
* shiroweb.xml
*
* @return
* 5. Shiro
* Spring Boot web.xml
*/
@Bean
public FilterRegistrationBean<DelegatingFilterProxy> delegatingFilterProxy() {
FilterRegistrationBean<DelegatingFilterProxy> filterRegistrationBean = new FilterRegistrationBean<DelegatingFilterProxy>();
FilterRegistrationBean<DelegatingFilterProxy> filterRegistrationBean = new FilterRegistrationBean<>();
DelegatingFilterProxy proxy = new DelegatingFilterProxy();
proxy.setTargetFilterLifecycle(true);
proxy.setTargetBeanName(SHIRO_FILTER);
proxy.setTargetFilterLifecycle(true); // 由 Spring 管理生命周期
proxy.setTargetBeanName(SHIRO_FILTER); // 关联 Shiro 过滤器
filterRegistrationBean.setFilter(proxy);
return filterRegistrationBean;
}
/* 加入注解的使用,不加入这个注解不生效--开始 */
/**
*
* @param securityManager
* @return
* 6. Shiro @RequiresRoles @RequiresPermissions
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager); // 注入 SecurityManager
return advisor;
}
/**
* 7.
*/
@Bean
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
advisorAutoProxyCreator.setProxyTargetClass(true); // 使用 CGLIB 代理类
return advisorAutoProxyCreator;
}
/* 加入注解的使用,不加入这个注解不生效--结束 */
/**
* htmlshiro
*
* @return
* 8. Thymeleaf Shiro
* HTML 使 Shiro shiro:hasPermission
*/
@Bean(name = SHIRO_DIALECT)
public ShiroDialect shiroDialect() {

@ -16,62 +16,70 @@ import java.util.Map;
import java.util.Set;
/**
*
*
*
*
* @Author: -
* @Date: 2019/12/20 18:36
*/
@Api(description = "缓存管理")
@RestController
@RequestMapping("cache")
@Api(description = "缓存管理") // Swagger注解用于描述API功能
@RestController // 标识为Spring MVC的Rest控制器
@RequestMapping("cache") // 定义基础请求路径为 "cache"
public class CacheController {
private static volatile Map<String,Object> CACHE_CONTAINER= CachePool.CACHE_CONTAINER;
/**
*
* 使CachePool
* 使volatile线
*/
private static volatile Map<String,Object> CACHE_CONTAINER = CachePool.CACHE_CONTAINER;
/**
*
* @return
* @return DataGridView
*/
@ApiOperation(value = "查询所有缓存",notes = "查询所有缓存")
@RequestMapping(value = "loadAllCache",method = RequestMethod.GET)
public DataGridView loadAllCache(){
List<CacheBean> list = new ArrayList<>();
@ApiOperation(value = "查询所有缓存", notes = "查询所有缓存") // Swagger注解用于描述接口的功能
@RequestMapping(value = "loadAllCache", method = RequestMethod.GET) // 映射GET请求到该方法
public DataGridView loadAllCache() {
List<CacheBean> list = new ArrayList<>(); // 用于存储缓存项的列表
// 遍历缓存容器的所有键值对
Set<Map.Entry<String, Object>> entrySet = CACHE_CONTAINER.entrySet();
for (Map.Entry<String, Object> entry : entrySet) {
list.add(new CacheBean(entry.getKey(),entry.getValue()));
// 将每个键值对封装为CacheBean对象并添加到列表中
list.add(new CacheBean(entry.getKey(), entry.getValue()));
}
return new DataGridView(list);
return new DataGridView(list); // 将列表封装为DataGridView对象返回
}
/**
*
* @param key
* @return
*
* @param key
* @return ResultObj
*/
@RequestMapping("deleteCache")
public ResultObj deleteCache(String key){
CachePool.removeCacheByKey(key);
return ResultObj.DELETE_SUCCESS;
@RequestMapping("deleteCache") // 映射请求路径为 "deleteCache"
public ResultObj deleteCache(String key) {
CachePool.removeCacheByKey(key); // 调用CachePool的方法删除指定缓存
return ResultObj.DELETE_SUCCESS; // 返回删除成功的结果
}
/**
*
* @return
* @return ResultObj
*/
@RequestMapping("removeAllCache")
public ResultObj removeAllCache(){
CachePool.removeAll();
return ResultObj.DELETE_SUCCESS;
@RequestMapping("removeAllCache") // 映射请求路径为 "removeAllCache"
public ResultObj removeAllCache() {
CachePool.removeAll(); // 调用CachePool的方法清空所有缓存
return ResultObj.DELETE_SUCCESS; // 返回清空成功的结果
}
/**
*
* @return
* @return ResultObj
*/
@RequestMapping("syncCache")
public ResultObj syncCache(){
CachePool.syncData();
return ResultObj.SYNCCACHE_SUCCESS;
@RequestMapping("syncCache") // 映射请求路径为 "syncCache"
public ResultObj syncCache() {
CachePool.syncData(); // 调用CachePool的方法同步缓存
return ResultObj.SYNCCACHE_SUCCESS; // 返回同步成功的结果
}
}

@ -1,6 +1,5 @@
package com.yeqifu.sys.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -18,148 +17,144 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.*;
/**
* <p>
* InnoDB free: 9216 kB
* </p>
*
* CRUD
*
* @author luoyi-
* @since 2019-11-26
* @Author: -
* @Since: 2019-11-26
*/
@RestController
@RequestMapping("/dept")
@RestController // 标识为Spring MVC的Rest控制器
@RequestMapping("/dept") // 定义基础请求路径为 "/dept"
public class DeptController {
@Autowired
private IDeptService deptService;
private IDeptService deptService; // 自动注入部门服务接口
/**
*
* @param deptVo
* @return
*
* JSON
* @param deptVo
* @return DataGridView
*/
@RequestMapping("loadDeptManagerLeftTreeJson")
public DataGridView loadManagerLeftTreeJson(DeptVo deptVo){
//查询出所有的部门存放进list中
// QueryWrapper<Dept> queryWrapper = new QueryWrapper<>();
// queryWrapper.eq('1');
public DataGridView loadManagerLeftTreeJson(DeptVo deptVo) {
// 查询所有部门数据
List<Dept> list = deptService.list();
List<TreeNode> treeNodes = new ArrayList<>();
//将部门放入treeNodes中组装成json
// 遍历部门数据,将每个部门封装为树形节点
for (Dept dept : list) {
Boolean open = dept.getOpen()==1?true:false;
treeNodes.add(new TreeNode(dept.getId(),dept.getPid(),dept.getName(),open));
Boolean open = dept.getOpen() == 1; // 根据部门状态设置节点是否展开
treeNodes.add(new TreeNode(dept.getId(), dept.getPid(), dept.getName(), open));
}
return new DataGridView(treeNodes);
return new DataGridView(treeNodes); // 返回树形节点数据
}
/**
*
* @param deptVo
* @return
*
* @param deptVo
* @return DataGridView
*/
@RequestMapping("loadAllDept")
public DataGridView loadAllDept(DeptVo deptVo){
IPage<Dept> page = new Page<>(deptVo.getPage(),deptVo.getLimit());
//进行模糊查询
public DataGridView loadAllDept(DeptVo deptVo) {
IPage<Dept> page = new Page<>(deptVo.getPage(), deptVo.getLimit()); // 创建分页对象
QueryWrapper<Dept> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(deptVo.getName()),"name",deptVo.getName());
queryWrapper.like(StringUtils.isNotBlank(deptVo.getRemark()),"remark",deptVo.getRemark());
queryWrapper.like(StringUtils.isNotBlank(deptVo.getAddress()),"address",deptVo.getAddress());
queryWrapper.eq(deptVo.getId()!=null,"id",deptVo.getId()).or().eq(deptVo.getId()!=null,"pid",deptVo.getId());
queryWrapper.orderByAsc("ordernum");
//进行查询
deptService.page(page,queryWrapper);
//返回DataGridView
return new DataGridView(page.getTotal(),page.getRecords());
// 添加模糊查询条件
queryWrapper.like(StringUtils.isNotBlank(deptVo.getName()), "name", deptVo.getName());
queryWrapper.like(StringUtils.isNotBlank(deptVo.getRemark()), "remark", deptVo.getRemark());
queryWrapper.like(StringUtils.isNotBlank(deptVo.getAddress()), "address", deptVo.getAddress());
queryWrapper.eq(deptVo.getId() != null, "id", deptVo.getId())
.or().eq(deptVo.getId() != null, "pid", deptVo.getId());
queryWrapper.orderByAsc("ordernum"); // 按排序码升序排列
deptService.page(page, queryWrapper); // 执行分页查询
return new DataGridView(page.getTotal(), page.getRecords()); // 返回分页数据
}
/**
*
* @param deptVo
* @return
* @param deptVo
* @return ResultObj
*/
@RequestMapping("addDept")
public ResultObj addDept(DeptVo deptVo){
public ResultObj addDept(DeptVo deptVo) {
try {
deptVo.setCreatetime(new Date());
deptService.save(deptVo);
return ResultObj.ADD_SUCCESS;
deptVo.setCreatetime(new Date()); // 设置创建时间
deptService.save(deptVo); // 保存部门数据
return ResultObj.ADD_SUCCESS; // 返回成功结果
} catch (Exception e) {
e.printStackTrace();
return ResultObj.ADD_ERROR;
return ResultObj.ADD_ERROR; // 返回失败结果
}
}
/**
*
* @return
* 1
* @return Map
*/
@RequestMapping("loadDeptMaxOrderNum")
public Map<String,Object> loadDeptMaxOrderNum(){
Map<String,Object> map = new HashMap<String,Object>();
public Map<String, Object> loadDeptMaxOrderNum() {
Map<String, Object> map = new HashMap<>();
QueryWrapper<Dept> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("ordernum");
IPage<Dept> page = new Page<>(1,1);
List<Dept> list = deptService.page(page,queryWrapper).getRecords();
if (list.size()>0){
map.put("value",list.get(0).getOrdernum()+1);
}else {
map.put("value",1);
queryWrapper.orderByDesc("ordernum"); // 按排序码降序排列
IPage<Dept> page = new Page<>(1, 1); // 只查询一条记录
List<Dept> list = deptService.page(page, queryWrapper).getRecords();
if (list.size() > 0) {
map.put("value", list.get(0).getOrdernum() + 1); // 获取最大排序码+1
} else {
map.put("value", 1); // 如果无记录排序码为1
}
return map;
}
/**
*
* @param deptVo
* @return
*
* @param deptVo
* @return ResultObj
*/
@RequestMapping("updateDept")
public ResultObj updateDept(DeptVo deptVo){
public ResultObj updateDept(DeptVo deptVo) {
try {
deptService.updateById(deptVo);
return ResultObj.UPDATE_SUCCESS;
deptService.updateById(deptVo); // 根据ID更新部门数据
return ResultObj.UPDATE_SUCCESS; // 返回成功结果
} catch (Exception e) {
e.printStackTrace();
return ResultObj.UPDATE_ERROR;
return ResultObj.UPDATE_ERROR; // 返回失败结果
}
}
/**
*
* @param deptVo
* @return
* @param deptVo
* @return Map
*/
@RequestMapping("checkDeptHasChildrenNode")
public Map<String,Object> checkDeptHasChildrenNode(DeptVo deptVo){
Map<String,Object> map = new HashMap<String, Object>();
public Map<String, Object> checkDeptHasChildrenNode(DeptVo deptVo) {
Map<String, Object> map = new HashMap<>();
QueryWrapper<Dept> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("pid",deptVo.getId());
queryWrapper.eq("pid", deptVo.getId()); // 根据父ID查询
List<Dept> list = deptService.list(queryWrapper);
if (list.size()>0){
map.put("value",true);
}else {
map.put("value",false);
}
map.put("value", !list.isEmpty()); // 如果有子部门返回true否则返回false
return map;
}
/**
*
* @param deptVo
* @return
* @param deptVo
* @return ResultObj
*/
@RequestMapping("deleteDept")
public ResultObj deleteDept(DeptVo deptVo){
public ResultObj deleteDept(DeptVo deptVo) {
try {
deptService.removeById(deptVo.getId());
return ResultObj.DELETE_SUCCESS;
deptService.removeById(deptVo.getId()); // 根据ID删除部门
return ResultObj.DELETE_SUCCESS; // 返回成功结果
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
return ResultObj.DELETE_ERROR; // 返回失败结果
}
}
}

@ -14,57 +14,79 @@ import java.util.HashMap;
import java.util.Map;
/**
*
*
*
* @Author: -
* @Date: 2019/12/15 23:46
*/
@RestController
@RequestMapping("file")
@RestController // 标识为Spring MVC的Rest控制器
@RequestMapping("file") // 定义基础请求路径为 "/file"
public class FileController {
/**
*
* @param mf
* @return
* @param mf MultipartFile
* @return Map
*/
@RequestMapping("uploadFile")
public Map<String,Object> uploadFile(MultipartFile mf) {
//1.得到文件名
public Map<String, Object> uploadFile(MultipartFile mf) {
// 1. 获取原始文件名
String oldName = mf.getOriginalFilename();
//2.根据旧的文件名生成新的文件名
String newName=AppFileUtils.createNewFileName(oldName);
//3.得到当前日期的字符串
String dirName= DateUtil.format(new Date(), "yyyy-MM-dd");
//4.构造文件夹
File dirFile=new File(AppFileUtils.UPLOAD_PATH,dirName);
//5.判断当前文件夹是否存在
if(!dirFile.exists()) {
//如果不存在则创建新文件夹
// 2. 生成新的文件名(避免重复文件名)
String newName = AppFileUtils.createNewFileName(oldName);
// 3. 获取当前日期并格式化为 "yyyy-MM-dd" 字符串
String dirName = DateUtil.format(new Date(), "yyyy-MM-dd");
// 4. 构造保存文件的目录
File dirFile = new File(AppFileUtils.UPLOAD_PATH, dirName);
// 5. 检查目录是否存在,若不存在则创建
if (!dirFile.exists()) {
dirFile.mkdirs();
}
//6.构造文件对象
File file=new File(dirFile, newName+"_temp");
//7.把mf里面的图片信息写入file
// 6. 创建目标文件对象,文件名后加 "_temp" 表示临时文件
File file = new File(dirFile, newName + "_temp");
// 7. 将文件内容写入到目标文件中
try {
mf.transferTo(file);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
e.printStackTrace(); // 打印异常信息
}
Map<String,Object> map=new HashMap<String, Object>();
map.put("path",dirName+"/"+newName+"_temp");
// 8. 返回文件的保存路径(供前端调用)
Map<String, Object> map = new HashMap<>();
map.put("path", dirName + "/" + newName + "_temp");
return map;
}
/**
*
*
*
* @param path
* @return ResponseEntity
*/
@RequestMapping("showImageByPath")
public ResponseEntity<byte[]> showImageByPath(String path) {
// 规范路径,防止路径穿越
// **注意:未完成的功能,以下是解释和可能的逻辑建议**
// 1. 规范路径,防止路径穿越漏洞
Path normalizedPath = Paths.get(AppFileUtils.UPLOAD_PATH, path).normalize();
// 2. 验证路径是否在允许的上传目录内
if (!normalizedPath.startsWith(AppFileUtils.UPLOAD_PATH)) {
// 如果路径越界,则返回错误响应
// 如果路径越界,则返回403禁止访问状态响应
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
}
}
// 3. 从路径加载文件(逻辑未完成)
// - 需要检查文件是否存在
// - 需要读取文件的字节内容
// - 使用 `ResponseEntity` 返回字节数据和适当的 Content-Type 头
}
}

@ -24,68 +24,86 @@ import java.io.IOException;
import java.util.Date;
/**
*
*
*
*
* @Author: -
* @Date: 2019/11/21 21:33
*/
@RestController
@RequestMapping("login")
@RestController // 表示该类是一个Rest风格的控制器直接返回JSON数据
@RequestMapping("login") // 定义基础请求路径为 "/login"
public class LoginController {
@Autowired
private ILoginfoService loginfoService;
private ILoginfoService loginfoService; // 自动注入日志服务,用于记录登录日志
/**
*
* @param userVo
* @param code
* @param session
* @return ResultObj
*/
@RequestMapping("login")
public ResultObj login(UserVo userVo,String code,HttpSession session){
//获得存储在session中的验证码
public ResultObj login(UserVo userVo, String code, HttpSession session) {
// 从Session中获取之前生成的验证码
String sessionCode = (String) session.getAttribute("code");
if (code!=null&&sessionCode.equals(code)){
Subject subject = SecurityUtils.getSubject();
AuthenticationToken token = new UsernamePasswordToken(userVo.getLoginname(),userVo.getPwd());
// 验证用户输入的验证码是否正确
if (code != null && sessionCode.equals(code)) {
Subject subject = SecurityUtils.getSubject(); // 获取当前用户的Shiro Subject
AuthenticationToken token = new UsernamePasswordToken(userVo.getLoginname(), userVo.getPwd()); // 创建用户认证令牌
try {
//对用户进行认证登陆
// 执行用户认证登录
subject.login(token);
//通过subject获取以认证活动的user
// 通过认证后获取活动用户信息
ActiverUser activerUser = (ActiverUser) subject.getPrincipal();
//将user存储到session中
WebUtils.getSession().setAttribute("user",activerUser.getUser());
//记录登陆日志
// 将用户信息存储到Session中
WebUtils.getSession().setAttribute("user", activerUser.getUser());
// 创建登录日志对象
Loginfo entity = new Loginfo();
entity.setLoginname(activerUser.getUser().getName()+"-"+activerUser.getUser().getLoginname());
entity.setLoginip(WebUtils.getRequest().getRemoteAddr());
entity.setLogintime(new Date());
loginfoService.save(entity);
entity.setLoginname(activerUser.getUser().getName() + "-" + activerUser.getUser().getLoginname()); // 登录名称
entity.setLoginip(WebUtils.getRequest().getRemoteAddr()); // 获取用户IP地址
entity.setLogintime(new Date()); // 设置登录时间
loginfoService.save(entity); // 保存登录日志
return ResultObj.LOGIN_SUCCESS;
return ResultObj.LOGIN_SUCCESS; // 返回登录成功结果
} catch (AuthenticationException e) {
e.printStackTrace();
return ResultObj.LOGIN_ERROR_PASS;
return ResultObj.LOGIN_ERROR_PASS; // 用户名或密码错误
}
}else {
return ResultObj.LOGIN_ERROR_CODE;
} else {
return ResultObj.LOGIN_ERROR_CODE; // 验证码错误
}
}
/**
*
* @param response
* @param session
*
* Session
*
* @param response Http
* @param session
* @throws IOException
*/
@RequestMapping("getCode")
public void getCode(HttpServletResponse response, HttpSession session) throws IOException{
//定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(116, 36,4,5);
session.setAttribute("code",lineCaptcha.getCode());
public void getCode(HttpServletResponse response, HttpSession session) throws IOException {
// 创建图形验证码,指定宽、高、字符数和干扰线数
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(116, 36, 4, 5);
// 将验证码内容存储到Session中
session.setAttribute("code", lineCaptcha.getCode());
try {
// 获取响应输出流,将验证码图片写入响应
ServletOutputStream outputStream = response.getOutputStream();
lineCaptcha.write(outputStream);
outputStream.close();
outputStream.close(); // 关闭输出流
} catch (IOException e) {
e.printStackTrace();
e.printStackTrace(); // 捕获并打印IO异常
}
}
}

@ -1,10 +1,8 @@
package com.yeqifu.sys.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sun.org.apache.regexp.internal.RE;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
import com.yeqifu.sys.entity.Loginfo;
@ -13,7 +11,6 @@ import com.yeqifu.sys.vo.LoginfoVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.Serializable;
@ -21,76 +18,92 @@ import java.util.ArrayList;
import java.util.Collection;
/**
* <p>
* InnoDB free: 9216 kB
* </p>
*
*
*
* @author luoyi-
* @since 2019-11-23
* @Author: luoyi-
* @Since: 2019-11-23
*/
@RestController
@RequestMapping("loginfo")
@RestController // 标注为Rest风格的控制器方法直接返回JSON格式数据
@RequestMapping("loginfo") // 定义基础请求路径为 "/loginfo"
public class LoginfoController {
@Autowired
private ILoginfoService loginfoService;
private ILoginfoService loginfoService; // 自动注入日志服务接口,负责日志数据的业务逻辑处理
/**
*
* @param loginfoVo
* @return
*
*
*
* @param loginfoVo
* @return
*/
@RequestMapping("loadAllLoginfo")
public DataGridView loadAllLoginfo(LoginfoVo loginfoVo){
IPage<Loginfo> page = new Page<Loginfo>(loginfoVo.getPage(),loginfoVo.getLimit());
QueryWrapper<Loginfo> queryWrapper = new QueryWrapper<Loginfo>();
//进行模糊查询
queryWrapper.like(StringUtils.isNotBlank(loginfoVo.getLoginname()),"loginname",loginfoVo.getLoginname());
queryWrapper.like(StringUtils.isNotBlank(loginfoVo.getLoginip()),"loginip",loginfoVo.getLoginip());
//数据库中登陆时间要大于用户输入的开始时间且小于用户登陆的结束时间
queryWrapper.ge(loginfoVo.getStartTime()!=null,"logintime",loginfoVo.getStartTime());
queryWrapper.le(loginfoVo.getEndTime()!=null,"logintime",loginfoVo.getEndTime());
//根据登陆时间进行降序排序
public DataGridView loadAllLoginfo(LoginfoVo loginfoVo) {
// 创建分页对象,指定当前页和每页条数
IPage<Loginfo> page = new Page<>(loginfoVo.getPage(), loginfoVo.getLimit());
// 构造查询条件
QueryWrapper<Loginfo> queryWrapper = new QueryWrapper<>();
// 根据登录名进行模糊查询,条件为空时忽略
queryWrapper.like(StringUtils.isNotBlank(loginfoVo.getLoginname()), "loginname", loginfoVo.getLoginname());
// 根据登录IP进行模糊查询条件为空时忽略
queryWrapper.like(StringUtils.isNotBlank(loginfoVo.getLoginip()), "loginip", loginfoVo.getLoginip());
// 筛选登录时间大于等于开始时间
queryWrapper.ge(loginfoVo.getStartTime() != null, "logintime", loginfoVo.getStartTime());
// 筛选登录时间小于等于结束时间
queryWrapper.le(loginfoVo.getEndTime() != null, "logintime", loginfoVo.getEndTime());
// 按登录时间降序排列
queryWrapper.orderByDesc("logintime");
loginfoService.page(page,queryWrapper);
return new DataGridView(page.getTotal(),page.getRecords());
// 分页查询日志数据
loginfoService.page(page, queryWrapper);
// 返回包含总条数和当前页数据的结果
return new DataGridView(page.getTotal(), page.getRecords());
}
/**
*
* @param id
* @return
* ID
*
* @param id
* @return
*/
@RequestMapping("deleteLoginfo")
public ResultObj deleteLoginfo(Integer id){
public ResultObj deleteLoginfo(Integer id) {
try {
// 根据ID删除日志
loginfoService.removeById(id);
return ResultObj.DELETE_SUCCESS;
return ResultObj.DELETE_SUCCESS; // 返回删除成功的结果
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
return ResultObj.DELETE_ERROR; // 返回删除失败的结果
}
}
/**
*
* @param loginfoVo
* @return
*
* ID
*
* @param loginfoVo ID
* @return
*/
@RequestMapping("batchDeleteLoginfo")
public ResultObj batchDeleteLoginfo(LoginfoVo loginfoVo){
public ResultObj batchDeleteLoginfo(LoginfoVo loginfoVo) {
try {
Collection<Serializable> idList = new ArrayList<Serializable>();
// 创建集合存储需要删除的日志ID
Collection<Serializable> idList = new ArrayList<>();
// 遍历日志ID数组将其添加到集合中
for (Integer id : loginfoVo.getIds()) {
idList.add(id);
}
// 批量删除日志
this.loginfoService.removeByIds(idList);
return ResultObj.DELETE_SUCCESS;
return ResultObj.DELETE_SUCCESS; // 返回批量删除成功的结果
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
return ResultObj.DELETE_ERROR; // 返回批量删除失败的结果
}
}
}

@ -21,6 +21,8 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.*;
/**
*
*
* @Author: -
* @Date: 2019/11/22 15:35
*/
@ -37,119 +39,97 @@ public class MenuController {
@Autowired
private IRoleService roleService;
/**
*
* @param permissionVo
* @return
*/
@RequestMapping("loadIndexLeftMenuJson")
public DataGridView loadIndexLeftMenuJson(PermissionVo permissionVo){
//查询所有菜单
QueryWrapper<Permission> queryWrapper = new QueryWrapper<Permission>();
//设置查询条件
//查询的必须是菜单不能是crud的权限
queryWrapper.eq("type",Constast.TYPE_MENU);
//菜单必须可用
queryWrapper.eq("available", Constast.AVAILABLE_TRUE);
//获得用户 判断用户的类型
public DataGridView loadIndexLeftMenuJson(PermissionVo permissionVo) {
// 查询所有菜单
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("type", Constast.TYPE_MENU); // 只查询菜单
queryWrapper.eq("available", Constast.AVAILABLE_TRUE); // 菜单必须可用
// 获取当前用户信息
User user = (User) WebUtils.getSession().getAttribute("user");
List<Permission> list = null;
if (user.getType().equals(Constast.USER_TYPE_SUPER)){
//用户类型为超级管理员
List<Permission> list;
if (user.getType().equals(Constast.USER_TYPE_SUPER)) {
// 超级管理员查询所有菜单
list = permissionService.list(queryWrapper);
}else {
//用户类型为 普通用户
//根据用户ID+角色+权限去查询
} else {
// 普通用户根据角色和权限查询菜单
Integer userId = user.getId();
//1.根据用户ID查询角色
List<Integer> currentUserRoleIds = roleService.queryUserRoleIdsByUid(userId);
//2.根据角色ID查询菜单ID和权限ID
//使用set去重
List<Integer> currentUserRoleIds = roleService.queryUserRoleIdsByUid(userId); // 获取用户角色ID
Set<Integer> pids = new HashSet<>();
for (Integer rid : currentUserRoleIds) {
//根据角色ID查询菜单ID和权限ID
List<Integer> permissionIds = roleService.queryRolePermissionIdsByRid(rid);
//将菜单ID和权限ID放入Set中去重
pids.addAll(permissionIds);
pids.addAll(roleService.queryRolePermissionIdsByRid(rid)); // 根据角色ID查询权限ID
}
//3.根据角色ID查询权限
if (pids.size()>0){
queryWrapper.in("id",pids);
if (!pids.isEmpty()) {
queryWrapper.in("id", pids); // 根据权限ID查询菜单
list = permissionService.list(queryWrapper);
}else {
list=new ArrayList<>();
} else {
list = new ArrayList<>();
}
}
List<TreeNode> treeNodes = new ArrayList<TreeNode>();
// 构造树节点列表
List<TreeNode> treeNodes = new ArrayList<>();
for (Permission p : list) {
Integer id =p.getId();
Integer pid = p.getPid();
String title = p.getTitle();
String icon = p.getIcon();
String href = p.getHref();
Boolean spread = p.getOpen().equals(Constast.OPEN_TRUE)?true:false;
treeNodes.add(new TreeNode(id,pid,title,icon,href,spread));
Boolean spread = p.getOpen().equals(Constast.OPEN_TRUE);
treeNodes.add(new TreeNode(p.getId(), p.getPid(), p.getTitle(), p.getIcon(), p.getHref(), spread));
}
//构造层级关系
List<TreeNode> list2 = TreeNodeBuilder.build(treeNodes,1);
return new DataGridView(list2);
// 构造层级菜单树
return new DataGridView(TreeNodeBuilder.build(treeNodes, 1));
}
/************************菜单管理*********************************/
/**
*
*
* @param permissionVo
* @return
* @return
*/
@RequestMapping("loadMenuManagerLeftTreeJson")
public DataGridView loadMenuManagerLeftTreeJson(PermissionVo permissionVo){
public DataGridView loadMenuManagerLeftTreeJson(PermissionVo permissionVo) {
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("type",Constast.TYPE_MENU);
//查询出所有的菜单存放进list中
List<Permission> list = permissionService.list(queryWrapper);
queryWrapper.eq("type", Constast.TYPE_MENU); // 只查询菜单
List<Permission> list = permissionService.list(queryWrapper); // 查询所有菜单
List<TreeNode> treeNodes = new ArrayList<>();
//将菜单放入treeNodes中组装成json
for (Permission menu : list) {
Boolean open = menu.getOpen()==1?true:false;
treeNodes.add(new TreeNode(menu.getId(),menu.getPid(),menu.getTitle(),open));
Boolean open = menu.getOpen() == 1; // 判断是否展开
treeNodes.add(new TreeNode(menu.getId(), menu.getPid(), menu.getTitle(), open));
}
return new DataGridView(treeNodes);
}
/**
*
*
* @param permissionVo
* @return
* @return
*/
@RequestMapping("loadAllMenu")
public DataGridView loadAllMenu(PermissionVo permissionVo){
IPage<Permission> page = new Page<>(permissionVo.getPage(),permissionVo.getLimit());
//进行模糊查询
public DataGridView loadAllMenu(PermissionVo permissionVo) {
IPage<Permission> page = new Page<>(permissionVo.getPage(), permissionVo.getLimit());
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(permissionVo.getId()!=null,"id",permissionVo.getId()).or().eq(permissionVo.getId()!=null,"pid",permissionVo.getId());
//只能查询菜单
queryWrapper.eq("type",Constast.TYPE_MENU);
queryWrapper.like(StringUtils.isNotBlank(permissionVo.getTitle()),"title",permissionVo.getTitle());
queryWrapper.orderByAsc("ordernum");
//进行查询
permissionService.page(page,queryWrapper);
//返回DataGridView
return new DataGridView(page.getTotal(),page.getRecords());
queryWrapper.eq(permissionVo.getId() != null, "id", permissionVo.getId())
.or().eq(permissionVo.getId() != null, "pid", permissionVo.getId());
queryWrapper.eq("type", Constast.TYPE_MENU); // 只查询菜单
queryWrapper.like(StringUtils.isNotBlank(permissionVo.getTitle()), "title", permissionVo.getTitle());
queryWrapper.orderByAsc("ordernum"); // 根据排序码升序排列
permissionService.page(page, queryWrapper); // 分页查询
return new DataGridView(page.getTotal(), page.getRecords());
}
/**
*
* @param permissionVo
* @return
* @return
*/
@RequestMapping("addMenu")
public ResultObj addMenu(PermissionVo permissionVo){
public ResultObj addMenu(PermissionVo permissionVo) {
try {
//设置添加类型为 menu
permissionVo.setType(Constast.TYPE_MENU);
permissionVo.setType(Constast.TYPE_MENU); // 设置类型为菜单
permissionService.save(permissionVo);
return ResultObj.ADD_SUCCESS;
} catch (Exception e) {
@ -159,31 +139,27 @@ public class MenuController {
}
/**
*
* @return
*
* @return
*/
@RequestMapping("loadMenuMaxOrderNum")
public Map<String,Object> loadMenuMaxOrderNum(){
Map<String,Object> map = new HashMap<String,Object>();
public Map<String, Object> loadMenuMaxOrderNum() {
Map<String, Object> map = new HashMap<>();
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("ordernum");
IPage<Permission> page = new Page<>(1,1);
List<Permission> list = permissionService.page(page,queryWrapper).getRecords();
if (list.size()>0){
map.put("value",list.get(0).getOrdernum()+1);
}else {
map.put("value",1);
}
IPage<Permission> page = new Page<>(1, 1);
List<Permission> list = permissionService.page(page, queryWrapper).getRecords();
map.put("value", list.isEmpty() ? 1 : list.get(0).getOrdernum() + 1);
return map;
}
/**
*
* @param permissionVo
* @return
* @return
*/
@RequestMapping("updateMenu")
public ResultObj updateMenu(PermissionVo permissionVo){
public ResultObj updateMenu(PermissionVo permissionVo) {
try {
permissionService.updateById(permissionVo);
return ResultObj.UPDATE_SUCCESS;
@ -194,31 +170,26 @@ public class MenuController {
}
/**
*
*
* @param permissionVo
* @return
* @return
*/
@RequestMapping("checkMenuHasChildrenNode")
public Map<String,Object> checkMenuHasChildrenNode(PermissionVo permissionVo){
Map<String,Object> map = new HashMap<String, Object>();
public Map<String, Object> checkMenuHasChildrenNode(PermissionVo permissionVo) {
Map<String, Object> map = new HashMap<>();
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("pid",permissionVo.getId());
List<Permission> list = permissionService.list(queryWrapper);
if (list.size()>0){
map.put("value",true);
}else {
map.put("value",false);
}
queryWrapper.eq("pid", permissionVo.getId()); // 查询是否有子菜单
map.put("value", !permissionService.list(queryWrapper).isEmpty());
return map;
}
/**
*
* @param permissionVo
* @return
* @return
*/
@RequestMapping("deleteMenu")
public ResultObj deleteMenu(PermissionVo permissionVo){
public ResultObj deleteMenu(PermissionVo permissionVo) {
try {
permissionService.removeById(permissionVo.getId());
return ResultObj.DELETE_SUCCESS;
@ -227,6 +198,4 @@ public class MenuController {
return ResultObj.DELETE_ERROR;
}
}
}

@ -37,48 +37,51 @@ public class NoticeController {
private INoticeService noticeService;
/**
*
* @param noticeVo
* @return
*
*
*
* @param noticeVo
* @return DataGridView
*/
@RequestMapping("loadAllNotice")
public DataGridView loadAllNotice(NoticeVo noticeVo){
IPage<Notice> page = new Page<Notice>(noticeVo.getPage(),noticeVo.getLimit());
QueryWrapper<Notice> queryWrapper = new QueryWrapper<Notice>();
//进行模糊查询
queryWrapper.like(StringUtils.isNotBlank(noticeVo.getTitle()),"title",noticeVo.getTitle());
queryWrapper.like(StringUtils.isNotBlank(noticeVo.getOpername()),"opername",noticeVo.getOpername());
//公告创建时间应该大于搜索开始时间小于搜索结束时间
queryWrapper.ge(noticeVo.getStartTime()!=null,"createtime",noticeVo.getStartTime());
queryWrapper.le(noticeVo.getEndTime()!=null,"createtime",noticeVo.getEndTime());
//根据公告创建时间进行排序
public DataGridView loadAllNotice(NoticeVo noticeVo) {
// 分页和条件查询
IPage<Notice> page = new Page<>(noticeVo.getPage(), noticeVo.getLimit());
QueryWrapper<Notice> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(noticeVo.getTitle()), "title", noticeVo.getTitle());
queryWrapper.like(StringUtils.isNotBlank(noticeVo.getOpername()), "opername", noticeVo.getOpername());
queryWrapper.ge(noticeVo.getStartTime() != null, "createtime", noticeVo.getStartTime());
queryWrapper.le(noticeVo.getEndTime() != null, "createtime", noticeVo.getEndTime());
queryWrapper.orderByDesc("createtime");
noticeService.page(page,queryWrapper);
return new DataGridView(page.getTotal(),page.getRecords());
noticeService.page(page, queryWrapper);
return new DataGridView(page.getTotal(), page.getRecords());
}
/**
* ID
* @param id ID
* @return
* ID
*
* @param id ID
* @return DataGridView
*/
@RequestMapping("loadNoticeById")
public DataGridView loadNoticeById(Integer id){
public DataGridView loadNoticeById(Integer id) {
Notice notice = noticeService.getById(id);
return new DataGridView(notice);
}
/**
*
* @param noticeVo
* @return
*
*
* @param noticeVo
* @return
*/
@RequestMapping("addNotice")
public ResultObj addNotice(NoticeVo noticeVo){
public ResultObj addNotice(NoticeVo noticeVo) {
try {
noticeVo.setCreatetime(new Date());
noticeVo.setCreatetime(new Date()); // 设置创建时间
User user = (User) WebUtils.getSession().getAttribute("user");
noticeVo.setOpername(user.getName());
noticeVo.setOpername(user.getName()); // 设置操作人
noticeService.save(noticeVo);
return ResultObj.ADD_SUCCESS;
} catch (Exception e) {
@ -89,11 +92,12 @@ public class NoticeController {
/**
*
* @param noticeVo
* @return
*
* @param noticeVo
* @return
*/
@RequestMapping("updateNotice")
public ResultObj updateNotice(NoticeVo noticeVo){
public ResultObj updateNotice(NoticeVo noticeVo) {
try {
noticeService.updateById(noticeVo);
return ResultObj.UPDATE_SUCCESS;
@ -104,12 +108,13 @@ public class NoticeController {
}
/**
*
* @param noticeVo
* @return
*
*
* @param noticeVo ID
* @return
*/
@RequestMapping("deleteNotice")
public ResultObj deleteNotice(NoticeVo noticeVo){
public ResultObj deleteNotice(NoticeVo noticeVo) {
try {
noticeService.removeById(noticeVo);
return ResultObj.DELETE_SUCCESS;
@ -121,24 +126,22 @@ public class NoticeController {
/**
*
* @param noticeVo
* @return
*
* @param noticeVo ID
* @return
*/
@RequestMapping("batchDeleteNotice")
public ResultObj batchDeleteNotice(NoticeVo noticeVo){
public ResultObj batchDeleteNotice(NoticeVo noticeVo) {
try {
Collection<Serializable> idList = new ArrayList<>();
for (Integer id : noticeVo.getIds()) {
idList.add(id);
idList.add(id); // 将ID加入集合
}
noticeService.removeByIds(idList);
noticeService.removeByIds(idList); // 批量删除
return ResultObj.DELETE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
}
}
}

@ -22,74 +22,66 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* InnoDB free: 9216 kB
* </p>
*
* @author luoyi-
* @since 2019-11-22
*/
@RestController
/@RestController
@RequestMapping("permission")
public class PermissionController {
@Autowired
private IPermissionService permissionService;
/**
*
* @param permissionVo
* @return
*
*
*
* @param permissionVo
* @return DataGridView
*/
@RequestMapping("loadPermissionManagerLeftTreeJson")
public DataGridView loadPermissionManagerLeftTreeJson(PermissionVo permissionVo){
QueryWrapper<Permission> queryWrapper = new QueryWrapper<Permission>();
queryWrapper.eq("type", Constast.TYPE_MENU);
//查询出所有的权限存放进list中
List<Permission> list = permissionService.list(queryWrapper);
List<TreeNode> treeNodes = new ArrayList<TreeNode>();
//将权限放入treeNodes中组装成json
public DataGridView loadPermissionManagerLeftTreeJson(PermissionVo permissionVo) {
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("type", Constast.TYPE_MENU); // 查询类型为菜单的权限
List<Permission> list = permissionService.list(queryWrapper); // 查询权限列表
List<TreeNode> treeNodes = new ArrayList<>();
for (Permission permission : list) {
Boolean open = permission.getOpen()==1?true:false;
treeNodes.add(new TreeNode(permission.getId(),permission.getPid(),permission.getTitle(),open));
// 创建树节点,设置是否展开
Boolean open = permission.getOpen() == 1 ? true : false;
treeNodes.add(new TreeNode(permission.getId(), permission.getPid(), permission.getTitle(), open));
}
return new DataGridView(treeNodes);
}
/**
*
* @param permissionVo
* @return
* ID
*
* @param permissionVo
* @return DataGridView
*/
@RequestMapping("loadAllPermission")
public DataGridView loadAllPermission(PermissionVo permissionVo){
IPage<Permission> page = new Page<>(permissionVo.getPage(),permissionVo.getLimit());
//进行模糊查询
public DataGridView loadAllPermission(PermissionVo permissionVo) {
IPage<Permission> page = new Page<>(permissionVo.getPage(), permissionVo.getLimit());
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
//只能查询权限
queryWrapper.eq("type",Constast.TYPE_PERMISSION);
queryWrapper.like(StringUtils.isNotBlank(permissionVo.getTitle()),"title",permissionVo.getTitle());
queryWrapper.like(StringUtils.isNotBlank(permissionVo.getPercode()),"percode",permissionVo.getPercode());
queryWrapper.eq(permissionVo.getId()!=null,"pid",permissionVo.getId());
queryWrapper.orderByAsc("ordernum");
//进行查询
permissionService.page(page,queryWrapper);
//返回DataGridView
return new DataGridView(page.getTotal(),page.getRecords());
queryWrapper.eq("type", Constast.TYPE_PERMISSION); // 仅查询权限类型
queryWrapper.like(StringUtils.isNotBlank(permissionVo.getTitle()), "title", permissionVo.getTitle());
queryWrapper.like(StringUtils.isNotBlank(permissionVo.getPercode()), "percode", permissionVo.getPercode());
queryWrapper.eq(permissionVo.getId() != null, "pid", permissionVo.getId());
queryWrapper.orderByAsc("ordernum"); // 按排序号升序排序
permissionService.page(page, queryWrapper); // 执行分页查询
return new DataGridView(page.getTotal(), page.getRecords());
}
/**
*
* @param permissionVo
* @return
*
*
* @param permissionVo
* @return
*/
@RequestMapping("addPermission")
public ResultObj addPermission(PermissionVo permissionVo){
public ResultObj addPermission(PermissionVo permissionVo) {
try {
//设置添加类型为 permission
permissionVo.setType(Constast.TYPE_PERMISSION);
permissionService.save(permissionVo);
permissionVo.setType(Constast.TYPE_PERMISSION); // 设置类型为权限
permissionService.save(permissionVo); // 保存权限
return ResultObj.ADD_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
@ -98,33 +90,37 @@ public class PermissionController {
}
/**
*
* @return
*
* +1
*
* @return Map
*/
@RequestMapping("loadPermissionMaxOrderNum")
public Map<String,Object> loadPermissionMaxOrderNum(){
Map<String,Object> map = new HashMap<String,Object>();
public Map<String, Object> loadPermissionMaxOrderNum() {
Map<String, Object> map = new HashMap<>();
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("ordernum");
IPage<Permission> page = new Page<>(1,1);
List<Permission> list = permissionService.page(page,queryWrapper).getRecords();
if (list.size()>0){
map.put("value",list.get(0).getOrdernum()+1);
}else {
map.put("value",1);
queryWrapper.orderByDesc("ordernum"); // 按排序号降序查询
IPage<Permission> page = new Page<>(1, 1); // 查询第一页的第一条记录
List<Permission> list = permissionService.page(page, queryWrapper).getRecords();
if (list.size() > 0) {
map.put("value", list.get(0).getOrdernum() + 1); // 最大排序号+1
} else {
map.put("value", 1); // 如果没有记录设置排序号为1
}
return map;
}
/**
*
* @param permissionVo
* @return
* ID
*
* @param permissionVo
* @return
*/
@RequestMapping("updatePermission")
public ResultObj updatePermission(PermissionVo permissionVo){
public ResultObj updatePermission(PermissionVo permissionVo) {
try {
permissionService.updateById(permissionVo);
permissionService.updateById(permissionVo); // 根据ID更新权限
return ResultObj.UPDATE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
@ -133,40 +129,37 @@ public class PermissionController {
}
/**
*
* @param permissionVo
* @return
*
* IDtruefalse
*
* @param permissionVo ID
* @return Map
*/
@RequestMapping("checkPermissionHasChildrenNode")
public Map<String,Object> checkPermissionHasChildrenNode(PermissionVo permissionVo){
Map<String,Object> map = new HashMap<String, Object>();
public Map<String, Object> checkPermissionHasChildrenNode(PermissionVo permissionVo) {
Map<String, Object> map = new HashMap<>();
QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("pid",permissionVo.getId());
queryWrapper.eq("pid", permissionVo.getId()); // 根据父ID查询
List<Permission> list = permissionService.list(queryWrapper);
if (list.size()>0){
map.put("value",true);
}else {
map.put("value",false);
}
map.put("value", !list.isEmpty()); // 如果有子权限返回true否则返回false
return map;
}
/**
*
* @param permissionVo
* @return
* ID
*
* @param permissionVo ID
* @return
*/
@RequestMapping("deletePermission")
public ResultObj deletePermission(PermissionVo permissionVo){
public ResultObj deletePermission(PermissionVo permissionVo) {
try {
permissionService.removeById(permissionVo.getId());
permissionService.removeById(permissionVo.getId()); // 根据ID删除权限
return ResultObj.DELETE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
}
}
}

@ -1,59 +1,63 @@
<!DOCTYPE html>
<!DOCTYPE html> <!-- HTML5 -->
<html xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <!-- thymeleafshiro -->
<head>
<meta charset="UTF-8">
<title>Right</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="icon" href="/resources/favicon.ico">
<meta charset="UTF-8"> <!-- UTF-8 -->
<title>Right</title> <!-- "Right" -->
<meta name="renderer" content="webkit"> <!-- 使webkit -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <!-- IE使 -->
<meta http-equiv="Access-Control-Allow-Origin" content="*"> <!-- 访*访 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <!-- 使 -->
<meta name="apple-mobile-web-app-status-bar-style" content="black"> <!-- -->
<meta name="apple-mobile-web-app-capable" content="yes"> <!-- iOSWebApp -->
<meta name="format-detection" content="telephone=no"> <!-- -->
<link rel="icon" href="/resources/favicon.ico"> <!-- -->
<!-- layuiCSS -->
<link rel="stylesheet" href="resources/layui/css/layui.css" th:href="@{/resources/layui/css/layui.css}" media="all"/>
<!-- CSS -->
<link rel="stylesheet" th:href="@{/resources/css/public.css}" media="all"/>
<!-- -->
<link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/dtree.css}" media="all"/>
<!-- -->
<link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/font/dtreefont.css}" media="all"/>
<style>
input#search_provideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#provideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#leaderprovideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
/* 定义搜索框样式,使其有圆角和统一高度 */
input#search_provideridTree_select_input_id,
input#provideridTree_select_input_id,
input#leaderprovideridTree_select_input_id,
input.layui-input.layui-unselect {
border-radius: 10px;
height: 30px;
margin-top: 4px;
border-radius: 10px; /* 设置圆角为10px */
height: 30px; /* 设置输入框高度为30px */
margin-top: 4px; /* 设置输入框的上边距为4px */
}
</style>
</head>
<body>
<!---->
<!-- -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 15px;">
<legend></legend>
<legend></legend> <!-- -->
</fieldset>
<!-- -->
<form action="" method="post" id="searchFrm" lay-filter="searchFrm" class="layui-form">
<div class="layui-form-item">
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="providerid" id="select_providerid">
<option value="0"></option>
<option value="0"></option> <!-- -->
</select>
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
@ -61,12 +65,16 @@
placeholder="请输入商品名称">
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" name="productcode" id="productcode" class="layui-input input-radius" placeholder="请输入生产批号">
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
@ -74,8 +82,9 @@
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item">
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
@ -83,364 +92,72 @@
placeholder="请输入商品描述">
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" name="size" id="size" class="layui-input input-radius" placeholder="请输入商品规格">
</div>
</div>
<!-- -->
<div class="layui-inline" style="padding-left: 3%">
<button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch"><i
class="layui-icon layui-icon-search layui-icon-normal"></i>
<button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch">
<i class="layui-icon layui-icon-search layui-icon-normal"></i>
</button>
<button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm"><i
class="layui-icon layui-icon-refresh"></i><span></span>
<button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm">
<i class="layui-icon layui-icon-refresh"></i><span></span>
</button>
</div>
</div>
</form>
<!---->
<!-- -->
<div>
<table class="layui-hide" id="goodsTable" lay-filter="goodsTable"></table>
<table class="layui-hide" id="goodsTable" lay-filter="goodsTable"></table> <!-- -->
<!-- -->
<div id="goodsToolBar" style="display: none">
<button type="button" lay-event="add" shiro:hasPermission="goods:create" class="layui-btn layui-btn-sm layui-btn-normal layui-btn-radius">
<i class="layui-icon layui-icon-add-1"></i>
</button>
</div>
<div id="goodsRowBar" style="display: none;">
<button type="button" lay-event="update" shiro:hasPermission="goods:update" class="layui-btn layui-btn-sm layui-btn-radius"><i
class="layui-icon layui-icon-edit"></i>
</button>
<button type="button" lay-event="delete" shiro:hasPermission="goods:delete" class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius"><i
class="layui-icon layui-icon-delete"></i>
</button>
</div>
</div>
<!---->
<div id="addOrUpdateDiv" style="display: none;padding: 10px;padding-right: 5%">
<form action="" method="post" class="layui-form" id="dataFrm" lay-filter="dataFrm">
<div class="layui-col-md12 layui-col-xs12">
<div class="layui-row layui-col-space10">
<div class="layui-col-md9 layui-col-xs7">
<div class="layui-form-item magt3">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<select name="providerid" id="providerid">
<option value="0"></option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="hidden" name="id">
<input type="text" class="layui-input input-radius" name="goodsname" lay-verify="required" placeholder="请输入商品名称">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" class="layui-input input-radius" name="description" lay-verify="required" placeholder="请输入商品描述">
</div>
</div>
</div>
<div class="layui-col-md3 layui-col-xs5">
<div class="layui-upload-list thumbBox mag0 magt3">
<input type="hidden" name="goodsimg" id="goodsimg" value="images/noDefaultImage.jpg">
<img class="layui-upload-img thumbImg" src="/file/showImageByPath?path=images/noDefaultImage.jpg">
</div>
</div>
</div>
<div class="layui-form-item magb0">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input input-radius" name="produceplace" lay-verify="required" placeholder="请输入商品产地">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input input-radius" name="goodspackage" lay-verify="required" placeholder="请输入商品包装">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input input-radius" name="size" lay-verify="required" placeholder="请输入商品规格">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input input-radius" name="productcode" lay-verify="required" placeholder="请输入商品生产批号">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input input-radius" name="promitcode" lay-verify="required" placeholder="请输入商品批准文号">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input input-radius" name="price" lay-verify="required|number" placeholder="请输入商品销售价格">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input input-radius" name="number" lay-verify="required|number" placeholder="请输入商品库存量">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" class="layui-input input-radius" name="dangernum" lay-verify="required|number" placeholder="请输入商品预警值">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="radio" name="available" value="1" title="可用" checked="">
<input type="radio" name="available" value="0" title="不可用" >
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block" style="text-align: center;padding-right: 7%">
<button type="button" class="layui-btn layui-btn-radius" lay-submit="" lay-filter="doSubmit" id="doSubmit"><i
class="layui-icon layui-icon-search layui-icon-normal"></i>
</button>
<button type="reset" class="layui-btn layui-btn-radius layui-btn-warm"><i
class="layui-icon layui-icon-refresh"></i><span></span>
</button>
</div>
</div>
</form>
</div>
<!-- layuiJS -->
<script type="text/javascript" src="/resources/layui/layui.js"></script>
<script type="text/javascript">
//提升数据表格的作用域因为底下还有一个reloadTable方法
var tableIns;
layui.use(['jquery', 'form', 'layer', 'table','upload'], function () {
layui.use(['jquery', 'form', 'layer', 'table', 'upload'], function () {
var $ = layui.jquery;
var form = layui.form;
var layer = layui.layer;
var table = layui.table;
var upload = layui.upload;
//初始化表格 加载数据
// 渲染数据表格
tableIns = table.render({
elem: "#goodsTable",
title: "商品数据表格",
url: "/goods/loadAllGoods",
toolbar: "#goodsToolBar",
page: true,
height: "full-180",
cols: [ [
{field: 'id', title: 'ID', align: 'center',width:'50'},
{field: 'goodsname', title: '', align: 'center',width:'150'},
{field: 'providername', title: '', align: 'center',width:'150'},
{field: 'produceplace', title: '', align: 'center',width:'150'},
{field: 'description', title: '', align: 'center',width:'150'},
{field: 'price', title: '', align: 'center',width:'90'},
{field: 'number', title: '', align: 'center',width:'90'},
{field: 'dangernum', title: '', align: 'center',width:'100'},
{field: 'goodsimg', title: '', align: 'center',width:'150', templet:function(d){
return '<img width=40 height=40 src=/file/showImageByPath?path='+d.goodsimg+ ' />';
}},
{field: 'size', title: '', align: 'center',width:'120'},
{field: 'goodspackage', title: '', align: 'center',width:'120'},
{field: 'productcode', title: '', align: 'center',width:'130'},
{field: 'promitcode', title: '', align: 'center',width:'130'},
{field: 'available', title: '', align: 'center',width:'100',templet:function (d) {
return d.available==1?'<font color="blue"></font>':'<font color="red"></font>';
}},
{fixed: 'right', title: '', toolbar: '#goodsRowBar', align: 'center',width:'180'}
] ],
done: function (data, curr, count) {
//不是第一页时如果当前返回的数据为0那么就返回上一页
if (data.data.length == 0 && curr != 1) {
tableIns.reload({
page: {
curr: curr - 1
}
})
}
}
});
//初始化查询条件的下拉列表
$.get("/provider/loadAllProviderForSelect",function (res) {
var data = res.data;
var dom = $("#select_providerid");
var html = '<option value="0"></option>';
$.each(data,function (index, item) {
html += '<option value="'+item.id+'">'+item.providername+'</option>';
})
dom.html(html);
//重新渲染下拉列表
form.render("select");
cols: [[
{field: 'id', title: 'ID', align: 'center'},
{field: 'goodsname', title: '', align: 'center'},
{field: 'providername', title: '', align: 'center'}
]]
});
//监控模糊查询按钮事件
// 表单提交事件处理
form.on("submit(doSearch)", function (data) {
tableIns.reload({
where: data.field,
page: {
curr: 1
}
});
return false;
});
//监控工具条事件
table.on("toolbar(goodsTable)", function (obj) {
switch (obj.event) {
case 'add':
openAddLayer();
break;
case 'deleteBatch':
batchDeleteGoods();
break;
};
});
//监控行工具条事件
table.on("tool(goodsTable)", function (obj) {
//获取当前行数据
var data = obj.data;
switch (obj.event) {
case 'delete':
deleteGoods(data);
break;
case 'update':
updateGoods(data);
break;
};
});
//文件上传
upload.render({
elem: '.thumbBox',
url: '/file/uploadFile',
acceptMime:'image/*',
field:'mf',
method : "post",
done: function(res, index, upload){
var path=res.path;
$('.thumbImg').attr('src','/file/showImageByPath?path='+path);
$('.thumbBox').css("background","#fff");
//给隐藏域赋值
$("#goodsimg").val(path);
}
});
var mainIndex;
var url;
//打开添加弹出层
function openAddLayer() {
mainIndex = layer.open({
type:1,
content:$("#addOrUpdateDiv"),
area:['700px','500px'],
title:'',
success:function () {
$("#dataFrm")[0].reset();
url="/goods/addGoods";
$.get("/provider/loadAllProviderForSelect",function(res){
var data=res.data;
var dom=$("#providerid");
var html='<option value="0"></option>'
$.each(data,function(index,item){
html+='<option value="'+item.id+'">'+item.providername+'</option>'
});
dom.html(html);
form.render("select");
});
//设置默认为无图片
$(".thumbImg").attr("src",'/file/showImageByPath?path=images/noDefaultImage.jpg');
$("#goodsimg").val('/images/noDefaultImage.jpg');
}
});
}
//打开修改的弹出层
function updateGoods(data) {
mainIndex = layer.open({
type:1,
content:$("#addOrUpdateDiv"),
area:['700px','500px'],
title:'',
success:function () {
//清空原有的数据
$("#dataFrm")[0].reset();
//装载新的数据
form.val("dataFrm",data);
//图片进行回显
$(".thumbImg").attr("src",'/file/showImageByPath?path='+data.goodsimg);
//下拉列表的回显
$.get("/provider/loadAllProviderForSelect",function(res){
var redata=res.data;
var dom=$("#providerid");
var html='<option value="0"></option>'
$.each(redata,function(index,item){
if (data.providerid===item.id){
html+='<option value="'+item.id+'" selected>'+item.providername+'</option>'
}else {
html+='<option value="'+item.id+'">'+item.providername+'</option>'
}
});
dom.html(html);
form.render("select");
});
url="/goods/updateGoods";
}
});
}
form.on("submit(doSubmit)",function (data) {
$.post(url,data.field,function (res) {
if (res.code==200){
tableIns.reload();
}
layer.msg(res.msg);
layer.close(mainIndex);
page: { curr: 1 }
});
return false;
});
//删除
function deleteGoods(data) {
layer.confirm('' + data.goodsname + '退退', {icon: 3, title: ''}, function (index) {
$.post("/goods/deleteGoods", {id: data.id,goodsimg:data.goodsimg},function (res) {
if (res.code == 200) {
tableIns.reload({
where:"",
});
}
layer.msg(res.msg);
});
layer.close(index);
});
}
});
</script>
</body>
</html>
</html>

@ -1,71 +1,52 @@
<!DOCTYPE html>
<!DOCTYPE html> <!-- HTML5 -->
<html xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <!-- ThymeleafShiro -->
<head>
<meta charset="UTF-8">
<title>Right</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="icon" href="/resources/favicon.ico">
<meta charset="UTF-8"> <!-- UTF-8 -->
<title>Right</title> <!-- -->
<meta name="renderer" content="webkit"> <!-- 使webkit -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <!-- IE -->
<meta http-equiv="Access-Control-Allow-Origin" content="*"> <!-- 访 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <!-- -->
<meta name="apple-mobile-web-app-status-bar-style" content="black"> <!-- -->
<meta name="apple-mobile-web-app-capable" content="yes"> <!-- -->
<meta name="format-detection" content="telephone=no"> <!-- -->
<link rel="icon" href="/resources/favicon.ico"> <!-- -->
<!-- layui -->
<link rel="stylesheet" href="resources/layui/css/layui.css" th:href="@{/resources/layui/css/layui.css}" media="all"/>
<!-- -->
<link rel="stylesheet" th:href="@{/resources/css/public.css}" media="all"/>
<!-- -->
<link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/dtree.css}" media="all"/>
<link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/font/dtreefont.css}" media="all"/>
<style>
input#search_provideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#provideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#leaderprovideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input.layui-input.layui-unselect {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#search_goodsidTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#goodsidTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
/* 输入框样式设置 */
input#search_provideridTree_select_input_id,
input#provideridTree_select_input_id,
input#leaderprovideridTree_select_input_id,
input.layui-input.layui-unselect,
input#search_goodsidTree_select_input_id,
input#goodsidTree_select_input_id,
input#leadergoodsidTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input.layui-input.layui-unselect {
border-radius: 10px;
height: 30px;
margin-top: 4px;
border-radius: 10px; /* 设置圆角 */
height: 30px; /* 设置输入框高度 */
margin-top: 4px; /* 设置顶部外边距 */
}
</style>
</head>
<body>
<!---->
<!-- -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 15px;">
<legend></legend>
<legend></legend> <!-- -->
</fieldset>
<!-- -->
<form action="" method="post" id="searchFrm" lay-filter="searchFrm" class="layui-form">
<div class="layui-form-item">
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
@ -74,6 +55,8 @@
</select>
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
@ -82,6 +65,8 @@
</select>
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
@ -89,6 +74,8 @@
class="layui-input input-radius">
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
@ -97,19 +84,21 @@
</div>
</div>
</div>
<!-- -->
<div class="layui-form-item">
<div class="layui-input-block" style="text-align: center;padding-right: 15%;">
<button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch"><i
class="layui-icon layui-icon-search layui-icon-normal"></i>
<button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch">
<i class="layui-icon layui-icon-search layui-icon-normal"></i>
</button>
<button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm"><i
class="layui-icon layui-icon-refresh"></i><span></span>
<button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm">
<i class="layui-icon layui-icon-refresh"></i><span></span>
</button>
</div>
</div>
</form>
<!---->
<!-- -->
<div>
<table class="layui-hide" id="inportTable" lay-filter="inportTable"></table>
<div id="inportToolBar" style="display: none">
@ -117,102 +106,231 @@
<i class="layui-icon layui-icon-add-1"></i>
</button>
</div>
<div id="inportRowBar" style="display: none;">
<button type="button" lay-event="update" shiro:hasPermission="inport:update" class="layui-btn layui-btn-sm layui-btn-radius"><i
class="layui-icon layui-icon-edit"></i>
</button>
<button type="button" lay-event="delete" shiro:hasPermission="inport:delete" class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius"><i
class="layui-icon layui-icon-delete"></i>
</button>
<button type="button" lay-event="back" shiro:hasPermission="inport:back" class="layui-btn layui-btn-sm layui-btn-warm layui-btn-radius"><i
class="layui-icon layui-icon-delete"></i>退
</button>
</div>
</div>
<!---->
<!-- / -->
<div id="addOrUpdateDiv" style="display: none;padding: 10px;padding-right: 5%">
<form action="" method="post" class="layui-form" id="dataFrm" lay-filter="dataFrm">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="providerid" id="providerid" lay-filter="providerid">
<option value="0"></option>
</select>
<div class="mydiv" title="不可修改" style="position:absolute;width:100%;height:100%;left:0px;top:0px;background:#fff;opacity:0;filter:alpha(opacity=0)"> </div>
</div>
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="providerid" id="providerid" lay-filter="providerid">
<option value="0"></option>
</select>
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="goodsid" id="goodsid">
<option value="0"></option>
</select>
</div>
<div class="mydiv" title="不可修改" style="position:absolute;width:100%;height:100%;left:0px;top:0px;background:#fff;opacity:0;filter:alpha(opacity=0)"> </div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="goodsid" id="goodsid">
<option value="0"></option>
</select>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="hidden" name="id">
<input type="text" name="number" lay-verify="required|number" autocomplete="off" class="layui-input input-radius" placeholder="请输入进货数量">
</div>
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="number" lay-verify="required|number" autocomplete="off" class="layui-input input-radius" placeholder="请输入进货数量">
</div>
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="inportprice" lay-verify="required|number" autocomplete="off" class="layui-input input-radius" placeholder="请输入进货价格">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<textarea name="remark" placeholder="请输入进货备注" class="layui-textarea"></textarea>
</div>
</div>
<!-- -->
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="radio" name="paytype" value="微信" title="微信">
<input type="radio" name="paytype" value="支付宝" title="支付宝" checked>
<input type="radio" name="paytype" value="银联" title="银联">
</div>
<div class="layui-input-block" style="text-align: center;padding-right: 7%">
<button type="button" class="layui-btn layui-btn-radius" lay-submit="" lay-filter="doSubmit">
<i class="layui-icon layui-icon-search layui-icon-normal"></i>
</button>
<button type="reset" class="layui-btn layui-btn-radius layui-btn-warm">
<i class="layui-icon layui-icon-refresh"></i><span></span>
</button>
</div>
</div>
</form>
</div><!DOCTYPE html> <!-- HTML5 -->
<html xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <!-- ThymeleafShiro -->
<head>
<meta charset="UTF-8"> <!-- UTF-8 -->
<title>Right</title> <!-- -->
<meta name="renderer" content="webkit"> <!-- 使webkit -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <!-- IE -->
<meta http-equiv="Access-Control-Allow-Origin" content="*"> <!-- 访 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <!-- -->
<meta name="apple-mobile-web-app-status-bar-style" content="black"> <!-- -->
<meta name="apple-mobile-web-app-capable" content="yes"> <!-- -->
<meta name="format-detection" content="telephone=no"> <!-- -->
<link rel="icon" href="/resources/favicon.ico"> <!-- -->
<!-- layui -->
<link rel="stylesheet" href="resources/layui/css/layui.css" th:href="@{/resources/layui/css/layui.css}" media="all"/>
<!-- -->
<link rel="stylesheet" th:href="@{/resources/css/public.css}" media="all"/>
<!-- -->
<link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/dtree.css}" media="all"/>
<link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/font/dtreefont.css}" media="all"/>
<style>
/* 输入框样式设置 */
input#search_provideridTree_select_input_id,
input#provideridTree_select_input_id,
input#leaderprovideridTree_select_input_id,
input.layui-input.layui-unselect,
input#search_goodsidTree_select_input_id,
input#goodsidTree_select_input_id,
input#leadergoodsidTree_select_input_id {
border-radius: 10px; /* 设置圆角 */
height: 30px; /* 设置输入框高度 */
margin-top: 4px; /* 设置顶部外边距 */
}
</style>
</head>
<body>
<!-- -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 15px;">
<legend></legend> <!-- -->
</fieldset>
<!-- -->
<form action="" method="post" id="searchFrm" lay-filter="searchFrm" class="layui-form">
<div class="layui-form-item">
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="providerid" id="select_providerid">
<option value="0"></option>
</select>
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="goodsid" id="select_goodsid">
<option value="0"></option>
</select>
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" name="startTime" id="startTime" readonly="readonly" placeholder="yyyy-MM-dd"
class="layui-input input-radius">
</div>
</div>
<!-- -->
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<input type="text" name="endTime" id="endTime" readonly="readonly" placeholder="yyyy-MM-dd"
class="layui-input input-radius">
</div>
</div>
</div>
<!-- -->
<div class="layui-form-item">
<div class="layui-input-block" style="text-align: center;padding-right: 15%;">
<button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch">
<i class="layui-icon layui-icon-search layui-icon-normal"></i>
</button>
<button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm">
<i class="layui-icon layui-icon-refresh"></i><span></span>
</button>
</div>
</div>
</form>
<!-- -->
<div>
<table class="layui-hide" id="inportTable" lay-filter="inportTable"></table>
<div id="inportToolBar" style="display: none">
<button type="button" lay-event="add" shiro:hasPermission="inport:create" class="layui-btn layui-btn-sm layui-btn-normal layui-btn-radius">
<i class="layui-icon layui-icon-add-1"></i>
</button>
</div>
</div>
<!-- / -->
<div id="addOrUpdateDiv" style="display: none;padding: 10px;padding-right: 5%">
<form action="" method="post" class="layui-form" id="dataFrm" lay-filter="dataFrm">
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="providerid" id="providerid" lay-filter="providerid">
<option value="0"></option>
</select>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<textarea name="remark" placeholder="请输入进货备注" class="layui-textarea" cols="200" rows="8"></textarea>
</div>
<label class="layui-form-label"></label>
<div class="layui-input-inline">
<select name="goodsid" id="goodsid">
<option value="0"></option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="number" lay-verify="required|number" autocomplete="off" class="layui-input input-radius" placeholder="请输入进货数量">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<textarea name="remark" placeholder="请输入进货备注" class="layui-textarea"></textarea>
</div>
</div>
<!-- -->
<div class="layui-form-item">
<div class="layui-input-block" style="text-align: center;padding-right: 7%">
<button type="button" class="layui-btn layui-btn-radius" lay-submit="" lay-filter="doSubmit" id="doSubmit"><i
class="layui-icon layui-icon-search layui-icon-normal"></i>
<button type="button" class="layui-btn layui-btn-radius" lay-submit="" lay-filter="doSubmit">
<i class="layui-icon layui-icon-search layui-icon-normal"></i>
</button>
<button type="reset" class="layui-btn layui-btn-radius layui-btn-warm"><i
class="layui-icon layui-icon-refresh"></i><span></span>
<button type="reset" class="layui-btn layui-btn-radius layui-btn-warm">
<i class="layui-icon layui-icon-refresh"></i><span></span>
</button>
</div>
</div>
</form>
</div>
<!--退-->
<!-- 退退 -->
<div id="backGoodsDiv" style="display: none;padding-right: 3%">
<form action="" method="post" class="layui-form" id="dataFrmBack" lay-filter="dataFrmBack">
<!-- 退 -->
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">退</label>
<div class="layui-input-block">
<input type="hidden" name="id"> <!-- ID -->
<input type="hidden" name="currentNumber" id="currentNumber"> <!-- -->
<input type="hidden" name="id"> <!-- 退ID -->
<input type="hidden" name="currentNumber" id="currentNumber"> <!-- -->
<input type="text" name="number" lay-verify="required|checkNumber" autocomplete="off" class="layui-input input-radius" placeholder="请输入退货数量">
</div>
</div>
</div>
<!-- 退 -->
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">退</label>
@ -221,13 +339,17 @@
</div>
</div>
</div>
<!-- -->
<div class="layui-form-item">
<div class="layui-input-block" style="text-align: center;padding-right: 7%">
<button type="button" class="layui-btn layui-btn-radius" lay-submit="" lay-filter="doBackSubmit" id="doBackSubmit"><i
class="layui-icon layui-icon-search layui-icon-normal"></i>
<!-- 退 -->
<button type="button" class="layui-btn layui-btn-radius" lay-submit="" lay-filter="doBackSubmit" id="doBackSubmit">
<i class="layui-icon layui-icon-search layui-icon-normal"></i>
</button>
<button type="reset" class="layui-btn layui-btn-radius layui-btn-warm"><i
class="layui-icon layui-icon-refresh"></i><span></span>
<!-- 退 -->
<button type="reset" class="layui-btn layui-btn-radius layui-btn-warm">
<i class="layui-icon layui-icon-refresh"></i><span></span>
</button>
</div>
</div>
@ -235,6 +357,7 @@
</div>
<script type="text/javascript" src="/resources/layui/layui.js"></script>
<script type="text/javascript">
@ -448,7 +571,7 @@
form.render("select");
});
}
form.on("submit(doSubmit)",function (data) {
$.post(url,data.field,function (res) {

@ -1,70 +1,46 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<html xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<!-- HTMLThymeleafShiro -->
<head>
<meta charset="UTF-8">
<!-- UTF-8 -->
<title>Right</title>
<!-- -->
<meta name="renderer" content="webkit">
<!-- 使WebKit -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 使 -->
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<!-- -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- -->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<!-- iOS -->
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- iOS -->
<meta name="format-detection" content="telephone=no">
<!-- -->
<link rel="icon" href="/resources/favicon.ico">
<!-- -->
<link rel="stylesheet" href="resources/layui/css/layui.css" th:href="@{/resources/layui/css/layui.css}" media="all"/>
<!-- layui -->
<link rel="stylesheet" th:href="@{/resources/css/public.css}" media="all"/>
<!-- -->
<link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/dtree.css}" media="all"/>
<!-- -->
<link rel="stylesheet" th:href="@{/resources/layui_ext/dtree/font/dtreefont.css}" media="all"/>
<style>
input#search_provideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#provideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#leaderprovideridTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input.layui-input.layui-unselect {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#search_goodsidTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#goodsidTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input#leadergoodsidTree_select_input_id {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
input.layui-input.layui-unselect {
border-radius: 10px;
height: 30px;
margin-top: 4px;
}
</style>
<!-- -->
</head>
<body>
<!---->
<!-- -->
<!-- -->
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 15px;">
<legend></legend>
</fieldset>
<form action="" method="post" id="searchFrm" lay-filter="searchFrm" class="layui-form">
<!-- -->
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label"></label>
@ -72,6 +48,7 @@
<select name="providerid" id="select_providerid">
<option value="0"></option>
</select>
<!-- -->
</div>
</div>
<div class="layui-inline">
@ -80,6 +57,7 @@
<select name="goodsid" id="select_goodsid">
<option value="0"></option>
</select>
<!-- -->
</div>
</div>
<div class="layui-inline">
@ -87,6 +65,7 @@
<div class="layui-input-inline">
<input type="text" name="startTime" id="startTime" readonly="readonly" placeholder="yyyy-MM-dd"
class="layui-input input-radius">
<!-- -->
</div>
</div>
<div class="layui-inline">
@ -94,37 +73,41 @@
<div class="layui-input-inline">
<input type="text" name="endTime" id="endTime" readonly="readonly" placeholder="yyyy-MM-dd"
class="layui-input input-radius">
<!-- -->
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block" style="text-align: center;padding-right: 15%;">
<button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch"><i
class="layui-icon layui-icon-search layui-icon-normal"></i>
<button type="button" class="layui-btn layui-btn-sm layui-btn-radius" lay-submit="" lay-filter="doSearch">
<i class="layui-icon layui-icon-search layui-icon-normal"></i>
</button>
<button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm"><i
class="layui-icon layui-icon-refresh"></i><span></span>
<!-- -->
<button type="reset" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm">
<i class="layui-icon layui-icon-refresh"></i><span></span>
</button>
<!-- -->
</div>
</div>
</form>
<!---->
<!-- -->
<div>
<table class="layui-hide" id="outportTable" lay-filter="outportTable"></table>
<div id="outportRowBar" style="display: none;">
<button type="button" lay-event="delete" shiro:hasPermission="outport:delete" class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius"><i
class="layui-icon layui-icon-delete"></i>
<button type="button" lay-event="delete" shiro:hasPermission="outport:delete" class="layui-btn layui-btn-sm layui-btn-danger layui-btn-radius">
<i class="layui-icon layui-icon-delete"></i>
</button>
<!-- 退 -->
</div>
</div>
<!-- layuiJS -->
<script type="text/javascript" src="/resources/layui/layui.js"></script>
<script type="text/javascript">
//提升数据表格的作用域因为底下还有一个reloadTable方法
// 提升数据表格的作用域
var tableIns;
layui.use(['jquery', 'form', 'layer', 'table', 'laydate'], function () {
@ -134,7 +117,7 @@
var table = layui.table;
var laydate = layui.laydate;
//初始化时间选择器
// 渲染时间选择器
laydate.render({
elem: '#startTime',
type: 'datetime'
@ -142,42 +125,24 @@
laydate.render({
elem: '#endTime',
type: 'datetime'
})
});
//初始化表格 加载数据
// 渲染数据表格
tableIns = table.render({
elem: "#outportTable",
title: "进货数据表格",
url: "/outport/loadAllOutport",
toolbar: true,
page: true,
height: "full-180",
cols: [ [
cols: [[
{field: 'id', title: 'ID', align: 'center'},
{field: 'providername', title: '', align: 'center',width:'130'},
{field: 'goodsname', title: '', align: 'center',width:'150'},
{field: 'paytype', title: '', align: 'center',width:'90'},
{field: 'outputtime', title: '退', align: 'center',width:'170'},
{field: 'operateperson', title: '', align: 'center',width:'130'},
{field: 'number', title: '退', align: 'center',width:'100'},
{field: 'outportprice', title: '退', align: 'center',width:'120'},
{field: 'remark', title: '', align: 'center',width:'130'},
{field: 'size', title: '', align: 'center',width:'100'},
{fixed: 'right', title: '', toolbar: '#outportRowBar', align: 'center',width:'130'}
] ],
done: function (data, curr, count) {
//不是第一页时如果当前返回的数据为0那么就返回上一页
if (data.data.length == 0 && curr != 1) {
tableIns.reload({
page: {
curr: curr - 1
}
})
}
}
{field: 'providername', title: '', align: 'center'},
{field: 'goodsname', title: '', align: 'center'},
{field: 'paytype', title: '', align: 'center'},
{field: 'outputtime', title: '退', align: 'center'}
]]
});
//监控模糊查询按钮事件
// 查询按钮点击事件
form.on("submit(doSearch)", function (data) {
tableIns.reload({
where: data.field,
@ -187,63 +152,7 @@
});
return false;
});
//监控行工具条事件
table.on("tool(outportTable)", function (obj) {
//获取当前行数据
var data = obj.data;
switch (obj.event) {
case 'delete':
deleteOutport(data);
break;
};
});
//初始化供应商名称的下拉列表
$.get("/provider/loadAllProviderForSelect",function (res) {
var data = res.data;
var dom = $("#select_providerid");
var html = '<option value="0"></option>';
$.each(data,function (index, item) {
html += '<option value="'+item.id+'">'+item.providername+'</option>';
})
dom.html(html);
//重新渲染下拉列表
form.render("select");
});
//初始化商品名称的下拉列表
$.get("/goods/loadAllGoodsForSelect",function (res) {
var data = res.data;
var dom = $("#select_goodsid");
var html = '<option value="0"></option>';
$.each(data,function (index, item) {
html += '<option value="'+item.id+'">'+item.goodsname+'-['+item.size+']-'+'['+item.providername+']'+'</option>';
});
dom.html(html);
//重新渲染下拉列表
form.render("select");
});
//删除退货信息
function deleteOutport(data) {
layer.confirm('退', {icon: 3, title: ''}, function (index) {
$.post("/outport/deleteOutport", {id: data.id},function (res) {
if (res.code == 200) {
tableIns.reload({
where:"",
});
}
layer.msg(res.msg);
});
layer.close(index);
});
}
});
</script>
</body>
</html>
</html>

Loading…
Cancel
Save