Commit 3dc36ecced0cea0d9e96941634ec5bf8d3e28aea

Authored by YunaiV
1 parent e4a19f49

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

ruoyi-ui/src/utils/dict.js
@@ -19,6 +19,8 @@ export const DICT_TYPE = { @@ -19,6 +19,8 @@ export const DICT_TYPE = {
19 SYS_CONFIG_TYPE: 'sys_config_type', 19 SYS_CONFIG_TYPE: 'sys_config_type',
20 SYS_SMS_CHANNEL_CODE: 'sys_sms_channel_code', 20 SYS_SMS_CHANNEL_CODE: 'sys_sms_channel_code',
21 SYS_SMS_TEMPLATE_TYPE: 'sys_sms_template_type', 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 INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type', 25 INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type',
24 INF_JOB_STATUS: 'inf_job_status', 26 INF_JOB_STATUS: 'inf_job_status',
ruoyi-ui/src/views/system/operatelog/index.vue
@@ -163,7 +163,6 @@ export default { @@ -163,7 +163,6 @@ export default {
163 businessType: undefined, 163 businessType: undefined,
164 status: undefined 164 status: undefined
165 }, 165 },
166 -  
167 }; 166 };
168 }, 167 },
169 created() { 168 created() {
ruoyi-ui/src/views/system/sms/smsLog.vue
@@ -2,16 +2,20 @@ @@ -2,16 +2,20 @@
2 <div class="app-container"> 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 </el-form-item> 15 </el-form-item>
9 <el-form-item label="模板编号" prop="templateId"> 16 <el-form-item label="模板编号" prop="templateId">
10 <el-input v-model="queryParams.templateId" placeholder="请输入模板编号" clearable size="small" @keyup.enter.native="handleQuery"/> 17 <el-input v-model="queryParams.templateId" placeholder="请输入模板编号" clearable size="small" @keyup.enter.native="handleQuery"/>
11 </el-form-item> 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 <el-form-item label="发送状态" prop="sendStatus"> 19 <el-form-item label="发送状态" prop="sendStatus">
16 <el-select v-model="queryParams.sendStatus" placeholder="请选择发送状态" clearable size="small"> 20 <el-select v-model="queryParams.sendStatus" placeholder="请选择发送状态" clearable size="small">
17 <el-option label="请选择字典生成" value="" /> 21 <el-option label="请选择字典生成" value="" />
@@ -52,46 +56,51 @@ @@ -52,46 +56,51 @@
52 <!-- 列表 --> 56 <!-- 列表 -->
53 <el-table v-loading="loading" :data="list"> 57 <el-table v-loading="loading" :data="list">
54 <el-table-column label="编号" align="center" prop="id" /> 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 <template slot-scope="scope"> 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 </template> 81 </template>
71 </el-table-column> 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 <el-table-column label="接收时间" align="center" prop="receiveTime" width="180"> 83 <el-table-column label="接收时间" align="center" prop="receiveTime" width="180">
80 <template slot-scope="scope"> 84 <template slot-scope="scope">
81 <span>{{ parseTime(scope.row.receiveTime) }}</span> 85 <span>{{ parseTime(scope.row.receiveTime) }}</span>
82 </template> 86 </template>
83 </el-table-column> 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 <template slot-scope="scope"> 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 </template> 98 </template>
90 </el-table-column> 99 </el-table-column>
91 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 100 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
92 <template slot-scope="scope"> 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 </template> 104 </template>
96 </el-table-column> 105 </el-table-column>
97 </el-table> 106 </el-table>
@@ -99,13 +108,59 @@ @@ -99,13 +108,59 @@
99 <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" 108 <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
100 @pagination="getList"/> 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 </div> 158 </div>
105 </template> 159 </template>
106 160
107 <script> 161 <script>
108 import { getSmsLogPage, exportSmsLogExcel } from "@/api/system/sms/smsLog"; 162 import { getSmsLogPage, exportSmsLogExcel } from "@/api/system/sms/smsLog";
  163 +import { getSimpleSmsChannels } from "@/api/system/sms/smsChannel";
109 164
110 export default { 165 export default {
111 name: "SmsLog", 166 name: "SmsLog",
@@ -127,6 +182,8 @@ export default { @@ -127,6 +182,8 @@ export default {
127 open: false, 182 open: false,
128 dateRangeSendTime: [], 183 dateRangeSendTime: [],
129 dateRangeReceiveTime: [], 184 dateRangeReceiveTime: [],
  185 + // 表单参数
  186 + form: {},
130 // 查询参数 187 // 查询参数
131 queryParams: { 188 queryParams: {
132 pageNo: 1, 189 pageNo: 1,
@@ -137,10 +194,16 @@ export default { @@ -137,10 +194,16 @@ export default {
137 sendStatus: null, 194 sendStatus: null,
138 receiveStatus: null, 195 receiveStatus: null,
139 }, 196 },
  197 + // 短信渠道
  198 + channelOptions: [],
140 }; 199 };
141 }, 200 },
142 created() { 201 created() {
143 this.getList(); 202 this.getList();
  203 + // 获得短信渠道
  204 + getSimpleSmsChannels().then(response => {
  205 + this.channelOptions = response.data;
  206 + })
144 }, 207 },
145 methods: { 208 methods: {
146 /** 查询列表 */ 209 /** 查询列表 */
@@ -192,6 +255,20 @@ export default { @@ -192,6 +255,20 @@ export default {
192 }).then(response => { 255 }).then(response => {
193 this.downloadExcel(response, '短信日志.xls'); 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,8 +21,8 @@
21 <el-form-item label="短信 API 的模板编号" prop="apiTemplateId"> 21 <el-form-item label="短信 API 的模板编号" prop="apiTemplateId">
22 <el-input v-model="queryParams.apiTemplateId" placeholder="请输入短信 API 的模板编号" clearable size="small" @keyup.enter.native="handleQuery"/> 22 <el-input v-model="queryParams.apiTemplateId" placeholder="请输入短信 API 的模板编号" clearable size="small" @keyup.enter.native="handleQuery"/>
23 </el-form-item> 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 <el-option v-for="channel in channelOptions" 26 <el-option v-for="channel in channelOptions"
27 :key="channel.id" :value="channel.id" 27 :key="channel.id" :value="channel.id"
28 :label="channel.signature + '【' + getDictDataLabel(DICT_TYPE.SYS_SMS_CHANNEL_CODE, channel.code) + '】'" /> 28 :label="channel.signature + '【' + getDictDataLabel(DICT_TYPE.SYS_SMS_CHANNEL_CODE, channel.code) + '】'" />
@@ -60,12 +60,12 @@ @@ -60,12 +60,12 @@
60 <template slot-scope="scope"> 60 <template slot-scope="scope">
61 <span>{{ getDictDataLabel(DICT_TYPE.SYS_SMS_TEMPLATE_TYPE, scope.row.type) }}</span> 61 <span>{{ getDictDataLabel(DICT_TYPE.SYS_SMS_TEMPLATE_TYPE, scope.row.type) }}</span>
62 </template> 62 </template>
63 - </el-table-column>> 63 + </el-table-column>
64 <el-table-column label="开启状态" align="center" prop="status"> 64 <el-table-column label="开启状态" align="center" prop="status">
65 <template slot-scope="scope"> 65 <template slot-scope="scope">
66 <span>{{ getDictDataLabel(DICT_TYPE.SYS_COMMON_STATUS, scope.row.status) }}</span> 66 <span>{{ getDictDataLabel(DICT_TYPE.SYS_COMMON_STATUS, scope.row.status) }}</span>
67 </template> 67 </template>
68 - </el-table-column>> 68 + </el-table-column>
69 <el-table-column label="备注" align="center" prop="remark" /> 69 <el-table-column label="备注" align="center" prop="remark" />
70 <el-table-column label="短信 API 的模板编号" align="center" prop="apiTemplateId" width="180" /> 70 <el-table-column label="短信 API 的模板编号" align="center" prop="apiTemplateId" width="180" />
71 <el-table-column label="短信渠道" align="center"> 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,10 +28,11 @@ public interface SmsClient {
28 * @param logId 日志编号 28 * @param logId 日志编号
29 * @param mobile 手机号 29 * @param mobile 手机号
30 * @param apiTemplateId 短信 API 的模板编号 30 * @param apiTemplateId 短信 API 的模板编号
31 - * @param templateParams 短信模板参数 31 + * @param templateParams 短信模板参数。通过 List 数组,保证参数的顺序
32 * @return 短信发送结果 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,7 +41,7 @@ public class SysDictTypeController {
41 return success(dictTypeId); 41 return success(dictTypeId);
42 } 42 }
43 43
44 - @PostMapping("update") 44 + @PutMapping("/update")
45 @ApiOperation("修改字典类型") 45 @ApiOperation("修改字典类型")
46 @PreAuthorize("@ss.hasPermission('system:dict:update')") 46 @PreAuthorize("@ss.hasPermission('system:dict:update')")
47 public CommonResult<Boolean> updateDictType(@Valid @RequestBody SysDictTypeUpdateReqVO reqVO) { 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,6 +20,8 @@ public enum SysDictTypeEnum {
20 SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型 20 SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型
21 SYS_SMS_CHANNEL_CODE("sys_sms_channel_code"), // 短信渠道编码 21 SYS_SMS_CHANNEL_CODE("sys_sms_channel_code"), // 短信渠道编码
22 SYS_SMS_TEMPLATE_TYPE("sys_sms_template_type"), // 短信模板类型 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 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型 26 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型
25 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举 27 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举
src/main/resources/codegen/vue/views/index.vue.vm
@@ -76,7 +76,7 @@ @@ -76,7 +76,7 @@
76 <template slot-scope="scope"> 76 <template slot-scope="scope">
77 <span>{{ getDictDataLabel(DICT_TYPE.$dictType.toUpperCase(), scope.row.${column.javaField}) }}</span> 77 <span>{{ getDictDataLabel(DICT_TYPE.$dictType.toUpperCase(), scope.row.${column.javaField}) }}</span>
78 </template> 78 </template>
79 - </el-table-column>> 79 + </el-table-column>
80 #else 80 #else
81 <el-table-column label="${comment}" align="center" prop="${javaField}" /> 81 <el-table-column label="${comment}" align="center" prop="${javaField}" />
82 #end 82 #end