Introduction
Beego
is one of golang web frameworks including Gin
,Echo
,Revel
and Iris
. One of them, Beego
is full stack framework and suitable to version of golang.In addition, Beego
recruts MVC model which is used as a large scale development project. We know representative of MVC frameworks are C# ASP.Net Core
,Ruby onRails
,Laravel
and Spring Boot
.These tools are also used large projects.
in this article,today, I introduce process that Deleting one recored from PostgreSQL using Beego
, it is one of CRUD process.
Directory of Beego project
Directory of my project is as below.
You can see like MVC
model.
MY-FIRST-BEEGO-PROJECT
├─ conf
│ └─ app.conf
├─ controllers
│ └─ default.go
├─ crypt
│ └─ crypt.go
├─ models
│ └─ todo.go
├─ routers
│ └─ router.go
└─ static
├─ css
├─ img
├─ js
│ ├─ form.js
│ ├─ login.js
│ ├─ reload.min.js
│ ├─ todoCreate.js
│ ├─ todoCard.js
│ └─ todoList.js
├─ lib
│ └─ bootstrap
│ ├─ css
│ │ ├─ bootstrap-grid.min.css
│ │ └─ bootstrap.min.css
│ ├─ js
│ │ ├─ bootstrap-bundle.min.js
│ │ └─ bootstrap.min.js
│ ├─ jquery
│ │ └─ jquery.js
│ └─ upload
├─ views
│ ├─ mytodo
│ │ ├─ addTodo.tpl
│ │ └─ myList.tpl
│ ├─ index.tpl
│ ├─ subIndex.tpl
│ └─ thirdIndex.tpl
└─ main.go
Make Frontend Pages
Now,I make delete page using .tpl
which is Beego default templateengine.
views/mytodo/myTaskDelete.tpl
<!DOCTYPE html>
<html>
<title>Task Delete</title>
<!--Common Library-->
<link rel="stylesheet" href="/static/lib/bootstrap/css/bootstrap.min.css"/>
<script type="text/javascript" src="/static/lib/jquery/jquery.js"></script>
<!--Personal Files-->
<script type="text/javascript" src="/static/js/taskDelete.js"></script>
<body>
<form enctype="multipart/form-data">
<div>
<input type="hidden" id="registerId" name="registerId" value="" />
<input type="hidden" id="taskId" name="taskId" value="" />
</div>
<div class="form-group mb-3">
<label>タスク名</label>
<input type="text" id="myTask" name="myTask" class="form-control border border-dark" value="" required />
</div>
<div class="form-group mb-3">
<label>タスク詳細</label>
<textarea class="form-control" id="myTaskDescription" name="myTaskDescription" rows="3"></textarea>
</div>
<div class="form-group mb-3">
<label>優先度</label>
<select id="myTaskPriority" name="myTaskPriority" class="form-select form-select-lg mb-3">
<option>--選択してください<small>Please select.</small>--</option>
<option value="1">高<small>High</small></option>
<option value="2">中<small>Middle</small></option>
<option value="3">低<small>Small</small></option>
</select>
</div>
<div class="form-group mb-2">
<button id="todoDelete" class="btn btn-primary" type="button">
削除<small>Delete</small>
</button>
<button id="backToTopPage" class="btn btn-secondary" type="button">
一覧に戻る<small>Back to TaskList</small>
</button>
</div>
</form>
</body>
</html>
Finishing HTML files, then make functions like asynchronous using Javascript
and jQuery
.
static/js/taskDelete.js
$(document).ready(function(){
//Get userId from session storage.
const userId = sessionStorage.getItem("userId");
//let inputValueuserId = document.getElementById("userId");
//inputValueuserId.value = userId;
//Click "BackToList" Button and it's process
$('#backToTopPage').on('click',function(){
location.replace(`/sub?userid=${userId}`);
});
/**
* Get from URL query Param.
*/
//Get string query from URL param
const queryString = window.location.search;
//Create URL SearchParams object and analize it's sentences.
const param = new URLSearchParams(queryString);
//Get targetParam from variant data of param.
document.getElementById("taskId").value = param.get("taskId");
//Input targetDat in variant value "taskId"
const taskId = param.get("taskId");
$.ajax({
url:`/controllers/selectDeleteTodo?taskid=${taskId}`,
method:"Get",
success:function(response){
console.log(response);
const registerId = document.getElementById("registerId");
registerId.value = response[0].Register.Id;
const taskId = document.getElementById("taskId");
taskId.value = response[0].TaskId;
const taskName = document.getElementById("myTask");
taskName.value = response[0].TaskName;
const taskDescription = document.getElementById("myTaskDescription");
taskDescription.value = response[0].TaskDescription;
const taskPriority = document.getElementById("myTaskPriority");
if(response[0].TaskPriority === "1"){
taskPriority.options[1].selected = true;
}
if(response[0].TaskPriority === "2"){
taskPriority.options[2].selected = true;
}
if(taskPriority.options[3].selected = true){
taskPriority.options[3].selected = true;
}
},
error:function(response){
console.log(response);
}
});
//The process which delete button is clicked.
$('#todoDelete').on('click',function(e){
e.preventDefault();
//Get taskId
const targetTaskId = document.getElementById('taskId').value;
$.ajax({
url:`/controllers/taskDestroy?taskid=${targetTaskId}`,
method:'DELETE',
pcocessData:false,
contentType:false,
success:function(response){
console.log(response);
},
error:function(response){
console.log(response);
}
});
});
});
Make Backend Page
Completing frontend files, finally,I make server side.
Firstly,I make routing.
routers/router.go
package routers
import (
"my-first-beego-project/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
//追加
beego.Router("/sub", &controllers.SubController{}) //beego.Router("/sub", &controllers.SubController{})
beego.Router("/:id", &controllers.ThirdController{})
beego.Router("/controllers/user", &controllers.UserController{})
beego.Router("/login", &controllers.LoginController{})
beego.Router("/controllers/login", &controllers.LoginController{})
beego.Router("/mytodo/addTodo", &controllers.TodoCreateController{})
beego.Router("/controllers/todoAdd", &controllers.TodoAddController{})
// GetTasksアクションのためのルーティング追加
beego.Router("/controllers/sub/getTasks", &controllers.SubController{}, "get:GetTasks")
beego.Router("/mytodo/myTodoEdit", &controllers.TodoEditController{})
beego.Router("/controllers/selectEditTodo", &controllers.TodoEditController{}, "get:GetTargetEditTask")
beego.Router("/controllers/updateTask", &controllers.TodoUpdateController{})
beego.Router("/mytodo/myTodoDelete", &controllers.TodoDeleteController{})
beego.Router("/controllers/selectDeleteTodo", &controllers.TodoDestroyController{}, "get:GetTargetTask")
beego.Router("/controllers/taskDestroy", &controllers.TargetTodoDeleteController{})
}
Then, make controllers
controllers/default.go
type TargetTodoDeleteController struct {
beego.Controller
}
func (c *TargetTodoDeleteController) Delete() {
taskId, err := c.GetInt("taskid")
if err != nil {
fmt.Println("TaskId is not accepted", err)
c.Data["json"] = map[string]string{
"status": "Fail",
"message": "TaskId is not accepted.",
}
c.ServeJSON()
return
}
//Debug
fmt.Println("Accepted TargeDeletetTaskId is ", taskId)
//Generate Instance of Orm
o := orm.NewOrm()
var deleteTask models.Task
//Initialize Register Task
deleteTask.Register = &models.Register{}
//Begin Transaction
tx, err := o.Begin()
_, err = tx.Delete(&models.Task{TaskId: int64(taskId)})
if err != nil {
tx.Rollback()
fmt.Println("Error Exception was happened.")
c.Data["json"] = map[string]string{
"status": "Fail",
"message": "Delete process was failed.",
}
c.ServeJSON()
return
}
err = tx.Commit()
if err != nil {
fmt.Println("Transaction Commit was failed.")
c.Data["json"] = map[string]string{
"status": "fail",
"message": "Transaction Commit was failed.",
}
c.ServeJSON()
return
}
c.Ctx.ResponseWriter.WriteHeader(200)
c.Ctx.WriteString("Task delete was success")
}
Top comments (0)