chengwb3 9 vuotta sitten
vanhempi
commit
9e5f1058dc
29 muutettua tiedostoa jossa 714 lisäystä ja 206 poistoa
  1. 1 2
      display-client/AndroidManifest.xml
  2. BIN
      display-client/display.keystore
  3. 1 1
      display-server/etc/server-config.xml
  4. 11 0
      display-server/etc/server-data.xml
  5. 19 11
      display-server/etc/server-page.xml
  6. 156 4
      display-server/src/com/ai/server/bean/SceneBean.java
  7. 14 0
      display-server/src/com/ai/server/core/context/DisplayContextData.java
  8. 72 25
      display-server/src/com/ai/server/util/ImageVerify.java
  9. BIN
      display-server/web/biz/img/scene/test_character.png
  10. 3 5
      display-server/web/biz/js/index.js
  11. 14 0
      display-server/web/biz/js/plugin/contactDetail.js
  12. 22 12
      display-server/web/biz/js/scene/DataRequest.js
  13. 27 5
      display-server/web/biz/js/scene/Login.js
  14. 12 0
      display-server/web/biz/js/scene/TemplateRedirect.js
  15. 24 4
      display-server/web/res/js/mobile/expand-mobile.js
  16. 2 2
      display-server/web/res/js/mobile/mobile-client.js
  17. 2 2
      display-server/web/res/js/mobile/wade-mobile.js
  18. BIN
      display-server/web/setup/display-client.apk
  19. 12 4
      display-server/web/template/webapp/PluginIndex.html
  20. 54 0
      display-server/web/template/webapp/plugin/ContactDetail.html
  21. 20 0
      display-server/web/template/webapp/plugin/Contacts.html
  22. 1 1
      display-server/web/template/webapp/plugin/UI-CustomDialog.html
  23. 57 57
      display-server/web/template/webapp/plugin/FileUpload.html
  24. 1 1
      display-server/web/template/webapp/plugin/Video.html
  25. 20 0
      display-server/web/template/webapp/plugin/YunbaPush.html
  26. 80 21
      display-server/web/template/webapp/scene/DataRequest.html
  27. 72 30
      display-server/web/template/webapp/scene/Login.html
  28. 3 3
      display-server/web/template/webapp/scene/Scene.html
  29. 14 16
      display-server/web/template/webapp/scene/TemplateRedirect.html

+ 1 - 2
display-client/AndroidManifest.xml

@ -2,7 +2,7 @@
2 2
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 3
    package="com.ai.mobile.display"
4 4
    android:versionCode="1"
5
    android:versionName="1.1" >
5
    android:versionName="1.2" >
6 6
7 7
    <uses-sdk
8 8
        android:minSdkVersion="8"
@ -106,5 +106,4 @@
106 106
            android:screenOrientation="portrait" >
107 107
        </activity>
108 108
    </application>
109
110 109
</manifest>

BIN
display-client/display.keystore


+ 1 - 1
display-server/etc/server-config.xml

@ -5,7 +5,7 @@
5 5
	<!-- 服务端资源版本号 -->
6 6
	<config name="resourceVersion" value="1.0"/>
7 7
	<!-- 客户端版本号 -->
8
	<config name="clientVersion" value="1.1"/>
8
	<config name="clientVersion" value="1.2"/>
9 9
	<!-- 客户端是否强制更新 -->
10 10
	<config name="isForceUpdate" value="true"/>
11 11
	<!-- 服务端应用编码 -->

+ 11 - 0
display-server/etc/server-data.xml

@ -8,5 +8,16 @@
8 8
	
9 9
	<action name="FileUpDownload.upload" class="com.ai.server.bean.FileUpDownload" method="upload" verify="false"></action>
10 10
	
11
	<!-- ##################################场景演示########################################################### -->
12
	
13
	<!-- 登录场景*******************初始化验证码 -->
14
	<action name="SceneBean.initVerifyCode" class="com.ai.server.bean.SceneBean" method="initVerifyCode" verify="false"></action>
15
	<!-- 登陆 -->
16
	<action name="SceneBean.login" class="com.ai.server.bean.SceneBean" method="login" verify="false"></action>
17
	<!-- 刷新验证码 -->
18
	<action name="SceneBean.refreshVerifyCode" class="com.ai.server.bean.SceneBean" method="refreshVerifyCode" verify="false"></action>
19
	
20
	<!-- 数据请求场景***************测试您的人品 -->
11 21
	<action name="SceneBean.dataRequestScene" class="com.ai.server.bean.SceneBean" method="dataRequestScene" verify="false"></action>
22
	
12 23
</datas>

+ 19 - 11
display-server/etc/server-page.xml

@ -8,22 +8,30 @@
8 8
 	
9 9
	<!-- Plugin Demo -->
10 10
	<action name="Basic" template="template/webapp/plugin/Basic.html"></action>
11
	<action name="File" template="template/webapp/plugin/File.html"></action>
12
	<action name="FileDetail" template="template/webapp/plugin/FileDetail.html" data="FileDetail"></action>
13 11
	<action name="Network" template="template/webapp/plugin/Network.html"></action>
12
	<action name="Map" template="template/webapp/plugin/Map.html"></action>
14 13
	<action name="Photo" template="template/webapp/plugin/Photo.html"></action>
15
	<action name="QR" template="template/webapp/plugin/QR.html"></action>
14
	<action name="File" template="template/webapp/plugin/File.html"></action>
15
	<!-- 提供给File使用 -->
16
	<action name="FileDetail" template="template/webapp/plugin/FileDetail.html" data="FileDetail"></action>
16 17
	<action name="Storage" template="template/webapp/plugin/Storage.html"></action>
17
	<action name="Audio" template="template/webapp/plugin/Audio.html"></action>
18
	<action name="Map" template="template/webapp/plugin/Map.html"></action>
19
	<action name="Database" template="template/webapp/plugin/Database.html"></action>
20 18
	<action name="UI" template="template/webapp/plugin/UI.html"></action>
19
	<!-- 提供给UI使用 -->
21 20
	<action name="UI-CustomDialog" template="template/webapp/plugin/UI-CustomDialog.html"></action>
22 21
	<action name="UI-CustomWindow" template="template/webapp/plugin/UI-CustomWindow.html"></action>
23
	<action name="UI-SlidingMenu" template="template/webapp/plugin/UI-SlidingMenu.html"></action>
22
	<action name="UI-SlidingMenu" template="template/webapp/plugin/UI-SlidingMenu.html"></action>
24 23
	<action name="FileUpload" template="template/webapp/plugin/FileUpload.html"></action>
25 24
	<action name="RecordVideo" template="template/webapp/plugin/Video.html"></action>
26 25
	<action name="ContactDetail" template="template/webapp/plugin/ContactDetail.html"></action>
26
27
	<action name="QR" template="template/webapp/plugin/QR.html"></action>
28
	<action name="Audio" template="template/webapp/plugin/Audio.html"></action>
29
	<action name="Video" template="template/webapp/plugin/Video.html"></action>
30
	<action name="Database" template="template/webapp/plugin/Database.html"></action>
31
	<action name="UploadDownload" template="template/webapp/plugin/UploadDownload.html"></action>
32
	<action name="YunbaPush" template="template/webapp/plugin/YunbaPush.html"></action>
33
	<action name="Contacts" template="template/webapp/plugin/Contacts.html"></action>
34
27 35
	<!-- Web Component Demo-->
28 36
	<action name="WmTab" template="template/webapp/tag/WmTab.html"></action>
29 37
	<action name="WmTabbar" template="template/webapp/tag/WmTabbar.html"></action>
@ -89,10 +97,10 @@
89 97
    
90 98
    <!-- Scene Demo -->
91 99
	<action name="Scene" template="template/webapp/scene/Scene.html"></action>
92
	<action name="Login" template="template/webapp/scene/Login.html"></action>
93
	<action name="DataRequest" template="template/webapp/scene/DataRequest.html"></action>
94
	<action name="TemplateRedirect" template="template/webapp/scene/TemplateRedirect.html"></action>
100
	<action name="SceneBean_login_init" template="template/webapp/scene/Login.html"></action>
101
	<action name="SceneBean_dataRequest" template="template/webapp/scene/DataRequest.html"></action>
102
	<action name="SceneBean_templateRedirect" template="template/webapp/scene/TemplateRedirect.html"></action>
95 103
	<action name="PageRedirect" template="template/webapp/scene/PageRedirect.html"></action>
96 104
	<action name="TemplateRefresh" template="template/webapp/scene/TemplateRefresh.html"></action>
97 105
	<action name="PageRefresh" template="template/webapp/scene/PageRefresh.html"></action>
98
</pages>
106
</pages>

+ 156 - 4
display-server/src/com/ai/server/bean/SceneBean.java

@ -1,12 +1,164 @@
1 1
package com.ai.server.bean;
2 2

3
import java.awt.image.BufferedImage;
4
import java.util.Random;
5

3 6
import com.ai.server.core.bean.DisplayBean;
7
import com.ai.server.core.context.DisplayContextData;
8
import com.ai.server.core.session.DisplaySessionManager;
9
import com.ai.server.util.ImageVerify;
4 10
import com.ailk.common.data.IData;
11
import com.ailk.common.data.impl.DataMap;
12
import com.ailk.mobile.util.MobileUtility;
13

14
public class SceneBean extends DisplayBean {
15

16
	/**
17
	 * 数据请求场景
18
	 * 
19
	 * @param param
20
	 * @return
21
	 * @throws Exception
22
	 */
23
	public IData dataRequestScene(IData param) throws Exception {
24
		IData result = new DataMap();
25

26
		// 获取从前台传过来的数据
27
		String data = param.getString("data");
28

29
		// 获取人品--随机数
30
		Random random = new Random();
31
		int testCharacter = random.nextInt(100);
32
		
33
		StringBuffer retMsg = new StringBuffer();
34
		if (testCharacter > 0 && testCharacter < 20) {
35
			retMsg.append("是我不好...不应该和你谈人品问题的...");
36
		} else if (testCharacter >= 20 && testCharacter < 40) {
37
			retMsg.append("您的人品之低下实在让人惊讶啊...");
38
		} else if (testCharacter >= 40 && testCharacter < 60) {
39
			retMsg.append("您的人品太差了..稍不小心就会去干坏事了吧?");
40
		} else if (testCharacter >= 60 && testCharacter < 80) {
41
			retMsg.append("您的人品勉勉强强...要自己好自为之...");
42
		} else if (testCharacter >= 80 && testCharacter <= 100) {
43
			retMsg.append("您的人品太好了...你就是当代活雷锋啊...");
44
		}
45

46
		result.put("retName", data);
47
		result.put("retMsg", retMsg);
48
		return result;
49

50
	}
51

52
	/**
53
	 * 初始化验证码
54
	 * 
55
	 * @param param
56
	 * @return
57
	 * @throws Exception
58
	 */
59
	public IData initVerifyCode(IData param) {
60
		IData result = new DataMap();
61

62
		try {
63
			// 获取验证码
64
			String verifyCode = ImageVerify.getVerifyCode(4, 2);
65
			BufferedImage image = ImageVerify.getImageVerify(verifyCode);
66
			String imageVerifyCode = ImageVerify.getImageBase64(image);
67

68
			// 创建session
69
			DisplayContextData contextData = new DisplayContextData();
70
			String sessionId = DisplaySessionManager.getInstance()
71
					.createSession(contextData);
72
			contextData.setVerifyCode(verifyCode.toUpperCase());
73

74
			result.put("VERIFY_IMG", imageVerifyCode);
75
			result.put("SESSION_ID", sessionId);
76
		} catch (Exception e) {
77
			e.printStackTrace();
78
		}
5 79

6
public class SceneBean extends DisplayBean{
7
	
8
	public IData dataRequestScene(IData param) throws Exception{
9
		return null;
80
		return result;
10 81
	}
11 82

83
	/**
84
	 * 
85
	 * @Title: refreshVerifyCode
86
	 * @Description: 刷新验证码
87
	 * @author 王玉娟
88
	 * @param prama
89
	 * @return
90
	 * @throws Exception
91
	 * @throws
92
	 */
93
	public IData refreshVerifyCode(IData prama) throws Exception {
94
		// 获取验证码
95
		String verifyCode = ImageVerify.getVerifyCode(4, 2);
96
		BufferedImage image = ImageVerify.getImageVerify(verifyCode);
97
		String imageVerifyCode = ImageVerify.getImageBase64(image);
98

99
		if (getContextData() == null) {
100
			// 创建session
101
			DisplayContextData contextData = new DisplayContextData();
102
			DisplaySessionManager.getInstance().createSession(contextData);
103
		}
104

105
		getContextData().setVerifyCode(verifyCode);
106

107
		IData result = new DataMap();
108
		result.put("VERIFY_IMG", imageVerifyCode);
109
		return result;
110
	}
111

112
	/**
113
	 * 登陆
114
	 * 
115
	 * @param param
116
	 * @return
117
	 */
118
	public IData login(IData param) {
119
		IData result = new DataMap();
120

121
		// 校验验证码是否输入正确
122
		if (!checkLoginVerifyCode(param)) {
123
			MobileUtility.error("登陆失败,验证码输入错误!");
124
			return result;
125
		}
126

127
		// 将用户信息保存至session
128
		try {
129
			getContextData().setAccount(param.getString("USER_NAME"));
130
			return getContextData().getData();
131
		} catch (Exception e) {
132
			// TODO Auto-generated catch block
133
			e.printStackTrace();
134
			return result;
135
		}
136

137
	}
138

139
	/**
140
	 * 
141
	 * @Title: checkLoginVerifyCode
142
	 * @Description: 校验登陆的验证码
143
	 * @author 王玉娟
144
	 * @param param
145
	 * @return true:验证码正确;false:验证码输入错误
146
	 * @throws
147
	 */
148
	private boolean checkLoginVerifyCode(IData param) {
149
		try {
150
			String verifyCode = getContextData().getVerifyCode();
151
			String clientVerifyCode = param.getString("VERIFY_CODE");
152
			if (clientVerifyCode == null || verifyCode == null
153
					|| !verifyCode.equalsIgnoreCase(clientVerifyCode)) {
154
				return false;
155
			}
156

157
			return true;
158
		} catch (Exception e) {
159
			// TODO Auto-generated catch block
160
			e.printStackTrace();
161
			return false;
162
		}
163
	}
12 164
}

+ 14 - 0
display-server/src/com/ai/server/core/context/DisplayContextData.java

@ -6,6 +6,10 @@ import com.ailk.mobile.frame.context.impl.DefaultContextData;
6 6
@SuppressWarnings("serial")
7 7
public class DisplayContextData extends DefaultContextData{
8 8

9
	public DisplayContextData() {
10
		
11
	}
12

9 13
	public DisplayContextData(String account) {
10 14
		// TODO Auto-generated constructor stub
11 15
		getData().put(Constant.Context.ACCOUNT, account);
@ -20,4 +24,14 @@ public class DisplayContextData extends DefaultContextData{
20 24
		// TODO Auto-generated method stub
21 25
		put(Constant.Context.ACCOUNT, account);
22 26
	}
27
	
28
	public String getVerifyCode()
29
    {
30
        return getData().getString("VERIFY_CODE");
31
    }
32

33
    public void setVerifyCode(String verifyCode)
34
    {
35
        put("VERIFY_CODE", verifyCode);
36
    }
23 37
}

+ 72 - 25
display-server/src/com/ai/server/util/ImageVerify.java

@ -4,38 +4,85 @@ import java.awt.Color;
4 4
import java.awt.Font;
5 5
import java.awt.Graphics2D;
6 6
import java.awt.image.BufferedImage;
7
import java.io.ByteArrayOutputStream;
8
import java.io.IOException;
7 9
import java.util.Random;
8 10

11
import javax.imageio.ImageIO;
12

13
import org.apache.commons.codec.binary.Base64;
14

15
/**
16
 * @author huangbo
17
 * 图片验证码类库
18
 */
9 19
public class ImageVerify {
20
	private static Random random = new Random();
10 21

11
	private static Random random=new Random();
12
	
13
	public static BufferedImage getImageVerify(String randomCode) {
14
		int width=100;
15
		int height=45;                     //验证图片的宽度,高度
16
		Color back=getBack();
17
		Color front=getFront(back);
18
		String code=randomCode;
19
        BufferedImage bi=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
20
        Graphics2D g=bi.createGraphics();   //得到画布
21
        g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,20));  //设置字体
22
        g.setColor(back);
23
        g.fillRect(0, 0, width, height);    //画背景
24
        g.setColor(front);
25
        g.drawString(code,18,20);           //画字符
26
        for(int i=0,n=random.nextInt(20);i<n;i++){
27
        	g.fillRect(random.nextInt(width),random.nextInt(height),1,1);
28
        }                                  //产生至多20个噪点
29
        return bi;
22
	/**得到图片背景色*/
23
	private static Color getBack() {
24
		return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
25
	}
26

27
	/**生成颜色的反色*/
28
	private static Color getFront(Color c) {
29
		return new Color(255 - c.getRed(), 255 - c.getGreen(),
30
				255 - c.getBlue());
30 31
	}
31 32
	
32
	 //得到图片背景色
33
	protected static Color getBack(){
34
		return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
33
	/**
34
	 * 图片转化成Base64编码
35
	 * @param filePath 文件过大可能内存溢出
36
	 */
37
	public static String getImageBase64(BufferedImage image) throws IOException {
38
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
39
		ImageIO.write(image, "jpg", baos);
40
		byte[] jpegData = baos.toByteArray();
41
		return new String(Base64.encodeBase64(jpegData), "utf-8");
35 42
	}
36 43
	
37
	//生成颜色的反色
38
	protected static Color getFront(Color c){
39
		return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());
44
	/**
45
	 * 生成校验图片
46
	 */
47
	public static BufferedImage getImageVerify(String code) {
48
		int width = 100;
49
		int height = 45; // 验证图片的宽度,高度
50
		Color back = getBack();
51
		Color front = getFront(back);
52
		BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
53
		Graphics2D g = bi.createGraphics(); // 得到画布
54
		g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20)); // 设置字体
55
		g.setColor(back);
56
		g.fillRect(0, 0, width, height); // 画背景
57
		g.setColor(front);
58
		g.drawString(code, 18, 20); // 画字符
59
		for (int i = 0, n = random.nextInt(20); i < n; i++) {
60
			g.fillRect(random.nextInt(width), random.nextInt(height), 1, 1);
61
		} // 产生至多20个噪点
62
		return bi;
63
	}
64

65
	/**
66
	 * 作用:获取六位随机码
67
	 */
68
	public static String getVerifyCode(int length, int verifyCodeType) throws Exception {
69
		String num = "0123456789";
70
		String ch = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";
71
		String vc = "";
72

73
		if (verifyCodeType == 0)
74
			vc = num;
75
		else if (verifyCodeType == 1)
76
			vc = ch;
77
		else
78
			vc = num + ch;
79

80
		char[] chs = vc.toCharArray();
81
		String code = "";
82
		for (int i = 0; i < length; i++) {
83
			code += chs[(int) (Math.random() * vc.length())];
84
		}
85
		
86
		return code;
40 87
	}
41 88
}

BIN
display-server/web/biz/img/scene/test_character.png


+ 3 - 5
display-server/web/biz/js/index.js

@ -1,8 +1,6 @@
1
require(["wmTabbar","common","mobile"], function(WmTabbar,Common,Mobile) {
2
	Common.get(function(index){
3
		var wmTabbar = new WmTabbar("tabbar1",index);
4
		wmTabbar.create();
5
	},"TABBAR_TCUR_INDEX");
1
require(["wmTabbar","common","mobile","util"], function(WmTabbar,Common,Mobile) {
2
	var wmTabbar = new WmTabbar("tabbar1");
3
	wmTabbar.create();
6 4
	
7 5
	$("#plugin-menu li,#ui-menu li").each(function(index, item) {
8 6
		if (item.getAttribute("action") != "null") {

+ 14 - 0
display-server/web/biz/js/plugin/contactDetail.js

@ -0,0 +1,14 @@
1
require(["domReady!","wadeMobile","util"], function(doc,WadeMobile) {
2
	var iscroll=new iScroll("content");
3
	
4
	$("#getContactDetail").tap(function(){
5
		WadeMobile.getContacts(function(str){
6
			var data=new Wade.DataMap(str);
7
			console.log(data);
8
			$("#name").html(data.get("name"));
9
			$("#phoneNumber").html(data.get("phoneNumber"));
10
			$("#email").html(data.get("email"));
11
			iscroll.refresh();
12
		});
13
	});
14
});

+ 22 - 12
display-server/web/biz/js/scene/DataRequest.js

@ -1,23 +1,33 @@
1 1
2 2
require(["mobile"], function(Mobile) {
3 3
	
4
	
5
	$("#direct").tap(function(){
4
	// 测测你的人品按钮
5
	$("#testCharacter").tap(function(){
6 6
		
7 7
		var param = new Wade.DataMap();
8
		param.put("data", $("#input-text").val());
8
		param.put("data", $("#J_username").val());
9 9
		
10
		Mobile.dataRequest("TestBean.reverse", param, function(result){
11
			//对于返回值result,有2种取值方式:
12
			//1.生成JSON对象
13
//			var obj = JSON.parse(result);
14
//			var textVal = obj["DATA"];
15
			
16
			//2.生成Map对象
10
		// 数据请求
11
		Mobile.dataRequest("SceneBean.dataRequestScene", param, function(result){
12
			// 获取返回的数据
17 13
			var obj = new Wade.DataMap(result);
18
			textVal = obj.get("DATA");
14
			var retName = obj.get("retName");
15
			var retMsg = obj.get("retMsg");
19 16
			
20
			$("#output-text").val(textVal);
17
			$("#retName").text(retName);
18
			$("#retMsg").text(retMsg);
19
			$("#mainTestCharacterContent").hide();
20
			$("#retTestCharacterContent").show();
21 21
		});
22 22
	});
23
	
24
	// 再测一次按钮
25
	$("#testCharacterAgain").tap(function(){
26
		$("#retName").text("");
27
		$("#retMsg").text("");
28
		$("#J_username").val("");
29
		$("#retTestCharacterContent").hide();
30
		$("#mainTestCharacterContent").show();
31
	});
32
	
23 33
});

+ 27 - 5
display-server/web/biz/js/scene/Login.js

@ -1,11 +1,33 @@
1 1
require(["wmTabbar","common","mobile"], function(WmTabbar,Common,Mobile) {
2

3
	Common.callSvc("SceneBean.initVerifyCode", null, function(resultData){
4
		if(typeof(resultData) == "string" ){
5
			resultData = new Wade.DataMap(resultData);
6
		}
7
		$("#J_ver_img").attr("src", "data:image/png;base64, " + resultData.get("VERIFY_IMG"));
8
		// 保存session_id
9
		Common.put("SESSION_ID", resultData.get("SESSION_ID"));
10
	});
11
	
12
	// 刷新验证码
13
	$("#J_ver_img").tap(function(){
14
		Common.callSvc("SceneBean.refreshVerifyCode", null, function(resultData){
15
			if(typeof(resultData) == "string" ){
16
				resultData = new Wade.DataMap(resultData);
17
			}
18
			$("#J_ver_img").attr("src", "data:image/png;base64, " + resultData.get("VERIFY_IMG"));
19
			$("#J_ver").val("");
20
			$("#J_ver").select();
21
		});
22
	})
2 23
	
3
	$("#submit").tap(function(){
24
	$("#sceneLoginBtn").tap(function(){
4 25
		var loginData = new Wade.DataMap();
5
		loginData.put("ACCOUNT", $("#userName").val());
6
		loginData.put("PASSWORD", $("#password").val());
26
		loginData.put("USER_NAME", $("#J_username").val());
27
		loginData.put("USER_PASSWORD", $("#J_pwd").val());
28
		loginData.put("VERIFY_CODE", $("#J_ver").val());
7 29
		
8
		Common.callSvc("LoginBean.login",loginData,function(data){
30
		Common.callSvc("SceneBean.login",loginData,function(data){
9 31
			console.log("结果[用户登陆]:" + data);
10 32
			//校验不正确
11 33
			if("0" != data.get("X_RESULTCODE")){
@ -13,7 +35,7 @@ require(["wmTabbar","common","mobile"], function(WmTabbar,Common,Mobile) {
13 35
			
14 36
			//校验正确	
15 37
			}else{
16
				Mobile.openPage("Basic");
38
				Mobile.tip("亲爱的【"+data.get("ACCOUNT")+"】用户,登陆成功");
17 39
			}
18 40
		});
19 41
	});

+ 12 - 0
display-server/web/biz/js/scene/TemplateRedirect.js

@ -0,0 +1,12 @@
1
2
require(["mobile"], function(Mobile) {
3
	
4
	// 开始游戏
5
	$("#startGame").tap(function(){
6
		
7
		// 页面跳转
8
		var param = new Wade.DataMap();
9
		Mobile.openTemplate("SceneBean_dataRequest",param);
10
	});
11
	
12
});

+ 24 - 4
display-server/web/res/js/mobile/expand-mobile.js

@ -213,15 +213,35 @@ define(["require"],function(require) {
213 213
				execute("sendText", [account,content],err);
214 214
			},setCallbackForPush:function(callback){
215 215
				execute("setCallbackForPush", [callback]);
216
			},registerForPushWithYunba:function(account,callback,err){
217
				storageCallback("registerForPush",callback);
218
				execute("registerForPush",[account],err);
219
			},unregisterForPushWithYunba:function(callback){
220
				storageCallback("unregisterForPush",callback);
221
				execute("unregisterForPush", []);
222
			},sendTextWithYunba:function(account,content,callback,err){
223
				storageCallback("sendText",callback);
224
				execute("sendText", [account,content],err);
225
			},setCallbackForPushWithYunba:function(callback){
226
				execute("setCallbackForPush", [callback]);
216 227
			},aliPay:function(tradeNo,subject,body,price,callback,err){
217 228
				storageCallback("aliPay",callback);
218 229
				execute("aliPay",[tradeNo,subject,body,price],err);	
219
			},uploadFile:function(filePath,callback,err){
230
			},uploadWithServlet:function(filePath,dataAction,param,callback,err){
231
				if(typeof(filePath)=="string"){
232
					filePath = [filePath];
233
				}
234
				storageCallback("uploadWithServlet",callback);
235
				execute("uploadWithServlet",[filePath,dataAction,param],err);	
236
			},downloadWithServlet:function(savePath,dataAction,param,callback,err){
237
				storageCallback("downloadWithServlet",callback);
238
				execute("downloadWithServlet",[savePath,dataAction,param],err);	
239
			},uploadFile:function(filePath,servletUrl,callback,err){
220 240
				storageCallback("uploadFile",callback);
221
				execute("uploadFile",[filePath],err);	
222
			},downloadFile:function(filePath,callback,err){
241
				execute("uploadFile",[filePath,servletUrl],err);	
242
			},downloadFile:function(savePath,servletUrl,callback,err){
223 243
				storageCallback("downloadFile",callback);
224
				execute("downloadFile",[filePath],err);	
244
				execute("downloadFile",[savePath,servletUrl],err);	
225 245
			},recordVideo:function(callback,compressRatio,timeLimit,err){
226 246
				storageCallback("recordVideo",callback);
227 247
				execute("recordVideo",[compressRatio,timeLimit],err);	

+ 2 - 2
display-server/web/res/js/mobile/mobile-client.js

@ -82,8 +82,8 @@ define(["wadeMobile","clientTool"],function(WadeMobile,clientTool) {
82 82
				WadeMobile.setMemoryCache(key, value);
83 83
			}
84 84
		};
85
		this.getMemoryCache = function(callback,key, value){
86
			WadeMobile.getMemoryCache(callback,key, value);
85
		this.getMemoryCache = function(callback,key,value){
86
			WadeMobile.getMemoryCache(callback,key,value);
87 87
		};
88 88
		this.removeMemoryCache = function(key){
89 89
			WadeMobile.removeMemoryCache(key);

+ 2 - 2
display-server/web/res/js/mobile/wade-mobile.js

@ -1,7 +1,7 @@
1 1
/**
2 2
 * 与客户端交互的基础API
3 3
 */
4
define(["jcl","base64","util","res/js/mobile/expand-mobile.js","biz/js/common/biz-mobile.js"],function(Wade,Base64) {
4
define(["jcl","base64","jcl","res/js/mobile/expand-mobile.js","biz/js/common/biz-mobile.js"],function(Wade,Base64,$) {
5 5
	//终端类型,a为android,i为ios
6 6
	var terminalType = window["TerminalType"];
7 7
    var deviceType = (function(){
@ -23,7 +23,7 @@ define(["jcl","base64","util","res/js/mobile/expand-mobile.js","biz/js/common/bi
23 23
        return{
24 24
        	isApp:function(){//判断是否是APP应用
25 25
        		//deviceType=="i"是为了考虑客户端能加载远程Web页面
26
				return window["TerminalType"]||window["PluginManager"]||deviceType=="i";
26
				return window["TerminalType"]||window["PluginManager"];
27 27
        	},getSysInfo:function(callback,key,err){//TELNUMBER|IMEI|IMSI|SDKVERSION|OSVERSION|PLATFORM|SIMNUMBER
28 28
				WadeMobile.callback.storageCallback("getSysInfo",callback);
29 29
				execute("getSysInfo", [key],err);

BIN
display-server/web/setup/display-client.apk


+ 12 - 4
display-server/web/template/webapp/PluginIndex.html

@ -35,17 +35,25 @@
35 35
		<div class="pic"><span class="e_ico-audio"></span></div>
36 36
		<div class="text">音频</div>
37 37
	</li>
38
	<li action="Video">
39
		<div class="pic"><span class="e_ico-storage"></span></div>
40
		<div class="text">视频</div>
41
	</li>
38 42
	<li action="Database">
39 43
		<div class="pic"><span class="e_ico-conect"></span></div>
40 44
		<div class="text">数据库</div>
41 45
	</li>
42
	<li action="FileUpload">
46
	<li action="UploadDownload">
47
		<div class="pic"><span class="e_ico-storage"></span></div>
48
		<div class="text">上传下载</div>
49
	</li>
50
	<li action="YunbaPush">
43 51
		<div class="pic"><span class="e_ico-storage"></span></div>
44
		<div class="text">文件上传</div>
52
		<div class="text">云巴推送</div>
45 53
	</li>
46
	<li action="RecordVideo">
54
	<li action="Contacts">
47 55
		<div class="pic"><span class="e_ico-storage"></span></div>
48
		<div class="text">视频录制</div>
56
		<div class="text">通讯录</div>
49 57
	</li>
50 58
	<li action="ContactDetail">
51 59
		<div class="pic"><span class="e_ico-storage"></span></div>

+ 54 - 0
display-server/web/template/webapp/plugin/ContactDetail.html

@ -0,0 +1,54 @@
1
<!DOCTYPE HTML>
2
<html class="s_bs">
3
<head>
4
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
<meta name="viewport"
6
	content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" />
7
<title>联系人详情</title> {%>template/common/Head.html%}
8
<script type="text/javascript" src="biz/js/plugin/contactDetail.js"></script>
9
<link href="biz/css/project.css" rel="stylesheet" type="text/css" />
10
</head>
11
<body>
12
13
	<div class="c_navBar">
14
		<div class="left">
15
			<div class="back">
16
				<span class="e_ico-back"></span> <span class="text">联系人详情</span>
17
			</div>
18
		</div>
19
	</div>
20
21
	<div class="m_content m_content-nofooter" id="content">
22
		<div>
23
			<div class="c_title">详情</div>
24
			<div class="c_list">
25
				<ul>
26
					<li tapfor="input-text">
27
						<div class="content">
28
							<div class="label">姓名</div>
29
							<div class="info" id="name">张三</div>
30
						</div>
31
					</li>
32
					<li tapfor="input-text">
33
						<div class="content">
34
							<div class="label">电话</div>
35
							<div class="info" id="phoneNumber"></div>
36
						</div>
37
					</li>
38
					<li tapfor="input-text">
39
						<div class="content">
40
							<div class="label">邮件</div>
41
							<div class="info" id="email"></div>
42
						</div>
43
					</li>
44
				</ul>
45
			</div>
46
			<div class="c_submit">
47
				<ul>
48
					<li><button class="e_button-ok" id="getContactDetail">获取详情</button></li>
49
				</ul>
50
			</div>
51
		</div>
52
	</div>
53
</body>
54
</html>

+ 20 - 0
display-server/web/template/webapp/plugin/Contacts.html

@ -0,0 +1,20 @@
1
<!DOCTYPE HTML>
2
<html class="s_bs">
3
<head>
4
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
	<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" />
6
	<title>通讯录</title>
7
	{%>template/common/Head.html%}
8
	<link href="biz/css/project.css" rel="stylesheet" type="text/css" />
9
</head>
10
<body>
11
<div class="c_navBar">
12
	<div class="left">
13
		<div class="back">
14
			<span class="e_ico-back"></span>
15
			<span class="text">通讯录</span>
16
		</div>
17
	</div>
18
</div>
19
</body>
20
</html>

+ 1 - 1
display-server/web/template/webapp/plugin/UI-CustomDialog.html

@ -27,7 +27,7 @@
27 27
		<ul>
28 28
			<li><button class="e_button-cancel" id="return">返回</button></li>
29 29
			<li><button class="e_button-ok" id="cancel">取消</button></li>
30
			<li><button class="e_button-cancel" id="openDialog">新开对话框</button></li>
30
			<!-- <li><button class="e_button-cancel" id="openDialog">新开对话框</button></li> -->
31 31
		</ul>
32 32
	</div>
33 33
</body>

+ 57 - 57
display-server/web/template/webapp/plugin/FileUpload.html

@ -1,58 +1,58 @@
1
<!DOCTYPE HTML>
2
<html class="s_bs">
3
<head>
4
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
	<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" />
6
	<title>文件上传/下载</title>
7
	{%>template/common/Head.html%}
8
	<script type="text/javascript" src="biz/js/plugin/fileupload.js"></script>
9
	<link href="biz/css/project.css" rel="stylesheet" type="text/css" />
10
</head>
11
<body>
12

13
<div class="c_navBar">
14
	<div class="left">
15
		<div class="back">
16
			<span class="e_ico-back"></span>
17
			<span class="text">文件上传</span>
18
		</div>
19
	</div>
20
</div>
21

22
<div class="m_content m_content-nofooter" id="content" >
23
<div>
24
	<div class="c_title">文件上传</div>
25
	<div class="c_list">
26
		<ul>
27
			<li>
28
				<div class="content">
29
					<div class="main">
30
						<div class="title">文件路径</div>
31
						<div class="info" id="fileUpload">请选择上传文件路径</div>
32
					</div>
33
					<div class="fn fn-2" id="upload">文件上传</div>
34
				</div>
35
			</li>
36
		</ul>
37
	</div>
38
</div>
39
<div>
40
	<div class="c_title">文件下载</div>
41
	<div class="c_list">
42
		<ul>
43
			<li>
44
				<div class="content">
45
					<div class="main">
46
						<div class="title">文件路径</div>
47
						<div class="info" id="fileDownload">请选择下载文件路径</div>
48
					</div>
49
					<div class="fn fn-2" id="download">文件下载</div>
50
				</div>
51
			</li>
52
		</ul>
53
	</div>
54
</div>
55

56
</div>
57
</body>
1
<!DOCTYPE HTML>
2
<html class="s_bs">
3
<head>
4
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
	<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" />
6
	<title>上传下载</title>
7
	{%>template/common/Head.html%}
8
	<script type="text/javascript" src="biz/js/plugin/fileupload.js"></script>
9
	<link href="biz/css/project.css" rel="stylesheet" type="text/css" />
10
</head>
11
<body>
12
13
<div class="c_navBar">
14
	<div class="left">
15
		<div class="back">
16
			<span class="e_ico-back"></span>
17
			<span class="text">上传下载</span>
18
		</div>
19
	</div>
20
</div>
21
22
<div class="m_content m_content-nofooter" id="content" >
23
<div>
24
	<div class="c_title">文件上传</div>
25
	<div class="c_list">
26
		<ul>
27
			<li>
28
				<div class="content">
29
					<div class="main">
30
						<div class="title">文件路径</div>
31
						<div class="info" id="fileUpload">请选择上传文件路径</div>
32
					</div>
33
					<div class="fn fn-2" id="upload">文件上传</div>
34
				</div>
35
			</li>
36
		</ul>
37
	</div>
38
</div>
39
<div>
40
	<div class="c_title">文件下载</div>
41
	<div class="c_list">
42
		<ul>
43
			<li>
44
				<div class="content">
45
					<div class="main">
46
						<div class="title">文件路径</div>
47
						<div class="info" id="fileDownload">请选择下载文件路径</div>
48
					</div>
49
					<div class="fn fn-2" id="download">文件下载</div>
50
				</div>
51
			</li>
52
		</ul>
53
	</div>
54
</div>
55
56
</div>
57
</body>
58 58
</html>

+ 1 - 1
display-server/web/template/webapp/plugin/Video.html

@ -14,7 +14,7 @@
14 14
	<div class="left">
15 15
		<div class="back">
16 16
			<span class="e_ico-back"></span>
17
			<span class="text">文件上传</span>
17
			<span class="text">视频</span>
18 18
		</div>
19 19
	</div>
20 20
</div>

+ 20 - 0
display-server/web/template/webapp/plugin/YunbaPush.html

@ -0,0 +1,20 @@
1
<!DOCTYPE HTML>
2
<html class="s_bs">
3
<head>
4
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
	<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" />
6
	<title>云巴推送</title>
7
	{%>template/common/Head.html%}
8
	<link href="biz/css/project.css" rel="stylesheet" type="text/css" />
9
</head>
10
<body>
11
<div class="c_navBar">
12
	<div class="left">
13
		<div class="back">
14
			<span class="e_ico-back"></span>
15
			<span class="text">云巴推送</span>
16
		</div>
17
	</div>
18
</div>
19
</body>
20
</html>

+ 80 - 21
display-server/web/template/webapp/scene/DataRequest.html

@ -7,6 +7,45 @@
7 7
	{%>template/common/Head.html%}
8 8
	<link href="biz/css/project.css" rel="stylesheet" type="text/css" />
9 9
	<script type="text/javascript" src="biz/js/scene/DataRequest.js"></script>
10
<style>
11
.ui-input {
12
	padding: 6px 9px;
13
	line-height: 0.22rem;
14
    height: 0.4rem;
15
	width: 3rem;
16
	border: 1px solid #BBBBBB;
17
	font-size: 0.22rem;
18
    color: #777;
19
    background: transparent;
20
    font-size: 0.22rem;
21
}
22
.reg_form {
23
	background-color: #fff;
24
	font-size: 0.22rem;
25
	padding-top: 0.12rem;
26
	box-shadow: 0 0.02rem 0 rgba(0,0,0,0.1);
27
    line-height: 1;
28
    border: 1px solid #ccc;
29
    overflow: hidden;
30
    background: #fff;
31
}
32
.reg_form .reg_table {
33
}
34
.reg_form .reg_table td {
35
	padding: 0 0 8px 0;
36
	height: 32px;
37
}
38
.reg_form .reg_table td label.des {
39
	text-align: right;
40
	display: table-cell;
41
    width: 1.5rem;
42
    padding: 0.16rem;
43
    line-height: 0.28rem;
44
}
45
.reg_form .reg_table .J_ver-wrap .ui-input {
46
	width: 2rem;
47
}
48
</style>
10 49
</head>
11 50
<body>
12 51
<div class="c_navBar">
@ -17,28 +56,48 @@
17 56
		</div>
18 57
	</div>
19 58
</div>
59

20 60
<div class="m_content m_content-nofooter" id="content">
21
<div>
22
	<div class="c_list">
23
		<ul>
24
			<li tapfor="input-text">
25
				<div class="content">
26
					<div class="value"><input type="text" placeholder="请输入文字" id="input-text"/></div>
27
					<button class="e_button-cancel" id="direct" style="float:right">反转</button>
28
				</div>
29
			</li>
30
		</ul>
31
		<ul>
32
			<li tapfor="input-text">
33
				<div class="content">
34
					<div class="value"><input type="text" placeholder="输出内容" id="output-text"/></div>
35
					<div class="label" style="float:right"></div>
36
				</div>
37
			</li>
38
			<li></li>
39
		</ul>
40
	</div>
41
</div>
61
	<form class="reg_form">
62
		<div id="mainTestCharacterContent">
63
			<table class="reg_table" cellpadding="0" cellspacing="0" border="0" width="100%">
64
				<tbody>
65
					<tr>
66
						<td width="30%"><label class="des">输入人名:</label></td>
67
						<td><input value="" type="text" id="J_username" name="J_username" class="ui-input ui-nt" maxlength="20" title="姓名"></td>
68
					</tr>
69
					<tr>
70
						<td>&nbsp;</td>
71
						<td>
72
							<button class="e_button-ok" id="testCharacter" onclick="javascript:return false;">开始计算</button>
73
						</td>
74
					</tr>
75
				</tbody>
76
			</table>
77
		</div>
78
		
79
		<div id="retTestCharacterContent" style="display: none">
80
			<table class="reg_table" cellpadding="0" cellspacing="0" border="0" width="100%">
81
				<tbody>
82
					<tr>
83
						<td width="30%"><label class="des">您的大名:</label></td>
84
						<td id="retName"></td>
85
					</tr>
86
					<tr>
87
						<td width="30%"><label class="des">评价:</label></td>
88
						<td id="retMsg"></td>
89
					</tr>
90
					<tr>
91
						<td>&nbsp;</td>
92
						<td>
93
							<button class="e_button-ok" id="testCharacterAgain" onclick="javascript:return false;">再测一次</button>
94
						</td>
95
					</tr>
96
				</tbody>
97
			</table>
98
		</div>
99
	</form>
100
	
42 101
</div>
43 102

44 103
</body>

+ 72 - 30
display-server/web/template/webapp/scene/Login.html

@ -7,6 +7,50 @@
7 7
	{%>template/common/Head.html%}
8 8
	<link href="biz/css/project.css" rel="stylesheet" type="text/css" />
9 9
	<script type="text/javascript" src="biz/js/scene/Login.js"></script>
10
	
11
<style>
12
.ui-input {
13
	padding: 6px 9px;
14
	line-height: 0.22rem;
15
    height: 0.4rem;
16
	width: 3rem;
17
	border: 1px solid #BBBBBB;
18
	font-size: 0.22rem;
19
    color: #777;
20
    background: transparent;
21
    font-size: 0.22rem;
22
}
23
.reg_form {
24
	background-color: #fff;
25
	font-size: 0.22rem;
26
	padding-top: 0.12rem;
27
	box-shadow: 0 0.02rem 0 rgba(0,0,0,0.1);
28
    line-height: 1;
29
    border: 1px solid #ccc;
30
    overflow: hidden;
31
    background: #fff;
32
}
33
.reg_form .reg_table {
34
}
35
.reg_form .reg_table td {
36
	padding: 0 0 8px 0;
37
	height: 32px;
38
}
39
.reg_form .reg_table td label.des {
40
	text-align: right;
41
	display: table-cell;
42
    width: 1.5rem;
43
    padding: 0.16rem;
44
    line-height: 0.28rem;
45
}
46
.reg_form .reg_table .J_ver-wrap .ui-input {
47
	width: 2rem;
48
}
49
.J_ver_img {
50
	width: 1rem;
51
	height: 0.4rem;
52
}
53
</style>
10 54
</head>
11 55
<body>
12 56
	<div class="c_navBar">
@ -18,36 +62,34 @@
18 62
		</div>
19 63
	</div>
20 64
	
21
	<div class="c_list">
22
		<ul>
23
			<li ontap=";">
24
				<div class="content">
25
					<div class="main" id="mention"></div>
26
				</div>
27
			</li>
28
		</ul>
29
	</div>
30
	
31
	<div class="c_table">
32
		<table border="none">
33
			<tbody id="tbody">
34
				<tr>
35
					<td></td>
36
					<td><input type="text" id="userName" required placeholder="用户名"></td>
37
					<td></td>
38
				</tr>
39
				<tr>
40
					<td></td>
41
					<td><input type="password" id="password" required placeholder="密码"></td>
42
					<td></td>
43
				</tr>
44
				<tr>
45
					<td></td>
46
					<td><input type="button" value="提交" id="submit"/></td>
47
					<td><a href="#">忘记密码?</a></td>
48
				</tr>
49
			</tbody>
50
		</table>
65
	<div class="m_content m_content-nofooter" id="content">
66
		<form class="reg_form">
67
			<table class="reg_table" cellpadding="0" cellspacing="0" border="0" width="100%">
68
				<tbody>
69
					<tr>
70
						<td width="30%"><label class="des">用户名:</label></td>
71
						<td><input value="" type="text" id="J_username" name="J_username" class="ui-input ui-nt" maxlength="20" title="用户名"></td>
72
					</tr>
73
					<tr>
74
						<td><label class="des">密码:</label></td>
75
						<td><input value="" type="password" id="J_pwd" name="J_pwd" class="ui-input" maxlength="50" title="密码"></td>
76
					</tr>
77
					<tr>
78
						<td><label class="des">验证码:</label></td>
79
						<td class="J_ver-wrap">
80
							<input value="" type="text" id="J_ver" name="J_ver" class="ui-input" maxlength="4" require="true" title="验证码">
81
							<img src="" id="J_ver_img" class="J_ver_img">
82
						</td>
83
					</tr>
84
					<tr>
85
						<td>&nbsp;</td>
86
						<td>
87
							<button class="e_button-ok" id="sceneLoginBtn" onclick="javascript:return false;">登录</button>
88
						</td>
89
					</tr>
90
				</tbody>
91
			</table>
92
		</form>
51 93
	</div>
52 94
</body>
53 95
</html>

+ 3 - 3
display-server/web/template/webapp/scene/Scene.html

@ -21,7 +21,7 @@
21 21
<div>
22 22
	<div class="c_list">
23 23
		<ul id="scene-menu">
24
			<li action="Login">
24
			<li action="SceneBean_login_init">
25 25
				<div class="content">
26 26
					<div class="main">
27 27
						<div class="title">登陆</div>
@ -30,7 +30,7 @@
30 30
					</div>
31 31
				</div>
32 32
			</li>
33
			<li action="DataRequest">
33
			<li action="SceneBean_dataRequest">
34 34
				<div class="content">
35 35
					<div class="main">
36 36
						<div class="title">数据请求</div>
@ -39,7 +39,7 @@
39 39
					</div>
40 40
				</div>
41 41
			</li>
42
			<li action="TemplateRedirect">
42
			<li action="SceneBean_templateRedirect">
43 43
				<div class="content">
44 44
					<div class="main">
45 45
						<div class="title">页面跳转(直接数据渲染)</div>

+ 14 - 16
display-server/web/template/webapp/scene/TemplateRedirect.html

@ -6,6 +6,16 @@
6 6
	<title>页面跳转</title>
7 7
	{%>template/common/Head.html%}
8 8
	<link href="biz/css/project.css" rel="stylesheet" type="text/css" />
9
	<script type="text/javascript" src="biz/js/scene/TemplateRedirect.js"></script>
10
<style>
11
.m_content {
12
	text-align: center;
13
}
14
.m_content img {
15
	display: inline-block;
16
	margin-bottom: 0.2rem;
17
}
18
</style>
9 19
</head>
10 20
<body>
11 21
<div class="c_navBar">
@ -16,23 +26,11 @@
16 26
		</div>
17 27
	</div>
18 28
</div>
19
<div class="c_submit">
20
	<ul>
21
		<li></li>
22
		<li><button class="e_button-ok" id="call">跳转</button></li>
23
		<li></li>
24
	</ul>
25
</div>
26 29

30
<div class="m_content m_content-nofooter" id="content">
31
	<img src="biz/img/scene/test_character.png" width="100%"/>	
32
	<button class="e_button-ok" id="startGame">开始游戏</button>
33
</div>
27 34

28 35
</body>
29
<script type="text/javascript">
30
require(["mobile"], function(Mobile) {
31
	
32
	$(".e_button-ok").tap(function(){
33
		
34
		Mobile.openTemplate("Basic");
35
	});
36
});
37
</script>
38 36
</html>