拒绝无效加班 !

 


文 / IDO老徐

 

 

是的,由于版本紧急发布,需要技术支撑,老徐今天在公司陪同项目组加了个班。
一天下来,毫无成就感,明显的无效加班。

各种坑,各种混乱,各种不爽…
虽然整个过程有持续集成,自动打包、部署、发布、校验、单元测试、接口测试、自动化测试,但是依然坑多多。本质来讲,还是团队协作问题,还是项目经理问题,还是技术团队本身技术短板问题。

从老徐个人角度来讲,本身不提倡加班。

如果一个团队老是加班,或者你个人老是加班。

要么团队协作效率问题,要么你个人能力问题,要么你时间管理问题
要么管理者项目节奏把控问题,要么管理者扛不住压力、团队工作量太过饱和。

老徐一向的原则是开放性、自管理,提高自己的工作效率,寻求微创新;能用自动化手段实现的就不用去手工折腾,太多人为主管因素导致的坑。
So,我们整个配置文件校验,打包版本校验,文件校验,进程校验,Log监控,都已实现自动化,尽量减少人为操作的坑。

然而,今天还是掉坑里了,还需不断完善,不断丰富,团队不断协作磨合。

不提倡:上班不作为,下班假忙活。
不提倡:不作为的加班文化
不提倡:对进度太过理想的项目管理者,往往坑的就是团队下面的Coder、Tester。把项目发布时间答应的太死,不考虑客观因素,然后就是加班赶进度。
不提倡:以上班工时为考核标准的古板制度。

 

 

你有哪些加班经历?
都是什么缘由导致的加班?
聊聊你对加班的看法…

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效稳定性。此外,文档还列举了大量相关的科研方向技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
<template> <view class="details"> <view class="detail-container"> <view class="detail-card"> <view class="card-header"> <text class="type">{{ detailData.approvalType?'请假申请':'加班申请'}}</text> <text class="status">{{ detailData.approvalStatus?'申请通过':'申请未通过' }}</text> </view> <view class="info-row"> <text class="label">申请人:</text> <text class="value name">{{ detailData.createBy }}</text> </view> <view class="info-row"> <text class="label">{{ detailData.approvalType?'请假':'加班' }}开始时间:</text> <text class="value time">{{detailData.startTime}}</text> </view> <view class="info-row"> <text class="label">{{ detailData.approvalType?'请假':'加班' }}结束时间:</text> <text class="value time">{{detailData.endTime}}</text> </view> <view class="info-row"> <text class="label">{{ detailData.approvalType?'请假':'加班' }}持续时长:</text> <text class="value time">{{detailData.duration}}</text> </view> <view class="info-row remark-row"> <text class="label">备注:</text> <text class="value remark">{{ detailData.remark || '无' }}</text> </view> <view class="input-container"> <radio-group class="uni-flex uni-row radio-group" @change="handleRadioChange"> <label class="radio-label"> <radio value="agree" :checked="selectedOption === 'agree'" color="#00ff00" style="transform: scale(0.7)" class="radio" /> <text>同意</text> </label> <label class="radio-label"> <radio value="refuse" :checked="selectedOption === 'refuse'" color="#ff0000" style="transform: scale(0.7)" class="radio" /> <text>拒绝</text> </label> </radio-group> </view> <view v-if="selectedOption === 'refuse'" class="input-container"> <input type="text" placeholder="请输入拒绝原因" class="input" v-model="rejectReason" :focus="selectedOption === 'refuse'" /> </view> </view> <button class="submit" @click="handleSubmit">确认</button> </view> </view> </template> <script> import { approval_getDetail } from '@/api/approve.js'; import { approval_agree } from '@/api/approve.js'; import { approval_refuse } from '@/api/approve.js'; export default { data() { return { detailData: {}, selectedOption: 'agree', rejectReason: '' }; }, onLoad(options) { if (options.item) { this.detailData = JSON.parse(decodeURIComponent(options.item)); } }, onReady() { uni.setNavigationBarTitle({ title: '审批详情' }); }, methods: { handleRadioChange(e) { this.selectedOption = e.detail.value; }, handleSubmit() { const apply_id = this.detailData.id; if (this.selectedOption === 'refuse' && !this.rejectReason) { uni.showToast({ title: '请输入拒绝原因', icon: 'none' }); return; } approval_getDetail(apply_id).then(response => { if (this.selectedOption === 'agree') { approval_agree(apply_id).then(response => { uni.showToast({ title: '已同意', icon: 'success', }); }).catch(error => { uni.showToast({ title: `确认失败`, icon: "error" }); console.error('确认失败:', error); }); } if (this.selectedOption === 'refuse') { const refuseReason = { id: apply_id, remark: this.rejectReason } approval_refuse(refuseReason).then(response => { uni.showToast({ title: '已拒绝', icon: 'success' }); }).catch(error => { uni.showToast({ title: `确认失败`, icon: "error" }); console.error('确认失败:', error); }); } }); } } }; </script> <style> .detail-container { padding: 20rpx; background-color: #f5f7fa; min-height: 100vh; } .detail-card { background-color: #ffffff; border-radius: 12rpx; padding: 30rpx; padding-left: 0; padding-right: 0; margin-bottom: 30rpx; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05); } .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30rpx; padding-bottom: 20rpx; border-bottom: 1rpx solid #eee; } .type { margin-left: 30rpx; margin-right: 30rpx; font-size: 36rpx; font-weight: bold; color: #333; } .status { font-size: 28rpx; padding: 6rpx 20rpx; border-radius: 30rpx; } .status-pending { background-color: #fff7e6; color: #fa8c16; } .status-approved { background-color: #f6ffed; color: #52c41a; } .status-rejected { background-color: #fff2f0; color: #ff4d4f; } .info-row { border-bottom: 1px solid #eee; padding-bottom: 30rpx; margin-left: 30rpx; margin-right: 30rpx; display: flex; margin-bottom: 24rpx; font-size: 30rpx; } .label { border-right: 1px solid #eee; color: #999; width: 250rpx; flex-shrink: 0; } .value { color: #333; flex: 1; } .remark-row { display: block; } .remark { color: #666; line-height: 1.6; display: block; margin-top: 10rpx; padding: 20rpx; background-color: #f9f9f9; border-radius: 8rpx; } .time { text-align: right; color: #666; font-size: 28rpx; } .name { text-align: right; font-weight: 500; } .radio-group { display: flex; align-items: center; justify-content: center; } .radio-label { display: flex; align-items: center; margin-right: 30px; } .input-container { margin: 15px 0; padding: 10px; /* background-color: #f5f5f5; */ border-radius: 4px; } .input { height: 40px; border: 1px solid #ddd; border-radius: 4px; padding: 0 10px; background-color: #fff; } .submit { margin-top: 20px; background-color: #007aff; color: white; border-radius: 4px; } </style> 后端接口连接异常
07-16
根据你提供的代码错误信息,后端接口连接异常可能由以下几个原因导致。以下是详细分析解决方案: --- ### **问题分析** 1. **参数格式错误** - 错误信息显示:`参数[id]要求类型为:'java.lang.Long'`,但实际传递的可能是字符串或对象格式不正确。 - 当前代码中,`apply_id` 直接使用了 `this.detailData.id`,但可能未确保其为 `Long` 类型(JavaScript 的 `Number` 类型可能被后端严格校验)。 2. **API 调用逻辑问题** - 在 `handleSubmit` 中,`approval_getDetail` `approval_agree`/`approval_refuse` 是**嵌套调用**的,但未处理 `approval_getDetail` 的失败情况,可能导致后续接口调用时参数未正确传递。 3. **拒绝请求的参数格式** - `approval_refuse` 传递的 `refuseReason` 对象可能不符合后端要求(例如字段名应为 `reason` 而非 `remark`)。 4. **网络或接口路径错误** - 接口路径(如 `@/api/approve.js`)可能配置错误,或后端服务未启动。 --- ### **解决方案** #### 1. **修正参数传递格式** 确保 `id` 是 `Number` 类型,并统一接口参数格式: ```javascript handleSubmit() { const apply_id = Number(this.detailData.id); // 强制转换为Number类型 if (isNaN(apply_id)) { uni.showToast({ title: '审批ID无效', icon: 'none' }); return; } if (this.selectedOption === 'refuse' && !this.rejectReason) { uni.showToast({ title: '请输入拒绝原因', icon: 'none' }); return; } // 直接调用审批接口,无需先获取详情(除非业务需要) if (this.selectedOption === 'agree') { approval_agree({ id: apply_id }) // 明确传递对象格式 .then(() => { uni.showToast({ title: '已同意', icon: 'success' }); // 可添加页面跳转逻辑 }) .catch(error => { uni.showToast({ title: '同意失败', icon: 'error' }); console.error('同意失败:', error); }); } else { approval_refuse({ id: apply_id, reason: this.rejectReason // 确认后端字段名是否为reason }) .then(() => { uni.showToast({ title: '已拒绝', icon: 'success' }); }) .catch(error => { uni.showToast({ title: '拒绝失败', icon: 'error' }); console.error('拒绝失败:', error); }); } } ``` #### 2. **检查 API 配置** 在 `@/api/approve.js` 中确认接口路径请求方法(如 `POST`/`GET`)是否正确: ```javascript // 示例:approve.js import request from '@/utils/request'; // 假设有封装请求库 export function approval_agree(data) { return request({ url: '/api/approval/agree', // 确认实际路径 method: 'post', data // POST请求传递参数 }); } export function approval_refuse(data) { return request({ url: '/api/approval/refuse', method: 'post', data }); } ``` #### 3. **处理网络错误** 在全局或接口调用处捕获网络异常: ```javascript // 在main.js或请求库中配置拦截器 import request from '@/utils/request'; request.interceptors.response.use( response => response, error => { if (error.message.includes('Network Error')) { uni.showToast({ title: '网络连接失败', icon: 'none' }); } return Promise.reject(error); } ); ``` #### 4. **验证后端接口** - 使用 **Postman** 或 **curl** 直接测试接口,确认: - 接口路径是否正确。 - 参数名类型是否匹配(如 `id` 必须为 `Long`)。 - 后端是否返回详细的错误信息(如 `400 Bad Request` 的具体原因)。 --- ### **其他优化建议** 1. **加载状态提示** 在提交时禁用按钮并显示加载中: ```javascript data() { return { isSubmitting: false }; }, methods: { async handleSubmit() { if (this.isSubmitting) return; this.isSubmitting = true; try { // 调用接口... } finally { this.isSubmitting = false; } } } ``` 2. **日志记录** 在开发阶段打印完整请求响应: ```javascript console.log('请求参数:', { id: apply_id, reason: this.rejectReason }); ``` --- ### **相关问题** 1. 如何确保前端传递的 `id` 参数类型与后端 `java.lang.Long` 完全匹配? 2. 如果后端接口需要 `POST` 请求但前端误用 `GET`,会导致什么问题? 3. 在 UniApp 中如何全局捕获网络请求失败(如 404 或 500 错误)? 4. 为什么 `approval_getDetail` 的调用可能不必要?如何优化嵌套接口调用? 5. 如果后端返回的错误信息不清晰,前端如何通过状态码区分不同错误类型?
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IDO老徐

转发 + 讨论 > 赞赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值