Setting Up the Basic Tutor Interface

Welcome to the first lesson of our course on developing a personal tutor web application with DeepSeek and Fiber! In this lesson, we will focus on setting up a basic tutor interface using Fiber (a popular web framework for Go) and HTML. This is an essential step in creating a user-friendly web application that enhances the learning experience. A well-designed interface is crucial for engaging students and ensuring they can interact with the tutor seamlessly.

Basic Tutor Interface Mockup

To help you better visualize the interface we're building, here's a simple mockup of how the tutor web page will look after following the steps in this lesson:

  • The header is at the top, welcoming the user.
  • The messages area is in the center, where the conversation between the student and tutor appears.
  • At the bottom, there is an input field for typing questions, a Send button, and a New Session button.
HTML Rendering with Fiber and Go Templates

Fiber is a fast, minimalist web framework for Go that makes it easy to build web applications. Fiber provides built-in support for serving HTML content using Go's standard html/template package or compatible template engines. This allows you to render dynamic HTML pages by combining static templates with data from your application.

Go's template engine enables you to:

  • Insert dynamic Go variables into HTML
  • Use control structures like loops and conditionals
  • Create reusable template components

By combining Fiber with Go's template engine, you can efficiently generate dynamic HTML content for your web application, keeping your application logic and presentation layer cleanly separated.

Creating the Templates Directory

To serve HTML templates with Fiber, you need to create a dedicated templates directory in your project. This directory will store all your HTML template files that will be rendered by the application.

The templates directory is placed within the app directory of your project, making it easily accessible from your main application file. This organization follows common conventions for Go web applications and keeps your template files separate from the application logic.

Setting Up Template Rendering in Fiber

Once you have your directory structure in place, you need to configure Fiber to use Go's template engine for rendering HTML templates. Fiber provides a simple way to set up template rendering using the app.Render method and the template engine from the github.com/gofiber/template/html/v2 package.

Here's how you can set up template rendering in your main.go file:

The html.New("./app/templates", ".html") function initializes the template engine, pointing it to the templates directory within the app folder and specifying that template files have the .html extension. The template engine is then passed to Fiber via the Views configuration option.

Rendering Templates with Fiber

With your templates directory and template engine set up, you can now render HTML templates in your route handlers using Fiber's ctx.Render method. This method combines a template with context data to produce an HTML response.

Here's how you can render the tutor.html template in your main route:

In this route handler:

  1. The c.Render method is used to render the tutor.html template.
  2. The first argument is the template name (without the .html extension).
  3. The second argument is a map containing any data you want to pass to the template. For now, we're leaving it empty as we don't need to pass any data yet.

Fiber will look for tutor.html in the app/templates directory, render it with the provided data, and return the resulting HTML to the client. This approach allows you to serve dynamic content while maintaining a clean separation between your application logic and presentation layer.

HTML Structure and Header

The HTML template for the tutor interface begins with the basic structure of an HTML document. This includes the <!DOCTYPE html> declaration, which defines the document type and version of HTML being used. The <html> tag wraps the entire content of the page, and within it, the <head> section is defined.

In the <head> section, we set the title of the page to "Personal Tutor", establishing the foundation for the tutor interface.

Body and Header Section

Moving into the <body> of the document, we start with a header section that sets the tone for the tutor interface. This section is designed to welcome students and encourage them to engage with the personal tutor.

The header includes a main heading (<h1>) and a paragraph (<p>), providing a friendly introduction to the tutoring service. This sets the stage for the interactive elements that follow.

Tutor Container and Input Elements

Following the header, we define the chat container, which is the core of the user interface. This section is responsible for displaying the conversation and providing input elements for student interaction.

The #messages div is where the conversation between the student and tutor will appear, while the input field and buttons allow students to type and send questions. The "Send" button triggers the sendQuery function, and the "New Session" button clears the conversation history, preparing the interface for a new tutoring session.

JavaScript for Interactivity

After setting up the HTML structure, we move on to adding interactivity to our tutor interface using JavaScript. This is done by placing a script section at the bottom of the HTML document, where we'll define the necessary JavaScript functions.

In this section, we create a script block within our HTML code to define JavaScript functions that enable interactivity in the tutor interface. By using plain JavaScript, we can directly manipulate HTML elements and handle user events. Placing the script at the end of the document ensures that all HTML elements are fully loaded before the script runs, preventing errors that might occur if the script tries to access elements that haven't been rendered yet. This approach allows us to seamlessly integrate JavaScript into our HTML, enhancing the functionality of our web application.

Initializing DOM Elements

Before implementing the functions that handle tutor interactions, it's important to obtain references to the necessary DOM elements. This allows us to manipulate these elements directly within our JavaScript code.

By retrieving references to the messagesContainer and messageInput elements, we can easily update the tutor interface and handle student input. The messagesContainer is where the conversation will be displayed, and the messageInput is the field where students type their questions. These references are crucial for implementing the interactive functions that follow.

Additionally, we set up an event listener for the DOMContentLoaded event to automatically start a new session when the page loads, ensuring the interface is ready for interaction immediately.

StartNewSession Function

With the necessary DOM elements initialized, we can proceed to create functions that enhance the interactivity of our tutor interface. The startNewSession function is designed to clear the conversation history, allowing students to begin a fresh tutoring session. This function is triggered when the "New Session" button is clicked.

The startNewSession function clears all messages from the tutor interface, providing a clean slate for students to start a new learning session. This functionality is essential for resetting the conversation and enhancing the user experience by allowing multiple interactions without refreshing the page.

AppendMessage Function

To effectively display the conversation in our tutor interface, we use the appendMessage function. This function creates a new message element, assigns it a CSS class based on the message's origin (user or assistant), appends it to the conversation container, and ensures the view scrolls to the latest message.

The appendMessage function is crucial for dynamically adding messages to the tutor interface. It creates a new <div> element for each message, assigns a class to differentiate between student and tutor messages, and appends it to the messagesContainer. This function also includes a line to automatically scroll the conversation view to the bottom, keeping the latest messages in view. Note that the scrolling behavior will only work as intended after we implement the necessary CSS components in a later lesson.

SendQuery Function

Building on the appendMessage function, the sendQuery function handles student input and updates the tutor interface. It processes the student's question, displays it, and simulates a response from the tutor. This function is triggered when the "Send" button is clicked or when the student presses Enter.

The sendQuery function is responsible for capturing the student's input, ensuring it's not empty, and then displaying it in the tutor interface using the appendMessage function. After sending the question, it clears the input field to prepare for the next question. It also simulates a response from the tutor by echoing the student's question back after a short delay, demonstrating basic interactivity in the tutoring application.

Handling the Enter Key

To enhance the user experience, we can allow students to send questions by pressing the Enter key. This functionality is implemented by listening for the Enter key press event on the input field.

This code snippet listens for the keypress event on the messageInput field. When the Enter key is pressed, it prevents the default behavior (which would be to insert a newline) and calls the sendQuery function. This allows students to quickly send questions using the keyboard, improving the tutor interface's usability.

Summary and Preparation for Practice

In this lesson, we covered the essential steps for setting up a basic tutor interface using Fiber and HTML in Go. We explored how Fiber serves HTML templates using Go's template engine and how JavaScript is used to handle student interactions. By understanding the integration between Fiber, HTML, and JavaScript, you have laid the groundwork for building a dynamic web application for personalized tutoring. As you move on to the practice exercises, focus on reinforcing these concepts and experimenting with the code to deepen your understanding. This foundational knowledge will be crucial as we continue to enhance the personal tutor's capabilities in future lessons.

Sign up
Join the 1M+ learners on CodeSignal
Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal