Repository: oooooomy/logistics
Branch: master
Commit: 6c1a42ce7ca6
Files: 131
Total size: 161.2 KB
Directory structure:
gitextract_5fj3_9c0/
├── .gitignore
├── README.md
├── api/
│ ├── .gitignore
│ ├── README.md
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── api/
│ │ ├── ApiApplication.java
│ │ ├── annotation/
│ │ │ └── DisableBaseResponse.java
│ │ ├── controller/
│ │ │ ├── AdminController.java
│ │ │ ├── CommodityController.java
│ │ │ ├── DistributionController.java
│ │ │ ├── DriverController.java
│ │ │ ├── EmailController.java
│ │ │ ├── EmployeeController.java
│ │ │ ├── InventoryController.java
│ │ │ ├── RoleController.java
│ │ │ ├── SaleController.java
│ │ │ ├── UserController.java
│ │ │ ├── VehicleController.java
│ │ │ └── WarehouseController.java
│ │ ├── handler/
│ │ │ ├── GlobalExceptionHandler.java
│ │ │ └── GlobalResponseHandler.java
│ │ ├── model/
│ │ │ ├── dto/
│ │ │ │ └── LoginDto.java
│ │ │ ├── entity/
│ │ │ │ ├── Admin.java
│ │ │ │ ├── Code.java
│ │ │ │ ├── Commodity.java
│ │ │ │ ├── Company.java
│ │ │ │ ├── Distribution.java
│ │ │ │ ├── Driver.java
│ │ │ │ ├── Employee.java
│ │ │ │ ├── Inventory.java
│ │ │ │ ├── InventoryRecord.java
│ │ │ │ ├── Sale.java
│ │ │ │ ├── User.java
│ │ │ │ ├── Vehicle.java
│ │ │ │ └── Warehouse.java
│ │ │ ├── enums/
│ │ │ │ ├── DistributionStatus.java
│ │ │ │ └── Role.java
│ │ │ ├── support/
│ │ │ │ └── ResponseResult.java
│ │ │ └── vo/
│ │ │ └── CommodityChartVo.java
│ │ ├── repository/
│ │ │ ├── AdminRepository.java
│ │ │ ├── CodeRepository.java
│ │ │ ├── CommodityRepository.java
│ │ │ ├── DistributionRepository.java
│ │ │ ├── DriverRepository.java
│ │ │ ├── EmployeeRepository.java
│ │ │ ├── InventoryRecordRepository.java
│ │ │ ├── InventoryRepository.java
│ │ │ ├── SaleRepository.java
│ │ │ ├── UserRepository.java
│ │ │ ├── VehicleRepository.java
│ │ │ └── WareHouseRepository.java
│ │ ├── security/
│ │ │ ├── JwtAuthorizationFilter.java
│ │ │ └── SecurityConfiguration.java
│ │ ├── service/
│ │ │ ├── AdminService.java
│ │ │ ├── CommodityService.java
│ │ │ ├── DistributionService.java
│ │ │ ├── DriverService.java
│ │ │ ├── EmailService.java
│ │ │ ├── EmployeeService.java
│ │ │ ├── InventoryRecordService.java
│ │ │ ├── InventoryService.java
│ │ │ ├── SaleService.java
│ │ │ ├── UserService.java
│ │ │ ├── VehicleService.java
│ │ │ ├── WarehouseService.java
│ │ │ └── impl/
│ │ │ ├── AdminServiceImpl.java
│ │ │ ├── CommodityServiceImpl.java
│ │ │ ├── DistributionServiceImpl.java
│ │ │ ├── DriverServiceImpl.java
│ │ │ ├── EmailServiceImpl.java
│ │ │ ├── EmployeeServiceImpl.java
│ │ │ ├── InventoryRecordServiceImpl.java
│ │ │ ├── InventoryServiceImpl.java
│ │ │ ├── SaleServiceImpl.java
│ │ │ ├── UserServiceImpl.java
│ │ │ ├── VehicleServiceImpl.java
│ │ │ └── WarehouseServiceImpl.java
│ │ └── utils/
│ │ ├── DataTimeUtil.java
│ │ ├── JwtTokenUtil.java
│ │ ├── RandomUtil.java
│ │ └── ResponseUtil.java
│ └── resources/
│ └── application.yaml
└── web-app/
├── .gitignore
├── README.md
├── package.json
├── public/
│ └── index.html
└── src/
├── App.vue
├── api/
│ ├── admin.js
│ ├── commodity.js
│ ├── distribution.js
│ ├── driver.js
│ ├── employee.js
│ ├── inventory.js
│ ├── role.js
│ ├── sale.js
│ ├── vehicle.js
│ └── warehouse.js
├── components/
│ └── InventoryRecords.vue
├── layout/
│ ├── Aside.vue
│ ├── Footer.vue
│ ├── Header.vue
│ ├── Index.vue
│ └── Main.vue
├── main.js
├── router/
│ ├── index.js
│ └── routes.js
├── store/
│ ├── index.js
│ └── modules/
│ └── user.js
├── utils/
│ └── request.js
└── views/
├── Init.vue
├── Login.vue
├── Test.vue
├── analyze/
│ ├── In.vue
│ └── Out.vue
├── basics/
│ ├── Commodity.vue
│ ├── Company.vue
│ ├── Details.vue
│ ├── Employee.vue
│ └── Warehouse.vue
├── delivery/
│ ├── Create.vue
│ └── List.vue
├── error/
│ ├── 403.vue
│ ├── 404.vue
│ └── 500.vue
├── sale/
│ ├── Create.vue
│ └── Record.vue
├── system/
│ ├── Admin.vue
│ ├── Role.vue
│ └── Security.vue
└── transport/
├── Driver.vue
└── Vehicle.vue
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
.DS_Store
*.DS_Store
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
================================================
FILE: README.md
================================================
## SpringBoot + Vue 的物流管理系统
#### 主要框架
- SpringBoot
- SpringData
- SpringSecurity
- Vue2
================================================
FILE: api/.gitignore
================================================
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
.DS_Store
*.DS_Store
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
================================================
FILE: api/README.md
================================================
## SpringBoot + Vue 的物流管理系统
#### 主要框架
- SpringBoot
- SpringData
- SpringSecurity
- Vue2
================================================
FILE: api/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
</parent>
<properties>
<java.version>11</java.version>
<jwt.version>0.9.1</jwt.version>
<mybatis-plus.version>3.4.2</mybatis-plus.version>
<fastjson.version>1.2.73</fastjson.version>
<mybatis-enhance-actable.version>1.4.7.RELEASE</mybatis-enhance-actable.version>
</properties>
<dependencies>
<!--SpringBoot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringData依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--SpringSecurity依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--Email邮箱发送依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--jwt依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--json工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--jdk9以上缺失的jar包-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<!--更换阿里云maven镜像-->
<repositories>
<repository>
<id>maven-ali</id>
<url>http://maven.aliyun.com/nexus/content/groups/public//</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
</project>
================================================
FILE: api/src/main/java/com/example/api/ApiApplication.java
================================================
package com.example.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}
================================================
FILE: api/src/main/java/com/example/api/annotation/DisableBaseResponse.java
================================================
package com.example.api.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 加上注解后不统一封装返回
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DisableBaseResponse {
}
================================================
FILE: api/src/main/java/com/example/api/controller/AdminController.java
================================================
package com.example.api.controller;
import com.example.api.model.dto.LoginDto;
import com.example.api.model.entity.Admin;
import com.example.api.model.enums.Role;
import com.example.api.repository.AdminRepository;
import com.example.api.service.AdminService;
import com.example.api.utils.JwtTokenUtil;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/admin")
public class AdminController {
@Resource
private AdminService adminService;
@Resource
private AdminRepository adminRepository;
@GetMapping("hasInit")
public boolean hasInit() {
return adminRepository.existsAdminByRoles(Role.ROLE_SUPER_ADMIN.getValue());
}
@PostMapping("/init")
public Admin init(@RequestBody Admin admin) throws Exception {
if (adminRepository.existsAdminByRoles(Role.ROLE_SUPER_ADMIN.getValue())) throw new Exception("初始化请求错误");
admin.setRoles(Role.ROLE_SUPER_ADMIN.getValue());
return adminService.save(admin);
}
@GetMapping("")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_ADMIN')")
public List<Admin> findAll() {
return adminService.findAll();
}
@DeleteMapping("")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_ADMIN')")
public void delete(String id) {
adminService.delete(id);
}
@PostMapping("")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_ADMIN')")
public Admin save(@RequestBody Admin admin) throws Exception {
return adminService.save(admin);
}
@PostMapping("/login")
public Map<String, Object> loginByEmail(String type, @RequestBody LoginDto dto) throws Exception {
Map<String, Object> map = new HashMap<>();
Admin admin = type.equals("email") ? adminService.loginByEmail(dto) : adminService.loginByPassword(dto);
String token = adminService.createToken(admin,
dto.isRemember() ? JwtTokenUtil.REMEMBER_EXPIRATION_TIME : JwtTokenUtil.EXPIRATION_TIME);
map.put("admin", admin);
map.put("token", token);
return map;
}
@GetMapping("/sendEmail")
public void sendEmail(String email) throws Exception {
adminService.sendEmail(email);
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/CommodityController.java
================================================
package com.example.api.controller;
import com.example.api.model.entity.Commodity;
import com.example.api.service.CommodityService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/api/commodity")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_COMMODITY')")
public class CommodityController {
@Resource
private CommodityService commodityService;
@PostMapping("")
public Commodity save(@RequestBody Commodity commodity) {
return commodityService.save(commodity);
}
@DeleteMapping("")
public void delete(String id) {
commodityService.delete(id);
}
@PutMapping("")
public void update(@RequestBody Commodity commodity) {
commodityService.update(commodity);
}
@GetMapping("")
public List<Commodity> findAll() {
return commodityService.findAll();
}
@GetMapping("/search/{name}")
public List<Commodity> findByLikeName(@PathVariable String name) {
return commodityService.findAllByLikeName(name);
}
@GetMapping("/{id}")
public Commodity findById(@PathVariable String id) {
return commodityService.findById(id);
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/DistributionController.java
================================================
package com.example.api.controller;
import com.example.api.model.entity.Distribution;
import com.example.api.repository.DriverRepository;
import com.example.api.repository.VehicleRepository;
import com.example.api.service.DistributionService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/distribution")
public class DistributionController {
@Resource
private DistributionService distributionService;
@Resource
private DriverRepository driverRepository;
@Resource
private VehicleRepository vehicleRepository;
@PostMapping("")
public Distribution save(@RequestBody Distribution distribution) throws Exception {
return distributionService.save(distribution);
}
@GetMapping("")
public List<Distribution> findAll() {
return distributionService.findAll();
}
@GetMapping("can")
public Map<String, Object> can() {
Map<String, Object> map = new HashMap<>();
map.put("drivers", driverRepository.findAll());
map.put("vehicles", vehicleRepository.findAll());
return map;
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/DriverController.java
================================================
package com.example.api.controller;
import com.example.api.model.entity.Driver;
import com.example.api.service.DriverService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/api/driver")
public class DriverController {
@Resource
private DriverService driverService;
@PostMapping("")
public Driver save(@RequestBody Driver driver) {
return driverService.save(driver);
}
@GetMapping("")
public List<Driver> findAll() {
return driverService.findAll();
}
@GetMapping("/{id}")
public Driver findById(@PathVariable String id) {
return driverService.findById(id);
}
@DeleteMapping("")
public void delete(String id) {
driverService.delete(id);
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/EmailController.java
================================================
package com.example.api.controller;
import com.example.api.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/api/email")
public class EmailController {
@Resource
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
@GetMapping("/send")
public String send() {
SimpleMailMessage message = new SimpleMailMessage();
//发件人
message.setFrom(from);
//收件人
message.setTo("1729677089@qq.com");
message.setSubject("验证码");
message.setText("你的验证码为: " + RandomUtil.next() + " 十五分钟内有效");
try {
mailSender.send(message);
return "发送普通邮件成功";
} catch (MailException e) {
e.printStackTrace();
return "邮件方失败";
}
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/EmployeeController.java
================================================
package com.example.api.controller;
import com.example.api.model.entity.Employee;
import com.example.api.service.EmployeeService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/api/employee")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_EMPLOYEE')")
public class EmployeeController {
@Resource
private EmployeeService employeeService;
@GetMapping("")
public List<Employee> findAll() {
return employeeService.findAll();
}
@GetMapping("/{id}")
public Employee findById(@PathVariable String id) {
return employeeService.findById(id);
}
@PostMapping("")
public Employee save(@RequestBody Employee employee) {
return employeeService.save(employee);
}
@PutMapping("")
public void update(@RequestBody Employee employee) {
employeeService.update(employee);
}
@DeleteMapping("")
public void delete(String id) {
employeeService.delete(id);
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/InventoryController.java
================================================
package com.example.api.controller;
import com.example.api.model.entity.Inventory;
import com.example.api.model.entity.InventoryRecord;
import com.example.api.model.vo.CommodityChartVo;
import com.example.api.service.InventoryRecordService;
import com.example.api.service.InventoryService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/api/inventory")
public class InventoryController {
@Resource
private InventoryService inventoryService;
@Resource
private InventoryRecordService recordService;
@GetMapping("")
public List<Inventory> findAll() {
return inventoryService.findAll();
}
@GetMapping("analyze")
public List<CommodityChartVo> analyze(Integer type) {
return recordService.analyzeCommodity(type);
}
//指定仓库id
//查询某个仓库的库存情况
@GetMapping("/warehouse/{id}")
public List<Inventory> findByWarehouse(@PathVariable String id) {
return inventoryService.findByWarehouseId(id);
}
//指定商品id
//查询某个商品在所有仓库的库存
@GetMapping("/commodity/{id}")
public List<Inventory> findByCommodity(@PathVariable String id) {
return inventoryService.findByCommodityId(id);
}
//指定仓库id
//查询某个仓库库内商品的出库入库记录
@GetMapping("/record/warehouse/{id}")
public List<InventoryRecord> findRecordByWarehouse(@PathVariable String id) {
return recordService.findAllByWarehouseId(id);
}
//指定商品id
//查询某个商品在所有仓库出库入库记录
@GetMapping("/record/commodity/{id}")
public List<InventoryRecord> findRecordByCommodity(@PathVariable String id) {
return recordService.findAllByCommodityId(id);
}
@PostMapping("/in")
public InventoryRecord in(@RequestBody InventoryRecord record) throws Exception {
return recordService.in(record);
}
@PostMapping("/out")
public InventoryRecord out(@RequestBody InventoryRecord record) throws Exception {
return recordService.out(record);
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/RoleController.java
================================================
package com.example.api.controller;
import com.example.api.model.enums.Role;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/role")
public class RoleController {
@GetMapping("")
public Role[] list() {
return Role.ROLES;
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/SaleController.java
================================================
package com.example.api.controller;
import com.example.api.model.entity.Sale;
import com.example.api.service.SaleService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/api/sale")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_SALE')")
public class SaleController {
@Resource
private SaleService saleService;
@PostMapping("")
public Sale save(@RequestBody Sale sale) {
return saleService.save(sale);
}
@GetMapping("")
public List<Sale> findAll() {
return saleService.findAll();
}
@GetMapping("/search/{name}")
public List<Sale> search(@PathVariable String name) {
return saleService.searchByCompany(name);
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/UserController.java
================================================
package com.example.api.controller;
import com.example.api.model.entity.User;
import com.example.api.repository.UserRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/api/user")
public class UserController {
@Resource
private UserRepository userRepository;
}
================================================
FILE: api/src/main/java/com/example/api/controller/VehicleController.java
================================================
package com.example.api.controller;
import com.example.api.annotation.DisableBaseResponse;
import com.example.api.model.entity.Vehicle;
import com.example.api.service.VehicleService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/api/vehicle")
public class VehicleController {
@Resource
private VehicleService vehicleService;
@PostMapping("")
public Vehicle save(@RequestBody Vehicle vehicle) {
return vehicleService.save(vehicle);
}
@GetMapping("")
public List<Vehicle> findAll() {
return vehicleService.findAll();
}
@GetMapping("/{id}")
public Vehicle findById(@PathVariable String id) {
return vehicleService.findById(id);
}
@DeleteMapping("")
public void delete(String id) {
vehicleService.delete(id);
}
}
================================================
FILE: api/src/main/java/com/example/api/controller/WarehouseController.java
================================================
package com.example.api.controller;
import com.example.api.model.entity.Warehouse;
import com.example.api.service.WarehouseService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/api/warehouse")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_WAREHOUSE')")
public class WarehouseController {
@Resource
private WarehouseService warehouseService;
@PostMapping("")
public Warehouse save(@RequestBody Warehouse warehouse) {
return warehouseService.save(warehouse);
}
@GetMapping("")
public List<Warehouse> findAll() {
return warehouseService.findAll();
}
@DeleteMapping("")
public void delete(String id) {
warehouseService.delete(id);
}
}
================================================
FILE: api/src/main/java/com/example/api/handler/GlobalExceptionHandler.java
================================================
package com.example.api.handler;
import com.example.api.model.support.ResponseResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 捕获controller异常
* controller抛出异常执行下边的函数
* 返回Response写入ApiResult
*/
@ResponseBody
@RestControllerAdvice
public class GlobalExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(getClass());
@ExceptionHandler(value = Exception.class)
public Object handleException(Exception e) {
if (e.getClass().equals(AccessDeniedException.class)) {
return new ResponseResult<>(403, "你没有访问权限");
}
logger.warn(e.getMessage());
return new ResponseResult<>(400, e.getMessage());
}
}
================================================
FILE: api/src/main/java/com/example/api/handler/GlobalResponseHandler.java
================================================
package com.example.api.handler;
import com.example.api.annotation.DisableBaseResponse;
import com.example.api.model.support.ResponseResult;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* 统一拦截Controller中所有方法的返回值
* 封装后返回ResponseResult<T>
*/
@ControllerAdvice(value = "com.example.api.controller")
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class c) {
return !methodParameter.hasParameterAnnotation(DisableBaseResponse.class);
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass,
ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
return o == null ? new ResponseResult<>() : new ResponseResult<>(o);
}
}
================================================
FILE: api/src/main/java/com/example/api/model/dto/LoginDto.java
================================================
package com.example.api.model.dto;
import lombok.Data;
/**
* 登录传输数据
*/
@Data
public class LoginDto {
private String email;
private String password;
private String code;
private boolean remember;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Admin.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 管理员
*/
@Data
@Entity
@NoArgsConstructor
public class Admin {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
private String email;
private String password;
private String roles;
private String createAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Code.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 验证码
*/
@Data
@Entity
@NoArgsConstructor
public class Code {
@Id
private String email;
private String value;
private long exp;
public Code(String email, String value) {
this.email = email;
this.value = value;
this.exp = System.currentTimeMillis() + 1000 * 60 * 15;
}
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Commodity.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 商品
*/
@Data
@Entity
@NoArgsConstructor
public class Commodity {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
private String name;
private double price;
private String description;
private int count;
private String createAt;
private String updateAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Company.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 往来公司
*/
@Data
@Entity
@NoArgsConstructor
public class Company {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Distribution.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 配送
*/
@Data
@Entity
@NoArgsConstructor
public class Distribution {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
//司机id
private String did;
//车辆id
private String vid;
//司机
private String driver;
//车牌号
private String number;
//客户电话
private String phone;
//客户地址
private String address;
//加急处理
private boolean urgent;
private String care;
private String time;
private Integer status;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Driver.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 驾驶员
*/
@Data
@Entity
@NoArgsConstructor
public class Driver {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
private String name;
private String gender;
private String phone;
//家庭住址
private String address;
//身份证号码
private String idCard;
//驾驶证
private String license;
//驾驶证分数 12分
private String score;
//正在驾驶
private boolean driving;
private String createAt;
private String updateAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Employee.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 员工
*/
@Data
@Entity
@NoArgsConstructor
public class Employee {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
private String name;
private String gender;
private String phone;
//家庭住址
private String address;
//身份证号码
private String idCard;
//部门
private String department;
private String createAt;
private String updateAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Inventory.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 库存
*/
@Data
@Entity
@NoArgsConstructor
public class Inventory {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
//仓库id
private String wid;
//商品信息id
private String cid;
//商品名
private String name;
//所在位置区域
private String location;
//数量
private Integer count;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/InventoryRecord.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 库存记录 出库 入库
*/
@Data
@Entity
@NoArgsConstructor
public class InventoryRecord {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
//商品名
private String name;
//仓库id
private String wid;
//商品信息id
private String cid;
private Integer count;
//-1:出库 +1:入库
private Integer type;
//描述信息
private String description;
private String createAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Sale.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 销售
*/
@Data
@Entity
@NoArgsConstructor
public class Sale {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
private String company;
private String number;
private String commodity;
private String count;
private double price;
private String phone;
private String description;
private boolean pay;
private String createAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/User.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 用户
*/
@Data
@Entity
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
private String username;
private String password;
private String createAt;
private String updateAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Vehicle.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 车辆
*/
@Data
@Entity
@NoArgsConstructor
public class Vehicle {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
//车牌号
private String number;
//车辆类型
private String type;
//是否正在运输
private boolean driving;
private String createAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/entity/Warehouse.java
================================================
package com.example.api.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
/**
* 仓库
*/
@Data
@Entity
@NoArgsConstructor
public class Warehouse {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
//仓库名称
private String name;
//仓库负责人
private String principle;
private String createAt;
}
================================================
FILE: api/src/main/java/com/example/api/model/enums/DistributionStatus.java
================================================
package com.example.api.model.enums;
import lombok.Getter;
import lombok.Setter;
/**
* 配送单状态
*/
public enum DistributionStatus {
//正在审核
REVIEWING(0),
//审核成功
REVIEW_SUCCESS(1),
//订单完成
END(2);
@Getter
@Setter
private Integer code;
DistributionStatus(Integer code) {
this.code = code;
}
}
================================================
FILE: api/src/main/java/com/example/api/model/enums/Role.java
================================================
package com.example.api.model.enums;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
@Getter
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Role {
//超级管理员 不对外提供添加此权限的方法
ROLE_SUPER_ADMIN("ROLE_SUPER_ADMIN", "超级管理员"),
ROLE_ADMIN("ROLE_ADMIN", "操作员相关权限"),
ROLE_COMMODITY("ROLE_COMMODITY", "商品相关权限"),
ROLE_EMPLOYEE("ROLE_EMPLOYEE", "员工相关权限"),
ROLE_SALE("ROLE_SALE", "销售相关权限"),
ROLE_WAREHOUSE("ROLE_WAREHOUSE", "仓库相关权限");
private final String value;
private final String description;
public static final Role[] ROLES = {
ROLE_ADMIN,
ROLE_COMMODITY,
ROLE_EMPLOYEE,
ROLE_SALE,
ROLE_WAREHOUSE
};
Role(String value, String description) {
this.value = value;
this.description = description;
}
}
================================================
FILE: api/src/main/java/com/example/api/model/support/ResponseResult.java
================================================
package com.example.api.model.support;
import lombok.Data;
@Data
public class ResponseResult<T> {
private Integer code;
private boolean status;
private String msg;
private T data;
public ResponseResult() {
this.code = 200;
this.status = true;
this.msg = null;
this.data = null;
}
//不附带msg返回数据
public ResponseResult(T data) {
this.code = 200;
this.status = true;
this.msg = null;
this.data = data;
}
//默认附带msg和data
public ResponseResult(String msg, T data) {
this.code = 200;
this.status = true;
this.msg = msg;
this.data = data;
}
//默认的错误返回
public ResponseResult(Integer code, String msg) {
this.code = code;
this.status = false;
this.msg = msg;
this.data = null;
}
}
================================================
FILE: api/src/main/java/com/example/api/model/vo/CommodityChartVo.java
================================================
package com.example.api.model.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class CommodityChartVo {
//商品名
private Integer value;
//数量
private String name;
}
================================================
FILE: api/src/main/java/com/example/api/repository/AdminRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Admin;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface AdminRepository extends JpaRepository<Admin, String> {
Admin findAdminByEmailAndPassword(String email, String password);
Admin findAdminByEmail(String email);
boolean existsAdminByRoles(String roles);
}
================================================
FILE: api/src/main/java/com/example/api/repository/CodeRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Code;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CodeRepository extends JpaRepository<Code, String> {
Code findByEmailAndValue(String email, String value);
}
================================================
FILE: api/src/main/java/com/example/api/repository/CommodityRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Commodity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CommodityRepository extends JpaRepository<Commodity, String> {
Commodity findByName(String name);
List<Commodity> findByNameLike(String name);
}
================================================
FILE: api/src/main/java/com/example/api/repository/DistributionRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Distribution;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface DistributionRepository extends JpaRepository<Distribution, String> {
}
================================================
FILE: api/src/main/java/com/example/api/repository/DriverRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Driver;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Repository
public interface DriverRepository extends JpaRepository<Driver, String> {
@Modifying
@Transactional
@Query("update Driver d set d.driving = ?1 where d.id = ?2")
void updateDriving(boolean driving, String id);
List<Driver> findAllByDriving(boolean driving);
}
================================================
FILE: api/src/main/java/com/example/api/repository/EmployeeRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, String> {
}
================================================
FILE: api/src/main/java/com/example/api/repository/InventoryRecordRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.InventoryRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface InventoryRecordRepository extends JpaRepository<InventoryRecord, String> {
List<InventoryRecord> findAllByWid(String wid);
List<InventoryRecord> findAllByType(Integer type);
List<InventoryRecord> findAllByCid(String cid);
}
================================================
FILE: api/src/main/java/com/example/api/repository/InventoryRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Inventory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface InventoryRepository extends JpaRepository<Inventory, String> {
Inventory findByWidAndCid(String wid, String cid);
List<Inventory> findAllByCid(String cid);
List<Inventory> findAllByWid(String wid);
}
================================================
FILE: api/src/main/java/com/example/api/repository/SaleRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Sale;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface SaleRepository extends JpaRepository<Sale, String> {
List<Sale> findAllByCompanyLike(String name);
}
================================================
FILE: api/src/main/java/com/example/api/repository/UserRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, String> {
}
================================================
FILE: api/src/main/java/com/example/api/repository/VehicleRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Vehicle;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Repository
public interface VehicleRepository extends JpaRepository<Vehicle, String> {
@Modifying
@Transactional
@Query("update Vehicle v set v.driving = ?1 where v.id = ?2")
void updateDriving(boolean driving, String id);
List<Vehicle> findAllByDriving(boolean driving);
}
================================================
FILE: api/src/main/java/com/example/api/repository/WareHouseRepository.java
================================================
package com.example.api.repository;
import com.example.api.model.entity.Warehouse;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface WareHouseRepository extends JpaRepository<Warehouse, String> {
}
================================================
FILE: api/src/main/java/com/example/api/security/JwtAuthorizationFilter.java
================================================
package com.example.api.security;
import com.example.api.model.support.ResponseResult;
import com.example.api.utils.JwtTokenUtil;
import com.example.api.utils.ResponseUtil;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 从Request的Authorization Header 获取Jwt
* 解析Jwt授权发放token
*/
public class JwtAuthorizationFilter extends BasicAuthenticationFilter {
public JwtAuthorizationFilter(AuthenticationManager authenticationManager) {
super(authenticationManager);
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
//从Request Header 取出Token
String token = request.getHeader(JwtTokenUtil.TOKEN_HEADER);
//Token为空放行
//如果接下来进入的URL不是公共的地址SpringSecurity会返回403的错误
if (!JwtTokenUtil.checkToken(token)){
chain.doFilter(request, response);
return;
}
//判断JWT Token是否过期
if (JwtTokenUtil.isExpiration(token)) {
ResponseUtil.writeJson(response, new ResponseResult<>(403, "令牌已过期, 请重新登录"));
return;
}
//解析token
String username = JwtTokenUtil.getUsername(token);
List<String> tokenRoles = JwtTokenUtil.getTokenRoles(token);
ArrayList<SimpleGrantedAuthority> roles = new ArrayList<>();
for (String role : tokenRoles) {
roles.add(new SimpleGrantedAuthority(role));
}
//向SpringSecurity的Context中加入认证信息
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(username,null, roles));
super.doFilterInternal(request, response, chain);
}
}
================================================
FILE: api/src/main/java/com/example/api/security/SecurityConfiguration.java
================================================
package com.example.api.security;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* HTTP验证规则
*
* @param http h
* @throws Exception e
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
//开启跨域
http.csrf().disable().cors();
//禁用session
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
//添加自定义的jwt过滤器
http.addFilter(new JwtAuthorizationFilter(authenticationManagerBean()));
}
/**
* SpringSecurity有默认的跨域配置 会无法放行RequestHeader带有"Authorization"请求
* 防止前端请求api报出cors error
*
* @return *
*/
@Bean
CorsConfigurationSource corsConfigurationSource() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedHeader("DELETE");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
source.registerCorsConfiguration("/**", corsConfiguration);
return source;
}
}
================================================
FILE: api/src/main/java/com/example/api/service/AdminService.java
================================================
package com.example.api.service;
import com.example.api.model.dto.LoginDto;
import com.example.api.model.entity.Admin;
import java.util.List;
public interface AdminService {
Admin save(Admin admin) throws Exception;
Admin findById(String id);
void sendEmail(String email) throws Exception;
Admin loginByPassword(LoginDto dto) throws Exception;
Admin loginByEmail(LoginDto dto) throws Exception;
List<Admin> findAll();
//生成token
String createToken(Admin admin, long exp);
void delete(String id);
}
================================================
FILE: api/src/main/java/com/example/api/service/CommodityService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.Commodity;
import java.util.List;
public interface CommodityService {
Commodity save(Commodity commodity);
void update(Commodity commodity);
void delete(String id);
Commodity findById(String id);
List<Commodity> findAll();
List<Commodity> findAllByLikeName(String name);
}
================================================
FILE: api/src/main/java/com/example/api/service/DistributionService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.Distribution;
import java.util.List;
public interface DistributionService {
Distribution save(Distribution distribution) throws Exception;
List<Distribution> findAll();
}
================================================
FILE: api/src/main/java/com/example/api/service/DriverService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.Driver;
import java.util.List;
public interface DriverService {
Driver save(Driver driver);
void update(Driver driver);
void delete(String id);
Driver findById(String id);
List<Driver> findAll();
}
================================================
FILE: api/src/main/java/com/example/api/service/EmailService.java
================================================
package com.example.api.service;
import org.springframework.mail.MailException;
public interface EmailService {
//发送验证码
void sendVerificationCode(String email) throws MailException;
//检验验证码
boolean checkVerificationCode(String email, String code);
}
================================================
FILE: api/src/main/java/com/example/api/service/EmployeeService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.Employee;
import java.util.List;
public interface EmployeeService {
Employee save(Employee employee);
void update(Employee employee);
void delete(String id);
Employee findById(String id);
List<Employee> findAll();
}
================================================
FILE: api/src/main/java/com/example/api/service/InventoryRecordService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.InventoryRecord;
import com.example.api.model.vo.CommodityChartVo;
import java.util.List;
public interface InventoryRecordService {
//出入库排行统计
List<CommodityChartVo> analyzeCommodity(Integer type);
List<InventoryRecord> findAllByWarehouseId(String wid);
List<InventoryRecord> findAllByCommodityId(String cid);
//出库
InventoryRecord out(InventoryRecord record) throws Exception;
//入库
InventoryRecord in(InventoryRecord record) throws Exception;
}
================================================
FILE: api/src/main/java/com/example/api/service/InventoryService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.Inventory;
import java.util.List;
public interface InventoryService {
Inventory save(Inventory inventory);
List<Inventory> findAll();
List<Inventory> findByCommodityId(String cid);
List<Inventory> findByWarehouseId(String wid);
}
================================================
FILE: api/src/main/java/com/example/api/service/SaleService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.Sale;
import java.util.List;
public interface SaleService {
Sale save(Sale sale);
List<Sale> findAll();
List<Sale> searchByCompany(String name);
}
================================================
FILE: api/src/main/java/com/example/api/service/UserService.java
================================================
package com.example.api.service;
public interface UserService {
}
================================================
FILE: api/src/main/java/com/example/api/service/VehicleService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.Vehicle;
import java.util.List;
public interface VehicleService {
Vehicle save(Vehicle vehicle);
void update(Vehicle vehicle);
void delete(String id);
Vehicle findById(String id);
List<Vehicle> findAll();
}
================================================
FILE: api/src/main/java/com/example/api/service/WarehouseService.java
================================================
package com.example.api.service;
import com.example.api.model.entity.Warehouse;
import java.util.List;
public interface WarehouseService {
Warehouse save(Warehouse warehouse);
List<Warehouse> findAll();
void delete(String id);
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/AdminServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.dto.LoginDto;
import com.example.api.model.entity.Admin;
import com.example.api.repository.AdminRepository;
import com.example.api.service.AdminService;
import com.example.api.service.EmailService;
import com.example.api.utils.DataTimeUtil;
import com.example.api.utils.JwtTokenUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class AdminServiceImpl implements AdminService {
@Resource
private AdminRepository adminRepository;
@Resource
private EmailService emailService;
@Override
public Admin save(Admin admin) throws Exception {
if (admin.getEmail().length() < 8 || admin.getPassword().length() < 5) throw new Exception("请求参数异常");
admin.setCreateAt(DataTimeUtil.getNowTimeString());
return adminRepository.save(admin);
}
@Override
public Admin findById(String id) {
return adminRepository.findById(id).orElse(null);
}
@Override
public void sendEmail(String email) throws Exception {
Admin admin = adminRepository.findAdminByEmail(email);
if (admin == null) throw new Exception("不存在的邮箱账户");
emailService.sendVerificationCode(email);
}
@Override
public Admin loginByPassword(LoginDto dto) throws Exception {
Admin one = adminRepository.findAdminByEmailAndPassword(dto.getEmail(), dto.getPassword());
if (one == null) throw new Exception("用户名或密码错误");
return one;
}
@Override
public Admin loginByEmail(LoginDto dto) throws Exception {
boolean status = emailService.checkVerificationCode(dto.getEmail(), dto.getCode());
if (!status) throw new Exception("验证码错误");
return adminRepository.findAdminByEmail(dto.getEmail());
}
@Override
public List<Admin> findAll() {
return adminRepository.findAll();
}
@Override
public String createToken(Admin admin, long exp) {
String rolesString = admin.getRoles();
String[] roles = rolesString != null ? rolesString.split(";") : null;
return JwtTokenUtil.createToken(admin.getEmail(), roles, exp);
}
@Override
public void delete(String id) {
adminRepository.deleteById(id);
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/CommodityServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Commodity;
import com.example.api.repository.CommodityRepository;
import com.example.api.service.CommodityService;
import com.example.api.utils.DataTimeUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class CommodityServiceImpl implements CommodityService {
@Resource
private CommodityRepository commodityRepository;
@Override
public Commodity save(Commodity commodity) {
commodity.setCreateAt(DataTimeUtil.getNowTimeString());
return commodityRepository.save(commodity);
}
@Override
public void update(Commodity commodity) {
commodity.setUpdateAt(DataTimeUtil.getNowTimeString());
commodityRepository.save(commodity);
}
@Override
public void delete(String id) {
commodityRepository.deleteById(id);
}
@Override
public Commodity findById(String id) {
return commodityRepository.findById(id).orElse(null);
}
@Override
public List<Commodity> findAll() {
return commodityRepository.findAll();
}
@Override
public List<Commodity> findAllByLikeName(String name) {
return commodityRepository.findByNameLike("%" + name + "%");
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/DistributionServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Distribution;
import com.example.api.model.entity.Driver;
import com.example.api.model.entity.Vehicle;
import com.example.api.repository.DistributionRepository;
import com.example.api.repository.DriverRepository;
import com.example.api.repository.VehicleRepository;
import com.example.api.service.DistributionService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;
@Service
public class DistributionServiceImpl implements DistributionService {
@Resource
private DistributionRepository distributionRepository;
@Resource
private DriverRepository driverRepository;
@Resource
private VehicleRepository vehicleRepository;
@Override
public Distribution save(Distribution distribution) throws Exception {
if (distributionRepository.findById(distribution.getId()).isEmpty()) {
Optional<Driver> driver = driverRepository.findById(distribution.getDid());
Optional<Vehicle> vehicle = vehicleRepository.findById(distribution.getVid());
if (driver.isEmpty() || vehicle.isEmpty()) throw new Exception("请求参数错误");
if (driver.get().isDriving() || vehicle.get().isDriving()) throw new Exception("司机或货车状态不可用");
driverRepository.updateDriving(true, distribution.getDid());
vehicleRepository.updateDriving(true, distribution.getVid());
}
return distributionRepository.save(distribution);
}
@Override
public List<Distribution> findAll() {
return distributionRepository.findAll();
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/DriverServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Driver;
import com.example.api.repository.DriverRepository;
import com.example.api.service.DriverService;
import com.example.api.utils.DataTimeUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class DriverServiceImpl implements DriverService {
@Resource
private DriverRepository driverRepository;
@Override
public Driver save(Driver driver) {
driver.setCreateAt(DataTimeUtil.getNowTimeString());
return driverRepository.save(driver);
}
@Override
public void update(Driver driver) {
driver.setUpdateAt(DataTimeUtil.getNowTimeString());
driverRepository.save(driver);
}
@Override
public void delete(String id) {
driverRepository.deleteById(id);
}
@Override
public Driver findById(String id) {
return driverRepository.findById(id).orElse(null);
}
@Override
public List<Driver> findAll() {
return driverRepository.findAll();
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/EmailServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Code;
import com.example.api.repository.CodeRepository;
import com.example.api.service.EmailService;
import com.example.api.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class EmailServiceImpl implements EmailService {
@Resource
private CodeRepository codeRepository;
@Resource
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
@Override
public void sendVerificationCode(String email) throws MailException {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(email);
message.setSubject("验证码");
String value = RandomUtil.next();
message.setText("你的验证码为: " + value + " 十五分钟内有效");
mailSender.send(message);
//保存验证码
//同一主键的email为update操作
codeRepository.save(new Code(email, value));
}
@Override
public boolean checkVerificationCode(String email, String value) {
Code code = codeRepository.findByEmailAndValue(email, value);
if (code != null && code.getExp() > System.currentTimeMillis()) {
//登陆成功删除验证码
codeRepository.delete(code);
return true;
}
return false;
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/EmployeeServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Employee;
import com.example.api.repository.EmployeeRepository;
import com.example.api.service.EmployeeService;
import com.example.api.utils.DataTimeUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Resource
private EmployeeRepository employeeRepository;
@Override
public Employee save(Employee employee) {
employee.setCreateAt(DataTimeUtil.getNowTimeString());
return employeeRepository.save(employee);
}
@Override
public void update(Employee employee) {
employee.setUpdateAt(DataTimeUtil.getNowTimeString());
employeeRepository.save(employee);
}
@Override
public void delete(String id) {
employeeRepository.deleteById(id);
}
@Override
public Employee findById(String id) {
return employeeRepository.findById(id).orElse(null);
}
@Override
public List<Employee> findAll() {
return employeeRepository.findAll();
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/InventoryRecordServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Commodity;
import com.example.api.model.entity.Inventory;
import com.example.api.model.entity.InventoryRecord;
import com.example.api.model.vo.CommodityChartVo;
import com.example.api.repository.CommodityRepository;
import com.example.api.repository.InventoryRecordRepository;
import com.example.api.repository.InventoryRepository;
import com.example.api.service.InventoryRecordService;
import com.example.api.utils.DataTimeUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
@Service
public class InventoryRecordServiceImpl implements InventoryRecordService {
@Resource
private InventoryRepository inventoryRepository;
@Resource
private CommodityRepository commodityRepository;
@Resource
private InventoryRecordRepository recordRepository;
@Override
public List<CommodityChartVo> analyzeCommodity(Integer type) {
List<CommodityChartVo> result = new ArrayList<>();
List<InventoryRecord> all = recordRepository.findAllByType(type);
Map<String, Integer> map = new HashMap<>();
for (InventoryRecord r : all) {
if (map.containsKey(r.getName())) {
map.put(r.getName(), map.get(r.getName()) + r.getCount());
} else {
map.put(r.getName(), r.getCount());
}
}
for (String key : map.keySet()) {
result.add(new CommodityChartVo(map.get(key), key));
}
return result;
}
@Override
public List<InventoryRecord> findAllByWarehouseId(String wid) {
return recordRepository.findAllByWid(wid);
}
@Override
public List<InventoryRecord> findAllByCommodityId(String cid) {
return recordRepository.findAllByCid(cid);
}
@Override
public InventoryRecord out(InventoryRecord record) throws Exception {
//查找当前商品在该仓库的库存
Inventory inventory = inventoryRepository.findByWidAndCid(record.getWid(), record.getCid());
//查询结果为空
if (inventory == null) throw new Exception("仓库内不存在该商品");
//比较库存
if (inventory.getCount() < record.getCount()) throw new Exception("出库失败,库存数量不足");
Optional<Commodity> optional = commodityRepository.findById(record.getCid());
if (optional.isEmpty()) {
throw new Exception("不存在的商品id");
}
Commodity commodity = optional.get();
commodity.setCount(commodity.getCount() - record.getCount());
commodityRepository.save(optional.get());
inventory.setCount(inventory.getCount() - record.getCount());
inventoryRepository.save(inventory);
record.setCreateAt(DataTimeUtil.getNowTimeString());
record.setType(-1);
return recordRepository.save(record);
}
@Override
public InventoryRecord in(InventoryRecord record) throws Exception {
Optional<Commodity> optional = commodityRepository.findById(record.getCid());
if (optional.isEmpty()) {
throw new Exception("不存在的商品id");
}
Commodity commodity = optional.get();
commodity.setCount(commodity.getCount() + record.getCount());
commodityRepository.save(optional.get());
//查找当前商品在该仓库的库存
Inventory inventory = inventoryRepository.findByWidAndCid(record.getWid(), record.getCid());
//查询结果为空
if (inventory == null) {
//新建该商品库存信息
inventory = new Inventory();
inventory.setCid(record.getCid());
inventory.setWid(record.getWid());
inventory.setCount(0);
inventory.setName(record.getName());
}
inventory.setCount(inventory.getCount() + record.getCount());
inventoryRepository.save(inventory);
record.setCreateAt(DataTimeUtil.getNowTimeString());
record.setType(+1);
return recordRepository.save(record);
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/InventoryServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Inventory;
import com.example.api.repository.InventoryRepository;
import com.example.api.service.InventoryService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class InventoryServiceImpl implements InventoryService {
@Resource
private InventoryRepository inventoryRepository;
@Override
public Inventory save(Inventory inventory) {
return inventoryRepository.save(inventory);
}
@Override
public List<Inventory> findAll() {
return inventoryRepository.findAll();
}
@Override
public List<Inventory> findByCommodityId(String cid) {
return inventoryRepository.findAllByCid(cid);
}
@Override
public List<Inventory> findByWarehouseId(String wid) {
return inventoryRepository.findAllByWid(wid);
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/SaleServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Sale;
import com.example.api.repository.SaleRepository;
import com.example.api.service.SaleService;
import com.example.api.utils.DataTimeUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class SaleServiceImpl implements SaleService {
@Resource
private SaleRepository saleRepository;
@Override
public Sale save(Sale sale) {
sale.setCreateAt(DataTimeUtil.getNowTimeString());
return saleRepository.save(sale);
}
@Override
public List<Sale> findAll() {
return saleRepository.findAll();
}
@Override
public List<Sale> searchByCompany(String name) {
return saleRepository.findAllByCompanyLike(name);
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/UserServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/VehicleServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Vehicle;
import com.example.api.repository.VehicleRepository;
import com.example.api.service.VehicleService;
import com.example.api.utils.DataTimeUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class VehicleServiceImpl implements VehicleService {
@Resource
private VehicleRepository vehicleRepository;
@Override
public Vehicle save(Vehicle vehicle) {
vehicle.setCreateAt(DataTimeUtil.getNowTimeString());
return vehicleRepository.save(vehicle);
}
@Override
public void update(Vehicle vehicle) {
vehicleRepository.save(vehicle);
}
@Override
public void delete(String id) {
vehicleRepository.deleteById(id);
}
@Override
public Vehicle findById(String id) {
return vehicleRepository.findById(id).orElse(null);
}
@Override
public List<Vehicle> findAll() {
return vehicleRepository.findAll();
}
}
================================================
FILE: api/src/main/java/com/example/api/service/impl/WarehouseServiceImpl.java
================================================
package com.example.api.service.impl;
import com.example.api.model.entity.Warehouse;
import com.example.api.repository.WareHouseRepository;
import com.example.api.service.WarehouseService;
import com.example.api.utils.DataTimeUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class WarehouseServiceImpl implements WarehouseService {
@Resource
private WareHouseRepository wareHouseRepository;
@Override
public Warehouse save(Warehouse warehouse) {
warehouse.setCreateAt(DataTimeUtil.getNowTimeString());
return wareHouseRepository.save(warehouse);
}
@Override
public List<Warehouse> findAll() {
return wareHouseRepository.findAll();
}
@Override
public void delete(String id) {
wareHouseRepository.deleteById(id);
}
}
================================================
FILE: api/src/main/java/com/example/api/utils/DataTimeUtil.java
================================================
package com.example.api.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public final class DataTimeUtil {
public static String getNowTimeString() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(System.currentTimeMillis());
}
public static long parseTimeStamp(String s) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long t = 0;
try {
t = df.parse(s).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return t;
}
public static boolean isAfterNow(String time) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
long t = 0;
try {
t = df.parse(time).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return t > System.currentTimeMillis();
}
}
================================================
FILE: api/src/main/java/com/example/api/utils/JwtTokenUtil.java
================================================
package com.example.api.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.*;
public final class JwtTokenUtil {
//在http header中的名字
public final static String TOKEN_HEADER = "Authorization";
//一个星期过期
public final static long REMEMBER_EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 7;
//一天过期
public final static long EXPIRATION_TIME = 1000 * 60 * 60 * 24;
// 应用密钥
private static final String APP_SECRET = "logistics.api";
private static final String PREFIX = "logistics:";
// 角色权限声明
private static final String ROLE_CLAIMS = "roles";
//检验token是否合法
public static boolean checkToken(String token) {
if ("null".equals(token) || token == null || "".equals(token)) return false;
return token.startsWith(PREFIX);
}
/**
* 生成Token
*/
public static String createToken(String username, String[] roles, long expiration) {
Map<String, Object> map = new HashMap<>();
map.put(ROLE_CLAIMS, roles);
return PREFIX + Jwts.builder()
.setSubject(username)
.setClaims(map)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(SignatureAlgorithm.HS256, APP_SECRET)
.compact();
}
/**
* 获取token body
*/
private static Claims getTokenClaims(String token) {
token = token.substring(PREFIX.length());
Claims claims;
try {
claims = Jwts.parser()
.setSigningKey(APP_SECRET)
.parseClaimsJws(token)
.getBody();
} catch (ExpiredJwtException e) {
claims = e.getClaims();
}
return claims;
}
/**
* 从Token中获取username
*/
public static String getUsername(String token) {
return getTokenClaims(token).getSubject();
}
/**
* 从Token中获取用户角色
*/
public static List<String> getTokenRoles(String token) {
List<String> roles = new ArrayList<>();
Object object = getTokenClaims(token).get(ROLE_CLAIMS);
if (object instanceof ArrayList<?>) {
for (Object o : (List<?>) object) {
roles.add((String) o);
}
}
return roles;
}
/**
* 校验Token是否过期
*/
public static boolean isExpiration(String token) {
return getTokenClaims(token).getExpiration().before(new Date());
}
}
================================================
FILE: api/src/main/java/com/example/api/utils/RandomUtil.java
================================================
package com.example.api.utils;
import java.util.Random;
public final class RandomUtil {
public static String next() {
StringBuilder builder = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 6; i++) {
builder.append(random.nextInt(10));
}
return builder.toString();
}
}
================================================
FILE: api/src/main/java/com/example/api/utils/ResponseUtil.java
================================================
package com.example.api.utils;
import com.alibaba.fastjson.JSON;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public final class ResponseUtil {
public static void writeJson(HttpServletResponse response, Object o) {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
response.setContentType("application/json;charset=utf-8");
response.setStatus(200);
try {
PrintWriter writer = response.getWriter();
writer.write(JSON.toJSONString(o));
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
================================================
FILE: api/src/main/resources/application.yaml
================================================
server:
port: 8080
spring:
mail:
host: smtp.163.com
protocol: smtp
default-encoding: UTF-8
#发件人
username: gaoyuanming_1@163.com
#授权码
password: a123456
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/logistics?characterEncoding=utf8&serverTimezone=UTC
username: root
password: abc521521521
jpa:
hibernate:
ddl-auto: update
open-in-view: false
================================================
FILE: web-app/.gitignore
================================================
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
================================================
FILE: web-app/README.md
================================================
# Antd Vue Admin 基础模版
### 实现的基本功能
- vuex封装关于User的部分
- vuex + vue-router 的路由卫士
- nprogress每次路由变化的进度条显示
- layout公共布局
- axios简单封装 utils/request.js
### 页面预览
- 首页

- 登陆页

### Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
================================================
FILE: web-app/package.json
================================================
{
"name": "wab-app",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
"dependencies": {
"ant-design-vue": "^1.7.4",
"axios": "^0.21.1",
"echarts": "^5.0.2",
"nprogress": "^0.2.0",
"vue": "^2.6.11",
"vue-json-excel": "^0.3.0",
"vue-router": "^3.2.0",
"vuex": "^3.4.0"
},
"devDependencies": {
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"vue-template-compiler": "^2.6.11"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
================================================
FILE: web-app/public/index.html
================================================
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>物流管理系统</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
================================================
FILE: web-app/src/App.vue
================================================
<template>
<div id="app">
<router-view/>
</div>
</template>
<style>
/*顶部进度条样式*/
#nprogress .bar {
background: #1890ff !important;
}
body {
letter-spacing: 1px;
background: #f0f2f5 !important;
}
</style>
================================================
FILE: web-app/src/api/admin.js
================================================
import service from "../utils/request";
export function IsInit() {
return service({
url: '/admin/hasInit',
method: 'get',
})
}
export function Init(data) {
return service({
url: '/admin/init',
method: 'post',
data: data
})
}
export function DeleteAdmin(id) {
return service({
url: '/admin?id=' + id,
method: 'delete',
})
}
export function FindAllAdmin() {
return service({
url: '/admin',
method: 'get',
})
}
export function SaveAdmin(data) {
return service({
url: '/admin',
method: 'post',
data: data
})
}
export function AdminSendEmail(email) {
return service({
url: '/admin/sendEmail?email=' + email,
method: 'get'
})
}
export function AdminLogin(type, data) {
return service({
url: '/admin/login?type=' + type,
method: 'post',
data: data
})
}
================================================
FILE: web-app/src/api/commodity.js
================================================
import service from "../utils/request";
export function FindAllCommodity() {
return service({
url: '/commodity',
method: 'get'
})
}
export function SearchCommodity(name) {
return service({
url: '/commodity/search/' + name,
method: 'get'
})
}
export function SaveCommodity(data) {
return service({
url: '/commodity',
method: 'post',
data: data
})
}
export function DeleteCommodityById(id) {
return service({
url: '/commodity?id=' + id,
method: 'delete'
})
}
================================================
FILE: web-app/src/api/distribution.js
================================================
import service from "../utils/request";
export function FindAllDistribution() {
return service({
url: '/distribution',
method: 'get'
})
}
export function FindAllCanUse() {
return service({
url: '/distribution/can',
method: 'get'
})
}
export function SaveDistribution(data) {
return service({
url: '/distribution',
method: 'post',
data: data
})
}
================================================
FILE: web-app/src/api/driver.js
================================================
import service from "../utils/request";
export function FindAllDriver(){
return service({
url: '/driver',
method: 'get'
})
}
export function SaveDriver(data) {
return service({
url: '/driver',
method: 'post',
data: data
})
}
export function DeleteDriverById(id){
return service({
url: '/driver?id=' + id,
method: 'delete'
})
}
================================================
FILE: web-app/src/api/employee.js
================================================
import service from "../utils/request";
export function FindAllEmployee(){
return service({
url: '/employee',
method: 'get'
})
}
export function SaveEmployee(data) {
return service({
url: '/employee',
method: 'post',
data: data
})
}
export function DeleteEmployeeById(id){
return service({
url: '/employee?id=' + id,
method: 'delete'
})
}
================================================
FILE: web-app/src/api/inventory.js
================================================
import service from "../utils/request";
export function AnalyzeCommodity(type) {
return service({
url: '/inventory/analyze?type=' + type,
method: 'get'
})
}
export function FindAllInventory(id) {
return service({
url: '/inventory/warehouse/' + id,
method: 'get'
})
}
export function InAndOut(type, data) {
return service({
url: '/inventory/' + type,
method: 'post',
data: data
})
}
export function FindRecordByWarehouse(id) {
return service({
url: '/inventory/record/warehouse/' + id,
method: 'get'
})
}
export function DeleteInventoryById(id) {
return service({
url: '/inventory?id=' + id,
method: 'delete'
})
}
================================================
FILE: web-app/src/api/role.js
================================================
import service from "../utils/request";
export function FindAllRole(){
return service({
url: '/role',
method: 'get'
})
}
================================================
FILE: web-app/src/api/sale.js
================================================
import service from "../utils/request";
export function FindAllSale() {
return service({
url: '/sale',
method: 'get'
})
}
export function SearchCompany(name) {
return service({
url: '/sale/search/' + name,
method: 'get'
})
}
export function SaveSale(data) {
return service({
url: '/sale',
method: 'post',
data: data
})
}
================================================
FILE: web-app/src/api/vehicle.js
================================================
import service from "../utils/request";
export function FindAllVehicle(){
return service({
url: '/vehicle',
method: 'get'
})
}
export function SaveVehicle(data) {
return service({
url: '/vehicle',
method: 'post',
data: data
})
}
export function DeleteVehicleById(id){
return service({
url: '/vehicle?id=' + id,
method: 'delete'
})
}
================================================
FILE: web-app/src/api/warehouse.js
================================================
import service from "../utils/request";
export function FindAllWarehouse() {
return service({
url: '/warehouse',
method: 'get'
})
}
export function SaveWarehouse(data) {
return service({
url: '/warehouse',
method: 'post',
data: data
})
}
export function DeleteWarehouseById(id) {
return service({
url: '/warehouse?id=' + id,
method: 'delete'
})
}
================================================
FILE: web-app/src/components/InventoryRecords.vue
================================================
<template>
<div>
<download-excel
class="export-excel-wrapper"
:data="data"
:fields="json_fields"
name="出入库记录.xls">
<a-button class="btn" icon="download" type="primary">下载Excel表格</a-button>
</download-excel>
<a-table :columns="columns" :data-source="data" rowKey="id">
<span slot="type" slot-scope="type">
<a-tag :color="type === -1 ? 'green' : 'cyan'">{{ type === -1 ? '出库' : '入库' }}</a-tag>
</span>
</a-table>
</div>
</template>
<script>
import {FindRecordByWarehouse} from "../api/inventory";
const columns = [
{
dataIndex: 'name',
key: 'name',
title: '商品',
},
{
title: '数量',
dataIndex: 'count',
key: 'count',
},
{
title: '时间',
dataIndex: 'createAt',
key: 'createAt',
},
{
title: '类型',
key: 'type',
dataIndex: 'type',
scopedSlots: {customRender: 'type'},
},
{
title: '备注',
dataIndex: 'description',
key: 'description',
},
];
export default {
components: {},
props: {
warehouseId: {type: String, default: ''},
},
data() {
return {
data: [],
columns,
json_fields: {
"商品ID": "cid",
"商品名称": "name",
"类型": {
field: 'type',
callback: (value) => {
console.log(value)
return value === -1 ? '出库' : '入库'
}
},
"数量": "count",
"备注": "description",
"时间": "createAt",
},
}
},
mounted() {
FindRecordByWarehouse(this.warehouseId).then((res) => {
this.data = res.data
console.log(res.data[0])
})
},
}
</script>
<style scoped>
.btn {
margin-bottom: 15px;
letter-spacing: 1px;
}
</style>
================================================
FILE: web-app/src/layout/Aside.vue
================================================
<template>
<a-layout-sider
:style="{ overflow: 'auto', height: '100vh', position: 'fixed', left: 0 }"
width="220">
<div class="logo">
<img src="../assets/logo.svg" alt="">
物流管理系统
</div>
<a-menu theme="dark" mode="inline">
<a-sub-menu v-for="(item, index) in menus" :key="index">
<span slot="title">
<a-icon :type="item.icon"/>
<span>{{ item.title }}</span>
</span>
<a-menu-item v-for="menu in item.children" :key="menu.title">
<router-link :to="menu.path">
{{ menu.title }}
</router-link>
</a-menu-item>
</a-sub-menu>
</a-menu>
</a-layout-sider>
</template>
<script>
export default {
data() {
return {
menus: [
{
title: '基础信息管理',
icon: 'home',
children: [
{title: '商品管理', path: '/commodity'},
{title: '来往单位', path: '/company'},
{title: '员工管理', path: '/employee'},
{title: '仓库管理', path: '/warehouse'},
]
},
{
title: '销售信息管理',
icon: 'pay-circle',
children: [
{title: '销售开票', path: '/sale/create'},
{title: '销售记录', path: '/sale/record'},
]
},
{
title: '配送信息管理',
icon: 'car',
children: [
{title: '申请配送', path: '/delivery/create'},
{title: '配送列表', path: '/delivery/list'},
]
},
{
title: '运输信息管理',
icon: 'rocket',
children: [
{title: '车辆资料', path: '/vehicle'},
{title: '驾驶员资料', path: '/driver'},
]
},
{
title: '系统决策管理',
icon: 'line-chart',
children: [
{title: '入库分析', path: '/analyze/in'},
{title: '出库分析', path: '/analyze/out'},
]
},
{
title: '系统信息管理',
icon: 'tool',
children: [
{title: '安全设置', path: '/security'},
{title: '操作员管理', path: '/admin'},
{title: '权限列表', path: '/role'},
]
},
]
}
},
}
</script>
<style scoped>
#components-layout-demo-fixed-sider .logo {
padding: 10px 15px;
height: 50px;
font-size: 15px;
margin: 16px;
color: #ffffff;
letter-spacing: 2px;
}
.ant-menu {
letter-spacing: 1px;
}
.logo img {
width: 32px;
height: 32px;
margin-right: 5px;
}
</style>
================================================
FILE: web-app/src/layout/Footer.vue
================================================
<template>
<a-layout-footer :style="{ textAlign: 'center', letterSpacing: '1px' }">
物流管理系统 ©2021 Created by 信息工程学院 - 高元明
</a-layout-footer>
</template>
<script>
export default {
name: "Footer"
}
</script>
<style scoped>
</style>
================================================
FILE: web-app/src/layout/Header.vue
================================================
<template>
<a-layout-header class="header" :style="{ background: '#fff', padding: 0}">
<a-tooltip placement="bottom">
<template slot="title">
<span>刷新页面</span>
</template>
<a-button @click="clickReload" class="reload-btn" icon="reload" type="link">Reload</a-button>
</a-tooltip>
<a-tooltip placement="bottom" class="question-btn">
<template slot="title">
<span>About</span>
</template>
<a-button class="reload-btn" icon="question-circle" type="link"/>
</a-tooltip>
<a-dropdown>
<a-button class="avatar-btn" type="link">
<div class="avatar-btn-main">
<a-avatar class="avatar"
:size="26"
src="https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png"/>
<div class="avatar-btn-username">{{ details.email }}</div>
</div>
</a-button>
<a-menu slot="overlay">
<a-menu-item>
<router-link to="/security">
<a-icon class="icon" type="smile"/>
个人中心
</router-link>
</a-menu-item>
<a-menu-item>
<router-link to="/role">
<a-icon class="icon" type="setting"/>
权限设置
</router-link>
</a-menu-item>
<a-menu-divider/>
<a-menu-item @click="handleLogout">
<a-icon class="icon" type="logout"/>
退出登录
</a-menu-item>
</a-menu>
</a-dropdown>
</a-layout-header>
</template>
<script>
export default {
data() {
return {
details: this.$store.state.user.details ? this.$store.state.user.details : {}
}
},
methods: {
clickReload() {
this.$router.go(0)
},
handleLogout() {
let that = this
this.$confirm({
title: '你确定要注销你的登录信息吗?',
content: '点击确定将删除你在网站保留的登录信息!',
onOk() {
that.$router.push('/login')
that.$store.commit('user/userLogout')
},
});
}
}
}
</script>
<style scoped>
.reload-btn {
font-size: 15px;
margin-left: 10px;
color: rgba(0, 0, 0, 0.65);
}
.question-btn {
float: right;
margin: 15px 12px 0 0;
}
.avatar-btn {
float: right;
font-size: 15px;
color: rgba(0, 0, 0, 0.55);
height: 64px;
}
.avatar-btn-main {
display: flex;
}
.avatar-btn-username {
line-height: 62px;
font-size: 14px;
}
.avatar {
margin-right: 12px;
margin-top: 19px;
}
</style>
================================================
FILE: web-app/src/layout/Index.vue
================================================
<template>
<a-layout id="components-layout-demo-fixed-sider">
<Aside/>
<a-layout :style="{ marginLeft: '220px' }">
<Header/>
<Main/>
<Footer/>
</a-layout>
</a-layout>
</template>
<script>
import Aside from "@/layout/Aside";
import Header from "@/layout/Header";
import Main from "@/layout/Main";
import Footer from "@/layout/Footer";
export default {
components: {Aside, Header, Main, Footer},
mounted() {
this.$message.success(
'欢迎管理员 ' + this.$store.state.user.details.email,
6,
);
}
}
</script>
<style scoped>
#components-layout-demo-fixed-sider .logo {
padding: 10px 15px;
height: 50px;
font-size: 15px;
margin: 16px;
color: #ffffff;
letter-spacing: 2px;
}
.logo img {
width: 32px;
height: 32px;
margin-right: 5px;
}
.header {
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1)
}
</style>
================================================
FILE: web-app/src/layout/Main.vue
================================================
<template>
<a-layout-content :style="{ margin: '24px', overflow: 'initial' }">
<router-view/>
</a-layout-content>
</template>
<style scoped>
</style>
================================================
FILE: web-app/src/main.js
================================================
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'
import JsonExcel from 'vue-json-excel'
Vue.component('downloadExcel', JsonExcel)
Vue.config.productionTip = false
Vue.use(Antd)
new Vue({
router,
store,
render: function (h) { return h(App) }
}).$mount('#app')
================================================
FILE: web-app/src/router/index.js
================================================
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '../store'
import routes from "@/router/routes"
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
//顶部进度条样式
NProgress.configure({
showSpinner: false,
speed: 800,
});
Vue.use(VueRouter)
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
//路由卫士
router.beforeEach((to, from, next) => {
NProgress.start()
to.meta.auth && !store.state.user.token ? next("/login") : next()
})
router.afterEach(() => {
NProgress.done()
})
export default router
================================================
FILE: web-app/src/router/routes.js
================================================
import Layout from '@/layout/Index'
const routes = [
//公共布局下的路由
{
path: '/',
component: Layout,
children: [
{
path: "",
redirect: "/commodity",
meta: {auth: true}
},
{
path: 'commodity',
component: () => import('@/views/basics/Commodity'),
meta: {auth: true}
},
{
path: 'company',
component: () => import('@/views/basics/Company'),
meta: {auth: true}
},
{
path: 'employee',
component: () => import('@/views/basics/Employee'),
meta: {auth: true}
},
{
path: 'warehouse',
component: () => import('@/views/basics/Warehouse'),
meta: {auth: true}
},
{
path: 'warehouse/:id',
component: () => import('@/views/basics/Details'),
meta: {auth: true}
},
{
path: 'driver',
component: () => import('@/views/transport/Driver'),
meta: {auth: true}
},
{
path: 'vehicle',
component: () => import('@/views/transport/Vehicle'),
meta: {auth: true}
},
{
path: 'sale/record',
component: () => import('@/views/sale/Record'),
meta: {auth: true}
},
{
path: 'sale/create',
component: () => import('@/views/sale/Create'),
meta: {auth: true}
},
{
path: 'delivery/create',
component: () => import('@/views/delivery/Create'),
meta: {auth: true}
},
{
path: 'delivery/list',
component: () => import('@/views/delivery/List'),
meta: {auth: true}
},
{
path: 'analyze/in',
component: () => import('@/views/analyze/In'),
meta: {auth: true}
},
{
path: 'analyze/out',
component: () => import('@/views/analyze/Out'),
meta: {auth: true}
},
{
path: 'security',
component: () => import('@/views/system/Security'),
meta: {auth: true},
},
{
path: 'admin',
component: () => import('@/views/system/Admin'),
meta: {auth: true},
},
{
path: 'role',
component: () => import('@/views/system/Role'),
meta: {auth: true},
},
//403
{
path: '403',
component: () => import('@/views/error/403'),
meta: {auth: true}
},
//404
{
path: '404',
component: () => import('@/views/error/404'),
meta: {auth: true}
},
//500
{
path: '500',
component: () => import('@/views/error/500'),
meta: {auth: true}
},
]
},
//登录页
{
path: '/login',
name: 'Login',
component: () => import('@/views/Login'),
meta: {auth: false}
},
//初始化
{
path: '/init',
name: 'Init',
component: () => import('@/views/Init'),
meta: {auth: false}
},
//404
{
path: "*",
redirect: '/404'
}
]
export default routes
================================================
FILE: web-app/src/store/index.js
================================================
import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
Vue.use(Vuex)
export default new Vuex.Store({
modules: {
user
}
})
================================================
FILE: web-app/src/store/modules/user.js
================================================
const state = {
token: localStorage.getItem("token"),
details: JSON.parse(localStorage.getItem("user"))
}
const getters = {}
const mutations = {
saveToken(state, token) {
state.token = token
localStorage.setItem("token", token)
},
saveLoginUser(state, user) {
state.details = user
localStorage.setItem("user", JSON.stringify(user))
},
userLogout(state) {
state.details = null
state.token = null
localStorage.removeItem("token")
localStorage.removeItem("user")
}
}
const actions = {}
export default {
namespaced: true,
state,
getters,
mutations,
actions
}
================================================
FILE: web-app/src/utils/request.js
================================================
import request from "axios"
import {message} from 'ant-design-vue'
import router from '../router/index'
const token = localStorage.getItem("token")
const service = request.create({
baseURL: 'http://localhost:8080/api',
timeout: 50000,
headers: {'Authorization': token}
});
service.interceptors.response.use(
response => {
const res = response.data;
//判断response状态
if (!res.status) message.error('请求错误: ' + res.msg)
if (res.code === 403) router.push("/403")
return res
},
error => {
message.error(error)
router.push('/500')
return Promise.reject(error)
}
);
export default service
================================================
FILE: web-app/src/views/Init.vue
================================================
<template>
<div class="login-box">
<div>
<div class="box-header">
<img class="logo" src="../assets/logo.svg" alt=""/>
<div class="box-header-t">系统初始化</div>
</div>
<div class="title">Logistics Management 物流管理系统 - 系统初始化</div>
<a-input
v-model="form.email"
size="large"
style="margin-top: 10px"
class="input"
placeholder="邮箱">
<a-icon slot="prefix" type="mail"/>
</a-input>
<a-input-password
v-model="form.password"
size="large"
class="input"
placeholder="密码">
<a-icon slot="prefix" type="lock"/>
</a-input-password>
<a-button :loading="submitLoading" class="submit-btn" type="primary" @click="submitLogin">
初始化系统
</a-button>
<div class="des">物流管理系统 - Copyright 2021 高元明</div>
</div>
</div>
</template>
<script>
import {Init, IsInit} from "../api/admin";
export default {
data() {
return {
spinning: true,
sendLoading: false,
submitType: '2', //1账号登录 2邮箱登录
submitLoading: false,
form: {
password: '',
email: '',
},
}
},
mounted() {
IsInit().then((res) => {
if (res.data) this.$router.push('/login')
})
},
methods: {
submitLogin() {
if (this.checkEmail()) {
Init(this.form).then((res) => {
if (res.status) this.$router.push('/login')
})
}
},
checkEmail() {
const emailRegex = new RegExp('^\\w{3,}(\\.\\w+)*@[A-z0-9]+(\\.[A-z]{2,5}){1,2}$')
if (!emailRegex.test(this.form.email)) {
this.$message.error('请输入正确格式的邮箱');
return false
} else {
return true
}
},
}
}
</script>
<style scoped>
body {
background: #000000 !important;
}
>>> .ant-tabs-bar {
border-bottom: none !important;
}
>>> .ant-btn-primary {
border-color: #5a84fd;
}
.login-box {
width: 350px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.box-header {
display: flex;
}
.box-header-t {
font-weight: bolder;
font-size: 30px;
letter-spacing: 1px;
}
.logo {
width: 44px;
height: 44px;
margin-right: 20px;
margin-left: 43px;
}
>>> .ant-tabs-nav {
width: 350px;
}
>>> .ant-tabs-ink-bar {
left: 52px;
}
>>> .ant-input-affix-wrapper .ant-input {
font-size: 12px !important;
}
.title {
color: #91949c;
padding-top: 15px;
padding-bottom: 35px;
font-size: 13px;
text-align: center;
}
.input {
margin-bottom: 25px;
font-size: 10px;
}
.code-btn {
height: 40px;
margin-left: 30px;
}
.submit-btn {
letter-spacing: 2px;
background: #5a84fd;
width: 100%;
height: 45px;
}
.des {
padding-top: 25px;
font-size: 13px;
text-align: center;
color: #91949c;
letter-spacing: 2px;
}
</style>
================================================
FILE: web-app/src/views/Login.vue
================================================
<template>
<div class="login-box">
<div>
<div class="box-header">
<img class="logo" src="../assets/logo.svg" alt=""/>
<div class="box-header-t">Management</div>
</div>
<div class="title">Logistics Management 物流管理系统 - 管理员登录</div>
<a-tabs @change="tabClick" default-active-key="1" :tabBarStyle="{ textAlign: 'center' }">
<a-tab-pane key="1" tab="密码登陆">
<a-input
v-model="form.email"
size="large"
style="margin-top: 10px"
class="input"
placeholder="邮箱">
<a-icon slot="prefix" type="mail"/>
</a-input>
<a-input-password
v-model="form.password"
size="large"
class="input"
placeholder="密码">
<a-icon slot="prefix" type="lock"/>
</a-input-password>
</a-tab-pane>
<a-tab-pane key="2" tab="验证码登陆" force-render>
<a-input
v-model="form.email"
size="large"
style="margin-top: 10px"
class="input"
placeholder="邮箱">
<a-icon slot="prefix" type="mail"/>
</a-input>
<div style="display: flex">
<a-input
v-model="form.code"
size="large"
class="input"
placeholder="验证码">
<a-icon slot="prefix" type="safety-certificate"/>
</a-input>
<a-button class="code-btn" :loading="sendLoading" @click="sendEmail">
获取验证码
</a-button>
</div>
</a-tab-pane>
</a-tabs>
<div style="margin-bottom: 20px">
<a-checkbox v-model="form.remember">自动登录</a-checkbox>
<a-button type="link" style="margin-left: 158px">
忘记密码 ?
</a-button>
</div>
<a-button :loading="submitLoading" class="submit-btn" type="primary" @click="submitLogin">
确认登陆
</a-button>
<div class="des">物流管理系统 - Copyright 2021 高元明</div>
</div>
</div>
</template>
<script>
import {AdminLogin, AdminSendEmail} from "@/api/admin";
import {IsInit} from "../api/admin";
export default {
data() {
return {
sendLoading: false,
submitType: '1', //1账号登录 2邮箱登录
submitLoading: false,
form: {
password: '',
email: '',
code: '',
remember: false,
},
}
},
mounted() {
IsInit().then((res) => {
if (!res.data) this.$router.push('/init')
})
},
methods: {
sendEmail() {
if (this.checkEmail()) {
this.sendLoading = true
AdminSendEmail(this.form.email).then((res) => {
if (res.status) this.$message.success("验证码发送成功")
this.sendLoading = false
})
}
},
submitLogin() {
if (this.checkEmail()) {
let type = this.submitType === '1' ? "passwrod" : "email"
AdminLogin(type, this.form).then((res) => {
console.log(res.data)
if (res.status) {
this.$store.commit('user/saveToken', res.data.token)
this.$store.commit('user/saveLoginUser', res.data.admin)
setTimeout(() => {
this.$router.push("/commodity")
this.submitLoading = false
}, 700)
this.$message.success("登陆成功")
}
})
}
},
tabClick(key) {
this.submitType = key
},
checkEmail() {
const emailRegex = new RegExp('^\\w{3,}(\\.\\w+)*@[A-z0-9]+(\\.[A-z]{2,5}){1,2}$')
if (!emailRegex.test(this.form.email)) {
this.$message.error('请输入正确格式的邮箱');
return false
} else {
return true
}
},
}
}
</script>
<style scoped>
body {
background: #000000 !important;
}
>>> .ant-tabs-bar {
border-bottom: none !important;
}
>>> .ant-btn-primary {
border-color: #5a84fd;
}
.login-box {
width: 350px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.box-header {
display: flex;
}
.box-header-t {
font-weight: bolder;
font-size: 30px;
}
.logo {
width: 44px;
height: 44px;
margin-right: 20px;
margin-left: 43px;
}
>>> .ant-tabs-nav {
width: 350px;
}
>>> .ant-tabs-ink-bar {
left: 52px;
}
>>> .ant-input-affix-wrapper .ant-input {
font-size: 12px !important;
}
.title {
color: #91949c;
padding-top: 15px;
padding-bottom: 35px;
font-size: 13px;
text-align: center;
}
.input {
margin-bottom: 25px;
font-size: 10px;
}
.code-btn {
height: 40px;
margin-left: 30px;
}
.submit-btn {
letter-spacing: 2px;
background: #5a84fd;
width: 100%;
height: 45px;
}
.des {
padding-top: 25px;
font-size: 13px;
text-align: center;
color: #91949c;
letter-spacing: 2px;
}
</style>
================================================
FILE: web-app/src/views/Test.vue
================================================
<template>
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-model-item label="Activity name">
<a-input v-model="form.name" />
</a-form-model-item>
<a-form-model-item label="Activity zone">
<a-select v-model="form.region" placeholder="please select your zone">
<a-select-option value="shanghai">
Zone one
</a-select-option>
<a-select-option value="beijing">
Zone two
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="Activity time">
<a-date-picker
v-model="form.date1"
show-time
type="date"
placeholder="Pick a date"
style="width: 100%;"
/>
</a-form-model-item>
<a-form-model-item label="Instant delivery">
<a-switch v-model="form.delivery" />
</a-form-model-item>
<a-form-model-item label="Activity type">
<a-checkbox-group v-model="form.type">
<a-checkbox value="1" name="type">
Online
</a-checkbox>
<a-checkbox value="2" name="type">
Promotion
</a-checkbox>
<a-checkbox value="3" name="type">
Offline
</a-checkbox>
</a-checkbox-group>
</a-form-model-item>
<a-form-model-item label="Resources">
<a-radio-group v-model="form.resource">
<a-radio value="1">
Sponsor
</a-radio>
<a-radio value="2">
Venue
</a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="Activity form">
<a-input v-model="form.desc" type="textarea" />
</a-form-model-item>
<a-form-model-item :wrapper-col="{ span: 14, offset: 4 }">
<a-button type="primary" @click="onSubmit">
Create
</a-button>
<a-button style="margin-left: 10px;">
Cancel
</a-button>
</a-form-model-item>
</a-form-model>
</template>
<script>
export default {
data() {
return {
labelCol: { span: 4 },
wrapperCol: { span: 14 },
form: {
name: '',
region: undefined,
date1: undefined,
delivery: false,
type: [],
resource: '',
desc: '',
},
};
},
methods: {
onSubmit() {
console.log('submit!', this.form);
},
},
};
</script>
================================================
FILE: web-app/src/views/analyze/In.vue
================================================
<template>
<div class="main" id="main">
</div>
</template>
<script>
import * as echarts from 'echarts/core';
import {
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import {
PieChart
} from 'echarts/charts';
import {
CanvasRenderer
} from 'echarts/renderers';
import {AnalyzeCommodity} from "../../api/inventory";
echarts.use(
[TitleComponent, TooltipComponent, LegendComponent, PieChart, CanvasRenderer]
);
export default {
data() {
return {
commodityList: []
}
},
mounted() {
AnalyzeCommodity(1).then((res) => {
if (res.status) {
let commodityList = res.data
let chartDom = document.getElementById('main');
let myChart = echarts.init(chartDom);
let option;
option = {
title: {
text: '商品入库排行分析',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left',
},
series: [
{
name: '访问来源',
type: 'pie',
radius: '50%',
data: commodityList,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
option && myChart.setOption(option);
}
})
},
methods: {},
}
</script>
<style scoped>
.main {
width: 100%;
height: 500px;
background: #ffffff;
padding: 50px;
}
</style>
================================================
FILE: web-app/src/views/analyze/Out.vue
================================================
<template>
<div class="main" id="main">
</div>
</template>
<script>
import * as echarts from 'echarts/core';
import {
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import {
PieChart
} from 'echarts/charts';
import {
CanvasRenderer
} from 'echarts/renderers';
import {AnalyzeCommodity} from "../../api/inventory";
echarts.use(
[TitleComponent, TooltipComponent, LegendComponent, PieChart, CanvasRenderer]
);
export default {
data() {
return {
commodityList: []
}
},
mounted() {
AnalyzeCommodity(-1).then((res) => {
if (res.status) {
let commodityList = res.data
let chartDom = document.getElementById('main');
let myChart = echarts.init(chartDom);
let option;
option = {
title: {
text: '商品出库排行分析',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left',
},
series: [
{
name: '访问来源',
type: 'pie',
radius: '50%',
data: commodityList,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
option && myChart.setOption(option);
}
})
},
methods: {},
}
</script>
<style scoped>
.main {
width: 100%;
height: 500px;
background: #ffffff;
padding: 50px;
}
</style>
================================================
FILE: web-app/src/views/basics/Commodity.vue
================================================
<template>
<div>
<div style="display: flex">
<a-button size="large" class="editable-add-btn" @click="commodityVisible = true">
<a-icon type="plus"/>
新增商品
</a-button>
<a-input-search
placeholder="请输入商品名"
enter-button="搜索商品"
style="width: 400px;margin-left: 20px"
size="large"
@search="onSearch"
/>
<a-button style="margin-left: 10px" size="large" type="danger" @click="loadTableData">
重置
</a-button>
</div>
<a-table :loading="loading" :columns="columns" :data-source="data" rowKey="id">
<a slot="name" slot-scope="text">{{ text }}</a>
<span slot="customTitle"><a-icon type="smile-o"/> 商品名称</span>
<span slot="action" slot-scope="text, record, index">
<a-button @click="handleUpdate(record)" type="link"><a-icon type="edit"/> Update</a-button>
<a-divider type="vertical"/>
<a-button @click="handleDelete(record,index)" type="link"><a-icon type="delete"/> Delete</a-button>
</span>
</a-table>
<a-modal
title="商品信息"
:closable="false"
:visible="commodityVisible"
>
<a-form-model ref="ruleForm" :model="commodity">
<a-form-model-item ref="name" label="商品名称" prop="name">
<a-input v-model="commodity.name"/>
</a-form-model-item>
<a-form-model-item label="商品单价" prop="price">
<a-input-number id="input" v-model="commodity.price" :min="1"/>
</a-form-model-item>
<a-form-model-item label="描述信息" prop="description">
<a-input v-model="commodity.description" type="textarea"/>
</a-form-model-item>
</a-form-model>
<template slot="footer">
<a-button key="back" @click="commodityVisible = false">
Return
</a-button>
<a-button key="submit" type="primary" :loading="modalLoading" @click="submitCommodity">
Submit
</a-button>
</template>
</a-modal>
</div>
</template>
<script>
import {DeleteCommodityById, FindAllCommodity, SaveCommodity} from "@/api/commodity";
import {SearchCommodity} from "../../api/commodity";
const columns = [
{
dataIndex: 'name',
key: 'name',
slots: {title: 'customTitle'},
scopedSlots: {customRender: 'name'},
},
{
title: '库存数量',
dataIndex: 'count',
key: 'age',
},
{
title: '描述信息',
dataIndex: 'description',
key: 'description',
},
{
title: '入库时间',
dataIndex: 'createAt',
key: 'address',
},
{
title: '商品单价',
key: 'price',
dataIndex: 'price',
scopedSlots: {customRender: 'tags'},
},
{
title: '更多操作',
key: 'action',
scopedSlots: {customRender: 'action'},
},
];
const data = [];
export default {
data() {
return {
commodity: {
name: '',
description: '商品简介',
count: 0,
price: 9.99,
},
loading: false,
modalLoading: false,
commodityVisible: false,
commodityLoading: false,
data: [],
columns,
};
},
mounted() {
this.loadTableData()
},
methods: {
onSearch(value) {
if (value){
this.loading = true
SearchCommodity(value).then((res) => {
console.log(res)
if (res.data.length === 0) {
this.$message.warn("未搜索到任何数据")
setTimeout(() => {
this.loading = false
this.data = res.data
}, 600)
} else {
setTimeout(() => {
this.$message.success("搜索到" + res.data.length + "个商品")
this.loading = false
this.data = res.data
}, 600)
}
})
}else {
this.$message.warn("请输入搜索内容")
}
},
loadTableData() {
this.loading = true
FindAllCommodity().then((res) => {
setTimeout(() => {
this.loading = false
this.data = res.data
}, 600)
})
},
submitCommodity() {
this.modalLoading = true
SaveCommodity(this.commodity).then((res) => {
if (res.status) {
setTimeout(() => {
this.modalLoading = false
this.commodityVisible = false
this.$message.success('商品信息提交成功');
this.loadTableData()
}, 600)
} else {
setTimeout(() => {
this.modalLoading = false
}, 600)
}
})
},
handleDelete(r, index) {
DeleteCommodityById(r.id).then((res) => {
if (res.status) this.$message.success('商品信息删除成功');
this.loadTableData()
})
console.log(index)
},
handleUpdate(r) {
this.commodity = r
this.commodityVisible = true
},
},
};
</script>
<style scoped>
.editable-add-btn {
margin-bottom: 15px;
}
</style>
================================================
FILE: web-app/src/views/basics/Company.vue
================================================
<template>
<div>
<a-input-search
placeholder="请输入公司名"
enter-button="搜索来往公司"
style="width: 400px;margin-bottom: 20px"
size="large"
@search="onSearch"
/>
<a-button style="margin-left: 10px" size="large" type="danger" @click="loadTableData">
重置
</a-button>
<a-table :loading="loading" :columns="columns" :data-source="data" rowKey="id">
<a slot="company" slot-scope="company">{{ company }}</a>
<span slot="customTitle"><a-icon type="bank"/> 公司名称</span>
</a-table>
</div>
</template>
<script>
import {FindAllSale, SearchCompany} from "../../api/sale";
const columns = [
{
dataIndex: 'company',
key: 'company',
slots: {title: 'customTitle'},
scopedSlots: {customRender: 'company'},
},
{
title: '预留电话',
key: 'phone',
dataIndex: 'phone',
},
{
title: '时间',
dataIndex: 'createAt',
key: 'createAt',
},
];
const data = [];
export default {
data() {
return {
loading: false,
data: [],
columns,
};
},
mounted() {
this.loadTableData()
},
methods: {
onSearch(value) {
if (value) {
this.loading = true
SearchCompany(value).then((res) => {
console.log(res)
if (res.data.length === 0) {
this.$message.warn("未搜索到任何数据")
setTimeout(() => {
this.loading = false
this.data = res.data
}, 600)
} else {
setTimeout(() => {
this.$message.success("搜索到" + res.data.length + "个公司")
this.loading = false
this.data = res.data
}, 600)
}
})
} else {
this.$message.warn("请输入搜索内容")
}
},
loadTableData() {
this.loading = true
FindAllSale().then((res) => {
setTimeout(() => {
this.loading = false
this.data = res.data
}, 600)
})
}
},
};
</script>
<style scoped>
.editable-add-btn {
margin-bottom: 15px;
}
</style>
================================================
FILE: web-app/src/views/basics/Details.vue
================================================
<template>
<div class="main">
<div class="header">
<router-link to="/warehouse">
<a-icon type="arrow-left" style="padding-right: 5px"/>
返回上一页
</router-link>
</div>
<div style="display: flex">
<a-button class="editable-btn" @click="handleSubmit('in')">
入库商品
</a-button>
<a-button class="editable-btn" @click="handleSubmit('out')">
出库商品
</a-button>
<download-excel
class="export-excel-wrapper"
:data="data"
:fields="json_fields"
name="库存报表.xls">
<a-button class="editable-btn">
<a-icon type="cloud-download"/>
下载库存报表 Excel
</a-button>
</download-excel>
<a-button class="editable-btn" @click="recordVisible = true">
<a-icon type="retweet"/>
出入库记录 Excel
</a-button>
</div>
<a-table :loading="loading" :columns="columns" :data-source="data" rowKey="id">
<a slot="name" slot-scope="text">{{ text }}</a>
<span slot="customTitle"><a-icon type="smile-o"/> 商品名</span>
<span slot="count" slot-scope="count">
<a-tag color="#108ee9">{{ count }}</a-tag>
</span>
</a-table>
<a-modal
title="入库 | 出库"
:closable="false"
:visible="visible"
@ok="submit"
@cancel="visible = false"
>
<a-form-model :model="form">
<a-form-model-item label="请选商品">
<a-select v-model="selectIndex" placeholder="请选择入库的商品">
<a-select-option :value="index" v-for="(item, index) in commodityList" :key="index">
{{ item.name }}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="商品数量">
<a-input-number id="inputNumber" v-model="form.count" :min="1"/>
</a-form-model-item>
<a-form-model-item label="备注">
<a-input :rows="4" v-model="form.description" type="textarea"/>
</a-form-model-item>
</a-form-model>
</a-modal>
<a-modal
title="出入库记录"
width="80%"
:visible="recordVisible"
:footer="null"
@cancel="recordVisible = false"
>
<InventoryRecords :warehouse-id="id"/>
</a-modal>
</div>
</template>
<script>
import {FindAllCommodity} from "../../api/commodity";
import {FindAllInventory, InAndOut} from "../../api/inventory";
import InventoryRecords from "../../components/InventoryRecords";
const columns = [
{
title: '商品ID',
dataIndex: 'id',
key: 'id',
width: '50%'
},
{
dataIndex: 'name',
key: 'name',
slots: {title: 'customTitle'},
scopedSlots: {customRender: 'name'},
},
{
title: '库存数量',
dataIndex: 'count',
key: 'count',
scopedSlots: {customRender: 'count'},
},
];
export default {
components: {InventoryRecords},
data() {
return {
json_fields: {
"商品ID": "cid",
"商品名称": "name",
"库存盘点数量": "count",
},
id: this.$route.params.id,
loading: false,
visible: false,
recordVisible: false,
selectIndex: 0,
commodityVisible: false,
data: [],
columns,
commodityList: [],
submitType: '',
form: {
wid: this.$route.params.id,
cid: '',
name: '',
description: '',
count: 50,
},
}
},
mounted() {
this.loadData()
FindAllCommodity().then((res) => {
if (res.status) this.commodityList = res.data
})
},
methods: {
loadData() {
this.loading = true
FindAllInventory(this.$route.params.id).then((res) => {
setTimeout(() => {
this.data = res.data
this.loading = false
}, 500)
})
},
handleSubmit(type) {
this.submitType = type
this.visible = true
},
submit() {
this.form.cid = this.commodityList[this.selectIndex].id
this.form.name = this.commodityList[this.selectIndex].name
InAndOut(this.submitType, this.form).then((res) => {
if (res.status) this.$message.success("操作成功")
this.visible = false
this.loadData()
})
},
}
}
</script>
<style scoped>
.main {
background: #ffffff;
padding: 30px;
}
.header {
font-size: 18px;
margin-bottom: 40px;
}
a {
color: #000000;
}
.header a:hover {
color: #5a84fd;
}
.editable-btn {
margin-bottom: 20px;
margin-right: 10px;
}
.in-icon {
transform: rotate(270deg);
}
</style>
================================================
FILE: web-app/src/views/basics/Employee.vue
================================================
<template>
<div>
<a-button size="large" class="editable-add-btn" @click="visible = true">
<a-icon type="plus"/>
新增员工
</a-button>
<a-table :loading="loading" :columns="columns" :data-source="data" bordered rowKey="id">
<template
v-for="col in ['name', 'gender', 'phone','idCard','department', 'address']"
:slot="col"
slot-scope="text, record, index"
>
<div :key="col">
<a-input
v-if="record.editable"
style="margin: -5px 0"
:value="text"
@change="e => handleChange(e.target.value, record.id, col)"
/>
<template v-else>
{{ text }}
</template>
</div>
</template>
<template slot="operation" slot-scope="text, record, index">
<div class="editable-row-operations">
<span v-if="record.editable">
<a @click="() => save(record.id, index)">保存</a>
<a-popconfirm title="Sure to cancel?" @confirm="() => cancel(record.id)">
<a>取消</a>
</a-popconfirm>
</span>
<span v-else>
<a :disabled="editingKey !== ''" @click="() => edit(record.id)">编辑</a>
</span>
<a-popconfirm placement="top" ok-text="Yes" cancel-text="No" @confirm="confirm(record.id)">
<template slot="title">
<p> 删除驾驶员信息后将无法恢复,确定要删除吗? </p>
</template>
<a-button type="link">删除</a-button>
</a-popconfirm>
</div>
</template>
</a-table>
<a-modal
title="Title"
:visible="visible"
@ok="submitForm"
@cancel="visible = false"
>
<a-form-model :model="form">
<a-form-model-item label="姓名">
<a-input v-model="form.name" placeholder="请输入司机姓名"/>
</a-form-model-item>
<a-form-model-item label="身份证号">
<a-input v-model="form.idCard" placeholder="请输入司机身份证信息"/>
</a-form-model-item>
<a-form-model-item label="联系方式">
<a-input v-model="form.phone" placeholder="请输入手机号码"/>
</a-form-model-item>
<a-form-model-item label="所在仓库">
<a-select v-model="form.department" v-for="(item,index) in warehouseList" placeholder="请选择员工所在仓库">
<a-select-option :value="item.name">{{ item.name }}</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="性别">
<a-radio-group v-model="form.gender">
<a-radio value="男性">男性</a-radio>
<a-radio value="女性">女性</a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="家庭住址">
<a-input v-model="form.address" type="textarea"/>
</a-form-model-item>
</a-form-model>
</a-modal>
</div>
</template>
<script>
import {DeleteEmployeeById, FindAllEmployee, SaveEmployee} from "@/api/employee";
import {FindAllWarehouse} from "../../api/warehouse";
const columns = [
{
title: '名字',
dataIndex: 'name',
scopedSlots: {customRender: 'name'},
},
{
title: '性别',
dataIndex: 'gender',
scopedSlots: {customRender: 'gender'},
},
{
title: '所在部门',
dataIndex: 'department',
scopedSlots: {customRender: 'department'},
},
{
title: '联系电话',
dataIndex: 'phone',
scopedSlots: {customRender: 'phone'},
},
{
title: '身份证',
dataIndex: 'idCard',
scopedSlots: {customRender: 'idCard'},
},
{
title: '家庭住址',
dataIndex: 'address',
scopedSlots: {customRender: 'address'},
},
{
title: '操作',
dataIndex: 'operation',
scopedSlots: {customRender: 'operation'},
},
];
export default {
data() {
return {
loading: false,
warehouseList: [],
form: {
cacheData: [],
name: '',
gender: '男性',
phone: '',
department: '',
address: '',
idCard: '',
},
visible: false,
data: [],
columns,
editingKey: '',
};
},
mounted() {
this.loadTableData()
},
methods: {
findAllWarehouse() {
FindAllWarehouse().then((res) => {
this.warehouseList = res.data
})
},
loadTableData() {
this.loading = true
this.findAllWarehouse()
FindAllEmployee().then((res) => {
if (res.status) {
this.data = res.data
this.cacheData = res.data.map(item => ({...item}))
}
setTimeout(() => {
this.loading = false
}, 600)
})
},
submitForm() {
SaveEmployee(this.form).then((res) => {
if (res.status) this.$message.success('员工信息提交成功');
this.visible = false
this.loadTableData()
})
},
handleChange(value, id, column) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
if (target) {
target[column] = value;
this.data = newData;
}
},
edit(id) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
this.editingKey = id;
if (target) {
target.editable = true;
this.data = newData;
}
},
save(id, index) {
const newData = [...this.data];
const newCacheData = [...this.cacheData];
const target = newData.filter(item => id === item.id)[0];
const targetCache = newCacheData.filter(item => id === item.id)[0];
if (target && targetCache) {
delete target.editable;
this.data = newData;
Object.assign(targetCache, target);
this.cacheData = newCacheData;
}
this.editingKey = '';
SaveEmployee(newData[index]).then((res) => {
if (res.status) this.$message.success("信息保存成功")
})
},
cancel(id) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
this.editingKey = '';
if (target) {
Object.assign(target, this.cacheData.filter(item => id === item.id)[0]);
delete target.editable;
this.data = newData;
}
},
confirm(id) {
DeleteEmployeeById(id).then((res) => {
if (res.status) this.$message.success('Delete success');
this.loadTableData()
})
},
},
};
</script>
<style scoped>
.editable-add-btn {
margin-bottom: 15px;
}
.editable-row-operations a {
margin-right: 8px;
}
</style>
================================================
FILE: web-app/src/views/basics/Warehouse.vue
================================================
<template>
<div>
<a-spin size="large" :spinning="spinning">
<a-row :gutter="20">
<a-col :span="8" class="item">
<a-card hoverable class="add-item" @click="visible = true">
<a-icon type="plus"/>
添加仓库
</a-card>
</a-col>
<a-col :span="8" v-for="(item, index) in this.data" :key="index" class="item">
<a-card hoverable>
<template slot="actions" class="ant-card-actions">
<span>负责人: {{ item.principle }}</span>
<span>
<router-link :to="'/warehouse/' + item.id">
<a-icon type="bar-chart"/> 库存管理
</router-link>
</span>
</template>
<a-card-meta
:title="item.name"
:description="'ID: ' + item.id">
<img class="image" slot="avatar" :src="imgList[Math.floor(Math.random() * 3)]"
alt=""/>
</a-card-meta>
</a-card>
</a-col>
</a-row>
</a-spin>
<a-modal
title="新增仓库"
:visible="visible"
@ok="submit"
@cancel="visible = false"
>
<a-input v-model="form.name" addon-before="仓库名称" style="width: 300px;margin-bottom: 20px"></a-input>
<a-input v-model="form.principle" addon-before="仓库负责人" style="width: 300px"></a-input>
</a-modal>
</div>
</template>
<script>
import {FindAllWarehouse, SaveWarehouse} from "@/api/warehouse";
export default {
name: "WareHouse",
data() {
return {
visible: false,
form: {id: '', principle: '', name: ''},
spinning: false,
data: [],
imgList: [
require('../../assets/warehouse0.svg'),
require('../../assets/warehouse1.svg'),
require('../../assets/warehouse2.svg'),]
}
},
mounted() {
this.loadData()
},
methods: {
loadData() {
this.spinning = true
FindAllWarehouse().then((res) => {
if (res.status) this.data = res.data
setTimeout(() => {
this.spinning = false
}, 600)
})
},
submit() {
SaveWarehouse(this.form).then((res) => {
if (res.status) this.$message.success("添加成功")
this.visible = false
this.loadData()
})
}
},
}
</script>
<style scoped>
.add-item {
text-align: center;
line-height: 120px;
min-height: 120px;
border: 1px dashed #91949c;
}
.add-item:hover {
border: 1px dashed #5a84fd;
color: #5a84fd;
}
.item {
margin-bottom: 20px;
}
.image {
width: 80px;
height: 80px;
}
</style>
================================================
FILE: web-app/src/views/delivery/Create.vue
================================================
<template>
<div class="main">
<a-steps :current="current">
<a-step title="填写申请信息"></a-step>
<a-step title="确认配送信息"/>
<a-step title="完成申请"/>
</a-steps>
<div class="steps-content">
<div v-if="current === 0">
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-model-item label="选择司机" required>
<a-select v-model="selectDriverIndex" placeholder="请选择配送司机">
<a-select-option :value="index" v-for="(item, index) in drivers" :key="index" :disabled="item.driving">
{{ item.name }}
<i class="dis" v-if="item.driving">
<a-icon type="close-circle"/>
正在途中</i>
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="选择运输车辆" required>
<a-select v-model="selectVehicleIndex" placeholder="请选择配送车辆">
<a-select-option :value="index" v-for="(item, index) in vehicles" :key="index" :disabled="item.driving">
{{ item.type }} : {{ item.number }}
<i class="dis" v-if="item.driving">
<a-icon type="close-circle"/>
正在途中</i>
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="预计交货时间" required>
<a-date-picker
v-model="form.time"
show-time
type="date"
placeholder="选择日期"
style="width: 100%;"
/>
</a-form-model-item>
<a-form-model-item label="加急处理">
<a-switch v-model="form.urgent"/>
</a-form-model-item>
<a-form-model-item label="注意事项">
<a-checkbox-group v-model="form.cares">
<a-checkbox value="冰柜冷藏" name="type">
冰柜冷藏
</a-checkbox>
<a-checkbox value="注意易碎" name="type">
注意易碎
</a-checkbox>
<a-checkbox value="防止高温" name="type">
防止高温
</a-checkbox>
</a-checkbox-group>
</a-form-model-item>
<a-form-model-item label="客户电话" required>
<a-input v-model="form.phone"/>
</a-form-model-item>
<a-form-model-item label="客户地址" required>
<a-input v-model="form.address" type="textarea" :rows="4"/>
</a-form-model-item>
<a-form-model-item :wrapper-col="{ span: 14, offset: 6 }">
<a-button type="primary" @click="next">
下一步
</a-button>
</a-form-model-item>
</a-form-model>
</div>
<div v-if="current === 1" class="check">
<p>送货司机: {{ form.driver }}</p>
<p>车牌号码: {{ form.number }}</p>
<p>加急处理: {{ form.urgent }}</p>
<p>注意事项: {{ form.care }}</p>
<p>客户电话: {{ form.phone }}</p>
<p>客户地址: {{ form.address }}</p>
<p>预计送达: {{ form.time }}</p>
<a-button type="danger" style="margin-right: 20px" :loading="loading" @click="submit">提交</a-button>
<a-button @click="current = 0">上一步</a-button>
</div>
<div v-if="current === 2">
<a-result
status="success"
title="Submitted Successfully"
sub-title="Please wait for the administrator to review the delivery request."
>
<template #extra>
<router-link to="/delivery/list">
<a-button key="console" type="primary">
Go Console
</a-button>
</router-link>
<a-button key="buy" @click="current = 0">
Submit Again
</a-button>
</template>
</a-result>
</div>
</div>
</div>
</template>
<script>
import {FindAllCanUse, SaveDistribution} from "../../api/distribution";
export default {
data() {
return {
loading: false,
labelCol: {span: 6},
wrapperCol: {span: 12},
current: 0,
selectDriverIndex: 0,
selectVehicleIndex: 0,
drivers: [],
vehicles: [],
form: {
id: '',
did: '',
vid: '',
driver: '',
number: '',
phone: '',
address: '',
urgent: false,
cares: [],
care: '',
time: '',
status: 0,
},
}
},
mounted() {
FindAllCanUse().then((res) => {
if (res.status) {
this.drivers = res.data.drivers
this.vehicles = res.data.vehicles
}
console.log(this.drivers)
console.log(this.vehicles)
})
},
methods: {
next() {
let care = ''
for (let i = 0; i < this.form.cares.length; i++) {
care += this.form.cares[i] + ", "
}
this.form.driver = this.drivers[this.selectDriverIndex].name
this.form.did = this.drivers[this.selectDriverIndex].id
this.form.number = this.vehicles[this.selectVehicleIndex].number
this.form.vid = this.vehicles[this.selectVehicleIndex].id
this.form.care = care
this.current = 1
},
submit() {
this.loading = true
SaveDistribution(this.form).then((res) => {
if (res.status) {
setTimeout(() => {
this.loading = false
this.current = 2
this.$message.success("提交成功,请等待审核")
}, 800)
} else {
setTimeout(() => {
this.loading = false
this.$message.error("提交失败")
}, 800)
}
})
},
},
}
</script>
<style scoped>
.main {
padding: 50px 180px;
background: #ffffff;
}
.steps-content {
margin-top: 40px;
}
.check {
padding-left: 200px;
}
.check p {
padding-bottom: 10px;
}
.dis {
padding-left: 10px;
font-size: 10px;
letter-spacing: 1px;
color: red;
}
</style>
================================================
FILE: web-app/src/views/delivery/List.vue
================================================
<template>
<div>
<a-table :loading="loading" :columns="columns" :data-source="data" bordered rowKey="id">
<span slot="status" slot-scope="status">
<a-tag v-if="status===0" color="#f50">等待审核</a-tag>
<a-tag v-if="status===1" color="#87d068">正在运输</a-tag>
<a-tag v-if="status===2" color="#2db7f5">配送完成</a-tag>
</span>
<template
v-for="col in ['phone','address']"
:slot="col"
slot-scope="text, record, index"
>
<div :key="col">
<a-input
v-if="record.editable"
style="margin: -5px 0"
:value="text"
@change="e => handleChange(e.target.value, record.id, col)"
/>
<template v-else>
{{ text }}
</template>
</div>
</template>
<template slot="operation" slot-scope="text, record, index">
<div class="editable-row-operations">
<span v-if="record.editable">
<a @click="() => save(record.id, index)">保存</a>
<a-popconfirm title="Sure to cancel?" @confirm="() => cancel(record.id)">
<a>取消</a>
</a-popconfirm>
</span>
<span v-else>
<a :disabled="editingKey !== ''" @click="() => edit(record.id)">编辑</a>
</span>
<a-button @click="review(index)" type="link" v-if="record.status===0">审核</a-button>
<a-button @click="review(index)" type="link" v-if="record.status===1">配送</a-button>
<a-button @click="review(index)" type="link" v-if="record.status===2">查看</a-button>
</div>
</template>
</a-table>
<a-modal
title="Title"
:visible="visible"
@ok="submitForm"
@cancel="visible = false"
>
<a-form-model :model="form">
<a-form-model-item label="姓名">
<a-input v-model="form.name" placeholder="请输入司机姓名"/>
</a-form-model-item>
<a-form-model-item label="身份证号">
<a-input v-model="form.idCard" placeholder="请输入司机身份证信息"/>
</a-form-model-item>
<a-form-model-item label="联系方式">
<a-input v-model="form.phone" placeholder="请输入手机号码"/>
</a-form-model-item>
<a-form-item label="驾照信息">
<a-row :gutter="20">
<a-col :span="12">
<a-input v-model="form.license" addon-before="驾驶证" default-value="0571"/>
</a-col>
<a-col :span="7">
<a-input-number v-model="form.score" addon-before="分数" default-value="12" :min="0" :max="12"/>
</a-col>
</a-row>
</a-form-item>
<a-form-model-item label="性别">
<a-radio-group v-model="form.gender">
<a-radio value="男性">男性</a-radio>
<a-radio value="女性">女性</a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="家庭住址">
<a-input v-model="form.address" type="textarea"/>
</a-form-model-item>
</a-form-model>
</a-modal>
<a-modal
title="Title"
:visible="visible2"
width="60%"
:footer="null"
@cancel="visible2 = false"
>
<a-steps :current="select.status" style="padding: 50px">
<a-step title="确认信息无误"/>
<a-step title="开始配送"/>
<a-step title="配送完成"/>
</a-steps>
<div class="content">
<div v-if="select.status === 0" class="check">
<p>送货司机: {{ select.driver }}</p>
<p>车牌号码: {{ select.number }}</p>
<p>加急处理: {{ select.urgent }}</p>
<p>注意事项: {{ select.care }}</p>
<p>客户电话: {{ select.phone }}</p>
<p>客户地址: {{ select.address }}</p>
<p>预计送达: {{ select.time }}</p>
<a-button type="danger" style="margin-right: 20px" :loading="loading" @click="agree">通过</a-button>
<a-button @click="visible2 = false">不通过</a-button>
</div>
<div v-if="select.status === 1">
<a-result
status="success"
title="Successfully passed the audit!"
>
<template #extra>
<a-button @click="service" key="console" type="primary">
已送达目的地
</a-button>
</template>
</a-result>
</div>
<div v-if="select.status === 2">
<a-result
status="success"
title="运输订单已成功送达"
>
<template #extra>
<a-button @click="visible2 = false" key="console" type="primary">
确定
</a-button>
</template>
</a-result>
</div>
</div>
</a-modal>
</div>
</template>
<script>
import {FindAllDistribution, SaveDistribution} from "../../api/distribution";
const columns = [
{
title: '司机',
dataIndex: 'driver',
scopedSlots: {customRender: 'driver'},
},
{
title: '车牌号',
dataIndex: 'number',
scopedSlots: {customRender: 'number'},
},
{
title: '客户电话',
dataIndex: 'phone',
scopedSlots: {customRender: 'phone'},
},
{
title: '客户地址',
dataIndex: 'address',
scopedSlots: {customRender: 'address'},
},
{
title: '注意事项',
dataIndex: 'care',
scopedSlots: {customRender: 'care'},
},
{
title: '预计送达',
dataIndex: 'time',
scopedSlots: {customRender: 'time'},
},
{
title: '当前状态',
dataIndex: 'status',
scopedSlots: {customRender: 'status'},
},
{
title: '操作',
dataIndex: 'operation',
scopedSlots: {customRender: 'operation'},
},
];
export default {
data() {
return {
select: {},
loading: false,
form: {
cacheData: [],
name: '',
gender: '男性',
phone: '',
address: '',
idCard: '',
license: '',
score: 12,
},
visible: false,
visible2: false,
data: [],
columns,
editingKey: '',
};
},
mounted() {
this.loadTableData()
},
methods: {
loadTableData() {
this.loading = true
FindAllDistribution().then((res) => {
if (res.status) {
this.data = res.data
this.cacheData = res.data.map(item => ({...item}))
}
setTimeout(() => {
this.loading = false
}, 600)
})
},
submitForm() {
SaveDistribution(this.form).then((res) => {
if (res.status) this.$message.success('司机信息提交成功');
this.visible = false
this.loadTableData()
})
},
handleChange(value, id, column) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
if (target) {
target[column] = value;
this.data = newData;
}
},
edit(id) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
this.editingKey = id;
if (target) {
target.editable = true;
this.data = newData;
}
},
save(id, index) {
const newData = [...this.data];
const newCacheData = [...this.cacheData];
const target = newData.filter(item => id === item.id)[0];
const targetCache = newCacheData.filter(item => id === item.id)[0];
if (target && targetCache) {
delete target.editable;
this.data = newData;
Object.assign(targetCache, target);
this.cacheData = newCacheData;
}
this.editingKey = '';
SaveDistribution(newData[index]).then((res) => {
if (res.status) this.$message.success("信息保存成功")
})
},
cancel(id) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
this.editingKey = '';
if (target) {
Object.assign(target, this.cacheData.filter(item => id === item.id)[0]);
delete target.editable;
this.data = newData;
}
},
review(index) {
this.select = this.data[index]
this.visible2 = true
},
agree() {
this.select.status = 1
SaveDistribution(this.select)
},
service(){
this.select.status = 2
SaveDistribution(this.select)
},
},
};
</script>
<style scoped>
.editable-add-btn {
margin-bottom: 15px;
}
.editable-row-operations a {
margin-right: 8px;
}
.content {
padding: 50px 0;
}
.check {
padding-left: 200px;
}
.check p {
padding-bottom: 20px;
}
</style>
================================================
FILE: web-app/src/views/error/403.vue
================================================
<template>
<a-result status="403" title="403" sub-title="Sorry, you are not authorized to access this page.">
<template #extra>
<a-button type="primary" @click="clickBtn" style="letter-spacing: 1px">
<a-icon type="enter" />Return
</a-button>
</template>
</a-result>
</template>
<script>
export default {
data() {
return {};
},
methods: {
clickBtn() {
this.$router.go(-1)
},
}
};
</script>
================================================
FILE: web-app/src/views/error/404.vue
================================================
<template>
<a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist.">
<template #extra>
<a-button type="primary" @click="clickBtn" style="letter-spacing: 1px">
<a-icon type="enter" />Return
</a-button>
</template>
</a-result>
</template>
<script>
export default {
data() {
return {};
},
methods: {
clickBtn() {
this.$router.go(-1)
},
}
};
</script>
================================================
FILE: web-app/src/views/error/500.vue
================================================
<template>
<a-result status="500" title="500" sub-title="Sorry, the server is wrong.">
<template #extra>
<a-button type="primary" @click="clickBtn" style="letter-spacing: 1px">
<a-icon type="enter" />Return
</a-button>
</template>
</a-result>
</template>
<script>
export default {
data() {
return {};
},
methods: {
clickBtn() {
this.$router.go(-1)
},
}
};
</script>
================================================
FILE: web-app/src/views/sale/Create.vue
================================================
<template>
<div class="main">
<a-steps :current="current">
<a-step title="填写信息"></a-step>
<a-step title="确认信息"/>
<a-step title="完成"/>
</a-steps>
<div class="steps-content">
<div v-if="current === 0">
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-model-item label="公司名称" required>
<a-input v-model="form.company"/>
</a-form-model-item>
<a-form-model-item label="打款账号" required>
<a-input v-model="form.number"/>
</a-form-model-item>
<a-form-model-item label="售出商品" required>
<a-select v-model="selectIndex" placeholder="请选择商品">
<a-select-option :value="index" v-for="(item, index) in commodityList" :key="index">
{{ item.name }}
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="商品数量" required>
<a-input-number v-model="form.count"/>
</a-form-model-item>
<a-form-model-item label="预留电话" required>
<a-input v-model="form.phone"/>
</a-form-model-item>
<a-form-model-item label="备注信息" required>
<a-input v-model="form.description" type="textarea" :rows="4"/>
</a-form-model-item>
<a-form-model-item :wrapper-col="{ span: 14, offset: 6 }">
<a-button type="primary" @click="next">
下一步
</a-button>
</a-form-model-item>
</a-form-model>
</div>
<div v-if="current === 1" class="check">
<p>收货公司: {{ form.company }}</p>
<p>打款账号: {{ form.number }}</p>
<p>售出商品: {{ form.commodity }}</p>
<p>商品数量: {{ form.count }}</p>
<p>预留电话: {{ form.phone }}</p>
<p>备注信息: {{ form.description }}</p>
<a-divider orientation="right">
金额总计: {{ form.price }}
</a-divider>
<a-button type="danger" style="margin-right: 20px" :loading="loading" @click="submit">提交</a-button>
<a-button @click="current = 0">上一步</a-button>
</div>
<div v-if="current === 2">
<a-result
status="success"
title="Submitted Successfully"
sub-title="Please wait for the administrator to review the delivery request."
>
<template #extra>
<router-link to="/sale/record">
<a-button key="console" type="primary">
Go Back
</a-button>
</router-link>
<a-button key="buy" @click="current = 0">
Submit Again
</a-button>
</template>
</a-result>
</div>
</div>
</div>
</template>
<script>
import {FindAllCommodity} from "../../api/commodity";
import {SaveSale} from "../../api/sale";
export default {
data() {
return {
loading: false,
labelCol: {span: 6},
wrapperCol: {span: 12},
current: 0,
selectIndex: 0,
drivers: [],
vehicles: [],
commodityList: [],
form: {
company: '',
number: '',
commodity: '',
count: 50,
price: 0,
phone: '',
description: '',
},
}
},
mounted() {
FindAllCommodity().then((res) => {
if (res.status) this.commodityList = res.data
})
},
methods: {
next() {
let commodity = this.commodityList[this.selectIndex]
this.form.price = this.form.count * commodity.price
this.form.commodity = commodity.name
console.log(this.form)
this.current = 1
},
submit() {
this.loading = true
SaveSale(this.form).then((res) => {
if (res.status) {
setTimeout(() => {
this.loading = false
this.current = 2
this.$message.success("提交成功")
}, 800)
} else {
setTimeout(() => {
this.loading = false
this.$message.error("提交失败")
}, 800)
}
})
},
},
}
</script>
<style scoped>
.main {
padding: 50px 180px;
background: #ffffff;
}
.steps-content {
margin-top: 40px;
}
.check {
padding-left: 200px;
}
.check p {
padding-bottom: 10px;
}
.dis {
padding-left: 10px;
font-size: 10px;
letter-spacing: 1px;
color: red;
}
</style>
================================================
FILE: web-app/src/views/sale/Record.vue
================================================
<template>
<div>
<a-table :loading="loading" :columns="columns" :data-source="data" rowKey="id">
<a slot="company" slot-scope="company">{{ company }}</a>
<span slot="customTitle"><a-icon type="bank" /> 公司名称</span>
<span slot="action" slot-scope="text, record, index">
<a-tag color="red" v-if="!record.pay">等待结款</a-tag>
<a-tag color="green" v-if="record.pay">结款完成</a-tag>
<a-button v-if="!record.pay" type="link" @click="confirm(record, index)">结款</a-button>
</span>
</a-table>
</div>
</template>
<script>
import {FindAllSale, SaveSale} from "../../api/sale";
const columns = [
{
dataIndex: 'company',
key: 'company',
slots: {title: 'customTitle'},
scopedSlots: {customRender: 'company'},
},
{
title: '打款帐号',
dataIndex: 'number',
key: 'number',
},
{
title: '商品',
dataIndex: 'commodity',
key: 'commodity',
},
{
title: '数量',
dataIndex: 'count',
key: 'count',
},
{
title: '总计',
dataIndex: 'price',
key: 'price',
},
{
title: '预留电话',
key: 'phone',
dataIndex: 'phone',
},
{
title: '备注',
dataIndex: 'description',
key: 'description',
},
{
title: '开票时间',
dataIndex: 'createAt',
key: 'createAt',
},
{
title: '更多操作',
key: 'action',
scopedSlots: {customRender: 'action'},
},
];
const data = [];
export default {
data() {
return {
loading: false,
data: [],
columns,
};
},
mounted() {
this.loadTableData()
},
methods: {
loadTableData() {
this.loading = true
FindAllSale().then((res) => {
setTimeout(() => {
this.loading = false
this.data = res.data
}, 600)
})
},
confirm(record, index) {
let that = this
this.$confirm({
title: '销售结款',
content: '我已确定' + record.company + '的销售金额 ¥' + record.price + '已经打入账户!',
okText: '确认',
cancelText: '取消',
onOk() {
that.data[index].pay = true
SaveSale(that.data[index]).then((res) => {
if (res.status) that.$message.success("销售结款成功")
})
},
});
},
},
};
</script>
<style scoped>
.editable-add-btn {
margin-bottom: 15px;
}
</style>
================================================
FILE: web-app/src/views/system/Admin.vue
================================================
<template>
<div>
<a-button size="large" class="editable-add-btn" @click="addVisible = true">
<a-icon type="plus"/>
添加操作员
</a-button>
<a-table :columns="columns" :data-source="admins" rowKey="id" :loading="loading">
<a slot="email" slot-scope="email">{{ email }}</a>
<span slot="customTitle"><a-icon type="smile-o"/> 邮箱</span>
<span slot="tags" slot-scope="tags">
<a-tag
v-for="tag in tags"
:key="tag"
:color="tag === 'loser' ? 'volcano' : tag.length > 5 ? 'geekblue' : 'green'"
>
{{ tag.toUpperCase() }}
</a-tag>
</span>
<span slot="action" slot-scope="text, record, index">
<a-dropdown>
<a class="ant-dropdown-link" @click="e => e.preventDefault()">Hover me <a-icon type="down"/></a>
<a-menu slot="overlay">
<a-menu-item>
<a-button type="link" @click="updateEmail(index)"><a-icon type="mail"/> 邮箱修改</a-button>
</a-menu-item>
<a-menu-item>
<a-button type="link" @click="updatePassword(index)"><a-icon type="lock"/> 密码修改</a-button>
</a-menu-item>
<a-menu-item>
<a-button type="link" @click="updateRoles(index)"><a-icon type="gateway"/> 权限修改</a-button>
</a-menu-item>
<a-menu-item>
<a-button type="link" @click="remove(record.id)"><a-icon type="delete"/> 删除</a-button>
</a-menu-item>
</a-menu>
</a-dropdown>
</span>
</a-table>
<a-modal
title="添加操作员"
:visible="addVisible"
@ok="submit"
@cancel="addVisible = false"
>
<a-form-model :model="selectAdmin">
<a-form-model-item label="邮箱">
<a-input v-model="selectAdmin.email"/>
</a-form-model-item>
<a-form-model-item label="密码">
<a-input v-model="selectAdmin.password"/>
</a-form-model-item>
</a-form-model>
</a-modal>
<a-modal
title="密码修改"
:visible="passwordVisible"
@ok="submit"
@cancel="passwordVisible = false"
>
<a-form-model :model="selectAdmin">
<a-form-model-item label="密码">
<a-input v-model="selectAdmin.password"/>
</a-form-model-item>
</a-form-model>
</a-modal>
<a-modal
title="邮箱修改"
:visible="emailVisible"
@ok="submit"
@cancel="emailVisible = false"
>
<a-form-model :model="selectAdmin">
<a-form-model-item label="绑定邮箱">
<a-input v-model="selectAdmin.email"/>
</a-form-model-item>
</a-form-model>
</a-modal>
<a-modal
title="权限修改"
width="500px"
:visible="rolesVisible"
@ok="submitRoles"
@cancel="rolesVisible = false"
>
<a-select
v-model="selectRoles"
mode="multiple"
style="width: 100%"
placeholder="select one country"
option-label-prop="label"
>
<a-select-option :value="item.value"
:label="item.value"
v-for="(item ,index) in roles"
:key="index">
<span role="img" :aria-label="item.value">🇨🇳</span>{{ item.value + ' (描述: ' + item.description + ')' }}
</a-select-option>
</a-select>
</a-modal>
</div>
</template>
<script>
import {DeleteAdmin, FindAllAdmin, SaveAdmin} from "../../api/admin";
import {FindAllRole} from "../../api/role";
const columns = [
{
dataIndex: 'email',
key: 'email',
slots: {title: 'customTitle'},
scopedSlots: {customRender: 'email'},
},
{
title: '密码',
dataIndex: 'password',
key: 'password',
},
{
title: '权限',
dataIndex: 'roles',
key: 'roles',
},
{
title: '添加日期',
key: 'createAt',
dataIndex: 'createAt',
scopedSlots: {customRender: 'createAt'},
},
{
title: 'Action',
key: 'action',
scopedSlots: {customRender: 'action'},
},
];
export default {
data() {
return {
roles: [],
selectRoles: [],
admins: [],
loading: false,
addVisible: false,
emailVisible: false,
passwordVisible: false,
rolesVisible: false,
columns,
selectAdmin: {},
};
},
mounted() {
this.load()
},
methods: {
load() {
this.loading = true
FindAllRole().then((res) => {
if (res.status) this.roles = res.data
})
FindAllAdmin().then((res) => {
setTimeout(() => {
this.admins = res.data
this.loading = false
}, 600)
})
},
submit() {
SaveAdmin(this.selectAdmin).then((res) => {
if (res.status) this.$message.success("操作员信息更新成功")
this.addVisible = false
this.emailVisible = false
this.rolesVisible = false
this.passwordVisible = false
this.load()
})
},
submitRoles() {
let str = ''
for (let i = 0; i < this.selectRoles.length; i++) {
if (i === this.selectRoles.length - 1) {
str += this.selectRoles[i]
} else {
str += this.selectRoles[i] + ";"
}
}
this.selectAdmin.roles = str
this.submit()
},
updateEmail(index) {
this.emailVisible = true
this.selectAdmin = this.admins[index]
},
updatePassword(index) {
this.passwordVisible = true
this.selectAdmin = this.admins[index]
},
updateRoles(index) {
this.rolesVisible = true
this.selectAdmin = this.admins[index]
this.selectRoles = this.selectAdmin.roles.split(";")
console.log(this.selectRoles)
},
remove(id) {
DeleteAdmin(id).then((res) => {
if (res.status) this.$message.success("操作员删除成功")
this.load()
})
},
},
};
</script>
<style scoped>
.editable-add-btn {
margin-bottom: 15px;
}
</style>
================================================
FILE: web-app/src/views/system/Role.vue
================================================
<template>
<div class="main">
<div class="title">系统权限列表</div>
<a-spin size="large" :spinning="spinning">
<div v-for="(item, index) in roles" :key="index">
<a class="item-title" type="link">{{ item.value }}</a>
<p class="des">描述信息: {{ item.description }}</p>
<a-divider/>
</div>
</a-spin>
</div>
</template>
<script>
import {FindAllRole} from "../../api/role";
export default {
name: "Me",
data() {
return {
roles: [],
spinning: false,
}
},
mounted() {
this.spinning = true
FindAllRole().then((res) => {
if (res.status) this.roles = res.data
setTimeout(() => {
this.spinning = false
}, 500)
})
},
}
</script>
<style scoped>
.main {
background: #ffffff;
padding: 50px 70px;
}
.title {
letter-spacing: 1px;
font-size: 20px;
font-weight: bolder;
color: #000000;
margin-bottom: 30px;
}
.btn {
float: right;
}
.item-title {
color: rgba(0, 0, 0, .8);
line-height: 35px;
}
.item-title:hover {
color: #5a84fd;
}
.des {
color: rgba(0, 0, 0, .5);
}
</style>
================================================
FILE: web-app/src/views/system/Security.vue
================================================
<template>
<div class="main">
<div class="title">安全设置</div>
<a-spin size="large" :spinning="spinning">
<div>
<a class="item-title" type="link">账号密码</a>
<a-button class="btn" @click="passwordVisible = true" type="link">修改</a-button>
<p class="des">账号密码: {{ show ? this.$store.state.user.details.password : '********' }}
<a @click="show = !show" style="padding-left: 10px">
<a-icon :type="!show ? 'eye' : 'eye-invisible' "/>
</a>
</p>
<a-divider/>
</div>
<div>
<a class="item-title" type="link">绑定邮箱</a>
<a-button class="btn" @click="emailVisible = true" type="link">修改</a-button>
<p class="des">已绑定邮箱: {{ this.$store.state.user.details.email }}</p>
<a-divider/>
</div>
</a-spin>
<a-modal
title="密码修改"
:visible="passwordVisible"
@ok="submit"
@cancel="passwordVisible = false"
>
<a-form-model :model="admin">
<a-form-model-item label="密码">
<a-input v-model="admin.password"/>
</a-form-model-item>
</a-form-model>
</a-modal>
<a-modal
title="邮箱修改"
:visible="emailVisible"
@ok="submit"
@cancel="emailVisible = false"
>
<a-form-model :model="admin">
<a-form-model-item label="绑定邮箱">
<a-input v-model="admin.email"/>
</a-form-model-item>
</a-form-model>
</a-modal>
</div>
</template>
<script>
import {SaveAdmin} from "@/api/admin";
export default {
name: "Me",
data() {
return {
admin: this.$store.state.user.details,
show: false,
emailVisible: false,
passwordVisible: false,
spinning: false,
}
},
mounted() {
this.load()
},
methods: {
load() {
this.spinning = true
setTimeout(() => {
this.spinning = false
}, 500)
},
submit() {
SaveAdmin(this.admin).then((res) => {
if (res.status) {
this.$message.success("账号信息修改成功")
this.$store.commit('user/saveLoginUser', res.data)
}
})
this.emailVisible = false
this.passwordVisible = false
this.load()
},
}
}
</script>
<style scoped>
.main {
background: #ffffff;
padding: 50px 70px;
}
.title {
letter-spacing: 1px;
font-size: 20px;
font-weight: bolder;
color: #000000;
margin-bottom: 30px;
}
.btn {
float: right;
}
.item-title {
color: rgba(0, 0, 0, .8);
line-height: 35px;
}
.item-title:hover {
color: #5a84fd;
}
.des {
color: rgba(0, 0, 0, .5);
}
</style>
================================================
FILE: web-app/src/views/transport/Driver.vue
================================================
<template>
<div>
<a-button size="large" class="editable-add-btn" @click="visible = true">
<a-icon type="plus"/>
新增驾驶员
</a-button>
<a-table :loading="loading" :columns="columns" :data-source="data" bordered rowKey="id">
<template
v-for="col in ['name', 'gender', 'phone','score','idCard','address', 'license']"
:slot="col"
slot-scope="text, record, index"
>
<div :key="col">
<a-input
v-if="record.editable"
style="margin: -5px 0"
:value="text"
@change="e => handleChange(e.target.value, record.id, col)"
/>
<template v-else>
{{ text }}
</template>
</div>
</template>
<template slot="operation" slot-scope="text, record, index">
<div class="editable-row-operations">
<span v-if="record.editable">
<a @click="() => save(record.id, index)">保存</a>
<a-popconfirm title="Sure to cancel?" @confirm="() => cancel(record.id)">
<a>取消</a>
</a-popconfirm>
</span>
<span v-else>
<a :disabled="editingKey !== ''" @click="() => edit(record.id)">编辑</a>
</span>
<a-popconfirm placement="top" ok-text="Yes" cancel-text="No" @confirm="confirm(record.id)">
<template slot="title">
<p> 删除驾驶员信息后将无法恢复,确定要删除吗? </p>
</template>
<a-button type="link">删除</a-button>
</a-popconfirm>
</div>
</template>
</a-table>
<a-modal
title="Title"
:visible="visible"
@ok="submitForm"
@cancel="visible = false"
>
<a-form-model :model="form">
<a-form-model-item label="姓名">
<a-input v-model="form.name" placeholder="请输入司机姓名"/>
</a-form-model-item>
<a-form-model-item label="身份证号">
<a-input v-model="form.idCard" placeholder="请输入司机身份证信息"/>
</a-form-model-item>
<a-form-model-item label="联系方式">
<a-input v-model="form.phone" placeholder="请输入手机号码"/>
</a-form-model-item>
<a-form-item label="驾照信息">
<a-row :gutter="20">
<a-col :span="12">
<a-input v-model="form.license" addon-before="驾驶证" default-value="0571"/>
</a-col>
<a-col :span="7">
<a-input-number v-model="form.score" addon-before="分数" default-value="12" :min="0" :max="12"/>
</a-col>
</a-row>
</a-form-item>
<a-form-model-item label="性别">
<a-radio-group v-model="form.gender">
<a-radio value="男性">男性</a-radio>
<a-radio value="女性">女性</a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="家庭住址">
<a-input v-model="form.address" type="textarea"/>
</a-form-model-item>
</a-form-model>
</a-modal>
</div>
</template>
<script>
import {DeleteDriverById, FindAllDriver, SaveDriver} from "@/api/driver";
const columns = [
{
title: '名字',
dataIndex: 'name',
scopedSlots: {customRender: 'name'},
},
{
title: '性别',
dataIndex: 'gender',
scopedSlots: {customRender: 'gender'},
},
{
title: '联系电话',
dataIndex: 'phone',
scopedSlots: {customRender: 'phone'},
},
{
title: '驾驶证',
dataIndex: 'license',
scopedSlots: {customRender: 'license'},
},
{
title: '驾证分数',
dataIndex: 'score',
scopedSlots: {customRender: 'score'},
},
{
title: '身份证',
dataIndex: 'idCard',
scopedSlots: {customRender: 'idCard'},
},
{
title: '家庭住址',
dataIndex: 'address',
scopedSlots: {customRender: 'address'},
},
{
title: '操作',
dataIndex: 'operation',
scopedSlots: {customRender: 'operation'},
},
];
export default {
data() {
return {
loading: false,
form: {
cacheData: [],
name: '',
gender: '男性',
phone: '',
address: '',
idCard: '',
license: '',
score: 12,
},
visible: false,
data: [],
columns,
editingKey: '',
};
},
mounted() {
this.loadTableData()
},
methods: {
loadTableData() {
this.loading = true
FindAllDriver().then((res) => {
if (res.status) {
this.data = res.data
this.cacheData = res.data.map(item => ({...item}))
}
setTimeout(() => {
this.loading = false
}, 600)
})
},
submitForm() {
SaveDriver(this.form).then((res) => {
if (res.status) this.$message.success('司机信息提交成功');
this.visible = false
this.loadTableData()
})
},
handleChange(value, id, column) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
if (target) {
target[column] = value;
this.data = newData;
}
},
edit(id) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
this.editingKey = id;
if (target) {
target.editable = true;
this.data = newData;
}
},
save(id, index) {
const newData = [...this.data];
const newCacheData = [...this.cacheData];
const target = newData.filter(item => id === item.id)[0];
const targetCache = newCacheData.filter(item => id === item.id)[0];
if (target && targetCache) {
delete target.editable;
this.data = newData;
Object.assign(targetCache, target);
this.cacheData = newCacheData;
}
this.editingKey = '';
SaveDriver(newData[index]).then((res) => {
if (res.status) this.$message.success("信息保存成功")
})
},
cancel(id) {
const newData = [...this.data];
const target = newData.filter(item => id === item.id)[0];
this.editingKey = '';
if (target) {
Object.assign(target, this.cacheData.filter(item => id === item.id)[0]);
delete target.editable;
this.data = newData;
}
},
confirm(id) {
DeleteDriverById(id).then((res) => {
if (res.status) this.$message.success('Delete success');
this.loadTableData()
})
},
},
};
</script>
<style scoped>
.editable-add-btn {
margin-bottom: 15px;
}
.editable-row-operations a {
margin-right: 8px;
}
</style>
================================================
FILE: web-app/src/views/transport/Vehicle.vue
================================================
<template>
<div>
<a-spin size="large" :spinning="spinning">
<a-row :gutter="20">
<a-col :span="8" class="item">
<a-card hoverable class="add-item" @click="visible = true">
<a-icon type="plus"/>
添加车辆
</a-card>
</a-col>
<a-col :span="8" v-for="(item, index) in this.data" :key="index" class="item">
<a-card hoverable>
<template slot="actions" class="ant-card-actions">
<a-tag :color=" item.driving ? 'orange': 'green'">{{ item.driving ? '正在途中' : '正在休息' }}</a-tag>
<span>使用记录</span>
</template>
<a-card-meta
:title="'车牌号:' + item.number"
:description="'ID: ' + item.id">
<a-badge :number-style="{ backgroundColor: '#52c41a' }"
slot="avatar"
:count="item.type"
:offset="[-80,10]">
<img class="image" :src="require('../../assets/' +item.type+'.svg')" alt=""/>
</a-badge>
</a-card-meta>
</a-card>
</a-col>
</a-row>
</a-spin>
<a-modal
title="新增仓库"
:visible="visible"
@ok="submit"
@cancel="visible = false"
>
<a-form-model :model="form">
<a-form-model-item label="车牌号码">
<a-input v-model="form.number"/>
</a-form-model-item>
<a-form-model-item label="车辆类型">
<a-select v-model="form.type">
<a-select-option value="小型汽车">小型汽车</a-select-option>
<a-select-option value="货车">货车</a-select-option>
<a-select-option value="卡车">卡车</a-select-option>
</a-select>
</a-form-model-item>
</a-form-model>
</a-modal>
</div>
</template>
<script>
import {FindAllVehicle, SaveVehicle} from "@/api/vehicle";
export default {
name: "WareHouse",
data() {
return {
visible: false,
spinning: false,
form: {
number: '京A0000',
type: '货车',
driving: false,
},
data: [],
imgList: [
require('../../assets/warehouse0.svg'),
require('../../assets/warehouse1.svg'),
require('../../assets/warehouse2.svg'),]
}
},
mounted() {
this.loadData()
},
methods: {
loadData() {
this.spinning = true
FindAllVehicle().then((res) => {
if (res.status) this.data = res.data
setTimeout(() => {
this.spinning = false
}, 600)
})
},
submit() {
SaveVehicle(this.form).then((res) => {
if (res.status) this.$message.success("添加成功")
this.visible = false
this.loadData()
})
}
},
}
</script>
<style scoped>
.add-item {
text-align: center;
line-height: 120px;
min-height: 120px;
border: 1px dashed #91949c;
}
.add-item:hover {
border: 1px dashed #5a84fd;
color: #5a84fd;
}
.item {
margin-bottom: 20px;
}
.image {
width: 80px;
height: 80px;
margin-left: 20px;
}
</style>
gitextract_5fj3_9c0/
├── .gitignore
├── README.md
├── api/
│ ├── .gitignore
│ ├── README.md
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── api/
│ │ ├── ApiApplication.java
│ │ ├── annotation/
│ │ │ └── DisableBaseResponse.java
│ │ ├── controller/
│ │ │ ├── AdminController.java
│ │ │ ├── CommodityController.java
│ │ │ ├── DistributionController.java
│ │ │ ├── DriverController.java
│ │ │ ├── EmailController.java
│ │ │ ├── EmployeeController.java
│ │ │ ├── InventoryController.java
│ │ │ ├── RoleController.java
│ │ │ ├── SaleController.java
│ │ │ ├── UserController.java
│ │ │ ├── VehicleController.java
│ │ │ └── WarehouseController.java
│ │ ├── handler/
│ │ │ ├── GlobalExceptionHandler.java
│ │ │ └── GlobalResponseHandler.java
│ │ ├── model/
│ │ │ ├── dto/
│ │ │ │ └── LoginDto.java
│ │ │ ├── entity/
│ │ │ │ ├── Admin.java
│ │ │ │ ├── Code.java
│ │ │ │ ├── Commodity.java
│ │ │ │ ├── Company.java
│ │ │ │ ├── Distribution.java
│ │ │ │ ├── Driver.java
│ │ │ │ ├── Employee.java
│ │ │ │ ├── Inventory.java
│ │ │ │ ├── InventoryRecord.java
│ │ │ │ ├── Sale.java
│ │ │ │ ├── User.java
│ │ │ │ ├── Vehicle.java
│ │ │ │ └── Warehouse.java
│ │ │ ├── enums/
│ │ │ │ ├── DistributionStatus.java
│ │ │ │ └── Role.java
│ │ │ ├── support/
│ │ │ │ └── ResponseResult.java
│ │ │ └── vo/
│ │ │ └── CommodityChartVo.java
│ │ ├── repository/
│ │ │ ├── AdminRepository.java
│ │ │ ├── CodeRepository.java
│ │ │ ├── CommodityRepository.java
│ │ │ ├── DistributionRepository.java
│ │ │ ├── DriverRepository.java
│ │ │ ├── EmployeeRepository.java
│ │ │ ├── InventoryRecordRepository.java
│ │ │ ├── InventoryRepository.java
│ │ │ ├── SaleRepository.java
│ │ │ ├── UserRepository.java
│ │ │ ├── VehicleRepository.java
│ │ │ └── WareHouseRepository.java
│ │ ├── security/
│ │ │ ├── JwtAuthorizationFilter.java
│ │ │ └── SecurityConfiguration.java
│ │ ├── service/
│ │ │ ├── AdminService.java
│ │ │ ├── CommodityService.java
│ │ │ ├── DistributionService.java
│ │ │ ├── DriverService.java
│ │ │ ├── EmailService.java
│ │ │ ├── EmployeeService.java
│ │ │ ├── InventoryRecordService.java
│ │ │ ├── InventoryService.java
│ │ │ ├── SaleService.java
│ │ │ ├── UserService.java
│ │ │ ├── VehicleService.java
│ │ │ ├── WarehouseService.java
│ │ │ └── impl/
│ │ │ ├── AdminServiceImpl.java
│ │ │ ├── CommodityServiceImpl.java
│ │ │ ├── DistributionServiceImpl.java
│ │ │ ├── DriverServiceImpl.java
│ │ │ ├── EmailServiceImpl.java
│ │ │ ├── EmployeeServiceImpl.java
│ │ │ ├── InventoryRecordServiceImpl.java
│ │ │ ├── InventoryServiceImpl.java
│ │ │ ├── SaleServiceImpl.java
│ │ │ ├── UserServiceImpl.java
│ │ │ ├── VehicleServiceImpl.java
│ │ │ └── WarehouseServiceImpl.java
│ │ └── utils/
│ │ ├── DataTimeUtil.java
│ │ ├── JwtTokenUtil.java
│ │ ├── RandomUtil.java
│ │ └── ResponseUtil.java
│ └── resources/
│ └── application.yaml
└── web-app/
├── .gitignore
├── README.md
├── package.json
├── public/
│ └── index.html
└── src/
├── App.vue
├── api/
│ ├── admin.js
│ ├── commodity.js
│ ├── distribution.js
│ ├── driver.js
│ ├── employee.js
│ ├── inventory.js
│ ├── role.js
│ ├── sale.js
│ ├── vehicle.js
│ └── warehouse.js
├── components/
│ └── InventoryRecords.vue
├── layout/
│ ├── Aside.vue
│ ├── Footer.vue
│ ├── Header.vue
│ ├── Index.vue
│ └── Main.vue
├── main.js
├── router/
│ ├── index.js
│ └── routes.js
├── store/
│ ├── index.js
│ └── modules/
│ └── user.js
├── utils/
│ └── request.js
└── views/
├── Init.vue
├── Login.vue
├── Test.vue
├── analyze/
│ ├── In.vue
│ └── Out.vue
├── basics/
│ ├── Commodity.vue
│ ├── Company.vue
│ ├── Details.vue
│ ├── Employee.vue
│ └── Warehouse.vue
├── delivery/
│ ├── Create.vue
│ └── List.vue
├── error/
│ ├── 403.vue
│ ├── 404.vue
│ └── 500.vue
├── sale/
│ ├── Create.vue
│ └── Record.vue
├── system/
│ ├── Admin.vue
│ ├── Role.vue
│ └── Security.vue
└── transport/
├── Driver.vue
└── Vehicle.vue
SYMBOL INDEX (298 symbols across 86 files)
FILE: api/src/main/java/com/example/api/ApiApplication.java
class ApiApplication (line 6) | @SpringBootApplication
method main (line 9) | public static void main(String[] args) {
FILE: api/src/main/java/com/example/api/controller/AdminController.java
class AdminController (line 17) | @RestController
method hasInit (line 27) | @GetMapping("hasInit")
method init (line 32) | @PostMapping("/init")
method findAll (line 39) | @GetMapping("")
method delete (line 45) | @DeleteMapping("")
method save (line 51) | @PostMapping("")
method loginByEmail (line 57) | @PostMapping("/login")
method sendEmail (line 68) | @GetMapping("/sendEmail")
FILE: api/src/main/java/com/example/api/controller/CommodityController.java
class CommodityController (line 11) | @RestController
method save (line 19) | @PostMapping("")
method delete (line 24) | @DeleteMapping("")
method update (line 29) | @PutMapping("")
method findAll (line 34) | @GetMapping("")
method findByLikeName (line 39) | @GetMapping("/search/{name}")
method findById (line 44) | @GetMapping("/{id}")
FILE: api/src/main/java/com/example/api/controller/DistributionController.java
class DistributionController (line 14) | @RestController
method save (line 27) | @PostMapping("")
method findAll (line 32) | @GetMapping("")
method can (line 37) | @GetMapping("can")
FILE: api/src/main/java/com/example/api/controller/DriverController.java
class DriverController (line 10) | @RestController
method save (line 17) | @PostMapping("")
method findAll (line 22) | @GetMapping("")
method findById (line 27) | @GetMapping("/{id}")
method delete (line 32) | @DeleteMapping("")
FILE: api/src/main/java/com/example/api/controller/EmailController.java
class EmailController (line 14) | @RestController
method send (line 24) | @GetMapping("/send")
FILE: api/src/main/java/com/example/api/controller/EmployeeController.java
class EmployeeController (line 11) | @RestController
method findAll (line 19) | @GetMapping("")
method findById (line 24) | @GetMapping("/{id}")
method save (line 29) | @PostMapping("")
method update (line 34) | @PutMapping("")
method delete (line 39) | @DeleteMapping("")
FILE: api/src/main/java/com/example/api/controller/InventoryController.java
class InventoryController (line 13) | @RestController
method findAll (line 23) | @GetMapping("")
method analyze (line 28) | @GetMapping("analyze")
method findByWarehouse (line 35) | @GetMapping("/warehouse/{id}")
method findByCommodity (line 42) | @GetMapping("/commodity/{id}")
method findRecordByWarehouse (line 49) | @GetMapping("/record/warehouse/{id}")
method findRecordByCommodity (line 56) | @GetMapping("/record/commodity/{id}")
method in (line 61) | @PostMapping("/in")
method out (line 66) | @PostMapping("/out")
FILE: api/src/main/java/com/example/api/controller/RoleController.java
class RoleController (line 8) | @RestController
method list (line 12) | @GetMapping("")
FILE: api/src/main/java/com/example/api/controller/SaleController.java
class SaleController (line 11) | @RestController
method save (line 19) | @PostMapping("")
method findAll (line 24) | @GetMapping("")
method search (line 29) | @GetMapping("/search/{name}")
FILE: api/src/main/java/com/example/api/controller/UserController.java
class UserController (line 11) | @RestController
FILE: api/src/main/java/com/example/api/controller/VehicleController.java
class VehicleController (line 11) | @RestController
method save (line 18) | @PostMapping("")
method findAll (line 23) | @GetMapping("")
method findById (line 28) | @GetMapping("/{id}")
method delete (line 33) | @DeleteMapping("")
FILE: api/src/main/java/com/example/api/controller/WarehouseController.java
class WarehouseController (line 11) | @RestController
method save (line 19) | @PostMapping("")
method findAll (line 24) | @GetMapping("")
method delete (line 29) | @DeleteMapping("")
FILE: api/src/main/java/com/example/api/handler/GlobalExceptionHandler.java
class GlobalExceptionHandler (line 16) | @ResponseBody
method handleException (line 22) | @ExceptionHandler(value = Exception.class)
FILE: api/src/main/java/com/example/api/handler/GlobalResponseHandler.java
class GlobalResponseHandler (line 16) | @ControllerAdvice(value = "com.example.api.controller")
method supports (line 20) | @Override
method beforeBodyWrite (line 25) | @Override
FILE: api/src/main/java/com/example/api/model/dto/LoginDto.java
class LoginDto (line 8) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Admin.java
class Admin (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Code.java
class Code (line 14) | @Data
method Code (line 26) | public Code(String email, String value) {
FILE: api/src/main/java/com/example/api/model/entity/Commodity.java
class Commodity (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Company.java
class Company (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Distribution.java
class Distribution (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Driver.java
class Driver (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Employee.java
class Employee (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Inventory.java
class Inventory (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/InventoryRecord.java
class InventoryRecord (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Sale.java
class Sale (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/User.java
class User (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Vehicle.java
class Vehicle (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/entity/Warehouse.java
class Warehouse (line 14) | @Data
FILE: api/src/main/java/com/example/api/model/enums/DistributionStatus.java
type DistributionStatus (line 9) | public enum DistributionStatus {
method DistributionStatus (line 24) | DistributionStatus(Integer code) {
FILE: api/src/main/java/com/example/api/model/enums/Role.java
type Role (line 6) | @Getter
method Role (line 35) | Role(String value, String description) {
FILE: api/src/main/java/com/example/api/model/support/ResponseResult.java
class ResponseResult (line 5) | @Data
method ResponseResult (line 16) | public ResponseResult() {
method ResponseResult (line 24) | public ResponseResult(T data) {
method ResponseResult (line 32) | public ResponseResult(String msg, T data) {
method ResponseResult (line 40) | public ResponseResult(Integer code, String msg) {
FILE: api/src/main/java/com/example/api/model/vo/CommodityChartVo.java
class CommodityChartVo (line 6) | @Data
FILE: api/src/main/java/com/example/api/repository/AdminRepository.java
type AdminRepository (line 7) | @Repository
method findAdminByEmailAndPassword (line 10) | Admin findAdminByEmailAndPassword(String email, String password);
method findAdminByEmail (line 12) | Admin findAdminByEmail(String email);
method existsAdminByRoles (line 14) | boolean existsAdminByRoles(String roles);
FILE: api/src/main/java/com/example/api/repository/CodeRepository.java
type CodeRepository (line 7) | @Repository
method findByEmailAndValue (line 10) | Code findByEmailAndValue(String email, String value);
FILE: api/src/main/java/com/example/api/repository/CommodityRepository.java
type CommodityRepository (line 9) | @Repository
method findByName (line 12) | Commodity findByName(String name);
method findByNameLike (line 14) | List<Commodity> findByNameLike(String name);
FILE: api/src/main/java/com/example/api/repository/DistributionRepository.java
type DistributionRepository (line 7) | @Repository
FILE: api/src/main/java/com/example/api/repository/DriverRepository.java
type DriverRepository (line 12) | @Repository
method updateDriving (line 15) | @Modifying
method findAllByDriving (line 20) | List<Driver> findAllByDriving(boolean driving);
FILE: api/src/main/java/com/example/api/repository/EmployeeRepository.java
type EmployeeRepository (line 7) | @Repository
FILE: api/src/main/java/com/example/api/repository/InventoryRecordRepository.java
type InventoryRecordRepository (line 9) | @Repository
method findAllByWid (line 12) | List<InventoryRecord> findAllByWid(String wid);
method findAllByType (line 14) | List<InventoryRecord> findAllByType(Integer type);
method findAllByCid (line 16) | List<InventoryRecord> findAllByCid(String cid);
FILE: api/src/main/java/com/example/api/repository/InventoryRepository.java
type InventoryRepository (line 9) | @Repository
method findByWidAndCid (line 12) | Inventory findByWidAndCid(String wid, String cid);
method findAllByCid (line 14) | List<Inventory> findAllByCid(String cid);
method findAllByWid (line 16) | List<Inventory> findAllByWid(String wid);
FILE: api/src/main/java/com/example/api/repository/SaleRepository.java
type SaleRepository (line 9) | @Repository
method findAllByCompanyLike (line 12) | List<Sale> findAllByCompanyLike(String name);
FILE: api/src/main/java/com/example/api/repository/UserRepository.java
type UserRepository (line 7) | @Repository
FILE: api/src/main/java/com/example/api/repository/VehicleRepository.java
type VehicleRepository (line 12) | @Repository
method updateDriving (line 15) | @Modifying
method findAllByDriving (line 20) | List<Vehicle> findAllByDriving(boolean driving);
FILE: api/src/main/java/com/example/api/repository/WareHouseRepository.java
type WareHouseRepository (line 7) | @Repository
FILE: api/src/main/java/com/example/api/security/JwtAuthorizationFilter.java
class JwtAuthorizationFilter (line 24) | public class JwtAuthorizationFilter extends BasicAuthenticationFilter {
method JwtAuthorizationFilter (line 26) | public JwtAuthorizationFilter(AuthenticationManager authenticationMana...
method doFilterInternal (line 30) | @Override
FILE: api/src/main/java/com/example/api/security/SecurityConfiguration.java
class SecurityConfiguration (line 14) | @Configuration
method bCryptPasswordEncoder (line 18) | @Bean
method configure (line 29) | @Override
method corsConfigurationSource (line 49) | @Bean
FILE: api/src/main/java/com/example/api/service/AdminService.java
type AdminService (line 8) | public interface AdminService {
method save (line 10) | Admin save(Admin admin) throws Exception;
method findById (line 12) | Admin findById(String id);
method sendEmail (line 14) | void sendEmail(String email) throws Exception;
method loginByPassword (line 16) | Admin loginByPassword(LoginDto dto) throws Exception;
method loginByEmail (line 18) | Admin loginByEmail(LoginDto dto) throws Exception;
method findAll (line 20) | List<Admin> findAll();
method createToken (line 23) | String createToken(Admin admin, long exp);
method delete (line 25) | void delete(String id);
FILE: api/src/main/java/com/example/api/service/CommodityService.java
type CommodityService (line 7) | public interface CommodityService {
method save (line 9) | Commodity save(Commodity commodity);
method update (line 11) | void update(Commodity commodity);
method delete (line 13) | void delete(String id);
method findById (line 15) | Commodity findById(String id);
method findAll (line 17) | List<Commodity> findAll();
method findAllByLikeName (line 19) | List<Commodity> findAllByLikeName(String name);
FILE: api/src/main/java/com/example/api/service/DistributionService.java
type DistributionService (line 7) | public interface DistributionService {
method save (line 9) | Distribution save(Distribution distribution) throws Exception;
method findAll (line 11) | List<Distribution> findAll();
FILE: api/src/main/java/com/example/api/service/DriverService.java
type DriverService (line 7) | public interface DriverService {
method save (line 9) | Driver save(Driver driver);
method update (line 11) | void update(Driver driver);
method delete (line 13) | void delete(String id);
method findById (line 15) | Driver findById(String id);
method findAll (line 17) | List<Driver> findAll();
FILE: api/src/main/java/com/example/api/service/EmailService.java
type EmailService (line 5) | public interface EmailService {
method sendVerificationCode (line 8) | void sendVerificationCode(String email) throws MailException;
method checkVerificationCode (line 11) | boolean checkVerificationCode(String email, String code);
FILE: api/src/main/java/com/example/api/service/EmployeeService.java
type EmployeeService (line 7) | public interface EmployeeService {
method save (line 9) | Employee save(Employee employee);
method update (line 11) | void update(Employee employee);
method delete (line 13) | void delete(String id);
method findById (line 15) | Employee findById(String id);
method findAll (line 17) | List<Employee> findAll();
FILE: api/src/main/java/com/example/api/service/InventoryRecordService.java
type InventoryRecordService (line 8) | public interface InventoryRecordService {
method analyzeCommodity (line 11) | List<CommodityChartVo> analyzeCommodity(Integer type);
method findAllByWarehouseId (line 13) | List<InventoryRecord> findAllByWarehouseId(String wid);
method findAllByCommodityId (line 15) | List<InventoryRecord> findAllByCommodityId(String cid);
method out (line 18) | InventoryRecord out(InventoryRecord record) throws Exception;
method in (line 21) | InventoryRecord in(InventoryRecord record) throws Exception;
FILE: api/src/main/java/com/example/api/service/InventoryService.java
type InventoryService (line 7) | public interface InventoryService {
method save (line 9) | Inventory save(Inventory inventory);
method findAll (line 11) | List<Inventory> findAll();
method findByCommodityId (line 13) | List<Inventory> findByCommodityId(String cid);
method findByWarehouseId (line 15) | List<Inventory> findByWarehouseId(String wid);
FILE: api/src/main/java/com/example/api/service/SaleService.java
type SaleService (line 7) | public interface SaleService {
method save (line 9) | Sale save(Sale sale);
method findAll (line 11) | List<Sale> findAll();
method searchByCompany (line 13) | List<Sale> searchByCompany(String name);
FILE: api/src/main/java/com/example/api/service/UserService.java
type UserService (line 3) | public interface UserService {
FILE: api/src/main/java/com/example/api/service/VehicleService.java
type VehicleService (line 7) | public interface VehicleService {
method save (line 9) | Vehicle save(Vehicle vehicle);
method update (line 11) | void update(Vehicle vehicle);
method delete (line 13) | void delete(String id);
method findById (line 15) | Vehicle findById(String id);
method findAll (line 17) | List<Vehicle> findAll();
FILE: api/src/main/java/com/example/api/service/WarehouseService.java
type WarehouseService (line 7) | public interface WarehouseService {
method save (line 9) | Warehouse save(Warehouse warehouse);
method findAll (line 11) | List<Warehouse> findAll();
method delete (line 13) | void delete(String id);
FILE: api/src/main/java/com/example/api/service/impl/AdminServiceImpl.java
class AdminServiceImpl (line 15) | @Service
method save (line 24) | @Override
method findById (line 31) | @Override
method sendEmail (line 36) | @Override
method loginByPassword (line 43) | @Override
method loginByEmail (line 50) | @Override
method findAll (line 57) | @Override
method createToken (line 62) | @Override
method delete (line 69) | @Override
FILE: api/src/main/java/com/example/api/service/impl/CommodityServiceImpl.java
class CommodityServiceImpl (line 12) | @Service
method save (line 18) | @Override
method update (line 24) | @Override
method delete (line 30) | @Override
method findById (line 35) | @Override
method findAll (line 40) | @Override
method findAllByLikeName (line 45) | @Override
FILE: api/src/main/java/com/example/api/service/impl/DistributionServiceImpl.java
class DistributionServiceImpl (line 16) | @Service
method save (line 28) | @Override
method findAll (line 41) | @Override
FILE: api/src/main/java/com/example/api/service/impl/DriverServiceImpl.java
class DriverServiceImpl (line 12) | @Service
method save (line 18) | @Override
method update (line 24) | @Override
method delete (line 30) | @Override
method findById (line 35) | @Override
method findAll (line 40) | @Override
FILE: api/src/main/java/com/example/api/service/impl/EmailServiceImpl.java
class EmailServiceImpl (line 15) | @Service
method sendVerificationCode (line 27) | @Override
method checkVerificationCode (line 41) | @Override
FILE: api/src/main/java/com/example/api/service/impl/EmployeeServiceImpl.java
class EmployeeServiceImpl (line 12) | @Service
method save (line 18) | @Override
method update (line 24) | @Override
method delete (line 30) | @Override
method findById (line 35) | @Override
method findAll (line 40) | @Override
FILE: api/src/main/java/com/example/api/service/impl/InventoryRecordServiceImpl.java
class InventoryRecordServiceImpl (line 17) | @Service
method analyzeCommodity (line 29) | @Override
method findAllByWarehouseId (line 47) | @Override
method findAllByCommodityId (line 52) | @Override
method out (line 57) | @Override
method in (line 82) | @Override
FILE: api/src/main/java/com/example/api/service/impl/InventoryServiceImpl.java
class InventoryServiceImpl (line 11) | @Service
method save (line 17) | @Override
method findAll (line 22) | @Override
method findByCommodityId (line 27) | @Override
method findByWarehouseId (line 32) | @Override
FILE: api/src/main/java/com/example/api/service/impl/SaleServiceImpl.java
class SaleServiceImpl (line 12) | @Service
method save (line 18) | @Override
method findAll (line 24) | @Override
method searchByCompany (line 29) | @Override
FILE: api/src/main/java/com/example/api/service/impl/UserServiceImpl.java
class UserServiceImpl (line 6) | @Service
FILE: api/src/main/java/com/example/api/service/impl/VehicleServiceImpl.java
class VehicleServiceImpl (line 12) | @Service
method save (line 18) | @Override
method update (line 24) | @Override
method delete (line 29) | @Override
method findById (line 34) | @Override
method findAll (line 39) | @Override
FILE: api/src/main/java/com/example/api/service/impl/WarehouseServiceImpl.java
class WarehouseServiceImpl (line 12) | @Service
method save (line 18) | @Override
method findAll (line 24) | @Override
method delete (line 29) | @Override
FILE: api/src/main/java/com/example/api/utils/DataTimeUtil.java
class DataTimeUtil (line 6) | public final class DataTimeUtil {
method getNowTimeString (line 8) | public static String getNowTimeString() {
method parseTimeStamp (line 13) | public static long parseTimeStamp(String s) {
method isAfterNow (line 24) | public static boolean isAfterNow(String time) {
FILE: api/src/main/java/com/example/api/utils/JwtTokenUtil.java
class JwtTokenUtil (line 10) | public final class JwtTokenUtil {
method checkToken (line 30) | public static boolean checkToken(String token) {
method createToken (line 38) | public static String createToken(String username, String[] roles, long...
method getTokenClaims (line 53) | private static Claims getTokenClaims(String token) {
method getUsername (line 70) | public static String getUsername(String token) {
method getTokenRoles (line 77) | public static List<String> getTokenRoles(String token) {
method isExpiration (line 91) | public static boolean isExpiration(String token) {
FILE: api/src/main/java/com/example/api/utils/RandomUtil.java
class RandomUtil (line 5) | public final class RandomUtil {
method next (line 7) | public static String next() {
FILE: api/src/main/java/com/example/api/utils/ResponseUtil.java
class ResponseUtil (line 9) | public final class ResponseUtil {
method writeJson (line 11) | public static void writeJson(HttpServletResponse response, Object o) {
FILE: web-app/src/api/admin.js
function IsInit (line 3) | function IsInit() {
function Init (line 10) | function Init(data) {
function DeleteAdmin (line 18) | function DeleteAdmin(id) {
function FindAllAdmin (line 25) | function FindAllAdmin() {
function SaveAdmin (line 32) | function SaveAdmin(data) {
function AdminSendEmail (line 40) | function AdminSendEmail(email) {
function AdminLogin (line 47) | function AdminLogin(type, data) {
FILE: web-app/src/api/commodity.js
function FindAllCommodity (line 3) | function FindAllCommodity() {
function SearchCommodity (line 10) | function SearchCommodity(name) {
function SaveCommodity (line 18) | function SaveCommodity(data) {
function DeleteCommodityById (line 26) | function DeleteCommodityById(id) {
FILE: web-app/src/api/distribution.js
function FindAllDistribution (line 3) | function FindAllDistribution() {
function FindAllCanUse (line 10) | function FindAllCanUse() {
function SaveDistribution (line 17) | function SaveDistribution(data) {
FILE: web-app/src/api/driver.js
function FindAllDriver (line 3) | function FindAllDriver(){
function SaveDriver (line 10) | function SaveDriver(data) {
function DeleteDriverById (line 18) | function DeleteDriverById(id){
FILE: web-app/src/api/employee.js
function FindAllEmployee (line 3) | function FindAllEmployee(){
function SaveEmployee (line 10) | function SaveEmployee(data) {
function DeleteEmployeeById (line 18) | function DeleteEmployeeById(id){
FILE: web-app/src/api/inventory.js
function AnalyzeCommodity (line 3) | function AnalyzeCommodity(type) {
function FindAllInventory (line 10) | function FindAllInventory(id) {
function InAndOut (line 17) | function InAndOut(type, data) {
function FindRecordByWarehouse (line 25) | function FindRecordByWarehouse(id) {
function DeleteInventoryById (line 32) | function DeleteInventoryById(id) {
FILE: web-app/src/api/role.js
function FindAllRole (line 3) | function FindAllRole(){
FILE: web-app/src/api/sale.js
function FindAllSale (line 3) | function FindAllSale() {
function SearchCompany (line 10) | function SearchCompany(name) {
function SaveSale (line 17) | function SaveSale(data) {
FILE: web-app/src/api/vehicle.js
function FindAllVehicle (line 3) | function FindAllVehicle(){
function SaveVehicle (line 10) | function SaveVehicle(data) {
function DeleteVehicleById (line 18) | function DeleteVehicleById(id){
FILE: web-app/src/api/warehouse.js
function FindAllWarehouse (line 3) | function FindAllWarehouse() {
function SaveWarehouse (line 10) | function SaveWarehouse(data) {
function DeleteWarehouseById (line 18) | function DeleteWarehouseById(id) {
FILE: web-app/src/store/modules/user.js
method saveToken (line 10) | saveToken(state, token) {
method saveLoginUser (line 15) | saveLoginUser(state, user) {
method userLogout (line 20) | userLogout(state) {
Condensed preview — 131 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (190K chars).
[
{
"path": ".gitignore",
"chars": 416,
"preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### STS ###\n.apt_genera"
},
{
"path": "README.md",
"chars": 91,
"preview": "## SpringBoot + Vue 的物流管理系统\n\n#### 主要框架\n- SpringBoot\n\n- SpringData\n\n- SpringSecurity\n\n- Vue2"
},
{
"path": "api/.gitignore",
"chars": 416,
"preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### STS ###\n.apt_genera"
},
{
"path": "api/README.md",
"chars": 91,
"preview": "## SpringBoot + Vue 的物流管理系统\n\n#### 主要框架\n- SpringBoot\n\n- SpringData\n\n- SpringSecurity\n\n- Vue2"
},
{
"path": "api/pom.xml",
"chars": 4292,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "api/src/main/java/com/example/api/ApiApplication.java",
"chars": 314,
"preview": "package com.example.api;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigu"
},
{
"path": "api/src/main/java/com/example/api/annotation/DisableBaseResponse.java",
"chars": 329,
"preview": "package com.example.api.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimp"
},
{
"path": "api/src/main/java/com/example/api/controller/AdminController.java",
"chars": 2399,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.dto.LoginDto;\nimport com.example.api.model.entity.Admi"
},
{
"path": "api/src/main/java/com/example/api/controller/CommodityController.java",
"chars": 1308,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.entity.Commodity;\nimport com.example.api.service.Commo"
},
{
"path": "api/src/main/java/com/example/api/controller/DistributionController.java",
"chars": 1229,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.entity.Distribution;\nimport com.example.api.repository"
},
{
"path": "api/src/main/java/com/example/api/controller/DriverController.java",
"chars": 830,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.entity.Driver;\nimport com.example.api.service.DriverSe"
},
{
"path": "api/src/main/java/com/example/api/controller/EmailController.java",
"chars": 1231,
"preview": "package com.example.api.controller;\n\nimport com.example.api.utils.RandomUtil;\nimport org.springframework.beans.factory.a"
},
{
"path": "api/src/main/java/com/example/api/controller/EmployeeController.java",
"chars": 1118,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.entity.Employee;\nimport com.example.api.service.Employ"
},
{
"path": "api/src/main/java/com/example/api/controller/InventoryController.java",
"chars": 2034,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.entity.Inventory;\nimport com.example.api.model.entity."
},
{
"path": "api/src/main/java/com/example/api/controller/RoleController.java",
"chars": 423,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.enums.Role;\nimport org.springframework.web.bind.annota"
},
{
"path": "api/src/main/java/com/example/api/controller/SaleController.java",
"chars": 850,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.entity.Sale;\nimport com.example.api.service.SaleServic"
},
{
"path": "api/src/main/java/com/example/api/controller/UserController.java",
"chars": 486,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.entity.User;\nimport com.example.api.repository.UserRep"
},
{
"path": "api/src/main/java/com/example/api/controller/VehicleController.java",
"chars": 901,
"preview": "package com.example.api.controller;\n\nimport com.example.api.annotation.DisableBaseResponse;\nimport com.example.api.model"
},
{
"path": "api/src/main/java/com/example/api/controller/WarehouseController.java",
"chars": 874,
"preview": "package com.example.api.controller;\n\nimport com.example.api.model.entity.Warehouse;\nimport com.example.api.service.Wareh"
},
{
"path": "api/src/main/java/com/example/api/handler/GlobalExceptionHandler.java",
"chars": 960,
"preview": "package com.example.api.handler;\n\nimport com.example.api.model.support.ResponseResult;\nimport org.slf4j.Logger;\nimport o"
},
{
"path": "api/src/main/java/com/example/api/handler/GlobalResponseHandler.java",
"chars": 1192,
"preview": "package com.example.api.handler;\n\nimport com.example.api.annotation.DisableBaseResponse;\nimport com.example.api.model.su"
},
{
"path": "api/src/main/java/com/example/api/model/dto/LoginDto.java",
"chars": 222,
"preview": "package com.example.api.model.dto;\n\nimport lombok.Data;\n\n/**\n * 登录传输数据\n */\n@Data\npublic class LoginDto {\n\n private St"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Admin.java",
"chars": 590,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Code.java",
"chars": 577,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Commodity.java",
"chars": 649,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Company.java",
"chars": 479,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Distribution.java",
"chars": 828,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Driver.java",
"chars": 821,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Employee.java",
"chars": 740,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Inventory.java",
"chars": 669,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/InventoryRecord.java",
"chars": 750,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Sale.java",
"chars": 732,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/User.java",
"chars": 594,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Vehicle.java",
"chars": 625,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/entity/Warehouse.java",
"chars": 589,
"preview": "package com.example.api.model.entity;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.annotat"
},
{
"path": "api/src/main/java/com/example/api/model/enums/DistributionStatus.java",
"chars": 348,
"preview": "package com.example.api.model.enums;\n\nimport lombok.Getter;\nimport lombok.Setter;\n\n/**\n * 配送单状态\n */\npublic enum Distribu"
},
{
"path": "api/src/main/java/com/example/api/model/enums/Role.java",
"chars": 862,
"preview": "package com.example.api.model.enums;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Getter;\n\n@Getter"
},
{
"path": "api/src/main/java/com/example/api/model/support/ResponseResult.java",
"chars": 867,
"preview": "package com.example.api.model.support;\n\nimport lombok.Data;\n\n@Data\npublic class ResponseResult<T> {\n\n private Integer"
},
{
"path": "api/src/main/java/com/example/api/model/vo/CommodityChartVo.java",
"chars": 224,
"preview": "package com.example.api.model.vo;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\n@Data\n@AllArgsConstructor\npubl"
},
{
"path": "api/src/main/java/com/example/api/repository/AdminRepository.java",
"chars": 441,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Admin;\nimport org.springframework.data.jpa.repo"
},
{
"path": "api/src/main/java/com/example/api/repository/CodeRepository.java",
"chars": 336,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Code;\nimport org.springframework.data.jpa.repos"
},
{
"path": "api/src/main/java/com/example/api/repository/CommodityRepository.java",
"chars": 406,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Commodity;\nimport org.springframework.data.jpa."
},
{
"path": "api/src/main/java/com/example/api/repository/DistributionRepository.java",
"chars": 300,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Distribution;\nimport org.springframework.data.j"
},
{
"path": "api/src/main/java/com/example/api/repository/DriverRepository.java",
"chars": 689,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Driver;\nimport org.springframework.data.jpa.rep"
},
{
"path": "api/src/main/java/com/example/api/repository/EmployeeRepository.java",
"chars": 288,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Employee;\nimport org.springframework.data.jpa.r"
},
{
"path": "api/src/main/java/com/example/api/repository/InventoryRecordRepository.java",
"chars": 496,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.InventoryRecord;\nimport org.springframework.dat"
},
{
"path": "api/src/main/java/com/example/api/repository/InventoryRepository.java",
"chars": 466,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Inventory;\nimport org.springframework.data.jpa."
},
{
"path": "api/src/main/java/com/example/api/repository/SaleRepository.java",
"chars": 352,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Sale;\nimport org.springframework.data.jpa.repos"
},
{
"path": "api/src/main/java/com/example/api/repository/UserRepository.java",
"chars": 276,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.User;\nimport org.springframework.data.jpa.repos"
},
{
"path": "api/src/main/java/com/example/api/repository/VehicleRepository.java",
"chars": 694,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Vehicle;\nimport org.springframework.data.jpa.re"
},
{
"path": "api/src/main/java/com/example/api/repository/WareHouseRepository.java",
"chars": 291,
"preview": "package com.example.api.repository;\n\nimport com.example.api.model.entity.Warehouse;\nimport org.springframework.data.jpa."
},
{
"path": "api/src/main/java/com/example/api/security/JwtAuthorizationFilter.java",
"chars": 2327,
"preview": "package com.example.api.security;\n\nimport com.example.api.model.support.ResponseResult;\nimport com.example.api.utils.Jwt"
},
{
"path": "api/src/main/java/com/example/api/security/SecurityConfiguration.java",
"chars": 2145,
"preview": "package com.example.api.security;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.contex"
},
{
"path": "api/src/main/java/com/example/api/service/AdminService.java",
"chars": 544,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.dto.LoginDto;\nimport com.example.api.model.entity.Admin;\n"
},
{
"path": "api/src/main/java/com/example/api/service/CommodityService.java",
"chars": 376,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.Commodity;\n\nimport java.util.List;\n\npublic interfa"
},
{
"path": "api/src/main/java/com/example/api/service/DistributionService.java",
"chars": 254,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.Distribution;\n\nimport java.util.List;\n\npublic inte"
},
{
"path": "api/src/main/java/com/example/api/service/DriverService.java",
"chars": 296,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.Driver;\n\nimport java.util.List;\n\npublic interface "
},
{
"path": "api/src/main/java/com/example/api/service/EmailService.java",
"chars": 271,
"preview": "package com.example.api.service;\n\nimport org.springframework.mail.MailException;\n\npublic interface EmailService {\n\n /"
},
{
"path": "api/src/main/java/com/example/api/service/EmployeeService.java",
"chars": 314,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.Employee;\n\nimport java.util.List;\n\npublic interfac"
},
{
"path": "api/src/main/java/com/example/api/service/InventoryRecordService.java",
"chars": 554,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.InventoryRecord;\nimport com.example.api.model.vo.C"
},
{
"path": "api/src/main/java/com/example/api/service/InventoryService.java",
"chars": 323,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.Inventory;\n\nimport java.util.List;\n\npublic interfa"
},
{
"path": "api/src/main/java/com/example/api/service/SaleService.java",
"chars": 235,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.Sale;\n\nimport java.util.List;\n\npublic interface Sa"
},
{
"path": "api/src/main/java/com/example/api/service/UserService.java",
"chars": 67,
"preview": "package com.example.api.service;\n\npublic interface UserService {\n}\n"
},
{
"path": "api/src/main/java/com/example/api/service/VehicleService.java",
"chars": 305,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.Vehicle;\n\nimport java.util.List;\n\npublic interface"
},
{
"path": "api/src/main/java/com/example/api/service/WarehouseService.java",
"chars": 248,
"preview": "package com.example.api.service;\n\nimport com.example.api.model.entity.Warehouse;\n\nimport java.util.List;\n\npublic interfa"
},
{
"path": "api/src/main/java/com/example/api/service/impl/AdminServiceImpl.java",
"chars": 2324,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.dto.LoginDto;\nimport com.example.api.model.entity.Ad"
},
{
"path": "api/src/main/java/com/example/api/service/impl/CommodityServiceImpl.java",
"chars": 1328,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Commodity;\nimport com.example.api.repository."
},
{
"path": "api/src/main/java/com/example/api/service/impl/DistributionServiceImpl.java",
"chars": 1681,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Distribution;\nimport com.example.api.model.en"
},
{
"path": "api/src/main/java/com/example/api/service/impl/DriverServiceImpl.java",
"chars": 1109,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Driver;\nimport com.example.api.repository.Dri"
},
{
"path": "api/src/main/java/com/example/api/service/impl/EmailServiceImpl.java",
"chars": 1603,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Code;\nimport com.example.api.repository.CodeR"
},
{
"path": "api/src/main/java/com/example/api/service/impl/EmployeeServiceImpl.java",
"chars": 1155,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Employee;\nimport com.example.api.repository.E"
},
{
"path": "api/src/main/java/com/example/api/service/impl/InventoryRecordServiceImpl.java",
"chars": 3971,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Commodity;\nimport com.example.api.model.entit"
},
{
"path": "api/src/main/java/com/example/api/service/impl/InventoryServiceImpl.java",
"chars": 936,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Inventory;\nimport com.example.api.repository."
},
{
"path": "api/src/main/java/com/example/api/service/impl/SaleServiceImpl.java",
"chars": 832,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Sale;\nimport com.example.api.repository.SaleR"
},
{
"path": "api/src/main/java/com/example/api/service/impl/UserServiceImpl.java",
"chars": 197,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.service.UserService;\nimport org.springframework.stereotype"
},
{
"path": "api/src/main/java/com/example/api/service/impl/VehicleServiceImpl.java",
"chars": 1070,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Vehicle;\nimport com.example.api.repository.Ve"
},
{
"path": "api/src/main/java/com/example/api/service/impl/WarehouseServiceImpl.java",
"chars": 876,
"preview": "package com.example.api.service.impl;\n\nimport com.example.api.model.entity.Warehouse;\nimport com.example.api.repository."
},
{
"path": "api/src/main/java/com/example/api/utils/DataTimeUtil.java",
"chars": 951,
"preview": "package com.example.api.utils;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\n\npublic final class "
},
{
"path": "api/src/main/java/com/example/api/utils/JwtTokenUtil.java",
"chars": 2618,
"preview": "package com.example.api.utils;\n\nimport io.jsonwebtoken.Claims;\nimport io.jsonwebtoken.ExpiredJwtException;\nimport io.jso"
},
{
"path": "api/src/main/java/com/example/api/utils/RandomUtil.java",
"chars": 356,
"preview": "package com.example.api.utils;\n\nimport java.util.Random;\n\npublic final class RandomUtil {\n\n public static String next"
},
{
"path": "api/src/main/java/com/example/api/utils/ResponseUtil.java",
"chars": 1041,
"preview": "package com.example.api.utils;\n\nimport com.alibaba.fastjson.JSON;\n\nimport javax.servlet.http.HttpServletResponse;\nimport"
},
{
"path": "api/src/main/resources/application.yaml",
"chars": 448,
"preview": "server:\n port: 8080\nspring:\n mail:\n host: smtp.163.com\n protocol: smtp\n default-encoding: UTF-8\n #发件人\n "
},
{
"path": "web-app/.gitignore",
"chars": 231,
"preview": ".DS_Store\nnode_modules\n/dist\n\n\n# local env files\n.env.local\n.env.*.local\n\n# Log files\nnpm-debug.log*\nyarn-debug.log*\nyar"
},
{
"path": "web-app/README.md",
"chars": 775,
"preview": "# Antd Vue Admin 基础模版\n\n### 实现的基本功能\n\n- vuex封装关于User的部分\n\n- vuex + vue-router 的路由卫士\n\n- nprogress每次路由变化的进度条显示\n\n- layout公共布局\n"
},
{
"path": "web-app/package.json",
"chars": 650,
"preview": "{\n \"name\": \"wab-app\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"scripts\": {\n \"serve\": \"vue-cli-service serve\",\n "
},
{
"path": "web-app/public/index.html",
"chars": 331,
"preview": "<!DOCTYPE html>\n<html lang=\"\">\n<head>\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge"
},
{
"path": "web-app/src/App.vue",
"chars": 220,
"preview": "<template>\n <div id=\"app\">\n <router-view/>\n </div>\n</template>\n\n<style>\n\n/*顶部进度条样式*/\n#nprogress .bar {\n background"
},
{
"path": "web-app/src/api/admin.js",
"chars": 944,
"preview": "import service from \"../utils/request\";\n\nexport function IsInit() {\n return service({\n url: '/admin/hasInit',\n"
},
{
"path": "web-app/src/api/commodity.js",
"chars": 565,
"preview": "import service from \"../utils/request\";\n\nexport function FindAllCommodity() {\n return service({\n url: '/commod"
},
{
"path": "web-app/src/api/distribution.js",
"chars": 428,
"preview": "import service from \"../utils/request\";\n\nexport function FindAllDistribution() {\n return service({\n url: '/dis"
},
{
"path": "web-app/src/api/driver.js",
"chars": 409,
"preview": "import service from \"../utils/request\";\n\nexport function FindAllDriver(){\n return service({\n url: '/driver',\n "
},
{
"path": "web-app/src/api/employee.js",
"chars": 421,
"preview": "import service from \"../utils/request\";\n\nexport function FindAllEmployee(){\n return service({\n url: '/employee"
},
{
"path": "web-app/src/api/inventory.js",
"chars": 745,
"preview": "import service from \"../utils/request\";\n\nexport function AnalyzeCommodity(type) {\n return service({\n url: '/in"
},
{
"path": "web-app/src/api/role.js",
"chars": 146,
"preview": "import service from \"../utils/request\";\n\nexport function FindAllRole(){\n return service({\n url: '/role',\n "
},
{
"path": "web-app/src/api/sale.js",
"chars": 403,
"preview": "import service from \"../utils/request\";\n\nexport function FindAllSale() {\n return service({\n url: '/sale',\n "
},
{
"path": "web-app/src/api/vehicle.js",
"chars": 415,
"preview": "import service from \"../utils/request\";\n\nexport function FindAllVehicle(){\n return service({\n url: '/vehicle',"
},
{
"path": "web-app/src/api/warehouse.js",
"chars": 429,
"preview": "import service from \"../utils/request\";\n\nexport function FindAllWarehouse() {\n return service({\n url: '/wareho"
},
{
"path": "web-app/src/components/InventoryRecords.vue",
"chars": 1724,
"preview": "<template>\n <div>\n <download-excel\n class=\"export-excel-wrapper\"\n :data=\"data\"\n :fields=\"json_f"
},
{
"path": "web-app/src/layout/Aside.vue",
"chars": 2475,
"preview": "<template>\n <a-layout-sider\n :style=\"{ overflow: 'auto', height: '100vh', position: 'fixed', left: 0 }\"\n widt"
},
{
"path": "web-app/src/layout/Footer.vue",
"chars": 239,
"preview": "<template>\n <a-layout-footer :style=\"{ textAlign: 'center', letterSpacing: '1px' }\">\n 物流管理系统 ©2021 Created by 信息工程学院"
},
{
"path": "web-app/src/layout/Header.vue",
"chars": 2446,
"preview": "<template>\n <a-layout-header class=\"header\" :style=\"{ background: '#fff', padding: 0}\">\n <a-tooltip placement=\"botto"
},
{
"path": "web-app/src/layout/Index.vue",
"chars": 879,
"preview": "<template>\n <a-layout id=\"components-layout-demo-fixed-sider\">\n <Aside/>\n <a-layout :style=\"{ marginLeft: '220px'"
},
{
"path": "web-app/src/layout/Main.vue",
"chars": 159,
"preview": "<template>\n <a-layout-content :style=\"{ margin: '24px', overflow: 'initial' }\">\n <router-view/>\n </a-layout-content"
},
{
"path": "web-app/src/main.js",
"chars": 400,
"preview": "import Vue from 'vue'\nimport App from './App.vue'\nimport router from './router'\nimport store from './store'\nimport Antd "
},
{
"path": "web-app/src/router/index.js",
"chars": 602,
"preview": "import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport store from '../store'\nimport routes from \"@/router/route"
},
{
"path": "web-app/src/router/routes.js",
"chars": 3856,
"preview": "import Layout from '@/layout/Index'\n\nconst routes = [\n\n //公共布局下的路由\n {\n path: '/',\n component: Layout"
},
{
"path": "web-app/src/store/index.js",
"chars": 157,
"preview": "import Vue from 'vue'\nimport Vuex from 'vuex'\nimport user from './modules/user'\n\nVue.use(Vuex)\n\nexport default new Vuex."
},
{
"path": "web-app/src/store/modules/user.js",
"chars": 678,
"preview": "const state = {\n token: localStorage.getItem(\"token\"),\n details: JSON.parse(localStorage.getItem(\"user\"))\n}\n\nconst"
},
{
"path": "web-app/src/utils/request.js",
"chars": 680,
"preview": "import request from \"axios\"\nimport {message} from 'ant-design-vue'\nimport router from '../router/index'\n\nconst token = l"
},
{
"path": "web-app/src/views/Init.vue",
"chars": 2842,
"preview": "<template>\n <div class=\"login-box\">\n <div>\n <div class=\"box-header\">\n <img class=\"logo\" src=\"../assets/l"
},
{
"path": "web-app/src/views/Login.vue",
"chars": 4806,
"preview": "<template>\n <div class=\"login-box\">\n <div>\n <div class=\"box-header\">\n <img class=\"logo\" src=\"../assets/l"
},
{
"path": "web-app/src/views/Test.vue",
"chars": 2355,
"preview": "<template>\n <a-form-model :model=\"form\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n <a-form-model-item label=\""
},
{
"path": "web-app/src/views/analyze/In.vue",
"chars": 1642,
"preview": "<template>\n <div class=\"main\" id=\"main\">\n\n </div>\n</template>\n\n<script>\nimport * as echarts from 'echarts/core';\nimpor"
},
{
"path": "web-app/src/views/analyze/Out.vue",
"chars": 1643,
"preview": "<template>\n <div class=\"main\" id=\"main\">\n\n </div>\n</template>\n\n<script>\nimport * as echarts from 'echarts/core';\nimpor"
},
{
"path": "web-app/src/views/basics/Commodity.vue",
"chars": 4839,
"preview": "<template>\n <div>\n <div style=\"display: flex\">\n <a-button size=\"large\" class=\"editable-add-btn\" @click=\"commodi"
},
{
"path": "web-app/src/views/basics/Company.vue",
"chars": 2061,
"preview": "<template>\n <div>\n <a-input-search\n placeholder=\"请输入公司名\"\n enter-button=\"搜索来往公司\"\n style=\"width: "
},
{
"path": "web-app/src/views/basics/Details.vue",
"chars": 4481,
"preview": "<template>\n <div class=\"main\">\n <div class=\"header\">\n <router-link to=\"/warehouse\">\n <a-icon type=\"arrow"
},
{
"path": "web-app/src/views/basics/Employee.vue",
"chars": 6440,
"preview": "<template>\n <div>\n <a-button size=\"large\" class=\"editable-add-btn\" @click=\"visible = true\">\n <a-icon type=\"plus"
},
{
"path": "web-app/src/views/basics/Warehouse.vue",
"chars": 2590,
"preview": "<template>\n <div>\n <a-spin size=\"large\" :spinning=\"spinning\">\n <a-row :gutter=\"20\">\n <a-col :span=\"8\" cl"
},
{
"path": "web-app/src/views/delivery/Create.vue",
"chars": 5864,
"preview": "<template>\n <div class=\"main\">\n <a-steps :current=\"current\">\n <a-step title=\"填写申请信息\"></a-step>\n <a-step ti"
},
{
"path": "web-app/src/views/delivery/List.vue",
"chars": 8401,
"preview": "<template>\n <div>\n <a-table :loading=\"loading\" :columns=\"columns\" :data-source=\"data\" bordered rowKey=\"id\">\n <s"
},
{
"path": "web-app/src/views/error/403.vue",
"chars": 451,
"preview": "<template>\n <a-result status=\"403\" title=\"403\" sub-title=\"Sorry, you are not authorized to access this page.\">\n <tem"
},
{
"path": "web-app/src/views/error/404.vue",
"chars": 444,
"preview": "<template>\n <a-result status=\"404\" title=\"404\" sub-title=\"Sorry, the page you visited does not exist.\">\n <template #"
},
{
"path": "web-app/src/views/error/500.vue",
"chars": 428,
"preview": "<template>\n <a-result status=\"500\" title=\"500\" sub-title=\"Sorry, the server is wrong.\">\n <template #extra>\n <a-"
},
{
"path": "web-app/src/views/sale/Create.vue",
"chars": 4339,
"preview": "<template>\n <div class=\"main\">\n <a-steps :current=\"current\">\n <a-step title=\"填写信息\"></a-step>\n <a-step titl"
},
{
"path": "web-app/src/views/sale/Record.vue",
"chars": 2294,
"preview": "<template>\n <div>\n <a-table :loading=\"loading\" :columns=\"columns\" :data-source=\"data\" rowKey=\"id\">\n <a slot=\"co"
},
{
"path": "web-app/src/views/system/Admin.vue",
"chars": 5847,
"preview": "<template>\n <div>\n <a-button size=\"large\" class=\"editable-add-btn\" @click=\"addVisible = true\">\n <a-icon type=\"p"
},
{
"path": "web-app/src/views/system/Role.vue",
"chars": 1102,
"preview": "<template>\n <div class=\"main\">\n <div class=\"title\">系统权限列表</div>\n <a-spin size=\"large\" :spinning=\"spinning\">\n "
},
{
"path": "web-app/src/views/system/Security.vue",
"chars": 2602,
"preview": "<template>\n <div class=\"main\">\n <div class=\"title\">安全设置</div>\n <a-spin size=\"large\" :spinning=\"spinning\">\n <"
},
{
"path": "web-app/src/views/transport/Driver.vue",
"chars": 6425,
"preview": "<template>\n <div>\n <a-button size=\"large\" class=\"editable-add-btn\" @click=\"visible = true\">\n <a-icon type=\"plus"
},
{
"path": "web-app/src/views/transport/Vehicle.vue",
"chars": 3042,
"preview": "<template>\n <div>\n <a-spin size=\"large\" :spinning=\"spinning\">\n <a-row :gutter=\"20\">\n <a-col :span=\"8\" cl"
}
]
About this extraction
This page contains the full source code of the oooooomy/logistics GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 131 files (161.2 KB), approximately 43.9k tokens, and a symbol index with 298 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.