当前位置: 首页 > news >正文

基于Linux系统下的在线手机商城

  1. 项目背景

随着网络的发展,电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业模式和目标、以及用户体验和功能需求的全面理解和分析,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,所以有了在线商城项目。

  1. 项目功能

该服务端有四级页面,第一级为用户的用户名以及和密码的输入以及登录。第二级为用户模糊输入自己所需要商品的模糊名字后服务端将与其相关的商品罗列出来。第三级是服务器罗列出所有的相关商品,用户可以点击商品的到其具体信息。第四级是服务器输出的具体商品的信息。在每个界面用户都可以搜索。

  1. 项目框架
  1. 主要模块:main函数,数据库查询模块,四个html文件模块,多任务服务器创建模块。
  2. 用户访问网页:用户直接访问服务器ip
  3. 语言:hteml语言以及c语言
  4. 编码结构:makefile多文件编码
  1. 项目模块分析介绍

多任务服务器担架:用多进程搭建可供大批用户访问的服务器。

Html文件:构造网页画面以及美好网页

数据库查询模块:用户查询时调用查询数据库的函数将库中相关信息导出。

Main:执行函数。

购买模块:设计到交易,有大量风险,略。

商品概述:数据库信息的导出。

Log:将访问服务器的用户信息记录下来。

  1. 项目流程图及介绍

  2. 项目交互的函数口和数据类型

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系统下的在线手机商城

项目背景 随着网络的发展&#xff0c;电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务&#xff0c;越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求&#xff0c;个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业…...

Apache Kafka 事务详解

Apache Kafka 事务详解 Apache Kafka 是一个分布式流处理平台&#xff0c;主要用于实时数据的传输和处理。在现代的数据密集型应用中&#xff0c;事务性保证在数据传输和处理中的作用至关重要。本文将详细介绍 Kafka 的事务性支持&#xff0c;包括其基本概念、架构、使用方法以…...

Go语言 结构体

本文主要为Go语言 结构体介绍、语法、使用注意及其示例。 目录 结构体 语法 语法示例 语法说明 声明使用 创建并赋值 使用指针 使用注意 总结 结构体 C语言里面&#xff0c;我们可以使用typedef in MyInt。 在go语言中使用结构体来模拟类&#xff0c;使用type stru…...

数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)

文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出&#xff0c;对于需要动态维护的散列表冲突是不可避免的&#xff0c;无论你的散列函数设计的有多么精妙&#xff0c;因此我们不得不回答的第二个重要问题就是一旦发生冲突&…...

HTML5+CSS3-HTML5入门

1.web标准 W3C为web标准化做出了以下事项&#xff0c;主要包括结构&#xff0c;表现和行为。 结构用于对网页的信息进行分类和整理&#xff0c;使用技术包括HTML,XML,XHTML 表现指网页的外在样式&#xff0c;一般包括网页的版式&#xff0c;颜色&#xff0c;字体&#xff0c…...

谷粒商城实战笔记-138-商城业务-首页-渲染二级三级分类数据

本节的主要内容是在前一节的基础上&#xff0c;提供结构查询出所有的二级、三级分类数据。 一&#xff0c;构造响应体数据结构 后端返回给前端的数据结构是在开发详细设计中应该确定的内容。 分析前端需要的数据结构&#xff0c;后端要将所有一级分类包含的二级和三级分类信…...

git的基础用法

文章目录 前言关联仓库提交代码分支操作账号免密 前言 记录一下git的一些基础用法。 关联仓库 # 初始化 git init# 关联仓库 git remote add origin <仓库地址># 查看当前关联的仓库 git remote -v# 一次只能remote一个&#xff0c;要换需要先删原来的 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-学习笔记

动态授权加入的成员优先级高于静态绑定的成员&#xff1b; any组&#xff08;缺省&#xff09;&#xff1a;所有用户或资源&#xff0c;通常用来配置默认规则。any组只能做目的组&#xff0c;不支持配置为源组。 同一个安全组既可以与多条授权规则绑定来表示动态用户&#xff0…...

【计算机网络】性能指标-带宽和时延(MB、GB、KB、B、byte、bit、Mb/s、Gb/s、b/s等)学习

文章目录 1、单位换算MB、b/s1.1 在计算机领域&#xff0c;大写的B、K、M、G表示1.2 在通信领域&#xff0c;小写的k代表的是1000,不是1024&#xff0c;转换的时候要注意区分 2、带宽3、时延&#xff08;时间消耗&#xff09;4、时延带宽积5、往返时延RTT 1、单位换算MB、b/s …...

ANN(Approximate Nearest Neighbor)搜索和索引库到底是什么?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ ANN&#xff08;Approximate Nearest Neighbor&#xff09;搜索&#xff1a;最近邻搜索是一种在大规模数据集中快速找到与给定查询数据点距离最近的点的算法。与传统的精确最近邻搜索算法相比&#xff…...

勒索软件、供应链攻击等带来的思考!

2023年勒索软件、供应链攻击、地缘政治冲突与黑客活动主义、国家黑客间谍与APT组织活动成为网络安全的热点话题&#xff0c;生成式人工智能技术的武器化更是给动荡的全球网络安全威胁态势增加了不确定性、不对称性和复杂性。 即将到来的2024年&#xff0c;随着网络犯罪的规模化…...

【Nuxt】自定义插件和生命周期

自定义插件 方式一&#xff1a; app.vue // 创建插件(在app.vue中创建全局可以使用 而在某个页面中创建只有该页面可以使用) // 方式一&#xff1a; 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.题目要求: 给定一个二叉树&#xff1a;struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。初始状态下&#xff0c;所有 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、操作系统 常见操作系统有&#xff1a;Windows、MacOS、Unix/Linux。 类 UNIX Windows&#xff1a;其是微软公司研发的收费操作系统&#xff…...

在Windows编程中,MFC\C++中OnCopyData如何传递基础类型数据?

在C中&#xff0c;OnCopyData 并不是一个标准的C库或框架中的成员函数&#xff0c;它更常见于Windows编程中&#xff0c;特别是使用Win32 API或MFC&#xff08;Microsoft Foundation Classes&#xff09;时。OnCopyData 是一个在MFC应用程序中常用于处理来自其他应用程序的WM_C…...

10款超好用的图纸加密软件推荐,2024企业常用图纸加密软件分享

在现代企业中&#xff0c;设计图纸和敏感数据的安全性至关重要。一旦图纸泄露&#xff0c;可能会对企业造成不可估量的损失。因此&#xff0c;选择一款高效、可靠的图纸加密软件显得尤为重要。 1. 安秉图纸加密软件 安秉图纸加密软件是一款专为保护工程图纸和设计文件安全的软…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...