jiapeng 6 years ago
commit
c01132f8fc

+ 4 - 0
.gitignore

@ -0,0 +1,4 @@
1
/.settings/
2
/.classpath
3
/.project
4
/target/

+ 80 - 0
pom.xml

@ -0,0 +1,80 @@
1
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
	<modelVersion>4.0.0</modelVersion>
4
	<groupId>com.ekexiu.project</groupId>
5
	<artifactId>bridge</artifactId>
6
	<version>0.0.1</version>
7
	<packaging>war</packaging>
8
	<properties>
9
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
10
		<maven.compiler.source>1.7</maven.compiler.source>
11
		<maven.compiler.target>1.7</maven.compiler.target>
12
		<maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
13
		<maven.tomcat.path>/</maven.tomcat.path>
14
	</properties>
15
	<dependencies>
16
		<dependency>
17
			<groupId>org.postgresql</groupId>
18
			<artifactId>postgresql</artifactId>
19
			<version>9.4.1207.jre7</version>
20
		</dependency>
21
		<dependency>
22
			<groupId>org.jfw</groupId>
23
			<artifactId>jfwApt</artifactId>
24
			<version>0.0.2-SNAPSHOT</version>
25
			<optional>true</optional>
26
		</dependency>
27
		<dependency>
28
			<groupId>org.jfw</groupId>
29
			<artifactId>jfwAptOrm</artifactId>
30
			<version>0.0.2-SNAPSHOT</version>
31
			<optional>true</optional>
32
		</dependency>
33
		<dependency>
34
			<groupId>org.jfw</groupId>
35
			<artifactId>jfwAptWeb</artifactId>
36
			<version>0.0.2-SNAPSHOT</version>
37
			<optional>true</optional>
38
		</dependency>
39
		<dependency>
40
			<groupId>org.jfw</groupId>
41
			<artifactId>jfwUtil</artifactId>
42
			<version>0.0.2-SNAPSHOT</version>
43
		</dependency>
44
		<dependency>
45
			<groupId>org.jfw</groupId>
46
			<artifactId>jfwWebUtil</artifactId>
47
			<version>0.0.2-SNAPSHOT</version>
48
		</dependency>
49
		<dependency>
50
			<groupId>javax.servlet</groupId>
51
			<artifactId>servlet-api</artifactId>
52
			<scope>provided</scope>
53
			<version>2.5</version>
54
		</dependency>
55
		<dependency>
56
			<groupId>com.alibaba</groupId>
57
			<artifactId>druid</artifactId>
58
			<version>1.0.20</version>
59
		</dependency>
60
		<dependency>
61
			<groupId>javax.mail</groupId>
62
			<artifactId>mail</artifactId>
63
			<version>1.4</version>
64
		</dependency>
65
	</dependencies>
66
	<build>
67
		<plugins>
68
			<plugin>
69
				<groupId>org.mortbay.jetty</groupId>
70
				<artifactId>jetty-maven-plugin</artifactId>
71
				<version>8.1.0.RC5</version>
72
				<configuration>
73
					<stopPort>9966</stopPort>
74
					<stopKey>foo</stopKey>
75
				</configuration>
76
			</plugin>
77
		</plugins>
78
		<finalName>bridge</finalName>
79
	</build>
80
</project>

+ 28 - 0
src/main/java/com/ekexiu/project/bridge/base/po/BaseTable.java

@ -0,0 +1,28 @@
1
package com.ekexiu.project.bridge.base.po;
2

3
import org.jfw.apt.annotation.JfwAptConfig;
4
import org.jfw.apt.orm.annotation.entry.Column;
5
import org.jfw.apt.orm.annotation.entry.VirtualTable;
6
import org.jfw.apt.orm.core.defaultImpl.FixLenStringHandler;
7
import org.jfw.apt.orm.core.enums.DE;
8

9
@JfwAptConfig("DB:PostgreSQL")
10
@VirtualTable
11
public interface BaseTable {
12
	@Column(descp="创建时间(YYYYMMDDHH24MISS)不可修改", handlerClass = FixLenStringHandler.class, dbType = "CHAR(14)", fixSqlValueWithInsert = "TO_CHAR(NOW(),'YYYYMMDDHH24MISS')", insertable = true, nullable = false, queryable = true, renewable = false)
13
	String getCreateTime();
14
	void setCreateTime(String createTime);
15

16
	@Column(descp="最后修改时间(YYYYMMDDHH24MISS),初始值:20000101010101", handlerClass = FixLenStringHandler.class, dbType = "CHAR(14)", fixSqlValueWithInsert = "'20000101010101'", fixSqlValueWithUpdate = "TO_CHAR(NOW(),'YYYYMMDDHH24MISS')", insertable = true, nullable = false, queryable = true, renewable = true)
17
	String getModifyTime();
18
	void setModifyTime(String modifyTime);
19

20
	@Column(descp="创建人ID",value= DE.id_32)
21
	String getCreator();
22
	void setCreator(String creator);
23
	
24
	@Column(descp="最后修改人ID",value=DE.refid_32)
25
	String getModifier();
26
	void setModifier(String modifier);
27
	
28
}

+ 161 - 0
src/main/java/com/ekexiu/project/bridge/resource/po/Bridge.java

@ -0,0 +1,161 @@
1
package com.ekexiu.project.bridge.resource.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.Table;
5
import org.jfw.apt.orm.core.enums.DE;
6

7
import com.ekexiu.project.bridge.base.po.BaseTable;
8

9
@Table(descp="桥梁信息")
10
public class Bridge  implements BaseTable{
11
	private String createTime;
12
	private String modifyTime;
13
	private String creator;
14
	private String modifier;
15
	
16
	
17
	private String code;
18
	private String shortName;
19
	private String name;
20
	private String addrCode;
21
	private String serviceDay;
22
	private String location;
23
	private String descp;
24
	private String remark;
25
	private String img;
26
	private String org;
27
	private String phone;
28
	private String email;
29
	
30
	private boolean active;
31
	
32
	
33
	
34
	
35
	
36
	
37
	
38
	
39
	
40
	
41
	@Column(descp="是否可用",value=DE.boolean_de)	
42
	public boolean isActive() {
43
		return active;
44
	}
45
	public void setActive(boolean active) {
46
		this.active = active;
47
	}
48
	@Column(descp="桥梁编号",value=DE.text_de)
49
	public String getCode() {
50
		return code;
51
	}
52
	public void setCode(String code) {
53
		this.code = code;
54
	}
55
	@Column(descp="桥梁简称",value=DE.text_de)
56
	public String getShortName() {
57
		return shortName;
58
	}
59
	public void setShortName(String shortName) {
60
		this.shortName = shortName;
61
	}
62
	@Column(descp="桥梁名称(全称)",value=DE.text_de)
63
	public String getName() {
64
		return name;
65
	}
66
	public void setName(String name) {
67
		this.name = name;
68
	}
69
	@Column(descp="桥梁政区划编码",value=DE.text_de)
70
	public String getAddrCode() {
71
		return addrCode;
72
	}
73
	public void setAddrCode(String addrCode) {
74
		this.addrCode = addrCode;
75
	}
76

77
	@Column(descp="桥梁开通日期(YYYYMMDD)",value=DE.text_de)
78
	public String getServiceDay() {
79
		return serviceDay;
80
	}
81
	public void setServiceDay(String serviceDay) {
82
		this.serviceDay = serviceDay;
83
	}
84
	@Column(descp="桥梁定位",value=DE.text_de)
85
	public String getLocation() {
86
		return location;
87
	}
88
	
89
	public void setLocation(String location) {
90
		this.location = location;
91
	}
92
	@Column(descp="桥梁详细描述",value=DE.Text_de)
93
	public String getDescp() {
94
		return descp;
95
	}
96
	public void setDescp(String descp) {
97
		this.descp = descp;
98
	}
99
	@Column(descp="桥梁备注",value=DE.Text_de)
100
	public String getRemark() {
101
		return remark;
102
	}
103
	public void setRemark(String remark) {
104
		this.remark = remark;
105
	}
106
	@Column(descp="",value=DE.text_de)
107
	public String getImg() {
108
		return img;
109
	}
110
	public void setImg(String img) {
111
		this.img = img;
112
	}
113
	@Column(descp="桥梁维护机构名称",value=DE.text_de)
114
	public String getOrg() {
115
		return org;
116
	}
117
	public void setOrg(String org) {
118
		this.org = org;
119
	}
120
	@Column(descp="桥梁维护机构电话",value=DE.text_de)
121
	public String getPhone() {
122
		return phone;
123
	}
124
	public void setPhone(String phone) {
125
		this.phone = phone;
126
	}
127
	@Column(descp="桥梁维护机构电邮",value=DE.text_de)
128
	public String getEmail() {
129
		return email;
130
	}
131
	public void setEmail(String email) {
132
		this.email = email;
133
	}
134
	public String getCreateTime() {
135
		return createTime;
136
	}
137
	public void setCreateTime(String createTime) {
138
		this.createTime = createTime;
139
	}
140
	public String getModifyTime() {
141
		return modifyTime;
142
	}
143
	public void setModifyTime(String modifyTime) {
144
		this.modifyTime = modifyTime;
145
	}
146
	public String getCreator() {
147
		return creator;
148
	}
149
	public void setCreator(String creator) {
150
		this.creator = creator;
151
	}
152
	public String getModifier() {
153
		return modifier;
154
	}
155
	public void setModifier(String modifier) {
156
		this.modifier = modifier;
157
	}
158
	
159
	
160
	
161
}

+ 101 - 0
src/main/java/com/ekexiu/project/bridge/resource/po/BridgeServer.java

@ -0,0 +1,101 @@
1
package com.ekexiu.project.bridge.resource.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.Table;
5
import org.jfw.apt.orm.core.enums.DE;
6

7
import com.ekexiu.project.bridge.base.po.BaseTable;
8

9
@Table(descp="采集服务器")
10
public class BridgeServer implements BaseTable {
11
	private String createTime;
12
	private String modifyTime;
13
	private String creator;
14
	private String modifier;
15
	
16
	private String code;
17
	private String bridgeCode;
18
	private String ip;
19
	private int devices;
20
	private String remark;
21
	private boolean active;
22
	
23
	
24
	
25
	
26
	
27
	@Column(descp="是否可用",value=DE.boolean_de)	
28
	public boolean isActive() {
29
		return active;
30
	}
31
	public void setActive(boolean active) {
32
		this.active = active;
33
	}
34
	@Column(descp="采集服务器编号",value=DE.text_de)
35
	public String getCode() {
36
		return code;
37
	}
38
	public void setCode(String code) {
39
		this.code = code;
40
	}
41
	@Column(descp="采集服务器所属桥梁编号",value=DE.text_de)
42
	public String getBridgeCode() {
43
		return bridgeCode;
44
	}
45
	public void setBridgeCode(String bridgeCode) {
46
		this.bridgeCode = bridgeCode;
47
	}
48
	@Column(descp="采集服务器IP",value=DE.text_de)
49
	public String getIp() {
50
		return ip;
51
	}
52
	public void setIp(String ip) {
53
		this.ip = ip;
54
	}
55
	@Column(descp="采集盒数量",value=DE.int_de)
56
	public int getDevices() {
57
		return devices;
58
	}
59
	public void setDevices(int devices) {
60
		this.devices = devices;
61
	}
62
	@Column(descp="备注",value=DE.Text_de)
63
	public String getRemark() {
64
		return remark;
65
	}
66
	public void setRemark(String remark) {
67
		this.remark = remark;
68
	}
69
	public String getCreateTime() {
70
		return createTime;
71
	}
72
	public void setCreateTime(String createTime) {
73
		this.createTime = createTime;
74
	}
75
	public String getModifyTime() {
76
		return modifyTime;
77
	}
78
	public void setModifyTime(String modifyTime) {
79
		this.modifyTime = modifyTime;
80
	}
81
	public String getCreator() {
82
		return creator;
83
	}
84
	public void setCreator(String creator) {
85
		this.creator = creator;
86
	}
87
	public String getModifier() {
88
		return modifier;
89
	}
90
	public void setModifier(String modifier) {
91
		this.modifier = modifier;
92
	}
93
	
94
	
95
	
96
	
97
	
98
	
99
	
100
	
101
}

+ 93 - 0
src/main/java/com/ekexiu/project/bridge/resource/po/CollectDevice.java

@ -0,0 +1,93 @@
1
package com.ekexiu.project.bridge.resource.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.Table;
5
import org.jfw.apt.orm.core.enums.DE;
6

7
import com.ekexiu.project.bridge.base.po.BaseTable;
8

9
@Table(descp="采集盒")
10
public class CollectDevice implements BaseTable {
11
	private String code;
12
	private String serverCode;
13
	private int	channels;
14
	private String remark;
15
	private boolean active;
16
	
17
	private String createTime;
18
	private String modifyTime;
19
	private String creator;
20
	private String modifier;
21
	
22
	
23
	
24
	
25
	
26
	
27
	
28
	@Column(descp="采集盒编号",value=DE.text_de)
29
	public String getCode() {
30
		return code;
31
	}
32
	public void setCode(String code) {
33
		this.code = code;
34
	}
35
	@Column(descp="采集盒所属服务器编号",value=DE.text_de)
36
	public String getServerCode() {
37
		return serverCode;
38
	}
39
	public void setServerCode(String serverCode) {
40
		this.serverCode = serverCode;
41
	}
42
	@Column(descp="采集盒信道数量",value=DE.int_de)
43
	public int getChannels() {
44
		return channels;
45
	}
46
	public void setChannels(int channels) {
47
		this.channels = channels;
48
	}
49
	@Column(descp="备注",value=DE.Text_de)
50
	public String getRemark() {
51
		return remark;
52
	}
53
	public void setRemark(String remark) {
54
		this.remark = remark;
55
	}
56
	@Column(descp="是否可用",value=DE.boolean_de)	
57
	public boolean isActive() {
58
		return active;
59
	}
60
	public void setActive(boolean active) {
61
		this.active = active;
62
	}
63
	
64

65
	public String getCreateTime() {
66
		return createTime;
67
	}
68
	public void setCreateTime(String createTime) {
69
		this.createTime = createTime;
70
	}
71
	public String getModifyTime() {
72
		return modifyTime;
73
	}
74
	public void setModifyTime(String modifyTime) {
75
		this.modifyTime = modifyTime;
76
	}
77
	public String getCreator() {
78
		return creator;
79
	}
80
	public void setCreator(String creator) {
81
		this.creator = creator;
82
	}
83
	public String getModifier() {
84
		return modifier;
85
	}
86
	public void setModifier(String modifier) {
87
		this.modifier = modifier;
88
	}
89
	
90
	
91
	
92
	
93
}

+ 91 - 0
src/main/java/com/ekexiu/project/bridge/resource/po/Transducer.java

@ -0,0 +1,91 @@
1
package com.ekexiu.project.bridge.resource.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.Table;
5
import org.jfw.apt.orm.core.enums.DE;
6

7
@Table(descp="传感器")
8
public class Transducer {
9
	private String code;
10
	private String deviceCode;
11
	private String cableType;
12
	private String locType;
13
	private String remark;
14
	private boolean active;
15
	
16
	private String createTime;
17
	private String modifyTime;
18
	private String creator;
19
	private String modifier;
20
	
21
	@Column(descp="采集盒编号",value=DE.text_de)
22
	public String getCode() {
23
		return code;
24
	}
25
	public void setCode(String code) {
26
		this.code = code;
27
	}
28
	@Column(descp="传感器编号",value=DE.text_de)
29
	public String getDeviceCode() {
30
		return deviceCode;
31
	}
32
	public void setDeviceCode(String deviceCode) {
33
		this.deviceCode = deviceCode;
34
	}
35
	@Column(descp="传感器所在主缆(dict)",value=DE.text_de)
36
	public String getCableType() {
37
		return cableType;
38
	}
39
	public void setCableType(String cableType) {
40
		this.cableType = cableType;
41
	}
42
	@Column(descp="传感器所在位置(dict)",value=DE.text_de)
43
	public String getLocType() {
44
		return locType;
45
	}
46
	public void setLocType(String locType) {
47
		this.locType = locType;
48
	}
49
	@Column(descp="备注",value=DE.Text_de)
50
	public String getRemark() {
51
		return remark;
52
	}
53
	public void setRemark(String remark) {
54
		this.remark = remark;
55
	}
56
	@Column(descp="是否可用",value=DE.boolean_de)	
57
	public boolean isActive() {
58
		return active;
59
	}
60
	public void setActive(boolean active) {
61
		this.active = active;
62
	}
63
	public String getCreateTime() {
64
		return createTime;
65
	}
66
	public void setCreateTime(String createTime) {
67
		this.createTime = createTime;
68
	}
69
	public String getModifyTime() {
70
		return modifyTime;
71
	}
72
	public void setModifyTime(String modifyTime) {
73
		this.modifyTime = modifyTime;
74
	}
75
	public String getCreator() {
76
		return creator;
77
	}
78
	public void setCreator(String creator) {
79
		this.creator = creator;
80
	}
81
	public String getModifier() {
82
		return modifier;
83
	}
84
	public void setModifier(String modifier) {
85
		this.modifier = modifier;
86
	}
87
	
88
	
89
	
90
	
91
}

+ 30 - 0
src/main/java/com/ekexiu/project/bridge/right/po/UserBridge.java

@ -0,0 +1,30 @@
1
package com.ekexiu.project.bridge.right.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.Table;
5
import org.jfw.apt.orm.core.enums.DE;
6

7
@Table(descp="用户桥梁")
8
public class UserBridge {
9

10
	private String uid;
11
	private String bcode;
12
	
13
	@Column(descp="用户ID",value= DE.rtext_de)
14
	public String getUid() {
15
		return uid;
16
	}
17

18
	public void setUid(String uid) {
19
		this.uid = uid;
20
	}
21
	@Column(descp="桥梁编号",value= DE.rtext_de)
22
	public String getBcode() {
23
		return bcode;
24
	}
25
	public void setBcode(String bcode) {
26
		this.bcode = bcode;
27
	}
28
	
29
	
30
}

+ 237 - 0
src/main/java/com/ekexiu/project/bridge/servlet/VerifyCodeServlet.java

@ -0,0 +1,237 @@
1
package com.ekexiu.project.bridge.servlet;
2

3
import java.awt.Color;
4
import java.awt.Font;
5
import java.awt.Graphics;
6
import java.awt.Graphics2D;
7
import java.awt.RenderingHints;
8
import java.awt.geom.AffineTransform;
9
import java.awt.image.BufferedImage;
10
import java.io.IOException;
11
import java.io.OutputStream;
12
import java.util.Arrays;
13
import java.util.Random;
14

15
import javax.imageio.ImageIO;
16
import javax.servlet.ServletException;
17
import javax.servlet.http.HttpServlet;
18
import javax.servlet.http.HttpServletRequest;
19
import javax.servlet.http.HttpServletResponse;
20
import javax.servlet.http.HttpSession;
21

22
public class VerifyCodeServlet extends HttpServlet {
23
	/**
24
	 * 
25
	 */
26
	private static final long serialVersionUID = -384069991394456296L;
27

28
	private static final String DEFAULT_VERIFY_FLAG = "PIC_COMM";
29
	private static final long DEFAULT_TIMEOUT = 1000 * 60;
30
	private static final int DEFAULT_VERIFY_LEN = 4;
31
	private static final int DEFAULT_IMG_WIDTH = 100;
32
	private static final int DEFAULT_IMG_HEIGHT = 40;
33

34
	// 使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符
35

36
	public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
37
	private static Random random = new Random();
38

39
	public static String generateVerifyCode(int verifySize, String sources) {
40
		if (sources == null || sources.length() == 0) {
41
			sources = VERIFY_CODES;
42
		}
43
		int codesLen = sources.length();
44
		Random rand = new Random(System.currentTimeMillis());
45
		StringBuilder verifyCode = new StringBuilder(verifySize);
46
		for (int i = 0; i < verifySize; i++) {
47
			verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));
48
		}
49
		return verifyCode.toString();
50
	}
51

52
	public static void outputImage(int w, int h, OutputStream os, String code) throws IOException {
53
		int verifySize = code.length();
54
		BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
55
		Random rand = new Random();
56
		Graphics2D g2 = image.createGraphics();
57
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
58
		Color[] colors = new Color[5];
59
		Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN, Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.YELLOW };
60
		float[] fractions = new float[colors.length];
61
		for (int i = 0; i < colors.length; i++) {
62
			colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
63
			fractions[i] = rand.nextFloat();
64
		}
65
		Arrays.sort(fractions);
66
		g2.setColor(Color.GRAY);// 设置边框色
67
		g2.fillRect(0, 0, w, h);
68
		Color c = getRandColor(200, 250);
69
		g2.setColor(c);// 设置背景色
70
		g2.fillRect(0, 2, w, h - 4);
71

72
		// 绘制干扰线
73
		Random random = new Random();
74
		g2.setColor(getRandColor(160, 200));// 设置线条的颜色
75
		for (int i = 0; i < 20; i++) {
76
			int x = random.nextInt(w - 1);
77
			int y = random.nextInt(h - 1);
78
			int xl = random.nextInt(6) + 1;
79
			int yl = random.nextInt(12) + 1;
80
			g2.drawLine(x, y, x + xl + 40, y + yl + 20);
81
		}
82

83
		// 添加噪点
84
		float yawpRate = 0.05f;// 噪声率
85
		int area = (int) (yawpRate * w * h);
86
		for (int i = 0; i < area; i++) {
87
			int x = random.nextInt(w);
88
			int y = random.nextInt(h);
89
			int rgb = getRandomIntColor();
90
			image.setRGB(x, y, rgb);
91
		}
92

93
		shear(g2, w, h, c);// 使图片扭曲
94

95
		g2.setColor(getRandColor(100, 160));
96
		int fontSize = h - 4;
97
		Font font = new Font("Algerian", Font.ITALIC, fontSize);
98
		g2.setFont(font);
99
		char[] chars = code.toCharArray();
100
		for (int i = 0; i < verifySize; i++) {
101
			AffineTransform affine = new AffineTransform();
102
			affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize / 2, h / 2);
103
			g2.setTransform(affine);
104
			g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);
105
		}
106

107
		g2.dispose();
108
		ImageIO.write(image, "jpg", os);
109
	}
110

111
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
112
		response.setHeader("Pragma", "No-cache");
113
		response.setHeader("Cache-Control", "no-cache");
114
		response.setDateHeader("Expires", 0);
115
		response.setContentType("image/jpeg");
116

117
		int width = 0, height = 0, len = 0;
118
		try {
119
			width = Integer.parseInt(request.getParameter("w"));
120
		} catch (Exception e) {
121
		}
122
		if (width < 30 || width > 500) {
123
			width = DEFAULT_IMG_WIDTH;
124
		}
125
		try {
126
			height = Integer.parseInt(request.getParameter("h"));
127
		} catch (Exception e) {
128
		}
129
		if (height < 10 || height > 300) {
130
			height = DEFAULT_IMG_HEIGHT;
131
		}
132
		try {
133
			len = Integer.parseInt(request.getParameter("l"));
134
		} catch (Exception e) {
135
		}
136
		if (width < 4 || width > 10) {
137
			width = DEFAULT_VERIFY_LEN;
138
		}
139
		String flag = request.getParameter("flag");
140
		if (flag == null || flag.length() == 0) {
141
			flag = DEFAULT_VERIFY_FLAG;
142
		}
143

144
		String vc = generateVerifyCode(len, VERIFY_CODES);
145
		outputImage(width, height, response.getOutputStream(), vc);
146

147
		HttpSession session = request.getSession();
148
		session.setAttribute(flag, vc);
149
		long timeout = 0;
150
		try {
151
			timeout = Long.parseLong(request.getParameter("__timeout"));
152
		} catch (Exception e) {
153
		}
154
		if (timeout < 10000 || (timeout > (60000 * 30))) {
155
			timeout = DEFAULT_TIMEOUT;
156
		}
157
		timeout += (5000 + System.currentTimeMillis());
158
		session.setAttribute("TIMEOUT_" + flag, timeout);
159

160
	}
161

162
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
163
		response.sendError(400);
164
	}
165

166
	private static Color getRandColor(int fc, int bc) {
167
		if (fc > 255)
168
			fc = 255;
169
		if (bc > 255)
170
			bc = 255;
171
		int r = fc + random.nextInt(bc - fc);
172
		int g = fc + random.nextInt(bc - fc);
173
		int b = fc + random.nextInt(bc - fc);
174
		return new Color(r, g, b);
175
	}
176

177
	private static int getRandomIntColor() {
178
		int[] rgb = getRandomRgb();
179
		int color = 0;
180
		for (int c : rgb) {
181
			color = color << 8;
182
			color = color | c;
183
		}
184
		return color;
185
	}
186

187
	private static int[] getRandomRgb() {
188
		int[] rgb = new int[3];
189
		for (int i = 0; i < 3; i++) {
190
			rgb[i] = random.nextInt(255);
191
		}
192
		return rgb;
193
	}
194

195
	private static void shear(Graphics g, int w1, int h1, Color color) {
196
		shearX(g, w1, h1, color);
197
		shearY(g, w1, h1, color);
198
	}
199

200
	private static void shearX(Graphics g, int w1, int h1, Color color) {
201

202
		int period = random.nextInt(2);
203

204
		boolean borderGap = true;
205
		int frames = 1;
206
		int phase = random.nextInt(2);
207

208
		for (int i = 0; i < h1; i++) {
209
			double d = (double) (period >> 1) * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
210
			g.copyArea(0, i, w1, 1, (int) d, 0);
211
			if (borderGap) {
212
				g.setColor(color);
213
				g.drawLine((int) d, i, 0, i);
214
				g.drawLine((int) d + w1, i, w1, i);
215
			}
216
		}
217

218
	}
219

220
	private static void shearY(Graphics g, int w1, int h1, Color color) {
221
		int period = random.nextInt(40) + 10; // 50;
222
		boolean borderGap = true;
223
		int frames = 20;
224
		int phase = 7;
225
		for (int i = 0; i < w1; i++) {
226
			double d = (double) (period >> 1) * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
227
			g.copyArea(i, 0, 1, h1, 0, (int) d);
228
			if (borderGap) {
229
				g.setColor(color);
230
				g.drawLine(i, (int) d, i, 0);
231
				g.drawLine(i, (int) d + h1, i, h1);
232
			}
233

234
		}
235

236
	}
237
}

+ 43 - 0
src/main/java/com/ekexiu/project/bridge/system/dao/DictDao.java

@ -0,0 +1,43 @@
1
package com.ekexiu.project.bridge.system.dao;
2

3
import java.sql.Connection;
4
import java.sql.SQLException;
5
import java.util.List;
6

7
import org.jfw.apt.annotation.Nullable;
8
import org.jfw.apt.orm.annotation.dao.DAO;
9
import org.jfw.apt.orm.annotation.dao.method.From;
10
import org.jfw.apt.orm.annotation.dao.method.IncludeFixSet;
11
import org.jfw.apt.orm.annotation.dao.method.SetSentence;
12
import org.jfw.apt.orm.annotation.dao.method.Where;
13
import org.jfw.apt.orm.annotation.dao.method.operator.Insert;
14
import org.jfw.apt.orm.annotation.dao.method.operator.SelectList;
15
import org.jfw.apt.orm.annotation.dao.method.operator.UpdateWith;
16
import org.jfw.apt.orm.annotation.dao.param.Set;
17

18
import com.ekexiu.project.bridge.system.po.DictItem;
19

20
@DAO
21
public interface DictDao {
22

23
	@SelectList
24
	List<DictItem> query(Connection con) throws SQLException;
25

26
	@Insert
27
	int insert(Connection con, DictItem dict) throws SQLException;
28

29
	@UpdateWith
30
	@From(DictItem.class)
31
	@Where("ACTIVE = '1' AND READONLY <> '1'")
32
	@SetSentence("ACTIVE='0'")
33
	@IncludeFixSet
34
	int disable(Connection con, String dictCode, String code) throws SQLException;
35

36
	
37
	@UpdateWith
38
	@From(DictItem.class)
39
	@Where("ACTIVE = '1' AND READONLY <> '1'")
40
	int update(Connection con, @Nullable @Set String bcode, @Set String caption, @Nullable @Set String fullCaption, @Set @Nullable String shortCut,
41
			@Nullable @Set String remark, String code, String dictCode) throws SQLException;
42

43
}

+ 88 - 0
src/main/java/com/ekexiu/project/bridge/system/po/DictItem.java

@ -0,0 +1,88 @@
1
package com.ekexiu.project.bridge.system.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.PrimaryKey;
5
import org.jfw.apt.orm.annotation.entry.Table;
6
import org.jfw.apt.orm.core.enums.DE;
7

8
@PrimaryKey({"dictCode","code"})
9
@Table(descp="数据字典表",value="SYS_DICT")
10
public class DictItem {
11
	private String code;
12
	private String dictCode;
13
	private String bcode;
14
	private String caption;
15
	private String fullCaption;
16
	private String shortCut;
17
	private String remark;
18
	private boolean readonly;
19
	private boolean active;
20
	
21
	@Column(descp="字典项编码",value= DE.rtext_de)
22
	public String getCode() {
23
		return code;
24
	}
25
	public void setCode(String code) {
26
		this.code = code;
27
	}
28
	
29
	@Column(descp="字典项编码(业务编码)",value= DE.Text_de)
30
	public String getBcode() {
31
		return bcode;
32
	}
33
	public void setBcode(String bcode) {
34
		this.bcode = bcode;
35
	}
36
	@Column(descp="字典编码",value= DE.rtext_de)
37
	public String getDictCode() {
38
		return dictCode;
39
	}
40
	public void setDictCode(String dictCode) {
41
		this.dictCode = dictCode;
42
	}
43
	@Column(descp="字典项显示",value= DE.text_de)
44
	public String getCaption() {
45
		return caption;
46
	}
47
	public void setCaption(String caption) {
48
		this.caption = caption;
49
	}
50
	@Column(descp="字典项显示(全)",value= DE.Text_de)
51
	public String getFullCaption() {
52
		return fullCaption;
53
	}
54
	public void setFullCaption(String fullCaption) {
55
		this.fullCaption = fullCaption;
56
	}
57
	@Column(descp="助记码",value= DE.Text_de)
58
	public String getShortCut() {
59
		return shortCut;
60
	}
61
	public void setShortCut(String shortCut) {
62
		this.shortCut = shortCut;
63
	}
64
	@Column(descp="备注",value= DE.Text_de)
65
	public String getRemark() {
66
		return remark;
67
	}
68
	public void setRemark(String remark) {
69
		this.remark = remark;
70
	}
71
	@Column(descp="是否只读",value= DE.boolean_de)
72
	public boolean isReadonly() {
73
		return readonly;
74
	}
75
	public void setReadonly(boolean readonly) {
76
		this.readonly = readonly;
77
	}
78
	@Column(descp="是否有效",value= DE.boolean_de)
79
	public boolean isActive() {
80
		return active;
81
	}
82
	public void setActive(boolean active) {
83
		this.active = active;
84
	}
85
	
86
	
87
	
88
}

+ 131 - 0
src/main/java/com/ekexiu/project/bridge/system/po/User.java

@ -0,0 +1,131 @@
1
package com.ekexiu.project.bridge.system.po;
2

3
import org.jfw.apt.orm.annotation.entry.Column;
4
import org.jfw.apt.orm.annotation.entry.PrimaryKey;
5
import org.jfw.apt.orm.annotation.entry.Table;
6
import org.jfw.apt.orm.annotation.entry.Unique;
7
import org.jfw.apt.orm.annotation.entry.Uniques;
8
import org.jfw.apt.orm.core.enums.DE;
9

10
import com.ekexiu.project.bridge.base.po.BaseTable;
11

12
@PrimaryKey("id")
13
@Uniques({@Unique(clolumns="account",name="UC_LUSER_ACCOUNT")})
14
@Table(descp="用户表",value="LUSER")
15
public class User implements BaseTable {
16
	private String createTime;
17
	private String modifyTime;
18
	private String creator;
19
	private String modifier;
20
	
21
	private String id;
22
	private String name;
23
	private String account;
24
	private String comp;
25
	private String job;
26
	private String phone;
27
	private String email;
28
	private String remark;
29
	private String passwd;
30
	
31
	private boolean active;
32
	
33
	
34
	@Column(descp="是否可用",value=DE.boolean_de)
35
	public boolean isActive() {
36
		return active;
37
	}
38
	public void setActive(boolean active) {
39
		this.active = active;
40
	}
41
	@Column(descp="密码(MD5)",value=DE.id_32)
42
	public String getPasswd() {
43
		return passwd;
44
	}
45
	public void setPasswd(String passwd) {
46
		this.passwd = passwd;
47
	}
48
	@Column(descp="用户ID",value =DE.id_32)
49
	public String getId() {
50
		return id;
51
	}
52
	public void setId(String id) {
53
		this.id = id;
54
	}
55
	@Column(descp="用户姓名",value =DE.text_de)
56
	public String getName() {
57
		return name;
58
	}
59
	public void setName(String name) {
60
		this.name = name;
61
	}
62
	@Column(descp="用户帐号",value=DE.text_de)
63
	public String getAccount() {
64
		return account;
65
	}
66
	public void setAccount(String account) {
67
		this.account = account;
68
	}
69
	@Column(descp="用户所属单位",value=DE.text_de)
70
	public String getComp() {
71
		return comp;
72
	}
73
	public void setComp(String comp) {
74
		this.comp = comp;
75
	}
76
	@Column(value=DE.text_de,descp="用户职位")
77
	public String getJob() {
78
		return job;
79
	}
80
	public void setJob(String job) {
81
		this.job = job;
82
	}
83
	@Column(descp="联系电话",value=DE.Text_de)
84
	public String getPhone() {
85
		return phone;
86
	}
87
	public void setPhone(String phone) {
88
		this.phone = phone;
89
	}
90
	@Column(descp="联系邮件",value=DE.Text_de)
91
	public String getEmail() {
92
		return email;
93
	}
94
	public void setEmail(String email) {
95
		this.email = email;
96
	}
97
	@Column(descp="备注",value=DE.Text_de)
98
	public String getRemark() {
99
		return remark;
100
	}
101
	public void setRemark(String remark) {
102
		this.remark = remark;
103
	}
104
	public String getCreateTime() {
105
		return createTime;
106
	}
107
	public void setCreateTime(String createTime) {
108
		this.createTime = createTime;
109
	}
110
	public String getModifyTime() {
111
		return modifyTime;
112
	}
113
	public void setModifyTime(String modifyTime) {
114
		this.modifyTime = modifyTime;
115
	}
116
	public String getCreator() {
117
		return creator;
118
	}
119
	public void setCreator(String creator) {
120
		this.creator = creator;
121
	}
122
	public String getModifier() {
123
		return modifier;
124
	}
125
	public void setModifier(String modifier) {
126
		this.modifier = modifier;
127
	}
128
	
129
	
130
	
131
}

+ 149 - 0
src/main/java/com/ekexiu/project/bridge/system/service/DictService.java

@ -0,0 +1,149 @@
1
package com.ekexiu.project.bridge.system.service;
2

3
import java.sql.Connection;
4
import java.sql.SQLException;
5
import java.util.Collections;
6
import java.util.HashMap;
7
import java.util.LinkedList;
8
import java.util.List;
9

10
import org.jfw.apt.annotation.Autowrie;
11
import org.jfw.apt.annotation.Nullable;
12
import org.jfw.apt.web.annotation.Path;
13
import org.jfw.apt.web.annotation.operate.Get;
14
import org.jfw.apt.web.annotation.operate.Post;
15
import org.jfw.apt.web.annotation.param.AfterCommit;
16
import org.jfw.apt.web.annotation.param.JdbcConn;
17

18
import com.ekexiu.project.bridge.system.dao.DictDao;
19
import com.ekexiu.project.bridge.system.po.DictItem;
20

21
@Path("/dict")
22
public class DictService {
23
	private static final HashMap<String, List<DictItem>> dictCache = new HashMap<String, List<DictItem>>();
24
	private static final List<DictItem> Empty_DICT = Collections.emptyList();
25

26
	@Autowrie
27
	private DictDao dictDao;
28

29
	public void load(Connection con) throws SQLException {
30
		List<DictItem> items = this.dictDao.query(con);
31
		for (DictItem item : items) {
32
			List<DictItem> list = dictCache.get(item.getDictCode());
33
			if (list == null) {
34
				list = new LinkedList<DictItem>();
35
				dictCache.put(item.getDictCode(), list);
36
			}
37
			list.add(item);
38
		}
39
	}
40

41
	@Path("/items")
42
	@Get
43
	public List<DictItem> query(String dict) {
44
		List<DictItem> ret = null;
45
		synchronized (dictCache) {
46
			ret = dictCache.get(dict);
47
		}
48
		return ret == null ? Empty_DICT : ret;
49
	}
50

51
	@Path("/delete")
52
	@Post
53
	public int delete(@JdbcConn(true) Connection con, final String dict, final String code, @AfterCommit List<Runnable> runs) throws SQLException {
54
		int num = this.dictDao.disable(con, dict, code);
55
		if (num > 0) {
56
			runs.add(new Runnable() {
57
				@Override
58
				public void run() {
59
					synchronized (dictCache) {
60
						List<DictItem> list = dictCache.get(dict);
61
						if (list != null) {
62
							List<DictItem> newlist = new LinkedList<DictItem>();
63
							for (DictItem item : list) {
64
								if (!item.getCode().equals(code)) {
65
									newlist.add(item);
66
								}
67
							}
68
							dictCache.put(dict, newlist);
69
						}
70
					}
71
				}
72
			});
73
		}
74
		return num;
75
	}
76

77
	@Post
78
	@Path("/add")
79
	public void insert(@JdbcConn(true) Connection con, String code, String dict, @Nullable String bcode, String caption, @Nullable String fullCaption,
80
			@Nullable String shortCut, @Nullable String remark, boolean readonly, @AfterCommit List<Runnable> runs) throws SQLException {
81
		final DictItem item = new DictItem();
82
		item.setActive(true);
83
		item.setBcode(bcode);
84
		item.setCaption(caption);
85
		item.setCode(code);
86
		item.setDictCode(dict);
87
		item.setFullCaption(fullCaption);
88
		item.setReadonly(readonly);
89
		item.setRemark(remark);
90
		item.setShortCut(shortCut);
91
		this.dictDao.insert(con, item);
92
		runs.add(new Runnable() {
93
			@Override
94
			public void run() {
95
				synchronized (dictCache) {
96
					List<DictItem> newlist = new LinkedList<DictItem>();
97
					List<DictItem> list = dictCache.get(item.getDictCode());
98
					if (list != null) {
99
						newlist.addAll(list);
100
					}
101
					newlist.add(item);
102
					dictCache.put(item.getDictCode(), newlist);
103
				}
104
			}
105
		});
106
	}
107

108
	@Post
109
	@Path("/modify")
110
	public int update(@JdbcConn(true) Connection con, String code, String dict, @Nullable String bcode, String caption, @Nullable String fullCaption,
111
			@Nullable String shortCut, @Nullable String remark, boolean readonly, @AfterCommit List<Runnable> runs) throws SQLException {
112
		int num = this.dictDao.update(con, bcode, caption, fullCaption, shortCut, remark, code, dict);
113
		if (num > 0) {
114
			final DictItem item = new DictItem();
115
			item.setActive(true);
116
			item.setBcode(bcode);
117
			item.setCaption(caption);
118
			item.setCode(code);
119
			item.setDictCode(dict);
120
			item.setFullCaption(fullCaption);
121
			item.setReadonly(false);
122
			item.setRemark(remark);
123
			item.setShortCut(shortCut);
124

125
			runs.add(new Runnable() {
126
				@Override
127
				public void run() {
128
					synchronized (dictCache) {
129
						List<DictItem> newlist = new LinkedList<DictItem>();
130
						List<DictItem> list = dictCache.get(item.getDictCode());
131
						if (list != null) {
132
							for (DictItem nitem : list) {
133
								if (!nitem.getCode().equals(item.getCode())) {
134
									newlist.add(nitem);
135
								}
136
							}
137
						}
138
						newlist.add(item);
139
						dictCache.put(item.getDictCode(), newlist);
140
					}
141
				}
142
			});
143

144
		}
145
		return num;
146

147
	}
148

149
}

+ 43 - 0
src/main/java/com/ekexiu/project/job/TaskJob.java

@ -0,0 +1,43 @@
1
package com.ekexiu.project.job;
2

3
import java.sql.Connection;
4
import java.text.DateFormat;
5
import java.text.ParseException;
6
import java.text.SimpleDateFormat;
7
import java.util.Date;
8
import java.util.concurrent.ScheduledExecutorService;
9
import java.util.concurrent.TimeUnit;
10

11
import javax.sql.DataSource;
12

13
import org.jfw.util.bean.AfterBeanFactory;
14
import org.jfw.util.bean.BeanFactory;
15
import org.jfw.util.context.JfwAppContext;
16
import org.jfw.util.jdbc.JdbcUtil;
17

18
import com.ekexiu.project.bridge.system.service.DictService;
19

20

21

22
public class TaskJob implements AfterBeanFactory {
23
	private ScheduledExecutorService service;
24
	private DataSource dataSource;
25

26
	@Override
27
	public void handle(BeanFactory bf) throws Throwable {
28
		this.service = JfwAppContext.getScheduledExecutorService();
29
		this.dataSource =(DataSource) bf.getBean("dataSource");
30
		Connection con  = this.dataSource.getConnection();
31
		try{
32
		
33
		DictService ds = (DictService) bf.getBean("com_ekexiu_project_bridge_system_service_DictService");
34
		ds.load(con);
35
		
36
		}finally{
37
			JdbcUtil.close(con);
38
		}
39

40
	}
41

42

43
}

+ 31 - 0
src/main/resources/project.properties

@ -0,0 +1,31 @@
1
dataSource=com.alibaba.druid.pool.DruidDataSource
2
#数据库连接地址、名称、密码
3
dataSource.url=jdbc:postgresql://192.168.3.233:5432/bridge
4
dataSource.username=postgres
5
dataSource.password=postgres
6
#连接池启动时的初始值(初始化连接)
7
dataSource.initialSize::int=1
8
#最小空闲连接值
9
dataSource.minIdle::int=1 
10
#连接池的最大值(最大连接数量)
11
dataSource.maxActive::int=1
12
#超时等待时间(maxWait代表当Connection用尽了,多久之后进行回收丢失连接)
13
dataSource.maxWait::long=60000
14
#连接超时任务的时间间隔
15
dataSource.timeBetweenEvictionRunsMillis::long=60000
16
#连接的超时时间
17
dataSource.minEvictableIdleTimeMillis::long=300000  
18
#用来验证从连接池取出的连接
19
dataSource.validationQuery=SELECT 1  
20
#指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败则连接将被从池中去除
21
dataSource.testWhileIdle::boolean=true
22
#在从池中取出连接前进行检验,如果检验失败则从池中去除连接并尝试取出另一个
23
dataSource.testOnBorrow::boolean=true
24
#指明是否在归还到池中前进行检验
25
dataSource.testOnReturn::boolean=true   
26
#开启池的prepared statement 池功能
27
dataSource.poolPreparedStatements::boolean=true 
28
#statement池能够同时分配的打开的statements的最大数量
29
dataSource.maxPoolPreparedStatementPerConnectionSize::int=20
30
#默认的SQL语句自动提交状态(开启或关闭)设置由连接池本身设置(false由连接池定)
31
dataSource.defaultAutoCommit::boolean=false

+ 40 - 0
src/main/webapp/WEB-INF/web.xml

@ -0,0 +1,40 @@
1
<?xml version="1.0" encoding="UTF-8"?>
2
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
4
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
5
	version="3.0" metadata-complete="true">
6
	<servlet>
7
		<servlet-name>ajax</servlet-name>
8
		<servlet-class>org.jfw.web.servlet.core.FilenameConfigServlet</servlet-class>
9
		<init-param>
10
			<param-name>prefixLen</param-name>
11
			<param-value>7</param-value>
12
		</init-param>
13
		<init-param>
14
			<param-name>viewType</param-name>
15
			<param-value>1</param-value>
16
		</init-param>
17
		<init-param>
18
			<param-name>configFileName</param-name>
19
			<param-value>beanConfig.properties,project.properties</param-value>
20
		</init-param>
21
		<init-param>
22
			<param-name>afterBeanFactory</param-name>
23
			<param-value>com.ekexiu.project.job.TaskJob</param-value>
24
		</init-param>
25
		<load-on-startup>1</load-on-startup>
26
	</servlet>
27
	<servlet>
28
		<servlet-name>PictureVC</servlet-name>
29
		<servlet-class>com.ekexiu.project.bridge.servlet.VerifyCodeServlet</servlet-class>
30
		<load-on-startup>5</load-on-startup>
31
	</servlet>
32
	<servlet-mapping>
33
		<servlet-name>ajax</servlet-name>
34
		<url-pattern>/ajax/*</url-pattern>
35
	</servlet-mapping>
36
	<servlet-mapping>
37
		<servlet-name>PictureVC</servlet-name>
38
		<url-pattern>/ajax/PictureVC</url-pattern>
39
	</servlet-mapping>
40
</web-app>