<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: SKY-HaYaTo</title>
    <description>The latest articles on Forem by SKY-HaYaTo (@skyhayato).</description>
    <link>https://forem.com/skyhayato</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2881333%2Fafa074ff-489a-417c-9d9b-7efa47ed3074.png</url>
      <title>Forem: SKY-HaYaTo</title>
      <link>https://forem.com/skyhayato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/skyhayato"/>
    <language>en</language>
    <item>
      <title>How to create Login Form with Next.js and integrate with Django API</title>
      <dc:creator>SKY-HaYaTo</dc:creator>
      <pubDate>Sat, 31 May 2025 12:23:29 +0000</pubDate>
      <link>https://forem.com/skyhayato/how-to-create-login-form-with-nextjs-and-integrate-with-django-api-4c3i</link>
      <guid>https://forem.com/skyhayato/how-to-create-login-form-with-nextjs-and-integrate-with-django-api-4c3i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article, we will learn how to create login form and integrate between client side and server side.&lt;/p&gt;

&lt;p&gt;Client side is created by Next.js which is made from Javascript(JS) and often used as a full stack web framework across the world.Next.js is incorporated as virtual DOM and highly flexble for expanding any function for web developers.For more developing a rich app, many and amazing modules are now created by communities for Next.js. Inaddition, Next.js is accepted for a large-scale development.&lt;/p&gt;

&lt;p&gt;On the server side, I selected Django which is created by Python and is incorporated as web MVC framework. For simpley code, Python is supported many developers and communiites for Python are very active in the wrold.Web frameworks created by python, have Django, Flask, Fast API and Bottle. Django is oftenly used for a large-scale development as well as Next.js.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Implement client side with Next.js and TypeScript&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, I started to implement frontend side with TypsScript wich is alterbnative as Javascript and is known as type-safety programming language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;【frontend/app/generalUsers/registration/page.tsx】&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'use client'
import { useState } from "react"
import { useRouter } from "next/navigation"
import { useForm } from "react-hook-form"
import axios from "axios"
import { error } from "console"
import { CldImage } from "next-cloudinary"
import { CldUploadWidget } from "next-cloudinary"

export default function Registration(){
    const router = useRouter();

    const defaultValues = {
        Id:'',
        Name:'',
        Email:'',
        Password:'',
        Department:'',
        DepartmentPhone:''
    }

    const {register,handleSubmit,formState:{errors}} = useForm({
        defaultValues
    })
    const [id,setId] = useState('');
    const [name,setName] = useState('');
    const [image,setImage] = useState&amp;lt;File | null&amp;gt;(null);
    const [email,setEmail] = useState('');
    const [password,setPassword] = useState('');
    const [department,setDepartment] = useState('');
    const [departmentPhone,setDeepartmentPhone] = useState('');


    const onSubmit = async(data:any)=&amp;gt;{
        try {
            const formData = new FormData();
            formData.append('generalUserId',id);
            formData.append('generalUserName',name);
            setImage(null);
            formData.append('generalUserImage',"aa");
            formData.append('generalUserEmail', email);
            formData.append('generalUserPassword', password);
            formData.append('generalUserDepartment', department);
            formData.append('generalUserDepartmentPhone', departmentPhone);

            const response = await axios.post('http://127.0.0.1:8000/generalusers/registergeneralusers/', formData);

            if (response.status !== 201) {
                alert('User has not been registered.');
                return;
            }

            alert('Successfully registered user');
            console.log(response.data);
        } catch (error) {
            console.log('Error uploading image or submitting user data:', error);
            alert('Error uploading image or submitting user data.');
        }
    };

    return (
        &amp;lt;div&amp;gt;
            &amp;lt;form onSubmit={handleSubmit(onSubmit)}&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;label&amp;gt;ID&amp;lt;/label&amp;gt;
                        &amp;lt;input
                            type="text"
                            className="border border-gray-500 rounded-md px-4 py-4"
                            defaultValue={defaultValues.Id}
                            {...register('Id',{
                                required:'ID must be required'
                            })}
                            onChange={(e)=&amp;gt;setId(e.target.value)}
                        /&amp;gt;
                        &amp;lt;div className="text-rose-500"&amp;gt;{errors.Id?.message}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;label&amp;gt;Name&amp;lt;/label&amp;gt;
                        &amp;lt;input
                            type="text"
                            className="border border-gray-500 rounded-md px-4 py-4"
                            defaultValue={defaultValues.Name}
                            {...register('Name',{
                                required:'Name must be required.'
                            })}
                            onChange={(e)=&amp;gt;setName(e.target.value)}
                        /&amp;gt;
                        &amp;lt;div className="text-rose-500"&amp;gt;{errors.Name?.message}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;label&amp;gt;Email&amp;lt;/label&amp;gt;
                        &amp;lt;input
                            type="email"
                            className="border border-gray-500 rounded-md px-4 py-4"
                            defaultValue={defaultValues.Email}
                            {...register('Email',{
                                required:'Mail address must be required.'
                            })}
                            onChange={(e)=&amp;gt;setEmail(e.target.value)}
                        /&amp;gt;
                        &amp;lt;div className="text-rose-500"&amp;gt;{errors.Email?.message}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;label&amp;gt;Password&amp;lt;/label&amp;gt;
                        &amp;lt;input
                            type="password"
                            className="border border-gray-500 rounded-md px-4 py-4"
                            defaultValue={defaultValues.Password}
                            {...register('Password',{
                                required:'Password must be required.'
                            })}
                            onChange={(e)=&amp;gt;setPassword(e.target.value)}
                        /&amp;gt;
                        &amp;lt;div className="text-rose-500"&amp;gt;{errors.Password?.message}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;label&amp;gt;Department&amp;lt;/label&amp;gt;
                        &amp;lt;input
                            type="text"
                            className="border border-gray-500 rounded-md px-4 py-4"
                            defaultValue={defaultValues.Department}
                            {...register('Department',{
                                required:'Department must be required.'
                            })}
                            onChange={(e)=&amp;gt;setDepartment(e.target.value)}
                        /&amp;gt;
                        &amp;lt;div className="text-rose-500"&amp;gt;{errors.Department?.message}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;label&amp;gt;Department Phone&amp;lt;small&amp;gt;Direct Phone&amp;lt;/small&amp;gt;&amp;lt;/label&amp;gt;
                        &amp;lt;input
                            type="text"
                            className="border border-gray-500 rounded-md px-4 py-4"
                            defaultValue={defaultValues.DepartmentPhone}
                            {...register('DepartmentPhone',{
                                required:'DepartmentPhone must be required.'
                            })}
                            onChange={(e)=&amp;gt;setDeepartmentPhone(e.target.value)}
                        /&amp;gt;
                        &amp;lt;div className="text-rose-500"&amp;gt;{errors.DepartmentPhone?.message}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;button
                        type="submit"
                        className="bg bg-blue-500 rounded-md text-white px-4 py-4"
                    &amp;gt;
                        Register
                    &amp;lt;/button&amp;gt;
                    &amp;lt;button
                        type="button"
                        className="bg bg-green-500 rounded-md text-white px-4 py-4"
                    &amp;gt;
                        BackToTopPage
                    &amp;lt;/button&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/form&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Implement server side with Django&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, implement server side using Django. We need to create three files including models.py, serializer.py, views.py and urls.py.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;【backend/generalusers/models.py】&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.db import models

# Create your models here.
class GeneralUsers(models.Model):
    generalUserId = models.CharField(blank=False,null=False)
    generalUserName = models.CharField(blank=False,null=False)
    generalUserImage = models.CharField(blank=True,null=True)
    generalUserEmail = models.CharField(blank=False,null=False)
    generalUserPassword = models.CharField(blank=False,null=False)
    generalUserDepartment = models.CharField(blank=False,null=False)
    generalUserDepartmentPhone = models.CharField(blank=False,null=False)

    def __str__(self):
        return self.generalUserId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;【backend/generalusers/serializer.py】&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from rest_framework import serializers
from .models import GeneralUsers
from django.contrib.auth.hashers import make_password

class GeneralUsersSerializer(serializers.ModelSerializer):
    class Meta:
        model = GeneralUsers
        fields = ['generalUserId','generalUserName','generalUserImage','generalUserEmail','generalUserPassword','generalUserDepartment','generalUserDepartmentPhone']

    #generalUserImage = serializers.ImageField(required=False, allow_null=True)

    def create(self,validated_data):
        password = validated_data['generalUserPassword']
        hashed_password = make_password(password)
        validated_data['generalUserPassword'] = hashed_password

        return super().create(validated_data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;【backend/generalusers/views.py】&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#from django.shortcuts import render
from .models import GeneralUsers
from .serializers import GeneralUsersSerializer
from rest_framework import viewsets
from rest_framework.decorators import api_view #追加
from rest_framework.response import Response # 追加
from rest_framework import status #追加
from django.db import transaction # 追加
from django.contrib.auth.hashers import make_password #追加
from django.core.exceptions import ObjectDoesNotExist #Add
from django.contrib.auth.hashers import check_password #Add
from .serializers import GeneralUsersSerializer
# Create your views here.

class GeneralUsersViewSet(viewsets.ModelViewSet):
    queryset = GeneralUsers.objects.all()
    serializer_class = GeneralUsersSerializer

@api_view(['POST'])
def create_general_user(request):
    if request.method == 'POST':
        with transaction.atomic():
            serializer = GeneralUsersSerializer(data=request.data)
            if serializer.is_valid():
                password = serializer.validated_data['password']
                hashed_password = make_password(password)

                serializer.validated_data['generalUserPassword'] = hashed_password
                if serializer.is_valid():
                    serializer.save()
                    return Response(serializer.data,status=status.HTTP_201_CREATED)
                else:
                    return Response(serializer.errors,status=status.HTTP_500_INTERNAL_SERVER_ERROR)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;【backend/generalusers/urls.py】&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from django.urls import path,include
from .views import GeneralUsersViewSet #Add
from rest_framework.routers import DefaultRouter
#from .views import GeneralUsersViewSet

router = DefaultRouter()
router.register('registergeneralusers',GeneralUsersViewSet,basename='create_general_user')

urlpatterns =[
    path('',include(router.urls))
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The description for integrating between Next.js and Django, is end.&lt;/p&gt;

&lt;p&gt;Thank you for reading my article.&lt;/p&gt;

&lt;p&gt;Have a nice coding !!&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>nextjs</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Nuxt3 form validation on client side with Yup</title>
      <dc:creator>SKY-HaYaTo</dc:creator>
      <pubDate>Fri, 30 May 2025 15:51:19 +0000</pubDate>
      <link>https://forem.com/skyhayato/nuxt3-form-validation-on-client-side-with-yup-3hl6</link>
      <guid>https://forem.com/skyhayato/nuxt3-form-validation-on-client-side-with-yup-3hl6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br&gt;
In this article, we will learn that how to implement Nuxt3 form validation on client side with Yup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yup is a schema builder for runtime value parsing and validation. As you might know, there are some schema validation moduldes like Yup, Zod and so on.&lt;/p&gt;

&lt;p&gt;By using these validation modules, we are not able to enhance effiency of web development but also decrease cost of programming. Also, modules can make web developers with your teams integrate coding rules and improve maintenace for expanding functions.&lt;/p&gt;

&lt;p&gt;From the perspective vies of enhancing and maintaning programs, thse modules are supported and used for many web companies, and the community of using these library are active across ther world.&lt;/p&gt;

&lt;p&gt;Yup as well as Zod is hightly flexible to customize valiation and error message on client side.&lt;/p&gt;

&lt;p&gt;In addition, the code rule of validation is simple and easy to understand for web developers.&lt;/p&gt;

&lt;p&gt;Yup module is managed for npm and yarn, and it is able to use both Nuxt3 and Next.js.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sample image for Nuxt3 app&lt;/strong&gt;&lt;br&gt;
The goal of this page is to validate Nuxt3 form like this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If we click submit button before not input values and select radio button, checkbox, Yup validation will be active and show error message on client side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0b8a7bzu84xo9n0259eo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0b8a7bzu84xo9n0259eo.png" alt="Image description" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The below picture is to display validate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9b9scp8af1tcy6b8pgi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9b9scp8af1tcy6b8pgi.png" alt="Image description" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Install module of Yup&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I used to install Yup module by npm.&lt;/p&gt;

&lt;p&gt;The Official web site for Yup is below link.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/yup" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.npmjs.com/package/yup" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/yup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install in Nuxt3 app, input command line like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i yup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How to use in Nuxt3 app&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After installing Yup module, import module information in nuxt3 file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as yup from 'yup';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full code is below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;frontend/pages/navigation/nabigation.vue&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script setup lang="ts"&amp;gt;
import { ref } from 'vue';
import { useField, useForm } from 'vee-validate';
import * as yup from 'yup';
import axios from 'axios';
import { useRouter } from 'vue-router';

const formRef = ref(null);
const { handleSubmit } = useForm();

const router = useRouter();

/*---Name validation---*/
const nameField = useField(
  'name',
  yup.string().required('Name must be required.').min(2, 'Please input over 1 character.')
);
const { value: name, errorMessage: nameerror } = nameField;

/*---Email validation---*/
const emailField = useField(
  'email',
  yup.string().required('Email must be required.').matches(/^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@([a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$/, { message: 'Mail address is invalid' })
);
const { value: email, errorMessage: emailerror } = emailField;

/*---Password validation---*/
const passwordField = useField(
  'password',
  yup.string().required('Password must be required.').min(2, 'Please input over 1 character.').max(11, 'The password is too long. Please input until 10 characters.')
);
const { value: password, errorMessage: passworderror } = passwordField;

/*---Gender validation---*/
const genderField = useField(
  'gender',
  yup.string().required('Gender must be required.')
);
const { value: gender, errorMessage: gendererror } = genderField;

/*---Survey validation---*/
const surveyField = useField&amp;lt;string[]&amp;gt;(
  'survey',
  yup.array().of(yup.string()).min(1, 'Please choose at least one.'),
  {initialValue:[]} // 配列の長さが1以上であることを確認
);
const { value: survey } = surveyField;

const nameErrorMessage = ref('');
const emailErrorMessage = ref('');
const passwordErrorMessage = ref('');
const genderErrorMessage = ref('');
const surveyErrorMessage = ref('');

/** Set alert bar on header */
const globalError = ref('');
const showAlert = ref(false);

/** Define formData validate flag */
const flagForValidate = ref(true);

const surveyOptions = [
  'I want to know from News letters', 
  'I want to know from Campaign', 
  'I want to know from Events'
];

const onSubmit = async()=&amp;gt;{

 try{
  /** Initialize validate flag. */
  flagForValidate.value = true;
  /** Hidden alert display */
  showAlert.value = false;
  /** Initialize error message */
  nameErrorMessage.value = '';
  emailErrorMessage.value = '';
  passwordErrorMessage.value = '';
  genderErrorMessage.value = '';
  surveyErrorMessage.value = '';

  /** Define FormData object */
  const formData = new FormData();

  /** Validate value of name if name is empty or not. */
  if(name.value === '' || name.value === undefined){
    nameErrorMessage.value = 'Please input your name.';
    /** Update value of flag */
    flagForValidate.value = false;
  }
  formData.append('name',name.value);

  /** Validate value of email if email is empty or not. */
  if(email.value === '' || email.value === undefined){
    emailErrorMessage.value = 'Please input your email.';
    /** Update value of flag */
    flagForValidate.value = false;
  }
  formData.append('email',email.value);

  /** Validate value of password if password is empty or not. */
  if(password.value === '' || password.value === undefined){
    passwordErrorMessage.value = 'Please input your password.';
    /** Update value of flag */
    flagForValidate.value = false;
  }
  formData.append('password',password.value);

  /** Validate value of gender if gender is empty or not. */
  if(gender.value === '' || gender.value === undefined){
    genderErrorMessage.value = 'Please input your gender.';
    /** Update value of flag */
    flagForValidate.value = false;
  }
  formData.append('gender',gender.value);

  /** Validate value of gender if gender is empty or not. */
  if(survey.value.length === 0 || survey.value === undefined){
    surveyErrorMessage.value = 'Please input your survey.';
    /** Update value of flag */
    flagForValidate.value = false;
  }

  /** Evaluate value of flag:if this is false,show alert message on header.*/
  if(!flagForValidate.value){
    showAlert.value = true;
    globalError.value = 'Invalide some values on the form.Please confirm and input data.';
    return;
  }

  formData.append('survey',JSON.stringify(survey.value));
  console.log('survey.value:', survey.value);
  console.log(...formData.entries());

  const response = await axios.post('http://localhost:8000/api/creategeneraluser/',formData);
  if(response.status === 201){
    alert('Sucess');
    console.log(response);
    router.push('/dashboard/dashboard');
  }else{
    alert('&amp;gt;&amp;gt;');

  }
 }catch(error){
  alert('error');
  console.log(error);
 }

}

//const router = useRouter();
const clickBackToTopPage = () =&amp;gt; {
  router.push('/');
};
&amp;lt;/script&amp;gt;

&amp;lt;template&amp;gt;
  &amp;lt;v-app&amp;gt;
    &amp;lt;v-alert
    v-if="showAlert"
    :text="globalError"
    type="error"
    title="Invalide Error"
    class="mt-2 mb-4"
    border="start"
    variant="tonal"
    color="error"
    icon="$error"
    prominent
  &amp;gt;&amp;lt;/v-alert&amp;gt;
    &amp;lt;v-main&amp;gt;
      &amp;lt;v-container class="mt-5"&amp;gt;
        &amp;lt;v-form @submit.prevent="onSubmit" ref="formRef"&amp;gt;
          &amp;lt;!-- Name --&amp;gt;
          &amp;lt;v-text-field
            v-model="name"
            label="Name"
            required
          &amp;gt;&amp;lt;/v-text-field&amp;gt;
          &amp;lt;span&amp;gt;{{ nameerror }}&amp;lt;/span&amp;gt;
          &amp;lt;span style="color:red;"&amp;gt;{{ nameErrorMessage }}&amp;lt;/span&amp;gt;

          &amp;lt;!-- Mail Address --&amp;gt;
          &amp;lt;v-text-field
            v-model="email"
            label="Email"
            type="email"
            required
          &amp;gt;&amp;lt;/v-text-field&amp;gt;
          &amp;lt;p&amp;gt;{{ emailerror }}&amp;lt;/p&amp;gt;
          &amp;lt;span style="color:red;"&amp;gt;{{ emailErrorMessage }}&amp;lt;/span&amp;gt;

          &amp;lt;!-- Password --&amp;gt;
          &amp;lt;v-text-field
            v-model="password"
            label="Password"
            type="password"
            required
          &amp;gt;&amp;lt;/v-text-field&amp;gt;
          &amp;lt;p&amp;gt;{{ passworderror }}&amp;lt;/p&amp;gt;
          &amp;lt;span style="color:red;"&amp;gt;{{ passwordErrorMessage }}&amp;lt;/span&amp;gt;

          &amp;lt;!-- Gender (radio button) --&amp;gt;
          &amp;lt;v-radio-group
            v-model="gender"
            label="Sex"
            row
          &amp;gt;
            &amp;lt;v-radio label="man" value="man"&amp;gt;&amp;lt;/v-radio&amp;gt;
            &amp;lt;v-radio label="woman" value="woman"&amp;gt;&amp;lt;/v-radio&amp;gt;
            &amp;lt;v-radio label="other" value="other"&amp;gt;&amp;lt;/v-radio&amp;gt;
          &amp;lt;/v-radio-group&amp;gt;
          &amp;lt;p&amp;gt;{{ gendererror }}&amp;lt;/p&amp;gt;
          &amp;lt;span style="color:red;"&amp;gt;{{ genderErrorMessage }}&amp;lt;/span&amp;gt;
          &amp;lt;br/&amp;gt;
          &amp;lt;!-- Survey (checkboxes) --&amp;gt;
          &amp;lt;v-label&amp;gt;Survey&amp;lt;/v-label&amp;gt;
          &amp;lt;v-row&amp;gt;
            &amp;lt;v-col cols="12" v-for="option in surveyOptions" :key="option"&amp;gt;
              &amp;lt;v-checkbox
                :label="option"
                :value="option"
                v-model="survey"
                hide-details
              /&amp;gt;
            &amp;lt;/v-col&amp;gt;
          &amp;lt;/v-row&amp;gt;
          &amp;lt;span style="color:red;"&amp;gt;{{ surveyErrorMessage }}&amp;lt;/span&amp;gt;
          &amp;lt;br/&amp;gt;
          &amp;lt;!--
          &amp;lt;v-selection-group v-model="survey" multiple&amp;gt;
            &amp;lt;v-checkbox
              v-for="option in surveyOptions"
              :key="option"
              :label="option"
              :value="option"&amp;gt;
            &amp;lt;/v-checkbox &amp;gt;
          &amp;lt;/v-selection-group&amp;gt;
          &amp;lt;p&amp;gt;{{ surveyerror }}&amp;lt;/p&amp;gt;
          --&amp;gt;

          &amp;lt;!-- Submit button --&amp;gt;
          &amp;lt;v-btn type="submit" color="primary" class="mr-4"&amp;gt;Register&amp;lt;/v-btn&amp;gt;
          &amp;lt;v-btn type="button" color="success" @click="clickBackToTopPage"&amp;gt;BackToTopPage&amp;lt;/v-btn&amp;gt;
        &amp;lt;/v-form&amp;gt;
      &amp;lt;/v-container&amp;gt;
    &amp;lt;/v-main&amp;gt;
  &amp;lt;/v-app&amp;gt;
&amp;lt;/template&amp;gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The description of Nuxt3 form validation with yup, is end.&lt;br&gt;
Thank you for reading my article.&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>vue</category>
      <category>typescript</category>
      <category>vuetify</category>
    </item>
    <item>
      <title>How to delete data using golang web framework Beego?</title>
      <dc:creator>SKY-HaYaTo</dc:creator>
      <pubDate>Wed, 26 Feb 2025 13:36:19 +0000</pubDate>
      <link>https://forem.com/skyhayato/how-to-delete-data-using-golang-web-framework-beego-4lg7</link>
      <guid>https://forem.com/skyhayato/how-to-delete-data-using-golang-web-framework-beego-4lg7</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;Beego&lt;/code&gt; is one of golang web frameworks including &lt;code&gt;Gin&lt;/code&gt;,&lt;code&gt;Echo&lt;/code&gt;,&lt;code&gt;Revel&lt;/code&gt; and &lt;code&gt;Iris&lt;/code&gt;. One of them, &lt;code&gt;Beego&lt;/code&gt; is full stack framework and suitable to version of golang.In addition, &lt;code&gt;Beego&lt;/code&gt; recruts MVC model which is used as a large scale development project. We know representative of MVC frameworks are &lt;code&gt;C# ASP.Net Core&lt;/code&gt;,&lt;code&gt;Ruby onRails&lt;/code&gt;,&lt;code&gt;Laravel&lt;/code&gt; and &lt;code&gt;Spring Boot&lt;/code&gt;.These tools are also used large projects.&lt;br&gt;
in this article,today, I introduce process that Deleting one recored from PostgreSQL using &lt;code&gt;Beego&lt;/code&gt;, it is one of CRUD process.&lt;/p&gt;
&lt;h1&gt;
  
  
  Directory of Beego project
&lt;/h1&gt;

&lt;p&gt;Directory of my project is as below.&lt;br&gt;
You can see like &lt;code&gt;MVC&lt;/code&gt;model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Make Frontend Pages
&lt;/h1&gt;

&lt;p&gt;Now,I make delete page using &lt;code&gt;.tpl&lt;/code&gt; which is Beego default templateengine.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;views/mytodo/myTaskDelete.tpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;title&amp;gt;Task Delete&amp;lt;/title&amp;gt;
    &amp;lt;!--Common Library--&amp;gt;
    &amp;lt;link rel="stylesheet" href="/static/lib/bootstrap/css/bootstrap.min.css"/&amp;gt;
    &amp;lt;script type="text/javascript" src="/static/lib/jquery/jquery.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;!--Personal Files--&amp;gt;
    &amp;lt;script type="text/javascript" src="/static/js/taskDelete.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;form enctype="multipart/form-data"&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;input type="hidden" id="registerId" name="registerId" value="" /&amp;gt;
                &amp;lt;input type="hidden" id="taskId" name="taskId" value="" /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-3"&amp;gt;
                &amp;lt;label&amp;gt;タスク名&amp;lt;/label&amp;gt;
                &amp;lt;input type="text" id="myTask" name="myTask" class="form-control border border-dark" value="" required /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-3"&amp;gt;
                &amp;lt;label&amp;gt;タスク詳細&amp;lt;/label&amp;gt;
                &amp;lt;textarea class="form-control" id="myTaskDescription" name="myTaskDescription" rows="3"&amp;gt;&amp;lt;/textarea&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-3"&amp;gt;
                &amp;lt;label&amp;gt;優先度&amp;lt;/label&amp;gt;
                &amp;lt;select id="myTaskPriority" name="myTaskPriority" class="form-select form-select-lg mb-3"&amp;gt;
                    &amp;lt;option&amp;gt;--選択してください&amp;lt;small&amp;gt;Please select.&amp;lt;/small&amp;gt;--&amp;lt;/option&amp;gt;
                    &amp;lt;option value="1"&amp;gt;高&amp;lt;small&amp;gt;High&amp;lt;/small&amp;gt;&amp;lt;/option&amp;gt;
                    &amp;lt;option value="2"&amp;gt;中&amp;lt;small&amp;gt;Middle&amp;lt;/small&amp;gt;&amp;lt;/option&amp;gt;
                    &amp;lt;option value="3"&amp;gt;低&amp;lt;small&amp;gt;Small&amp;lt;/small&amp;gt;&amp;lt;/option&amp;gt;
                &amp;lt;/select&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-2"&amp;gt;
                &amp;lt;button id="todoDelete" class="btn btn-primary" type="button"&amp;gt;
                    削除&amp;lt;small&amp;gt;Delete&amp;lt;/small&amp;gt;
                &amp;lt;/button&amp;gt;
                &amp;lt;button id="backToTopPage" class="btn btn-secondary" type="button"&amp;gt;
                    一覧に戻る&amp;lt;small&amp;gt;Back to TaskList&amp;lt;/small&amp;gt;
                &amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finishing HTML files, then make functions like asynchronous using &lt;code&gt;Javascript&lt;/code&gt; and &lt;code&gt;jQuery&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;static/js/taskDelete.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$(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);
            }
        });                
    });

});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Make Backend Page
&lt;/h1&gt;

&lt;p&gt;Completing frontend files, finally,I make server side.&lt;/p&gt;

&lt;p&gt;Firstly,I make routing.&lt;br&gt;
&lt;code&gt;routers/router.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package routers

import (
    "my-first-beego-project/controllers"

    "github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &amp;amp;controllers.MainController{})
    //追加
    beego.Router("/sub", &amp;amp;controllers.SubController{}) //beego.Router("/sub", &amp;amp;controllers.SubController{})
    beego.Router("/:id", &amp;amp;controllers.ThirdController{})
    beego.Router("/controllers/user", &amp;amp;controllers.UserController{})
    beego.Router("/login", &amp;amp;controllers.LoginController{})
    beego.Router("/controllers/login", &amp;amp;controllers.LoginController{})
    beego.Router("/mytodo/addTodo", &amp;amp;controllers.TodoCreateController{})
    beego.Router("/controllers/todoAdd", &amp;amp;controllers.TodoAddController{})
    // GetTasksアクションのためのルーティング追加
    beego.Router("/controllers/sub/getTasks", &amp;amp;controllers.SubController{}, "get:GetTasks")
    beego.Router("/mytodo/myTodoEdit", &amp;amp;controllers.TodoEditController{})
    beego.Router("/controllers/selectEditTodo", &amp;amp;controllers.TodoEditController{}, "get:GetTargetEditTask")
    beego.Router("/controllers/updateTask", &amp;amp;controllers.TodoUpdateController{})
    beego.Router("/mytodo/myTodoDelete", &amp;amp;controllers.TodoDeleteController{})
    beego.Router("/controllers/selectDeleteTodo", &amp;amp;controllers.TodoDestroyController{}, "get:GetTargetTask")
    beego.Router("/controllers/taskDestroy", &amp;amp;controllers.TargetTodoDeleteController{})
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, make &lt;code&gt;controllers&lt;/code&gt;&lt;br&gt;
&lt;code&gt;controllers/default.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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 = &amp;amp;models.Register{}

    //Begin Transaction
    tx, err := o.Begin()
    _, err = tx.Delete(&amp;amp;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")

}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>go</category>
      <category>beego</category>
      <category>postgres</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How Relation with tpl and Html on VSCode?</title>
      <dc:creator>SKY-HaYaTo</dc:creator>
      <pubDate>Fri, 21 Feb 2025 14:19:10 +0000</pubDate>
      <link>https://forem.com/skyhayato/how-relation-with-tpl-and-html-on-vscode-11a9</link>
      <guid>https://forem.com/skyhayato/how-relation-with-tpl-and-html-on-vscode-11a9</guid>
      <description>&lt;p&gt;Hi,Guys! &lt;br&gt;
I'm Kohei,a Software Engineer in Japan.&lt;/p&gt;

&lt;p&gt;I am talking about a function of VSCode.&lt;/p&gt;

&lt;h1&gt;
  
  
  Today's Topic is...
&lt;/h1&gt;

&lt;p&gt;Now, The Topic is about Relationship with these extension &lt;code&gt;.tpl&lt;/code&gt; and &lt;code&gt;.html&lt;/code&gt; on Visual Studio Code(VSCode).&lt;/p&gt;

&lt;p&gt;Extension &lt;code&gt;.tpl&lt;/code&gt; is often used in Web Framework of PHP.&lt;/p&gt;

&lt;p&gt;Recently, I develop personal Web apps using &lt;code&gt;Golang&lt;/code&gt; and &lt;code&gt;Beego&lt;/code&gt; which is one of Web MVC Frameworks of Golang.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Beego&lt;/code&gt; is generally used &lt;code&gt;.tpl&lt;/code&gt; as template engine.So, I need to make VSCode recognize &lt;code&gt;.tpl&lt;/code&gt; extension like &lt;code&gt;.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this article, you do'nt install any plugins with &lt;code&gt;.tpl&lt;/code&gt;,but revide &lt;code&gt;settings.json&lt;/code&gt; on VSCode.&lt;/p&gt;

&lt;p&gt;It's a very Simple away!   &lt;/p&gt;

&lt;p&gt;VSCode is the most popular Free IDE and used in the world.&lt;br&gt;
An one of nice functions on the IDE is to relation variaty of extension.&lt;/p&gt;

&lt;p&gt;As my memorandom and shrering with you,I have decited to write the article.&lt;/p&gt;

&lt;p&gt;Ok,Now,Let's explanation!&lt;/p&gt;

&lt;h1&gt;
  
  
  How to use the function...?
&lt;/h1&gt;

&lt;p&gt;In conclution, only 3 steps is completed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start VSCode and Click Prompt Screen
&lt;/h2&gt;

&lt;p&gt;Top of the VSCode is set &lt;code&gt;prompt screen&lt;/code&gt;(as a below picture).&lt;br&gt;
You click on cursor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa952fu7dgsln3ojaio2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa952fu7dgsln3ojaio2b.png" alt="Image description" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Input Value of &lt;code&gt;Setting.json&lt;/code&gt; in the screen
&lt;/h2&gt;

&lt;p&gt;Next,You need to input the value &lt;code&gt;setting.json&lt;/code&gt;.&lt;br&gt;
If maybe you continue to type &lt;code&gt;setting.json&lt;/code&gt;, key intellisence will start and display some canditates including &lt;code&gt;setings.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When you see the word,click it!&lt;/p&gt;

&lt;p&gt;Then target page will transition to &lt;code&gt;settings.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67es0vyz4q972rnq8z4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67es0vyz4q972rnq8z4z.png" alt="Image description" width="800" height="29"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Revision Settings.json File
&lt;/h2&gt;

&lt;p&gt;When display &lt;code&gt;settings.json&lt;/code&gt;,you will type String of sentense (below the capture).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n9da2i2znjge2f1rgyd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n9da2i2znjge2f1rgyd.png" alt="Image description" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You input the senetences,please save the revision.&lt;/p&gt;

&lt;p&gt;From now, we can relationship with &lt;code&gt;.tpl&lt;/code&gt; and &lt;code&gt;.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's all!&lt;/p&gt;

&lt;p&gt;Have a nice programming!&lt;/p&gt;

&lt;p&gt;`&lt;/p&gt;

</description>
      <category>go</category>
      <category>beego</category>
      <category>tpl</category>
      <category>html</category>
    </item>
    <item>
      <title>Introduce My Self !</title>
      <dc:creator>SKY-HaYaTo</dc:creator>
      <pubDate>Wed, 19 Feb 2025 14:34:03 +0000</pubDate>
      <link>https://forem.com/skyhayato/introduce-my-self--3ail</link>
      <guid>https://forem.com/skyhayato/introduce-my-self--3ail</guid>
      <description>&lt;p&gt;Hi, Guys!&lt;br&gt;
It's Kouhei, a software engineer in Japan.&lt;/p&gt;

&lt;p&gt;Now, this article is my first challenge, so I will introduce my career.&lt;/p&gt;

&lt;p&gt;At this time, I work as an engineer.&lt;br&gt;
My skills are divided into four sections, as listed below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Frontend Developer
Skills:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;HTML, CSS, JavaScript, TypeScript&lt;br&gt;
React (Next.js)&lt;br&gt;
Vue.js (Nuxt.js)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Backend Developer
Skills:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Java (Spring Framework)&lt;br&gt;
C# (ASP.NET Core, Entity Framework)&lt;br&gt;
PHP (Laravel, CakePHP, Symfony)&lt;br&gt;
Golang (Echo, Beego)&lt;br&gt;
Ruby on Rails&lt;br&gt;
Python (Django)&lt;br&gt;
VB.NET&lt;br&gt;
Excel VBA&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Database
Skills:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PostgreSQL&lt;br&gt;
SQL Server&lt;br&gt;
MySQL (MariaDB)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cloud
AWS (Amazon Web Services) – Currently a beginner, so I'm studying!
I'm studying these skills every day. In addition, to enjoy talking about these topics with people around the world, I am also studying languages (English, French, Spanish, and Indonesian).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Through this article, I hope to improve my language skills, not just in English but also in other languages.&lt;/p&gt;

&lt;p&gt;Looking forward to your responses!&lt;/p&gt;

&lt;p&gt;See you next time! Bye!&lt;/p&gt;

</description>
      <category>java</category>
      <category>go</category>
      <category>nextjs</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How to insert and update Data Golang Web App with Beego?</title>
      <dc:creator>SKY-HaYaTo</dc:creator>
      <pubDate>Wed, 19 Feb 2025 14:28:16 +0000</pubDate>
      <link>https://forem.com/skyhayato/introduce-my-self--23dh</link>
      <guid>https://forem.com/skyhayato/introduce-my-self--23dh</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;Beego&lt;/code&gt;is a web application framework made from base on Golang,and this is often used as large development projects.&lt;br&gt;
You know that there are some web frameworks using golang like &lt;code&gt;Gin&lt;/code&gt;,&lt;code&gt;Echo&lt;/code&gt;,&lt;code&gt;revel&lt;/code&gt;,&lt;code&gt;Beego&lt;/code&gt; and &lt;code&gt;iris&lt;/code&gt;,and many apps are releasing today.&lt;br&gt;
In personal development, I choose &lt;code&gt;Beego&lt;/code&gt; because of a simple architechture.&lt;br&gt;
The framework is accepted as &lt;code&gt;MVC model&lt;/code&gt; which is suitable to develop  huge project web applications.&lt;br&gt;
In addition,Making &lt;code&gt;Beego&lt;/code&gt; project is very simple, only one command to produce project.&lt;br&gt;
In this article, I am developing TaskApp including to update data using PostgreSQL.&lt;/p&gt;
&lt;h1&gt;
  
  
  Derectory of In may &lt;code&gt;Beego&lt;/code&gt; project.
&lt;/h1&gt;

&lt;p&gt;My project directory as below.&lt;br&gt;
&lt;code&gt;M(Model)&lt;/code&gt;: Model classes.&lt;br&gt;
&lt;code&gt;V(Views)&lt;/code&gt;:View classs including template engine.&lt;br&gt;
&lt;code&gt;C(Controllers)&lt;/code&gt;:Controller class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Make Frontend Page
&lt;/h1&gt;

&lt;p&gt;Firstry,I make frontend page using templatenengine &lt;code&gt;.tpl&lt;/code&gt;.&lt;br&gt;
If you want to update data,like making &lt;code&gt;form&lt;/code&gt; and send using &lt;code&gt;POST method&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;views/myTodo/myTodoEdit.tpl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;Todo編集&amp;lt;/title&amp;gt;
        &amp;lt;!--共通--&amp;gt;
        &amp;lt;link rel="stylesheet" type="text/css" href="/static/lib/bootstrap/css/bootstrap.min.css"/&amp;gt;
        &amp;lt;script type="text/javascript" src="/static/lib/jquery/jquery.js"&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;!--個別--&amp;gt;
        &amp;lt;script type="text/javascript" src="/static/js/taskEdit.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;form enctype="multipart/form-data"&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;input type="hidden" id="registerId" name="registerId" value=""/&amp;gt;
                &amp;lt;input type="hidden" id="taskId" name="taskId" value=""/&amp;gt;                
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-3"&amp;gt;
                &amp;lt;label&amp;gt;タスク名&amp;lt;/label&amp;gt;
                &amp;lt;input type="text" id="myTask" name="myTask" class="form-control border border-dark" value="" required /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-3"&amp;gt;
                &amp;lt;label&amp;gt;タスク詳細&amp;lt;/label&amp;gt;
                &amp;lt;textarea class="form-control" id="myTaskDescription" name="myTaskDescription" rows="3"&amp;gt;&amp;lt;/textarea&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-3"&amp;gt;
                &amp;lt;label&amp;gt;優先度&amp;lt;/label&amp;gt;
                &amp;lt;select id="myTaskPriority" name="myTaskPriority" class="form-select form-select-lg mb-3" aria-label=".form-select-lg"&amp;gt;
                    &amp;lt;option&amp;gt;-- 選択してください --&amp;lt;/option&amp;gt;
                    &amp;lt;option value="1"&amp;gt;高&amp;lt;/option&amp;gt;
                    &amp;lt;option value="2"&amp;gt;中&amp;lt;/option&amp;gt;
                    &amp;lt;option value="3"&amp;gt;低&amp;lt;/option&amp;gt;
                &amp;lt;/select&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-2"&amp;gt;
                &amp;lt;label&amp;gt;タスク画像&amp;lt;/label&amp;gt;
                &amp;lt;input type="file" id="myTaskImage" name="myTaskImage" class="form-control border border-dark" /&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="form-group mb-2" class="btn btn-primary"&amp;gt;
                &amp;lt;button id="todoEdit" class="btn btn-primary" type="button"&amp;gt;
                    更新
                &amp;lt;/button&amp;gt;
                &amp;lt;button id="backToTopPage" class="btn btn-secondary" type="button"&amp;gt;
                    一覧に戻る
                &amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sending &lt;code&gt;Formdata&lt;/code&gt; to server using HTTP method &lt;code&gt;POST&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;static/js/todoEdit.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$(document).ready(function(){
    //SessionStorageからユーザIDを取得する
    const userId = sessionStorage.getItem("userId");

    //一覧画面に戻るボタンを押下した時の処理
    $('#backToTopPage').on('click',function(){
        location.replace(`/sub?userid=${userId}`);
    });

    /**
     * ---------------------------------------
     * URLクエリパラメータからタスクIDを取得する
     * ---------------------------------------
     */
    // URLのクエリ文字列を取得する
    const queryString = window.location.search;
    // URLSearchParamsオブジェクトを作成してクエリ文字列を解析する
    const param = new URLSearchParams(queryString);
    // 特定のパラメータの値を取得する
    document.getElementById("taskId").value = param.get("taskId");
    //タスクIDを変数に格納する
    const taskId = param.get("taskId");

    $.ajax({
        url:`/controllers/selectEditTodo?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(response[0].TaskPriority === "3"){
                taskPriority.options[3].selected = true;
            }

        },
        error:function(response){
            console.log(response);
            alert('データを取得できませんでした。');
        }
    });

    //更新ボタン押下時の処理
    $('#todoEdit').on('click',function(e){
        //デフォルトのイベントを防止する処理
        e.preventDefault();

        //フォームデータを作成する
        let formData = new FormData();
        formData.append("registerId",$('#registerId').val());
        formData.append("taskId",$("#taskId").val());
        formData.append("taskName",$('#myTask').val());
        formData.append("taskDescription",$('#myTaskDescription').val());
        formData.append("taskpriority",$('#myTaskPriority').val());
        formData.append("taskImage",$('#myTaskImage')[0].files[0]);

        $.ajax({
            url:"/controllers/updateTask",
            method:"POST",
            data:formData,
            processData:false,
            contentType:false,
            success:function(response){
                console.log(response);
            },
            error:function(response){
                alert("Update is success.");
                console.log(response);
            }
        });
    });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Make Backend
&lt;/h1&gt;

&lt;p&gt;Data sent from frontend, is processed by server using &lt;code&gt;golang&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I make &lt;code&gt;Controller&lt;/code&gt; class in &lt;code&gt;default.go&lt;/code&gt; class.&lt;br&gt;
In Beego, &lt;code&gt;Controller&lt;/code&gt; class is make as below.&lt;br&gt;
First, we need to write &lt;code&gt;struct&lt;/code&gt; , and then make process you want to.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;controllers/default.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type TodoUpdateController struct {
    beego.Controller
}

func (c *TodoUpdateController) Post() {
    // Accept from Screen data
    registerId := c.GetString("registerId")
    taskId := c.GetString("taskId")
    taskName := c.GetString("taskName")
    taskDescription := c.GetString("taskDescription")
    taskPriority := c.GetString("taskpriority")

    fmt.Println("RegisterId which is accepted from Browser, is ", registerId)
    fmt.Println("TaskId which is accepted from Browser, is", taskId)
    fmt.Println("TaskName which is accepted from Browser, is ", taskName)
    fmt.Println("TaskDescription which is accepted from Browser", taskDescription)
    fmt.Println("TaskPriority which is accepted from browser,is ", taskPriority)

    //Upload a file which is accepted from browser
    f, h, err := c.GetFile("taskImage")
    if err != nil {
        fmt.Println("File error", err)
        c.Ctx.ResponseWriter.WriteHeader(500)
        c.Ctx.WriteString("Try to upload a files is Failed.")
        return
    }
    defer f.Close()

    //Decition of storage file path
    uploadPath := "static/upload"
    err = os.MkdirAll(uploadPath, os.ModePerm)

    if err != nil {
        fmt.Println("Try to save a file is Failed", err)
        c.Ctx.ResponseWriter.WriteHeader(500)
        c.Ctx.WriteString("Fail to save a file.")
        return
    }

    //Save taskImage after getting image
    fileName := h.Filename
    savepath := filepath.Join(uploadPath, fileName)

    //Save taskImage after getting image
    outFile, err := os.Create(savepath)

    if err != nil {
        fmt.Println("ファイル保存エラー", err)
        c.Ctx.ResponseWriter.WriteHeader(500)
        c.Ctx.WriteString("fail to save a file")
        return
    }

    defer outFile.Close()

    _, err = outFile.ReadFrom(f)
    if err != nil {
        fmt.Println("fail to write to a File")
        c.Ctx.ResponseWriter.WriteHeader(500)
        c.Ctx.WriteString("Fails to write to a file.")
        return
    }

    //Debug program]
    fmt.Println("Saved a file name is ", fileName)

    //Generate Instance of Orm
    o := orm.NewOrm()

    //Generate Instance of Task
    var updateTask models.Task
    //Initialize Register Model
    updateTask.Register = &amp;amp;models.Register{}

    //Begin Transactions
    tx, err := o.Begin()
    numTaskId, _ := strconv.ParseInt(taskId, 10, 64)
    numRegisterId, _ := strconv.ParseInt(registerId, 10, 64)

    updateTask.TaskId = numTaskId
    updateTask.TaskName = taskName
    updateTask.TaskDescription = taskDescription
    updateTask.TaskPriority = taskPriority
    updateTask.TaskImage = "http://localhost:8080/static/upload/" + fileName
    updateTask.Register.Id = numRegisterId

    _, err = tx.Update(&amp;amp;updateTask)

    if err != nil {
        tx.Rollback()
        fmt.Println("Error Exception was started.")
        c.Data["json"] = map[string]string{
            "status":  "Fail to Insert.",
            "message": "Fail to insert updated Task Information.",
        }
        c.ServeJSON()
        return
    }

    err = tx.Commit()

    if err != nil {
        fmt.Println("Fail to TransactionCommit.")
        c.Data["json"] = map[string]string{
            "status":  "fail to Transaction",
            "message": "Fail to Transaction(Insert)",
        }
        c.ServeJSON()
        return
    }

    c.Ctx.ResponseWriter.WriteHeader(500)
    c.Ctx.WriteString("Success to update task.")
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>go</category>
      <category>beego</category>
      <category>javascript</category>
      <category>jquery</category>
    </item>
  </channel>
</rss>
