软件构造实验作业及大作业
软件构造实验作业
实验名称:软件构造实验作业及大作业
实验一:百度机器翻译SDK实验
一、实验要求
实验一:百度机器翻译SDK实验
任务一:下载配置百度翻译Java相关库及环境(占10%)。
任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。
任务三:完成百度翻译相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。
任务四:完成百度翻译GUI相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻译成中文(占30%)。
实验总结:(占10%)
二、实验步骤
任务一:
实验步骤:
- 注册百度翻译开放平台账号: 访问百度翻译开放平台官网,注册并登录账号。
- 创建应用: 在百度翻译开放平台的控制台中创建一个新的应用,获取API Key和Secret Key。
- 下载SDK: 从百度翻译开放平台下载Java SDK。
- 配置环境: 将下载的SDK添加到Java项目的依赖中,并配置好环境变量。
任务二:
功能总结:
- 文本翻译-通用版: 支持多语种文本翻译,包括中文到英文,英文到中文等。
- 文本翻译-词典版: 提供更丰富的词典功能,如词义解释、例句等。
功能特点:
- 支持多种语言之间的翻译。
- 支持批量翻译。
- 提供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%)。
二、实验步骤
任务一:
步骤说明:
- 注册百度智能云账号: 访问百度智能云官网,注册并登录账号。
- 创建应用: 在百度智能云的控制台中创建一个新的应用,获取API Key和Secret Key。
- 下载SDK: 从百度智能云官网下载Java SDK,特别是图像增强与特效相关的SDK。
- 配置环境: 将下载的SDK添加到Java项目的依赖中,并配置好环境变量。
任务二:
功能总结:
- 图像增强: 包括去噪、锐化、超分辨率等,可以提升图像质量。
- 图像特效: 包括风格转换、人脸特效等,可以为图像添加特殊效果。
功能特点:
- 支持多种图像增强技术,有效提升图像清晰度。
- 提供丰富的图像特效,增加图像的趣味性和艺术性。
- 支持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%)
二、实验步骤
步骤说明:
- 了解Maven的功能与作用:包括项目管理、依赖管理、自动化构建等方面的学习与应用。
- 总结JFinal框架的特点:如何使用Maven创建JFinal工程以及其在Web开发中的应用。
- 配置环境: 将下载的SDK添加到Java项目的依赖中,并配置好环境变量掌握了Maven工具和JFinal框架的基本使用。
- 开发学生信息管理系统:如何在JFinal框架下实现CRUD功能,以及遇到的技术问题和解决方法。
- 实验总结。
任务一:
Maven是一个用于自动化构建和依赖管理的开源项目管理工具,主要用于Java项目。通过配置pom.xml文件,Maven能够自动下载和管理项目所需的依赖库,简化构建过程。它通过标准化的构建生命周期(如编译、测试、打包、安装等阶段)来管理项目的构建流程,同时支持跨平台运行和插件扩展。Maven不仅提高了开发效率,减少了手动操作,还促进了团队协作和项目的可维护性。
Maven的基本使用方法
1 安装与配置Maven
下载与安装:
从Maven官方网站下载适合你操作系统的版本。解压后,配置环境变量MAVEN_HOME,将bin目录添加到系统PATH环境变量中。
验证安装:
在命令行中运行mvn -v,确认Maven安装是否成功。如果正确安装,Maven会输出版本信息。
2 创建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项目。
3 使用Maven构建项目
- 编译项目: 运行mvn compile命令,Maven会自动下载依赖并编译源代码。
- 测试项目: 运行mvn test命令,Maven会执行项目中的单元测试。
- 打包项目: 运行mvn package命令,Maven会根据项目配置生成可执行的JAR、WAR文件等。
- 安装到本地仓库: 运行mvn install命令,Maven会将构建产物安装到本地仓库。
- 部署到远程仓库: 运行mvn deploy命令,将构建的项目发布到远程仓库。
4 依赖管理
在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>学生信息管理
<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>学生信息管理 ---> 创建学生信息
</h1>
<div class="form_box">
<form action="/blog/save" method="post">
#include("_form.html")
</form>
</div>
#end
修改信息页:
Edit.html:
#@layout()
#define main()
<h1>学生信息管理 ---> 修改学生信息
</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=""></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=""></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开发、数据库管理及业务模块设计的综合能力。我更加意识到系统开发中的复杂性和重要性。未来,我会继续学习相关技术,提升自己的编程能力和系统设计思维,争取在实践中做得更好。总的来说,这次实验不仅让我学到了技术上的知识,更加深了我对软件开发流程的认识。我相信这些经验将对我未来的学习和职业发展起到积极的推动作用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!