Commit 3dc36ecced0cea0d9e96941634ec5bf8d3e28aea

Authored by YunaiV
1 parent e4a19f49

短信发送日志的前端,部分完成

ruoyi-ui/src/utils/dict.js
... ... @@ -19,6 +19,8 @@ export const DICT_TYPE = {
19 19 SYS_CONFIG_TYPE: 'sys_config_type',
20 20 SYS_SMS_CHANNEL_CODE: 'sys_sms_channel_code',
21 21 SYS_SMS_TEMPLATE_TYPE: 'sys_sms_template_type',
  22 + SYS_SMS_SEND_STATUS: 'sys_sms_send_status',
  23 + SYS_SMS_RECEIVE_STATUS: 'sys_sms_receive_status',
22 24  
23 25 INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type',
24 26 INF_JOB_STATUS: 'inf_job_status',
... ...
ruoyi-ui/src/views/system/operatelog/index.vue
... ... @@ -163,7 +163,6 @@ export default {
163 163 businessType: undefined,
164 164 status: undefined
165 165 },
166   -
167 166 };
168 167 },
169 168 created() {
... ...
ruoyi-ui/src/views/system/sms/smsLog.vue
... ... @@ -2,16 +2,20 @@
2 2 <div class="app-container">
3 3  
4 4 <!-- 搜索工作栏 -->
5   - <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
6   - <el-form-item label="短信渠道编号" prop="channelId">
7   - <el-input v-model="queryParams.channelId" placeholder="请输入短信渠道编号" clearable size="small" @keyup.enter.native="handleQuery"/>
  5 + <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
  6 + <el-form-item label="手机号" prop="mobile">
  7 + <el-input v-model="queryParams.mobile" placeholder="请输入手机号" clearable size="small" @keyup.enter.native="handleQuery"/>
  8 + </el-form-item>
  9 + <el-form-item label="短信渠道" prop="channelId">
  10 + <el-select v-model="queryParams.channelId" placeholder="请选择短信渠道" clearable size="small">
  11 + <el-option v-for="channel in channelOptions"
  12 + :key="channel.id" :value="channel.id"
  13 + :label="channel.signature + '【' + getDictDataLabel(DICT_TYPE.SYS_SMS_CHANNEL_CODE, channel.code) + '】'" />
  14 + </el-select>
8 15 </el-form-item>
9 16 <el-form-item label="模板编号" prop="templateId">
10 17 <el-input v-model="queryParams.templateId" placeholder="请输入模板编号" clearable size="small" @keyup.enter.native="handleQuery"/>
11 18 </el-form-item>
12   - <el-form-item label="手机号" prop="mobile">
13   - <el-input v-model="queryParams.mobile" placeholder="请输入手机号" clearable size="small" @keyup.enter.native="handleQuery"/>
14   - </el-form-item>
15 19 <el-form-item label="发送状态" prop="sendStatus">
16 20 <el-select v-model="queryParams.sendStatus" placeholder="请选择发送状态" clearable size="small">
17 21 <el-option label="请选择字典生成" value="" />
... ... @@ -52,46 +56,51 @@
52 56 <!-- 列表 -->
53 57 <el-table v-loading="loading" :data="list">
54 58 <el-table-column label="编号" align="center" prop="id" />
55   - <el-table-column label="短信渠道编号" align="center" prop="channelId" />
56   - <el-table-column label="短信渠道编码" align="center" prop="channelCode" />
57   - <el-table-column label="模板编号" align="center" prop="templateId" />
58   - <el-table-column label="模板编码" align="center" prop="templateCode" />
59   - <el-table-column label="短信类型" align="center" prop="templateType" />
60   - <el-table-column label="短信内容" align="center" prop="templateContent" />
61   - <el-table-column label="短信参数" align="center" prop="templateParams" />
62   - <el-table-column label="短信 API 的模板编号" align="center" prop="apiTemplateId" />
63   - <el-table-column label="手机号" align="center" prop="mobile" />
64   - <el-table-column label="用户编号" align="center" prop="userId" />
65   - <el-table-column label="用户类型" align="center" prop="userType" />
66   - <el-table-column label="发送状态" align="center" prop="sendStatus" />
67   - <el-table-column label="发送时间" align="center" prop="sendTime" width="180">
  59 + <el-table-column label="创建时间" align="center" prop="createTime" width="180">
68 60 <template slot-scope="scope">
69   - <span>{{ parseTime(scope.row.sendTime) }}</span>
  61 + <span>{{ parseTime(scope.row.createTime) }}</span>
  62 + </template>
  63 + </el-table-column>
  64 + <el-table-column label="手机号" align="center" prop="mobile" width="120">
  65 + <template slot-scope="scope">
  66 + <div>{{ scope.row.mobile }}</div>
  67 + <div v-if="scope.row.userType && scope.row.userId">
  68 + {{ getDictDataLabel(DICT_TYPE.USER_TYPE, scope.row.userType) + '(' + scope.row.userId + ')' }}
  69 + </div>
  70 + </template>
  71 + </el-table-column>
  72 + <el-table-column label="短信内容" align="center" prop="templateContent" width="300" />
  73 + <el-table-column label="发送状态" align="center">
  74 + <template slot-scope="scope">
  75 + <span>{{ getDictDataLabel(DICT_TYPE.SYS_SMS_SEND_STATUS, scope.row.sendStatus) }}</span>
  76 + </template>
  77 + </el-table-column>
  78 + <el-table-column label="接收状态" align="center">
  79 + <template slot-scope="scope">
  80 + <span>{{ getDictDataLabel(DICT_TYPE.SYS_SMS_RECEIVE_STATUS, scope.row.receiveStatus) }}</span>
70 81 </template>
71 82 </el-table-column>
72   - <el-table-column label="发送结果的编码" align="center" prop="sendCode" />
73   - <el-table-column label="发送结果的提示" align="center" prop="sendMsg" />
74   - <el-table-column label="短信 API 发送结果的编码" align="center" prop="apiSendCode" />
75   - <el-table-column label="短信 API 发送失败的提示" align="center" prop="apiSendMsg" />
76   - <el-table-column label="短信 API 发送返回的唯一请求 ID" align="center" prop="apiRequestId" />
77   - <el-table-column label="短信 API 发送返回的序号" align="center" prop="apiSerialNo" />
78   - <el-table-column label="接收状态" align="center" prop="receiveStatus" />
79 83 <el-table-column label="接收时间" align="center" prop="receiveTime" width="180">
80 84 <template slot-scope="scope">
81 85 <span>{{ parseTime(scope.row.receiveTime) }}</span>
82 86 </template>
83 87 </el-table-column>
84   - <el-table-column label="API 接收结果的编码" align="center" prop="apiReceiveCode" />
85   - <el-table-column label="API 接收结果的说明" align="center" prop="apiReceiveMsg" />
86   - <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  88 + <el-table-column label="短信渠道" align="center">
87 89 <template slot-scope="scope">
88   - <span>{{ parseTime(scope.row.createTime) }}</span>
  90 + <div>{{ formatChannelSignature(scope.row.channelId) }}</div>
  91 + <div>【{{ getDictDataLabel(DICT_TYPE.SYS_SMS_CHANNEL_CODE, scope.row.channelCode) }}】</div>
  92 + </template>
  93 + </el-table-column>
  94 + <el-table-column label="模板编号" align="center" prop="templateId" />
  95 + <el-table-column label="短信类型" align="center" prop="templateType">
  96 + <template slot-scope="scope">
  97 + <span>{{ getDictDataLabel(DICT_TYPE.SYS_SMS_TEMPLATE_TYPE, scope.row.templateType) }}</span>
89 98 </template>
90 99 </el-table-column>
91 100 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
92 101 <template slot-scope="scope">
93   - <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
94   - v-hasPermi="['system:sms-log:update']">修改</el-button>
  102 + <el-button size="mini" type="text" icon="el-icon-view" @click="handleView(scope.row,scope.index)"
  103 + v-hasPermi="['system:sms-log:query']">详细</el-button>
95 104 </template>
96 105 </el-table-column>
97 106 </el-table>
... ... @@ -99,13 +108,59 @@
99 108 <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
100 109 @pagination="getList"/>
101 110  
102   - <!-- 对话框(添加 / 修改) -->
  111 + <!-- 短信日志详细 -->
  112 + <el-dialog title="短信日志详细" :visible.sync="open" width="700px" append-to-body>
  113 + <el-form ref="form" :model="form" label-width="100px" size="mini">
  114 + <el-row>
  115 + <el-col :span="24">
  116 + <el-form-item label="日志主键:">{{ form.id }}</el-form-item>
  117 + </el-col>
  118 + <el-col :span="24">
  119 + <el-form-item label="链路追踪:">{{ form.traceId }}</el-form-item>
  120 + </el-col>
  121 + <el-col :span="24">
  122 + <el-form-item label="用户信息:">{{ form.userId }} | {{ form.userNickname }} | {{ form.userIp }} | {{ form.userAgent}} </el-form-item>
  123 + </el-col>
  124 + <el-col :span="24">
  125 + <el-form-item label="操作信息:">
  126 + {{ form.module }} | {{ form.name }} | {{ getDictDataLabel(DICT_TYPE.SYS_OPERATE_TYPE, form.type) }}
  127 + <br /> {{ form.content }}
  128 + <br /> {{ form.exts }}
  129 + </el-form-item>
  130 + </el-col>
  131 + <el-col :span="24">
  132 + <el-form-item label="请求信息:">{{ form.requestMethod }} | {{ form.requestUrl }} </el-form-item>
  133 + </el-col>
  134 + <el-col :span="24">
  135 + <el-form-item label="方法名:">{{ form.javaMethod }}</el-form-item>
  136 + </el-col>
  137 + <el-col :span="24">
  138 + <el-form-item label="方法参数:">{{ form.javaMethodArgs }}</el-form-item>
  139 + </el-col>
  140 + <el-col :span="24">
  141 + <el-form-item label="开始时间:">
  142 + {{ parseTime(form.startTime) }} | {{ form.duration }} ms
  143 + </el-form-item>
  144 + </el-col>
  145 + <el-col :span="12">
  146 + <el-form-item label="操作结果:">
  147 + <div v-if="form.resultCode === 0">正常 | {{ form.resultData}} </div>
  148 + <div v-else-if="form.resultCode > 0">失败 | {{ form.resultCode }} || {{ form.resultMsg}}</div>
  149 + </el-form-item>
  150 + </el-col>
  151 + </el-row>
  152 + </el-form>
  153 + <div slot="footer" class="dialog-footer">
  154 + <el-button @click="open = false">关 闭</el-button>
  155 + </div>
  156 + </el-dialog>
103 157  
104 158 </div>
105 159 </template>
106 160  
107 161 <script>
108 162 import { getSmsLogPage, exportSmsLogExcel } from "@/api/system/sms/smsLog";
  163 +import { getSimpleSmsChannels } from "@/api/system/sms/smsChannel";
109 164  
110 165 export default {
111 166 name: "SmsLog",
... ... @@ -127,6 +182,8 @@ export default {
127 182 open: false,
128 183 dateRangeSendTime: [],
129 184 dateRangeReceiveTime: [],
  185 + // 表单参数
  186 + form: {},
130 187 // 查询参数
131 188 queryParams: {
132 189 pageNo: 1,
... ... @@ -137,10 +194,16 @@ export default {
137 194 sendStatus: null,
138 195 receiveStatus: null,
139 196 },
  197 + // 短信渠道
  198 + channelOptions: [],
140 199 };
141 200 },
142 201 created() {
143 202 this.getList();
  203 + // 获得短信渠道
  204 + getSimpleSmsChannels().then(response => {
  205 + this.channelOptions = response.data;
  206 + })
144 207 },
145 208 methods: {
146 209 /** 查询列表 */
... ... @@ -192,6 +255,20 @@ export default {
192 255 }).then(response => {
193 256 this.downloadExcel(response, '短信日志.xls');
194 257 })
  258 + },
  259 + /** 详细按钮操作 */
  260 + handleView(row) {
  261 + this.open = true;
  262 + this.form = row;
  263 + },
  264 + /** 格式化短信渠道 */
  265 + formatChannelSignature(channelId) {
  266 + for (const channel of this.channelOptions) {
  267 + if (channel.id === channelId) {
  268 + return channel.signature;
  269 + }
  270 + }
  271 + return '找不到签名:' + channelId;
195 272 }
196 273 }
197 274 };
... ...
ruoyi-ui/src/views/system/sms/smsTemplate.vue
... ... @@ -21,8 +21,8 @@
21 21 <el-form-item label="短信 API 的模板编号" prop="apiTemplateId">
22 22 <el-input v-model="queryParams.apiTemplateId" placeholder="请输入短信 API 的模板编号" clearable size="small" @keyup.enter.native="handleQuery"/>
23 23 </el-form-item>
24   - <el-form-item label="短信渠道编号" prop="channelId">
25   - <el-select v-model="queryParams.channelId" placeholder="请选择短信渠道编号" clearable size="small">
  24 + <el-form-item label="短信渠道" prop="channelId">
  25 + <el-select v-model="queryParams.channelId" placeholder="请选择短信渠道" clearable size="small">
26 26 <el-option v-for="channel in channelOptions"
27 27 :key="channel.id" :value="channel.id"
28 28 :label="channel.signature + '【' + getDictDataLabel(DICT_TYPE.SYS_SMS_CHANNEL_CODE, channel.code) + '】'" />
... ... @@ -60,12 +60,12 @@
60 60 <template slot-scope="scope">
61 61 <span>{{ getDictDataLabel(DICT_TYPE.SYS_SMS_TEMPLATE_TYPE, scope.row.type) }}</span>
62 62 </template>
63   - </el-table-column>>
  63 + </el-table-column>
64 64 <el-table-column label="开启状态" align="center" prop="status">
65 65 <template slot-scope="scope">
66 66 <span>{{ getDictDataLabel(DICT_TYPE.SYS_COMMON_STATUS, scope.row.status) }}</span>
67 67 </template>
68   - </el-table-column>>
  68 + </el-table-column>
69 69 <el-table-column label="备注" align="center" prop="remark" />
70 70 <el-table-column label="短信 API 的模板编号" align="center" prop="apiTemplateId" width="180" />
71 71 <el-table-column label="短信渠道" align="center">
... ...
src/main/java/cn/iocoder/dashboard/framework/sms/core/client/SmsClient.java
... ... @@ -28,10 +28,11 @@ public interface SmsClient {
28 28 * @param logId 日志编号
29 29 * @param mobile 手机号
30 30 * @param apiTemplateId 短信 API 的模板编号
31   - * @param templateParams 短信模板参数
  31 + * @param templateParams 短信模板参数。通过 List 数组,保证参数的顺序
32 32 * @return 短信发送结果
33 33 */
34   - SmsCommonResult<SmsSendRespDTO> sendSms(Long logId, String mobile, String apiTemplateId, List<KeyValue<String, Object>> templateParams);
  34 + SmsCommonResult<SmsSendRespDTO> sendSms(Long logId, String mobile, String apiTemplateId,
  35 + List<KeyValue<String, Object>> templateParams);
35 36  
36 37 /**
37 38 * 解析接收短信的接收结果
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java
... ... @@ -41,7 +41,7 @@ public class SysDictTypeController {
41 41 return success(dictTypeId);
42 42 }
43 43  
44   - @PostMapping("update")
  44 + @PutMapping("/update")
45 45 @ApiOperation("修改字典类型")
46 46 @PreAuthorize("@ss.hasPermission('system:dict:update')")
47 47 public CommonResult<Boolean> updateDictType(@Valid @RequestBody SysDictTypeUpdateReqVO reqVO) {
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java
... ... @@ -20,6 +20,8 @@ public enum SysDictTypeEnum {
20 20 SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型
21 21 SYS_SMS_CHANNEL_CODE("sys_sms_channel_code"), // 短信渠道编码
22 22 SYS_SMS_TEMPLATE_TYPE("sys_sms_template_type"), // 短信模板类型
  23 + SYS_SMS_SEND_STATUS("sys_sms_send_status"), // 短信发送状态
  24 + SYS_SMS_RECEIVE_STATUS("sys_sms_receive_status"), // 短信接收状态
23 25  
24 26 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型
25 27 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举
... ...
src/main/resources/codegen/vue/views/index.vue.vm
... ... @@ -76,7 +76,7 @@
76 76 <template slot-scope="scope">
77 77 <span>{{ getDictDataLabel(DICT_TYPE.$dictType.toUpperCase(), scope.row.${column.javaField}) }}</span>
78 78 </template>
79   - </el-table-column>>
  79 + </el-table-column>
80 80 #else
81 81 <el-table-column label="${comment}" align="center" prop="${javaField}" />
82 82 #end
... ...