Browse Source

Implement report form and php script

Fix home page about button
Lucas de Souza 6 years ago
parent
commit
800ead78ae
7 changed files with 181 additions and 39 deletions
  1. 16 6
      package-lock.json
  2. 2 0
      package.json
  3. 79 0
      public/get.php
  4. 3 0
      src/main.js
  5. 76 30
      src/views/BugReport.vue
  6. 2 3
      src/views/Home.vue
  7. 3 0
      vue.config.js

+ 16 - 6
package-lock.json

@@ -1695,6 +1695,15 @@
       "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
       "dev": true
     },
+    "axios": {
+      "version": "0.18.0",
+      "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
+      "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
+      "requires": {
+        "follow-redirects": "^1.3.0",
+        "is-buffer": "^1.1.5"
+      }
+    },
     "babel-code-frame": {
       "version": "6.26.0",
       "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
@@ -4503,7 +4512,6 @@
       "version": "1.5.10",
       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
       "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
-      "dev": true,
       "requires": {
         "debug": "=3.1.0"
       },
@@ -4512,7 +4520,6 @@
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
           "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-          "dev": true,
           "requires": {
             "ms": "2.0.0"
           }
@@ -4520,8 +4527,7 @@
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
         }
       }
     },
@@ -5984,8 +5990,7 @@
     "is-buffer": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-      "dev": true
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
     },
     "is-builtin-module": {
       "version": "1.0.0",
@@ -6272,6 +6277,11 @@
         "topo": "3.x.x"
       }
     },
+    "jquery": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
+      "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
+    },
     "js-levenshtein": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz",

+ 2 - 0
package.json

@@ -8,7 +8,9 @@
     "lint": "vue-cli-service lint"
   },
   "dependencies": {
+    "axios": "^0.18.0",
     "bootstrap-vue": "^2.0.0-rc.11",
+    "jquery": "^3.3.1",
     "vue": "^2.5.17",
     "vue-router": "^3.0.1"
   },

+ 79 - 0
public/get.php

@@ -0,0 +1,79 @@
+<?php
+	if (!isset($_POST['details'])) {
+			http_response_code(400);
+    	exit;
+ 	}
+
+ 	try {
+		// Fazendo login no wekan:
+		$ch = curl_init();
+		curl_setopt($ch, CURLOPT_URL,"http://200.144.254.107/wekan/users/login");
+		curl_setopt($ch, CURLOPT_POST, 1);
+		curl_setopt($ch, CURLOPT_POSTFIELDS,
+		            "username=ivprogsite&password=T2mWR4vNr7tVwpTVR2gS");
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+		$server_output = curl_exec($ch);
+		curl_close ($ch);
+		$dadosLogin = json_decode($server_output);
+
+		if (!$dadosLogin) {
+			throw new Exception();
+		}
+
+		// Preparando o texto para submeter ao wekan:
+		$details = '';
+		if (isset($_POST['name']) && !empty(trim($_POST['name']))) {
+			$details .= 'Nome: ' . strip_tags(trim($_POST['name'])) . '\n';
+		}
+		if (isset($_POST['email']) && !empty(trim($_POST['email']))) {
+			$details .= 'E-mail: ' . strip_tags(trim($_POST['email'])) . '\n';
+		}
+		$details .= 'Detalhes: ' . strip_tags(trim($_POST['details']));
+
+		$summary = '';
+		if (isset($_POST['summary']) && !empty(trim($_POST['summary']))) {
+			$summary = strip_tags(trim($_POST['summary']));
+		}
+		// Fazendo a submissão dos dados para o Wekan:
+		$ch = curl_init();
+		curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+		    'Authorization: Bearer ' . $dadosLogin->token,
+		    'Content-type:application/json'
+		));
+		curl_setopt($ch, CURLOPT_URL,"http://200.144.254.107/wekan/api/boards/v82Wx3C3dk79t4pJw/lists/dHNhYSSyyqWhRn6NX/cards");
+		curl_setopt($ch, CURLOPT_POST, 1);
+		curl_setopt($ch, CURLOPT_POSTFIELDS,
+		            '{ "title": "'.$summary.'", "description": "'.$details.'", "authorId": "'. $dadosLogin->id.'", "swimlaneId": "HeJBje3EdmJ3GpZyb" }');
+		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+		$retorno = curl_exec($ch);
+		curl_close ($ch);
+		$resposta = json_decode($retorno);
+		if (!$resposta->_id) {
+			throw new Exception();
+		}
+	} catch (Exception $ex) {
+		if (isset($_POST['redirect'])) {
+			header('Location:'.$_POST['redirect'].'?error=true');
+	    exit;
+		} else {
+			// send error status instead
+			// header('Location:report.html?error=true');
+			http_response_code(500);
+	    exit;
+		}
+	}
+
+	if (isset($_POST['redirect'])) {
+		header('Location:'.$_POST['redirect'].'?reported=true');
+    exit;
+	} else {
+		// send ok status instead
+		// header('Location:report.html?reported=true');
+		http_response_code(200);
+    exit;
+	}
+
+?>
+
+
+

+ 3 - 0
src/main.js

@@ -3,6 +3,9 @@ import BootstrapVue from 'bootstrap-vue'
 import App from './App.vue'
 import router from './router'
 
+window.$ = require('jquery')
+window.JQuery = require('jquery')
+
 Vue.use(BootstrapVue)
 Vue.config.productionTip = false
 

+ 76 - 30
src/views/BugReport.vue

@@ -14,34 +14,47 @@
           label="Nome:"
           label-for='inputname'
           >
-          <b-form-input
-            type='text'
-            id='inputname'
-            v-model="form.name"
-            v-focus-input>
-          </b-form-input>
+          <b-form-row>
+            <b-col sm='10'>
+              <b-form-input
+                type='text'
+                id='inputname'
+                v-model="form.name"
+                v-focus-input>
+              </b-form-input>
+            </b-col>
+          </b-form-row>
         </b-form-group>
         <b-form-group
           label="E-mail:"
           label-for='inputemail'
           >
-          <b-form-input
-            id='inputemail'
-            type='email'
-            v-model="form.email"
-            >
-          </b-form-input>
+          <b-form-row>
+            <b-col sm='10'>
+              <b-form-input
+                id='inputemail'
+                type='email'
+                v-model="form.email"
+                >
+              </b-form-input>
+            </b-col>
+          </b-form-row>
+          
         </b-form-group>
         <b-form-group
           label="Assunto:"
           label-for='inputsummary'
           >
-          <b-form-input
-            id='inputsummary'
-            type='text'
-            v-model="form.summary"
-            >
-          </b-form-input>
+          <b-form-row>
+            <b-col sm='10'>
+              <b-form-input
+                id='inputsummary'
+                type='text'
+                v-model="form.summary"
+                >
+              </b-form-input>
+            </b-col>
+          </b-form-row>
         </b-form-group>
         <b-form-group
           label="Mensagem*:"
@@ -49,20 +62,28 @@
           :invalid-feedback="invalidDetails"
           :state="detailsNotEmpty"
           >
-          <b-form-textarea
-            id='inputdetails'
-            v-model="form.details"
-            :rows="3"
-            :max-rows="6"
-            :required=true
-            >
-          </b-form-textarea>
+          <b-form-row>
+            <b-col sm='10'>
+              <b-form-textarea
+                id='inputdetails'
+                v-model="form.details"
+                :rows="3"
+                :max-rows="6"
+                :required=true
+                >
+              </b-form-textarea>
+            </b-col>
+          </b-form-row>
         </b-form-group>
         <b-form-group>
           <b-form-row>
-            <b-button :disabled="!detailsNotEmpty" type='submit' variant='primary'>
-              Enviar
-            </b-button>
+            <b-col sm='10' offset-sm='2'>
+              <b-button :disabled="!detailsNotEmpty" type='submit' variant='primary'>
+                Enviar
+              </b-button>&nbsp;
+              <span v-if="reported" class="reported">As informa&ccedil;&otilde;es foram enviadas com sucesso!</span>
+              <span v-if="error" class="error">Ocorreu um erro ao tentar enviar os dados, por favor, tente novamente!</span>
+            </b-col>
           </b-form-row>
         </b-form-group>
       </b-form>
@@ -71,6 +92,7 @@
 </template>
 
 <script>
+import axios from "axios"
 import {FocusInput} from "@/directives/FocusInput"
 
 export default {
@@ -89,19 +111,43 @@ export default {
   },
   data () {
     return {
+      reported: false,
+      error: false,
+      BASE_URL: this.$router.options.base,
       form: {
         name: '',
         email: '',
+        summary: '',
         details: ''
       }
     }
   },
   methods: {
     checkForm (e) {
+      this.reported = false;
+      this.error = false;
+      const outerRef = this;
       e.preventDefault();
       e.stopPropagation();
-      alert(JSON.stringify(this.form));
+      const data = new FormData();
+      data.append('name', this.form.name);
+      data.append('email', this.form.email);
+      data.append('summary', this.form.summary);
+      data.append('details', this.form.details);
+      axios.post('get.php', data).then( () => outerRef.reported = true)
+        .catch(() => outerRef.error = true);
     }
   }
 }
 </script>
+
+<style scoped>
+  .reported {
+    color: green;
+    font-size: 120%;
+  }
+  .error {
+    color: red;
+    font-size: 120%;
+  }
+</style>

+ 2 - 3
src/views/Home.vue

@@ -20,7 +20,7 @@
           A <a href="ivprog1/" title="primeira versao iVProg em Java">primeira versão do <i>iVProg</i></a> foi implementada em <i>Java</i> em 2009.
           </p>
 
-          <a class="btn btn-primary" href="./sobre_ivprog.html" role="button" title="Conheça resumidamente o que é e para que serve o iVProgH.">Saiba mais &raquo;</a>
+          <a class="btn btn-primary" href="/about" role="button" title="Conheça resumidamente o que é e para que serve o iVProgH.">Saiba mais &raquo;</a>
         </div>
       </div>
       <div class="container ivprog-container">
@@ -74,7 +74,6 @@
           </div>
         </div>
       </div>
-
     </main>
 </template>
 
@@ -82,7 +81,7 @@
 
 export default {
   name: 'home',
-  data: function() {
+  data: function () {
     return {BASE_URL: this.$router.options.base};
   }
 }

+ 3 - 0
vue.config.js

@@ -0,0 +1,3 @@
+module.exports = {
+  baseUrl: 'ivp'
+}