huwhois 4 years ago
parent
commit
ae7064a5db

+ 1 - 1
pom.xml

@ -330,7 +330,7 @@
330 330
					<!--</execution>-->
331 331
				<!--</executions>-->
332 332
				<configuration>
333
					<imageName>renren/fast</imageName>
333
					<imageName>fyhs/meeting</imageName>
334 334
					<dockerDirectory>${project.basedir}</dockerDirectory>
335 335
					<resources>
336 336
						<resource>

+ 19 - 0
src/main/java/io/renren/common/utils/ExcelData.java

@ -0,0 +1,19 @@
1
package io.renren.common.utils;
2
3
import java.io.Serializable;
4
import java.util.List;
5
import lombok.Data;
6
7
@Data
8
public class ExcelData implements Serializable {
9
    private static final long serialVersionUID = 1L;
10
    
11
    // 表头
12
    private List<String> titles;
13
14
    // 数据
15
    private List<List<Object>> rows;
16
17
    // 页签名称
18
    private String name;
19
}

+ 354 - 0
src/main/java/io/renren/common/utils/ExcelUtils.java

@ -0,0 +1,354 @@
1
package io.renren.common.utils;
2
3
import java.awt.Color;
4
import java.io.IOException;
5
import java.io.InputStream;
6
import java.io.OutputStream;
7
import java.net.URLEncoder;
8
import java.text.NumberFormat;
9
import java.util.Date;
10
import java.util.Iterator;
11
import java.util.List;
12
13
import javax.servlet.http.HttpServletResponse;
14
15
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
16
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
17
import org.apache.poi.ss.usermodel.BorderStyle;
18
import org.apache.poi.ss.usermodel.Cell;
19
import org.apache.poi.ss.usermodel.Font;
20
import org.apache.poi.ss.usermodel.IndexedColors;
21
import org.apache.poi.ss.usermodel.Row;
22
import org.apache.poi.ss.usermodel.Sheet;
23
import org.apache.poi.ss.usermodel.Workbook;
24
import org.apache.poi.xssf.usermodel.XSSFCell;
25
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
26
import org.apache.poi.xssf.usermodel.XSSFColor;
27
import org.apache.poi.xssf.usermodel.XSSFSheet;
28
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
29
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSide;
30
import org.springframework.web.multipart.MultipartFile;
31
32
public class ExcelUtils {
33
    private final static String EXCEL_2003 = ".xls"; // 2003- 版本的excel
34
	private final static String EXCEL_2007 = ".xlsx"; // 2007+ 版本的excel
35
36
    // 导出 start
37
    public static void exportExcel(HttpServletResponse response, String fileName, ExcelData data) throws Exception {
38
        // 告诉浏览器用什么软件可以打开此文件
39
        response.setHeader("content-Type", "application/vnd.ms-excel");
40
        // 下载文件的默认名称
41
        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "utf-8"));
42
        exportExcel(data, response.getOutputStream());
43
    }
44
45
    public static void exportExcel(ExcelData data, OutputStream out) throws Exception {
46
47
        XSSFWorkbook wb = new XSSFWorkbook();
48
        try {
49
            String sheetName = data.getName();
50
            if (null == sheetName) {
51
                sheetName = "Sheet1";
52
            }
53
            XSSFSheet sheet = wb.createSheet(sheetName);
54
            writeExcel(wb, sheet, data);
55
56
            wb.write(out);
57
        } catch(Exception e){
58
            e.printStackTrace();
59
        }finally{
60
            //此处需要关闭 wb 变量
61
            out.close();
62
        }
63
	}
64
	
65
    private static void writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) {
66
67
        int rowIndex = 0;
68
69
		rowIndex = writeTitlesToExcel(wb, sheet, data.getTitles());
70
        writeRowsToExcel(wb, sheet, data.getRows(), rowIndex);
71
        autoSizeColumns(sheet, data.getTitles().size() + 1);
72
73
    }
74
75
    private static int writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet, List<String> titles) {
76
        int rowIndex = 0;
77
        int colIndex = 0;
78
79
        Font titleFont = wb.createFont();
80
        titleFont.setFontName("simsun");
81
        //titleFont.setBoldweight(Short.MAX_VALUE);
82
        // titleFont.setFontHeightInPoints((short) 14);
83
        titleFont.setColor(IndexedColors.BLACK.index);
84
85
        XSSFCellStyle titleStyle = wb.createCellStyle();
86
        titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
87
        titleStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
88
        titleStyle.setFillForegroundColor(new XSSFColor(new Color(182, 184, 192)));
89
        titleStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
90
        titleStyle.setFont(titleFont);
91
        setBorder(titleStyle, BorderStyle.THIN, new XSSFColor(new Color(0, 0, 0)));
92
93
        Row titleRow = sheet.createRow(rowIndex);
94
        // titleRow.setHeightInPoints(25);
95
        colIndex = 0;
96
97
        for (String field : titles) {
98
            Cell cell = titleRow.createCell(colIndex);
99
            cell.setCellValue(field);
100
            cell.setCellStyle(titleStyle);
101
            colIndex++;
102
        }
103
104
        rowIndex++;
105
        return rowIndex;
106
    }
107
108
    private static int writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<List<Object>> rows, int rowIndex) {
109
        int colIndex = 0;
110
111
        Font dataFont = wb.createFont();
112
        dataFont.setFontName("simsun");
113
        // dataFont.setFontHeightInPoints((short) 14);
114
        dataFont.setColor(IndexedColors.BLACK.index);
115
116
        XSSFCellStyle dataStyle = wb.createCellStyle();
117
        dataStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
118
        dataStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
119
        dataStyle.setFont(dataFont);
120
        setBorder(dataStyle, BorderStyle.THIN, new XSSFColor(new Color(0, 0, 0)));
121
122
        for (List<Object> rowData : rows) {
123
            Row dataRow = sheet.createRow(rowIndex);
124
            // dataRow.setHeightInPoints(25);
125
            colIndex = 0;
126
127
            for (Object cellData : rowData) {
128
                Cell cell = dataRow.createCell(colIndex);
129
                if (cellData != null) {
130
                    cell.setCellValue(cellData.toString());
131
                } else {
132
                    cell.setCellValue("");
133
                }
134
135
                cell.setCellStyle(dataStyle);
136
                colIndex++;
137
            }
138
            rowIndex++;
139
        }
140
        return rowIndex;
141
    }
142
143
    private static void autoSizeColumns(Sheet sheet, int columnNumber) {
144
145
        for (int i = 0; i < columnNumber; i++) {
146
            int orgWidth = sheet.getColumnWidth(i);
147
            sheet.autoSizeColumn(i, true);
148
            // int newWidth = (int) (sheet.getColumnWidth(i) + 100);	// 列宽超过255 错误
149
            // if (newWidth > orgWidth) {
150
            //     sheet.setColumnWidth(i, newWidth);
151
            // } else {
152
            //     sheet.setColumnWidth(i, orgWidth);
153
			// }
154
			if(orgWidth<255*256){	// 解决方法一
155
                sheet.setColumnWidth(i, orgWidth < 3000 ? 3000 : orgWidth);    
156
            }else{
157
                sheet.setColumnWidth(i,6000 );
158
			}
159
			// if (orgWidth > 255)  // 解决办法二 还是有问题
160
			// {
161
			// 	orgWidth = 255;
162
			// }
163
			// //设置列宽
164
			// sheet.setColumnWidth(i, (orgWidth + 1) * 256);
165
        }
166
    }
167
168
    private static void setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) {
169
        style.setBorderTop(border);
170
        style.setBorderLeft(border);
171
        style.setBorderRight(border);
172
        style.setBorderBottom(border);
173
        style.setBorderColor(BorderSide.TOP, color);
174
        style.setBorderColor(BorderSide.LEFT, color);
175
        style.setBorderColor(BorderSide.RIGHT, color);
176
        style.setBorderColor(BorderSide.BOTTOM, color);
177
    }
178
    // 导出 end
179
180
    // 导入 start
181
    /**
182
	 * 功能描述:创建工作簿
183
	 *
184
	 * @author grm
185
	 * @since 2020年1月28日
186
	 * @param file 文件
187
	 * @return workbook
188
	 */
189
	public static Workbook createWorkbook(MultipartFile file) {
190
		InputStream inputStream;
191
		Workbook workbook = null;
192
		try {
193
			if(file.isEmpty()) {
194
				R.error("file is empty!");
195
				return null;
196
			}
197
			inputStream = file.getInputStream();
198
			String fileType = getFileType(file);
199
			if (EXCEL_2003.equals(fileType)) {
200
				workbook = new HSSFWorkbook(inputStream);
201
			} else if (EXCEL_2007.equals(fileType)) {
202
				workbook = new XSSFWorkbook(inputStream);
203
			} else {
204
				R.error("file is not excel!");
205
				return null;
206
			}
207
		} catch (IOException e) {
208
			R.error(e.getMessage());
209
		}
210
		return workbook;
211
	}
212
	
213
	/**
214
	 * 功能描述:判断是否是空行
215
	 *
216
	 * @author grm
217
	 * @since 2020年1月28日
218
	 * @param row 行
219
	 * @return boolean
220
	 */
221
	public static boolean isEmptyRow(Row row) {
222
		if (row == null || row.toString().isEmpty()) {
223
			return true;
224
		} else {
225
			Iterator<Cell> it = row.iterator();
226
			boolean isEmpty = true;
227
			while (it.hasNext()) {
228
				Cell cell = it.next();
229
				if (cell.getCellType() != Cell.CELL_TYPE_BLANK) {
230
					isEmpty = false;
231
					break;
232
				}
233
			}
234
			return isEmpty;
235
		}
236
	}
237
238
	/**
239
	 * 功能描述:判断是不是excel文件
240
	 *
241
	 * @author grm
242
	 * @since 2020年1月28日
243
	 * @param file 文件
244
	 * @return boolean
245
	 */
246
	public static boolean isExcel(MultipartFile file) {
247
		String fileType = getFileType(file);
248
		if ((!EXCEL_2003.equals(fileType)) && (!EXCEL_2007.equals(fileType))) {
249
			R.error("file is not excel!");
250
			return false;
251
		}
252
		return true;
253
	}
254
255
	/**
256
	 * 功能描述:获取文件类型/后缀
257
	 *
258
	 * @author grm
259
	 * @since 2020年1月28日
260
	 * @param file 文件
261
	 * @return fileType
262
	 */
263
	public static String getFileType(MultipartFile file) {
264
		String originalFilename = file.getOriginalFilename();
265
		return (originalFilename.substring(originalFilename.lastIndexOf("."), originalFilename.length())).toLowerCase();
266
	}
267
268
	/**
269
	 * 处理类型
270
	 * 
271
	 * @param cell
272
	 * @return
273
	 */
274
	@SuppressWarnings("deprecation")
275
	public static String getVal(Cell cell) {
276
		if (null != cell) {
277
			switch (cell.getCellType()) {
278
			case XSSFCell.CELL_TYPE_NUMERIC: // 数字
279
				double dou = cell.getNumericCellValue();
280
				NumberFormat nf = NumberFormat.getInstance();
281
				String str = nf.format(dou);
282
				if (str.indexOf(",") >= 0) {
283
					// 这种方法对于自动加".0"的数字可直接解决
284
					// 但如果是科学计数法的数字就转换成了带逗号的,例如:12345678912345的科学计数法是1.23457E+13
285
					// 经过这个格式化后就变成了字符串“12,345,678,912,345”,这也并不是想要的结果,所以要将逗号去掉
286
					str = str.replace(",", "");
287
				}
288
				return str;
289
			case XSSFCell.CELL_TYPE_STRING: // 字符串
290
				return cell.getStringCellValue() + "";
291
			case XSSFCell.CELL_TYPE_BOOLEAN: // Boolean
292
				return cell.getBooleanCellValue() + "";
293
			case XSSFCell.CELL_TYPE_FORMULA: // 公式
294
				try {
295
					if (HSSFDateUtil.isCellDateFormatted(cell)) {
296
						Date date = cell.getDateCellValue();
297
						return (date.getYear() + 1900) + "-" + (date.getMonth() + 1) + "-" + date.getDate();
298
					} else {
299
						return String.valueOf((int) cell.getNumericCellValue());
300
					}
301
				} catch (IllegalStateException e) {
302
					return String.valueOf(cell.getRichStringCellValue());
303
				}
304
			case XSSFCell.CELL_TYPE_BLANK: // 空值
305
				return "";
306
			case XSSFCell.CELL_TYPE_ERROR: // 故障
307
				return "";
308
			default:
309
				return "未知类型   ";
310
			}
311
		} else {
312
			return "";
313
		}
314
    }
315
316
    // /**
317
	//  * 功能描述:导入excel数据到二维数组
318
	//  *
319
	//  * @author grm
320
	//  * @since 2020年1月28日
321
	//  * @param file 文件
322
	//  * @return list
323
	//  */
324
	// public static List<List<String>> importExcel(MultipartFile file) {
325
	// 	List<List<String>> list = new ArrayList<>();
326
	// 	Workbook workbook = ExcelUtils.createWorkbook(file);
327
	// 	if (workbook != null) {
328
	// 		// 获取工作表
329
	// 		Sheet sheet = workbook.getSheetAt(0);
330
	// 		// 获取sheet中第一行行号
331
	// 		int firstRowNum = sheet.getFirstRowNum();
332
	// 		// 获取sheet中最后一行行号
333
	// 		int lastRowNum = sheet.getLastRowNum();
334
	// 		// 循环插入数据
335
	// 		for (int i = firstRowNum + 1; i <= lastRowNum; i++) { // 标题的下一行开始
336
	// 			Row row = sheet.getRow(i);
337
	// 			if (ExcelUtils.isEmptyRow(row) == false) {
338
                  
339
	// 				List<String> res = HandleRow(row);
340
	// 				list.add(res);
341
	// 			}
342
	// 		}
343
	// 	}
344
	// 	return list;
345
    // }
346
    
347
    // public static List<String> HandleRow(Row row) {
348
    //     List<String> res = new ArrayList<>();
349
350
    //     return res;
351
    // }
352
353
    // 导出 end
354
}

+ 33 - 0
src/main/java/io/renren/common/utils/MyUtils.java

@ -1,5 +1,14 @@
1 1
package io.renren.common.utils;
2 2
3
import java.awt.image.BufferedImage;
4
import java.io.ByteArrayOutputStream;
5
import java.io.File;
6
import java.io.IOException;
7
import java.util.Base64;
8
9
import javax.imageio.ImageIO;
10
11
import org.apache.commons.lang.StringUtils;
3 12
import org.springframework.util.DigestUtils;
4 13
5 14
/**
@ -12,4 +21,28 @@ public class MyUtils {
12 21
    public static String md5(String str) {
13 22
		return DigestUtils.md5DigestAsHex(str.getBytes());
14 23
    }
24
25
    /**
26
     * 将图片转换成base64格式进行存储
27
     * @param imagePath
28
     * @return
29
     */
30
    public static String encodeToString(String imagePath) throws IOException {
31
        String type = StringUtils.substring(imagePath, imagePath.lastIndexOf(".") + 1);
32
        BufferedImage image = ImageIO.read(new File(imagePath));
33
        String imageString = null;
34
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
35
        try {
36
            ImageIO.write(image, type, bos);
37
            byte[] imageBytes = bos.toByteArray();
38
39
            Base64.Encoder encoder = Base64.getEncoder();
40
41
            imageString = encoder.encodeToString(imageBytes);
42
            bos.close();
43
        } catch (IOException e) {
44
            e.printStackTrace();
45
        }
46
        return imageString;
47
    }
15 48
}

+ 302 - 0
src/main/java/io/renren/common/utils/QRCodeUtils.java

@ -0,0 +1,302 @@
1
package io.renren.common.utils;
2
3
import java.awt.BasicStroke;
4
import java.awt.Graphics;
5
import java.awt.Graphics2D;
6
import java.awt.Image;
7
import java.awt.Shape;
8
import java.awt.geom.RoundRectangle2D;
9
import java.awt.image.BufferedImage;
10
import java.io.ByteArrayOutputStream;
11
import java.io.File;
12
import java.io.IOException;
13
import java.io.OutputStream;
14
import java.util.Hashtable;
15
import java.util.Random;
16
import java.util.Base64;
17
18
import javax.imageio.ImageIO;
19
20
import com.google.zxing.BarcodeFormat;
21
import com.google.zxing.BinaryBitmap;
22
import com.google.zxing.DecodeHintType;
23
import com.google.zxing.EncodeHintType;
24
import com.google.zxing.MultiFormatReader;
25
import com.google.zxing.MultiFormatWriter;
26
import com.google.zxing.Result;
27
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
28
import com.google.zxing.common.BitMatrix;
29
import com.google.zxing.common.HybridBinarizer;
30
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
31
32
33
public class QRCodeUtils {
34
    private static final String CHARSET = "utf-8";
35
    private static final String FORMAT_NAME = "JPG";
36
    // 二维码尺寸    
37
    private static final int QRCODE_SIZE = 200;
38
    // LOGO宽度    
39
    private static final int WIDTH = 60;
40
    // LOGO高度    
41
    private static final int HEIGHT = 60;
42
43
    /**
44
     * 将图片转换成base64格式进行存储
45
     * @param imagePath
46
     * @return
47
     */
48
    public static String encodeToString(BufferedImage image) throws IOException {
49
        String imageString = null;
50
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
51
        try {
52
            ImageIO.write(image, FORMAT_NAME, bos);
53
            byte[] imageBytes = bos.toByteArray();
54
            Base64.Encoder encoder = Base64.getEncoder();
55
            imageString = encoder.encodeToString(imageBytes);
56
            bos.close();
57
        } catch (IOException e) {
58
            e.printStackTrace();
59
        }
60
        return imageString;
61
    }
62
63
    private static BufferedImage createImage(String content, String imgPath,
64
                                             boolean needCompress) throws Exception {
65
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
66
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
67
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
68
        hints.put(EncodeHintType.MARGIN, 1);
69
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
70
                BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
71
        int width = bitMatrix.getWidth();
72
        int height = bitMatrix.getHeight();
73
        BufferedImage image = new BufferedImage(width, height,
74
                BufferedImage.TYPE_INT_RGB);
75
        for (int x = 0; x < width; x++) {
76
            for (int y = 0; y < height; y++) {
77
                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000
78
                        : 0xFFFFFFFF);
79
            }
80
        }
81
        if (imgPath == null || "".equals(imgPath)) {
82
            return image;
83
        }
84
        // 插入图片    
85
        QRCodeUtils.insertImage(image, imgPath, needCompress);
86
        return image;
87
    }
88
89
    /**
90
     * 插入LOGO  
91
     *
92
     * @param source
93
     *            二维码图片  
94
     * @param imgPath
95
     *            LOGO图片地址  
96
     * @param needCompress
97
     *            是否压缩  
98
     * @throws Exception
99
     */
100
    private static void insertImage(BufferedImage source, String imgPath,
101
                                    boolean needCompress) throws Exception {
102
        File file = new File(imgPath);
103
        if (!file.exists()) {
104
            System.err.println(""+imgPath+"   该文件不存在!");
105
            return;
106
        }
107
        Image src = ImageIO.read(new File(imgPath));
108
        int width = src.getWidth(null);
109
        int height = src.getHeight(null);
110
        if (needCompress) { // 压缩LOGO    
111
            if (width > WIDTH) {
112
                width = WIDTH;
113
            }
114
            if (height > HEIGHT) {
115
                height = HEIGHT;
116
            }
117
            Image image = src.getScaledInstance(width, height,
118
                    Image.SCALE_SMOOTH);
119
            BufferedImage tag = new BufferedImage(width, height,
120
                    BufferedImage.TYPE_INT_RGB);
121
            Graphics g = tag.getGraphics();
122
            g.drawImage(image, 0, 0, null); // 绘制缩小后的图    
123
            g.dispose();
124
            src = image;
125
        }
126
        // 插入LOGO    
127
        Graphics2D graph = source.createGraphics();
128
        int x = (QRCODE_SIZE - width) / 2;
129
        int y = (QRCODE_SIZE - height) / 2;
130
        graph.drawImage(src, x, y, width, height, null);
131
        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
132
        graph.setStroke(new BasicStroke(3f));
133
        graph.draw(shape);
134
        graph.dispose();
135
    }
136
137
    /**
138
     * 生成二维码base64字符串
139
     *
140
     * @param content
141
     *            内容
142
     * @throws Exception
143
     */
144
    public static String encode(String content) throws Exception {
145
        BufferedImage image = QRCodeUtils.createImage(content, null, false);
146
147
        String imageBase64 = encodeToString(image);
148
        return imageBase64;
149
    }
150
151
    /**
152
     * 生成二维码(内嵌LOGO)  
153
     *
154
     * @param content
155
     *            内容  
156
     * @param imgPath
157
     *            LOGO地址  
158
     * @param destPath
159
     *            存放目录  
160
     * @param needCompress
161
     *            是否压缩LOGO  
162
     * @throws Exception
163
     */
164
    public static String encode(String content, String imgPath, String destPath,
165
                              boolean needCompress) throws Exception {
166
        BufferedImage image = QRCodeUtils.createImage(content, imgPath,
167
                needCompress);
168
        mkdirs(destPath);
169
        String file = new Random().nextInt(99999999)+".jpg";
170
        ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
171
        return file;
172
    }
173
174
    /**
175
     * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)  
176
     * @date 2013-12-11 上午10:16:36  
177
     * @param destPath 存放目录  
178
     */
179
    public static void mkdirs(String destPath) {
180
        File file =new File(destPath);
181
        //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)    
182
        if (!file.exists() && !file.isDirectory()) {
183
            file.mkdirs();
184
        }
185
    }
186
187
    /**
188
     * 生成二维码(内嵌LOGO)  
189
     *
190
     * @param content
191
     *            内容  
192
     * @param imgPath
193
     *            LOGO地址  
194
     * @param destPath
195
     *            存储地址  
196
     * @throws Exception
197
     */
198
    public static void encode(String content, String imgPath, String destPath)
199
            throws Exception {
200
        QRCodeUtils.encode(content, imgPath, destPath, false);
201
    }
202
203
    /**
204
     * 生成二维码  
205
     *
206
     * @param content
207
     *            内容  
208
     * @param destPath
209
     *            存储地址  
210
     * @param needCompress
211
     *            是否压缩LOGO  
212
     * @throws Exception
213
     */
214
    public static void encode(String content, String destPath,
215
                              boolean needCompress) throws Exception {
216
        QRCodeUtils.encode(content, null, destPath, needCompress);
217
    }
218
219
    /**
220
     * 生成二维码  
221
     *
222
     * @param content
223
     *            内容  
224
     * @param destPath
225
     *            存储地址  
226
     * @throws Exception
227
     */
228
    public static void encode(String content, String destPath) throws Exception {
229
        QRCodeUtils.encode(content, null, destPath, false);
230
    }
231
232
    /**
233
     * 生成二维码(内嵌LOGO)  
234
     *
235
     * @param content
236
     *            内容  
237
     * @param imgPath
238
     *            LOGO地址  
239
     * @param output
240
     *            输出流  
241
     * @param needCompress
242
     *            是否压缩LOGO  
243
     * @throws Exception
244
     */
245
    public static void encode(String content, String imgPath,
246
                              OutputStream output, boolean needCompress) throws Exception {
247
        BufferedImage image = QRCodeUtils.createImage(content, imgPath,
248
                needCompress);
249
        ImageIO.write(image, FORMAT_NAME, output);
250
    }
251
252
    /**
253
     * 生成二维码  
254
     *
255
     * @param content
256
     *            内容  
257
     * @param output
258
     *            输出流  
259
     * @throws Exception
260
     */
261
    public static void encode(String content, OutputStream output)
262
            throws Exception {
263
        QRCodeUtils.encode(content, null, output, false);
264
    }
265
266
    /**
267
     * 解析二维码  
268
     *
269
     * @param file
270
     *            二维码图片  
271
     * @return
272
     * @throws Exception
273
     */
274
    public static String decode(File file) throws Exception {
275
        BufferedImage image;
276
        image = ImageIO.read(file);
277
        if (image == null) {
278
            return null;
279
        }
280
        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(
281
                image);
282
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
283
        Result result;
284
        Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
285
        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
286
        result = new MultiFormatReader().decode(bitmap, hints);
287
        String resultStr = result.getText();
288
        return resultStr;
289
    }
290
291
    /**
292
     * 解析二维码  
293
     *
294
     * @param path
295
     *            二维码图片地址  
296
     * @return
297
     * @throws Exception
298
     */
299
    public static String decode(String path) throws Exception {
300
        return QRCodeUtils.decode(new File(path));
301
    }
302
}  

+ 7 - 2
src/main/java/io/renren/modules/admin/controller/AttendersController.java

@ -24,6 +24,9 @@ import io.renren.modules.admin.service.MemberService;
24 24
import io.renren.common.utils.MyUtils;
25 25
import io.renren.common.utils.PageUtils;
26 26
import io.renren.common.utils.R;
27
import io.renren.common.validator.ValidatorUtils;
28
import io.renren.common.validator.group.AddGroup;
29
import io.renren.common.validator.group.UpdateGroup;
27 30
28 31
29 32
@ -76,6 +79,7 @@ public class AttendersController {
76 79
    @PostMapping("/save")
77 80
    @RequiresPermissions("admin:attenders:save")
78 81
    public R save(@RequestBody AttendersviewEntity attendersform){
82
        ValidatorUtils.validateEntity(attendersform, AddGroup.class);
79 83
        Long meetingId = attendersform.getMeetingId();
80 84
        if (meetingId == 0L) {
81 85
            return R.error("会议id不可为空");
@ -88,11 +92,11 @@ public class AttendersController {
88 92
        // 存会员表(个人信息, 开票信息)
89 93
        if (member == null) {
90 94
            member = new MemberEntity();
95
            member.setTruename(attendersform.getTruename());
96
            member.setPhone(attendersform.getPhone());
91 97
        }
92
        member.setTruename(attendersform.getTruename());
93 98
        member.setOrganization(attendersform.getOrganization());
94 99
        member.setPosition(attendersform.getPosition());
95
        member.setPhone(attendersform.getPhone());
96 100
        member.setEmail(attendersform.getEmail());
97 101
        member.setSex(attendersform.getSex());
98 102
        member.setRemark(attendersform.getRemark());
@ -141,6 +145,7 @@ public class AttendersController {
141 145
    @PostMapping("/update")
142 146
    @RequiresPermissions("admin:attenders:update")
143 147
    public R update(@RequestBody AttendersviewEntity attendersform){
148
        ValidatorUtils.validateEntity(attendersform, UpdateGroup.class);
144 149
        Long meetingId = attendersform.getMeetingId();
145 150
        if (meetingId == 0L) {
146 151
            return R.error("会议id不可为空");

+ 5 - 0
src/main/java/io/renren/modules/admin/controller/MemberController.java

@ -18,6 +18,9 @@ import io.renren.modules.admin.entity.MemberEntity;
18 18
import io.renren.modules.admin.service.MemberService;
19 19
import io.renren.common.utils.PageUtils;
20 20
import io.renren.common.utils.R;
21
import io.renren.common.validator.ValidatorUtils;
22
import io.renren.common.validator.group.AddGroup;
23
import io.renren.common.validator.group.UpdateGroup;
21 24
import io.renren.common.utils.MyUtils;
22 25
23 26
@ -62,6 +65,7 @@ public class MemberController {
62 65
    @PostMapping("/save")
63 66
    @RequiresPermissions("admin:member:save")
64 67
    public R save(@RequestBody MemberEntity member){
68
        ValidatorUtils.validateEntity(member, AddGroup.class);
65 69
        memberService.saveMember(member);
66 70
67 71
        return R.ok();
@ -73,6 +77,7 @@ public class MemberController {
73 77
    @PostMapping("/update")
74 78
    @RequiresPermissions("admin:member:update")
75 79
    public R update(@RequestBody MemberEntity member){
80
        ValidatorUtils.validateEntity(member, UpdateGroup.class);
76 81
		memberService.updateMember(member);
77 82
78 83
        return R.ok();

+ 242 - 16
src/main/java/io/renren/modules/admin/controller/SignController.java

@ -1,25 +1,41 @@
1 1
package io.renren.modules.admin.controller;
2 2
3
import java.net.URLEncoder;
4
import java.text.SimpleDateFormat;
5
import java.util.ArrayList;
3 6
import java.util.Arrays;
7
import java.util.Date;
8
import java.util.List;
4 9
import java.util.Map;
5 10
11
import javax.servlet.http.HttpServletResponse;
12
6 13
import org.apache.shiro.authz.annotation.RequiresPermissions;
7 14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.beans.factory.annotation.Value;
16
import org.springframework.web.bind.annotation.GetMapping;
8 17
import org.springframework.web.bind.annotation.PathVariable;
18
import org.springframework.web.bind.annotation.PostMapping;
9 19
import org.springframework.web.bind.annotation.RequestBody;
10 20
import org.springframework.web.bind.annotation.RequestMapping;
11 21
import org.springframework.web.bind.annotation.RequestParam;
12 22
import org.springframework.web.bind.annotation.RestController;
13 23
24
import io.renren.modules.admin.entity.AttendersEntity;
25
import io.renren.modules.admin.entity.MemberEntity;
14 26
import io.renren.modules.admin.entity.SignEntity;
15 27
import io.renren.modules.admin.entity.SignviewEntity;
28
import io.renren.modules.admin.service.AttendersService;
29
import io.renren.modules.admin.service.MemberService;
16 30
import io.renren.modules.admin.service.SignService;
17 31
import io.renren.modules.admin.service.SignviewService;
32
import io.renren.common.utils.ExcelData;
33
import io.renren.common.utils.ExcelUtils;
34
import io.renren.common.utils.MyUtils;
18 35
import io.renren.common.utils.PageUtils;
36
import io.renren.common.utils.QRCodeUtils;
19 37
import io.renren.common.utils.R;
20 38
21
22
23 39
/**
24 40
 * 签到表
25 41
 *
@ -34,47 +50,165 @@ public class SignController {
34 50
    private SignService signService;
35 51
    @Autowired
36 52
    private SignviewService signviewService;
53
    @Autowired
54
    private MemberService memberService;
55
    @Autowired
56
    private AttendersService attendersService;
57
    @Value("${url}")
58
    private String infourl; // 读取配置文件中的指定目录
37 59
38 60
    /**
39 61
     * 列表
40 62
     */
41
    @RequestMapping("/list")
63
    @GetMapping("/list")
42 64
    @RequiresPermissions("admin:sign:list")
43
    public R list(@RequestParam Map<String, Object> params){
65
    public R list(@RequestParam Map<String, Object> params) {
44 66
        PageUtils page = signviewService.queryPage(params);
45 67
46 68
        return R.ok().put("page", page);
47 69
    }
48 70
49 71
    /**
50
     * 信息
72
     * 获取打印条码等值
51 73
     */
52
    @RequestMapping("/info/{id}")
74
    @GetMapping("/codeinfo/{aid}")
53 75
    @RequiresPermissions("admin:sign:info")
54
    public R info(@PathVariable("id") Long id){
55
		SignviewEntity sign = signviewService.getById(id);
76
    public R codeInfo(@PathVariable("aid") Long aid) {
77
        SignviewEntity signinfo = signviewService.getByAid(aid);
78
        if (signinfo == null) {
79
            return R.error("用户不存在");
80
        }
81
        
82
        SignEntity sign = new SignEntity();
56 83
57
        return R.ok().put("sign", sign);
84
        if (signinfo.getId()==null || signinfo.getId()==0L) {
85
            String token = MyUtils.md5(aid + signinfo.getSymbol());
86
            sign.setToken(token);
87
            sign.setAttendersId(aid);
88
            sign.setStatus(1);
89
            sign.setBadge(1);
90
            sign.setPrintNum(1);
91
            sign.setPrintTime(new Date());
92
            sign.setCreateTime(new Date());
93
            signService.save(sign);
94
        } else {
95
            sign.setId(signinfo.getId());
96
            Integer printNum = sign.getPrintNum() == null ? 1 : sign.getPrintNum() + 1;
97
            sign.setPrintNum(printNum);
98
            sign.setPrintTime(new Date());
99
            signService.updateById(sign);
100
        }
101
102
        String image =null;
103
        try {
104
            image = QRCodeUtils.encode(infourl + signinfo.getSymbol());
105
        } catch (Exception e) {
106
            e.printStackTrace();
107
        }
108
        signinfo.setImage( "data:image/jpeg;base64," + image);
109
        return R.ok().put("signinfo", signinfo);
58 110
    }
59 111
60 112
    /**
61 113
     * 保存
62 114
     */
63
    @RequestMapping("/save")
115
    @PostMapping("/save")
64 116
    @RequiresPermissions("admin:sign:save")
65
    public R save(@RequestBody SignEntity sign){
66
		signService.save(sign);
117
    public R save(@RequestBody SignviewEntity signForm){
118
        Long meetingId = signForm.getMeetingId();
119
        if (meetingId == 0L) {
120
            return R.error("会议id不可为空");
121
        }
122
123
        String symbol = MyUtils.md5(signForm.getTruename() + signForm.getPhone());
67 124
125
        MemberEntity member = memberService.getBySymbol(symbol);
126
127
        // 存会员表(个人信息, 开票信息)
128
        if (member == null) {
129
            member = new MemberEntity();
130
            member.setTruename(signForm.getTruename());
131
            member.setPhone(signForm.getPhone());
132
            member.setOrganization(signForm.getOrganization());
133
            member.setPosition(signForm.getPosition());
134
            member.setRemark(signForm.getRemark());
135
            memberService.save(member);
136
        } else {
137
            member.setOrganization(signForm.getOrganization());
138
            member.setPosition(signForm.getPosition());
139
            member.setRemark(signForm.getRemark());
140
            memberService.updateById(member);
141
        }
142
143
        Long memberId = member.getId();
144
        // 存参会信息
145
        AttendersEntity attenders = new AttendersEntity();
146
        attenders.setMemberId(memberId);
147
        attenders.setMeetingId(meetingId);
148
        attenders.setFeeType(signForm.getFeeType());
149
        attenders.setIsPay(1);
150
        attenders.setMoney(signForm.getMoney());
151
        attendersService.save(attenders);
152
153
        // 存签到信息
154
        SignEntity sign = new SignEntity();
155
        String token = MyUtils.md5(attenders.getId() + member.getSymbol());
156
        sign.setToken(token);
157
        sign.setAttendersId(attenders.getId());
158
        sign.setStatus(1);
159
        sign.setCreateTime(new Date());
160
        signService.save(sign);
161
        // signService.save(sign);
68 162
        return R.ok();
69 163
    }
70 164
165
    /**
166
     * 信息
167
     */
168
    @GetMapping("/infobyaid/{aid}")
169
    @RequiresPermissions("admin:sign:info")
170
    public R info(@PathVariable("aid") Long aid) {
171
        SignviewEntity signinfo = signviewService.getByAid(aid);
172
173
        return R.ok().put("signinfo", signinfo);
174
    }
175
71 176
    /**
72 177
     * 修改
73 178
     */
74
    @RequestMapping("/update")
179
    @PostMapping("/update")
75 180
    @RequiresPermissions("admin:sign:update")
76
    public R update(@RequestBody SignEntity sign){
77
		signService.updateById(sign);
181
    public R update(@RequestBody SignviewEntity signForm){
182
        Long meetingId = signForm.getMeetingId();
183
        if (meetingId == 0L) {
184
            return R.error("会议id不可为空");
185
        }
186
187
        AttendersEntity attenders = attendersService.getById(signForm.getAid());
188
        attenders.setFeeType(signForm.getFeeType());
189
        attenders.setMoney(signForm.getMoney());
190
        attendersService.updateById(attenders);
191
192
        MemberEntity member = memberService.getById(attenders.getMemberId());
193
        member.setTruename(signForm.getTruename());
194
        member.setOrganization(signForm.getOrganization());
195
        member.setPosition(signForm.getPosition());
196
        member.setPhone(signForm.getPhone());
197
        member.setRemark(signForm.getRemark());
198
        memberService.updateMember(member);
199
200
        SignEntity sign = new SignEntity();
201
        String token = MyUtils.md5(attenders.getId() + member.getSymbol());
202
        sign.setToken(token);
203
        if (signForm.getId()==null || signForm.getId()==0L) {
204
            sign.setAttendersId(attenders.getId());
205
            sign.setStatus(1);
206
            sign.setCreateTime(new Date());
207
            signService.save(sign);
208
        } else {
209
            sign.setId(signForm.getId());
210
            signService.updateById(sign);
211
        }
78 212
79 213
        return R.ok();
80 214
    }
@ -82,7 +216,7 @@ public class SignController {
82 216
    /**
83 217
     * 删除
84 218
     */
85
    @RequestMapping("/delete")
219
    @PostMapping("/delete")
86 220
    @RequiresPermissions("admin:sign:delete")
87 221
    public R delete(@RequestBody Long[] ids){
88 222
		signService.removeByIds(Arrays.asList(ids));
@ -90,4 +224,96 @@ public class SignController {
90 224
        return R.ok();
91 225
    }
92 226
227
    /**
228
     * 导出签到数据
229
     */
230
    @GetMapping("/exportexcel")
231
    @RequiresPermissions("admin:sign:list")
232
    public void makeExcel(HttpServletResponse response, @RequestParam Map<String, Object> params) throws Exception {
233
        if (!params.containsKey("meetingId")) {
234
            throw new Exception("会议id不可为空");
235
        }
236
        Long meetingId = Long.valueOf((String) params.get("meetingId"));
237
        String meetingName = params.containsKey("meetingName") ? params.get("meetingName").toString() : "";
238
       
239
        ExcelData data = new ExcelData();
240
        data.setName(meetingName + "签到数据");
241
        //添加表头
242
        List<String> titles = new ArrayList<String>();
243
        titles.add("序号");
244
        titles.add("姓名");
245
        titles.add("单位名称");
246
        titles.add("职务");
247
        titles.add("性别");
248
        titles.add("联系电话");
249
        titles.add("邮箱");
250
        titles.add("参会人员类型");
251
        titles.add("费用类型");
252
        titles.add("是否缴费");
253
        titles.add("金额");
254
        titles.add("最后签到时间");
255
        data.setTitles(titles);
256
        //添加列
257
        List<List<Object>> rows = new ArrayList<List<Object>>();
258
        List<Object> row = null;
259
260
        List<SignviewEntity> signExportEntities = signviewService.listSignAll(meetingId);
261
        SimpleDateFormat lastdate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
262
        for (SignviewEntity signInfo : signExportEntities) {
263
            row = new ArrayList<Object>();
264
            row.add(signInfo.getId());
265
            row.add(signInfo.getTruename());
266
            row.add(signInfo.getOrganization());
267
            row.add(signInfo.getPosition());
268
            Integer sex = signInfo.getSex();
269
            if (sex == 1) {
270
                row.add("男");
271
            } else if (sex == 2) {
272
                row.add("女");
273
            } else {
274
                row.add("未知");
275
            }
276
            row.add(signInfo.getPhone());
277
            Integer memberType = signInfo.getMemberType();
278
            if (memberType == 1) {
279
                row.add("免注册");
280
            } else {
281
                row.add("正常");
282
            }
283
            Integer feeType = signInfo.getFeeType();
284
            if (feeType == 2) {
285
                row.add("学生");
286
            } else {
287
                row.add("普通");
288
            }
289
            Integer isPay =(Integer) signInfo.getIsPay(); 
290
            if (isPay == 0) {
291
                row.add("否");
292
            } else {
293
                row.add("是");
294
            }
295
            row.add(signInfo.getMoney());
296
            if (signInfo.getLastTime()==null) {
297
                row.add("");
298
            } else {
299
                String lastTime = lastdate.format((Date) signInfo.getLastTime());
300
                row.add(lastTime);
301
            }
302
            
303
            rows.add(row);
304
            row = null;
305
        }
306
        data.setRows(rows);
307
        SimpleDateFormat fdate=new SimpleDateFormat("yyyyMMddHHmmss");
308
        String fileName=fdate.format(new Date())+".xlsx";
309
310
        // 告诉浏览器用什么软件可以打开此文件
311
        response.setHeader("content-Type", "application/vnd.ms-excel");
312
        // 下载文件的默认名称
313
        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "utf-8"));
314
        // response.setHeader("Content-Disposition", "attachment;filename="+fileName);
315
316
        ExcelUtils.exportExcel(data, response.getOutputStream());
317
    }
318
93 319
}

+ 6 - 1
src/main/java/io/renren/modules/admin/dao/SignviewDao.java

@ -1,8 +1,12 @@
1 1
package io.renren.modules.admin.dao;
2 2
3 3
import io.renren.modules.admin.entity.SignviewEntity;
4
5
import java.util.Map;
6
4 7
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5 8
import org.apache.ibatis.annotations.Mapper;
9
import org.apache.ibatis.annotations.Select;
6 10
7 11
/**
8 12
 * VIEW
@ -13,5 +17,6 @@ import org.apache.ibatis.annotations.Mapper;
13 17
 */
14 18
@Mapper
15 19
public interface SignviewDao extends BaseMapper<SignviewEntity> {
16
	
20
    @Select("select s.member_id, a.truename, a.member_type, s.token from sign_info s join attenders a on s.member_id=a.id where s.member_id=#{memberId}")
21
	Map<String, Object> getCodeInfo(Long memberId);
17 22
}

+ 19 - 1
src/main/java/io/renren/modules/admin/entity/SignviewEntity.java

@ -1,5 +1,6 @@
1 1
package io.renren.modules.admin.entity;
2 2
3
import com.baomidou.mybatisplus.annotation.TableField;
3 4
import com.baomidou.mybatisplus.annotation.TableId;
4 5
import com.baomidou.mybatisplus.annotation.TableName;
5 6
@ -37,10 +38,19 @@ public class SignviewEntity implements Serializable {
37 38
	 * 单位名称
38 39
	 */
39 40
	private String organization;
41
	/**
42
	 * 
43
	 */
44
	private String position;
40 45
	/**
41 46
	 * 电话
42 47
	 */
43 48
	private String phone;
49
	/**
50
	 * 性别
51
	 * 
52
	 */
53
	private Integer sex;
44 54
	/**
45 55
	 * 标记
46 56
	 */
@ -105,5 +115,13 @@ public class SignviewEntity implements Serializable {
105 115
	 * 标识
106 116
	 */
107 117
	private String symbol;
108
118
	/**
119
     * 会议id
120
     */
121
    private Long meetingId;
122
	/**
123
	 * 
124
	 */
125
	@TableField(exist=false)
126
	private String image;
109 127
}

+ 5 - 0
src/main/java/io/renren/modules/admin/service/SignviewService.java

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
4 4
import io.renren.common.utils.PageUtils;
5 5
import io.renren.modules.admin.entity.SignviewEntity;
6 6
7
import java.util.List;
7 8
import java.util.Map;
8 9
9 10
/**
@ -16,5 +17,9 @@ import java.util.Map;
16 17
public interface SignviewService extends IService<SignviewEntity> {
17 18
18 19
    PageUtils queryPage(Map<String, Object> params);
20
21
	SignviewEntity getByAid(Long aid);
22
23
	List<SignviewEntity> listSignAll(Long meetingId);
19 24
}
20 25

+ 1 - 0
src/main/java/io/renren/modules/admin/service/impl/MemberServiceImpl.java

@ -54,6 +54,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberDao, MemberEntity> impl
54 54
55 55
    @Override
56 56
    public boolean updateMember(MemberEntity member) {
57
        member.setSymbol(MyUtils.md5(member.getTruename() + member.getPhone()));
57 58
        member.setModifyTime(new Date());
58 59
        return this.updateById(member);
59 60
    }

+ 21 - 5
src/main/java/io/renren/modules/admin/service/impl/SignviewServiceImpl.java

@ -1,6 +1,9 @@
1 1
package io.renren.modules.admin.service.impl;
2 2
3
import org.apache.commons.lang.StringUtils;
3 4
import org.springframework.stereotype.Service;
5
6
import java.util.List;
4 7
import java.util.Map;
5 8
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6 9
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -12,18 +15,31 @@ import io.renren.modules.admin.dao.SignviewDao;
12 15
import io.renren.modules.admin.entity.SignviewEntity;
13 16
import io.renren.modules.admin.service.SignviewService;
14 17
15
16 18
@Service("signviewService")
17 19
public class SignviewServiceImpl extends ServiceImpl<SignviewDao, SignviewEntity> implements SignviewService {
18 20
19 21
    @Override
20 22
    public PageUtils queryPage(Map<String, Object> params) {
21
        IPage<SignviewEntity> page = this.page(
22
                new Query<SignviewEntity>().getPage(params),
23
                new QueryWrapper<SignviewEntity>()
24
        );
23
        String meetingId = (String) params.get("meetingId");
24
        String key = params.containsKey("key") ? (String) params.get("key") : "";
25
26
        IPage<SignviewEntity> page = this.page(new Query<SignviewEntity>().getPage(params),
27
                new QueryWrapper<SignviewEntity>().eq("meeting_id", meetingId)
28
                        .like(StringUtils.isNotBlank(key), "truename", key).or()
29
                        .like(StringUtils.isNotBlank(key), "phone", key).or()
30
                        .like(StringUtils.isNotBlank(key), "organization", key));
25 31
26 32
        return new PageUtils(page);
27 33
    }
28 34
35
    @Override
36
    public SignviewEntity getByAid(Long aid) {
37
        return this.getOne(new QueryWrapper<SignviewEntity>().eq("aid", aid));
38
    }
39
40
    @Override
41
    public List<SignviewEntity> listSignAll(Long meetingId) {
42
        return this.list(new QueryWrapper<SignviewEntity>().eq("meeting_id", meetingId).eq("status", 1));
43
    }
44
29 45
}

+ 10 - 0
src/main/java/io/renren/modules/app/controller/AppAttendersController.java

@ -6,10 +6,12 @@ import io.renren.modules.admin.entity.AttendersEntity;
6 6
import io.renren.modules.admin.entity.AttendersviewEntity;
7 7
import io.renren.modules.admin.entity.MemberEntity;
8 8
import io.renren.modules.admin.service.AttendersService;
9
import io.renren.modules.admin.service.AttendersviewService;
9 10
import io.renren.modules.admin.service.MemberService;
10 11
11 12
import org.springframework.beans.factory.annotation.Autowired;
12 13
import org.springframework.web.bind.annotation.GetMapping;
14
import org.springframework.web.bind.annotation.PathVariable;
13 15
import org.springframework.web.bind.annotation.PostMapping;
14 16
import org.springframework.web.bind.annotation.RequestBody;
15 17
import org.springframework.web.bind.annotation.RequestMapping;
@ -27,6 +29,8 @@ public class AppAttendersController {
27 29
    private AttendersService attendersService;
28 30
    @Autowired
29 31
    private MemberService memberService;
32
    @Autowired
33
    private AttendersviewService attendersviewService;
30 34
31 35
    @GetMapping("notToken")
32 36
    public R notToken(){
@ -93,6 +97,12 @@ public class AppAttendersController {
93 97
        return R.ok();
94 98
    }
95 99
100
    @GetMapping("/infobysymbol/{symbol}")
101
    public R notToken(@PathVariable("symbol") String symbol){
102
        AttendersviewEntity attenders = attendersviewService.getBySymbol(symbol);
103
        return R.ok().put("attenders", attenders);
104
    }
105
96 106
}
97 107
98 108