feat: support ins pause and enable

This commit is contained in:
engigu
2024-01-14 17:05:35 +08:00
parent c935182412
commit 6349c1e1b7
8 changed files with 115 additions and 26 deletions
+9
View File
@@ -9,6 +9,7 @@ type SendTasksIns struct {
ContentType string `json:"content_type" gorm:"type:varchar(100) comment '实例类型';default:'';index:content_type"`
Config string `json:"config" gorm:"type:text comment '实例配置';"`
Extra string `json:"extra" gorm:"type:text comment '额外信息';"`
Enable int `json:"enable" gorm:"type:int comment '开启、暂停状态';default:1;"`
}
// InsEmailConfig 实例里面的邮箱config
@@ -61,3 +62,11 @@ func DeleteMsgTaskIns(id string) error {
}
return nil
}
// UpdateMsgTaskIns 更新实例
func UpdateMsgTaskIns(id string, data map[string]interface{}) error {
if err := db.Model(&SendTasksIns{}).Where("id = ?", id).Updates(data).Error; err != nil {
return err
}
return nil
}
+22 -4
View File
@@ -58,8 +58,25 @@ var LatestVersion = map[string]string{}
//11. 支持自动初始化表,以及初始化账号
//`
var V5Version = "v0.0.5"
var V5VersionDesc = `
//var V5Version = "v0.0.5"
//var V5VersionDesc = `
//1. 单应用打包
//2. 支持邮件发送
//3. 用户密码设置
//4. 支持用户定时任务清理,更新定时时间
//5. 查看定时清理日志
//6. 单应用的html浏览器自动缓存
//7. gin的日志使用logrus
//8. 支持异步发送
//9. 支持钉钉消息推送
//10. 支持自定义的webhook推送
//11. 支持自动初始化表,以及初始化账号
//12. 调整日志格式
//13. 支持更多的api接入示例
//`
var V6Version = "v0.0.6"
var V6VersionDesc = `
1. 单应用打包
2. 支持邮件发送
3. 用户密码设置
@@ -73,9 +90,10 @@ var V5VersionDesc = `
11. 支持自动初始化表,以及初始化账号
12. 调整日志格式
13. 支持更多的api接入示例
14. 支持发送实例的暂停与开启
`
func init() {
LatestVersion["version"] = V5Version
LatestVersion["desc"] = strings.TrimSpace(V5VersionDesc)
LatestVersion["version"] = V6Version
LatestVersion["desc"] = strings.TrimSpace(V6VersionDesc)
}
+33
View File
@@ -177,3 +177,36 @@ func AddTasksIns(c *gin.Context) {
appG.CResponse(http.StatusOK, "添加实例成功!", nil)
}
type UpdateMsgTaskInsEnableReq struct {
ID string `json:"ins_id" validate:"required,len=36" label:"实例id"`
Enable int `json:"status" validate:"" label:"实例开启状态"`
}
// UpdateMsgTaskInsEnable 更新消息渠道实例的是否开启
func UpdateMsgTaskInsEnable(c *gin.Context) {
var (
appG = app.Gin{C: c}
req UpdateMsgTaskInsEnableReq
)
errCode, errMsg := app.BindJsonAndPlayValid(c, &req)
if errCode != e.SUCCESS {
appG.CResponse(errCode, errMsg, nil)
return
}
InsService := send_ins_service.SendTaskInsService{
ID: req.ID,
//Enable: req.Enable,
}
err := InsService.Update(map[string]interface{}{
"enable": req.Enable,
})
if err != nil {
appG.CResponse(http.StatusBadRequest, "删除实例失败!", nil)
return
}
appG.CResponse(http.StatusOK, "删除实例成功!", nil)
}
+1
View File
@@ -68,6 +68,7 @@ func InitRouter(f embed.FS) *gin.Engine {
apiV1.POST("/sendtasks/ins/addone", v1.AddTasksIns)
apiV1.GET("/sendtasks/ins/gettask", v1.GetMsgSendWayIns)
apiV1.POST("/sendtasks/ins/delete", v1.DeleteMsgTaskIns)
apiV1.POST("/sendtasks/ins/update_enable", v1.UpdateMsgTaskInsEnable)
// message/send
apiV1.POST("/message/send", v1.DoSendMassage)
+5
View File
@@ -16,6 +16,7 @@ type SendTaskInsService struct {
PageNum int
PageSize int
Enable int
}
// ValidateDiffWay 各种发信渠道具体字段校验
@@ -77,6 +78,10 @@ func (st *SendTaskInsService) Delete() error {
return models.DeleteMsgTaskIns(st.ID)
}
func (st *SendTaskInsService) Update(data map[string]interface{}) error {
return models.UpdateMsgTaskIns(st.ID, data)
}
func (st *SendTaskInsService) Count() (int, error) {
return models.GetSendTasksTotal(st.Name, st.getMaps())
}
@@ -101,6 +101,12 @@ func (sm *SendMessageService) Send() string {
sm.LogsAndStatusMark(fmt.Sprintf("实例类型: %s + %s", ins.WayType, ins.ContentType), sm.Status)
sm.LogsAndStatusMark(fmt.Sprintf("实例配置: %s", ins.Config), sm.Status)
// 暂停了实例的发送
if ins.Enable != 1 {
sm.LogsAndStatusMark("该实例发送已经被暂停,跳过发送!\n", sm.Status)
continue
}
// 发送内容校验绑定
typeC, content := sm.GetSendMsg(ins.SendTasksIns)
if content == "" {
+7 -17
View File
@@ -45,14 +45,13 @@ request.interceptors.response.use(
return response;
},
(error) => {
if (error.response && error.response.status === 401) {
if (error.response && error.response.status == 401) {
logout();
} else if (20000 <= error.response.status <= 29999) {
} else if (20000 <= error.response.status && error.response.status <= 29999) {
logout();
} else {
handleException(error);
}
handleException(error);
// return Promise.reject(error);
}
);
@@ -60,20 +59,11 @@ request.interceptors.response.use(
const handleException = (error) => {
if (error.code == ERR_NETWORK) {
ElMessage({ message: `网络错误!`, type: 'error' })
} else if (error.response && error.response.data.code != 200) {
ElMessage({ message: error.response.data.msg, type: 'error' })
} else {
let msg = `未知错误:${error.response.status}, ${error.response.data.msg}`;
ElMessage({ message: msg, type: 'error' })
};
// if (error.response) {
// // 服务器返回错误状态码
// console.error('Server Error:', error.response.status, error.response.data);
// } else if (error.request) {
// // 请求发送成功,但没有收到响应
// console.error('No response received:', error.request);
// } else {
// // 其他错误
// console.error('Error:', error.message);
// }
};
// 登出系统
@@ -2,6 +2,16 @@
<el-dialog v-model="isShow" width="58%" :close-on-press-escape="false" :before-close="() => { }" :show-close="false">
<template #header="">
<el-text class="mx-1">编辑发信任务</el-text>
<el-tooltip placement="top">
<template #content>
实例可以实时暂停或者删除意味着可以实时控制发送的渠道
<br />
** 暂停或者删除都将不会往该实例发送
</template>
<el-icon>
<QuestionFilled />
</el-icon>
</el-tooltip>
</template>
<div class="add-top">
@@ -62,9 +72,18 @@
{{ formatExtraInfo(scope) }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60px">
<el-table-column label="状态" prop="status" width="60px">
<template #default="scope">
<el-tag v-if="scope.row.enable != 1" type="danger">暂停</el-tag>
<el-tag v-if="scope.row.enable == 1" type="success">开启</el-tag>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="100px">
<template #default="scope">
<tableDeleteButton @customHandleDelete="handleDelete(scope.$index, scope.row)" />
<el-button link size="small" style="" type="primary" @click="updateInsEnableStatus(scope.row)">
{{ scope.row.enable == 1 ? '暂停' : '开启' }}
</el-button>
</template>
</el-table-column>
</el-table>
@@ -82,7 +101,7 @@
<script>
import { defineComponent, onMounted, watch, reactive, toRefs } from 'vue';
import { _ } from 'lodash';
import { _, intersection } from 'lodash';
import { QuestionFilled } from '@element-plus/icons-vue'
import { v4 as uuidv4 } from 'uuid';
import { usePageState } from '@/store/page_sate.js';
@@ -194,7 +213,6 @@ export default defineComponent({
return postData
}
const handleAddSubmit = async () => {
let postData = getFinalData();
const rsp = await request.post('/sendtasks/ins/addone', postData);
@@ -203,6 +221,15 @@ export default defineComponent({
}
}
const updateInsEnableStatus = async (row) => {
let status = Number(!row.enable);
let postData = { ins_id: row.id, status: status };
const rsp = await request.post('/sendtasks/ins/update_enable', postData);
if (await rsp.data.code == 200) {
row.enable = status;
}
}
const handleEditTask = async () => {
let postData = { id: state.currTaskInput.taskId, name: state.currTaskInput.taskName };
const rsp = await request.post('/sendtasks/edit', postData);
@@ -212,8 +239,8 @@ export default defineComponent({
}
return {
...toRefs(state), handleCancer, handleAddSubmit, handleEditTask,CONSTANT,
searchID, handleDelete, insRowStyle, formatExtraInfo
...toRefs(state), handleCancer, handleAddSubmit, handleEditTask, CONSTANT,
searchID, handleDelete, insRowStyle, formatExtraInfo, updateInsEnableStatus
};
},
});