suochencheng 7 лет назад
Родитель
Сommit
1938de005e
88 измененных файлов с 888 добавлено и 23 удалено
  1. 53 18
      src/main/java/com/izouma/awesomeadmin/service/impl/AimPlaceInfoServiceImpl.java
  2. 122 0
      src/main/java/com/izouma/awesomeadmin/vuforia/DeleteTarget.java
  3. 50 0
      src/main/java/com/izouma/awesomeadmin/vuforia/GetAllTargets.java
  4. 52 0
      src/main/java/com/izouma/awesomeadmin/vuforia/GetTarget.java
  5. 131 0
      src/main/java/com/izouma/awesomeadmin/vuforia/PostNewTarget.java
  6. 78 0
      src/main/java/com/izouma/awesomeadmin/vuforia/SignatureBuilder.java
  7. 53 0
      src/main/java/com/izouma/awesomeadmin/vuforia/Summary.java
  8. 106 0
      src/main/java/com/izouma/awesomeadmin/vuforia/TargetState.java
  9. 6 0
      src/main/java/com/izouma/awesomeadmin/vuforia/TargetStatusListener.java
  10. 130 0
      src/main/java/com/izouma/awesomeadmin/vuforia/TargetStatusPoller.java
  11. 66 0
      src/main/java/com/izouma/awesomeadmin/vuforia/UpdateTarget.java
  12. 1 1
      src/main/vue/src/pages/ArContent.vue
  13. 36 0
      src/main/vue/src/pages/ArContents.vue
  14. 1 1
      src/main/webapp/WEB-INF/html/admin.html
  15. 1 1
      src/main/webapp/WEB-INF/html/loginAdmin.html
  16. 0 0
      src/main/webapp/static/css/admin.f410ef1458acf0f0da3c5b42bf0e2dde.css
  17. 0 0
      src/main/webapp/static/js/16.987d0bf83c68a2127fdd.js
  18. 0 0
      src/main/webapp/static/js/17.a6b6ae680d7c5d49f457.js
  19. 0 0
      src/main/webapp/static/js/18.b46970569aebcce912e2.js
  20. 0 0
      src/main/webapp/static/js/18.b4791dd219c5975b0abc.js
  21. 0 0
      src/main/webapp/static/js/35.444d017f53ef1f93f9b0.js
  22. 0 0
      src/main/webapp/static/js/36.3abc3886147e7fd17908.js
  23. 0 0
      src/main/webapp/static/js/36.d58da56f10c544043e3e.js
  24. 0 0
      src/main/webapp/static/js/39.9f84388a3250b1be1d57.js
  25. 0 0
      src/main/webapp/static/js/40.c7767385ec898fe97f51.js
  26. 0 0
      src/main/webapp/static/js/41.f2e49a4b20e50a7da5c0.js
  27. 0 0
      src/main/webapp/static/js/42.5b117eee1585032f9dec.js
  28. 0 0
      src/main/webapp/static/js/43.1e9ebcadcbc6de132cfc.js
  29. 0 0
      src/main/webapp/static/js/44.a0c32ccca3a95b32510e.js
  30. 0 0
      src/main/webapp/static/js/45.fd217051f9176c7678c1.js
  31. 0 0
      src/main/webapp/static/js/46.3f8e4e884a4e03630040.js
  32. 0 0
      src/main/webapp/static/js/47.be89b076546d547af1ef.js
  33. 0 0
      src/main/webapp/static/js/48.bca49af8c5113a5bf2e7.js
  34. 0 0
      src/main/webapp/static/js/49.bda3a3258e9c359199f6.js
  35. 0 0
      src/main/webapp/static/js/50.a7bad43cde203ea3c497.js
  36. 0 0
      src/main/webapp/static/js/51.dabe3a865e4f94b4a7de.js
  37. 0 0
      src/main/webapp/static/js/52.34fbfc63bd085a5163ec.js
  38. 0 0
      src/main/webapp/static/js/52.5802ec3accc94f44c5c1.js
  39. 0 0
      src/main/webapp/static/js/53.9d6fc0e5ddbc7c5bcb4f.js
  40. 0 0
      src/main/webapp/static/js/54.ced9850d306397e6e986.js
  41. 0 0
      src/main/webapp/static/js/55.83ae3a45742c17e44064.js
  42. 0 0
      src/main/webapp/static/js/56.6fc88b94ab0256bd28d5.js
  43. 0 0
      src/main/webapp/static/js/57.4dec55beb4f928694dc9.js
  44. 0 0
      src/main/webapp/static/js/58.06e65f9dac38510f42d3.js
  45. 0 0
      src/main/webapp/static/js/59.6ca44cde46341483a946.js
  46. 0 0
      src/main/webapp/static/js/60.0bb128c3e65cb63308b9.js
  47. 0 0
      src/main/webapp/static/js/61.237e1f68d89aff70c0ac.js
  48. 0 0
      src/main/webapp/static/js/62.e28de9bfc4f878c6c887.js
  49. 0 0
      src/main/webapp/static/js/63.8362280a6306c3b6a451.js
  50. 0 0
      src/main/webapp/static/js/64.089cb3a730b790e96d3b.js
  51. 0 0
      src/main/webapp/static/js/65.24f0801e491a08ee4cc6.js
  52. 0 0
      src/main/webapp/static/js/66.d37dbd2c1f345b1d15e3.js
  53. 0 0
      src/main/webapp/static/js/67.34681c98cb1e9edc8747.js
  54. 0 0
      src/main/webapp/static/js/68.5261c219aa3f428364c7.js
  55. 0 0
      src/main/webapp/static/js/68.7bfb17ac1f4a2f9b7e44.js
  56. 0 0
      src/main/webapp/static/js/69.92a33ab7f3380577c1a3.js
  57. 0 0
      src/main/webapp/static/js/70.5984017fd9e0aac59bd0.js
  58. 0 0
      src/main/webapp/static/js/71.58ded689cce7a0eac667.js
  59. 0 0
      src/main/webapp/static/js/72.ad623c2851f090359ab0.js
  60. 0 0
      src/main/webapp/static/js/73.c734478abe2a9ede0738.js
  61. 0 0
      src/main/webapp/static/js/74.27e1d72eef1d649605d3.js
  62. 0 0
      src/main/webapp/static/js/75.865f0e00b5e7ae198913.js
  63. 0 0
      src/main/webapp/static/js/76.fe175405ed84fb558dbb.js
  64. 0 0
      src/main/webapp/static/js/77.35d06053bcd9ea36a705.js
  65. 0 0
      src/main/webapp/static/js/78.18a9082f74a1c91c38c4.js
  66. 0 0
      src/main/webapp/static/js/79.0dd81dadf3e4720f181d.js
  67. 1 1
      src/main/webapp/static/js/80.3bdedfaa542338e8c9ea.js
  68. 0 0
      src/main/webapp/static/js/81.6112b7d26133caf7eda5.js
  69. 0 0
      src/main/webapp/static/js/82.d491bcff520020dbbf1e.js
  70. 0 0
      src/main/webapp/static/js/83.2bd2b9f4ea15a6194084.js
  71. 0 0
      src/main/webapp/static/js/84.6fdd4d4287401f6383c1.js
  72. 0 0
      src/main/webapp/static/js/85.ea1129198d76fda6f642.js
  73. 0 0
      src/main/webapp/static/js/86.57bfe057200606446d88.js
  74. 0 0
      src/main/webapp/static/js/87.4ab56990a8ff96e7e119.js
  75. 0 0
      src/main/webapp/static/js/88.4e852a1e3d5b3e884c41.js
  76. 0 0
      src/main/webapp/static/js/88.76e641a42e62161c04e0.js
  77. 0 0
      src/main/webapp/static/js/89.ba88d526ec2ff01cd8bf.js
  78. 0 0
      src/main/webapp/static/js/90.2aaa73a57f8018ca044a.js
  79. 0 0
      src/main/webapp/static/js/91.1d167176677faaf8ec30.js
  80. 1 1
      src/main/webapp/static/js/92.8e823bf932c2bb84a735.js
  81. 0 0
      src/main/webapp/static/js/93.6de35fe8a18629c5553b.js
  82. 0 0
      src/main/webapp/static/js/94.3b5abed914f8bf10cd85.js
  83. 0 0
      src/main/webapp/static/js/admin.134b1979ede75d50d3ec.js
  84. 0 0
      src/main/webapp/static/js/admin.bbcd292633c7208d1eec.js
  85. 0 0
      src/main/webapp/static/js/loginAdmin.c9cb308e894a7cd72b31.js
  86. 0 0
      src/main/webapp/static/js/manifest.7629aae42177c2964081.js
  87. 0 0
      src/main/webapp/static/js/manifest.e3c80c7892a4337688d9.js
  88. 0 0
      src/main/webapp/static/js/vendor.631c08d5fc0f22d7ee46.js

+ 53 - 18
src/main/java/com/izouma/awesomeadmin/service/impl/AimPlaceInfoServiceImpl.java

@@ -1,6 +1,11 @@
 package com.izouma.awesomeadmin.service.impl;
 
 import java.util.*;
+
+import com.izouma.awesomeadmin.dao.AimTemplateArMapper;
+import com.izouma.awesomeadmin.dao.ArContentMapper;
+import com.izouma.awesomeadmin.model.AimTemplateAr;
+import com.izouma.awesomeadmin.model.ArContent;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -11,42 +16,49 @@ import com.izouma.awesomeadmin.service.AimPlaceInfoService;
 import com.izouma.awesomeadmin.dao.AimPlaceInfoMapper;
 
 /**
-*  service接口实现类
-*/
+ * service接口实现类
+ */
 @Service
-public class AimPlaceInfoServiceImpl implements AimPlaceInfoService{
+public class AimPlaceInfoServiceImpl implements AimPlaceInfoService {
 
     private static Logger logger = Logger.getLogger(AimPlaceInfoServiceImpl.class);
 
     @Autowired
     private AimPlaceInfoMapper aimPlaceInfoMapper;
 
+    @Autowired
+    private AimTemplateArMapper aimTemplateArMapper;
+
+    @Autowired
+    private ArContentMapper arContentMapper;
+
     @Override
     public List<AimPlaceInfo> getAimPlaceInfoList(AimPlaceInfo record) {
 
         logger.info("getAimPlaceInfoList");
         try {
 
-        return aimPlaceInfoMapper.queryAllAimPlaceInfo(record);
+            return aimPlaceInfoMapper.queryAllAimPlaceInfo(record);
         } catch (Exception e) {
-        logger.error("getAimPlaceInfoList", e);
+            logger.error("getAimPlaceInfoList", e);
         }
 
         return null;
     }
+
     @Override
     public List<AimPlaceInfo> getAimPlaceInfoByPage(Page page, AimPlaceInfo record) {
 
         logger.info("getAimPlaceInfoByPage");
         try {
 
-        Map<String, Object> parameter = new HashMap<String, Object>();
-        parameter.put("record", record);
-        parameter.put(AppConstant.PAGE, page);
+            Map<String, Object> parameter = new HashMap<String, Object>();
+            parameter.put("record", record);
+            parameter.put(AppConstant.PAGE, page);
 
-        return aimPlaceInfoMapper.queryAimPlaceInfoByPage(parameter);
+            return aimPlaceInfoMapper.queryAimPlaceInfoByPage(parameter);
         } catch (Exception e) {
-        logger.error("getAimPlaceInfoByPage", e);
+            logger.error("getAimPlaceInfoByPage", e);
         }
 
         return null;
@@ -60,7 +72,7 @@ public class AimPlaceInfoServiceImpl implements AimPlaceInfoService{
 
             return aimPlaceInfoMapper.selectByPrimaryKey(Integer.valueOf(id));
         } catch (Exception e) {
-        logger.error("getAimPlaceInfoById", e);
+            logger.error("getAimPlaceInfoById", e);
         }
 
         return null;
@@ -74,7 +86,7 @@ public class AimPlaceInfoServiceImpl implements AimPlaceInfoService{
 
             return aimPlaceInfoMapper.queryAimPlaceInfo(record);
         } catch (Exception e) {
-        logger.error("getAimPlaceInfo", e);
+            logger.error("getAimPlaceInfo", e);
         }
 
         return null;
@@ -89,7 +101,30 @@ public class AimPlaceInfoServiceImpl implements AimPlaceInfoService{
             int updates = aimPlaceInfoMapper.insertSelective(record);
 
             if (updates > 0) {
-                 return true;
+                AimTemplateAr param = new AimTemplateAr();
+                param.setTemplateAimId(record.getTemplateAimId());
+
+                List<AimTemplateAr> aimTemplateArList = aimTemplateArMapper.queryAllAimTemplateAr(param);
+                if (aimTemplateArList.size() > 0) {
+
+                    for (AimTemplateAr aimTemplateAr : aimTemplateArList) {
+                        ArContent arContent = new ArContent();
+                        arContent.setName(aimTemplateAr.getArName());
+                        arContent.setType(aimTemplateAr.getArType());
+                        arContent.setActivationMode(aimTemplateAr.getActivationMode());
+                        arContent.setAreaId(record.getAreaId());
+                        arContent.setThingId(record.getThingId());
+                        arContent.setAimGroupId(String.valueOf(record.getAimGroupId()));
+                        arContent.setAimPlaceId(String.valueOf(record.getId()));
+                        arContent.setTemplateId(aimTemplateAr.getTemplateId());
+                        arContent.setTemplateAimId(String.valueOf(aimTemplateAr.getTemplateAimId()));
+                        arContent.setTemplateArId(String.valueOf(aimTemplateAr.getId()));
+
+                        arContentMapper.insertSelective(arContent);
+
+                    }
+                }
+                return true;
             }
         } catch (Exception e) {
             logger.error("createAimPlaceInfo", e);
@@ -104,13 +139,13 @@ public class AimPlaceInfoServiceImpl implements AimPlaceInfoService{
         logger.info("deleteAimPlaceInfo");
         try {
 
-             int updates = aimPlaceInfoMapper.delete(record);
+            int updates = aimPlaceInfoMapper.delete(record);
 
             if (updates > 0) {
-                 return true;
+                return true;
             }
         } catch (Exception e) {
-             logger.error("deleteAimPlaceInfo", e);
+            logger.error("deleteAimPlaceInfo", e);
         }
 
         return false;
@@ -125,10 +160,10 @@ public class AimPlaceInfoServiceImpl implements AimPlaceInfoService{
             int updates = aimPlaceInfoMapper.updateByPrimaryKeySelective(record);
 
             if (updates > 0) {
-                 return true;
+                return true;
             }
         } catch (Exception e) {
-             logger.error("updateAimPlaceInfo", e);
+            logger.error("updateAimPlaceInfo", e);
         }
 
         return false;

+ 122 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/DeleteTarget.java

@@ -0,0 +1,122 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.cookie.DateUtils;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+
+/**
+ * See the Vuforia Web Services Developer API Specification - https://developer.vuforia.com/resources/dev-guide/managing-targets-cloud-database-using-developer-api
+ * Note: a target that has status of �Processing� cannot be deleted.
+ * Note: a target must be inactive in order to be deleted.
+ * To deactivate a target, set its active_flag to false using the PUT method as demonstrated below.
+ * You can also confirm the activation status of the target in the Target Manager at http://developer.vuforia.com.
+ */
+public class DeleteTarget implements TargetStatusListener {
+
+	//Server Keys
+	private String accessKey = "[ server access key ]";
+	private String secretKey = "[ server secret key ]";
+	
+	private String targetId = "[ target id ]";
+	private String url = "https://vws.vuforia.com";
+	
+	private TargetStatusPoller targetStatusPoller;
+	
+	private final float pollingIntervalMinutes = 60;//poll at 1-hour interval
+
+	private void deleteTarget() throws URISyntaxException, ClientProtocolException, IOException {
+		HttpDelete deleteRequest = new HttpDelete();
+		HttpClient client = new DefaultHttpClient();
+		deleteRequest.setURI(new URI(url + "/targets/" + targetId));
+		setHeaders(deleteRequest);
+		
+		HttpResponse response = client.execute(deleteRequest);
+		System.out.println("Delete Response " + EntityUtils.toString(response.getEntity()));
+	}
+	
+	private void setHeaders(HttpUriRequest request) {
+		SignatureBuilder sb = new SignatureBuilder();
+		request.setHeader(new BasicHeader("Date", DateUtils.formatDate(new Date()).replaceFirst("[+]00:00$", "")));
+		request.setHeader("Authorization", "VWS " + accessKey + ":" + sb.tmsSignature(request, secretKey));
+	}
+	
+	// sets the targets active_flag to the Boolean value of the argument
+	private void updateTargetActivation(Boolean b) throws URISyntaxException, ClientProtocolException, IOException, JSONException {
+		HttpPut putRequest = new HttpPut();
+		HttpClient client = new DefaultHttpClient();
+		putRequest.setURI(new URI(url + "/targets/" + targetId));
+		
+		JSONObject requestBody = new JSONObject();
+		requestBody.put("active_flag", b );// add a JSON field for the active_flag
+		
+		putRequest.setEntity(new StringEntity(requestBody.toString()));
+		// Set the Headers for this Put request
+		// Must be done after setting the body
+		SignatureBuilder sb = new SignatureBuilder();
+		putRequest.setHeader(new BasicHeader("Date", DateUtils.formatDate(new Date()).replaceFirst("[+]00:00$", "")));
+		putRequest.setHeader(new BasicHeader("Content-Type", "application/json"));
+		putRequest.setHeader("Authorization", "VWS " + accessKey + ":" + sb.tmsSignature(putRequest, secretKey));
+		
+		HttpResponse response = client.execute(putRequest);
+		System.out.println("Update Response "+EntityUtils.toString(response.getEntity()));
+	}
+	
+	public void deactivateThenDeleteTarget() {
+		// Update the target's active_flag to false and then Delete the target when the state change has been processed;
+		try {
+			updateTargetActivation( false );
+		} catch ( URISyntaxException | IOException | JSONException e) {
+			e.printStackTrace();
+			return;
+		}
+	
+		// Poll the target status until the active_flag is confirmed to be set to false
+		// The TargetState will be passed to the OnTargetStatusUpdate callback 
+		targetStatusPoller = new TargetStatusPoller(pollingIntervalMinutes, targetId, accessKey, secretKey, this );
+		targetStatusPoller.startPolling();
+	}
+	
+	// Called with each update of the target status received by the TargetStatusPoller
+	@Override
+	public void OnTargetStatusUpdate(TargetState target_state) {
+		if (target_state.hasState) {
+		
+			if (target_state.getActiveFlag() == false) {
+				
+				targetStatusPoller.stopPolling();
+				
+				try {
+					System.out.println(".. deleting target ..");
+					
+					deleteTarget();
+					
+				} catch ( URISyntaxException | IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+	
+
+	public static void main(String[] args) throws URISyntaxException, ClientProtocolException, IOException {
+		DeleteTarget d = new DeleteTarget();
+		d.deactivateThenDeleteTarget();
+	}
+}

+ 50 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/GetAllTargets.java

@@ -0,0 +1,50 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.cookie.DateUtils;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+
+
+
+//See the Vuforia Web Services Developer API Specification - https://developer.vuforia.com/resources/dev-guide/listing-targets-cloud-database
+
+public class GetAllTargets {
+
+	//Server Keys
+	private String accessKey = "[ server access key ]";
+	private String secretKey = "[ server secret key ]";
+		
+	private String url = "https://vws.vuforia.com";
+
+	private void getTargets() throws URISyntaxException, ClientProtocolException, IOException {
+		HttpGet getRequest = new HttpGet();
+		HttpClient client = new DefaultHttpClient();
+		getRequest.setURI(new URI(url + "/targets"));
+		setHeaders(getRequest);
+		
+		HttpResponse response = client.execute(getRequest);
+		System.out.println(EntityUtils.toString(response.getEntity()));
+	}
+	
+	private void setHeaders(HttpUriRequest request) {
+		SignatureBuilder sb = new SignatureBuilder();
+		request.setHeader(new BasicHeader("Date", DateUtils.formatDate(new Date()).replaceFirst("[+]00:00$", "")));
+		request.setHeader("Authorization", "VWS " + accessKey + ":" + sb.tmsSignature(request, secretKey));
+	}
+
+	public static void main(String[] args) throws URISyntaxException, ClientProtocolException, IOException {
+		GetAllTargets g = new GetAllTargets();
+		g.getTargets();
+	}
+}

+ 52 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/GetTarget.java

@@ -0,0 +1,52 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.cookie.DateUtils;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+
+
+
+// See the Vuforia Web Services Developer API Specification - https://developer.vuforia.com/resources/dev-guide/retrieving-target-cloud-database
+
+public class GetTarget {
+
+	//Server Keys
+	private String accessKey = "[ server access key ]";
+	private String secretKey = "[ server secret key ]";
+		
+	private String targetId = "[ target id ]";
+	private String url = "https://vws.vuforia.com";
+
+	private void getTarget() throws URISyntaxException, ClientProtocolException, IOException {
+		HttpGet getRequest = new HttpGet();
+		HttpClient client = new DefaultHttpClient();
+		getRequest.setURI(new URI(url + "/targets/" + targetId));
+		setHeaders(getRequest);
+		
+		HttpResponse response = client.execute(getRequest);
+		System.out.println(EntityUtils.toString(response.getEntity()));
+	}
+	
+	private void setHeaders(HttpUriRequest request) {
+		SignatureBuilder sb = new SignatureBuilder();
+		request.setHeader(new BasicHeader("Date", DateUtils.formatDate(new Date()).replaceFirst("[+]00:00$", "")));
+		request.setHeader("Authorization", "VWS " + accessKey + ":" + sb.tmsSignature(request, secretKey));
+	}
+	
+
+	public static void main(String[] args) throws URISyntaxException, ClientProtocolException, IOException {
+		GetTarget g = new GetTarget();
+		g.getTarget();
+	}
+}

+ 131 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/PostNewTarget.java

@@ -0,0 +1,131 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.FileUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.cookie.DateUtils;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+
+
+// See the Vuforia Web Services Developer API Specification - https://developer.vuforia.com/resources/dev-guide/adding-target-cloud-database-api
+
+public class PostNewTarget implements TargetStatusListener {
+
+	//Server Keys
+	private String accessKey = "391531184ed5cf0d998a91f193eddd57cff3b074";
+	private String secretKey = "21f5b1d95a537e501ed62baad256f44f2b1ea022";
+	
+	private String url = "https://vws.vuforia.com";
+	private String targetName = "ceshi11";
+	private String imageLocation = "C:\\Users\\12413\\Desktop\\图片\\u=1484732512,826284216&fm=11&gp=0.jpg";
+
+	private TargetStatusPoller targetStatusPoller;
+	
+	private final float pollingIntervalMinutes = 60;//poll at 1-hour interval
+	
+	private String postTarget() throws URISyntaxException, ClientProtocolException, IOException, JSONException {
+		HttpPost postRequest = new HttpPost();
+		HttpClient client = new DefaultHttpClient();
+		postRequest.setURI(new URI(url + "/targets"));
+		JSONObject requestBody = new JSONObject();
+		
+		setRequestBody(requestBody);
+		postRequest.setEntity(new StringEntity(requestBody.toString()));
+		setHeaders(postRequest); // Must be done after setting the body
+		
+		HttpResponse response = client.execute(postRequest);
+		String responseBody = EntityUtils.toString(response.getEntity());
+		System.out.println(responseBody);
+		
+		JSONObject jobj = new JSONObject(responseBody);
+		
+		String uniqueTargetId = jobj.has("target_id") ? jobj.getString("target_id") : "";
+		System.out.println("\nCreated target with id: " + uniqueTargetId);
+		
+		return uniqueTargetId;
+	}
+	
+	private void setRequestBody(JSONObject requestBody) throws IOException, JSONException {
+		File imageFile = new File(imageLocation);
+		if(!imageFile.exists()) {
+			System.out.println("File location does not exist!");
+			System.exit(1);
+		}
+		byte[] image = FileUtils.readFileToByteArray(imageFile);
+		requestBody.put("name", targetName); // Mandatory
+		requestBody.put("width", 320.0); // Mandatory
+		requestBody.put("image", Base64.encodeBase64String(image)); // Mandatory
+		requestBody.put("active_flag", 1); // Optional
+		requestBody.put("application_metadata", Base64.encodeBase64String("Vuforia test metadata".getBytes())); // Optional
+	}
+	
+	private void setHeaders(HttpUriRequest request) {
+		SignatureBuilder sb = new SignatureBuilder();
+		request.setHeader(new BasicHeader("Date", DateUtils.formatDate(new Date()).replaceFirst("[+]00:00$", "")));
+		request.setHeader(new BasicHeader("Content-Type", "application/json"));
+		request.setHeader("Authorization", "VWS " + accessKey + ":" + sb.tmsSignature(request, secretKey));
+	}
+	
+	/**
+	 * Posts a new target to the Cloud database; 
+	 * then starts a periodic polling until 'status' of created target is reported as 'success'.
+	 */
+	public void postTargetThenPollStatus() {
+		String createdTargetId = "";
+		try {
+			createdTargetId = postTarget();
+		} catch (URISyntaxException | IOException | JSONException e) {
+			e.printStackTrace();
+			return;
+		}
+	
+		// Poll the target status until the 'status' is 'success'
+		// The TargetState will be passed to the OnTargetStatusUpdate callback 
+		if (createdTargetId != null && !createdTargetId.isEmpty()) {
+			targetStatusPoller = new TargetStatusPoller(pollingIntervalMinutes, createdTargetId, accessKey, secretKey, this );
+			targetStatusPoller.startPolling();
+		}
+	}
+	
+	// Called with each update of the target status received by the TargetStatusPoller
+	@Override
+	public void OnTargetStatusUpdate(TargetState target_state) {
+		if (target_state.hasState) {
+			
+			String status = target_state.getStatus();
+			
+			System.out.println("Target status is: " + (status != null ? status : "unknown"));
+			
+			if (target_state.getActiveFlag() == true && "success".equalsIgnoreCase(status)) {
+				
+				targetStatusPoller.stopPolling();
+				
+				System.out.println("Target is now in 'success' status");
+			}
+		}
+	}
+	
+	
+	public static void main(String[] args) throws URISyntaxException, ClientProtocolException, IOException, JSONException {
+		PostNewTarget p = new PostNewTarget();
+		p.postTargetThenPollStatus();
+	}
+	
+}

+ 78 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/SignatureBuilder.java

@@ -0,0 +1,78 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.SignatureException;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.http.client.methods.HttpUriRequest;
+
+public class SignatureBuilder {
+
+	public String tmsSignature(HttpUriRequest request, String secretKey) {
+		String method = request.getMethod();
+		String contentType = "";
+		String hexDigest = "d41d8cd98f00b204e9800998ecf8427e"; // Hex digest of an empty string
+
+		if (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("DELETE")) {
+			// Do nothing because the strings are already set correctly
+		} else if (method.equalsIgnoreCase("POST") || method.equalsIgnoreCase("PUT")) {
+			contentType = "application/json";
+			// If this is a POST or PUT the request should have a request body
+			hexDigest = contentMD5((HttpEntityEnclosingRequestBase) request);
+		} else {
+			System.out.println("ERROR: Invalid content type passed to Sig Builder");
+		}
+
+		// Date in the header and date used to calculate the hash must be the same
+		String dateValue = request.getFirstHeader("Date").getValue();
+		String requestPath = request.getURI().getPath();
+		String toDigest = new String(method + "\n" + hexDigest + "\n" + contentType + "\n" + dateValue + "\n" + requestPath);
+		String shaHashed = "";
+		try {
+			System.out.println(toDigest);
+			shaHashed = calculateRFC2104HMAC(secretKey, toDigest);
+		} catch (SignatureException e) {
+			e.printStackTrace();
+		}
+		return new String(shaHashed);
+	}
+
+	private String contentMD5(HttpEntityEnclosingRequestBase httpMethod) {
+		ByteArrayOutputStream requestOutputStream = new ByteArrayOutputStream();
+		try {
+			httpMethod.getEntity().writeTo(requestOutputStream);
+		} catch (IOException e) {
+			System.out.println("ERROR: IOException caught when writing Content MD5 hash");
+			e.printStackTrace();
+		}
+		return DigestUtils.md5Hex(requestOutputStream.toByteArray()).toLowerCase();
+	}
+
+	public static String calculateRFC2104HMAC(String key, String data) throws SignatureException {
+		String result = "";
+		try {
+			// get an hmac_sha1 key from the raw key bytes
+			SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
+
+			// get an hmac_sha1 Mac instance and initialize with the signing key
+			Mac mac = Mac.getInstance("HmacSHA1");
+			mac.init(signingKey);
+
+			// compute the hmac on input data bytes
+			byte[] rawHmac = mac.doFinal(data.getBytes());
+
+			// base64-encode the hmac
+			result = new String(Base64.encodeBase64(rawHmac, false));
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+}

+ 53 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/Summary.java

@@ -0,0 +1,53 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.cookie.DateUtils;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+
+
+
+
+//See the Vuforia Web Services Developer API Specification - https://developer.vuforia.com/resources/dev-guide/database-summary-report
+
+public class Summary {
+
+	//Server Keys
+	private String accessKey = "[ server access key ]";
+	private String secretKey = "[ server secret key ]";
+	
+	
+	private String url = "https://vws.vuforia.com";
+
+	private void getSummary() throws URISyntaxException, ClientProtocolException, IOException {
+		HttpGet getRequest = new HttpGet();
+		HttpClient client = new DefaultHttpClient();
+		getRequest.setURI(new URI(url + "/summary"));
+		setHeaders(getRequest);
+		
+		HttpResponse response = client.execute(getRequest);
+		System.out.println(EntityUtils.toString(response.getEntity()));
+	}
+	
+	private void setHeaders(HttpUriRequest request) {
+		SignatureBuilder sb = new SignatureBuilder();
+		request.setHeader(new BasicHeader("Date", DateUtils.formatDate(new Date()).replaceFirst("[+]00:00$", "")));
+		request.setHeader("Authorization", "VWS " + accessKey + ":" + sb.tmsSignature(request, secretKey));
+	}
+
+	public static void main(String[] args) throws URISyntaxException, ClientProtocolException, IOException {
+		Summary g = new Summary();
+		g.getSummary();
+	}
+}
+

+ 106 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/TargetState.java

@@ -0,0 +1,106 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class TargetState {
+
+	private String 	m_status;
+	private String 	m_targetId;
+	private Boolean m_activeFlag;
+	private String 	m_name;
+	private Float  	m_width;
+	private Integer m_trackingRating;
+	private String 	m_recoRating;
+	
+	public boolean hasState = false;
+	
+	public String getStatus() {
+		return m_status;
+	}
+	
+	public void setStatus(String status) {
+		m_status = status;
+	}
+	
+	public String getTargetId() {
+		return m_targetId;
+	}
+	
+	public void setTargetId(String tid) {
+		m_targetId = tid;
+	}
+	
+	public Boolean getActiveFlag() {
+		return m_activeFlag;
+	}
+	
+	public void setActiveFlag(Boolean active) {
+		m_activeFlag = active;
+	}
+	
+	public String getName() {
+		return m_name;
+	}
+	
+	public void setName(String name) {
+		m_name = name;
+	}
+	
+	public Float getWidth() {
+		return m_width;
+	}
+	
+	public void setWidth(Float width) {
+		m_width = width;
+	}
+	
+	public Integer getTrackingRating() {
+		return m_trackingRating;
+	}
+	
+	public void setTrackingRating(Integer rating) {
+		m_trackingRating = rating;
+	}
+	
+	public String getRecoRating() {
+		return m_recoRating;
+	}
+	
+	public void setRecoRating(String rating) {
+		m_recoRating = rating;
+	}
+	
+	public static TargetState createFromJSON(JSONObject jobj) {
+		if (jobj == null) {
+			throw new IllegalArgumentException("Failed to create TargetState from JSON object: JSON object may not be null!");
+		}
+		
+		TargetState result = new TargetState();
+		result.hasState = true;
+			
+		try {
+			result.setStatus( jobj.getString("status") );
+				
+			JSONObject targetRecord = jobj.getJSONObject("target_record");
+				
+			result.setTargetId( targetRecord.getString("target_id") );
+				
+			if( targetRecord.has("active_flag" ) )// not mandatory
+				result.setActiveFlag( targetRecord.getBoolean("active_flag"));
+				
+			result.setName( targetRecord.getString("name"));
+			result.setWidth( (float) targetRecord.getDouble("width") );
+			result.setTrackingRating( targetRecord.getInt("tracking_rating") );
+				
+			if( targetRecord.has("reco_rating") )// not mandatory
+				result.setRecoRating( targetRecord.getString("reco_rating") );
+			
+			return result;
+				
+		} catch (JSONException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+}

+ 6 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/TargetStatusListener.java

@@ -0,0 +1,6 @@
+package com.izouma.awesomeadmin.vuforia;
+
+public interface TargetStatusListener {
+
+	public void OnTargetStatusUpdate(TargetState targetState);
+}

+ 130 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/TargetStatusPoller.java

@@ -0,0 +1,130 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.ParseException;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.cookie.DateUtils;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+
+
+public class TargetStatusPoller {
+
+	//Server Keys
+	private String accessKey;
+	private String secretKey;
+		
+	private String targetId;
+	private String url = "https://vws.vuforia.com";
+	
+	private TargetStatusListener targetStatusListener;
+	
+	private Timer timer;
+	private PollerTask pollerTask;
+	private boolean continuePolling = true;
+	private float intervalInMinutes;
+	
+	public TargetStatusPoller(float interval_minutes, String target_id, String server_access_key, String server_secret_key, TargetStatusListener target_listener){
+		intervalInMinutes   = interval_minutes;
+		targetId 			= target_id;
+		accessKey 			= server_access_key;
+		secretKey 			= server_secret_key;
+		targetStatusListener = target_listener;
+		
+		timer = new Timer();
+	}
+	
+	public void startPolling() {
+		System.out.println("Initiate polling for target: " +  targetId);
+		
+		pollerTask = new PollerTask();
+		timer.schedule(pollerTask , (long)(intervalInMinutes * 60 * 1000));
+	}
+	
+	public void stopPolling() {
+		continuePolling = false;
+		pollerTask.cancel();// Terminate pending tasks
+		timer.cancel();//Terminate the timer thread
+	}
+	
+ 
+	private void pollAgain() {
+		if (continuePolling){
+			System.out.println(".. polling again .. ");
+			
+			pollerTask = new PollerTask();
+			timer.schedule(pollerTask , (long)(intervalInMinutes * 60 * 1000));
+		}
+	}
+
+
+    class PollerTask extends TimerTask {
+        public void run() {
+        	try {
+            	TargetState targetState = TargetState.createFromJSON( getTarget() );
+				
+				targetStatusListener.OnTargetStatusUpdate( targetState );
+				
+			} catch ( URISyntaxException | IOException e) {
+				timer.cancel();
+				e.printStackTrace();
+				return;
+			}
+
+            pollAgain();
+        }
+    }
+
+	
+	private JSONObject getTarget() throws URISyntaxException, ClientProtocolException, IOException {
+		
+		System.out.println("Getting target record for " + targetId );
+		
+		HttpGet getRequest = new HttpGet();
+		HttpClient client = new DefaultHttpClient();
+		getRequest.setURI(new URI(url + "/targets/" + targetId));
+		setHeaders(getRequest);
+		
+		HttpResponse response = client.execute(getRequest);
+		
+		JSONObject getTargetResultJSON = null;
+		
+		if( response != null ){
+			
+			try {
+				
+				getTargetResultJSON =  new JSONObject( EntityUtils.toString(response.getEntity()) );
+				
+			} catch (ParseException | JSONException e) {
+				e.printStackTrace();
+			}
+			
+		}
+		
+		System.out.println("getTarget() = "+ getTargetResultJSON.toString());
+		
+		return getTargetResultJSON;
+	}
+	
+	
+	private void setHeaders(HttpUriRequest request) {
+		SignatureBuilder sb = new SignatureBuilder();
+		request.setHeader(new BasicHeader("Date", DateUtils.formatDate(new Date()).replaceFirst("[+]00:00$", "")));
+		request.setHeader("Authorization", "VWS " + accessKey + ":" + sb.tmsSignature(request, secretKey));
+	}
+}

+ 66 - 0
src/main/java/com/izouma/awesomeadmin/vuforia/UpdateTarget.java

@@ -0,0 +1,66 @@
+package com.izouma.awesomeadmin.vuforia;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.cookie.DateUtils;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+
+
+
+//See the Vuforia Web Services Developer API Specification - https://developer.vuforia.com/resources/dev-guide/updating-target-cloud-database
+
+public class UpdateTarget {
+
+	//Server Keys
+	private String accessKey = "[ server access key ]";
+	private String secretKey = "[ server secret key ]";
+		
+	private String targetId = "[ target id ]";
+	private String url = "https://vws.vuforia.com";
+
+	private void updateTarget() throws URISyntaxException, ClientProtocolException, IOException, JSONException {
+		HttpPut putRequest = new HttpPut();
+		HttpClient client = new DefaultHttpClient();
+		putRequest.setURI(new URI(url + "/targets/" + targetId));
+		JSONObject requestBody = new JSONObject();
+		
+		setRequestBody(requestBody);
+		putRequest.setEntity(new StringEntity(requestBody.toString()));
+		setHeaders(putRequest); // Must be done after setting the body
+		
+		HttpResponse response = client.execute(putRequest);
+		System.out.println(EntityUtils.toString(response.getEntity()));
+	}
+	
+	private void setRequestBody(JSONObject requestBody) throws IOException, JSONException {
+		//requestBody.put("active_flag", true); // Optional
+		requestBody.put("application_metadata", Base64.encodeBase64String("Vuforia test metadata".getBytes())); // Optional
+	}
+	
+	private void setHeaders(HttpUriRequest request) {
+		SignatureBuilder sb = new SignatureBuilder();
+		request.setHeader(new BasicHeader("Date", DateUtils.formatDate(new Date()).replaceFirst("[+]00:00$", "")));
+		request.setHeader(new BasicHeader("Content-Type", "application/json"));
+		request.setHeader("Authorization", "VWS " + accessKey + ":" + sb.tmsSignature(request, secretKey));
+	}
+	
+	public static void main(String[] args) throws URISyntaxException, ClientProtocolException, IOException, JSONException {
+		UpdateTarget u = new UpdateTarget();
+		u.updateTarget();
+	}
+}

+ 1 - 1
src/main/vue/src/pages/ArContent.vue

@@ -9,7 +9,7 @@
       </el-form-item>
       <el-form-item prop="type" label="类别">
         <el-select v-model="formData.type" placeholder="请选择">
-          <el-option v-for="item in arContentType" :key="item.id" :label="item.typeName" :value="item.id"></el-option>
+          <el-option v-for="item in arContentType" :key="item.id" :label="item.typeName" :value="String(item.id)"></el-option>
         </el-select>
         <!-- <el-input v-model="formData.type" :disabled="'type'==subColumn"></el-input> -->
       </el-form-item>

+ 36 - 0
src/main/vue/src/pages/ArContents.vue

@@ -132,6 +132,41 @@
           </el-col>
         </el-row>
 
+        <el-row :gutter="20" v-if="item.type=='1005'" type="flex" justify="space-between">
+          <el-col :span="8">
+            <el-form ref="form" :model="item" label-width="80px">
+              <el-form-item label="商品图片">
+                <single-upload v-model="item.image"></single-upload>
+                <el-input v-model="item.image" placeholder="图片Url"></el-input>
+              </el-form-item>
+              <el-form-item label="商品介绍">
+                <el-input v-model="item.remark1"></el-input>
+              </el-form-item>
+              <el-form-item label="商品价格">
+                <el-input v-model="item.remark2"></el-input>
+              </el-form-item>
+              <el-form-item label="促销价格">
+                <el-input v-model="item.remark3"></el-input>
+              </el-form-item>
+            </el-form>
+          </el-col>
+          <el-col :span="16">
+            <el-card shadow="never">
+              <div slot="header" class="clearfix">
+                <span>{{item.name}}</span>
+              </div>
+              <el-row :gutter="50">
+                <el-col :span="12" class="img" :style="{backgroundImage:'url('+item.image+')'}"></el-col>
+                <el-col class="right" :span="10">
+                  <div style="color:#666;font-size:14px;" :style="{textAlign:item.remark1?'left':'center'}">{{item.remark1?item.remark1:'请输入店铺简介'}}</div>
+                  <el-button type="text" v-if="item.remark2" @click="$router.push(item.remark2)">点击进入官网</el-button>
+                </el-col>
+              </el-row>
+            </el-card>
+          </el-col>
+        </el-row>
+
+
         <el-row :gutter="20" v-else-if="item.type=='1002'" type="flex" justify="space-between">
           <el-col :span="8">
             <el-form ref="form" :model="item" label-width="80px">
@@ -206,6 +241,7 @@
 
         <el-button type="primary" style="margin:70px 0 0;float:right" plain size="small"  @click="save">保存/下一步</el-button>
          <el-button @click="deleteRow(item)" style="margin:70px 10px 0 0;float:right;" size="small" type="danger" plain>删除</el-button>
+         <el-button @click="editRow(item)" style="margin:70px 10px 0 0;float:right;"  type="primary" size="small" plain>编辑</el-button>
       </el-tab-pane>
     </el-tabs>
     <el-dialog title="高级查询" :visible.sync="showAdvancedQueryDialog">

+ 1 - 1
src/main/webapp/WEB-INF/html/admin.html

@@ -1 +1 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=referrer content=origin><title>管理后台</title><link rel=icon href=/static/favicon.ico><script src=/static/polyfill.min.js></script><script src=/static/fontawesome-v5.2.0.js></script><link href=/static/css/admin.eb583e038dac766357afd066a3ae3cba.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.7629aae42177c2964081.js></script><script type=text/javascript src=/static/js/vendor.730b17a063bb56e0ad66.js></script><script type=text/javascript src=/static/js/admin.bbcd292633c7208d1eec.js></script></body></html>
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=referrer content=origin><title>管理后台</title><link rel=icon href=/static/favicon.ico><script src=/static/polyfill.min.js></script><script src=/static/fontawesome-v5.2.0.js></script><link href=/static/css/admin.f410ef1458acf0f0da3c5b42bf0e2dde.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.e3c80c7892a4337688d9.js></script><script type=text/javascript src=/static/js/vendor.631c08d5fc0f22d7ee46.js></script><script type=text/javascript src=/static/js/admin.134b1979ede75d50d3ec.js></script></body></html>

+ 1 - 1
src/main/webapp/WEB-INF/html/loginAdmin.html

@@ -1 +1 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=referrer content=origin><title>管理后台</title><link rel=icon href=/static/favicon.ico><script src=/static/polyfill.min.js></script><link href=/static/css/loginAdmin.a1de29a9f9c1d5b671b1965892c17dd1.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.7629aae42177c2964081.js></script><script type=text/javascript src=/static/js/vendor.730b17a063bb56e0ad66.js></script><script type=text/javascript src=/static/js/loginAdmin.1c2ae6d4ea697a050874.js></script></body></html>
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=referrer content=origin><title>管理后台</title><link rel=icon href=/static/favicon.ico><script src=/static/polyfill.min.js></script><link href=/static/css/loginAdmin.a1de29a9f9c1d5b671b1965892c17dd1.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.e3c80c7892a4337688d9.js></script><script type=text/javascript src=/static/js/vendor.631c08d5fc0f22d7ee46.js></script><script type=text/javascript src=/static/js/loginAdmin.c9cb308e894a7cd72b31.js></script></body></html>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/css/admin.f410ef1458acf0f0da3c5b42bf0e2dde.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/16.987d0bf83c68a2127fdd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/17.a6b6ae680d7c5d49f457.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/18.b46970569aebcce912e2.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/18.b4791dd219c5975b0abc.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/35.444d017f53ef1f93f9b0.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/36.3abc3886147e7fd17908.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/36.d58da56f10c544043e3e.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/39.9f84388a3250b1be1d57.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/40.c7767385ec898fe97f51.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/41.f2e49a4b20e50a7da5c0.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/42.5b117eee1585032f9dec.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/43.1e9ebcadcbc6de132cfc.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/44.a0c32ccca3a95b32510e.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/45.fd217051f9176c7678c1.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/46.3f8e4e884a4e03630040.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/47.be89b076546d547af1ef.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/48.bca49af8c5113a5bf2e7.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/49.bda3a3258e9c359199f6.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/50.a7bad43cde203ea3c497.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/51.dabe3a865e4f94b4a7de.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/52.34fbfc63bd085a5163ec.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/52.5802ec3accc94f44c5c1.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/53.9d6fc0e5ddbc7c5bcb4f.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/54.ced9850d306397e6e986.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/55.83ae3a45742c17e44064.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/56.6fc88b94ab0256bd28d5.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/57.4dec55beb4f928694dc9.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/58.06e65f9dac38510f42d3.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/59.6ca44cde46341483a946.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/60.0bb128c3e65cb63308b9.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/61.237e1f68d89aff70c0ac.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/62.e28de9bfc4f878c6c887.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/63.8362280a6306c3b6a451.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/64.089cb3a730b790e96d3b.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/65.24f0801e491a08ee4cc6.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/66.d37dbd2c1f345b1d15e3.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/67.34681c98cb1e9edc8747.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/68.5261c219aa3f428364c7.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/68.7bfb17ac1f4a2f9b7e44.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/69.92a33ab7f3380577c1a3.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/70.5984017fd9e0aac59bd0.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/71.58ded689cce7a0eac667.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/72.ad623c2851f090359ab0.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/73.c734478abe2a9ede0738.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/74.27e1d72eef1d649605d3.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/75.865f0e00b5e7ae198913.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/76.fe175405ed84fb558dbb.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/77.35d06053bcd9ea36a705.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/78.18a9082f74a1c91c38c4.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/79.0dd81dadf3e4720f181d.js


+ 1 - 1
src/main/webapp/static/js/78.c7b2f44abe1a1e7c0db3.js → src/main/webapp/static/js/80.3bdedfaa542338e8c9ea.js

@@ -1 +1 @@
-webpackJsonp([78],{"5LNU":function(e,t){},Wh3M:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("el-form",{ref:"form",staticStyle:{"max-width":"500px"},attrs:{model:e.formData,rules:e.rules,"label-width":"80px","label-position":"right",size:"small"}},[a("el-form-item",{attrs:{prop:"dataruleName",label:"权限名称"}},[a("el-input",{model:{value:e.formData.dataruleName,callback:function(t){e.$set(e.formData,"dataruleName",t)},expression:"formData.dataruleName"}})],1),e._v(" "),a("el-form-item",{attrs:{prop:"permission",label:"权限标识"}},[a("el-input",{model:{value:e.formData.permission,callback:function(t){e.$set(e.formData,"permission",t)},expression:"formData.permission"}})],1),e._v(" "),a("el-form-item",[a("el-button",{attrs:{loading:e.$store.state.fetchingData,type:"primary"},on:{click:e.onSave}},[e._v("保存")]),e._v(" "),a("el-button",{on:{click:function(t){e.$router.go(-1)}}},[e._v("取消")])],1)],1)],1)},staticRenderFns:[]};var s=a("VU/8")({created:function(){var e=this;this.$route.query.id&&this.$http.get({url:"/sysDatarule/getOne",data:{id:this.$route.query.id}}).then(function(t){t.success&&(e.formData=t.data)})},data:function(){return{saving:!1,formData:{},rules:{dataruleName:[{required:!0,message:"请填写权限名称",trigger:"blur"}],permission:[{required:!0,message:"请填写权限标识",trigger:"blur"}]},menus:[]}},methods:{onSave:function(){var e=this;this.$refs.form.validate(function(t){if(!t)return!1;e.submit()})},submit:function(){var e=this;this.$http.post({url:this.formData.id?"/sysDatarule/update":"/sysDatarule/save",data:this.formData}).then(function(t){t.success?(e.$message.success("成功"),e.$router.go(-1)):e.$message.warning("失败")})}}},r,!1,function(e){a("5LNU")},"data-v-3122cd72",null);t.default=s.exports}});
+webpackJsonp([80],{"5LNU":function(e,t){},Wh3M:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("el-form",{ref:"form",staticStyle:{"max-width":"500px"},attrs:{model:e.formData,rules:e.rules,"label-width":"80px","label-position":"right",size:"small"}},[a("el-form-item",{attrs:{prop:"dataruleName",label:"权限名称"}},[a("el-input",{model:{value:e.formData.dataruleName,callback:function(t){e.$set(e.formData,"dataruleName",t)},expression:"formData.dataruleName"}})],1),e._v(" "),a("el-form-item",{attrs:{prop:"permission",label:"权限标识"}},[a("el-input",{model:{value:e.formData.permission,callback:function(t){e.$set(e.formData,"permission",t)},expression:"formData.permission"}})],1),e._v(" "),a("el-form-item",[a("el-button",{attrs:{loading:e.$store.state.fetchingData,type:"primary"},on:{click:e.onSave}},[e._v("保存")]),e._v(" "),a("el-button",{on:{click:function(t){e.$router.go(-1)}}},[e._v("取消")])],1)],1)],1)},staticRenderFns:[]};var s=a("VU/8")({created:function(){var e=this;this.$route.query.id&&this.$http.get({url:"/sysDatarule/getOne",data:{id:this.$route.query.id}}).then(function(t){t.success&&(e.formData=t.data)})},data:function(){return{saving:!1,formData:{},rules:{dataruleName:[{required:!0,message:"请填写权限名称",trigger:"blur"}],permission:[{required:!0,message:"请填写权限标识",trigger:"blur"}]},menus:[]}},methods:{onSave:function(){var e=this;this.$refs.form.validate(function(t){if(!t)return!1;e.submit()})},submit:function(){var e=this;this.$http.post({url:this.formData.id?"/sysDatarule/update":"/sysDatarule/save",data:this.formData}).then(function(t){t.success?(e.$message.success("成功"),e.$router.go(-1)):e.$message.warning("失败")})}}},r,!1,function(e){a("5LNU")},"data-v-3122cd72",null);t.default=s.exports}});

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/81.6112b7d26133caf7eda5.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/82.d491bcff520020dbbf1e.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/83.2bd2b9f4ea15a6194084.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/84.6fdd4d4287401f6383c1.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/85.ea1129198d76fda6f642.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/86.57bfe057200606446d88.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/87.4ab56990a8ff96e7e119.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/88.4e852a1e3d5b3e884c41.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/88.76e641a42e62161c04e0.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/89.ba88d526ec2ff01cd8bf.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/90.2aaa73a57f8018ca044a.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/91.1d167176677faaf8ec30.js


+ 1 - 1
src/main/webapp/static/js/90.08047936b79cfa23df60.js → src/main/webapp/static/js/92.8e823bf932c2bb84a735.js

@@ -1 +1 @@
-webpackJsonp([90],{izdZ:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});r("NYxO");var i={created:function(){this.getIframeSrc()},data:function(){return{iframeSrc:"/404"}},computed:{height:function(){return window.innerHeight-104+"px"}},methods:{getIframeSrc:function(){this.iframeSrc=this.$route.query.code}},watch:{$route:function(){this.getIframeSrc()}}},n={render:function(){var t=this.$createElement;return(this._self._c||t)("iframe",{staticClass:"iframe",attrs:{src:this.iframeSrc,height:this.height,width:"100%"}})},staticRenderFns:[]};var c=r("VU/8")(i,n,!1,function(t){r("xnY9")},"data-v-04168182",null);e.default=c.exports},xnY9:function(t,e){}});
+webpackJsonp([92],{izdZ:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});r("NYxO");var i={created:function(){this.getIframeSrc()},data:function(){return{iframeSrc:"/404"}},computed:{height:function(){return window.innerHeight-104+"px"}},methods:{getIframeSrc:function(){this.iframeSrc=this.$route.query.code}},watch:{$route:function(){this.getIframeSrc()}}},n={render:function(){var t=this.$createElement;return(this._self._c||t)("iframe",{staticClass:"iframe",attrs:{src:this.iframeSrc,height:this.height,width:"100%"}})},staticRenderFns:[]};var c=r("VU/8")(i,n,!1,function(t){r("xnY9")},"data-v-04168182",null);e.default=c.exports},xnY9:function(t,e){}});

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/93.6de35fe8a18629c5553b.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/94.3b5abed914f8bf10cd85.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/admin.134b1979ede75d50d3ec.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/admin.bbcd292633c7208d1eec.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/loginAdmin.c9cb308e894a7cd72b31.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/manifest.7629aae42177c2964081.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/manifest.e3c80c7892a4337688d9.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/main/webapp/static/js/vendor.631c08d5fc0f22d7ee46.js


Некоторые файлы не были показаны из-за большого количества измененных файлов