当前位置:网站首页>Meeting notification & meeting feedback & feedback details function of meeting OA project
Meeting notification & meeting feedback & feedback details function of meeting OA project
2022-07-29 00:43:00 【_ Leaf1217】
Catalog
1.1 Meeting notice inquiry SQL
Two 、 The foreground code of the meeting notice
2.1 Notice of meeting jsp file
3、 ... and 、 Background code of meeting notification query
2.1 Entity class of meeting details
Four 、 Meeting feedback function
One 、 Needed SQL sentence
1.1 Notice of meeting SQL
analysis : Whether the meeting gets feedback or not We should give feedback So choose external connection The meeting information table is mainly
-- Notice of meeting (4 It is the meeting to be held )
select
IFNULL(f.result,-1) result,t1.*
from(
select * from t_oa_meeting_info where FIND_IN_SET(2,CONCAT(
canyuze,',',liexize,',',zhuchiren)) and state = 4
) t1
left join t_oa_meeting_feedback f on t1.id = f.meetingId
and f.personId = 2
ORDER BY result;1.2 Feedback details SQL
According to the requirements, we can analyze and realize this step by step SQL:
-- Meeting feedback details
-- 1、 meeting id by 12 Conference , Names of all participants
-- 1.1 First get all the participants id
select CONCAT(canyuze,',',liexize,',',zhuchiren) from
t_oa_meeting_info where id = 12
-- 1.2 Then get the names of all participants
select * from t_oa_user where FIND_IN_SET(id,(select CONCAT(canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id = 12))
-- 2、 Link feedback form , Get the corresponding feedback ( unread 、 To participate in 、 Do not participate )
-- 2、 Link feedback form , Get the corresponding feedback ( unread 、 To participate in 、 Do not participate )
select
t1.`name`,IFNULL(f.result,-1) result
from(
select * from t_oa_user where FIND_IN_SET(id,(select CONCAT(canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id = 12))
) t1
left join t_oa_meeting_feedback f on t1.id = f.personId and f.meetingId = 12-- 3、 Group according to the feedback ( Final feedback details SQL)
-- 3、 Group according to the feedback ( Final feedback details SQL)
select
t.result,GROUP_CONCAT(t.name) names
from(
select
t1.`name`,IFNULL(f.result,-1) result
from(
select * from t_oa_user where FIND_IN_SET(id,(select CONCAT(canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id = 12))
) t1
left join t_oa_meeting_feedback f on t1.id = f.personId and f.meetingId = 12
) t
GROUP BY t.resultTwo 、 The foreground code of the meeting notice
2.1 Notice of meeting jsp file
The foreground code of the meeting notice :meetingNotify.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="/common/header.jsp"%>
<!DOCTYPE html>
<!-- Notice of meeting -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/js/meeting/meetingNotify.js"></script>
</head>
<style>
body{
margin:15px;
}
.layui-table-cell {height: inherit;}
.layui-layer-page .layui-layer-content { overflow: visible !important;}
</style>
<body>
<!-- Search bar -->
<div class="layui-form-item" style="margin:15px 0px;">
<div class="layui-inline">
<label class="layui-form-label"> The title of the meeting </label>
<div class="layui-input-inline">
<input type="hidden" id="personId" value="${user.id }"/>
<input type="text" id="title" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button id="btn_search" type="button" class="layui-btn"><i class="layui-icon layui-icon-search"></i> Inquire about </button>
</div>
</div>
<!-- Data table -->
<table id="tb" lay-filter="tb" class="layui-table" style="margin-top:-15px"></table>
<script type="text/html" id="tbar">
{
{# if(d.result==-1){ }}
<a class="layui-btn layui-btn-xs" lay-event="edit"> Whether to attend the meeting </a>
{
{# } }}
</script>
</body>
</html>2.2 To encapsulate js file
Let's package the corresponding js file :meetingNotify.js
let layer,table,$,form,test;
var row;
layui.use(['layer','table','jquery','form','test'],function(){
layer=layui.layer,
table=layui.table,
form=layui.form,
test=layui.test,
$=layui.jquery;
initTable();
// Query events
$('#btn_search').click(function(){
query();
});
});
// Initialize the data table ( My approval )
function initTable(){
table.render({ // Perform rendering
elem: '#tb', // Specify the original table element selector ( recommend id Selectors )
height: 400, // Custom height
loading: false, // Whether to load the bar ( Default true)
cols: [[ // Set the header
{field: 'id', title: ' Conference number ', width: 90},
{field: 'title', title: ' The title of the meeting ', width: 120},
{field: 'location', title: ' Place of meeting ', width: 140},
{field: 'startTime', title: ' Starting time ', width: 120,
templet:function(d){
return test.toDate(new Date(d.startTime));
}
},
{field: 'endTime', title: ' End time ', width: 120,
templet:function(d){
return test.toDate(new Date(d.endTime));
}
},
//{field: 'meetingState', title: ' Meeting status ', width: 120},
/*{field: 'seatPic', title: ' Meeting row ', width: 120,
templet: function(d){
if(d.seatPic==null || d.seatPic=="")
return " Not yet seated ";
else
return "<img width='120px' src='"+d.seatPic+"'/>";
}
},*/
{field: 'result', title: ' Feedback status ', width: 120,
templet: function(d){
if(d.result==1)
return " Participation ";
else if(d.result==2)
return " absent ";
else
return " unread ";
}
},
{field: '', title: ' operation ', width: 200,toolbar:'#tbar'},
]]
});
}
// Click to query
function query(){
table.reload('tb', {
url: $("#ctx").val()+'/feedBack.action', // Request address
method: 'POST', // Request mode ,GET perhaps POST
loading: true, // Whether to load the bar ( Default true)
page: true, // Pagination or not
where: { // Set additional parameters for asynchronous data interface , Arbitrarily set
'methodName':'queryMeetingFeedBackByUserId',
'personId':$('#personId').val(),
'title':$('#title').val(),
},
request: { // Custom paging request parameter name
pageName: 'page', // Parameter name of page number , Default :page
limitName: 'rows' // Parameter name of data volume per page , Default :limit
},
done: function (res, curr, count) {
console.log(res);
}
});
// Toolbar events
table.on('tool(tb)', function(obj){ // notes :tool Is the toolbar event name ,test yes table Properties of the original container lay-filter=" Corresponding value "
row = obj.data; // Get current row data
var layEvent = obj.event; // get lay-event Corresponding value ( It can also be in the header event The corresponding value of the parameter )
var tr = obj.tr; // Get the current line tr Of DOM object ( If any )
console.log(row);
if(layEvent === 'edit'){ // Whether to attend the meeting
openLayer(row.id);
} else {
}
});
}
function openLayer(id){
layer.open({
type: 2, //layer Provides 5 Layer type . The values that can be passed in are :0( Message box , Default )1( Page layer )2(iframe layer )3( Loading layer )4(tips layer )
title: ' Meeting feedback ', // Dialog title
area: ['660px', '400px'], // Wide and high
skin: 'layui-layer-rim', // Style class name
content: 'jsp/meeting/addFeedBack.jsp?id='+id, // Pop up content . You can pass in ordinary html Content , You can also specify DOM, With more type Different but different
btn:[' Meeting feedback ',' close '],
yes:function(index,layero){
//layer.msg(' preservation ');
// Call the getData Method , Get sub pages quickly form The form data
let data= $(layero).find("iframe")[0].contentWindow.getData();
addMeetingFeedBack(data);
},
btn2:function(){
layer.closeAll();
}
});
}
// Notice of the meeting Participation / Feedback from not attending the meeting
function addMeetingFeedBack(params){
params['methodName']="add";
console.log(params);
$.post($("#ctx").val()+'/feedBack.action',params,function(rs){
if(rs.success){
layer.closeAll();
query();
}else{
layer.msg(rs.msg,{icon:5},function(){});
}
},'json');
}Here we are js The file uses a LayUI Expansion modules , So we also need to import our expansion file :
test.js
// Tips : Modules can also rely on other modules , Such as :layui.define('layer', callback);
layui.define(function(exports){
var obj = {
hello: function(str){
alert('Hello '+ (str||'test'));
},
toDate:function(date,pattern){
return fmtDate(date,pattern);
}
};
// Output test Interface
//test.hello('zs');
exports('test', obj);
});
// to Date Class adds a new instance method format
Date.prototype.format = function (fmt) {
//debugger;
var o = {
"M+": this.getMonth() + 1, // month
"d+": this.getDate(), // Japan
"h+": this.getHours(), // Hours
"m+": this.getMinutes(), // branch
"s+": this.getSeconds(), // second
"q+": Math.floor((this.getMonth() + 3) / 3), // quarter
"S": this.getMilliseconds() // millisecond
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
function fmtDate(date, pattern) {
var ts = date.getTime();
var d = new Date(ts).format("yyyy-MM-dd hh:mm:ss");
if (pattern) {
d = new Date(ts).format(pattern);
}
return d.toLocaleString();
};
And its corresponding configuration file :config.js
layui.config({
base: 'static/js/layui/modules/' // Suppose this is test.js directory
}).extend({ // Set the module alias
test: 'test' // If test.js It's in the root directory , You can also do without setting an alias
});
next , We also need to put this of ours LayUI Expand the configuration file of the module ,
Introduce to our public page :header.jsp , In this way, we can access our configuration file all the way .
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- introduce layui.css -->
<link rel="stylesheet" href="${pageContext.request.contextPath }/static/js/layui/css/layui.css">
<!-- introduce layui.js -->
<script src="${pageContext.request.contextPath }/static/js/layui/layui.js"></script>
<!-- Specify the root path of the entire project -->
<base href="${pageContext.request.contextPath }/" />
<!-- Hidden field transfer value -->
<input id="ctx" value="${pageContext.request.contextPath }" type="hidden"/>
<!-- introduce LayUI Expand the configuration file of the module -->
<script src="${pageContext.request.contextPath }/static/js/layui/config.js"></script>
<title> Yuyuan studio </title>When we are ready to use SQL Statement and the front page , We can start to write the background code of our meeting notification function ~
3、 ... and 、 Background code of meeting notification query
2.1 Entity class of meeting details
MeetingFeedBack:
package com.leaf.entity;
import java.io.Serializable;
/**
* Meeting details
* @author Leaf
*
* 2022 year 7 month 28 Japan In the morning 11:33:21
*/
public class MeetingFeedBack implements Serializable {
private String id;
private Long meetingId;
private Integer personType;
private Long personId;
private Integer result;
private String reason;
// The title of the meeting
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Long getMeetingId() {
return meetingId;
}
public void setMeetingId(Long meetingId) {
this.meetingId = meetingId;
}
public Integer getPersonType() {
return personType;
}
public void setPersonType(Integer personType) {
this.personType = personType;
}
public Long getPersonId() {
return personId;
}
public void setPersonId(Long personId) {
this.personId = personId;
}
public Integer getResult() {
return result;
}
public void setResult(Integer result) {
this.result = result;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public MeetingFeedBack() {
super();
}
@Override
public String toString() {
return "MeetingFeedBack [id=" + id + ", meetingId=" + meetingId + ", personType=" + personType + ", personId="
+ personId + ", result=" + result + ", reason=" + reason + "]";
}
}2.2 Dao Method
MeetingFeedBackDao:
package com.leaf.dao;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import com.leaf.entity.MeetingFeedBack;
import com.leaf.entity.MeetingInfo;
import com.leaf.util.BaseDao;
import com.leaf.util.PageBean;
import com.leaf.util.StringUtils;
public class MeetingFeedBackDao extends BaseDao<MeetingFeedBack> {
// Meeting notice query
public List<Map<String, Object>> queryMeetingFeedBackByUserId(MeetingFeedBack back, PageBean pageBean)
throws SQLException, InstantiationException, IllegalAccessException {
//SQL
String sql = "select\r\n" +
" IFNULL(f.result,-1) result,t1.*\r\n" +
" from(\r\n" +
" select * from t_oa_meeting_info where FIND_IN_SET("+back.getPersonId()+",CONCAT(\r\n" +
" canyuze,',',liexize,',',zhuchiren)) and state = 4\r\n" +
" ) t1\r\n" +
" left join t_oa_meeting_feedback f on t1.id = f.meetingId\r\n" +
" and f.personId = "+back.getPersonId()+"\r\n" +
" ORDER BY result";
return super.executeQuery(sql, pageBean);
}
}2.3 Action layer :
MeetingFeedBackAction :
package com.leaf.web;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.leaf.dao.MeetingFeedBackDao;
import com.leaf.entity.MeetingFeedBack;
import com.leaf.mvc.ActionSupport;
import com.leaf.mvc.ModelDriven;
import com.leaf.util.PageBean;
import com.leaf.util.R;
import com.leaf.util.ResponseUtil;
public class MeetingFeedBackAction extends ActionSupport implements ModelDriven<MeetingFeedBack> {
private MeetingFeedBack Back = new MeetingFeedBack();
private MeetingFeedBackDao backDao = new MeetingFeedBackDao();
@Override
public MeetingFeedBack getModel() {
return Back;
}
// Meeting notice query
public String queryMeetingFeedBackByUserId(HttpServletRequest req, HttpServletResponse resp) {
try {
PageBean pageBean = new PageBean();
// initialization
pageBean.setRequest(req);
List<Map<String, Object>> list = backDao.queryMeetingFeedBackByUserId(Back, pageBean);
ResponseUtil.writeJson(resp, R.ok(0, " Meeting notification data query succeeded " ,pageBean.getTotal() ,list));
} catch (Exception e) {
e.printStackTrace();
try {
ResponseUtil.writeJson(resp, R.ok(0, " Meeting notification data query failed "));
} catch (Exception e1) {
e1.printStackTrace();
}
}
return null;
}
}2.4 To configure xml file
<?xml version="1.0" encoding="UTF-8"?>
<config>
<action path="/user" type="com.leaf.web.UserAction">
</action>
<action path="/permission" type="com.leaf.web.PermissionAction">
</action>
<action path="/permissionTo" type="com.leaf.web.PermissionToAction">
</action>
<action path="/info" type="com.leaf.web.MeetingInfoAction">
</action>
<action path="/audit" type="com.leaf.web.MeetingAuditAction">
</action>
<action path="/feedBack" type="com.leaf.web.MeetingFeedBackAction">
</action>
</config>Test the query :

After testing , We see that the query has been successful , In this way, the meeting notice inquiry is done !
Then we can start to do the meeting feedback function , Feedback whether users participate in the meeting .
Four 、 Meeting feedback function
4.1 Packaging related js file
Let's first put the front-end code of the meeting feedback :addFeedBack.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="/common/header.jsp"%>
<!DOCTYPE html>
<!-- Feedback on whether to attend the meeting -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/js/meeting/addFeedBack.js"></script>
</head>
<style>
body{
margin:5px;
}
</style>
<body>
<div style="padding:10px;">
<form class="layui-form layui-form-pane" lay-filter="back">
<!-- <div class="layui-form-item">
<button type="submit" class="layui-btn" lay-submit="" lay-filter="meeting"> Submit... Immediately </button>
<button id="reset" type="reset" class="layui-btn layui-btn-primary"> Reset </button>
</div> -->
<input type="hidden" name="meetingId" value="${param.id }"/>
<input type="hidden" name="personId" value="${sessionScope.user.id }"/>
<div class="layui-form-item">
<label class="layui-form-label"> The type of people </label>
<div class="layui-input-block">
<select id="personType" name="personType">
<option value=""> Please select the personnel type </option>
<option value="1"> Participation </option>
<option value="2"> Attend as nonvoting delegates </option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"> Feedback results </label>
<div class="layui-input-block">
<select id="result" name="result">
<option value=""> Please select the feedback result </option>
<option value="1"> To participate in </option>
<option value="2"> Do not participate </option>
</select>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label"> Reasons for not participating in the meeting </label>
<div class="layui-input-block">
<textarea placeholder=" Please enter the content " name="reason" class="layui-textarea"></textarea>
</div>
</div>
</form>
</div>
</body>
</html>Then package the corresponding js file :addFeedBack.js
let form,$;
layui.use(['form','jquery'],function(){
form=layui.form,
$=layui.jquery;
});
function getData(){
return form.val('back');
}4.2 Dao Method
Let's continue to write above Dao Inside the layer :
// Meeting feedback ( Whether to attend the meeting )
public int add(MeetingFeedBack back) throws Exception {
String sql = "insert into t_oa_meeting_feedback values(?,?,?,?,?,?)";
back.setId(UUID.randomUUID().toString().replaceAll("-", ""));
return super.executeUpdate(sql, back, new String[] {"id","meetingId","personType","personId","result","reason"});
}4.3 Action layer
// Meeting feedback ( Whether to attend the meeting )
public String add(HttpServletRequest req, HttpServletResponse resp) {
try {
//rs yes SQL Number of lines affected by statement execution
int rs = backDao.add(Back);
// Judge
if(rs > 0) {
ResponseUtil.writeJson(resp, R.ok(200, " The feedback from the meeting was successful "));
}
else {
ResponseUtil.writeJson(resp, R.ok(0, " Meeting feedback failed "));
}
} catch (Exception e) {
e.printStackTrace();
try {
ResponseUtil.writeJson(resp, R.ok(0, " Meeting feedback failed "));
} catch (Exception e1) {
e1.printStackTrace();
}
}
return null;
}Then we test the feedback :

The test results , The meeting feedback was also successfully completed !
5、 ... and 、 Feedback details
5.1 encapsulation js Code
myMeeting.js
let layer,table,$,form;
var row;
layui.use(['layer','table','jquery','form'],function(){
layer=layui.layer,
table=layui.table,
form=layui.form,
$=layui.jquery;
initTable();
// Query events
$('#btn_search').click(function(){
query();
});
});
//1. Initialize the data table
function initTable(){
table.render({ // Perform rendering
elem: '#tb', // Specify the original table element selector ( recommend id Selectors )
height: 400, // Custom height
loading: false, // Whether to load the bar ( Default true)
cols: [[ // Set the header
{field: 'id', title: ' Conference number ', width: 90},
{field: 'title', title: ' The title of the meeting ', width: 120},
{field: 'location', title: ' Place of meeting ', width: 140},
{field: 'startTime', title: ' Starting time ', width: 120},
{field: 'endTime', title: ' End time ', width: 120},
{field: 'meetingstate', title: ' Meeting status ', width: 120},
{field: 'seatPic', title: ' Meeting row ', width: 120,
templet: function(d){
if(d.seatPic==null || d.seatPic=="")
return " Not yet seated ";
else
return "<img width='120px' src='"+d.seatPic+"'/>";
}
},
{field: 'auditorname', title: ' Approved by ', width: 120},
{field: '', title: ' operation ', width: 200,toolbar:'#tbar'},
]]
});
}
//2. Click to query
function query(){
table.reload('tb', {
url: $("#ctx").val()+'/info.action', // Request address
method: 'POST', // Request mode ,GET perhaps POST
loading: true, // Whether to load the bar ( Default true)
page: true, // Pagination or not
where: { // Set additional parameters for asynchronous data interface , Arbitrarily set
'methodName':'myInfos',
'zhuchiren':$('#zhuchiren').val(),
'title':$('#title').val(),
},
request: { // Custom paging request parameter name
pageName: 'page', // Parameter name of page number , Default :page
limitName: 'rows' // Parameter name of data volume per page , Default :limit
},
done: function (res, curr, count) {
console.log(res);
}
});
// Toolbar events
table.on('tool(tb)', function(obj){ // notes :tool Is the toolbar event name ,test yes table Properties of the original container lay-filter=" Corresponding value "
row = obj.data; // Get current row data
var layEvent = obj.event; // get lay-event Corresponding value ( It can also be in the header event The corresponding value of the parameter )
var tr = obj.tr; // Get the current line tr Of DOM object ( If any )
console.log(row);
if(layEvent === 'seat'){ // Meeting row
open(row.id);
} else if(layEvent === 'send'){ // submit for censorship
// layer.msg(' submit for censorship ');
// Judge whether the seats are arranged
if(row.seatPic==null || row.seatPic==""){
layer.msg(' Please complete the meeting seating first , Then submit for approval !',function(){});
return false;
}
// Before opening the submission page , Please finish the meeting first ID Assignment of
$('#meetingId').val(row.id);
// Open the meeting for approval HTML
openLayerAudit();
} else if(layEvent==="back"){ // Feedback details
openLayerFeedBack(row.id);
} else {
layer.msg(' Delete ');
}
});
}
// Open to view the feedback details of this meeting
function openLayerFeedBack(id){
$.getJSON('feedBack.action',{
methodName:'queryMeetingBackByMeetingId',
meetingId:id
},function(data){
$('#meeting_ok').html("");
$('#meeting_no').html("");
$('#meeting_noread').html("");
if(data.success){
console.log(data.data);
$.each(data.data,function(i,e){
if(e.result==1)
$('#meeting_ok').html(e.names);
else if(e.result==2)
$('#meeting_no').html(e.names);
else
$('#meeting_noread').html(e.names);
});
// Pop-up dialog box
layer.open({
type: 1, //layer Provides 5 Layer type . The values that can be passed in are :0( Message box , Default )1( Page layer )2(iframe layer )3( Loading layer )4(tips layer )
title:' Feedback details ',
area: ['426px', '420px'], // Wide and high
skin: 'layui-layer-rim', // Style class name
content: $('#feedback'), // Pop up content . You can pass in ordinary html Content , You can also specify DOM, With more type Different but different
btn:[' close '],
yes:function(index,layero){
layer.closeAll();
}
});
}
});
}
5.2 Dao Method
// Feedback details
public List<Map<String, Object>> queryMeetingBackByMeetingId(MeetingFeedBack back, PageBean pageBean) throws Exception {
String sql = "select\r\n" +
"t.result,GROUP_CONCAT(t.name) names\r\n" +
"from(\r\n" +
" select\r\n" +
" t1.`name`,IFNULL(f.result,-1) result\r\n" +
" from(\r\n" +
" select * from t_oa_user where FIND_IN_SET(id,(select CONCAT(canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id = "+back.getMeetingId()+"))\r\n" +
" ) t1\r\n" +
" left join t_oa_meeting_feedback f on t1.id = f.personId and f.meetingId = "+back.getMeetingId()+"\r\n" +
") t\r\n" +
"GROUP BY t.result";
return super.executeQuery(sql, pageBean);
}5.3 Action layer
// Feedback details
public String queryMeetingBackByMeetingId(HttpServletRequest req, HttpServletResponse resp) {
try {
PageBean pageBean = new PageBean();
// initialization
pageBean.setRequest(req);
List<Map<String, Object>> list = backDao.queryMeetingBackByMeetingId(Back, pageBean);
ResponseUtil.writeJson(resp, R.ok(0, " Feedback details data query succeeded " ,pageBean.getTotal() ,list));
} catch (Exception e) {
e.printStackTrace();
try {
ResponseUtil.writeJson(resp, R.ok(0, " Feedback details data query failed "));
} catch (Exception e1) {
e1.printStackTrace();
}
}
return null;
}Here we are test to glance at :
First feedback a result :
Then log in to the account of the meeting publisher , Query feedback details :
We can see , The feedback details function is also realized ~
OK, today Leaf Bring the meeting OA Project meeting notice and feedback && That's all for the feedback details function , There are more function code sharing in the later stage , Welcome to study together , I'll see you next time !!!
边栏推荐
- 【MySQL 8】Generated Invisible Primary Keys(GIPK)
- MQ 消息丢失、重复、积压问题,如何解决?
- R语言怎么学
- Advanced area of attack and defense world web masters supersqli
- Alibaba Code代码索引技术实践:为Code Review提供本地IDE的阅读体验
- Advanced area of attack and defense world web masters unserialize3
- Soft test --- database (4) SQL statement
- MySQL的隔离级别、可能出现的问题(脏读、不可重复读、幻读)及其解决方法
- 2022DASCTF7月赋能赛(复现)
- 分布式限流 redission RRateLimiter 的使用及原理
猜你喜欢
随机推荐
requestVideoFrameCallback() 简单实例
Download the latest version of visual studio code and connect to the server remotely (very detailed)
数仓搭建——ADS层
PTA (daily question) 7-72 calculate the cumulative sum
ORACLE not available如何解决
芯驰科技发布G9系列最新旗舰产品,配备6个1.8Ghz主频的A55核心
PTA (daily question) 7-75 how many people in a school
I was asked several questions about string in the interview. Can you answer them?
Dynamic programming (V)
PTA (daily question) 7-69 narcissus number
15.模型评估和选择问题
What are the skills of API interface optimization?
Application and principle of distributed current limiting redistribution rratelimiter
15. Model evaluation and selection
There is a span tag. If you want to do click events on it, how can you expand the click area
Requestvideoframecallback() simple instance
Summary: the difference between pod and container
Alibaba Code代码索引技术实践:为Code Review提供本地IDE的阅读体验
The download file of native JS implementation can be used anywhere
[develop low code platform] low code rendering

![[micro services ~nacos] Nacos service providers and service consumers](/img/b7/47ecd6979ccfeb270261681d6130be.png)







