软件构造实验作业及大作业

软件构造实验作业

实验名称:软件构造实验作业及大作业

 

实验一:百度机器翻译SDK实验

一、实验要求

实验一:百度机器翻译SDK实验

    任务一:下载配置百度翻译Java相关库及环境(占10%)。

    任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。

    任务三:完成百度翻译相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。

    任务四:完成百度翻译GUI相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。

    实验总结:(占10%)

二、实验步骤

任务一:

实验步骤:

  1. 注册百度翻译开放平台账号: 访问百度翻译开放平台官网,注册并登录账号。
  2. 创建应用: 在百度翻译开放平台的控制台中创建一个新的应用,获取API Key和Secret Key。
  3. 下载SDK 从百度翻译开放平台下载Java SDK。
  4. 配置环境: 将下载的SDK添加到Java项目的依赖中,并配置好环境变量。

 

 

 

 

任务二:

功能总结:

  1. 文本翻译-通用版: 支持多语种文本翻译,包括中文到英文,英文到中文等。
  2. 文本翻译-词典版: 提供更丰富的词典功能,如词义解释、例句等。

功能特点:

  • 支持多种语言之间的翻译。
  • 支持批量翻译。
  • 提供API接口,方便集成到各种应用中。
  • 词典版提供更详细的翻译结果,包括词义和例句。

任务三:

中译英:

 

英译中:

 

源代码:

package com.example;

 

import okhttp3.*;

import org.json.JSONException;

import org.json.JSONObject;

import java.io.IOException;

 

public class Transform {

 

    public static final String API_KEY = "Tq0juQlxe5y4bmslEmJ3CX9Z";

    public static final String SECRET_KEY = "RR3z0gNE20lDvC2xn9sipPnsJuugCXUD";

 

    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

 

    public static void main(String[] args) {

        String qurey = "完成百度翻译相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文";

        try {

            // Prepare the request body and make the API call for text translation

            MediaType mediaType = MediaType.parse("application/json");

            RequestBody body = RequestBody.create(mediaType, "{\"from\":\"zh\",\"to\":\"en\",\"q\":\"" + qurey + "\"}");

            Request request = new Request.Builder()

                    .url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=" + getAccessToken())

                    .method("POST", body)

                    .addHeader("Content-Type", "application/json")

                    .addHeader("Accept", "application/json")

                    .build();

 

            // Make the API call and get the response

            Response response = HTTP_CLIENT.newCall(request).execute();

            if (response.isSuccessful()) {

                System.out.println(response.body().string());

            } else {

                System.out.println("Request failed: " + response.code());

            }

        } catch (IOException | JSONException e) {

            System.err.println("An error occurred: " + e.getMessage());

            e.printStackTrace();

        }

    }

 

    static String getAccessToken() throws IOException, JSONException {

        // Create request body to get access token

        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");

        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY

                + "&client_secret=" + SECRET_KEY);

        Request request = new Request.Builder()

                .url("https://aip.baidubce.com/oauth/2.0/token")

                .method("POST", body)

                .addHeader("Content-Type", "application/x-www-form-urlencoded")

                .build();

 

        // Execute the request

        Response response = HTTP_CLIENT.newCall(request).execute();

 

        // Handle the response and parse the JSON

        if (response.isSuccessful()) {

            String responseBody = response.body().string();

            JSONObject jsonResponse = new JSONObject(responseBody);

 

            // Check if the access_token key exists

            if (jsonResponse.has("access_token")) {

                return jsonResponse.getString("access_token");

            } else {

                throw new JSONException("Access token not found in the response.");

            }

        } else {

            throw new IOException("Failed to get access token: " + response.code());

        }

    }

}

 

任务四:

中译英:

 

英译中:

 

 

三、实验总结

通过本次实验,我成功完成了百度翻译API的集成和使用,包括基本的文本翻译功能和GUI界面的开发。实验过程中,我学习了如何注册百度翻译开放平台账号,获取API Key和Secret Key,以及如何使用SDK进行开发。通过编写代码实现中英文互译功能,我们加深了对API调用和GUI开发的理解。整个实验不仅提高了我的编程能力,也让我对机器翻译技术有了更深入的认识。

 

实验二:百度图像增强与特效SDK实验

一、实验要求

实验二:百度图像增强与特效SDK实验(2024.11.22日完成)

    任务一:下载配置百度图像增强与特效的Java相关库及环境(占10%)。

    任务二:了解百度图像增强与特效相关功能并进行总结(占20%)。

    任务三:完成图像增强GUI相关功能代码并测试调用,要求上传自己的模糊照片进行图像增强(占30%)。

    任务四:完成图像特效GUI相关功能代码并测试调用,要求上传自己的照片进行图像特效(占30%)。

二、实验步骤

 

任务一:

步骤说明:

  1. 注册百度智能云账号: 访问百度智能云官网,注册并登录账号。
  2. 创建应用: 在百度智能云的控制台中创建一个新的应用,获取API Key和Secret Key。
  3. 下载SDK 从百度智能云官网下载Java SDK,特别是图像增强与特效相关的SDK。
  4. 配置环境: 将下载的SDK添加到Java项目的依赖中,并配置好环境变量。

 

 

 

 

任务二:

功能总结:

  1. 图像增强: 包括去噪、锐化、超分辨率等,可以提升图像质量。
  2. 图像特效: 包括风格转换、人脸特效等,可以为图像添加特殊效果。

功能特点:

  • 支持多种图像增强技术,有效提升图像清晰度。
  • 提供丰富的图像特效,增加图像的趣味性和艺术性。
  • 支持API接口,方便集成到各种应用中。

 

任务三:

图像增强功能演示:

 

源代码:

package com.example;

import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import java.net.URLEncoder;

public class ImgEnhancerGUI extends JFrame {
    private static final String API_KEY = "OftOxmhPZc3kHLiV3JsCrACY";
    private static final String SECRET_KEY = "XwCY8t1GzPu4C1p5uoPK981R3KrhHGUU";
    private static final OkHttpClient HTTP_CLIENT = new OkHttpClient();

    private JLabel originalImageLabel;
    private JLabel enhancedImageLabel;
    private String selectedImagePath;

    public ImgEnhancerGUI() {
        setTitle("Image Enhancer");
        setSize(600, 400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        originalImageLabel = new JLabel();
        enhancedImageLabel = new JLabel();

        JButton selectImageButton = new JButton("Select Image");
        selectImageButton.addActionListener(new SelectImageAction());

        JButton enhanceImageButton = new JButton("Enhance Image");
        enhanceImageButton.addActionListener(new EnhanceImageAction());

        add(selectImageButton);
        add(originalImageLabel);
        add(enhanceImageButton);
        add(enhancedImageLabel);
    }

    class SelectImageAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser fileChooser = new JFileChooser();
            int returnValue = fileChooser.showOpenDialog(null);
            if (returnValue == JFileChooser.APPROVE_OPTION) {
                selectedImagePath = fileChooser.getSelectedFile().getAbsolutePath();
                originalImageLabel.setIcon(new ImageIcon(selectedImagePath));
            }
        }
    }

    class EnhanceImageAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (selectedImagePath != null) {
                try {
                    String enhancedImageData = enhanceImage(selectedImagePath);
                    // Convert the enhanced data back to an image and display
                    byte[] imageBytes = Base64.getDecoder().decode(enhancedImageData);
                    enhancedImageLabel.setIcon(new ImageIcon(imageBytes));
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            } else {
                JOptionPane.showMessageDialog(null, "Please select an image first.");
            }
        }
    }

    private String enhanceImage(String imagePath) throws IOException, JSONException {
        String imageBase64 = getFileContentAsBase64(imagePath, true);
        RequestBody body = RequestBody.create(
                MediaType.parse("application/x-www-form-urlencoded"),
                "image=" + imageBase64
        );

        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rest/2.0/image-process/v1/color_enhance?access_token=" + getAccessToken())
                .post(body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();

        Response response = HTTP_CLIENT.newCall(request).execute();
        String responseBody = response.body().string();

        if (response.isSuccessful()) {
            // 获取响应体的内容
            // 将响应体解析为 JSON 对象
            JSONObject jsonObject = new JSONObject(responseBody);

            // 从 JSON 对象中获取 "image" 字段的值
            String reimage = jsonObject.getString("image");
            // 返回获取到的 base64 编码的图片字符串
            return reimage;
        } else {
            // 请求失败时抛出异常
            throw new IOException("Request failed: " + response.code());
        }

    }

    static String getAccessToken() throws IOException, JSONException {
        RequestBody body = RequestBody.create(
                MediaType.parse("application/x-www-form-urlencoded"),
                "grant_type=client_credentials&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY
       
);

        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .post(body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();

        Response response = HTTP_CLIENT.newCall(request).execute();
        if (response.isSuccessful()) {
            String responseBody = response.body().string();
            JSONObject jsonResponse = new JSONObject(responseBody);
            return jsonResponse.getString("access_token");
        } else {
            throw new IOException("Failed to get access token: " + response.code());
        }
    }

    static String getFileContentAsBase64(String path, boolean urlEncode) throws IOException {
        byte[] bytes = Files.readAllBytes(Paths.get(path));
        String base64 = Base64.getEncoder().encodeToString(bytes);
        if (urlEncode) {
            base64 = URLEncoder.encode(base64, "UTF-8");
        }
        return base64;
    }

    public static void main(String[] args) {
        ImgEnhancerGUI imgEnhancerGUI = new ImgEnhancerGUI();
        imgEnhancerGUI.setVisible(true);
    }
}

 

任务四:

图像特效功能演示

 

源代码:

package com.example;

import okhttp3.*;
import org.json.JSONException;
import org.json.JSONObject;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;

public class ImgMagicGUI extends JFrame {
    private static final String API_KEY = "OftOxmhPZc3kHLiV3JsCrACY";
    private static final String SECRET_KEY = "XwCY8t1GzPu4C1p5uoPK981R3KrhHGUU";
    private static final OkHttpClient HTTP_CLIENT = new OkHttpClient();

    private JLabel originalImageLabel;
    private JLabel enhancedImageLabel;
    private String selectedImagePath;

    public ImgMagicGUI() {
        setTitle("Image Enhancer");
        setSize(600, 400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        originalImageLabel = new JLabel();
        enhancedImageLabel = new JLabel();

        JButton selectImageButton = new JButton("Select Image");
        selectImageButton.addActionListener(new SelectImageAction());

        JButton enhanceImageButton = new JButton("Enhance Image");
        enhanceImageButton.addActionListener(new EnhanceImageAction());

        add(selectImageButton);
        add(originalImageLabel);
        add(enhanceImageButton);
        add(enhancedImageLabel);
    }

    class SelectImageAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JFileChooser fileChooser = new JFileChooser();
            int returnValue = fileChooser.showOpenDialog(null);
            if (returnValue == JFileChooser.APPROVE_OPTION) {
                selectedImagePath = fileChooser.getSelectedFile().getAbsolutePath();
                originalImageLabel.setIcon(new ImageIcon(selectedImagePath));
            }
        }
    }

    class EnhanceImageAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (selectedImagePath != null) {
                try {
                    String enhancedImageData = enhanceImage(selectedImagePath);
                    // Convert the enhanced data back to an image and display
                    byte[] imageBytes = Base64.getDecoder().decode(enhancedImageData);
                    enhancedImageLabel.setIcon(new ImageIcon(imageBytes));
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            } else {
                JOptionPane.showMessageDialog(null, "Please select an image first.");
            }
        }
    }

    private String enhanceImage(String imagePath) throws IOException, JSONException {
        String imageBase64 = getFileContentAsBase64(imagePath, true);
        RequestBody body = RequestBody.create(
                MediaType.parse("application/x-www-form-urlencoded"),
                "image=" + imageBase64
        );

        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime?access_token=" + getAccessToken())
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .addHeader("Accept", "application/json")
                .build();

        Response response = HTTP_CLIENT.newCall(request).execute();
        String responseBody = response.body().string();

        if (response.isSuccessful()) {
            // 获取响应体的内容
            // 将响应体解析为 JSON 对象
            JSONObject jsonObject = new JSONObject(responseBody);

            // 从 JSON 对象中获取 "image" 字段的值
            String reimage = jsonObject.getString("image");
            // 返回获取到的 base64 编码的图片字符串
            return reimage;
        } else {
            // 请求失败时抛出异常
            throw new IOException("Request failed: " + response.code());
        }

    }

    static String getAccessToken() throws IOException, JSONException {
        RequestBody body = RequestBody.create(
                MediaType.parse("application/x-www-form-urlencoded"),
                "grant_type=client_credentials&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY
       
);

        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .post(body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();

        Response response = HTTP_CLIENT.newCall(request).execute();
        if (response.isSuccessful()) {
            String responseBody = response.body().string();
            JSONObject jsonResponse = new JSONObject(responseBody);
            return jsonResponse.getString("access_token");
        } else {
            throw new IOException("Failed to get access token: " + response.code());
        }
    }

    static String getFileContentAsBase64(String path, boolean urlEncode) throws IOException {
        byte[] bytes = Files.readAllBytes(Paths.get(path));
        String base64 = Base64.getEncoder().encodeToString(bytes);
        if (urlEncode) {
            base64 = URLEncoder.encode(base64, "UTF-8");
        }
        return base64;
    }

    public static void main(String[] args) {
        ImgMagicGUI imgEnhancerGUI = new ImgMagicGUI();
        imgEnhancerGUI.setVisible(true);
    }
}

 

 

三、实验总结

通过这次实验,我不仅学到了如何配置和使用百度智能云提供的图像增强与特效SDK,还加深了对图像处理技术的理解。从图像增强的去噪和锐化到图像特效的风格转换和人脸特效。同时,我也意识到,图像处理技术在实际开发中的应用非常广泛,特别是在人工智能、娱乐、社交平台等领域有着巨大的潜力。

 

实验三:JFinal极速开发框架实验

一、实验要求

实验三:JFinal极速开发框架实验 (2024.11.29日完成)

    根据参考资料,学习JFinal极速开发框架的使用并如下任务:

    任务一:了解Maven及其使用方法,总结其功能作用(占20%)

    任务二:学习JFinal框架,基于Maven建立JFinal工程,并对JFinal框架功能进行总结介绍(占30%)

    任务三:基于JFinal完成一个简单的学生信息管理系统(要求实现学生信息的增删改查)(占40%)

    实验总结:(占10%)

 

二、实验步骤

步骤说明:

  1. 了解Maven的功能与作用:包括项目管理、依赖管理、自动化构建等方面的学习与应用。
  2. 总结JFinal框架的特点:如何使用Maven创建JFinal工程以及其在Web开发中的应用。
  3. 配置环境: 将下载的SDK添加到Java项目的依赖中,并配置好环境变量掌握了Maven工具和JFinal框架的基本使用。
  4. 开发学生信息管理系统:如何在JFinal框架下实现CRUD功能,以及遇到的技术问题和解决方法。
  5. 实验总结。

任务一:

Maven是一个用于自动化构建和依赖管理的开源项目管理工具,主要用于Java项目。通过配置pom.xml文件,Maven能够自动下载和管理项目所需的依赖库,简化构建过程。它通过标准化的构建生命周期(如编译、测试、打包、安装等阶段)来管理项目的构建流程,同时支持跨平台运行和插件扩展。Maven不仅提高了开发效率,减少了手动操作,还促进了团队协作和项目的可维护性。

Maven的基本使用方法

安装与配置Maven

下载与安装:

从Maven官方网站下载适合你操作系统的版本。解压后,配置环境变量MAVEN_HOME,将bin目录添加到系统PATH环境变量中。

验证安装:

在命令行中运行mvn -v,确认Maven安装是否成功。如果正确安装,Maven会输出版本信息。

创建Maven项目

Maven提供了多种项目模板(称为“原型”),可以根据需求选择合适的模板。常见的命令行创建项目方法如下:

bash

mvn archetype:generate -DgroupId=com.example -DartifactId=my-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

  • groupId: 组织标识符,通常是公司的域名反转。
  • artifactId: 项目名称,通常是模块或应用的名称。
  • archetypeArtifactId: 项目的模板,maven-archetype-quickstart表示一个简单的Java项目。

使用Maven构建项目

  • 编译项目: 运行mvn compile命令,Maven会自动下载依赖并编译源代码。
  • 测试项目: 运行mvn test命令,Maven会执行项目中的单元测试。
  • 打包项目: 运行mvn package命令,Maven会根据项目配置生成可执行的JAR、WAR文件等。
  • 安装到本地仓库: 运行mvn install命令,Maven会将构建产物安装到本地仓库。
  • 部署到远程仓库: 运行mvn deploy命令,将构建的项目发布到远程仓库。

依赖管理

在pom.xml文件中配置项目的依赖,例如:

xml

<dependencies>

    <dependency>

        <groupId>junit</groupId>

        <artifactId>junit</artifactId>

        <version>4.13.1</version>

        <scope>test</scope>

    </dependency>

</dependencies>

Maven会自动从中央仓库(如Maven Central)下载JUnit等依赖库。

 

Maven的功能作用

  • 自动化构建: Maven提供了一套标准化的构建流程,能够自动执行编译、测试、打包等任务,避免了手动操作。
  • 依赖管理: Maven能够自动处理项目中的依赖关系,确保所有必需的库都能自动下载并添加到项目中,解决了版本冲突问题。
  • 项目标准化: Maven通过POM文件定义项目的结构、依赖和构建过程,使得不同团队之间能够遵循相同的构建流程和项目结构。
  • 跨平台支持: Maven是一个纯Java工具,具有跨平台能力,可以在Windows、Linux、macOS等操作系统上运行。
  • 仓库管理: Maven支持本地仓库和远程仓库,能够从中央仓库或私有仓库自动下载依赖,方便团队协作。

任务二:


在项目pom.xml添加jfinal依赖

JFinal框架功能进行总结介绍:

JFinal是一个轻量级的Java Web开发框架,灵感来源于Struts和Django,注重简洁和高效。它基于MVC架构,提供了灵活的路由、控制器、模型和视图等功能。JFinal框架的核心功能包括:简洁的路由映射、强大的ORM功能(集成了ActiveRecord)、灵活的插件机制、以及高效的性能表现。它支持基于注解的Controller定义,简化了配置和开发流程,同时其基于JDBC的ORM设计,使得数据库操作更加简单和高效。此外,JFinal还内置了常用的工具类库,方便开发者进行常见操作。总体来说,JFinal适合开发中小型Web应用,具有较高的开发效率和易用性。

 

任务三:


信息管理页:

Form.html:

<fieldset class="solid">
    <legend>新增学生信息</legend>
    <input type="hidden" name="blog.id" value="#(blog.id??)" />
    <div>
       <label>学号</label> <input type="text" name="blog.s_number"
                            value="#(blog.s_number??)" />#(titleMsg1)
    </div>
    <div>
       <label>姓名</label> <input type="text" name="blog.s_name"
                            value="#(blog.s_name??)" />#(titleMsg2)
    </div>
    <div>
       <label>班级</label> <input type="text" name="blog.s_grade"
                            value="#(blog.s_grade??)" />#(titleMsg3)
    </div>
    <div>
       <label>电话</label> <input type="text" name="blog.s_phone"
                            value="#(blog.s_phone??)" />#(titleMsg4)
    </div>
    <div>
       <label> </label> <input value="提交" type="submit">
    </div>
</fieldset>

Blog.html

#@layout()
#define main()
<h1>学生信息管理&nbsp;&nbsp;
<a href="/blog/add">创建学生信息</a>
</h1>
<div class="table_box">
    <table class="list">
       <tbody>
       <tr>
          <th width="10%">id</th>
          <th width="20%">学号</th>
          <th width="20%">姓名</th>
          <th width="20%">班级</th>
          <th width="20%">电话</th>
          <th width="10%">操作</th>
       </tr>

       #for(x : blogPage.getList())
       <tr>
          <td style="text-align:left;">#(x.id)</td>
          <td style="text-align:left;">#(x.s_number)</td>
          <td style="text-align:left;">#(x.s_name)</td>
          <td style="text-align:left;">#(x.s_grade)</td>
          <td style="text-align:left;">#(x.s_phone)</td>
          <td style="text-align:left;">
             <a href="/blog/delete/#(x.id)">删除</a>
             <a href="/blog/edit/#(x.id)">修改</a>
          </td>
       </tr>
       #end
       </tbody>
    </table>
    #@paginate(blogPage.pageNumber, blogPage.totalPage, "/blog/")
</div>
#end

 

 


添加信息页:

 

Add.html

#@layout()

#define main()

<h1>学生信息管理 ---&gt; 创建学生信息

</h1>

<div class="form_box">

         <form action="/blog/save" method="post">

                  #include("_form.html")

         </form>

</div>

#end

修改信息页:

 

Edit.html:

#@layout()

#define main()

<h1>学生信息管理 ---&gt; 修改学生信息

</h1>

<div class="form_box">

         <form action="/blog/update" method="post">

                  #include("_form.html")

         </form>

</div>

#end

 

三、实验总结

这次实验不仅让我掌握了Maven和JFinal框架的使用,还提升了我的Web开发能力。我学会了如何快速搭建项目、管理依赖、实现业务逻辑以及调试和解决问题。实验过程中,我意识到了持续学习和实践的重要性。技术领域日新月异,只有不断学习新技术,才能跟上时代的步伐。通过这次实验,我对Java Web开发有了更全面的认识,也为自己的技术栈增添了新的工具。我期待将这些知识应用到未来的学习和工作中,继续提升自己的技术水平。

 

大作业:

一、实验要求

        任务一:基于Jfinal构建信息管理系统,要求包含用户管理,翻译业务模块管理,图片优化模块管理(占30%)。

        任务二:要求不同用户登录后可进行文字翻译和图片优化业务处理,并且可查看提交业务处理结果,时间,处理列表,图形汇总等(占30%)。

        任务三:要求管理员登录后可查看不同用户的各项业务使用情况(占30%)。

        实验总结:(占10%)

 

二、实验步骤

 

任务一:

基于Jfinal构建信息管理系统,要求包含用户管理,翻译业务模块管理,图片优化模块管理。

 


1.绘制登录页面(index.html)

 

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>用户登录</title>
    <meta name="keywords" content=""/>
    <meta name="description" content=""/>

    <link rel="stylesheet" type="text/css" href="/static/login/vendor/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="/static/login/fonts/font-awesome-4.7.0/css/font-awesome.min.css">
    <link rel="stylesheet" type="text/css" href="/static/login/fonts/iconic/css/material-design-iconic-font.min.css">
    <link rel="stylesheet" type="text/css" href="/static/login/css/util.css">
    <link rel="stylesheet" type="text/css" href="/static/login/css/main.css">
</head>

<body>

<div class="limiter">
    <div class="container-login100" style="background-image: url('/static/login/images/login_bg.jpg');">
        <div class="wrap-login100 p-l-55 p-r-55 p-t-65 p-b-54">
            <form class="login100-form validate-form" action="/login" method="post">
                <span class="login100-form-title p-b-49">用户登录</span>

                <div class="wrap-input100 validate-input m-b-23" data-validate="请输入用户名">
                    <span class="label-input100">用户名</span>
                    <input class="input100" type="text" name="id" placeholder="请输入用户名" autocomplete="off">
                    <span class="focus-input100" data-symbol="&#xf206;"></span>
                </div>

                <div class="wrap-input100 validate-input" data-validate="请输入密码">
                    <span class="label-input100">密码</span>
                    <input class="input100" type="password" name="password" placeholder="请输入密码">
                    <span class="focus-input100" data-symbol="&#xf190;"></span>
                </div>

                <div class="text-right p-t-8 p-b-31">
                    <a href="/index/register.html">立即注册</a>
                </div>

                <div class="container-login100-form-btn">
                    <div class="wrap-login100-form-btn">
                        <div class="login100-form-bgbtn"></div>
                        <button class="login100-form-btn">登 录</button>
                    </div>
                </div>

                <div class="txt1 text-center p-t-10">
                    #if(errorMsg)
                    <span style="color: red">#(errorMsg)</span>
                    #end
                </div>

            </form>
        </div>
    </div>
</div>

<script src="/static/login/vendor/jquery/jquery-3.2.1.min.js"></script>
<script src="/static/login/js/main.js"></script>
</body>
<script>
    var _hmt = _hmt || [];
    (function ()
    {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?ce0a6af43c652c3267509e86227948e0";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>

</html>

 


2.绘制并编辑侧边栏内容

 

 


编写用户列表页

 


绘制提交用户信息页

 

绘制查询用户信息页

 

 

 

 

任务二:

要求不同用户登录后可进行文字翻译和图片优化业务处理,并且可查看提交业务处理结果,时间,处理列表,图形汇总等。

 

将特定页面设定为管理员显示

<div class="layui-side layui-bg-white">
        <div class="layui-side-scroll">
            <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
            <ul class="layui-nav layui-nav-tree" lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:">用户管理</a>
                    <dl class="layui-nav-child">
                        #if( session.loginUser.isAdmin??== 1 )
                        <dd><a href="/user/list">用户列表</a></dd>
<!--                        <dd><a href="/user/add">添加用户</a></dd>-->
                        <dd><a href="/user/search">查询用户</a></dd>
                        #end
                        <dd><a href="/user/self">个人信息</a></dd>
                    </dl>
                </li>
            </ul>

            <ul class="layui-nav layui-nav-tree" lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:">翻译模块</a>
                    <dl class="layui-nav-child">
                        <dd><a href="/translate/translation">文本翻译</a></dd>
                        <dd><a href="/translate/search">个人翻译记录查询</a></dd>
                        <!--通过判断当前用户是否为管理员来动态展示或隐藏某个功能链接-->
                        #if( session.loginUser.isAdmin??== 1 )
                        <dd><a href="/translate/list">所有翻译记录</a></dd>
                        #end
                    </dl>
                </li>
            </ul>
            <ul class="layui-nav layui-nav-tree" lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:">图片优化模块</a>
                    <dl class="layui-nav-child">
                        <dd><a href="/picture/convert">图片特效/增强</a></dd>
                        <dd><a href="/picture/search">个人图片处理记录查询</a></dd>
                        #if(session.loginUser.isAdmin??== 1 )
                        <dd><a href="/picture/list">所有图片处理记录</a></dd>
                        #end

                    </dl>
                </li>
            </ul>
        </div>
    </div>

 

文本翻译业务:


绘制翻译页面

 

翻译业务演示

中译英 演示:

 

英译中:

 


个人翻译记录查询

 

图表汇总

 

 

编写后端代码

TranslateController

package com.men.translate;

import com.jfinal.aop.Before;
import com.jfinal.aop.Inject;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Record;
import com.men.common.model.Translate;
import com.men.common.model.User;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * @author mendianyu
 */
@Before(TranslateInterceptor.class)
public class TranslateController extends Controller
{

    @Inject
    TranslateService service = new TranslateService();

    public void index()
    {
        render("/translate/translation.html");
    }


    /**
     *
翻译文本并将结果存到数据库
     */
   
public void fanyi()
    {
        //从输入获取参数
        String from = getPara("from");
        String to = getPara("to");
        String q = getPara("q");

        //调用翻译方法
        String result = service.textTrans(from, to, q);
        //用于将内容显示回界面
        setAttr("q", q);
        setAttr("result", result);
        //获取session中保存的id
        String id = getSessionAttr("id");

        // 获取当前时间
        LocalDateTime currentDateTime = LocalDateTime.now();
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss");
        // 将当前时间格式化为字符串
        String formattedDateTime = currentDateTime.format(formatter);

        Translate translate = new Translate();
        translate.setId(id);
        translate.setTime(formattedDateTime);
        translate.setFrom1(from);
        translate.setTo1(to);
        translate.setQ(q);
        translate.setResult(result);

        translate.save();

        refreshTranslateTimes();
        render("/translate/translation.html");
    }

    /**
     *
更新翻译使用字符量
     */
   
public void refreshTranslateTimes()
    {
        String q = getAttr("q");
        //忽略空格和标点符号
        int amounts = q.replaceAll("[\\s\\p{P}]", "").length();
        String id = getSessionAttr("id");

        Integer tUsed = service.findUserById(id).getTUsed() + amounts;
        Integer tLast = service.findUserById(id).getTLast() - amounts;
        User user = service.findUserById(id);
        user.setTUsed(tUsed);
        user.setTLast(tLast);
        user.update();
    }

    /**
     *
翻译记录列表
     */
   
public void list()
    {
        setAttr("list", service.paginate(getParaToInt(0, 1), 5));
        render("/translate/list.html");
    }

    /**
     *
翻译记录具体内容
     */
   
public void detail()
    {
        setAttr("details", service.findByTime(getPara()));
        render("/translate/details.html");
    }

    /**
     *
模糊查询
     */
   
public void search()
    {
        String from = getPara("from");
        String to = getPara("to");
        String date = getPara("date");
        String id = getSessionAttr("id");
        if ((from != null && !from.isEmpty()) || (to != null && !to.isEmpty()) || (date != null && !date.isEmpty()))
        {
            // 执行模糊查询操作
            List<Record> translations = service.searchRecords(from, to, date, id);
            setAttr("date", date);

            // 将查询结果传递到页面
            setAttr("translations", translations);
        } else
        {
            //如果没有参数,显示所有翻译记录
            List<Record> allTranslations = service.searchRecords("", "", "", id);
            setAttr("translations", allTranslations);
        }

        // 渲染结果到页面
        render("/translate/search.html");
    }
}

编写Service向接口发送请求

package com.men.translate;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.men.common.HttpUtil;
import com.men.common.model.Translate;
import com.men.common.model.User;
import okhttp3.*;
import org.json.JSONException;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author mendianyu
 */
public class TranslateService
{
    private Translate dao = new Translate().dao();
    private User udao = new User().dao();

    public static final String API_KEY = "Tq0juQlxe5y4bmslEmJ3CX9Z";
    public static final String SECRET_KEY = "RR3z0gNE20lDvC2xn9sipPnsJuugCXUD";

    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    public String textTrans(String from, String to, String q)
    {
        // 请求url
        String url = "https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1";
        try
        {
            MediaType mediaType = MediaType.parse("application/json");
            String json = String.format("{\"from\":\"%s\",\"to\":\"%s\",\"q\":\"%s\"}", from, to, q);
            RequestBody body = RequestBody.create(mediaType, json);
            Request request = new Request.Builder()
                    .url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=" + getAccessToken())
                    .method("POST", body)
                    .addHeader("Content-Type", "application/json")
                    .addHeader("Accept", "application/json")
                    .build();

            // Make the API call and get the response
            Response response = HTTP_CLIENT.newCall(request).execute();

            if (response.isSuccessful()) {
                String responseBody = response.body().string();
                org.json.JSONObject jsonObject = new org.json.JSONObject(responseBody);
                org.json.JSONArray transResultArray = jsonObject.getJSONObject("result").getJSONArray("trans_result");
                String dstValue = transResultArray.getJSONObject(0).getString("dst");
                return dstValue;
            } else {
                throw new IOException("Request failed: " + response.code());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    static String getAccessToken() throws IOException, JSONException {
        // Create request body to get access token
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
               
+ "&client_secret=" + SECRET_KEY);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();

        // Execute the request
        Response response = HTTP_CLIENT.newCall(request).execute();

        // Handle the response and parse the JSON
        if (response.isSuccessful()) {
            String responseBody = response.body().string();
            org.json.JSONObject jsonResponse = new org.json.JSONObject(responseBody);

            // Check if the access_token key exists
            if (jsonResponse.has("access_token")) {
                return jsonResponse.getString("access_token");
            } else {
                throw new JSONException("Access token not found in the response.");
            }
        } else {
            throw new IOException("Failed to get access token: " + response.code());
        }
    }


    public Page<Translate> paginate(int pageNumber, int pageSize)
    {
        return dao.paginate(pageNumber, pageSize, "select *", "from translate order by time desc");
    }


    /**
     *
根据时间查找记录
     */
   
public Translate findByTime(String time)
    {
        return dao.findFirst("select * from translate where time = ? ", time);
    }

    /**
     *
模糊查询
     */
   
public List<Record> searchRecords(String from, String to, String date, String id)
    {
        String sql = "select * from translate where (from1 like ? or to1 like ? or time like ?) and id=? order by id desc";
        date = "%" + date + "%";

        List<Record> translations = Db.find(sql, from, to, date, id);
        return translations;
    }

    /**
     *
根据id查找用户
     */
   
public User findUserById(String id)
    {
        return udao.findFirst("select * from user where id = ? ", id);
    }


}

 

图像增强/特效业务:

 


选定人像动漫化功能

 


选定图片去雾功能

个人照片业务查询

 

编写Service代码处理业务

 

package com.men.picture;

import com.alibaba.fastjson2.JSONObject;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.men.common.HttpUtil;
import com.men.common.model.Picture;
import com.men.common.model.User;
import okhttp3.*;
import org.json.JSONException;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;


/**
 * @author mendianyu
 */
public class PictureService
{

    private Picture dao = new Picture().dao();
    private User udao = new User().dao();

    public static final String API_KEY = "OftOxmhPZc3kHLiV3JsCrACY";
    public static final String SECRET_KEY = "XwCY8t1GzPu4C1p5uoPK981R3KrhHGUU";

    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    /**
     *
分页
     */
   
public Page<Picture> paginate(int pageNumber, int pageSize)
    {
//        String id = getSessionAttr("id");
        return dao.paginate(pageNumber, pageSize, "select *", "from picture order by time desc");
    }


    /**
     *
根据时间查找记录
     */
   
public Picture findByTime(String time)
    {
        return dao.findFirst("select * from picture where time = ? ", time);
    }


    /**
     *
获取传过来的图片的转换之后的base64编码
     *
     * @param url
图片增强/特效的请求地址
     * @param src
原始图片的src
     * @return
返回转换后的图片的base64编码
     */
   
public String getBase64Str(String type, String src)
    {
        // 人物动漫化请求url
        //String url = "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime";
        try
        {

            MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");

            String imgParam = URLEncoder.encode(src, "UTF-8");
            String image = "image=" + imgParam;
            System.out.println(image);
            RequestBody body = RequestBody.create(mediaType, image);
            Request request = new Request.Builder()
                    .url("https://aip.baidubce.com/rest/2.0/image-process/v1/"+ type +"?access_token=" + getAccessToken())
                    .method("POST", body)
                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
                    .addHeader("Accept", "application/json")
                    .build();
            Response response = HTTP_CLIENT.newCall(request).execute();
            String responseBody = response.body().string();

            if (response.isSuccessful()) {
                // 获取响应体的内容
                // 将响应体解析为 JSON 对象
                org.json.JSONObject jsonObject = new org.json.JSONObject(responseBody);

                // 从 JSON 对象中获取 "image" 字段的值
                String reimage = jsonObject.getString("image");
                // 返回获取到的 base64 编码的图片字符串
                return reimage;
            } else {
                // 请求失败时抛出异常
                throw new IOException("Request failed: " + response.code());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }


    static String getAccessToken() throws IOException, JSONException {
        // Create request body to get access token
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
               
+ "&client_secret=" + SECRET_KEY);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();

        // Execute the request
        Response response = HTTP_CLIENT.newCall(request).execute();

        // Handle the response and parse the JSON
        if (response.isSuccessful()) {
            String responseBody = response.body().string();
            org.json.JSONObject jsonResponse = new org.json.JSONObject(responseBody);

            // Check if the access_token key exists
            if (jsonResponse.has("access_token")) {
                return jsonResponse.getString("access_token");
            } else {
                throw new JSONException("Access token not found in the response.");
            }
        } else {
            throw new IOException("Failed to get access token: " + response.code());
        }
    }

    /**
     *
模糊查询
     */
   
public List<Record> searchRecords(String url, String date, String id)
    {
        String sql = "select * from picture where (type like ? or time like ?) and id=? order by id desc";
        date = "%" + date + "%";

        List<Record> pRecord = Db.find(sql, url, date, id);
        return pRecord;
    }

    /**
     *
根据id查找用户
     */
   
public User findUserById(String id)
    {
        return udao.findFirst("select * from user where id = ? ", id);
    }
}

 

 

 

 

 

 

 

任务三:

管理员登录后可查看不同用户的各项业务使用情况

 


显示所有用户的业务资源

 


显示所有用户的翻译记录

 

显示所有用户的图片效果转换记录记录

 

 

三、实验总结

在这次信息管理系统的实验过程中,我通过基于 JFinal 框架构建了一个具有多功能的系统,涉及用户管理、翻译业务模块和图片优化模块管理等多个方面。通过这次实验,不仅让我更深入地理解了 JFinal 框架的工作原理和使用方法,还加强了我对Web开发、数据库管理及业务模块设计的综合能力。我更加意识到系统开发中的复杂性和重要性。未来,我会继续学习相关技术,提升自己的编程能力和系统设计思维,争取在实践中做得更好。总的来说,这次实验不仅让我学到了技术上的知识,更加深了我对软件开发流程的认识。我相信这些经验将对我未来的学习和职业发展起到积极的推动作用。

posted @   cor0000  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示