物流快递管理系统

文章目录

  • 物流快递管理系统
    • 一、系统演示
    • 二、项目介绍
    • 三、13000字论文参考
    • 四、系统部分页面展示
    • 五、部分代码展示
    • 六、底部获取项目源码和万字论文参考(9.9¥带走)

物流快递管理系统

一、系统演示

校园物流快递管理系统

二、项目介绍

主要技术:Java、Spring、SpringMVC、Mybatis、jsp

开发环境
JAVA版本:JDK1.8
数据库:MySQL
运行工具:IDEA、Eclipse都可运行

有三个角色

管理员功能模块:具备快递人员管理、物流订单管理、取件发件管理以及系统其他配置功能;

快递员功能模块:具备物流订单管理功能和公告功能

用户功能模块:具备发布代取件、送件信息管理、评价功能和查询订单功能等;

项目技术
语言:java
框架:Spring、SpringMVC、Mybatis

三、13000字论文参考

在这里插入图片描述
在这里插入图片描述

四、系统部分页面展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、部分代码展示

package com.gssm.controller;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.gssm.util.HttpConstants;
import com.gssm.util.JsonDateValueProcessor;

/**
 * Controller基类
 */
public class BaseController {

	protected Logger logger = LoggerFactory.getLogger(this.getClass());

	protected final static String DATE_FORMATE = "yyyy-MM-dd";

	/**
	 * 返回服务端处理结果
	 * 
	 * @param obj
	 *            服务端输出对象
	 * @return 输出处理结果给前段JSON格式数据
	 */
	public String responseResult(Object obj) {
		JSONObject jsonObj = null;
		if (obj != null) {
			logger.info("后端返回对象:{}", obj);
			JsonConfig jsonConfig = new JsonConfig();
			jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
			jsonObj = JSONObject.fromObject(obj, jsonConfig);
			logger.info("后端返回数据:" + jsonObj);
		}
		logger.info("输出结果:{}", jsonObj.toString());
		return jsonObj.toString();
	}

	/**
	 * 返回成功
	 * 
	 * @param obj
	 *            输出对象
	 * @return 输出成功的JSON格式数据
	 */
	public String responseSuccess(Object obj) {
		JSONObject jsonObj = null;
		if (obj != null) {
			logger.info("后端返回对象:{}", obj);
			JsonConfig jsonConfig = new JsonConfig();
			jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
			jsonObj = JSONObject.fromObject(obj, jsonConfig);
		}
		logger.info("输出结果:{}", jsonObj.toString());
		return jsonObj.toString();
	}

	/**
	 * 返回成功
	 * 
	 * @param obj
	 *            输出对象
	 * @return 输出成功的JSON格式数据
	 */
	public String responseArraySuccess(Object obj) {
		JSONArray jsonObj = null;
		if (obj != null) {
			logger.info("后端返回对象:{}", obj);
			JsonConfig jsonConfig = new JsonConfig();
			jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
			jsonObj = JSONArray.fromObject(obj, jsonConfig);
			logger.info("后端返回数据:" + jsonObj);
		}
		logger.info("输出结果:{}", jsonObj.toString());
		return jsonObj.toString();
	}

	/**
	 * 返回成功
	 * 
	 * @param obj
	 *            输出对象
	 * @return 输出成功的JSON格式数据
	 */
	public String responseSuccess(Object obj, String msg) {
		
		JSONObject jsonObj = null;
		JSONObject jsonObj2 = null;
		if (obj != null) {
			logger.info("后端返回对象:{}", obj);
			JsonConfig jsonConfig = new JsonConfig();
			//jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
			jsonObj = JSONObject.fromObject(obj);
			jsonObj2 = new JSONObject();
			jsonObj2.put("datas", jsonObj);
			jsonObj2.put("message", msg);
			logger.info("后端返回数据:" + jsonObj2);
		}
		logger.info("输出结果:{}", jsonObj2.toString());
		return jsonObj2.toString();
	}

	/**
	 * 返回失败
	 * 
	 * @param errorMsg
	 *            错误信息
	 * @return 输出失败的JSON格式数据
	 */
	public String responseFail(String errorMsg) {
		JSONObject jsonObj = new JSONObject();
		jsonObj.put(HttpConstants.RESPONSE_RESULT_FLAG_ISERROR, true);
		jsonObj.put(HttpConstants.SERVICE_RESPONSE_RESULT_MSG, errorMsg);
		logger.info("输出结果:{}", jsonObj.toString());
		return jsonObj.toString();
	}

	// 下面是判断null的操作

	public boolean isEmpty(String str) {
		return (null == str) || (str.trim().length() <= 0);
	}

	public boolean isEmpty(Character cha) {
		return (null == cha) || cha.equals(' ');
	}

	public boolean isEmpty(Object obj) {
		return (null == obj);
	}

	public boolean isEmpty(Object[] objs) {
		return (null == objs) || (objs.length <= 0);
	}

	public boolean isEmpty(Collection<?> obj) {
		return (null == obj) || obj.isEmpty();
	}

	public boolean isEmpty(Set<?> set) {
		return (null == set) || set.isEmpty();
	}

	public boolean isEmpty(Serializable obj) {
		return null == obj;
	}

	public boolean isEmpty(Map<?, ?> map) {
		return (null == map) || map.isEmpty();
	}

	/**
	 * 
	 * 获得map
	 * @return
	 */
	public Map<String,Object> getMap(){
		return new HashMap<String,Object>();
	}
}

package com.gssm.controller;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.gssm.dao.DqorderDaoImpl;
import com.gssm.entity.Dqorder;
import com.gssm.entity.Order;
import com.gssm.util.JsonUtil2;
import com.gssm.util.Pager;

@Controller
@RequestMapping(value = "/dqorder")
public class DqorderController extends BaseController{
	/**
	 * 依赖注入 start dao/===
	 */
	@Autowired
	private DqorderDaoImpl dqorderDao;

	public DqorderDaoImpl getDqorderDao() {
		return dqorderDao;
	}

	public void setDqorderDao(DqorderDaoImpl dqorderDao) {
		this.dqorderDao = dqorderDao;
	}

	// --------------------------------------- 华丽分割线 ------------------------------//

	/**
	 * 分页查询 返回list对象(通过对象)
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value = "/list.action")
	public String list(Dqorder dqorder, Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		Pager<Dqorder> pagers = dqorderDao.findByEntity(dqorder);
		model.addAttribute("pagers", pagers);
		return "admin/dqorder/dqorder_list";
	}
	
	
	/**
	 * 分页查询 返回list对象(通过对象)
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value = "/list2.action")
	public String list2(Dqorder dqorder, Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		Pager<Dqorder> pagers = dqorderDao.findByEntity(dqorder);
		model.addAttribute("pagers", pagers);
		return "admin/dqorder/dqorder_list2";
	}
	
	/**
	 * 分页查询 返回list对象(通过对象)
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value = "/list3.action")
	public String list3(Dqorder dqorder, Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		Pager<Dqorder> pagers = dqorderDao.findByEntity(dqorder);
		model.addAttribute("pagers", pagers);
		return "admin/dqorder/dqorder_list3";
	}

	/**
	 * 跳转添加页面
	 */
	@RequestMapping(value = "/add.action")
	public String add(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		return "admin/dqorder/dqorder_add";
	}

	/**
	 * 跳至修改页面
	 * 
	 * @return
	 */
	@RequestMapping(value = "/edit.action")
	public String edit(Integer id, Model model) {
		Dqorder bean = dqorderDao.load(id);
		model.addAttribute("bean", bean);
		return "admin/dqorder/dqorder_edit";
	}
	
	/**
	 * 跳至修改页面
	 * 
	 * @return
	 */
	@RequestMapping(value = "/pingjia1.action")
	public String pingjia1(Integer id, Model model) {
		Dqorder bean = dqorderDao.load(id);
		model.addAttribute("bean", bean);
		return "admin/dqorder/dqorder_pingjia1";
	}
	
	/**
	 * 跳至修改页面
	 * 
	 * @return
	 */
	@RequestMapping(value = "/pingjia2.action")
	public String pingjia2(Integer id, Model model) {
		Dqorder bean = dqorderDao.load(id);
		model.addAttribute("bean", bean);
		return "admin/dqorder/dqorder_pingjia2";
	}
	/**
	 * 添加信息保存
	 */
	@RequestMapping(value = "/save.action")
	public String save(Dqorder dqorder, Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		dqorderDao.insert(dqorder);
		
		model.addAttribute("msg", "订单创建成功");
		
		return "common/succ";
	}
	
	/**
	 * 保存修改信息
	 */
	@RequestMapping(value = "/update1.action")
	public String update1(Dqorder dqorder, Model model, HttpServletRequest request, HttpServletResponse response) {
		
		Dqorder dqordertt = new Dqorder();
		dqordertt.setYid(dqorder.getYid());
		dqordertt.setYname(dqorder.getYname());
		Pager<Dqorder> pagers = dqorderDao.findByEntity1(dqordertt);
		if(pagers.getDatas().size() > 0){
			model.addAttribute("msg", "用户评分太低不能接单");
			return "common/succ";
		}
		dqorderDao.update(dqorder);
		model.addAttribute("msg", "操作成功");
		return "common/succ";
	}
	
	
	/**
	 * 保存修改信息
	 */
	@RequestMapping(value = "/update.action")
	public String update(Dqorder dqorder, Model model, HttpServletRequest request, HttpServletResponse response) {
		dqorderDao.update(dqorder);
//		return "redirect:/dqorder/list.action";
		model.addAttribute("msg", "操作成功");
		return "common/succ";
	}

	/**
	 * 删除通过主键
	 * @return
	 */
	@RequestMapping(value = "/del.action")
	public String delete(Integer id, Model model, HttpServletRequest request, HttpServletResponse response) {
		// 真正删除
		dqorderDao.deleteById(id);
		// 状态删除
		// Dqorder dqorder = dqorderDao.load(id);
		// load.setDel(1);
		// dqorderDao.update(load);
		return "redirect:/dqorder/list.action";
	}
	
		// --------------------------------------- 华丽分割线------------------------------------------------------//

	/**
	 * 分页查询 返回list json(通过对象)
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value = "/findByObj.json", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
	@ResponseBody
	public String findByObjByEntity(Dqorder dqorder, Model model, HttpServletRequest request, HttpServletResponse response) {
		// 分页查询
		Pager<Dqorder> pagers = dqorderDao.findByEntity(dqorder);
		JSONObject jsonObject = JsonUtil2.getJsonObject();
		jsonObject.put("pagers", pagers);
		jsonObject.put("obj", dqorder);
		return jsonObject.toString();
	}
package com.gssm.controller;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.gssm.dao.OrderDaoImpl;
import com.gssm.entity.Order;
import com.gssm.util.JsonUtil2;
import com.gssm.util.Pager;

@Controller
@RequestMapping(value = "/order")
public class OrderController extends BaseController{
	/**
	 * 依赖注入 start dao/===
	 */
	@Autowired
	private OrderDaoImpl orderDao;

	public OrderDaoImpl getOrderDao() {
		return orderDao;
	}

	public void setOrderDao(OrderDaoImpl orderDao) {
		this.orderDao = orderDao;
	}

	// --------------------------------------- 华丽分割线 ------------------------------//

	/**
	 * 分页查询 返回list对象(通过对象)
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value = "/list.action")
	public String list(Order order, Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		Pager<Order> pagers = orderDao.findByEntity(order);
		model.addAttribute("pagers", pagers);
		return "admin/order/order_list";
	}

	/**
	 * 跳转添加页面
	 */
	@RequestMapping(value = "/add.action")
	public String add(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		return "admin/order/order_add";
	}

	/**
	 * 跳至修改页面
	 * 
	 * @return
	 */
	@RequestMapping(value = "/edit.action")
	public String edit(Integer id, Model model) {
		Order bean = orderDao.load(id);
		model.addAttribute("bean", bean);
		return "admin/order/order_edit";
	}
	
	/**
	 * 添加信息保存
	 */
	@RequestMapping(value = "/save.action")
	public String save(Order order, Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
		orderDao.insert(order);
		
		model.addAttribute("msg", "订单创建成功");
		
		return "common/succ";
	}
	
	
	/**
	 * 保存修改信息
	 */
	@RequestMapping(value = "/update.action")
	public String update(Order order, Model model, HttpServletRequest request, HttpServletResponse response) {
		orderDao.update(order);
		model.addAttribute("msg", "订单修改成功");
		return "common/succ";
	}

	/**
	 * 删除通过主键
	 * @return
	 */
	@RequestMapping(value = "/del.action")
	public String delete(Integer id, Model model, HttpServletRequest request, HttpServletResponse response) {
		// 真正删除
		orderDao.deleteById(id);
		// 状态删除
		// Order order = orderDao.load(id);
		// load.setDel(1);
		// orderDao.update(load);
//		return "redirect:/order/list.action";
		model.addAttribute("msg", "订单删除成功");
		return "common/succ";
	}
	
		// --------------------------------------- 华丽分割线------------------------------------------------------//

	/**
	 * 分页查询 返回list json(通过对象)
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value = "/findByObj.json", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
	@ResponseBody
	public String findByObjByEntity(Order order, Model model, HttpServletRequest request, HttpServletResponse response) {
		// 分页查询
		Pager<Order> pagers = orderDao.findByEntity(order);
		JSONObject jsonObject = JsonUtil2.getJsonObject();
		jsonObject.put("pagers", pagers);
		jsonObject.put("obj", order);
		return jsonObject.toString();
	}

六、底部获取项目源码和万字论文参考(9.9¥带走)

有问题,或者需要协助调试运行项目的也可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/390501.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024.2.16日总结(小程序开发8)

数据监听器 监听对象属性的变化 数据监听器支持监听对象中单个或多个属性的变化 纯数据字段 什么是纯数据字段 纯数据字段指的是哪些不用于页面渲染的data字段 应用场景:例如有些情况下&#xff0c;某些 data 中的字段既不会展示在界面上&#xff0c;也不会传递给其他组件…

【每日一题】06 排序链表

问题描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 求解 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* sortList(struct ListNode* head) {struct…

SpringBoot RabbitMQ收发消息、配置及原理

今天分析SpringBoot通过自动配置集成RabbitMQ的原理以及使用。 AMQP概念 RabbitMQ是基于AMQP协议的message broker&#xff0c;所以我们首先要对AMQP做一个简单的了解。 AMQP (Advanced Message Queuing Protocol) is a messaging protocol that enables conforming client a…

476. Number Complement(数字的补数)

问题描述 对整数的二进制表示取反&#xff08;0 变 1 &#xff0c;1 变 0&#xff09;后&#xff0c;再转换为十进制表示&#xff0c;可以得到这个整数的补数。 例如&#xff0c;整数 5 的二进制表示是 “101” &#xff0c;取反后得到 “010” &#xff0c;再转回十进制表示…

JavaSE-03笔记【继承~super】

文章目录 1. 继承1.1 继承概述&#xff08;理解&#xff09;1.2 如何继承&#xff08;掌握&#xff09;1.2.1 继承的语法格式1.2.2 具体举例 1.3 继承的相关特性&#xff08;掌握&#xff09;1.4 对继承自Object类的方法的测试&#xff08;理解&#xff09;1.5 难点解惑1.5.1 掌…

07-k8s中secret资源02-玩转secret

一、回顾secret资源的简单实用 第一步&#xff1a;将想要的数据信息【key&#xff1a;value】中的value值&#xff0c;使用base64编码后&#xff0c;写入secret资源清单中&#xff1b; 第二步&#xff1a;创建secret资源&#xff1b; 第三步&#xff1a;pod资源引用secret资源&…

【Linux网络编程六】服务器守护进程化Daemon

【Linux网络编程六】服务器守护进程化Daemon 一.背景知识&#xff1a;前台与后台二.相关操作三.Linux的进程间关系四.自成会话五.守护进程四步骤六.服务器守护进程化 一.背景知识&#xff1a;前台与后台 核心知识就是一个用户在启动Linux时&#xff0c;都会给一个session会话&a…

最小生成树(Kruskal算法及相关例题)

1.Kruskal算法概念以及基本思路 &#xff08;1&#xff09;概念&#xff1a; 克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。它的时间复杂度为O&#xff08;ElogE&#xff09;(E是图G的边的总数)&#xff0c;适合于求边稀疏的网的最小生成树 。 其基本思想是&#xff…

JDBC访问数据库

目录 加载Driver驱动配置驱动地址 获取数据库连接创建会话-SQL命令发送器通过Statement发送SQL命令并得到结果处理结果关闭数据库资源测试 加载Driver驱动 1.在模块JDBC中新建一个lib目录文件 2. 将mysql-connector-j-8.2.0包粘贴至lib目录中。 配置驱动地址 // 加载…

Nvidia 携手 RTX 推出的本地运行 AI 聊天机器人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

人工智能学习与实训笔记(三):神经网络之目标检测问题

目录 五、目标检测问题 5.1 目标检测基础概念 5.1.1 边界框&#xff08;bounding box&#xff09; 5.1.2 锚框&#xff08;Anchor box&#xff09; 5.1.3 交并比 5.2 单阶段目标检测模型YOLOv3 5.2.1 YOLOv3模型设计思想 5.2.2 YOLOv3模型训练过程 5.2.3 如何建立输出…

uni-app 经验分享,从入门到离职(二)—— tabBar 底部导航栏实战基础篇

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;关于小程序 tabbar 的一些知识&#x1f3af;创建一个基本的 tabBar&#x1f4dd;最后 &#x1f4cb;前言 这篇文章的内容主题是关于小程序的 tabBar 底部导航栏的入门使用和实战技巧。通过上一篇文章的基础&#xff0c;我们…

【sgCreateTableColumn】自定义小工具:敏捷开发→自动化生成表格列html代码(表格列生成工具)[基于el-table-column]

源码 <template><!-- 前往https://blog.csdn.net/qq_37860634/article/details/136126479 查看使用说明 --><div :class"$options.name"><div class"sg-head">表格列生成工具</div><div class"sg-container"…

C++,stl,常用排序算法,常用拷贝和替换算法

目录 1.常用排序算法 sort random_shuffle merge reverse 2.常用拷贝和替换算法 copy replace replace_if swap 1.常用排序算法 sort 默认从小到大排序 #include<bits/stdc.h> using namespace std;int main() {vector<int> v;v.push_back(1);v.push_ba…

RabbitMQ如何保证可靠

0. RabbitMQ不可靠原因 消息从生产者到消费者的每一步都可能导致消息丢失&#xff1a; 发送消息时丢失&#xff1a; 生产者发送消息时连接MQ失败生产者发送消息到达MQ后未找到Exchange生产者发送消息到达MQ的Exchange后&#xff0c;未找到合适的Queue消息到达MQ后&#xff0c;…

idea里微服务依赖在maven能install但不能启动

场景&#xff1a;多个微服务相互依赖&#xff0c;install都没问题&#xff0c;jar包都是正常的&#xff0c;就连jar都能启动&#xff0c;为什么在idea里面项目就是不能启动呢&#xff0c;我是懵逼的 所以解决办法就是&#xff1a; 在设置的编译器里面虚拟机选项添加 -Djps.tr…

第五节 zookeeper集群与分布式锁_2

1.分布式锁概述 1.1 什么是分布式锁 1&#xff09;要介绍分布式锁&#xff0c;首先要提到与分布式锁相对应的是线程锁。 线程锁&#xff1a;主要用来给方法、代码块加锁。当某个方法或代码使用锁&#xff0c;在同一时刻仅有一个线程执行该方法或该代码段。 线程锁只在同一J…

LEETCODE 164. 破解闯关密码

class Solution { public:string crackPassword(vector<int>& password) {vector<string> password_str;for(int i0;i<password.size();i){password_str.push_back(to_string(password[i]));}//希尔排序int gappassword.size()/2;while(gap>0){for(int i…

命令执行讲解和函数

命令执行漏洞简介 命令执行漏洞产生原因 应用未对用户输入做严格得检查过滤&#xff0c;导致用户输入得参数被当成命令来执行 命令执行漏洞的危害 1.继承Web服务程序的权限去执行系统命会或读写文件 2.反弹shell&#xff0c;获得目标服务器的权限 3.进一步内网渗透 远程代…

python----输入输出算数运算

1.格式化输出 如果我们直接打印输出&#xff0c;就是输出变量的值&#xff0c;例如&#xff1a; 如果我们想打印a10就需要格式化字符串&#xff0c;就是使用f进行格式化&#xff0c;如图所示&#xff1b; 2.控制台输入 input执行的时候&#xff0c;就会等待用户进行输入&…