用C语言做一个web站,富文本写入与展示,用户登录,文本目录划分

目录

      • 1. 基础准备
        • 必备工具:
      • 2. 目录结构
      • 3. 用户登录(使用简单的文件系统管理)
      • 4. 富文本编辑器和展示
      • 5. 样式文件
      • 6. 配置 Web 服务器
      • 7. 运行和测试

构建一个简单的 Web 站点实现富文本写入和展示、用户登录以及文本目录划分需要结合多个技术,包括 C 语言的 CGI(Common Gateway Interface)、HTML、JavaScript 和 CSS 以及一个简单的文件系统管理。下面是一个基本的实现步骤和示例代码。

1. 基础准备

必备工具:
  • 一个 Web 服务器(例如 Apache 或 Nginx)支持 CGI。
  • HTML、CSS 和 JavaScript 基础知识。
  • C 语言编译器(例如 gcc)。

2. 目录结构

/var/www/cgi-bin/      # 放置 CGI 脚本
/var/www/html/         # 放置 HTML 文件
/var/www/html/css/     # 放置 CSS 文件
/var/www/html/js/      # 放置 JavaScript 文件

3. 用户登录(使用简单的文件系统管理)

login.html(放在 /var/www/html/ 中):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>User Login</title><link rel="stylesheet" href="css/style.css">
</head>
<body><form action="/cgi-bin/login.cgi" method="post"><label for="username">Username:</label><input type="text" id="username" name="username" required><label for="password">Password:</label><input type="password" id="password" name="password" required><button type="submit">Login</button></form>
</body>
</html>

login.cgi(放在 /var/www/cgi-bin/ 中):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void get_post_data(char *data) {char *lenstr;long len;lenstr = getenv("CONTENT_LENGTH");if(lenstr == NULL || sscanf(lenstr,"%ld",&len)!=1 || len>1024) {printf("Content-type:text/html\n\n");printf("<html><body>Invalid POST data</body></html>");exit(1);}fgets(data, len+1, stdin);
}int main() {char data[1024];char username[100], password[100];get_post_data(data);sscanf(data, "username=%99[^&]&password=%99s", username, password);// 简单的用户名密码验证 (应替换为更安全的方法)if(strcmp(username, "admin") == 0 && strcmp(password, "password") == 0) {printf("Content-type:text/html\n\n");printf("<html><body>Login successful!<br><a href=\"editor.html\">Go to Editor</a></body></html>");} else {printf("Content-type:text/html\n\n");printf("<html><body>Invalid credentials. <a href=\"/login.html\">Try again</a></body></html>");}return 0;
}

4. 富文本编辑器和展示

editor.html(放在 /var/www/html/ 中):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Rich Text Editor</title><link rel="stylesheet" href="css/style.css"><script src="js/editor.js"></script>
</head>
<body><form action="/cgi-bin/save_text.cgi" method="post"><textarea id="editor" name="editor" rows="10" cols="80"></textarea><button type="submit">Save</button></form><div><h2>Text Directory</h2><ul id="directory"></ul></div>
</body>
</html>

editor.js(放在 /var/www/html/js/ 中):

document.addEventListener("DOMContentLoaded", function() {const directory = document.getElementById('directory');// Fetch directory contentsfetch('/cgi-bin/list_texts.cgi').then(response => response.json()).then(data => {data.forEach(file => {let li = document.createElement('li');let a = document.createElement('a');a.href = `/cgi-bin/display_text.cgi?file=${file}`;a.innerText = file;li.appendChild(a);directory.appendChild(li);});});
});

save_text.cgi(放在 /var/www/cgi-bin/ 中):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void get_post_data(char *data) {char *lenstr;long len;lenstr = getenv("CONTENT_LENGTH");if(lenstr == NULL || sscanf(lenstr,"%ld",&len)!=1 || len>8192) {printf("Content-type:text/html\n\n");printf("<html><body>Invalid POST data</body></html>");exit(1);}fgets(data, len+1, stdin);
}void save_to_file(const char *filename, const char *data) {FILE *file = fopen(filename, "w");if(file == NULL) {printf("Content-type:text/html\n\n");printf("<html><body>Could not save file.</body></html>");exit(1);}fprintf(file, "%s", data);fclose(file);
}int main() {char data[8192];get_post_data(data);// Saving the data to a file (simple naming, should be more secure)save_to_file("/var/www/texts/saved_text.html", data);printf("Content-type:text/html\n\n");printf("<html><body>Text saved! <a href=\"editor.html\">Back to Editor</a></body></html>");return 0;
}

list_texts.cgi(放在 /var/www/cgi-bin/ 中):

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>int main() {DIR *d;struct dirent *dir;char result[8192] = "[";d = opendir("/var/www/texts/");if(d) {while((dir = readdir(d)) != NULL) {if(dir->d_type == DT_REG) {strcat(result, "\"");strcat(result, dir->d_name);strcat(result, "\",");}}closedir(d);if(result[strlen(result) - 1] == ',') {result[strlen(result) - 1] = '\0';}}strcat(result, "]");printf("Content-type: application/json\n\n");printf("%s", result);return 0;
}

display_text.cgi(放在 /var/www/cgi-bin/ 中):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void display_file(const char *filename) {FILE *file = fopen(filename, "r");if(file == NULL) {printf("Content-type:text/html\n\n");printf("<html><body>Could not open file.</body></html>");exit(1);}printf("Content-type:text/html\n\n");printf("<html><body>");char ch;while((ch = fgetc(file)) != EOF) {putchar(ch);}printf("</body></html>");fclose(file);
}int main(int argc, char *argv[]) {char *query_string = getenv("QUERY_STRING");char filename[256];if(query_string == NULL || sscanf(query_string, "file=%255s", filename) != 1) {printf("Content-type:text/html\n\n");printf("<html><body>Invalid file request.</body></html>");exit(1);}char filepath[512];snprintf(filepath, sizeof(filepath), "/var/www/texts/%s", filename);display_file(filepath);return 0;
}

5. 样式文件

style.css(放在 /var/www/html/css/ 中):

body {font-family: Arial, sans-serif;margin: 20px;
}form {margin-bottom: 20px;
}textarea {width: 100%;height: 200px;
}button {padding: 10px 20px;background-color: #4CAF50;color: white;border: none;cursor: pointer;
}button:hover {background-color: #45a049;
}

6. 配置 Web 服务器

确保你的 Web 服务器配置正确,并支持 CGI 脚本。例如,如果你使用 Apache,确保 httpd.conf 中有如下配置:

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">AllowOverride NoneOptions +ExecCGIAddHandler cgi-script .cgi .pl .pyRequire all granted
</Directory>

7. 运行和测试

  • 将所有文件放在对应的目录中。
  • 访问 http://yourserver/login.html 进行用户登录。
  • 成功登录后,访问富文本编辑器进行内容输入和保存。
  • 确保你有 `/var/www

/texts/` 目录用来保存文本文件,并具有写权限。

这只是一个基础的示例,实际应用中需要考虑更多安全性和功能性方面的细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2024-6387 分析

文章目录 1. 漏洞成因2. 漏洞利用前置知识2.1 相关 SSH 协议报文格式2.2 Glibc 内存分配相关规则 3. POC3.1 堆内存布局3.2 服务端解析数据时间测量3.3 条件竞争3.4 FSOP 4. 相关挑战 原文链接&#xff1a;个人博客 近几天&#xff0c;OpenSSH爆出了一个非常严重的安全漏洞&am…

重生奇迹mu精灵之心怎么搭配

玩家可以通过召唤来召唤多种精灵之心&#xff0c;每种精灵之心增加的属性也不同。精灵之心的作用是为了提升各种各样的属性。我们可以通过召唤获得精灵之心&#xff0c;前面的解锁费用较低&#xff0c;而后面的解锁需要大量的金币来解锁。 召唤精灵之心后&#xff0c;我们可以…

数据结构(JAVA)—代码题

01-数据结构—判断题 02-数据结构—选择题 03 数据结构—多选填空程序填空 ​ 01-顺序表的建立及遍历 import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; import java.util.Scanner;public class Main {public static void main(St…

Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示

章节内容 上一节完成&#xff1a; HDFS的集群启动HDFS的命令行操作HDFS 上传下载移动重命名等操作 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但是没…

基于FPGA的DDS信号发生器

前言 此处仅为基于Vivado实现DDS信号发生器的仿真实现&#xff0c;Vivado的安装请看下面的文章&#xff0c;这里我只是安装了一个标准版本&#xff0c;只要能够仿真波形即可。 FPGA开发Vivado安装教程_vivado安装 csdn-CSDN博客 DDS原理 DDS技术是一种通过数字计算生成波形…

Pandas_DataFrame读写详解:案例解析(第24天)

系列文章目录 一、 读写文件数据 二、df查询数据操作 三、df增加列操作 四、df删除行列操作 五、df数据去重操作 六、df数据修改操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、 读写文…

Web 基础与 HTTP 协议

Web 基础与 HTTP 协议 一、Web 基础1.1域名和 DNS域名的概念Hosts 文件DNS&#xff08;Domain Name System 域名系统&#xff09;域名注册 1.2网页与 HTML网页概述HTML 概述网站和主页Web1.0 与 Web2.0 1.3静态网页与动态网页静态网页动态网页 二、HTTP 协议1.1HTTP 协议概述1.…

秋招——MySQL补充——MySQL是如何加行级锁

文章目录 引言正文什么SQL语句会加行级锁查询操作增加对应的行级锁事务的写法 update和delete修改操作也会增加行级锁 行级锁有哪些种类记录锁间隙锁Next-Key锁 MySQL是如何加行级锁&#xff1f;唯一索引等值查询查询记录是存在的查询记录是不存在的 唯一索引范围查找针对大于或…

《梦醒蝶飞:释放Excel函数与公式的力量》8.4 COUNTIF函数

8.4 COUNTIF函数 COUNTIF函数是Excel中常用的统计函数之一&#xff0c;用于统计指定条件下的单元格数量。通过COUNTIF函数&#xff0c;我们可以轻松地对数据进行条件筛选和统计分析。下面将从函数简介、语法、基本用法、注意事项、高级应用、实战练习和小节几个方面展开介绍。…

爬虫笔记19——代理IP的使用

访问网站时IP被阻止 有些网站会设置特定规则来限制用户的访问&#xff0c;例如频率限制、单一账户多次登录等。 网站为了保护自身安全和用户体验&#xff0c;会设置防御机制&#xff0c;将涉嫌恶意行为的IP地址加入黑名单并屏蔽访问。如果用户在使用网站时违反了这些规则&…

格式化选NTFS还是exFAT 格式化NTFS后Mac不能用怎么办 移动硬盘格式化ntfs和exfat的区别

面对硬盘、U盘或移动硬盘的格式化决策&#xff0c;NTFS与exFAT作为主流的文件系统&#xff0c;用户在选择时可以根据它们的不同特点来选择适用场景。下面我们来看看格式化选NTFS还是exFAT&#xff0c;格式化NTFS后Mac不能用怎么办的相关内容。 一、格式化选NTFS还是exFAT 在数…

十四、【源码】@Autowired、@Value、@Component

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/14-auto-property Autowired、Value、Component 注解注入属性的实现分散在refresh容器的各个方法中&#xff0c;梳理&#x…

docker 搭建 AI大数据模型 --- 使用GPU

docker 搭建 AI大数据模型 — 使用GPU方式 搭建本地大模型&#xff0c;最简单的方法&#xff01;效果直逼GPT 服务器GPU系统HP580 G8P40Rocky9.2 安装程序AnythingLLM前端界面Open WebUIChatOllamaollama 一、AnythingLLM 介绍 AnythingLLM 是 Mintplex Labs Inc. 开发的一…

9.(vue3.x+vite)修改el-input,el-data-picker样式

效果预览 二:相关代码 <template><div style="padding: 50px"><el-input placeholder="请输入模型名称" style="width: 260px" /><br /

Java灵活用工2.0报价单微信小程序+APP+微信公众号 源码

&#x1f680;【开篇&#xff1a;解锁灵活用工的高效时代】 在人力资源市场日益灵活的今天&#xff0c;如何快速、准确地生成报价单&#xff0c;成为企业吸引并管理自由职业者的关键。而“灵活用工报价单微信小程序APP微信公众号源码”正是这样一款集高效、便捷于一体的解决方…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域&#xff0c;目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;的广泛应用&#xff0c;目标检测与视频轨迹追踪的性能得到…

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…

【C++】相机标定源码笔记- RGB 相机与 ToF 深度传感器校准类

类的设计目标是为了实现 RGB 相机与 ToF 深度传感器之间的高精度校准&#xff0c;从而使两种类型的数据能够在同一个坐标框架内被整合使用。这在很多场景下都是非常有用的&#xff0c;比如在3D重建、增强现实、机器人导航等应用中&#xff0c;能够提供更丰富的场景信息。 -----…

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

在卷积神经网络&#xff08;CNN&#xff09;中为什么可以使用多个较小的卷积核替代一个较大的卷积核&#xff0c;以达到相同的感受野 flyfish 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;可以使用多个较小的卷积核替代一个较大的卷积核&#xff0c;以达到相同的…