项目spring cloud整合flyway

公司项目用的微服务架构

苦于每次需要手动改数据库表

然后我在想能不能集成一个数据库版本管理工具

调查选择flyway

因为项目是分布式的,每个服务有一个数据库

然后我的做法是创建一个共同的子工程来统一管理sql文件

然后再resources目录创建每个工程对应的文件夹


再总的application.yml写入

#前缀: V 代表版本变迁(Versioned Migrations), U 代表撤销变迁(Undo Migrations), R 代表可重复变迁(Repeatable Migrations)
#版本号: 唯一的版本号,比如V1.0.1
#分隔符: __ (两个下划线)
#描述信息: 描述信息
#后缀: .sql
  flyway:
    # 是否开启flyway
    enabled: true
    encoding: utf-8
    # 是否禁用数据库清理
    clean-disabled: true
    # 若连接的数据库非空库,是否初始化
    # 当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
    baseline-on-migrate: true
    # sql脚本文件名前缀,默认大写V
    sql-migration-prefix: V
    # sql脚本文件名称的分隔符,默认2个下划线__
    sql-migration-separator: __
    # 迁移sql脚本文件名称的后缀
    sql-migration-suffixes: .sql
    # metadata 版本控制信息表 默认 flyway_schema_history
    table: flyway_schema_history
    # 指定 baseline 的版本号,默认值为 1, 低于该版本号的 SQL 文件, migrate 时会被忽略
    baseline-version: 1

然后再每个服务的配置文件中写入

  flyway:
    # 默认存放sql脚本目录,默认为db/migration
    locations: classpath:db/migration/im

指定每个工程sql位置

即可。。。。

sql文件的命名规则如下:

前缀: V 代表版本变迁(Versioned Migrations), U 代表撤销变迁(Undo Migrations), R 代表可重复变迁(Repeatable Migrations)

版本号: 唯一的版本号,比如V1.0.1

分隔符: __ (两个下划线)

描述信息: 描述信息

后缀: .sql

V1.0.0__create_user.sql

公司在对接快递100记录

首先小程序端的地图轨迹显示问题
如果使用web-view组件的话,地图会沾满满屏

所以要做小程序地图就必须使用在小程序用web-view组件 中引入项目h5页面然后再h5页面用iframe去引入地图轨迹url即可

如果H5页面想改名称的话可以用 来修改名称

 mounted() {
        document.title = "物流信息";
    },

H5代码

<template>
    <div class="app-container">
        <el-card class="box-card" shadow="hover">
            <span>{{ companyName }} {{ expressNumber }}</span>
            <span style="color: #ff5502; margin-left: 12px" @click="handleCopyText()">复制</span>
        </el-card>
        <el-card class="box-card" shadow="hover">
            <div slot="header" class="clearfix">
                <span>物流轨迹</span>
            </div>
            <div v-if="iframeMapUrl">
                <iframe id="iframe" width="100%" height="600px" frameborder="0" allowfullscreen :src="iframeMapUrl" />
            </div>
            <div v-else class="empty-space">暂无物流信息</div>
        </el-card>
        <el-card class="box-card" shadow="hover">
            <div slot="header" class="clearfix">
                <span>物流信息</span>
            </div>
            <template v-if="limitedProgressInfo">
                <div class="view-more-button">
                    <el-button type="text" @click="showAllProgressInfo">{{ showLimitedProgress ? '查看详情' : '收起详情' }}
                        <i :class="showLimitedProgress ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"></i></el-button>
                </div>
                <el-timeline>
                    <el-timeline-item v-for="(activity, index) in limitedProgressInfo" :key="index"
                        :timestamp="activity.time">
                        <template v-if="activity.status === '揽收'">
                            <span style="color: #67c23a">已揽收:</span>
                            <span>{{ activity.context }}</span>
                        </template>
                        <template v-else-if="activity.status === '在途'">
                            <span style="color: #409eff">运输中:</span>
                            <span>{{ activity.context }}</span>
                        </template>
                        <template v-else-if="activity.status === '派件'">
                            <span style="color: #f56c6c">派件中:</span>
                            <span>{{ activity.context }}</span>
                        </template>
                        <template v-else-if="activity.status === '签收'">
                            <span style="color: #67c23a">已签收:</span>
                            <span>{{ activity.context }}</span>
                        </template>
                        <template v-else-if="activity.status === '退回'">
                            <span style="color: #909399">已退回:</span>
                            <span>{{ activity.context }}</span>
                        </template>
                    </el-timeline-item>
                </el-timeline>
            </template>
            <div v-else class="empty-space">暂无物流信息</div>
        </el-card>
    </div>
</template>

<script>
import { deliveryCheck } from '@/api/mall'
export default {
    name: 'logisticsInfoh5',
    components: {},
    // metaInfo: {
    //     title: '物流信息'
    // },
    props: {
        type: {
            default: 1,
            type: Number
        }
    },
    mounted() {
        document.title = "物流信息";
    },
    computed: {

    },
    data() {
        return {
            post_name: '韵达快递', //快递名称
            logo: 'https://cdn.kuaidi100.com/images/all/56/yunda.png', //快递logo
            exp_phone: '95546', //快递电话
            progressVisible: false,
            companyName: null,
            expressNumber: null,
            companyNameExpressNumber: this.companyName + this.expressNumber,
            iframeMapUrl: null,
            progressInfo: null, // 完整的物流信息数据
            limitedProgressInfo: null, // 展示的部分物流信息数据
            showLimitedProgress: true // 控制是否只显示部分物流信息
        }
    },
    watch: {},
    created() {
        this.showProgressBox()
    },
    methods: {
        //复制
        handleCopyText() {
            // 创建一个 Input标签
            const cInput = document.createElement('input')
            cInput.value = this.companyName + this.expressNumber
            document.body.appendChild(cInput)
            cInput.select() // 选取文本域内容;
            // 执行浏览器复制命令
            // 复制命令会将当前选中的内容复制到剪切板中(这里就是创建的input标签)
            // Input要在正常的编辑状态下原生复制方法才会生效
            document.execCommand('Copy')
            this.$message.success('复制成功')
            /// 复制成功后再将构造的标签 移除
            cInput.remove()
        },
        //展示物流进度的对话框
        async showProgressBox() {
            const params = {
                orderNum: 3644
            }
            deliveryCheck(params)
                .then((res) => {
                    this.companyName = res.data.companyName
                    this.expressNumber = res.data.expressNumber

                    if (res.code !== 200) {
                        return this.$message.error('获取物流进度失败!')
                    }

                    if (res.data.queryTrackResp) {
                        this.progressInfo = res.data.queryTrackResp.data
                    }
                    if (res.data.queryTrackMapResp) {
                        this.iframeMapUrl = res.data.queryTrackMapResp.trailUrl
                    }
                    if (this.progressInfo) {
                        this.limitedProgressInfo = this.progressInfo.slice(0, 3)
                    }
                })
                .catch((error) => {
                    console.error(error)
                })
        },
        showAllProgressInfo() {
            this.limitedProgressInfo = this.progressInfo
            this.showLimitedProgress = !this.showLimitedProgress
            if (this.showLimitedProgress) {
                this.limitedProgressInfo = this.progressInfo.slice(0, 3)
            }
        }
    }
}
</script>
<style lang="scss" scoped>
.app-container {
    background-color: #f9f7f8;
}

.el-row {
    line-height: 2;
    font-size: 15px;
}

.box-card {
    margin: 20px 0;

    .flexItem {
        display: flex;
        align-items: center;

        .fuhao {
            margin-right: 3px;
            font-size: 16px;
            color: red;
        }

        .el-input {
            width: auto;
            flex: 1;
        }
    }
}

.custom-input {
    width: 300px;
    /* 设置输入框的宽度为300px */
}

.view-more-button {
    display: flex;
    justify-content: flex-end;
}
</style>

小程序代码:

ES深度分页查询报错 Result window is too large

Caused by: org.elasticsearch.ElasticsearchException: Elasticsearch exception [type=illegal_argument_exception, reason=Result window is too large, from + size must be less than or equal to: [5000] but was [321880]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.]
    at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:491) ~[elasticsearch-7.17.3.jar:7.17.3]
    at org.elasticsearch.ElasticsearchException.fromXContent(ElasticsearchException.java:402) ~[elasticsearch-7.17.3.jar:7.17.3]
    at org.elasticsearch.ElasticsearchException.innerFromXContent(ElasticsearchException.java:432) ~[elasticsearch-7.17.3.jar:7.17.3]
    ... 122 common frames omitted

这个异常意味着你的Elasticsearch查询尝试返回的结果数量超出了默认限制。默认情况下,Elasticsearch限制从一个搜索请求返回的文档数量为10,000。在你的情况下,你尝试返回了321,880个文档,因此触发了异常。

为了解决这个问题,你可以考虑以下几种方法:

使用滚动API:滚动API是一种更有效地处理大型数据集的方法。它允许你在多个请求之间维护一个持久的搜索上下文,并在不同的请求之间获取文档批次。这样可以避免从整个数据集中一次性获取大量文档。

调整索引级别的设置:你可以通过更改索引级别的设置来增加index.max_result_window的值,以允许更大的结果窗口。但是,这种方法可能会导致内存压力增加,因为Elasticsearch需要在内存中维护大量的搜索上下文。

优化查询:如果可能的话,尝试优化你的查询以减少返回的文档数量。你可以使用更精确的查询条件,或者利用Elasticsearch的聚合功能来汇总数据而不是一次性返回所有文档。

分页处理:如果你需要返回的文档数量仍然较大,你可以考虑分页处理结果。每次请求只返回一部分文档,并根据需要逐步获取更多的文档。

根据你的具体需求和系统配置,选择最合适的方法来解决这个问题。

调整索引级别的设置这个怎么设置
要调整索引级别的设置,你需要修改Elasticsearch中索引的参数。具体来说,你需要修改index.max_result_window参数,该参数定义了从一个搜索请求返回的最大文档数目。

你可以通过以下步骤来修改这个参数:

使用任何支持HTTP请求的工具(如curl、Postman等),向Elasticsearch发送HTTP请求。

发送一个PUT请求,指定要修改的索引名称,以及新的index.max_result_window的值。例如:

PUT /your_index_name/_settings
{
  "index.max_result_window": 50000
}

上面的示例将your_index_name索引的index.max_result_window参数值设置为50,000。你可以将该值设置为你认为合适的任何值,以满足你的需求。

发送请求后,Elasticsearch会返回一个确认响应,表示设置已经成功应用。

请注意,修改索引级别的设置可能会对系统性能产生影响,特别是当你增加了返回文档的数量时。确保在修改参数之前仔细评估系统的资源和性能需求。