基于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. 安秉图纸加密软件 安秉图纸加密软件是一款专为保护工程图纸和设计文件安全的软…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...