单个用户多次点击事件 会出现并发请求吗

$signRecord = SignRecord::where(['user_id'=>Auth::id(),'date_month'=>now()->format('Y-m')])->first();
if(!$signRecord){
    SignRecord::create([
    'user_id'=>Auth::id(),
    'date_month'=>now()->format('Y-m')
    ]);
}

用户多次点击事件 会出现并发请求吗

前端是vue click 提交签到 然后出现了重复数据 数据库没有设置联合唯一索引

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 8

会,如果用户一直点击(前端没加限制 异步)。

在判断是否存在的时候,也会有其他请求进来的。

应该用数据库 unique

(我之前的项目,因为用了 unqiue ,不然就 死翘翘 了)

4年前 评论

前端做限制,后端加把锁,数据库用唯一索引

4年前 评论

前端一般是给按钮加个disabled当作loading的

4年前 评论
自由与温暖是遥不可及的梦想

这种东西不要相信前端,最好还是数据库做好 unqiue 不然容易死

4年前 评论

最好能通过你所做的实际环境进行一下分析,后端进行一下数据筛选。

例如这个环境下,你可以通过队列形式来进行避免,让用户点击的事件推入消费队列中,然后再一个一个拿出来进行处理。如果只通过前端来发起请求的话,建议在前端按钮出加一个loading,或者去抖,这样可以保证当前用户在当前窗口中的短时间内只发起一次。

4年前 评论

加唯一索引有局限,除非绝对不可重复的字段。一般用redis锁,key可以组合登陆用户id。

4年前 评论

会,懒一点直接让前端做防抖,节流,loading 后端加唯一索引可以,但是只能防止新增 最好是对资源加锁,需要做好超时释放以及复杂业务锁自动续期问题

4年前 评论

可以加一个 标识isClick false 是标识不可以提交 true 是标识可提交 当点击提交时 isClick = true 再点击时返回return 就可以实现了 下面是uniapp的示例

<template>
    <view class="feed_container">
        <view class="feed_index">
            <view class="feedback_title">欢迎留下您的宝贵意见</view>
            <view class="feedback_input">
                <view class="box">
                    <view class="box_input">
                        <view class="box_body"><textarea name="idea" placeholder="意见内容" class="" style="height: 96upx;" @blur="getIdea"></textarea></view>
                    </view>
                </view>
            </view>
            <view class="mvbutton" @click="submit">提交</view>
        </view>
    </view>
</template>

<script>
export default {
    data() {
        return {
            text: '',
            phone: '',
            isClick: false
        };
    },
    methods: {
        onLoad: function() {},
        getIdea: function(e) {
            this.text = e.target.value;
        },
        submit: function() {
            if (this.isClick) {
                uni.showModal({
                    title: '你已经提交了'
                });
          return
            } else {
                uni.showModal({
                    title: '正在提交'
                });
                this.isClick = true;
            }
        }
    }
};
</script>

<style lang="scss">
.feed_container {
    height: 100vh;
    overflow-y: scroll;
    overflow-x: hidden;
    background-color: rgb(245, 245, 245);
    .feed_index {
        padding: 30upx;
        display: flex;
        align-items: center;
        height: 1000upx;
        flex-direction: column;

        .feedback_title {
            font-size: 30upx;
            color: #333;
            padding: 20upx 0;
        }
        .box {
            position: relative;
            display: flex;
            box-sizing: border-box;
            width: 100%;
            padding: 20upx 32upx;
            overflow: hidden;
            color: #323233;
            font-size: 28upx;
            line-height: 48upx;
            background-color: #fff;
            .box_input {
                overflow: visible;
                color: #323233;
                text-align: left;
                position: relative;
                text-align: right;
                vertical-align: middle;
                word-wrap: break-word;
                flex: 1;
                .box_body {
                    display: flex;
                    align-items: center;
                    color: #323233;
                    text-align: left;

                    .tel {
                        display: block;
                        box-sizing: border-box;
                        width: 100%;
                        min-width: 0;
                        margin: 0;
                        padding: 0;
                        color: #323233;
                        text-align: left;
                        background-color: transparent;
                        border: 0;
                        resize: none;
                    }
                }
            }
        }
        .box:not(:last-child):after {
            position: absolute;
            box-sizing: border-box;
            content: ' ';
            pointer-events: none;
            right: 0;
            bottom: 0;
            left: 32upx;
            border-bottom: 2upx solid #ebedf0;
            -webkit-transform: scaleY(0.5);
            transform: scaleY(0.5);
        }

        .mvbutton {
            margin-top: 20upx;
            width: 384upx;
            height: 91upx;
            color: #fff;
            font-size: 44upx;
            text-align: center;
            line-height: 98upx;
            background-image: -webkit-gradient(linear, left top, right top, from(#f6c87f), to(#ff7b4e));
            background-image: linear-gradient(90deg, #f6c87f, #ff7b4e);
            box-shadow: 0 6upx 15upx rgba(255, 123, 78, 0.95);
            border-radius: 200upx;
            position: relative;
        }
    }
}
</style>

第一次点击

file

再次点击时

file

这是知识前端例子

后端要判断他是不是已经签到了

没有->签到->返回签到成功

有->返回已签到

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!