基于Linux系统下的在线手机商城
- 项目背景
随着网络的发展,电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业模式和目标、以及用户体验和功能需求的全面理解和分析,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,所以有了在线商城项目。
- 项目功能
该服务端有四级页面,第一级为用户的用户名以及和密码的输入以及登录。第二级为用户模糊输入自己所需要商品的模糊名字后服务端将与其相关的商品罗列出来。第三级是服务器罗列出所有的相关商品,用户可以点击商品的到其具体信息。第四级是服务器输出的具体商品的信息。在每个界面用户都可以搜索。
- 项目框架
- 主要模块:main函数,数据库查询模块,四个html文件模块,多任务服务器创建模块。
- 用户访问网页:用户直接访问服务器ip
- 语言:hteml语言以及c语言
- 编码结构:makefile多文件编码
- 项目模块分析介绍
多任务服务器担架:用多进程搭建可供大批用户访问的服务器。
Html文件:构造网页画面以及美好网页
数据库查询模块:用户查询时调用查询数据库的函数将库中相关信息导出。
Main:执行函数。
购买模块:设计到交易,有大量风险,略。
商品概述:数据库信息的导出。
Log:将访问服务器的用户信息记录下来。
- 项目流程图及介绍
- 项目交互的函数口和数据类型
typedef struct http_req
{
char url[512];
char method[32];
char content[1024];
}HTTP_REQ_t;用于解析用户发出的请求
char good[50][1024]将遍历数据库得到的物品名存入good中。
int good_num 定义目标模糊查询的物品数量,访问html文件时需要使用
int recv_http_request(int connfd,char *http_buff,int maxnum)接受用户发送的需求,为main函数的主要函数之一。
int prase_http_request(char *http_buff, HTTP_REQ_t *req):解析用户的命令。
int send_http_response_head(int connfd);发送用户需要的数据
unsigned char FromHex(unsigned char x)
int urlDecode( char* dest, const char* src):解析用户查询汉字时的乱码。
Connfd通讯字贯穿整个项目。
main:
#include "../head.h"
#include "http.h"
#include "log.h"
int sock_Init(const char *ip,unsigned short port)
{int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("fial socket");return -1;}int val = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));struct sockaddr_in ser;ser.sin_family = AF_INET;ser.sin_port = htons(port);ser.sin_addr.s_addr = inet_addr(ip);int ret = bind(sockfd,(struct sockaddr *)&ser,sizeof(ser));if(ret == -1){perror("fail bind");return -1;}ret = listen(sockfd,100);if(ret == -1){perror("fail listen");return -1;}return sockfd;}int main()
{HTTP_REQ_t req;char http_buff[1024] = {0};int sockfd = sock_Init("192.168.1.150",8080);if(sockfd == -1){perror("fail sock_Init");return -1;}struct sockaddr_in cli;socklen_t addrlen = sizeof(cli);struct sockaddr_in ser;while(1){init_log();pid_t pid = fork();if(pid > 0){memset(http_buff,0,1024);int connfd = accept(sockfd,(struct sockaddr*)&cli,&addrlen);if(connfd == -1){perror("accept fail");return -1;}write_log(inet_ntoa(cli.sin_addr));// fclose(log_g.fp);recv_http_request(connfd,http_buff,sizeof(http_buff));printf("\n\n\n===========\n"); printf("http_buff = %s\n",http_buff);printf("\n\n\n===========\n"); int ret = prase_http_request(http_buff,&req);printf("url = %s\n",req.url);printf("method = %s\n",req.method);printf("content = %s\n",req.content);send_http_response(connfd,&req);close(connfd);}else if(pid == 0){memset(http_buff,0,1024);int connfd = accept(sockfd,(struct sockaddr*)&cli,&addrlen);if(connfd == -1){perror("accept fail");return -1;}write_log(inet_ntoa(cli.sin_addr));// fclose(log_g.fp);recv_http_request(connfd,http_buff,sizeof(http_buff));printf("\n\n\n===========\n"); printf("http_buff = %s\n",http_buff);printf("\n\n\n===========\n"); int ret = prase_http_request(http_buff,&req);printf("url = %s\n",req.url);printf("method = %s\n",req.method);printf("content = %s\n",req.content);send_http_response(connfd,&req);close(connfd); }}return 0;
}
http:
#include "../head.h"
#include "http.h"
char good[50][1024];
int good_num = 0;
int html_num = 0;
char *head = "<!DOCTYPE html>""<html>""<head>""<meta charset=\"utf-8\">""<title>菜鸟教程(runoob.com)</title>""</head>""<body background = \"./wyy8.png\">""<br><br><br><br><br><br><br><br><br>""<center>";
char *end = "<center>""</body>""</html>";
char INFO[5050] = {0};
char html_failname[50][50] = {0};
unsigned char FromHex(unsigned char x)
{if(0 == x ) return -1;unsigned char y;if(x>='A' &&x<='Z') y = x-'A'+10;else if(x>='a' &&x <='z') y = x-'a'+10;else if(x>='0' && x<='9') y = x-'0';return y;
}int urlDecode( char* dest, const char* src)
{if(NULL ==src || NULL == dest){return -1;}int len = strlen(src);int i =0 ;for(i = 0 ;i<len;i++){if('+' == src[i]) strcat(dest,"");else if('%'==src[i]){//if(i+2len)return -1;unsigned char high = FromHex((unsigned char)src[++i]);unsigned char low = FromHex((unsigned char)src[++i]);unsigned char temp = high*16 +low;char temp2[5]={0};sprintf(temp2,"%c",temp);strcat(dest , temp2);}}return 0;
}
int html_write(char *html_failname,char *good_content)
{int fp = open(html_failname,O_RDWR|O_TRUNC|O_CREAT,0777);if(fp == -1){perror("fail open1");return -1;}// printf("1111111111111111\n");write(fp,head,strlen(head));// printf("c=cccontent = %s\n",good_content);write(fp,good_content,strlen(good_content));write(fp,end,strlen(end));close(fp);
}int callback(void *arg,int column ,char **value,char **title)
{char info[1024] = {0};sprintf(html_failname[html_num],"./res/userdoend%d.html",html_num);sprintf(info,"<a href=\"%s\"><img src=\"%s\",width=\"150\" height=\"150\"></a>\n",html_failname[html_num],value[19]);// printf("value[17] = %s\n",value[18]);html_write(html_failname[html_num],value[18]);html_num++;strcat(INFO,info);return 0;
}int find_information(char *targe)
{sqlite3 *pdb ;char tmp_buff[1024] = {0};int ret = sqlite3_open("123.db",&pdb);if(ret != SQLITE_OK){printf("sqlite 3 open fail:%s\n",sqlite3_errmsg(pdb));return -1;}strcat(INFO,head);sprintf(tmp_buff,"select * from goods where goods_name like \"%%%s%%\";",targe);printf("targe = %s\n",targe);printf("===%s\n",tmp_buff);ret = sqlite3_exec(pdb,tmp_buff,callback,NULL,NULL);if(ret != SQLITE_OK){printf("sqlite3 callback fail :%s\n",sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}strcat(INFO,end);html_num = 0;sqlite3_close(pdb);
}int recv_http_request(int connfd,char *http_buff,int maxnum)
{memset(http_buff,0,maxnum);ssize_t size = recv(connfd,http_buff,maxnum,0);if(size <= 0){perror("fail recv");return -1;}printf("http_buff = %s\n",http_buff);return 0;
}
int prase_http_request(char *http_buff, HTTP_REQ_t *req)
{char *p = strtok(http_buff," ");if(p == NULL){return -1;}strcpy(req->method,p);char *q = strtok(NULL," ");if(q == NULL){return -1;}strcpy(req->url,q);char *t = strtok(NULL,"\0");if(t == NULL){return -1;}t = strstr(t,"\r\n\r\n");strcpy(req->content,t+4);return 0;
}
int send_http_response_head(int connfd)
{char *phead = "HTTP/1.1 200 OK\r\n""Content-Type: text/html;charset=utf-8\r\n""Server: my-web-server\r\n" "Connection: close\r\n\r\n";ssize_t size = send(connfd,phead,strlen(phead),0);if(size <=0){perror("send fail");return -1;}
}int send_file(int connfd,char *filename)
{int fd = open(filename,O_RDONLY);if(fd == -1){perror("open fail");return -1;}char buff[1024] = {0};while(1){memset(buff,0,1024);ssize_t size = read(fd,buff,1024);if(size <= 0){break;}send(connfd,buff,size,0);}close(fd);
}int do_filename(char *filename)
{int fp = open(filename,O_WRONLY|O_TRUNC|O_CREAT,0777);if(fp == -1){perror("fail open1");return -1;}write(fp,INFO,strlen(INFO));memset(INFO,0,5050);close(fp);
}
int send_http_response(int connfd,HTTP_REQ_t *req)
{char tmp_buff[1024] = {0};char filename[1024] = {0};memset(tmp_buff,0,1024);memset(filename,0,1024);send_http_response_head(connfd);if(!strcmp(req->method,"GET")){ if(!strcmp(req->url,"/")){strcpy(filename,"./res/userin.html");}else if(strstr(req->url ,".png") || strstr(req->url , ".jpg")||strstr(req->url,".png") ){sprintf(filename,".%s",req->url);}else if(strstr(req->url,".html")){sprintf(filename,".%s",req->url);}}else if(!strcmp(req->method,"POST")){ if(strstr(req->content,"user")){ char *p = strstr(req->content,"user");p = p+5;if(!strcmp(p,"yuanjiaqing&password=aaa")){sprintf(filename,"./res/%s",req->url);}}else if(strstr(req->content,"words")){char *q = strstr(req->content,"words");q = q+6;urlDecode(tmp_buff,q);find_information(tmp_buff);printf("INFO = %s\n",INFO);sprintf(filename,"./res/%s",req->url);do_filename(filename);} }printf(" ---%s\n",filename);send_file(connfd,filename);memset(filename,0,1024);return 0;
}
log
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>#include "log.h"LOG_T log_g;int init_log(void)
{char filename[512] = {0};time_t sec;mkdir("./LOG", 0777);//Log20240525.txttime(&sec);struct tm *pt = localtime(&sec);log_g.tim = *pt;sprintf(filename, "./LOG/Log%d%02d%02d.txt", pt->tm_year+1900, pt->tm_mon+1, pt->tm_mday);log_g.fp = fopen(filename, "a");if (NULL == log_g.fp){printf("fail fopen log\n");return -1;}return 0;
}int write_log(char *aa)
{char buff[1024] = {0};time_t sec;time(&sec); struct tm *pt = localtime(&sec);//新的一天,创建新的日志文件if (pt->tm_mday != log_g.tim.tm_mday){deinit_log();init_log();}fprintf(log_g.fp, "[%d-%02d-%02d %02d:%02d:%02d][%s] \n",pt->tm_year+1900, pt->tm_mon+1, pt->tm_mday, pt->tm_hour,pt->tm_min,pt->tm_sec, aa);fflush(log_g.fp);fclose(log_g.fp);return 0;
}void deinit_log()
{if (log_g.fp != NULL){fclose(log_g.fp);}
}
相关文章:
基于Linux系统下的在线手机商城
项目背景 随着网络的发展,电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业…...
Apache Kafka 事务详解
Apache Kafka 事务详解 Apache Kafka 是一个分布式流处理平台,主要用于实时数据的传输和处理。在现代的数据密集型应用中,事务性保证在数据传输和处理中的作用至关重要。本文将详细介绍 Kafka 的事务性支持,包括其基本概念、架构、使用方法以…...
Go语言 结构体
本文主要为Go语言 结构体介绍、语法、使用注意及其示例。 目录 结构体 语法 语法示例 语法说明 声明使用 创建并赋值 使用指针 使用注意 总结 结构体 C语言里面,我们可以使用typedef in MyInt。 在go语言中使用结构体来模拟类,使用type stru…...
数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)
文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出,对于需要动态维护的散列表冲突是不可避免的,无论你的散列函数设计的有多么精妙,因此我们不得不回答的第二个重要问题就是一旦发生冲突&…...
HTML5+CSS3-HTML5入门
1.web标准 W3C为web标准化做出了以下事项,主要包括结构,表现和行为。 结构用于对网页的信息进行分类和整理,使用技术包括HTML,XML,XHTML 表现指网页的外在样式,一般包括网页的版式,颜色,字体,…...
谷粒商城实战笔记-138-商城业务-首页-渲染二级三级分类数据
本节的主要内容是在前一节的基础上,提供结构查询出所有的二级、三级分类数据。 一,构造响应体数据结构 后端返回给前端的数据结构是在开发详细设计中应该确定的内容。 分析前端需要的数据结构,后端要将所有一级分类包含的二级和三级分类信…...
git的基础用法
文章目录 前言关联仓库提交代码分支操作账号免密 前言 记录一下git的一些基础用法。 关联仓库 # 初始化 git init# 关联仓库 git remote add origin <仓库地址># 查看当前关联的仓库 git remote -v# 一次只能remote一个,要换需要先删原来的 git remote rem…...
常见中间件漏洞(四、Apache合集)
目录 四、Apache 4.1 CVE-2021-41773 漏洞简介 影响版本 环境搭建 漏洞复现 四、Apache 4.1 CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在目录穿越漏洞,在路径穿越目录<Directory/>Require all gra…...
HCIE-学习笔记
动态授权加入的成员优先级高于静态绑定的成员; any组(缺省):所有用户或资源,通常用来配置默认规则。any组只能做目的组,不支持配置为源组。 同一个安全组既可以与多条授权规则绑定来表示动态用户࿰…...
【计算机网络】性能指标-带宽和时延(MB、GB、KB、B、byte、bit、Mb/s、Gb/s、b/s等)学习
文章目录 1、单位换算MB、b/s1.1 在计算机领域,大写的B、K、M、G表示1.2 在通信领域,小写的k代表的是1000,不是1024,转换的时候要注意区分 2、带宽3、时延(时间消耗)4、时延带宽积5、往返时延RTT 1、单位换算MB、b/s …...
ANN(Approximate Nearest Neighbor)搜索和索引库到底是什么?
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ ANN(Approximate Nearest Neighbor)搜索:最近邻搜索是一种在大规模数据集中快速找到与给定查询数据点距离最近的点的算法。与传统的精确最近邻搜索算法相比ÿ…...
勒索软件、供应链攻击等带来的思考!
2023年勒索软件、供应链攻击、地缘政治冲突与黑客活动主义、国家黑客间谍与APT组织活动成为网络安全的热点话题,生成式人工智能技术的武器化更是给动荡的全球网络安全威胁态势增加了不确定性、不对称性和复杂性。 即将到来的2024年,随着网络犯罪的规模化…...
【Nuxt】自定义插件和生命周期
自定义插件 方式一: app.vue // 创建插件(在app.vue中创建全局可以使用 而在某个页面中创建只有该页面可以使用) // 方式一: const nuxtApp useNuxtApp(); nuxtApp.provide("formDate", () > {return "2023-12-12"; }) nuxtAp…...
MySQL的简单介绍
文章目录 数据库关系型数据库非关系型数据”数据库的概念和用途MySQL数据库服务器、数据库和表的关系数据库的创建和删除表创建表修改常见的数据类型和约束字符串类型日期和时间类型PRIMARY KEY使用AUTO_INCREMENT使用UNIQUE使用FOREIGN KEY使用 SQL语言基础SQL语言简介SQL分类…...
leetcode 116.填充每个节点的下一个右侧结点指针
1.题目要求: 给定一个二叉树:struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。初始状态下,所有 ne…...
『 Linux 』网络基础
文章目录 协议分层OSI 七层模型TCP/IP 四层(五层)模型网络协议栈与操作系统的联系报文TCP/IP 通讯过程以太网通信的过程以太网的数据碰撞 协议分层 协议分层是计算机网络中奖网络协议进行组织和管理的方法; 通过将网络通信过程分成多个层次,每个层次负责特定的功能从而简化网络…...
Python酷库之旅-第三方库Pandas(070)
目录 一、用法精讲 281、pandas.Series.dt.daysinmonth属性 281-1、语法 281-2、参数 281-3、功能 281-4、返回值 281-5、说明 281-6、用法 281-6-1、数据准备 281-6-2、代码示例 281-6-3、结果输出 282、pandas.Series.dt.tz属性 282-1、语法 282-2、参数 282-…...
第一篇Linux介绍
目录 1、操作系统 2、Windows和Linux操作系统的区别 3、 Linux 的发行版本 4、 linux 分支 5、 Linux 的含义 6、Linux 特点 1、操作系统 常见操作系统有:Windows、MacOS、Unix/Linux。 类 UNIX Windows:其是微软公司研发的收费操作系统ÿ…...
在Windows编程中,MFC\C++中OnCopyData如何传递基础类型数据?
在C中,OnCopyData 并不是一个标准的C库或框架中的成员函数,它更常见于Windows编程中,特别是使用Win32 API或MFC(Microsoft Foundation Classes)时。OnCopyData 是一个在MFC应用程序中常用于处理来自其他应用程序的WM_C…...
10款超好用的图纸加密软件推荐,2024企业常用图纸加密软件分享
在现代企业中,设计图纸和敏感数据的安全性至关重要。一旦图纸泄露,可能会对企业造成不可估量的损失。因此,选择一款高效、可靠的图纸加密软件显得尤为重要。 1. 安秉图纸加密软件 安秉图纸加密软件是一款专为保护工程图纸和设计文件安全的软…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
