Merge remote-tracking branch 'origin/master'

This commit is contained in:
fl 2025-04-02 17:14:51 +08:00
commit abb9180bcd
23 changed files with 819 additions and 226 deletions

View File

@ -27,5 +27,17 @@
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
<data-source source="LOCAL" name="yn_img_tool@127.0.0.1" uuid="826f3ee5-e63f-4742-9b4f-b71894453330">
<driver-ref>mysql.8</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://127.0.0.1:3306/yn_img_tool?useUnicode=true&amp;characterEncoding=utf-8&amp;allowMultiQueries=true&amp;useSSL=false</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.container.port" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

View File

@ -9,6 +9,7 @@ import com.bonus.imgTool.system.vo.EncryptedReq;
import com.bonus.imgTool.utils.ServerResponse;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -31,6 +32,13 @@ public class SynthesisQueryController {
@Resource(name = "SynthesisQueryService")
private SynthesisQueryService synthesisQueryService;
@ApiOperation("综合查询-照片综合查询-照片数量")
@PostMapping(value = "getImgNum")
@DecryptAndVerify(decryptedClass = QueryParamDto.class)
public ServerResponse getImgNum(EncryptedReq<QueryParamDto> data) {
return synthesisQueryService.getImgNum(data.getData());
}
@PostMapping(value = "getImgList")
@DecryptAndVerify(decryptedClass = QueryParamDto.class)
@LogAnnotation(operModul = "综合查询-照片综合查询", operation = "查询照片", operDesc = "系统级事件",operType="查询")

View File

@ -1,6 +1,7 @@
package com.bonus.imgTool.backstage.dao;
import com.bonus.imgTool.backstage.entity.QueryParamDto;
import com.bonus.imgTool.backstage.entity.SynthesisNumVo;
import com.bonus.imgTool.backstage.entity.SynthesisQueryVo;
import org.springframework.stereotype.Repository;
@ -15,6 +16,16 @@ import java.util.List;
*/
@Repository(value = "SynthesisQueryDao")
public interface SynthesisQueryDao {
/**
* 综合查询-照片综合查询-照片数量
* @param dto
* @return SynthesisNumVo
* @author cwchen
* @date 2025/4/2 15:40
*/
SynthesisNumVo getImgNum(QueryParamDto dto);
/**
* 照片综合查询
* @param dto

View File

@ -2,6 +2,8 @@ package com.bonus.imgTool.backstage.entity;
import lombok.Data;
import java.util.List;
/**
* @className:QueryParamDto
* @author:cwchen
@ -16,8 +18,20 @@ public class QueryParamDto {
* 1.我的收藏 2.最近上传
*/
private int queryType;
/**用户id*/
/**
* 用户id
*/
private long userId;
/**
* 用户管理的工程
*/
private List<Long> proIds;
/**
* 角色级别 0.项目部 1.分公司
*/
private String roleLevel;
private int pageNum = 1;
private int pageSize = 15;
}

View File

@ -0,0 +1,27 @@
package com.bonus.imgTool.backstage.entity;
import lombok.Data;
/**
* @className:SynthesisNumVo
* @author:cwchen
* @date:2025-04-02-14:22
* @version:1.0
* @description:综合查询各类型图片数量
*/
@Data
public class SynthesisNumVo {
/**总照片数量*/
private int totalNum;
/**安全违章*/
private int safetyVioNum;
/**质量检查*/
private int qualityInsNum;
/**安全措施落实*/
private int safetyMeasNum;
/**协调照片*/
private int coordinatedPhotoNum;
/**重要事项及宣传类*/
private int importIssuesAndPublicityNum;
}

View File

@ -15,7 +15,7 @@ import java.util.Date;
@Data
public class SynthesisQueryVo {
private String id;
private Long id;
/**
* 原图图片路径
*/

View File

@ -11,6 +11,16 @@ import com.bonus.imgTool.utils.ServerResponse;
* @description:综合查询
*/
public interface SynthesisQueryService {
/**
* 综合查询-照片综合查询-照片数量
* @param data
* @return ServerResponse
* @author cwchen
* @date 2025/4/2 14:59
*/
ServerResponse getImgNum(QueryParamDto data);
/**
* 照片综合查询
* @param data

View File

@ -2,10 +2,13 @@ package com.bonus.imgTool.backstage.service.impl;
import com.bonus.imgTool.backstage.dao.SynthesisQueryDao;
import com.bonus.imgTool.backstage.entity.QueryParamDto;
import com.bonus.imgTool.backstage.entity.SynthesisNumVo;
import com.bonus.imgTool.backstage.entity.SynthesisQueryVo;
import com.bonus.imgTool.backstage.service.SynthesisQueryService;
import com.bonus.imgTool.system.vo.LoginUser;
import com.bonus.imgTool.utils.ServerResponse;
import com.bonus.imgTool.utils.UserUtil;
import com.bonus.imgTool.webResult.Constants;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
@ -14,9 +17,8 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
* @className:SynthesisQueryServiceImpl
@ -32,11 +34,30 @@ public class SynthesisQueryServiceImpl implements SynthesisQueryService {
@Resource(name = "SynthesisQueryDao")
private SynthesisQueryDao synthesisQueryDao;
@Override
public ServerResponse getImgNum(QueryParamDto dto) {
try {
String roleLevel = Optional.ofNullable(UserUtil.getLoginUser()).map(LoginUser::getRoleLevel).orElse("0");
String proIds = Optional.ofNullable(UserUtil.getLoginUser()).map(LoginUser::getProIds).orElse("-1");
if(Objects.equals(roleLevel, Constants.ROLE_LEVEL)){ // 项目部级
List<Long> proList = Arrays.stream(proIds.split(",")).map(String::trim).filter(s -> !s.isEmpty()).map(Long::valueOf).collect(Collectors.toList());
dto.setProIds(proList);
}
dto.setRoleLevel(roleLevel);
SynthesisNumVo vo = Optional.ofNullable(synthesisQueryDao.getImgNum(dto)).orElseGet(SynthesisNumVo::new);
return ServerResponse.createSuccess(vo);
} catch (Exception e) {
log.error(e.toString(),e);
return ServerResponse.createErroe("查询失败");
}
}
@Override
public ServerResponse getImgList(QueryParamDto dto) {
PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
try {
dto.setUserId(UserUtil.getLoginUser() != null ? UserUtil.getLoginUser().getId() : 0);
Long userId = Optional.ofNullable(UserUtil.getLoginUser()).map(LoginUser::getId).orElse(0L);
dto.setUserId(userId);
List<SynthesisQueryVo> list = Optional.ofNullable(synthesisQueryDao.getImgList(dto)).orElseGet(ArrayList::new);
PageInfo<SynthesisQueryVo> pageInfo = new PageInfo<>(list);
return ServerResponse.createSuccess(pageInfo);

View File

@ -58,5 +58,9 @@ public class Role extends PageEntity {
* 角色级别
*/
private Integer level;
/**
* 角色级别名称
*/
private String levelName;
}

View File

@ -1,7 +1,11 @@
package com.bonus.imgTool.model;
import com.bonus.imgTool.base.entity.PageEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class SysUser extends PageEntity {
@ -105,6 +109,11 @@ public class SysUser extends PageEntity {
* 休眠时间
*/
private String sleepTime;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createTime;
private String updatePasswordTime;
@ -141,6 +150,16 @@ public class SysUser extends PageEntity {
*/
private String signImg;
/**
* 角色级别
*/
private String roleLevel;
/**
* 工程ID
*/
private String proIds;
public interface Status {
int DISABLED = 0;

View File

@ -100,14 +100,14 @@ public class UserController {
try {
SysUser u = userService.getUser(data.getData().getLoginName());
if (u != null) {
return ServerResponse.createErroe("登录"+data.getData().getLoginName() + "已存在");
return ServerResponse.createErroe("登录账号"+data.getData().getLoginName() + "已存在");
}
if(StringHelper.isNotEmpty(data.getData().getPhone())){
/* if(StringHelper.isNotEmpty(data.getData().getPhone())){
SysUser u2 = userService.getPhone(data.getData().getPhone());
if (u2 != null) {
return ServerResponse.createErroe("手机号"+data.getData().getPhone() + "已存在");
}
}
}*/
ServerResponse response=userService.saveUser(data.getData());
return response;
}catch (Exception e){

View File

@ -0,0 +1,331 @@
package com.bonus.imgTool.utils;
import javax.imageio.*;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.FileImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @className:HighQualityWatermark
* @author:cwchen
* @date:2025-04-02-14:04
* @version:1.0
* @description:
*/
public class HighQualityWatermark {
private static final String DEFAULT_FONT_NAME = "Microsoft YaHei";
private static final int DEFAULT_FONT_STYLE = Font.BOLD;
private static final Color DEFAULT_COLOR = new Color(195, 32, 32, 255);
private static final int MIN_FONT_SIZE = 10;
private static final int MAX_FONT_SIZE = 72;
private static final float MIN_OPACITY = 0.3f;
private static final float MAX_OPACITY = 0.9f;
private static final float DEFAULT_QUALITY = 1.0f; // 最高质量(无损)
/**
* 添加高质量多行水印
* @param sourceImagePath 源图片路径
* @param targetImagePath 目标图片路径
* @param textLines 多行水印文本
* @param position 水印位置
* @param opacity 透明度
* @param fontName 字体名称
*/
public static void addHighQualityWatermark(String sourceImagePath, String targetImagePath,
List<String> textLines, String position,
float opacity, String fontName) throws Exception {
// 参数校验
if (opacity < MIN_OPACITY || opacity > MAX_OPACITY) {
opacity = 0.7f;
}
// 读取源图片
opacity = Math.max(MIN_OPACITY, Math.min(opacity, MAX_OPACITY));
// 读取原始图片并获取其类型
BufferedImage originalImage = ImageIO.read(new File(sourceImagePath));
int imageType = originalImage.getTransparency() == Transparency.OPAQUE
? BufferedImage.TYPE_INT_RGB
: BufferedImage.TYPE_INT_ARGB;
// 创建与原始图片相同大小的新图像
BufferedImage sourceImage = new BufferedImage(
originalImage.getWidth(),
originalImage.getHeight(),
imageType
);
int imageWidth = sourceImage.getWidth();
int imageHeight = sourceImage.getHeight();
// 绘制原始图片到新图像
Graphics2D g2d = sourceImage.createGraphics();
g2d.drawImage(originalImage, 0, 0, null);
// 设置最高质量的渲染参数
setHighestQuality(g2d);
// 计算最大允许宽度图片宽度的四分之三
// int maxAllowedWidth = imageWidth / 2;
int maxAllowedWidth = (int) (imageWidth * 3.0 / 4);
// 确定最佳字体大小
Font optimalFont = findOptimalFontSize(g2d, textLines, maxAllowedWidth, imageWidth, imageHeight, fontName);
g2d.setFont(optimalFont);
FontMetrics fm = g2d.getFontMetrics();
// 处理每行文本的换行
List<List<String>> wrappedLines = wrapAllLines(g2d, textLines, maxAllowedWidth);
// 计算水印总高度和最大行宽度
int lineHeight = fm.getHeight();
int totalHeight = calculateTotalHeight(wrappedLines, lineHeight);
int maxLineWidth = findMaxLineWidth(g2d, wrappedLines);
// 设置水印颜色和透明度
Color watermarkColor = new Color(DEFAULT_COLOR.getRed(), DEFAULT_COLOR.getGreen(),
DEFAULT_COLOR.getBlue(), (int)(opacity * 255));
g2d.setColor(watermarkColor);
// 计算水印起始位置
Point startPoint = calculateWatermarkPosition(position, imageWidth, imageHeight,
maxLineWidth, totalHeight, fm);
// 绘制水印
drawWatermarkLines(g2d, wrappedLines, startPoint, lineHeight, position, imageWidth);
// 释放资源
g2d.dispose();
// 高质量保存图片
saveWithHighQuality(sourceImage, targetImagePath);
}
/**
* 设置最高质量的渲染参数
*/
private static void setHighestQuality(Graphics2D g2d) {
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
}
/**
* 寻找最佳字体大小
*/
private static Font findOptimalFontSize(Graphics2D g2d, List<String> textLines,
int maxAllowedWidth, int imgWidth,
int imgHeight, String fontName) {
// 基于图片对角线长度计算初始字体大小
double diagonal = Math.sqrt(imgWidth * imgWidth + imgHeight * imgHeight);
int initialSize = (int)(diagonal * 0.03);
initialSize = Math.max(MIN_FONT_SIZE, Math.min(initialSize, MAX_FONT_SIZE));
Font testFont = new Font(fontName, DEFAULT_FONT_STYLE, initialSize);
g2d.setFont(testFont);
/*// 检查所有行是否都适合
boolean allFit = checkAllLinesFit(g2d, textLines, maxAllowedWidth);
// 如果不适合逐步减小字体大小
int currentSize = initialSize;
while (!allFit && currentSize > MIN_FONT_SIZE) {
currentSize--;
testFont = new Font(fontName, DEFAULT_FONT_STYLE, currentSize);
g2d.setFont(testFont);
allFit = checkAllLinesFit(g2d, textLines, maxAllowedWidth);
}*/
return testFont;
}
/**
* 检查所有行是否适合最大宽度
*/
private static boolean checkAllLinesFit(Graphics2D g2d, List<String> textLines, int maxWidth) {
FontMetrics fm = g2d.getFontMetrics();
return textLines.stream().allMatch(line -> fm.stringWidth(line) <= maxWidth);
}
/**
* 处理所有行的换行
*/
private static List<List<String>> wrapAllLines(Graphics2D g2d, List<String> textLines, int maxWidth) {
List<List<String>> wrappedLines = new ArrayList<>();
for (String line : textLines) {
wrappedLines.add(wrapSingleLine(g2d, line, maxWidth));
}
return wrappedLines;
}
/**
* 单行文本换行处理
*/
private static List<String> wrapSingleLine(Graphics2D g2d, String line, int maxWidth) {
List<String> wrapped = new ArrayList<>();
FontMetrics fm = g2d.getFontMetrics();
// 如果整行宽度小于最大宽度直接返回
if (fm.stringWidth(line) <= maxWidth) {
wrapped.add(line);
return wrapped;
}
// 按空格分割单词
String[] words = line.split("@@");
StringBuilder currentLine = new StringBuilder(words[0]);
for (int i = 1; i < words.length; i++) {
String testLine = currentLine + " " + words[i];
if (fm.stringWidth(testLine) <= maxWidth) {
currentLine.append(" ").append(words[i]);
} else {
wrapped.add(currentLine.toString());
currentLine = new StringBuilder(words[i]);
}
}
wrapped.add(currentLine.toString());
return wrapped;
}
/**
* 计算水印总高度
*/
private static int calculateTotalHeight(List<List<String>> allWrappedLines, int lineHeight) {
int totalLines = allWrappedLines.stream().mapToInt(List::size).sum();
// 总行数 * 行高 + (段落数-1) * 行高/2 (段落间距)
return totalLines * lineHeight + (allWrappedLines.size() - 1) * (lineHeight / 2);
}
/**
* 查找最大行宽度
*/
private static int findMaxLineWidth(Graphics2D g2d, List<List<String>> allWrappedLines) {
int maxWidth = 0;
FontMetrics fm = g2d.getFontMetrics();
for (List<String> lines : allWrappedLines) {
for (String line : lines) {
int width = fm.stringWidth(line);
if (width > maxWidth) {
maxWidth = width;
}
}
}
return maxWidth;
}
/**
* 计算水印位置
*/
private static Point calculateWatermarkPosition(String position, int imgWidth, int imgHeight,
int maxLineWidth, int totalHeight,
FontMetrics fm) {
int margin = (int)(Math.min(imgWidth, imgHeight) * 0.05); // 5%边距
int x = 0;
int y = 0;
switch (position.toLowerCase()) {
case "center":
x = (imgWidth - maxLineWidth) / 2;
y = (imgHeight - totalHeight) / 2 + fm.getAscent();
break;
case "top-left":
x = margin;
y = margin + fm.getAscent();
break;
case "top-right":
x = imgWidth - maxLineWidth - margin;
y = margin + fm.getAscent();
break;
case "bottom-left":
x = margin;
y = imgHeight - totalHeight - margin + fm.getAscent();
break;
case "bottom-right":
x = imgWidth - maxLineWidth - margin;
y = imgHeight - totalHeight - margin + fm.getAscent();
break;
default: // 默认居中
x = (imgWidth - maxLineWidth) / 2;
y = (imgHeight - totalHeight) / 2 + fm.getAscent();
}
return new Point(x, y);
}
/**
* 绘制水印文本
*/
private static void drawWatermarkLines(Graphics2D g2d, List<List<String>> allWrappedLines,
Point startPoint, int lineHeight,
String position, int imgWidth) {
int currentY = startPoint.y;
FontMetrics fm = g2d.getFontMetrics();
for (List<String> lines : allWrappedLines) {
for (String line : lines) {
int lineWidth = fm.stringWidth(line);
int x = startPoint.x;
// 如果是居中位置每行单独计算x坐标
if ("center".equalsIgnoreCase(position)) {
x = (imgWidth - lineWidth) / 2;
}
g2d.drawString(line, x, currentY);
currentY += lineHeight;
}
// 段落间距多行组之间的额外间距
currentY += lineHeight / 8;
}
}
/**
* 高质量保存JPG图片无损或接近无损
*/
private static void saveWithHighQuality(BufferedImage image, String filePath) throws Exception {
String formatName = filePath.substring(filePath.lastIndexOf(".") + 1).toLowerCase();
if ("jpg".equals(formatName) || "jpeg".equals(formatName)) {
// JPG特殊处理以保证高质量
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next();
// 配置JPEG编码参数
JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) writer.getDefaultWriteParam();
jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(DEFAULT_QUALITY); // 1.0 = 最高质量
// 写入文件
try (FileImageOutputStream output = new FileImageOutputStream(new File(filePath))) {
writer.setOutput(output);
writer.write(null, new IIOImage(image, null, null), jpegParams);
}
writer.dispose();
} else {
// 其他格式直接保存
ImageIO.write(image, formatName, new File(filePath));
}
}
public static void main(String[] args) {
try {
// 准备多行水印文本
List<String> watermarkLines = new ArrayList<>();
watermarkLines.add("2024-05-12");
String proName = "广东电网直流背靠背东莞工程大湾区南粤直流背靠背工程南粤±300kV背靠背换流站工程/新增/广东电网直流背靠背东莞工程大湾区南通道直流背靠背工程110kV环保城输变电工程电缆部分";
watermarkLines.add(proName.replaceAll("(.{18})", "$1@@"));
watermarkLines.add("安全违章");
watermarkLines.add("违章照片");
String localPath = "C:\\Users\\10488\\Desktop\\3.jpg";
String outPath = "C:\\Users\\10488\\Desktop\\output.jpg";
// 添加高质量水印
addHighQualityWatermark(localPath, outPath,
watermarkLines, "bottom-left",
0.7f, "Microsoft YaHei");
System.out.println("高质量水印添加完成,图片已无损输出");
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -182,5 +182,9 @@ public class Constants
public static final Integer TYPE4 = 4;
public static final Integer TRY_COUNT_NUM = 10;
/**角色级别*/
public static final String ROLE_LEVEL = "0";
}

View File

@ -3,18 +3,53 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bonus.imgTool.backstage.dao.SynthesisQueryDao">
<!--综合查询-照片综合查询-照片数量-->
<select id="getImgNum" resultType="com.bonus.imgTool.backstage.entity.SynthesisNumVo">
SELECT COUNT(1) AS totalNum,
COUNT(IF(tcq.upload_type = '1', 1, NULL)) AS safetyVioNum,
COUNT(IF(tcq.upload_type = '2', 1, NULL)) AS qualityInsNum,
COUNT(IF(tcq.upload_type = '3', 1, NULL)) AS safetyMeasNum,
COUNT(IF(tcq.upload_type = '4', 1, NULL)) AS coordinatedPhotoNum,
COUNT(IF(tcq.upload_type = '5', 1, NULL)) AS importIssuesAndPublicityNum
FROM tb_comprehensive_query tcq
LEFT JOIN sys_file_resource sfr ON tcq.id = sfr.source_id AND tcq.upload_type = sfr.upload_type AND sfr.is_active = '1'
WHERE tcq.is_active = '1'
<if test="roleLevel = 0 and proIds != null and proIds.size() > 0">
AND tcq.pro_id IN
<foreach collection="proIds" item="proId" open="(" separator="," close=")">
#{proId}
</foreach>
</if>
GROUP BY tcq.upload_type
</select>
<!--照片综合查询-->
<select id="getImgList" resultType="com.bonus.imgTool.backstage.entity.SynthesisQueryVo">
SELECT id,
'../../img/synthesisQuery/7.jpg' AS originalFilePath,
'../../img/synthesisQuery/7.jpg' AS compressFilePath,
'../../img/synthesisQuery/7.jpg' AS watermarkFilePath,
'1' AS uploadType,
'安全违章' AS uploadTypeName,
operate_time AS uploadTime,
'1' AS sourceType,
'违章照片' AS sourceTypeName,
'0' AS collectStatus
FROM sys_logs
SELECT sfr.id,
sfr.original_file_path AS originalFilePath,
sfr.original_file_path AS compressFilePath,
sfr.original_file_path AS watermarkFilePath,
sfr.upload_type AS uploadType,
CASE sfr.upload_type WHEN '1' THEN '安全违章' WHEN '2' THEN '质量检查' WHEN '3' THEN '安全措施落实'
WHEN '4' THEN '协调照片' WHEN '5' THEN '重要事项及宣传类' ELSE '' END AS uploadTypeName,
sfr.create_time AS uploadTime,
source_type AS sourceType,
sd2.dict_name AS sourceTypeName,
IF(tpc.file_resource_id IS NULL,'0','1') AS collectStatus
FROM tb_comprehensive_query tcq
LEFT JOIN sys_file_resource sfr ON tcq.id = sfr.source_id AND tcq.upload_type = sfr.upload_type AND sfr.is_active = '1'
LEFT JOIN tb_photo_collect tpc ON sfr.id = tpc.file_resource_id AND tpc.collect_user_id = #{userId}
LEFT JOIN sys_distinct sd ON sfr.source_type = sd.dict_value
LEFT JOIN sys_distinct sd2 ON sd.p_id = sd2.id
<where>
<if test="roleLevel = 0 and proIds != null and proIds.size() > 0">
AND tcq.pro_id IN
<foreach collection="proIds" item="proId" open="(" separator="," close=")">
#{proId}
</foreach>
</if>
AND tcq.is_active = '1' AND sd2.dict_value = 'file_source_type'
</where>
ORDER BY sfr.create_time DESC
</select>
</mapper>

View File

@ -73,14 +73,17 @@
</insert>
<!--登录查询用户-->
<select id="getUser" parameterType="String" resultType="com.bonus.imgTool.model.SysUser">
select t.id,t.user_name as username,t.login_name as loginName,t.phone,t.org_id as orgId,so.org_name as orgName,
select t.id,t.user_name as username,t.login_name as loginName,t.org_id as orgId,so.org_name as orgName,
t.password,t.state,t.role_id as roleId,t.login_type loginType,t.new_user newUser,
sr.role_code AS roleCode,sr.role_name AS roleName,t.team_id AS teamId
sr.role_code AS roleCode,sr.role_name AS roleName,t.team_id AS teamId,sr.level AS roleLevel,
GROUP_CONCAT(pro_id) AS proIds
from sys_user t
LEFT JOIN sys_role sr ON t.role_id = sr.role_id AND sr.del_flag = 0
left join sys_org so ON so.org_id = t.org_id and so.del_flag = 0
LEFT JOIN tb_pro_user tpu ON t.id = tpu.user_id
where t.login_name = #{username}
and t.del_flag = 0
GROUP BY t.id
</select>
<select id="getUserCode" parameterType="String" resultType="com.bonus.imgTool.model.SysUser">
@ -131,7 +134,6 @@
t.org_id as orgId,
so.org_name as orgName,
sr.role_name roleName,
t.phone AS phone,
t.team_id as teamId,
CASE
t.user_type
@ -142,6 +144,7 @@
END userType,
t.state AS state,
t.del_flag AS delFlag,
t.create_time AS createTime,
t.sign_img as signImg
FROM
sys_user t
@ -175,8 +178,6 @@
login_name as loginName,
sex,
user_code as userCode,
phone,
email,
org_id as orgId,
user_type as userType,
type,
@ -214,7 +215,12 @@
</select>
<select id="getRoleAll" resultType="com.bonus.imgTool.model.Role">
select t.role_id as id,
t.role_name as name
t.role_name as name,
t.level,
case when t.level = 0 then '项目部级'
when t.level = 1 then '公司级'
else ''
end as levelName
from sys_role t
where t.del_flag = 0
and t.state = 1

View File

@ -11,6 +11,7 @@ layui.config({
flow = layui.flow;
layer = layui.layer;
rightPopup = layui.rightPopup;
initImgNum();
dataFlow();
});

View File

@ -0,0 +1,27 @@
// 获取图片数量
function initImgNum() {
let url = dataUrl + "/backstage/synthesisQuery/getImgNum"
let obj = {}
let params = {
encryptedData: encryptCBC(JSON.stringify(obj))
}
ajaxRequest(url, "POST", params, true, function () {
}, function (result) {
if (result.status === 200) {
setImgNum(result.data);
} else {
layer.msg(result.msg, {icon: 2})
}
}, function (xhr) {
error(xhr)
});
function setImgNum(obj){
$('#totalNum').html(obj.totalNum);
$('#safetyVioNum').html(obj.safetyVioNum);
$('#qualityInsNum').html(obj.qualityInsNum);
$('#safetyMeasNum').html(obj.safetyMeasNum);
$('#coordinatedPhotoNum').html(obj.coordinatedPhotoNum);
$('#importIssuesAndPublicityNum').html(obj.importIssuesAndPublicityNum);
}
}

View File

@ -4,8 +4,10 @@ let background, web, mobile, wx;
let data = [], appResList = [];
// 角色下拉选
let roleList;
let projectList;
let orgData;
let teamList;
function setParams(params) {
console.log(params)
idParam = JSON.parse(params).id;
@ -20,38 +22,50 @@ function setParams(params) {
dtree = layui.dtree;
var $ = layui.jquery;
roleList = getRoleSelected();
teamList = getTeamSelected();
orgData = getOrgTree();
projectList = getProSelected();
// teamList = getTeamSelected();
// orgData = getOrgTree();
console.log(idParam + "idParam")
if (idParam) {
getUserById();
}
// form.render();
form.render("checkbox","select");//重新渲染页面checkbox控件
form.render("checkbox", "select");//重新渲染页面checkbox控件
form.on('submit(formData)', function (data) {
data.field.id = $('#id').val();
console.log( data.field.orgId_select_nodeId);
if(!data.field.orgId_select_nodeId){
return layer.alert("请选择组织机构!", {icon: 2})
}
let phone = $('#phone').val();
if(phone){
if (!(/^1[3456789]\d{9}$/.test(phone))) {
/* console.log( data.field.orgId_select_nodeId);
if(!data.field.orgId_select_nodeId){
return layer.alert("请选择组织机构!", {icon: 2})
}*/
let loginName = $('#loginName').val();
if (loginName) {
if (!(/^1[3456789]\d{9}$/.test(loginName))) {
return layer.alert("请输入正确的手机号", {icon: 2})
}
}
if (!validatePassword(data.field.password)){
if (!validatePassword(data.field.password)) {
return layer.alert("密码必须包含大、小写字母 、数字、 特殊字符四种里至少三种且密码长度不低于8位", {icon: 2})
}
saveData(data);
});
// 监听角色下拉框的 change 事件
form.on('select(roleId)', function (data) {
const roleName = $('#roleId option:selected').text();
if (roleName.includes('项目部级')) {
$('#projectDiv').removeClass('layui-hide'); // 显示 div
} else {
$('#projectDiv').addClass('layui-hide'); // 隐藏 div
}
});
});
var a = 0;
$(".secreteyesk1").hide();
$(".secreteyesk2").hide();
$('.eyes1').click(function() {
$('.eyes1').click(function () {
a += 1;
if (a % 2 == 0) {
$('.secreteyesk1').hide();
@ -70,7 +84,7 @@ function setParams(params) {
* 校验密码
*/
function validatePassword(password) {
console.log("password:",password)
console.log("password:", password)
// 定义正则表达式来检测不同的字符类型
const hasUpperCase = /[A-Z]/.test(password);
const hasLowerCase = /[a-z]/.test(password);
@ -82,7 +96,7 @@ function validatePassword(password) {
// 计算符合要求的字符类型数量
const typesCount = [hasUpperCase, hasLowerCase, hasDigit, hasSpecialChar].filter(Boolean).length;
console.log("typesCount:",typesCount)
console.log("typesCount:", typesCount)
// 验证密码:长度合法且包含至少三种字符类型
return isLengthValid && typesCount >= 3;
@ -105,10 +119,28 @@ function getRoleSelected() {
});
}
/**
* 获取工程数据
*/
function getProSelected() {
let url = dataUrl + '/users/getRoleAll';
ajaxRequest(url, "POST", null, true, function () {
}, function (result) {
if (result.code === 200) {
setSelectValue(result.data, 'project');
} else {
layer.alert(result.msg, {icon: 2})
}
}, function (xhr) {
error(xhr)
});
}
/**
* 获取班组数据
*/
function getTeamSelected() {
/*function getTeamSelected() {
let url = dataUrl + '/testReport/getTeamSelected';
ajaxRequest(url, "POST", null, true, function () {
}, function (result) {
@ -120,26 +152,37 @@ function getTeamSelected() {
}, function (xhr) {
error(xhr)
});
}*/
function setSelectValue(list, selectName) {
let html = '<option value="" selected>请选择</option>';
$.each(list, function (index, item) {
html += '<option value="' + item.id + '">' + item.name + '(' + item.levelName + ')' + '</option>';
})
$('#' + selectName).empty().append(html);
layui.form.render();
}
function setOrgTree(data){
orgTree = dtree.renderSelect({
elem: "#orgId",
data: data,
dataFormat: "list",
skin: "laySimple",
line: true, // 显示树线
checkbar: false, //开启复选框
done: function (data, url, first) {
console.log($('#orgId').val())
if(first) {
var params = dtree.dataInit("orgId", $('#orgId').val());
var selectParam = dtree.selectVal("orgId");
console.log(params)
}
}
});
}
function getOrgTree() {
// function setOrgTree(data){
// orgTree = dtree.renderSelect({
// elem: "#orgId",
// data: data,
// dataFormat: "list",
// skin: "laySimple",
// line: true, // 显示树线
// checkbar: false, //开启复选框
// done: function (data, url, first) {
// console.log($('#orgId').val())
// if(first) {
// var params = dtree.dataInit("orgId", $('#orgId').val());
// var selectParam = dtree.selectVal("orgId");
// console.log(params)
// }
// }
// });
// }
/*function getOrgTree() {
let data = [];
let url = dataUrl + '/users/getOrg';
ajaxRequest(url, "POST", null, true, function () {
@ -155,7 +198,8 @@ function getOrgTree() {
error(xhr)
});
return data;
}
}*/
// 根据id获取用户信息
function getUserById() {
let loadingMsg = layer.msg("数据加载中,请稍候...", {icon: 16, scrollbar: false, time: 0,});
@ -164,14 +208,13 @@ function getUserById() {
id: idParam
}
console.log(params)
params={
encryptedData:encryptCBC(JSON.stringify(params))
params = {
encryptedData: encryptCBC(JSON.stringify(params))
}
ajaxRequest(url, "POST", params, true, function () {
}, function (result) {
layer.close(loadingMsg); // 关闭提示层
if (result.code === 200) {
console.log(result)
setFormData(result.data);
} else if (result.code === 500) {
layer.alert(result.msg, {icon: 2})
@ -184,15 +227,14 @@ function getUserById() {
// 设置表单内容
function setFormData(data) {
console.log("data:",data)
console.log("data:", data)
if (data) {
$("#password").removeAttr("lay-verify");
$("#pwd").css("display","none");
$("#pwd").css("display", "none");
$('#id').val(data.id)
// $('#userCode').val(data.userCode)
$('#username').val(data.username)
$('#loginName').val(data.loginName)
$('#phone').val(data.phone)
// 设置选中状态
if (data.sex === 1) {
@ -201,33 +243,34 @@ function setFormData(data) {
document.getElementById('sex_0').checked = true;
}
if (data.userType === '1') {
document.getElementById('userType_1').checked = true;
} else if (data.userType === '0') {
document.getElementById('userType_0').checked = true;
}
/* if (data.userType === '1') {
document.getElementById('userType_1').checked = true;
} else if (data.userType === '0') {
document.getElementById('userType_0').checked = true;
}*/
if (data.state === 1) {
document.getElementById('state_1').checked = true;
} else if (data.state === 0) {
document.getElementById('state_0').checked = true;
}
$('#type_'+data.type).attr('checked', true)
$('#type_' + data.type).attr('checked', true)
$('#orgId').val(data.orgId)
$('#roleId').val(data.roleId)
$('#roleId option[value=' + data.roleId + ']').attr('selected', true)
$('#teamId').val(data.teamId)
$('#teamId option[value=' + data.teamId + ']').attr('selected', true)
var arrCB = data.loginTypes;
for (var j = 0; j < arrCB.length; j++) {
var cbthis = $("input[name='loginType']");
for (var i = 0; i < cbthis.length; i++) {
if (cbthis[i].value == arrCB[j]) {
cbthis[i].checked = true;
}
}
}
phoneParam = data.phone;
$('#project').val(data.roleId)
$('#project option[value=' + data.project + ']').attr('selected', true)
/*$('#teamId').val(data.teamId)
$('#teamId option[value=' + data.teamId + ']').attr('selected', true)*/
// var arrCB = data.loginTypes;
// for (var j = 0; j < arrCB.length; j++) {
// var cbthis = $("input[name='loginType']");
// for (var i = 0; i < cbthis.length; i++) {
// if (cbthis[i].value == arrCB[j]) {
// cbthis[i].checked = true;
// }
// }
// }
layui.form.render();
}
}
@ -245,15 +288,20 @@ function saveData(data) {
$('#cbGuDing input[type=checkbox]:checked').each(function () {
arr_box.push($(this).val());
});
console.log(arr_box)
params.loginType = arr_box.join()
params.orgId = params.orgId_select_nodeId;
if(params.id !=""){
var arr_pro = [];//固定复选框
$('#project input[type=checkbox]:checked').each(function () {
arr_pro.push($(this).val());
});
// params.loginType = arr_box.join()
params.project = arr_pro.join()
// params.orgId = params.orgId_select_nodeId;
if (params.id != "") {
url = dataUrl + "/users/update";
}
console.log(params)
params={
encryptedData:encryptCBC(JSON.stringify(params))
params = {
encryptedData: encryptCBC(JSON.stringify(params))
}
ajaxRequest(url, "POST", params, true, function () {
$('.save').addClass("layui-btn-disabled").attr("disabled", true);
@ -296,9 +344,11 @@ function isRepeat(paramName, phone) {
return data;
}
/*
function getPasswordConfig(callback) {
let url = dataUrl + "/users/getPasswordConfig"
ajaxRequest(url, "POST", null, true, function () {}, function (result) {
ajaxRequest(url, "POST", null, true, function () {
}, function (result) {
// layer.close(loadingMsg); // 关闭提示层
if (result.status === 200) {
callback(result.data);
@ -309,6 +359,7 @@ function getPasswordConfig(callback) {
error(xhr)
});
}
*/
// 关闭页面
function closePage(type) {

View File

@ -1,12 +1,12 @@
let form, layer, dtree, table, tableIns;
let pageNum = 1, limitSize = 10; // 默认第一页分页数量为10
let orgData,selectOrgId="";
let orgData, selectOrgId = "";
layui.config({
base: "../../js/layui-v2.6.8/dtree/", //此处路径请自行处理, 可以使用绝对路径
}).extend({
dtree: 'dtree'
}).use(['form', 'layer', 'table','dtree', 'laydate'], function () {
}).use(['form', 'layer', 'table', 'dtree', 'laydate'], function () {
form = layui.form;
layer = layui.layer;
table = layui.table;
@ -21,10 +21,11 @@ layui.config({
'id': this.value,
'state': obj.elem.checked ? 1 : 0
}
params={
encryptedData:encryptCBC(JSON.stringify(params))
params = {
encryptedData: encryptCBC(JSON.stringify(params))
}
ajaxRequest(url, "POST", params, true, function () {}, function (result) {
ajaxRequest(url, "POST", params, true, function () {
}, function (result) {
console.log(result)
reloadData();
if (result.status === 200) {
@ -90,15 +91,15 @@ function initTable(dataList, limit, page) {
cols: [
[
//表头
{title: "序号", width: 80, unresize: true, align: "center",
{
title: "序号", width: 80, unresize: true, align: "center",
templet: function (d) {
return (page - 1) * limit + d.LAY_INDEX;
}
},
{field: "loginName", title: "登录名", unresize: true, align: "center"},
{field: "username", title: "用户名", unresize: true, align: "center"},
// {field: "userCode", title: "工号", unresize: true, align: "center"},
{field: "sex", title: "性别", unresize: true, align: "center",
{field: "loginName", title: "登录账号", unresize: true, align: "center"},
{field: "username", title: "姓名", unresize: true, align: "center"},
/*{field: "sex", title: "", unresize: true, align: "center",
templet: function (d) {
if (d.sex == 0) {
return "女";
@ -106,21 +107,23 @@ function initTable(dataList, limit, page) {
return "男";
}
}
},
{field: "orgName", title: "单位部门", unresize: true, align: "center"},
},*/
// {field: "orgName", title: "单位部门", unresize: true, align: "center"},
{field: "roleName", title: "角色", unresize: true, align: "center"},
{field: "phone", title: "联系电话", unresize: true, align: "center"},
{field: "userType", title: "用户类型", unresize: true, align: "center"},
{field: "state", title: "启用状态", align: "center",templet: '#is-state'},
{title: "操作", unresize: true, width: 300, align: "center",
// {field: "phone", title: "联系电话", unresize: true, align: "center"},
{field: "userType", title: "用户级别", unresize: true, align: "center"},
{field: "state", title: "启用状态", align: "center", templet: '#is-state'},
{field: "createTime", title: "创建时间", unresize: true, align: "center"},
{
title: "操作", unresize: true, width: 300, align: "center",
templet: function (d) {
let html = '';
// let updaetpwd="<a class=\"layui-icon layui-icon-password\" style='cursor:pointer;' title='修改密码' onclick=\"resetPwd('" + d.id + "')\"></a>";
let del="<a class=\"layui-icon layui-icon-delete\" style='cursor:pointer;' title='删除' onclick=\"delData('" + d.id + "')\"></a>"
let edit="<a class=\"layui-icon layui-icon-edit\" style='cursor:pointer;' title='修改' onclick=\"addData('" + d.id + "')\"></a>";
html=edit+del;
if(d.delFlag==1){
let updaetpwd = "<a class=\"layui-icon layui-icon-password\" style='cursor:pointer;' title='重置密码' onclick=\"resetPwd('" + d.id + "')\"></a>";
let del = "<a class=\"layui-icon layui-icon-delete\" style='cursor:pointer;' title='删除' onclick=\"delData('" + d.id + "')\"></a>"
let edit = "<a class=\"layui-icon layui-icon-edit\" style='cursor:pointer;' title='修改' onclick=\"addData('" + d.id + "')\"></a>";
html = updaetpwd + edit + del;
if (d.delFlag == 1) {
return '';
}
return html;
@ -155,14 +158,14 @@ function getReqParams(page, limit, type) {
page: '1',
limit: '10',
userName: '',
phone:'',
orgId:'',
phone: '',
orgId: '',
userType: '',
};
}
console.log(obj)
obj={
encryptedData:encryptCBC(JSON.stringify(obj))
obj = {
encryptedData: encryptCBC(JSON.stringify(obj))
}
return obj;
}
@ -199,7 +202,7 @@ function reloadData() {
pages(pageNum, limitSize);
}
// 新增/修改平台用户
// 修改用户
function addData(id) {
let title = '新增用户'
if (id) {
@ -208,7 +211,7 @@ function addData(id) {
let param = {
'id': id
}
openIframe2("addOrEditUser", title, "child/userForm.html", '1000px', '625px', param);
openIframe2("addOrEditUser", title, "child/userFormTemp.html", '1000px', '625px', param);
}
function addDataTemp(id) {
@ -229,8 +232,8 @@ function delData(id) {
let params = {
'id': id
}
params={
encryptedData:encryptCBC(JSON.stringify(params))
params = {
encryptedData: encryptCBC(JSON.stringify(params))
}
ajaxRequest(url, "POST", params, true, function () {
}, function (result) {
@ -259,7 +262,7 @@ function editUserAccountStatus(id, status, type) {
ajaxRequest(url, "POST", params, true, function () {
}, function (result) {
if (result.code === 200) {
if(type){
if (type) {
reloadData();
}
parent.layer.msg(result.msg, {icon: 1})
@ -286,7 +289,7 @@ function getOrgTree() {
ajaxRequest(url, "POST", null, false, function () {
}, function (result) {
if (result.code === 200) {
console.log(result,"getOrgTree")
console.log(result, "getOrgTree")
data = result.data;
setOrgTree(data)
} else {
@ -298,25 +301,25 @@ function getOrgTree() {
return data;
}
function setOrgTree(data){
console.log("data",data)
var af=0,bf=0;
function setOrgTree(data) {
console.log("data", data)
var af = 0, bf = 0;
$.each(data, function (i, item) {
if(item.id==0){
item.id="99999";
item.parentId="0";
item.title="请选择组织机构";
af=1;
if (item.id == 0) {
item.id = "99999";
item.parentId = "0";
item.title = "请选择组织机构";
af = 1;
}
if(item.id==1){
item.parentId="99999";
bf=1;
if (item.id == 1) {
item.parentId = "99999";
bf = 1;
}
if(af==1&&bf==1){
if (af == 1 && bf == 1) {
return
}
})
orgTree =dtree.renderSelect({
orgTree = dtree.renderSelect({
elem: "#orgId",
width: "100%", // 指定树的宽度
dataFormat: "list",
@ -329,11 +332,11 @@ function setOrgTree(data){
}
});
dtree.on('node(orgId)', function (obj) {
console.log("obj.param.nodeId",obj.param.nodeId); // 打印选中节点的值
if(obj.param.nodeId=="99999"){
selectOrgId="";
}else{
selectOrgId=obj.param.nodeId;
console.log("obj.param.nodeId", obj.param.nodeId); // 打印选中节点的值
if (obj.param.nodeId == "99999") {
selectOrgId = "";
} else {
selectOrgId = obj.param.nodeId;
}
});
}

View File

@ -39,7 +39,7 @@
<div class="type-num layout" onclick="queryByType(this,0)">
<div class="layout">
<p>总照片数</p>
<p>1250</p>
<p id="totalNum">0</p>
</div>
<div class="layout">
<img src="../../img/synthesisQuery/1.png">
@ -48,7 +48,7 @@
<div class="type-num layout" onclick="queryByType(this,1)">
<div class="layout">
<p>安全违章</p>
<p>1250</p>
<p id="safetyVioNum">0</p>
</div>
<div class="layout">
<img src="../../img/synthesisQuery/2.png">
@ -57,7 +57,7 @@
<div class="type-num layout" onclick="queryByType(this,2)">
<div class="layout">
<p>质量检查</p>
<p>1250</p>
<p id="qualityInsNum">0</p>
</div>
<div class="layout">
<img src="../../img/synthesisQuery/3.png">
@ -66,7 +66,7 @@
<div class="type-num layout" onclick="queryByType(this,3)">
<div class="layout">
<p>安全措施落实</p>
<p>1250</p>
<p id="safetyMeasNum">0</p>
</div>
<div class="layout">
<img src="../../img/synthesisQuery/4.png">
@ -75,7 +75,7 @@
<div class="type-num layout" onclick="queryByType(this,4)">
<div class="layout">
<p>协调照片</p>
<p>1250</p>
<p id="coordinatedPhotoNum">0</p>
</div>
<div class="layout">
<img src="../../img/synthesisQuery/5.png">
@ -84,7 +84,7 @@
<div class="type-num layout" onclick="queryByType(this,5)">
<div class="layout">
<p>重要事项及宣传类</p>
<p>1250</p>
<p id="importIssuesAndPublicityNum">0</p>
</div>
<div class="layout">
<img src="../../img/synthesisQuery/6.png">
@ -98,21 +98,10 @@
</div>
<div id="img-box">
<div class="flow-demo layout" id="ID-flow-demo">
<!--<div class="img-info">
<div class="imgData layout">
<img src="../../img/synthesisQuery/7.jpg">
</div>
<div class="imgData2 layout">
<p>2024-05-05</p>
<p class="img-color1">安全违章</p>
</div>
<div class="imgData3 layout">
<p>违章照片</p>
</div>
</div>-->
</div>
</div>
</div>
</body>
<script src="../../js/synthesisQuery/synthesisQuery.js" charset="UTF-8" type="text/javascript"></script>
<script src="../../js/synthesisQuery/synthesisQueryAjax.js" charset="UTF-8" type="text/javascript"></script>
</html>

View File

@ -21,7 +21,7 @@
<input hidden id="id">
<div class="layui-form-item" style="margin-top: 2%;">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>登录</label>
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>登录账号</label>
<div class="layui-input-inline">
<input class="layui-input" id="loginName" name="loginName" autocomplete="off"
lay-verify="required" maxlength="20">
@ -29,7 +29,7 @@
</div>
<div class="layui-form-item" style="margin-top: 2%;">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>用户</label>
<label class="layui-form-label"><i style="padding: 0 10px;">*</i></label>
<div class="layui-input-inline">
<input class="layui-input" id="username" name="username" autocomplete="off"
lay-verify="required" maxlength="10">
@ -44,12 +44,12 @@
</div>
</div>
<div class="layui-form-item">
<!-- <div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>单位部门</label>
<div class="layui-input-inline">
<ul id="orgId" class="dtree" data-id="0"></ul>
</div>
</div>
</div>-->
<div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>角色</label>
@ -59,7 +59,15 @@
</div>
</div>
<div class="layui-form-item">
<div class="layui-form-item layui-hide" id="projectDiv">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>管理的工程</label>
<div class="layui-input-inline">
<select id="project" lay-verify="required" name="project" class="form-control input-sm">
</select>
</div>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label">班组</label>
<div class="layui-input-inline">
<select id="teamId" name="teamId" class="form-control input-sm">
@ -73,10 +81,10 @@
<input class="layui-input" autocomplete="off"
lay-verify="isRepeat |required" maxlength="11" id="phone" name="phone">
</div>
</div>
</div>-->
<div class="layui-form-item">
<!-- <div class="layui-form-item">
<label class="layui-form-label"> <i style="padding: 0 10px;">*</i> 用户类型:</label>
<div class="layui-input-block" >
<input type="radio" id="userType_1" name="userType" value="1" title="外部用户" checked>
@ -90,9 +98,9 @@
<input type="radio" id="state_1" name="state" value="1" title="启用" checked>
<input type="radio" id="state_0" name="state" value="0" title="关闭">
</div>
</div>
</div>-->
<div class="layui-form-item">
<!-- <div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>登录权限</label>
<div class="layui-input-inline" id="cbGuDing" >
<input type="checkbox" name="loginType" value="1" title="后台" lay-skin="primary" checked>
@ -100,7 +108,7 @@
<input type="checkbox" name="loginType" value="3" title="app" lay-skin="primary">
<input type="hidden" id="loginType" />
</div>
</div>
</div>-->
<div class="layui-form-item" style="margin-top: 2%;" id="pwd">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>密码</label>

View File

@ -21,15 +21,16 @@
<input hidden id="id">
<div class="layui-form-item" style="margin-top: 2%;">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>登录</label>
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>登录账号</label>
<div class="layui-input-inline">
<input class="layui-input" id="loginName" name="loginName" autocomplete="off"
placeholder="请输入11位手机号"
lay-verify="required" maxlength="20">
</div>
</div>
<div class="layui-form-item" style="margin-top: 2%;">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>用户</label>
<label class="layui-form-label"><i style="padding: 0 10px;">*</i></label>
<div class="layui-input-inline">
<input class="layui-input" id="username" name="username" autocomplete="off"
lay-verify="required" maxlength="10">
@ -38,69 +39,80 @@
<div class="layui-form-item">
<label class="layui-form-label"> <i style="padding: 0 10px;">*</i> 性别</label>
<div class="layui-input-block" >
<input type="radio" id="sex_1" name="sex" value="1" title="男" checked>
<input type="radio" id="sex_0" name="sex" value="0" title="女">
<div class="layui-input-block">
<input type="radio" id="sex_1" name="sex" value="1" title="男" checked>
<input type="radio" id="sex_0" name="sex" value="0" title="女">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>单位部门</label>
<div class="layui-input-inline">
<ul id="orgId" class="dtree" data-id="0"></ul>
</div>
</div>
<!-- <div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>单位部门</label>
<div class="layui-input-inline">
<ul id="orgId" class="dtree" data-id="0"></ul>
</div>
</div>-->
<div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>角色</label>
<div class="layui-input-inline">
<select id="roleId" lay-verify="required" name="roleId" class="form-control input-sm">
<select id="roleId" lay-verify="required" name="roleId" lay-filter="roleId"
class="form-control input-sm">
</select>
</div>
</div>
<!-- <div class="layui-form-item" style="margin-top: 2%;">-->
<!-- <label class="layui-form-label"><i style="padding: 0 10px;">*</i>工号</label>-->
<!-- <div class="layui-input-inline">-->
<!-- <input class="layui-input" id="userCode" name="userCode" autocomplete="off"-->
<!-- lay-verify="required" maxlength="20">-->
<!-- </div>-->
<!-- </div>-->
<div class="layui-form-item">
<label class="layui-form-label">班组</label>
<div class="layui-form-item layui-hide" id="projectDiv">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>管理的工程</label>
<div class="layui-input-inline">
<select id="teamId" name="teamId" class="form-control input-sm">
<select id="project" lay-verify="required" name="project" class="form-control input-sm">
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>联系电话</label>
<div class="layui-input-inline">
<input class="layui-input" autocomplete="off"
lay-verify="isRepeat |required" maxlength="11" id="phone" name="phone">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"> <i style="padding: 0 10px;">*</i> 用户类型:</label>
<div class="layui-input-block" >
<input type="radio" id="userType_1" name="userType" value="1" title="外部用户" checked>
<input type="radio" id="userType_0" name="userType" value="0" title="内部用户">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"> <i style="padding: 0 10px;">*</i> 是否启用:</label>
<div class="layui-input-block" >
<input type="radio" id="state_1" name="state" value="1" title="启用" checked>
<input type="radio" id="state_0" name="state" value="0" title="关闭">
</div>
</div>
<!-- <div class="layui-form-item" style="margin-top: 2%;">-->
<!-- <label class="layui-form-label"><i style="padding: 0 10px;">*</i>工号</label>-->
<!-- <div class="layui-input-inline">-->
<!-- <input class="layui-input" id="userCode" name="userCode" autocomplete="off"-->
<!-- lay-verify="required" maxlength="20">-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="layui-form-item">
<label class="layui-form-label">班组</label>
<div class="layui-input-inline">
<select id="teamId" name="teamId" class="form-control input-sm">
</select>
</div>
</div>
-->
<!--
<div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>联系电话</label>
<div class="layui-input-inline">
<input class="layui-input" autocomplete="off"
lay-verify="isRepeat |required" maxlength="11" id="phone" name="phone">
</div>
</div>
-->
<!-- <div class="layui-form-item">
<label class="layui-form-label"> <i style="padding: 0 10px;">*</i> 用户类型:</label>
<div class="layui-input-block" >
<input type="radio" id="userType_1" name="userType" value="1" title="外部用户" checked>
<input type="radio" id="userType_0" name="userType" value="0" title="内部用户">
</div>
</div>-->
<!-- <div class="layui-form-item">
<label class="layui-form-label"> <i style="padding: 0 10px;">*</i> 是否启用:</label>
<div class="layui-input-block" >
<input type="radio" id="state_1" name="state" value="1" title="启用" checked>
<input type="radio" id="state_0" name="state" value="0" title="关闭">
</div>
</div>-->
<!-- <div class="layui-form-item">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>登录权限</label>
<div class="layui-input-inline" id="cbGuDing" >
<input type="checkbox" name="loginType" value="1" title="后台" lay-skin="primary" checked>
@ -108,15 +120,15 @@
<input type="checkbox" name="loginType" value="3" title="app" lay-skin="primary">
<input type="hidden" id="loginType" />
</div>
</div>
</div>-->
<div class="layui-form-item" style="margin-top: 2%;" id="pwd">
<label class="layui-form-label"><i style="padding: 0 10px;">*</i>密码</label>
<div class="layui-input-inline password" >
<input class="layui-input secret1" type="password" id="password" name="password" autocomplete="off"
<div class="layui-input-inline password">
<input class="layui-input secret1" type="password" id="password" name="password" autocomplete="off"
lay-verify="required" maxlength="15">
<span class="eyes1">
<img class="secreteyes1 fa" src="../../../img/by.gif"> <!-- 闭眼 -->
<img class="secreteyes1 fa" src="../../../img/by.gif"> <!-- 闭眼 -->
<img class="secreteyesk1 none fa" src="../../../img/ky.gif">
</span>

View File

@ -22,11 +22,11 @@
<div class="layui-form-item">
<div class="layui-inline" style="padding: 0 0 0 10px;">
<div class="layui-input-inline">
<input type="text" id="userName" maxlength="30" class="layui-input" autocomplete="off" placeholder="请输入用户名">
<input type="text" id="keyWord" maxlength="30" class="layui-input" autocomplete="off" placeholder="请输入关键字">
</div>
</div>
<div class="layui-inline" style="padding: 0 0 0 10px;">
<!-- <div class="layui-inline" style="padding: 0 0 0 10px;">
<div class="layui-input-inline">
<input type="text" id="phone" maxlength="30" class="layui-input" autocomplete="off" placeholder="请输入电话号码">
</div>
@ -45,13 +45,13 @@
<option value="1"> 外部用户</option>
</select>
</div>
</div>
</div>-->
<div class="layui-inline btns">
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm btn-1" onclick="query(1)">查询
</button>
<!-- <button type="button" class="layui-btn layui-btn-normal layui-btn-sm btn-1" onclick="reset()">重置-->
<!-- </button>-->
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm btn-1" onclick="reset()">重置
</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-sm btn-2"
onclick="addDataTemp(null)">
<div class="layout" style="justify-content: space-around;"><img