Курьерская система запросов, разработанная вручную, прочитала более 1,8 Вт.

Spring Boot
Курьерская система запросов, разработанная вручную, прочитала более 1,8 Вт.

Во-первых, цель

Первоначальный замысел этого проекта состоял в том, что в прошлом году я продавал фрукты из своего родного города на WeChat. Многие друзья просили у меня номер экспресс-отслеживания после размещения заказа. Каждый день после доставки я должен проверять, какая экспресс-информация принадлежит этому человеку. , Это очень хлопотно и осторожно. На основании этой мелочи у меня есть自助快递查询этой идеи. Импортируйте доставленную курьерскую информацию в мою систему, пользователи могут получить доступ к моей системе и проверить свою собственную информацию о курьерской логистике, введя свой номер мобильного телефона.
Проект был написан в августе прошлого года и заглох, недавно случайно прочитал присланную статью.Номер экспресс-отслеживания самообслуживанияКоличество чтения1.8wДа, есть фотографии и факты.

Это действительно меня шокировало, кажется, что экспресс-запрос самообслуживания действительно является горячей точкой. Сегодня я расскажу о системе экспресс-запросов, которую я разработал своими руками.

2. Развитие

адрес проекта:GitHub.com/hello WH UA люблю…
Если вы заинтересованы, вы можете загрузить исходный код напрямую.Если вы считаете, что проект хорош, не забудьте нажатьstar,Спасибо!

2.1 Стек технологий

Технологические стеки, задействованные в проекте:

  • SpringBoot: аJavaКаркас микросервиса. Spring boot — это новый фреймворк в семействе Spring, упрощающий создание и разработку приложений Spring.
  • Мибиты: одинORMFramework или объектно-реляционное сопоставление.ORMРоль платформы заключается в преобразовании таких операций, как сохранение, изменение и удаление постоянных объектов, в операции над базой данных.
  • Jquery: легкий写的少,做的多изJavaScriptбиблиотека функций.
  • Bootstrap: Bootstrap — это интерфейсная среда для быстрой разработки веб-приложений и веб-сайтов. Bootstrap основан на HTML, CSS, JAVASCRIPT.

2.2 Бэкенд-разработка

Создать сущность
Создайте класс сущности курьера с такими атрибутами, как идентификатор, имя пользователя (userName), телефон (phone), номер курьера (kuaidiNo), курьерская компания (company) и время создания данных (createTime). код показывает, как показано ниже:

@Data
@Builder
public class KuaiDi {
    private Integer id;
    /* 收件人姓名 */
    private String userName;
    /**收件人电话*/
    private String phone;
    /* 快递单号*/
    private String kuaidiNo;
    /*快递公司名称(拼音)*/
    private String company;
    /*订单创建时间*/
    private Date createTime;
    
    public KuaiDi(Integer id, String userName, String phone, String kuaidiNo, String company, Date createTime) {
        this.id = id;
        this.userName = userName;
        this.phone = phone;
        this.kuaidiNo = kuaidiNo;
        this.company = company;
        this.createTime = createTime;
    }
    public KuaiDi(Integer id, String userName, String phone, String kuaidiNo, String company) {
        this.id = id;
        this.userName = userName;
        this.phone = phone;
        this.kuaidiNo = kuaidiNo;
        this.company = company;
    }
}

сервис, картограф - это обычная операция добавления, удаления, поиска и модификации, которая предназначена для сохранения основной информации экспресс-доставки в базе данных и может выполнять простые функции обслуживания данных. Подробности смотрите в исходном коде проекта. Затем посмотрите на основной код.

Запрос экспресс-информации
Основная информация о экспресс-доставке хранится в базе данных, а затем с помощью этой информации запрашивается подробная логистическая информация об экспресс-доставке. Я предпринял здесь много попыток, я хочу напрямую вызвать интерфейс запроса экспресс-информации некоторых экспресс-компаний, но обнаружил, что интерфейсsession,когдаsessionПосле аннулирования данные не могут быть запрошены или запрошенные данные неверны. Наконец нашел платный план онлайн, используя快递100интерфейс.www.kuaidi100.com/Узнать об экспрессеdemoкод показывает, как показано ниже:

public class SynQueryDemo {

	/**
	 * 实时查询请求地址
	 */
	private static final String SYNQUERY_URL = "http://poll.kuaidi100.com/poll/query.do";
	
	private String key;			//授权key
	private String customer;	//实时查询公司编号

	public SynQueryDemo(String key, String customer) {
		this.key = key;
		this.customer = customer;
	}
	
	/**
	 * 实时查询快递单号
	 * @param com			快递公司编码
	 * @param num			快递单号
	 * @param phone			手机号
	 * @param from			出发地城市
	 * @param to			目的地城市
	 * @param resultv2		开通区域解析功能:0-关闭;1-开通
	 * @return
	 */
	public String synQueryData(String com, String num, String phone, String from, String to, int resultv2) {

		StringBuilder param = new StringBuilder("{");
		param.append("\"com\":\"").append(com).append("\"");
		param.append(",\"num\":\"").append(num).append("\"");
		param.append(",\"phone\":\"").append(phone).append("\"");
		param.append(",\"from\":\"").append(from).append("\"");
		param.append(",\"to\":\"").append(to).append("\"");
		if(1 == resultv2) {
			param.append(",\"resultv2\":1");
		} else {
			param.append(",\"resultv2\":0");
		}
		param.append("}");
		
		Map<String, String> params = new HashMap<String, String>();
		params.put("customer", this.customer);
		String sign = MD5Utils.encode(param + this.key + this.customer);
		params.put("sign", sign);
		params.put("param", param.toString());
		
		return this.post(params);
	}
	
	/**
	 * 发送post请求
	 */
	public String post(Map<String, String> params) {
		StringBuffer response = new StringBuffer("");
		
		BufferedReader reader = null;
		try {
			StringBuilder builder = new StringBuilder();
			for (Map.Entry<String, String> param : params.entrySet()) {
				if (builder.length() > 0) {
					builder.append('&');
				}
				builder.append(URLEncoder.encode(param.getKey(), "UTF-8"));
				builder.append('=');
				builder.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
			}
			byte[] bytes = builder.toString().getBytes("UTF-8");

			URL url = new URL(SYNQUERY_URL);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(3000);
			conn.setReadTimeout(3000);
			conn.setRequestMethod("POST");
			conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			conn.setRequestProperty("Content-Length", String.valueOf(bytes.length));
			conn.setDoOutput(true);
			conn.getOutputStream().write(bytes);

			reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
			
			String line = "";
            while ((line = reader.readLine()) != null) {
            	response.append(line);
            }
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != reader) {
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return response.toString();
	}
}

Приведенный выше код проходит черезjavaкод вызоваkuaidi100Этот интерфейс запроса автоматически определяет, к какой курьерской компании принадлежит курьер, по номеру курьера, а затем вызывает соответствующий интерфейс курьерской компании для получения данных ответа. Плата за покупку права на использование интерфейса фактически означает генерацию ключа авторизации и запрос номера компании клиента в режиме реального времени, а онлайн-вызов будет выполнять аутентификацию личности. Таким образом, вы можете получить информацию о курьереjsonданные.Я купил 100 юаней права на использование интерфейса Dayang, и вы можете напрямую вызывать интерфейс экспресс-запроса.

код контроллера
Добавление, удаление и изменение информации о курьереcontrollerЭто не указано здесь.Здесь я в основном смотрю на пакетную обработку интерфейса для запроса экспресс-доставки. код показывает, как показано ниже:

@RestController
public class KuaiDiQueryController {

    @Autowired
    private KuaiDiService kuaiDiService;
    @Autowired
    private KuaiDiQueryService kuaiDiQueryService;

    /**
     * 返回json数据
     * @param com
     * @param no
     * @return
     */
    @GetMapping("/getKuaiDiInfoByJson")
    @ResponseBody
    public String queryKuadiInfoByJson(String com, String no) {
        return kuaiDiQueryService.synQueryData(com, no,"", "", "", 0);
    }

    @GetMapping("/getKuaiDiInfoByPhone")
    @ResponseBody
    public Response queryKuaidiByPhone(String phone){
        Response response = new Response();
        if(StringUtils.isNotEmpty(phone)){
            List<ResponseData> responseDataList = new ArrayList<>();
            //  1.通过手机号查询下面的所有订单号
            List<KuaiDi> kuaiDiList = kuaiDiService.getList("", phone);
            if(!CollectionUtils.isEmpty(kuaiDiList)){
                kuaiDiList.forEach(kuaiDi -> {
                    //  2.依次查出所有的订单号
                    String responseDataStr = kuaiDiQueryService.synQueryData(kuaiDi.getCompany(), kuaiDi.getKuaidiNo(),"", "", "", 0);
                    ResponseData responseData = CommonUtils.convertJsonStr2Object(responseDataStr);
                    responseDataList.add(responseData);
                });
            }
            // 3.组装数据返回给前台
            response.setDataList(responseDataList);
        }
        return response;
    }
}

2.3 Фронтенд-разработка

Интерфейсный дисплей в основном включает две страницы: страницу администратора и страницу клиента. Функции страницы администратора включают добавление, изменение, удаление экспресс-информации, пейджинговый запрос и интерактивный информационный интерфейс экспресс-логистики. Страница клиента включает в себя пейджинговый запрос экспресс-информации и интерфейс онлайн-информации об экспресс-логистике. Поэтому в основном смотрите на страницу администратора.

HTML-страница
введена html-страницаjQueryа такжеBootstrap, jQuery устарел, но по-прежнему очень удобен в использовании.

<html>
<head>
  <title>快递单号查询</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="https://cdn.bootcss.com/bootbox.js/4.4.0/bootbox.min.js"></script>
    <link href="https://cdn.bootcss.com/bootstrap-table/1.11.1/bootstrap-table.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/bootstrap-table/1.11.1/bootstrap-table.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap-table/1.11.1/locale/bootstrap-table-zh-CN.min.js"></script>
  ...
</head>
<body>
    <div class="container-fluid">

        <div class="row">
            <nav class="navbar navbar-inverse navbar-fixed-top">
                <a class="navbar-brand" href="http://mhtclub.com">我的个人主页</a>
                <button class="navbar-toggle" data-toggle="collapse" data-target="#collapseMenu">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <div class="collapse navbar-collapse" id="collapseMenu">
                    <ul class="nav navbar-nav">
                        <li class="nav-li">
                            <a href="https://github.com/hellowHuaairen/kuaidi" target="_blank">本项目github</a>
                        </li>
                    </ul>
                </div>
            </nav>
        </div>

        <h1 class="page-header">
            快递单号自助查询
        </h1>

        <!-- 查询工具栏 -->
        <div class="form-inline">
            <div class="form-group">
                <label for="queryNameText">收件人姓名:</label>
                <input id="queryNameText" class="form-control input-sm">
            </div>
            <div class="form-group">
                <label for="queryPhoneText">收件人电话:</label>
                <input id="queryPhoneText" class="form-control input-sm">
            </div>
            <button class="btn btn-primary btn-sm" id="queryBtn">查询</button>
            <button class="btn btn-primary btn-sm" id="resetBtn">重置</button>
            <button class="btn btn-primary btn-sm" id="addBtn">新增</button>
        </div>
        <hr>

        <table id="testTable"></table>

        <!-- 查看订单信息模态窗 -->
        <div class="modal fade" id="viewModal">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">×</button>
                        <h4 class="modal-title">订单信息</h4>
                    </div>
                    <div class="modal-body" id="viewDataList"></div>
                    <div class="modal-footer">
                        <button class="btn btn-default" data-dismiss="modal">关闭</button>
                    </div>
                </div>
            </div>
        </div>
        <!-- 新增模态窗 -->
        <div class="modal fade" id="addModal">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">×</button>
                        <h4 class="modal-title">新增信息</h4>
                    </div>
                    <div class="modal-body">
                        <div class="form-inline">

                        </div>
                        <div class="form-group">
                            <label for="addNameText">收件人姓名:</label>
                            <input id="addNameText" class="form-control input-sm">
                        </div>
                        <div class="form-group">
                            <label for="addPhoneText">收件人电话:</label>
                            <input id="addPhoneText" class="form-control input-sm">
                        </div>
                        <div class="form-group">
                            <label for="addKuaiDiNoText">快递单号:</label>
                            <input id="addKuaiDiNoText" class="form-control input-sm">
                        </div>
                        <div class="form-group">
                            <label for="addCompanyText">快递公司(拼音):</label>
                            <input id="addCompanyText" class="form-control input-sm">
                        </div>
                    </div>
                    <div class="modal-footer">
                        <button class="btn btn-default" data-dismiss="modal">关闭</button>
                        <button class="btn btn-primary" id="saveAdd">保存</button>
                    </div>
                </div>
            </div>
        </div>

        <!-- 修改模态窗 -->
        <div class="modal fade" id="modifyModal">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">×</button>
                        <h4 class="modal-title">修改信息</h4>
                    </div>
                    <div class="modal-body">
                        <div class="form-inline">

                        </div>
                        <div class="form-group">
                            <label for="modifyNameText">收件人姓名:</label>
                            <input id="modifyNameText" class="form-control input-sm">
                        </div>
                        <div class="form-group">
                            <label for="modifyPhoneText">收件人电话:</label>
                            <input id="modifyPhoneText" class="form-control input-sm">
                        </div>
                        <div class="form-group">
                            <label for="modifyKuaiDiNoText">快递单号:</label>
                            <input id="modifyKuaiDiNoText" class="form-control input-sm">
                        </div>
                        <div class="form-group">
                            <label for="modifyCompanyText">快递公司(拼音):</label>
                            <input id="modifyCompanyText" class="form-control input-sm">
                        </div>
                    </div>
                    <div class="modal-footer">
                        <button class="btn btn-default" data-dismiss="modal">关闭</button>
                        <button class="btn btn-primary" id="saveModify">保存</button>
                    </div>
                </div>
            </div>
        </div>
    </div>  <!-- container-fluid -->

    <script type="text/javascript" src="js/admin.js"></script>
</body>
</html>

admin.js
Вот описание того, что я представил в интерфейсеjQuery, включая функции добавления, изменения, удаления и запроса. Событие запроса добавило обязательную проверку номера телефона.

var $testTable = $('#testTable');
$testTable.bootstrapTable({
    url: 'getList',
    queryParams: function (params) {
        return {
            offset: params.offset,
            limit: params.limit,
            userName: $('#queryNameText').val(),
            phone: $('#queryPhoneText').val()
        }
    },
    columns: [{
        field: 'id',
        title: '编号'
    }, {
        field: 'userName',
        title: '收件人姓名'
    }, {
        field: 'phone',
        title: '收件人电话'
    },  {
        field: 'company',
        title: '快递公司'
    },{
        field: 'kuaidiNo',
        title: '快递单号',
        formatter: function (value, row, index) {
            return [
				'<a onclick="kuaidiRecordInfo(' + "'" + row.kuaidiNo + "','" + row.company + "')" + '">' + row.kuaidiNo +'</a>',
            ].join('');
        },
    }, {
        formatter: function (value, row, index) {
            return [
                '<a href="javascript:modifyKuaiDi(' + row.id + ",'" + row.userName + "'," + row.phone + ",'" + row.kuaidiNo + "'" + ')">' +
                    '<i class="glyphicon glyphicon-pencil"></i>修改' +
                '</a>',
                '<a href="javascript:delKuaiDi(' + row.id + ')">' +
                    '<i class="glyphicon glyphicon-remove"></i>删除' +
                '</a>'
            ].join('');
        },
        title: '操作'
    }],
    striped: true,
    pagination: true,
    sidePagination: 'server',
    pageSize: 10,
    pageList: [5, 10, 25, 50, 100],
    rowStyle: function (row, index) {
        var ageClass = '';
        if (row.age < 18) {
            ageClass = 'text-danger';
        }
        return {classes: ageClass}
    },
});

// 设置bootbox中文
bootbox.setLocale('zh_CN');

var titleTip = '提示';

function kuaidiRecordInfo(no, company) {
    $('#viewModal').modal('show');
    $.ajax({
        type:'get',
        url:'getKuaiDiInfoByJson?com='+ company +'&no=' + no,
        cache:false,
        dataType:'json',
        success:function(result){
            // 显示详细信息 发送请求通过单号
			$("#viewDataList").empty();
            console.log(result.data);
            var dataList = result.data;
            if(null != dataList){
				$("#viewDataList").append('<li class="accordion-navigation"><a href="#kuaidi'+ '">快递单号:'+ result.nu +'</a><div id="kuaidi'+ '" class="content"></div></li>');
				$("#kuaidi").append('<section class="result-box"><div id="resultTop" class="flex result-top"><time class="up">时间</time><span>地点和跟踪进度</span></div><ul id="reordList'+'" class="result-list sortup"></ul></section>');  
                for(var i=0;i<dataList.length; i++){
                    var kuaiRecodList = dataList[i];
                    if( i == 0){
                        $("#reordList").append('<li class="last finish"><div class="time"> '+ kuaiRecodList.ftime + '</div><div class="dot"></div><div class="text"> '+ kuaiRecodList.context +'</div></li>');
                    }else{
                        $("#reordList").append('<li class=""><div class="time"> '+ kuaiRecodList.ftime + '</div><div class="dot"></div><div class="text"> '+ kuaiRecodList.context +'</div></li>');
                    }
                }
            }
        }
    });
}

// 验证姓名和地址是否为空
function verifyNameAndAddress(name, address) {
    if (name != '' && address != '') {
        return true;
    }
    return false;
}

function nullAlert() {
    bootbox.alert({
        title: titleTip,
        message: '所有项均为必填!'
    });
}

// 点击查询按钮
$('#queryBtn').click(function () {
    var age = $('#queryAgeText').val();
    // 刷新并跳转到第一页
    $testTable.bootstrapTable('selectPage', 1);

});

// 点击重置按钮,清空查询条件并跳转回第一页
$('#resetBtn').click(function() {
    $('.form-group :text').val('');
    $testTable.bootstrapTable('selectPage', 1);
});

// 用于修改服务器资源
function exchangeData(path, id, userName, phone, kuaiDiNo, company) {
    $.ajax({
        url: path,
        type: 'post',
        data : {
            id: id,
            userName: userName,
            phone: phone,
            kuaiDiNo: kuaiDiNo,
            company: company
        },
        success: function(res) {
            bootbox.alert({
                title: titleTip,
                message: res.message
            });
            // 在每次提交操作后返回首页
            $testTable.bootstrapTable('selectPage', 1);
        }
    });
}

// 新增
$('#addBtn').click(function() {
    $('#addNameText').val('');
    $('#addPhoneText').val('');
    $('#addKuaiDiNoText').val('');
	   $('#addCompanyText').val('');
    $('#addModal').modal('show');
});

$('#saveAdd').click(function() {
    $('#addModal').modal('hide');
    bootbox.confirm({
        title: titleTip,
        message: '确认增加?',
        callback: function (flag) {
            if (flag) {
                var userName = $('#addNameText').val();
                var phone = $('#addPhoneText').val();
                var kuaiDiNo = $('#addKuaiDiNoText').val();
                var company = $('#addCompanyText').val();
                if (verifyNameAndAddress(userName, kuaiDiNo)) {
                    exchangeData('addKuaiDi', null, userName, phone, kuaiDiNo, company);
                } else {
                    nullAlert();
                }
            }
        }
    });
});

var mid;

// 修改
function modifyKuaiDi(id, name, age, address) {
    mid = id;
    $('#modifyNameText').val(name);
    $('#modifyPhoneText').val(age);
    $('#modifyKuaiDiNoText').val(address);
	$('#modifyCompanyText').val(address);
    $('#modifyModal').modal('show');
}

$('#saveModify').click(function() {
    $('#modifyModal').modal('hide');
    bootbox.confirm({
        title: titleTip,
        message: '确认修改?',
        callback: function (flag) {
            if (flag) {
                var userName = $('#modifyNameText').val();
                var phone = $('#modifyPhoneText').val();
                var kuaiDiNo = $('#modifyKuaiDiNoText').val();
                var company = $('#modifyCompanyText').val();
                if (verifyNameAndAddress(userName, phone)) {
                    exchangeData('modifyKuaiDi', mid, userName, phone, kuaiDiNo, company);
                } else {
                    nullAlert();
                }
            }
        }
    });
});

// 删除
function delKuaiDi(id) {
    bootbox.confirm({
        title: titleTip,
        message: '确认删除?',
        callback: function(flag) {
            if (flag) {
                exchangeData("delKuaiDi", id);
            }
        }
    });
}

2.4 Запуск проекта

Изменить файл конфигурации
файл конфигурации проектаsrc/resources/application.propertiesи измените соответствующую информацию о соединении с базой данных в соответствии с реальной ситуацией.

#MySQL配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/kuaidi?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root #数据库账号
spring.datasource.password=root #数据库密码
#MyBatis日志配置
mybatis.mapperLocations=classpath:mapper/*.xml
mybatis.config-location=classpath:/config/mybatis-config.xml
#端口配置
server.port=8082

# 定位模板的目录
spring.mvc.view.prefix=classpath:/templates/
# 给返回的页面添加后缀名
spring.mvc.view.suffix=.html

Создание таблиц базы данных
Структура таблицы следующая:

DROP TABLE IF EXISTS `kuaidi`;
CREATE TABLE `kuaidi`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人姓名',
  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人电话',
  `kuaidi_no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '快递单号',
  `company` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '快递公司名称拼音',
  `create_time` datetime(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

бегать
импортировать проектIdeaинструменты, найтиcom.wangzg.kuaidi.KuaiDiApplicationфайл, выполнитьmainметод, как показано ниже:

3. Развертывание

3.1 jarразвертывать

Загрузите установочный пакет
Создано на сервере/usr/myworkspace, выполните следующую команду, чтобы создать его напрямую:

mkdir -p /usr/myworkspace

Скачать связанные файлы и загрузить на сервер/usr/myworkspace. ссылка для скачивания:GitHub.com/hello WH UA люблю…
К документам в основном относятся:

  • application.properties Описание: Файл конфигурации проекта может включать изменение порта сервера, доступа к базе данных, порта, учетной записи, пароля и т. д.
  • kuaidi.jar Описание: исполняемый файл серверной службы.jarдокумент.
  • kuaidi.sql Описание: Скрипт инициализации базы данных.
  • start.sh Описание: Запустить серверshellсценарий.
  • stop.sh Описание: Остановить серверshellсценарий.

Инициализировать базу данных
ОткрытьNavicatИнструменты, выберите базу данных, щелкните правой кнопкой мыши и выберите运行SQL文件..., Конкретная операция, так что инициализация базы данных завершена.

запустить проект
на сервере/usr/myworkspaceВ каталоге выполните следующую команду для запуска проекта:

chmod +x *.sh #给所有 .sh文件添加执行权限
./start.sh

3.2 Dockerразвертывать

DockerКонтейнерные проекты развертывания, вам необходимо создатьmysqlконтейнер, создатьkuaidiконтейнер, а затем инициализируйте базу данных.

Создать контейнер базы данных
код показывает, как показано ниже:

docker run -d --name mysql5.7 -e MYSQL_ROOT_PASSWORD=root -it -p 3306:3306 daocloud.io/library/mysql:5.7.7-rc

скрипт импорта базы данных
сценарий базы данныхkuaidi.sqlСодержание следующее:

create DATABASE kuaidi;
use kuaidi;

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `kuaidi`;
CREATE TABLE `kuaidi`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人姓名',
  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人电话',
  `kuaidi_no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '快递单号',
  `company` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '快递公司名称拼音',
  `create_time` datetime(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

Затем выполните следующую команду для импортаkuaidi.sqlсценарий:

docker exec -i mysql5.7 mysql -uroot -proot mysql < kuaidi.sql

Создайтеkuaidiконтейнер
Выполните следующую команду, чтобы создать контейнер:

docker run -d -p 9082:8082 -v application.properties:/home/conf/application.properties --name kuaidi1 huaairen/kuaidi:latest

Примечание:application.propertiesФайл является конфигурационным файлом проекта, вsrc/main/resourcesПод содержанием;huaairen/kuaidi:latestЭто мой упакованный образ, вы можете скачать его напрямую.

Четвертый, последний

Функционал проекта пока очень простой, и многие функции нуждаются в доработке и улучшении. Если вы также столкнетесь с подобными проблемами, мы можем обсудить вместе и сотрудничать для взаимовыгодной ситуации!

Беспокойная обезьяна
Усердно делитесь технологией!